OpenCloudOS-Kernel/drivers/net/wireless/ath/ath5k
Sergey Ryazanov ab5e290a86 ath5k: fix reset race
To prepare for reset ath5k should finish all asynchronous tasks. At
first, it disables the interrupt generation, then it waits for the
interrupt handler and tasklets completion, and then proceeds to the HW
configuration update. But it does not consider that the interrupt
handler or tasklet re-enables the interrupt generation. And we fall in a
situation when ath5k assumes that interrupts are disabled, but it is
not.

This can lead to different consequences, such as reception of the frame,
when we do not expect it. Under certain circumstances, this can lead to
the following warning:

  WARNING: at ath5k/base.c:589 ath5k_tasklet_rx+0x318/0x6ec [ath5k]()
  invalid hw_rix: 1a
  [..]
  Call Trace:
  [<802656a8>] show_stack+0x48/0x70
  [<802dd92c>] warn_slowpath_common+0x88/0xbc
  [<802dd98c>] warn_slowpath_fmt+0x2c/0x38
  [<81b51be8>] ath5k_tasklet_rx+0x318/0x6ec [ath5k]
  [<8028ac64>] tasklet_action+0x8c/0xf0
  [<80075804>] __do_softirq+0x180/0x32c
  [<80196ce8>] irq_exit+0x54/0x70
  [<80041848>] ret_from_irq+0x0/0x4
  [<80182fdc>] ioread32+0x4/0xc
  [<81b4c42c>] ath5k_hw_set_sleep_clock+0x2ec/0x474 [ath5k]
  [<81b4cf28>] ath5k_hw_reset+0x50/0xeb8 [ath5k]
  [<81b50900>] ath5k_reset+0xd4/0x310 [ath5k]
  [<81b557e8>] ath5k_config+0x4c/0x104 [ath5k]
  [<80d01770>] ieee80211_hw_config+0x2f4/0x35c [mac80211]
  [<80d09aa8>] ieee80211_scan_work+0x2e4/0x414 [mac80211]
  [<8022c3f4>] process_one_work+0x28c/0x400
  [<802df8f8>] worker_thread+0x258/0x3c0
  [<801b5710>] kthread+0xe0/0xec
  [<800418a8>] ret_from_kernel_thread+0x14/0x1c

Fix this issue by adding a new status flag, which forbids to re-enable
the interrupt generation until the HW configuration is completed.

Note: previous patch, which reorders the Rx disable code helps to avoid
the above warning, but not fixes the root cause of unexpected frame
receiving.

CC: Jiri Slaby <jirislaby@gmail.com>
CC: Nick Kossifidis <mickflemm@gmail.com>
CC: Luis R. Rodriguez <mcgrof@do-not-panic.com>
Reported-by: Christophe Prevotaux <cprevotaux@nltinc.com>
Tested-by: Christophe Prevotaux <cprevotaux@nltinc.com>
Tested-by: Eric Bree <ebree@nltinc.com>
Signed-off-by: Sergey Ryazanov <ryazanov.s.a@gmail.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
2015-03-13 15:11:53 +02:00
..
Kconfig ath5k: update dependencies 2014-11-24 07:45:29 +01:00
Makefile ath5k: revert AHB bus support removing 2014-11-24 07:45:28 +01:00
ahb.c ath5k: drop owner assignment from platform_drivers 2015-01-06 20:40:27 +02:00
ani.c ath: Add and use pr_fmt, convert printks to pr_<level> 2012-04-10 14:52:13 -04:00
ani.h ath5k: Cleanups v2 + add kerneldoc on all hw functions 2011-11-28 14:44:16 -05:00
ath5k.h ath5k: fix reset race 2015-03-13 15:11:53 +02:00
attach.c ath5k: remove redundant null check before kfree() 2014-08-28 14:41:57 -04:00
base.c ath5k: fix reset race 2015-03-13 15:11:53 +02:00
base.h ath5k: enable support for 5 MHz and 10 MHz channels 2013-08-16 14:17:50 -04:00
caps.c ath5k: MRR support and 2GHz radio override belong in ah_capabilities 2011-11-28 14:44:19 -05:00
debug.c Merge tag 'master-2014-10-02' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next 2014-10-05 21:34:39 -04:00
debug.h treewide: use __printf not __attribute__((format(printf,...))) 2011-10-31 17:30:54 -07:00
desc.c ath5k: Remove extraneous statements from ath5k_hw_proc_4word_tx_status and ath5k_hw_proc_2word_status. 2012-04-11 16:23:58 -04:00
desc.h ath5k: Cleanups v2 + add kerneldoc on all hw functions 2011-11-28 14:44:16 -05:00
dma.c ath5k: Reset Tx interrupt bits also on PISR 2013-12-11 10:56:22 -05:00
eeprom.c ath5k: cleanup channel to eprom_mode function 2013-03-06 16:24:27 -05:00
eeprom.h ath5k: cleanup channel to eprom_mode function 2013-03-06 16:24:27 -05:00
gpio.c ath5k: Cleanups v2 + add kerneldoc on all hw functions 2011-11-28 14:44:16 -05:00
initvals.c ath: Add and use pr_fmt, convert printks to pr_<level> 2012-04-10 14:52:13 -04:00
led.c ath5k: update dependencies 2014-11-24 07:45:29 +01:00
mac80211-ops.c cfg80211: remove "channel" from survey names 2015-01-08 15:27:52 +01:00
pci.c PCI: Remove DEFINE_PCI_DEVICE_TABLE macro use 2014-08-12 12:15:14 -06:00
pcu.c ath5k: document a fall-through case in ath5k_hw_set_opmode 2015-01-23 21:17:26 +02:00
phy.c ath5k: Fix AR5K_PHY_TXPOWER_RATE_MAX register value setting. 2014-04-30 12:13:07 -04:00
qcu.c ath5k: fix hardware queue index assignment 2014-12-01 15:57:22 -05:00
reg.h ath5k: Switch from read-and-clear to write-to-clear method when handling PISR/SISR registers 2011-11-28 14:44:10 -05:00
reset.c ath5k: channel change fix 2015-03-13 15:11:45 +02:00
rfbuffer.h ath5k: Cleanups v2 + add kerneldoc on all hw functions 2011-11-28 14:44:16 -05:00
rfgain.h ath5k: Cleanups v2 + add kerneldoc on all hw functions 2011-11-28 14:44:16 -05:00
rfkill.c
sysfs.c ath: Add and use pr_fmt, convert printks to pr_<level> 2012-04-10 14:52:13 -04:00
trace.h ath5k: use more idiomatic tracing include style 2013-04-12 15:29:14 -04:00