mac80211: no BSS changes to driver from beacons processed during scanning
authorReinette Chatre <reinette.chatre@intel.com>
Wed, 9 Apr 2008 23:56:15 +0000 (16:56 -0700)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 16 Apr 2008 19:59:56 +0000 (15:59 -0400)
There is no need to send BSS changes to driver from beacons processed
during scanning. We are more interested in beacons from an AP with which
we are associated - these will still be used to send updates to driver as
the beacons are received without scanning.

This change·removes the requirement that bss_info_changed needs to be atomic.
The beacons received during scanning are processed from a tasklet, but if we
do not call bss_info_changed for these beacons there is no need for it to be
atomic. This function (bss_info_changed) is called either from workqueue or
ioctl in all other instances.

Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
Acked-by: Tomas Winkler <tomas.winkler@intel.com>
Acked-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
include/net/mac80211.h
net/mac80211/mlme.c

index 079e7bd86c903f1c1c691ca5b9368e73d6e37c73..4a80d74975e843d6fed5511a477c009ed9b1667e 100644 (file)
@@ -1020,8 +1020,7 @@ enum ieee80211_ampdu_mlme_action {
  *     level driver (e.g. assoc/disassoc status, erp parameters).
  *     This function should not be used if no BSS has been set, unless
  *     for association indication. The @changed parameter indicates which
- *     of the bss parameters has changed when a call is made. This callback
- *     has to be atomic.
+ *     of the bss parameters has changed when a call is made.
  *
  * @configure_filter: Configure the device's RX filter.
  *     See the section "Frame filtering" for more information.
index 83e8b497e6dba1fe45a725f71ac9680b72e46ca6..e3f2cb086588744ece78e350b64a4d4cc3df3f51 100644 (file)
@@ -2797,6 +2797,17 @@ static void ieee80211_rx_mgmt_beacon(struct net_device *dev,
 
        ieee802_11_parse_elems(mgmt->u.beacon.variable, len - baselen, &elems);
 
+       if (elems.wmm_param && (ifsta->flags & IEEE80211_STA_WMM_ENABLED)) {
+               ieee80211_sta_wmm_params(dev, 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. */
+       if (local->sta_sw_scanning || local->sta_hw_scanning)
+               return;
+
        if (elems.erp_info && elems.erp_info_len >= 1)
                changed |= ieee80211_handle_erp_ie(sdata, elems.erp_info[0]);
        else {
@@ -2816,11 +2827,6 @@ static void ieee80211_rx_mgmt_beacon(struct net_device *dev,
                                               &bss_info);
        }
 
-       if (elems.wmm_param && (ifsta->flags & IEEE80211_STA_WMM_ENABLED)) {
-               ieee80211_sta_wmm_params(dev, ifsta, elems.wmm_param,
-                                        elems.wmm_param_len);
-       }
-
        ieee80211_bss_info_change_notify(sdata, changed);
 }