mac80211: pass vif param to conf_tx() callback
Subsystems (6)
PATCH v2 1/1 mac80211: pass vif param to conf_tx() callback
tx params should be configured per interface. add ieee80211_vif param to the conf_tx callback, and change all the drivers that use this callback.
The following spatch was used:
@rule1@
struct ieee80211_ops ops;
identifier conf_tx_op;
@@
ops.conf_tx = conf_tx_op;
@rule2@
identifier rule1.conf_tx_op;
identifier hw, queue, params;
@@
conf_tx_op (
- struct ieee80211_hw *hw,
+ struct ieee80211_hw *hw, struct ieee80211_vif *vif,
u16 queue,
const struct ieee80211_tx_queue_params *params) {...}---
v2: fixed some drivers i missed, rebased
drivers/net/wireless/ath/ath5k/mac80211-ops.c | 2 +- drivers/net/wireless/ath/ath9k/htc_drv_main.c | 3 ++- drivers/net/wireless/ath/ath9k/main.c | 3 ++- drivers/net/wireless/ath/carl9170/main.c | 3 ++- drivers/net/wireless/b43/main.c | 3 ++- drivers/net/wireless/b43legacy/main.c | 3 ++- drivers/net/wireless/iwlegacy/iwl-core.c | 3 ++- drivers/net/wireless/iwlegacy/iwl-core.h | 3 ++- drivers/net/wireless/iwlwifi/iwl-core.c | 5 +++-- drivers/net/wireless/iwlwifi/iwl-core.h | 3 ++- drivers/net/wireless/mac80211_hwsim.c | 3 ++- drivers/net/wireless/mwl8k.c | 5 +++-- drivers/net/wireless/p54/main.c | 3 ++- drivers/net/wireless/rt2x00/rt2400pci.c | 5 +++-- drivers/net/wireless/rt2x00/rt2800lib.c | 5 +++-- drivers/net/wireless/rt2x00/rt2800lib.h | 3 ++- drivers/net/wireless/rt2x00/rt2x00.h | 3 ++- drivers/net/wireless/rt2x00/rt2x00mac.c | 3 ++- drivers/net/wireless/rt2x00/rt61pci.c | 5 +++-- drivers/net/wireless/rt2x00/rt73usb.c | 5 +++-- drivers/net/wireless/rtl818x/rtl8187/dev.c | 3 ++- drivers/net/wireless/rtlwifi/core.c | 3 ++- drivers/net/wireless/wl1251/main.c | 3 ++- drivers/net/wireless/wl12xx/main.c | 3 ++- drivers/staging/brcm80211/brcmsmac/mac80211_if.c | 7 ++++--- include/net/mac80211.h | 3 ++- net/mac80211/driver-ops.h | 3 ++- 27 files changed, 61 insertions(+), 35 deletions(-)
drivers/net/wireless/ath/ath5k/mac80211-ops.c +1 -1
@@ -563,7 +563,7 @@ ath5k_get_stats(struct ieee80211_hw *hw,static int -ath5k_conf_tx (struct ieee80211_hw *hw,u16 queue, +ath5k_conf_tx (struct ieee80211_hw *hw,struct ieee80211_vif *vif,u16 queue,const struct ieee80211_tx_queue_params *params) {struct ath5k_hw *ah = hw->priv;
drivers/net/wireless/ath/ath9k/htc_drv_main.c +2 -1
@@ -1352,7 +1352,8 @@ static int ath9k_htc_sta_remove(struct ieee80211_hw *hw,return ret; } -static int ath9k_htc_conf_tx (struct ieee80211_hw *hw,u16 queue, +static int ath9k_htc_conf_tx (struct ieee80211_hw *hw, +struct ieee80211_vif *vif,u16 queue,const struct ieee80211_tx_queue_params *params) {struct ath9k_htc_priv *priv = hw->priv;
drivers/net/wireless/ath/ath9k/main.c +2 -1
@@ -1842,7 +1842,8 @@ static void ath9k_sta_notify(struct ieee80211_hw *hw, } } -static int ath9k_conf_tx (struct ieee80211_hw *hw,u16 queue, +static int ath9k_conf_tx (struct ieee80211_hw *hw, +struct ieee80211_vif *vif,u16 queue,const struct ieee80211_tx_queue_params *params) {struct ath_softc *sc = hw->priv;
drivers/net/wireless/ath/carl9170/main.c +2 -1
@@ -1305,7 +1305,8 @@ static int carl9170_op_sta_remove(struct ieee80211_hw *hw,return 0 ; } -static int carl9170_op_conf_tx (struct ieee80211_hw *hw,u16 queue, +static int carl9170_op_conf_tx (struct ieee80211_hw *hw, +struct ieee80211_vif *vif,u16 queue,const struct ieee80211_tx_queue_params *param) {struct ar9170 *ar = hw->priv;
drivers/net/wireless/b43/main.c +2 -1
@@ -3559,7 +3559,8 @@ static void b43_qos_init(struct b43_wldev *dev)b43dbg (dev->wl,"QoS enabled\n" ); } -static int b43_op_conf_tx (struct ieee80211_hw *hw,u16 _queue, +static int b43_op_conf_tx (struct ieee80211_hw *hw, +struct ieee80211_vif *vif,u16 _queue,const struct ieee80211_tx_queue_params *params) {struct b43_wl *wl =hw_to_b43_wl (hw);
drivers/net/wireless/b43legacy/main.c +2 -1
@@ -2466,7 +2466,8 @@ out: } } -static int b43legacy_op_conf_tx (struct ieee80211_hw *hw,u16 queue, +static int b43legacy_op_conf_tx (struct ieee80211_hw *hw, +struct ieee80211_vif *vif,u16 queue,const struct ieee80211_tx_queue_params *params) {return 0 ;
drivers/net/wireless/iwlegacy/iwl-core.c +2 -1
@@ -1250,7 +1250,8 @@ void iwl_legacy_clear_isr_stats(struct iwl_priv *priv)memset (&priv->isr_stats,0 ,sizeof (priv->isr_stats)); } -int iwl_legacy_mac_conf_tx (struct ieee80211_hw *hw,u16 queue, +int iwl_legacy_mac_conf_tx (struct ieee80211_hw *hw, +struct ieee80211_vif *vif,u16 queue,const struct ieee80211_tx_queue_params *params) {struct iwl_priv *priv = hw->priv;
drivers/net/wireless/iwlegacy/iwl-core.h +2 -1
@@ -286,7 +286,8 @@ struct iwl_cfg {***************************/ struct ieee80211_hw *iwl_legacy_alloc_all (struct iwl_cfg *cfg); -int iwl_legacy_mac_conf_tx (struct ieee80211_hw *hw,u16 queue, +int iwl_legacy_mac_conf_tx (struct ieee80211_hw *hw, +struct ieee80211_vif *vif,u16 queue,const struct ieee80211_tx_queue_params *params);int iwl_legacy_mac_tx_last_beacon (struct ieee80211_hw *hw); void iwl_legacy_set_rxon_hwcrypto(struct iwl_priv *priv,
drivers/net/wireless/iwlwifi/iwl-core.c +3 -2
@@ -1123,8 +1123,9 @@ int iwl_send_statistics_request(struct iwl_priv *priv, u8 flags, bool clear) &statistics_cmd); } -int iwl_mac_conf_tx (struct ieee80211_hw *hw,u16 queue, -const struct ieee80211_tx_queue_params *params) +int iwl_mac_conf_tx (struct ieee80211_hw *hw, +struct ieee80211_vif *vif,u16 queue, +const struct ieee80211_tx_queue_params *params) {struct iwl_priv *priv = hw->priv;struct iwl_rxon_context *ctx;
drivers/net/wireless/iwlwifi/iwl-core.h +2 -1
@@ -236,7 +236,8 @@ struct iwl_cfg {* L i b * ***************************/ -int iwl_mac_conf_tx (struct ieee80211_hw *hw,u16 queue, +int iwl_mac_conf_tx (struct ieee80211_hw *hw, +struct ieee80211_vif *vif,u16 queue,const struct ieee80211_tx_queue_params *params);int iwl_mac_tx_last_beacon (struct ieee80211_hw *hw); void iwl_set_rxon_hwcrypto(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
drivers/net/wireless/mac80211_hwsim.c +2 -1
@@ -970,7 +970,8 @@ static int mac80211_hwsim_set_tim(struct ieee80211_hw *hw, }static int mac80211_hwsim_conf_tx ( -struct ieee80211_hw *hw,u16 queue, +struct ieee80211_hw *hw, +struct ieee80211_vif *vif,u16 queue,const struct ieee80211_tx_queue_params *params) { wiphy_debug(hw->wiphy,
drivers/net/wireless/mwl8k.c +3 -2
@@ -4915,7 +4915,8 @@ static int mwl8k_sta_add(struct ieee80211_hw *hw,return ret; } -static int mwl8k_conf_tx (struct ieee80211_hw *hw,u16 queue, +static int mwl8k_conf_tx (struct ieee80211_hw *hw, +struct ieee80211_vif *vif,u16 queue,const struct ieee80211_tx_queue_params *params) {struct mwl8k_priv *priv = hw->priv;
@@ -5462,7 +5463,7 @@ static int mwl8k_reload_firmware(struct ieee80211_hw *hw, char *fw_image) goto fail;for (i =0 ; i <MWL8K_TX_WMM_QUEUES ; i++) { - rc =mwl8k_conf_tx (hw, i, &priv->wmm_params[i]); + rc =mwl8k_conf_tx (hw,NULL , i, &priv->wmm_params[i]);if (rc) goto fail; }
drivers/net/wireless/p54/main.c +2 -1
@@ -404,7 +404,8 @@ static void p54_configure_filter(struct ieee80211_hw *dev,p54_set_groupfilter (priv); } -static int p54_conf_tx (struct ieee80211_hw *dev,u16 queue, +static int p54_conf_tx (struct ieee80211_hw *dev, +struct ieee80211_vif *vif,u16 queue,const struct ieee80211_tx_queue_params *params) {struct p54_common *priv = dev->priv;
drivers/net/wireless/rt2x00/rt2400pci.c +3 -2
@@ -1648,7 +1648,8 @@ static int rt2400pci_probe_hw(struct rt2x00_dev *rt2x00dev)/* * IEEE80211 stack callback functions. */ -static int rt2400pci_conf_tx (struct ieee80211_hw *hw,u16 queue, +static int rt2400pci_conf_tx (struct ieee80211_hw *hw, +struct ieee80211_vif *vif,u16 queue,const struct ieee80211_tx_queue_params *params) {struct rt2x00_dev *rt2x00dev = hw->priv;
@@ -1661,7 +1662,7 @@ static int rt2400pci_conf_tx(struct ieee80211_hw *hw, u16 queue,if (queue !=0 )return -EINVAL ; -if (rt2x00mac_conf_tx (hw, queue, params)) +if (rt2x00mac_conf_tx (hw, vif, queue, params))return -EINVAL ;/*
drivers/net/wireless/rt2x00/rt2800lib.c +3 -2
@@ -4398,7 +4398,8 @@ int rt2800_set_rts_threshold(struct ieee80211_hw *hw, u32 value) }EXPORT_SYMBOL_GPL (rt2800_set_rts_threshold); -int rt2800_conf_tx (struct ieee80211_hw *hw,u16 queue_idx, +int rt2800_conf_tx (struct ieee80211_hw *hw, +struct ieee80211_vif *vif,u16 queue_idx,const struct ieee80211_tx_queue_params *params) {struct rt2x00_dev *rt2x00dev = hw->priv;
@@ -4414,7 +4415,7 @@ int rt2800_conf_tx(struct ieee80211_hw *hw, u16 queue_idx,* we are free to update the registers based on the value * in the queue parameter. */ - retval =rt2x00mac_conf_tx (hw, queue_idx, params); + retval =rt2x00mac_conf_tx (hw, vif, queue_idx, params);if (retval)return retval;
drivers/net/wireless/rt2x00/rt2800lib.h +2 -1
@@ -197,7 +197,8 @@ int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev);void rt2800_get_tkip_seq (struct ieee80211_hw *hw,u8 hw_key_idx,u32 *iv32,u16 *iv16);int rt2800_set_rts_threshold (struct ieee80211_hw *hw,u32 value); -int rt2800_conf_tx (struct ieee80211_hw *hw,u16 queue_idx, +int rt2800_conf_tx (struct ieee80211_hw *hw, +struct ieee80211_vif *vif,u16 queue_idx,const struct ieee80211_tx_queue_params *params);u64 rt2800_get_tsf (struct ieee80211_hw *hw,struct ieee80211_vif *vif); int rt2800_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
drivers/net/wireless/rt2x00/rt2x00.h +2 -1
@@ -1299,7 +1299,8 @@ void rt2x00mac_bss_info_changed(struct ieee80211_hw *hw,struct ieee80211_vif *vif, struct ieee80211_bss_conf *bss_conf, u32 changes); -int rt2x00mac_conf_tx (struct ieee80211_hw *hw,u16 queue, +int rt2x00mac_conf_tx (struct ieee80211_hw *hw, +struct ieee80211_vif *vif,u16 queue,const struct ieee80211_tx_queue_params *params);void rt2x00mac_rfkill_poll (struct ieee80211_hw *hw);void rt2x00mac_flush (struct ieee80211_hw *hw,bool drop);
drivers/net/wireless/rt2x00/rt2x00mac.c +2 -1
@@ -713,7 +713,8 @@ void rt2x00mac_bss_info_changed(struct ieee80211_hw *hw, }EXPORT_SYMBOL_GPL (rt2x00mac_bss_info_changed); -int rt2x00mac_conf_tx (struct ieee80211_hw *hw,u16 queue_idx, +int rt2x00mac_conf_tx (struct ieee80211_hw *hw, +struct ieee80211_vif *vif,u16 queue_idx,const struct ieee80211_tx_queue_params *params) {struct rt2x00_dev *rt2x00dev = hw->priv;
drivers/net/wireless/rt2x00/rt61pci.c +3 -2
@@ -2883,7 +2883,8 @@ static int rt61pci_probe_hw(struct rt2x00_dev *rt2x00dev)/* * IEEE80211 stack callback functions. */ -static int rt61pci_conf_tx (struct ieee80211_hw *hw,u16 queue_idx, +static int rt61pci_conf_tx (struct ieee80211_hw *hw, +struct ieee80211_vif *vif,u16 queue_idx,const struct ieee80211_tx_queue_params *params) {struct rt2x00_dev *rt2x00dev = hw->priv;
@@ -2899,7 +2900,7 @@ static int rt61pci_conf_tx(struct ieee80211_hw *hw, u16 queue_idx,* we are free to update the registers based on the value * in the queue parameter. */ - retval =rt2x00mac_conf_tx (hw, queue_idx, params); + retval =rt2x00mac_conf_tx (hw, vif, queue_idx, params);if (retval)return retval;
drivers/net/wireless/rt2x00/rt73usb.c +3 -2
@@ -2222,7 +2222,8 @@ static int rt73usb_probe_hw(struct rt2x00_dev *rt2x00dev)/* * IEEE80211 stack callback functions. */ -static int rt73usb_conf_tx (struct ieee80211_hw *hw,u16 queue_idx, +static int rt73usb_conf_tx (struct ieee80211_hw *hw, +struct ieee80211_vif *vif,u16 queue_idx,const struct ieee80211_tx_queue_params *params) {struct rt2x00_dev *rt2x00dev = hw->priv;
@@ -2238,7 +2239,7 @@ static int rt73usb_conf_tx(struct ieee80211_hw *hw, u16 queue_idx,* we are free to update the registers based on the value * in the queue parameter. */ - retval =rt2x00mac_conf_tx (hw, queue_idx, params); + retval =rt2x00mac_conf_tx (hw, vif, queue_idx, params);if (retval)return retval;
drivers/net/wireless/rtl818x/rtl8187/dev.c +2 -1
@@ -1241,7 +1241,8 @@ static void rtl8187_configure_filter(struct ieee80211_hw *dev,rtl818x_iowrite32_async (priv, &priv->map->RX_CONF, priv->rx_conf); } -static int rtl8187_conf_tx (struct ieee80211_hw *dev,u16 queue, +static int rtl8187_conf_tx (struct ieee80211_hw *dev, +struct ieee80211_vif *vif,u16 queue,const struct ieee80211_tx_queue_params *params) {struct rtl8187_priv *priv = dev->priv;
drivers/net/wireless/rtlwifi/core.c +2 -1
@@ -504,7 +504,8 @@ static int _rtl_get_hal_qnum(u16 queue)*for mac80211 VO=0, VI=1, BE=2, BK=3 *for rtl819x BE=0, BK=1, VI=2, VO=3 */ -static int rtl_op_conf_tx (struct ieee80211_hw *hw,u16 queue, +static int rtl_op_conf_tx (struct ieee80211_hw *hw, +struct ieee80211_vif *vif,u16 queue,const struct ieee80211_tx_queue_params *param) {struct rtl_priv *rtlpriv =rtl_priv (hw);
drivers/net/wireless/wl1251/main.c +2 -1
@@ -1158,7 +1158,8 @@ static struct ieee80211_channel wl1251_channels[] = { { .hw_value = 13, .center_freq = 2472}, }; -static int wl1251_op_conf_tx (struct ieee80211_hw *hw,u16 queue, +static int wl1251_op_conf_tx (struct ieee80211_hw *hw, +struct ieee80211_vif *vif,u16 queue,const struct ieee80211_tx_queue_params *params) {enum wl1251_acx_ps_scheme ps_scheme;
drivers/net/wireless/wl12xx/main.c +2 -1
@@ -3744,7 +3744,8 @@ out:mutex_unlock (&wl->mutex); } -static int wl1271_op_conf_tx (struct ieee80211_hw *hw,u16 queue, +static int wl1271_op_conf_tx (struct ieee80211_hw *hw, +struct ieee80211_vif *vif,u16 queue,const struct ieee80211_tx_queue_params *params) {struct wl1271 *wl = hw->priv;
drivers/staging/brcm80211/brcmsmac/mac80211_if.c +4 -3
@@ -141,8 +141,9 @@ static void brcms_ops_sta_notify(struct ieee80211_hw *hw,struct ieee80211_vif *vif, enum sta_notify_cmd cmd, struct ieee80211_sta *sta); -static int brcms_ops_conf_tx (struct ieee80211_hw *hw,u16 queue, -const struct ieee80211_tx_queue_params *params); +static int brcms_ops_conf_tx (struct ieee80211_hw *hw, +struct ieee80211_vif *vif,u16 queue, +const struct ieee80211_tx_queue_params *params);static u64 brcms_ops_get_tsf (struct ieee80211_hw *hw,struct ieee80211_vif *vif); static int brcms_ops_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
@@ -556,7 +557,7 @@ brcms_ops_sta_notify(struct ieee80211_hw *hw, struct ieee80211_vif *vif, }static int -brcms_ops_conf_tx (struct ieee80211_hw *hw,u16 queue, +brcms_ops_conf_tx (struct ieee80211_hw *hw,struct ieee80211_vif *vif,u16 queue,const struct ieee80211_tx_queue_params *params) {struct brcms_info *wl = hw->priv;
include/net/mac80211.h +2 -1
@@ -2148,7 +2148,8 @@ struct ieee80211_ops { struct ieee80211_sta *sta);void (*sta_notify)(struct ieee80211_hw *hw,struct ieee80211_vif *vif,enum sta_notify_cmd ,struct ieee80211_sta *sta); -int (*conf_tx)(struct ieee80211_hw *hw,u16 queue, +int (*conf_tx)(struct ieee80211_hw *hw, +struct ieee80211_vif *vif,u16 queue,const struct ieee80211_tx_queue_params *params);u64 (*get_tsf)(struct ieee80211_hw *hw,struct ieee80211_vif *vif); void (*set_tsf)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
net/mac80211/driver-ops.h +2 -1
@@ -423,7 +423,8 @@ static inline int drv_conf_tx(struct ieee80211_local *local,trace_drv_conf_tx (local, sdata, queue, params);if (local->ops->conf_tx) - ret = local->ops->conf_tx (&local->hw, queue, params); + ret = local->ops->conf_tx (&local->hw, &sdata->vif, + queue, params);trace_drv_return_int (local, ret);return ret; }
Signature · 1 line
1.7.6.401.g6a319
Johannes Berg
maintainerQuoted 3 lines · Eliad Peller
tx params should be configured per interface. add
ieee80211_vifparam to theconf_txcallback, and change all the drivers that use this callback.
For the record, I said this to you on IRC but you weren't around I guess. This patch (with the other ones) is now passing a bogus sdata/vif pointer to drivers -- e.g. for monitor mode interfaces from ieee80211_do_open -> ieee80211_set_wmm_default -> drv_conf_tx.
I suspect the way to fix this would be to move the call to ieee80211_set_wmm_default into the last switch statement in do_open, could you please look into it?
Thx,
johannes
Quoted 5 lines · Johannes Berg
Quoted 3 lines · Eliad Peller
tx params should be configured per interface. add
ieee80211_vifparam to theconf_txcallback, and change all the drivers that use this callback.
Quoted 9 lines
For the record, I said this to you on IRC but you weren't around I guess. This patch (with the other ones) is now passing a bogus sdata/vif pointer to drivers -- e.g. for monitor mode interfaces from
ieee80211_do_open->ieee80211_set_wmm_default->drv_conf_tx.I suspect the way to fix this would be to move the call to
ieee80211_set_wmm_defaultinto the last switch statement indo_open, could you please look into it?
thanks for the info.
i'll look into it.
Eliad.
PATCH 1/1 patch on comment
In reply to Johannes BergDigging into the source code, i noticed that the documentation tells that the tx function from ieee80211_ops should return NETDEV_TX_OK while the tx function is now a void function. Here is a very little patch to remove this information from the comment :
mac80211.h +0 -2
@@ -1744,8 +1744,6 @@* configuration in the TX control data. This handler should, * preferably, never fail and stop queues appropriately, more * importantly, however, it must never fail for A-MPDU-queues. -* This function should return NETDEV_TX_OK except in very -* limited cases. * Must be implemented and atomic. * * @start: Called before the first netdevice attached to the hardware
Best Regards,
Lucien Loiseau.
Re: [PATCH] patch on comment
Quoted 3 lines · Loiseau Lucien
Digging into the source code, i noticed that the documentation tells that the tx function from
ieee80211_opsshould returnNETDEV_TX_OKwhile the tx function is now a void function.
This is good, but as presented, you've left the job for others to make the patch suitable for applying to the kernel. Please see Documentation/SubmittingPatches for more info. For example, a better email / commit message might be:
[PATCH] mac80211: remove reference to NETDEV_TX_OK
The kerneldoc states that ieee80211_ops.tx must return NETDEV_TX_OK, but tx is now a void function. Remove the stale comment.
---
[patch goes here]
It's almost the same as what you wrote, but there is a Signed-off-by, and the subject and description are fit for the long term kernel history.
If you perform these few extra steps when submitting, John can just queue your patch directly from his inbox, and you get to keep all the credit. If you make the maintainer's job hard, he might drop it on the floor until someone else does the work.
Signature · 1 line
Bob Copeland %% www.bobcopeland.com