mac80211: rt2x00: fix WARN_ON_ONCE() caused by inbalanced set/clear of beacon enable bit
authorJohn Crispin <john@openwrt.org>
Sat, 28 Nov 2015 23:24:59 +0000 (23:24 +0000)
committerJohn Crispin <john@openwrt.org>
Sat, 28 Nov 2015 23:24:59 +0000 (23:24 +0000)
Signed-off-by: evaxige <evaxige@qq.com>
SVN-Revision: 47668

package/kernel/mac80211/patches/622-rt2x00-fix-beacon-bit-balance.patch [new file with mode: 0644]

diff --git a/package/kernel/mac80211/patches/622-rt2x00-fix-beacon-bit-balance.patch b/package/kernel/mac80211/patches/622-rt2x00-fix-beacon-bit-balance.patch
new file mode 100644 (file)
index 0000000..78bc89f
--- /dev/null
@@ -0,0 +1,47 @@
+--- a/drivers/net/wireless/rt2x00/rt2x00mac.c
++++ b/drivers/net/wireless/rt2x00/rt2x00mac.c
+@@ -632,12 +632,8 @@
+               } else if (bss_conf->enable_beacon && !intf->enable_beacon) {
+                       rt2x00dev->intf_beaconing++;
+                       intf->enable_beacon = true;
+-                      /*
+-                       * Upload beacon to the H/W. This is only required on
+-                       * USB devices. PCI devices fetch beacons periodically.
+-                       */
+-                      if (rt2x00_is_usb(rt2x00dev))
+-                              rt2x00queue_update_beacon(rt2x00dev, vif);
++
++                      rt2x00queue_update_beacon(rt2x00dev, vif);
+                       if (rt2x00dev->intf_beaconing == 1) {
+                               /*
+--- a/drivers/net/wireless/rt2x00/rt2x00dev.c
++++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
+@@ -144,7 +144,8 @@
+       if (test_and_clear_bit(DELAYED_UPDATE_BEACON, &intf->delayed_flags)) {
+               mutex_lock(&intf->beacon_skb_mutex);
+-              rt2x00queue_update_beacon(rt2x00dev, vif);
++              if (intf->enable_beacon)
++                      rt2x00queue_update_beacon(rt2x00dev, vif);
+               mutex_unlock(&intf->beacon_skb_mutex);
+       }
+ }
+@@ -207,6 +208,7 @@
+                                       struct ieee80211_vif *vif)
+ {
+       struct rt2x00_dev *rt2x00dev = data;
++      struct rt2x00_intf *intf = vif_to_intf(vif);
+       if (vif->type != NL80211_IFTYPE_AP &&
+           vif->type != NL80211_IFTYPE_ADHOC &&
+@@ -220,7 +222,8 @@
+        * never be called for USB devices.
+        */
+       WARN_ON(rt2x00_is_usb(rt2x00dev));
+-      rt2x00queue_update_beacon(rt2x00dev, vif);
++      if (intf->enable_beacon)
++              rt2x00queue_update_beacon(rt2x00dev, vif);
+ }
+ void rt2x00lib_beacondone(struct rt2x00_dev *rt2x00dev)