mac80211: make conf_tx non-atomic
authorJohannes Berg <johannes@sipsolutions.net>
Mon, 8 Sep 2008 09:05:09 +0000 (11:05 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 11 Sep 2008 19:53:34 +0000 (15:53 -0400)
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>
include/net/mac80211.h
net/mac80211/mlme.c

index 7c399a9c11da630478133ee949f45b3d78af3c21..fb9e62211c34f9e942765ac7e6af2ae69d4125b2 100644 (file)
@@ -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
index 0abd5a4fe38d746c5ad94f647e00e3715f1df4e7..a03245255ed082cfa440fae3e6f44dc19bed3eeb 100644 (file)
@@ -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 {