linux_dsm_epyc7002/drivers/net/wireless/ath/ath5k
Sergey Ryazanov 4a2f248f9e ath5k: channel change fix
ath5k updates the channel pointer and after that it stops the Rx logic
and apply channel to HW. In case of channel switch, such sequence
creates a small window when a frame, which is received on the old
channel is considered as a frame received on the new one.

The most notable consequence of this situation occurs during the switch
from 2 GHz band (CCK+OFDM) to the 5GHz band (OFDM-only). Frame received
with CCK rate, e.g. beacon received at the 1mbps, causes 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

The easiest way to reproduce this warning is to run scan with dualband
NIC in noisy environments, when the channel 11 runs multiple APs. In my
tests if the APs num >= 12, the warning appears in the first few
seconds of scanning.

In order to fix this, the Rx disable code moved to a higher level and
placed before the channel pointer update. This is also makes the code a
bit more symmetrical, since we disable and enable the Rx in the same
function.

In fact, at the pointer update time new frames should not appear,
because interrupt generation at this point should already be disabled.
The next patch should address this issue.

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:45 +02: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: update dependencies 2014-11-24 07:45:29 +01:00
attach.c ath5k: remove redundant null check before kfree() 2014-08-28 14:41:57 -04:00
base.c ath5k: channel change fix 2015-03-13 15:11:45 +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
Kconfig ath5k: update dependencies 2014-11-24 07:45:29 +01: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
Makefile ath5k: revert AHB bus support removing 2014-11-24 07:45:28 +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