b43/legacy: fix beacon change processing
authorJohannes Berg <johannes@sipsolutions.net>
Mon, 18 May 2009 08:53:18 +0000 (10:53 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 20 May 2009 18:46:28 +0000 (14:46 -0400)
Process beacon change even if the BSSID doesn't
change at the same time. Also fix what I think
is a small locking error in b43legacy, there's
a spin_unlock_irqrestore that looks out of place.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/b43/main.c
drivers/net/wireless/b43legacy/main.c

index 2615aaf..ec8516e 100644 (file)
@@ -3553,27 +3553,25 @@ static void b43_op_bss_info_changed(struct ieee80211_hw *hw,
 
        B43_WARN_ON(wl->vif != vif);
 
+       spin_lock_irqsave(&wl->irq_lock, flags);
        if (changed & BSS_CHANGED_BSSID) {
-               spin_lock_irqsave(&wl->irq_lock, flags);
                if (conf->bssid)
                        memcpy(wl->bssid, conf->bssid, ETH_ALEN);
                else
                        memset(wl->bssid, 0, ETH_ALEN);
+       }
 
-               if (b43_status(dev) >= B43_STAT_INITIALIZED) {
-                       if (b43_is_mode(wl, NL80211_IFTYPE_AP) ||
-                           b43_is_mode(wl, NL80211_IFTYPE_MESH_POINT)) {
-                               B43_WARN_ON(vif->type != wl->if_type);
-                               if (changed & BSS_CHANGED_BEACON)
-                                       b43_update_templates(wl);
-                       } else if (b43_is_mode(wl, NL80211_IFTYPE_ADHOC)) {
-                               if (changed & BSS_CHANGED_BEACON)
-                                       b43_update_templates(wl);
-                       }
+       if (b43_status(dev) >= B43_STAT_INITIALIZED) {
+               if (changed & BSS_CHANGED_BEACON &&
+                   (b43_is_mode(wl, NL80211_IFTYPE_AP) ||
+                    b43_is_mode(wl, NL80211_IFTYPE_MESH_POINT) ||
+                    b43_is_mode(wl, NL80211_IFTYPE_ADHOC)))
+                       b43_update_templates(wl);
+
+               if (changed & BSS_CHANGED_BSSID)
                        b43_write_mac_bssid_templates(dev);
-               }
-               spin_unlock_irqrestore(&wl->irq_lock, flags);
        }
+       spin_unlock_irqrestore(&wl->irq_lock, flags);
 
        b43_mac_suspend(dev);
 
index 0062b34..f6f3fbf 100644 (file)
@@ -2787,27 +2787,24 @@ static void b43legacy_op_bss_info_changed(struct ieee80211_hw *hw,
        b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_MASK, 0);
 
        if (changed & BSS_CHANGED_BSSID) {
-               spin_unlock_irqrestore(&wl->irq_lock, flags);
                b43legacy_synchronize_irq(dev);
 
                if (conf->bssid)
                        memcpy(wl->bssid, conf->bssid, ETH_ALEN);
                else
                        memset(wl->bssid, 0, ETH_ALEN);
+       }
+
+       if (b43legacy_status(dev) >= B43legacy_STAT_INITIALIZED) {
+               if (changed & BSS_CHANGED_BEACON &&
+                   (b43legacy_is_mode(wl, NL80211_IFTYPE_AP) ||
+                    b43legacy_is_mode(wl, NL80211_IFTYPE_ADHOC)))
+                       b43legacy_update_templates(wl);
 
-               if (b43legacy_status(dev) >= B43legacy_STAT_INITIALIZED) {
-                       if (b43legacy_is_mode(wl, NL80211_IFTYPE_AP)) {
-                               B43legacy_WARN_ON(vif->type != NL80211_IFTYPE_AP);
-                               if (changed & BSS_CHANGED_BEACON)
-                                       b43legacy_update_templates(wl);
-                       } else if (b43legacy_is_mode(wl, NL80211_IFTYPE_ADHOC)) {
-                               if (changed & BSS_CHANGED_BEACON)
-                                       b43legacy_update_templates(wl);
-                       }
+               if (changed & BSS_CHANGED_BSSID)
                        b43legacy_write_mac_bssid_templates(dev);
-               }
-               spin_unlock_irqrestore(&wl->irq_lock, flags);
        }
+       spin_unlock_irqrestore(&wl->irq_lock, flags);
 
        b43legacy_mac_suspend(dev);