linux/drivers/net/wireless
Vladimir Kondratiev 73d839ae50 wil6210: fix for oops while stopping interface
When interface stopped while running intensive Rx traffic, the following oops
observed:

[89846.734683] Call trace:
[89846.737117] [<ffffffc00083aa64>] dev_gro_receive+0xac/0x358
[89846.742674] [<ffffffc00083ae94>] napi_gro_receive+0x24/0xa4
[89846.748251] [<ffffffbffc1c2f88>] $x+0xec/0x1f8 [wil6210]         wil_netif_rx_any
[89846.753547] [<ffffffbffc1c4830>] $x+0x34/0x54 [wil6210]          wil_release_reorder_frame
[89846.758755] [<ffffffbffc1c48ac>] wil_release_reorder_frames+0x5c/0x78 [wil6210]
[89846.766044] [<ffffffbffc1c4bf8>] wil_tid_ampdu_rx_free+0x20/0x48 [wil6210]
[89846.772901] [<ffffffbffc1bedc8>] $x+0x190/0x1e8 [wil6210]
[89846.778285] [<ffffffbffc1c0ed4>] wmi_event_worker+0x230/0x2f8 [wil6210]
[89846.784865] [<ffffffc0000b0bc8>] process_one_work+0x278/0x3fc
[89846.790591] [<ffffffc0000b1218>] worker_thread+0x200/0x330
[89846.796060] [<ffffffc0000b6664>] kthread+0xac/0xb8
[89846.800836] Code: b940c661 f9406a62 8b010041 f9400026 (f8636882)
[89846.807008] ---[ end trace d6fdc17cd27d18f6 ]---

Reason is the following: when removing Rx vring
(wil_netdev_ops.ndo_stop -> wil_stop -> wil_down -> __wil_down -> wil_rx_fini),
Rx interrupt occurs. It trigger Rx NAPI, calling wil_rx_handle() that reaps
(already cleaned) buffer, causing skb referring to garbage memory being set into reorder buffer.
Then, network stack trying to access this buffer and fails.

Prevent Rx NAPI from being scheduled if device going to stop. Bit wil_status_napi_en reflects
NAPI enablement state, check it when triggering Rx NAPI.

Testing shows that check for wil_status_napi_en sometimes gets negative, and new error message
get printed - in this case kernel oops would be observed. Original oops is no more reproducible.

This change requires also changes in the AP flows.
Properly enable/disable NAPI for the AP. Make sure Rx VRING is disabled
when resetting target.

For this, promote __wil_up() and __wil_down() to the module scope, and use it
in the relevant flows.

Signed-off-by: Vladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
2014-09-11 15:27:39 -04:00
..
ath wil6210: fix for oops while stopping interface 2014-09-11 15:27:39 -04:00
b43 b43: HT-PHY: Set MAC frequency to correct values 2014-09-11 15:27:36 -04:00
b43legacy
brcm80211 cfg80211: allow passing frame type to cfg80211_inform_bss() 2014-08-26 11:16:02 +02:00
cw1200 cw1200: Introduce the use of devm_kzalloc 2014-08-25 16:00:43 -04:00
hostap PCI: Remove DEFINE_PCI_DEVICE_TABLE macro use 2014-08-12 12:15:14 -06:00
ipw2x00 net: wireless: ipw2x00: ipw2200.c: Cleaning up missing null-terminate in conjunction with strncpy 2014-08-25 16:17:40 -04:00
iwlegacy iwl4965: fix %d confusingly prefixed with 0x in format string 2014-09-11 15:26:29 -04:00
iwlwifi Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless 2014-09-08 11:14:56 -04:00
libertas cfg80211: allow passing frame type to cfg80211_inform_bss() 2014-08-26 11:16:02 +02:00
libertas_tf
mwifiex Not that much content this time. Some RCU cleanups, crypto 2014-09-04 13:41:33 -04:00
orinoco Not that much content this time. Some RCU cleanups, crypto 2014-09-04 13:41:33 -04:00
p54 PCI: Remove DEFINE_PCI_DEVICE_TABLE macro use 2014-08-12 12:15:14 -06:00
prism54 PCI: Remove DEFINE_PCI_DEVICE_TABLE macro use 2014-08-12 12:15:14 -06:00
rsi
rt2x00 rt2x00: support Ralink 5362. 2014-08-28 14:49:39 -04:00
rtl818x PCI: Remove DEFINE_PCI_DEVICE_TABLE macro use 2014-08-12 12:15:14 -06:00
rtlwifi rtlwifi: btcoexist: Fix "always true" warning from commit ed364abffd 2014-09-11 15:27:36 -04:00
ti wireless: wlcore: Use devm_kzalloc 2014-08-25 16:17:39 -04:00
zd1211rw
adm8211.c PCI: Remove DEFINE_PCI_DEVICE_TABLE macro use 2014-08-12 12:15:14 -06:00
adm8211.h
airo.c PCI: Remove DEFINE_PCI_DEVICE_TABLE macro use 2014-08-12 12:15:14 -06:00
airo.h
airo_cs.c airo_cs: Remove typedef local_info_t 2014-08-11 12:19:53 -07:00
at76c50x-usb.c at76c50x-usb: fix use after free on failure path in at76_probe() 2014-08-25 15:39:23 -04:00
at76c50x-usb.h
atmel.c atmel: Remove typedef atmel_priv_ioctl 2014-08-11 12:19:53 -07:00
atmel.h
atmel_cs.c atmel_cs: Remove typedef local_info_t 2014-08-25 16:17:41 -04:00
atmel_pci.c PCI: Remove DEFINE_PCI_DEVICE_TABLE macro use 2014-08-12 12:15:14 -06:00
Kconfig net: fix USB network driver config option. 2014-08-06 16:00:20 -07:00
mac80211_hwsim.c Merge tag 'master-2014-07-25' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next 2014-07-28 17:36:25 -07:00
mac80211_hwsim.h
Makefile
mwl8k.c PCI: Remove DEFINE_PCI_DEVICE_TABLE macro use 2014-08-12 12:15:14 -06:00
ray_cs.c
ray_cs.h ray_cs: Add include guards 2014-08-28 14:41:56 -04:00
rayctl.h ray_cs: Add include guards 2014-08-28 14:41:56 -04:00
rndis_wlan.c cfg80211: allow passing frame type to cfg80211_inform_bss() 2014-08-26 11:16:02 +02:00
wl3501.h
wl3501_cs.c
zd1201.c
zd1201.h