summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2008-09-08 11:05:09 +0200
committerJohn W. Linville <linville@tuxdriver.com>2008-09-11 15:53:34 -0400
commitfe3fa827314b877486c515a001c3e6f604f6f16f (patch)
tree64b04c2ee021bf8428bc2f5e9370459bf0ae9459
parent69e6c010fd5f5015d3cc64718fbe266face93770 (diff)
mac80211: make conf_tx non-atomic
The conf_tx callback currently needs to be atomic, this requirement is just because it can be called from scanning. This rearranges it slightly to only update while not scanning (which is fine, we'll be getting beacons when associated) and thus removes the atomic requirement. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--include/net/mac80211.h2
-rw-r--r--net/mac80211/mlme.c13
2 files changed, 9 insertions, 6 deletions
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index 7c399a9c11d..fb9e62211c3 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -1142,7 +1142,7 @@ enum ieee80211_ampdu_mlme_action {
* of assocaited station or AP.
*
* @conf_tx: Configure TX queue parameters (EDCF (aifs, cw_min, cw_max),
- * bursting) for a hardware TX queue. Must be atomic.
+ * bursting) for a hardware TX queue.
*
* @get_tx_stats: Get statistics of the current TX queue status. This is used
* to get number of currently queued packets (queue length), maximum queue
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index 0abd5a4fe38..a03245255ed 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -2872,15 +2872,18 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
memcmp(ifsta->bssid, mgmt->bssid, ETH_ALEN) != 0)
return;
- ieee80211_sta_wmm_params(local, ifsta, elems.wmm_param,
- elems.wmm_param_len);
-
/* Do not send changes to driver if we are scanning. This removes
- * requirement that driver's bss_info_changed function needs to be
- * atomic. */
+ * requirement that a driver's bss_info_changed/conf_tx functions
+ * need to be atomic.
+ * This is really ugly code, we should rewrite scanning and make
+ * all this more understandable for humans.
+ */
if (local->sta_sw_scanning || local->sta_hw_scanning)
return;
+ ieee80211_sta_wmm_params(local, ifsta, elems.wmm_param,
+ elems.wmm_param_len);
+
if (elems.erp_info && elems.erp_info_len >= 1)
changed |= ieee80211_handle_erp_ie(sdata, elems.erp_info[0]);
else {