rt2x00: fix crash when using TKIP on USB devices
authorFelix Fietkau <nbd@openwrt.org>
Thu, 12 Jun 2014 14:44:23 +0000 (14:44 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Thu, 12 Jun 2014 14:44:23 +0000 (14:44 +0000)
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
SVN-Revision: 41161

package/kernel/mac80211/patches/300-pending_work.patch

index c85968df3e22e7d5396373cc1e15eac6d8e5016e..468dffb9315fd3c6b3adfd62e90a36f87bb6dacc 100644 (file)
@@ -1,3 +1,41 @@
+commit 1186edbef91f15722e5bdf56326ce0abc2935ce7
+Author: Stanislaw Gruszka <sgruszka@redhat.com>
+Date:   Tue Jun 10 12:51:06 2014 +0200
+
+    rt2x00: disable TKIP on USB
+    
+    On USB we can not get atomically TKIP key. We have to disable support
+    for TKIP acceleration on USB hardware to avoid bug as showed bellow.
+    
+    [  860.827243] BUG: scheduling while atomic: hostapd/3397/0x00000002
+    <snip>
+    [  860.827280] Call Trace:
+    [  860.827282]  [<ffffffff81682ea6>] dump_stack+0x4d/0x66
+    [  860.827284]  [<ffffffff8167eb9b>] __schedule_bug+0x47/0x55
+    [  860.827285]  [<ffffffff81685bb3>] __schedule+0x733/0x7b0
+    [  860.827287]  [<ffffffff81685c59>] schedule+0x29/0x70
+    [  860.827289]  [<ffffffff81684f8a>] schedule_timeout+0x15a/0x2b0
+    [  860.827291]  [<ffffffff8105ac50>] ? ftrace_raw_event_tick_stop+0xc0/0xc0
+    [  860.827294]  [<ffffffff810c13c2>] ? __module_text_address+0x12/0x70
+    [  860.827296]  [<ffffffff81686823>] wait_for_completion_timeout+0xb3/0x140
+    [  860.827298]  [<ffffffff81080fc0>] ? wake_up_state+0x20/0x20
+    [  860.827301]  [<ffffffff814d5b3d>] usb_start_wait_urb+0x7d/0x150
+    [  860.827303]  [<ffffffff814d5cd5>] usb_control_msg+0xc5/0x110
+    [  860.827305]  [<ffffffffa02fb0c6>] rt2x00usb_vendor_request+0xc6/0x160  [rt2x00usb]
+    [  860.827307]  [<ffffffffa02fb215>] rt2x00usb_vendor_req_buff_lock+0x75/0x150 [rt2x00usb]
+    [  860.827309]  [<ffffffffa02fb393>] rt2x00usb_vendor_request_buff+0xa3/0xe0 [rt2x00usb]
+    [  860.827311]  [<ffffffffa023d1a3>] rt2x00usb_register_multiread+0x33/0x40 [rt2800usb]
+    [  860.827314]  [<ffffffffa05805f9>] rt2800_get_tkip_seq+0x39/0x50  [rt2800lib]
+    [  860.827321]  [<ffffffffa0480f88>] ieee80211_get_key+0x218/0x2a0  [mac80211]
+    [  860.827322]  [<ffffffff815cc68c>] ? __nlmsg_put+0x6c/0x80
+    [  860.827329]  [<ffffffffa051b02e>] nl80211_get_key+0x22e/0x360 [cfg80211]
+    
+    Cc: stable@vger.kernel.org
+    Reported-and-tested-by: Peter Wu <lekensteyn@gmail.com>
+    Reported-and-tested-by: Pontus Fuchs <pontus.fuchs@gmail.com>
+    Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
+    Signed-off-by: John W. Linville <linville@tuxdriver.com>
+
 commit 5f313a15da92dda80ac4c9a137bc42d7d0b49adf
 Author: Rafał Miłecki <zajec5@gmail.com>
 Date:   Thu Jun 12 09:28:38 2014 +0200
@@ -1243,7 +1281,16 @@ Date:   Mon May 19 21:20:49 2014 +0200
  void rt2x00lib_beacondone(struct rt2x00_dev *rt2x00dev)
 --- a/drivers/net/wireless/rt2x00/rt2x00mac.c
 +++ b/drivers/net/wireless/rt2x00/rt2x00mac.c
-@@ -624,25 +624,24 @@ void rt2x00mac_bss_info_changed(struct i
+@@ -487,6 +487,8 @@ int rt2x00mac_set_key(struct ieee80211_h
+       crypto.cipher = rt2x00crypto_key_to_cipher(key);
+       if (crypto.cipher == CIPHER_NONE)
+               return -EOPNOTSUPP;
++      if (crypto.cipher == CIPHER_TKIP && rt2x00_is_usb(rt2x00dev))
++              return -EOPNOTSUPP;
+       crypto.cmd = cmd;
+@@ -624,25 +626,24 @@ void rt2x00mac_bss_info_changed(struct i
         * Start/stop beaconing.
         */
        if (changes & BSS_CHANGED_BEACON_ENABLED) {
@@ -1276,7 +1323,7 @@ Date:   Mon May 19 21:20:49 2014 +0200
                } else if (bss_conf->enable_beacon && !intf->enable_beacon) {
                        rt2x00dev->intf_beaconing++;
                        intf->enable_beacon = true;
-@@ -658,11 +657,10 @@ void rt2x00mac_bss_info_changed(struct i
+@@ -658,11 +659,10 @@ void rt2x00mac_bss_info_changed(struct i
                                 * First beaconing interface enabled
                                 * -> start beacon queue.
                                 */