Skip to content
  • Vasanthakumar Thiagarajan's avatar
    ath9k_hw: Fix AR9280 surprise removal during frequent idle on/off · f119da30
    Vasanthakumar Thiagarajan authored
    Bit 22 of AR_WA should be set to fix the situation where chip reset
    is asynchronous to clock of analog shift registers, such that when
    reset is released, it could mess up the values of analog shift registers
    and cause some hw issue on AR9280.
    
    This bit is write only, but the driver does a read-modify-write
    on AR_WA without setting bit 22 in ar9002_hw_configpcipowersave()
    during radio disable. This causes surprise removal of hw. It can
    never recover from this state and the hw will become usable only
    after a power on/off cycle, and sometimes only during a cold reboot.
    
    This issue can be triggered by doing frequent roaming with the
    simple/test-roam script available from the wifi-test project [1]
    when roaming between APs quickly. When roaming there is a is a high
    possibility that the device being put into idle (radio disable) state
    by mac80211 during AUTH->ASSOC. A device hardware reset would fail
    and the kernel would output:
    
    [40251.363799] ath: AWAKE -> FULL-SLEEP
    [40251.363815] ieee80211 phy17: device no longer idle - working
    [40251.363817] ath: Marking phy17 as not-idle
    [40251.363819] ath: FULL-SLEEP -> AWAKE
    [40251.415978] pciehp 0000:00:1c.3:pcie04: Card not present on Slot(3)
    [40251.419896] ath: ah->misc_mode 0x4
    [40251.428138] pciehp 0000:00:1c.3:pcie04: Card present on Slot(3)
    [40251.532247] ath: timeout (100000 us) on reg 0x9860: 0xffffffff & 0x00000001 != 0x00000000
    [40251.532250] ath: Unable to reset channel (2462 MHz), reset status -5
    [40251.532422] ath: Set channel: 5745 MHz
    [40251.540639] ath: Failed to stop TX DMA in 100 msec after killing last frame
    [40251.548826] ath: Failed to stop TX DMA in 100 msec after killing last frame
    [40251.557023] ath: Failed to stop TX DMA in 100 msec after killing last frame
    [40251.565211] ath: Failed to stop TX DMA in 100 msec after killing last frame
    [40251.573415] ath: Failed to stop TX DMA in 100 msec after killing last frame
    [40251.581603] ath: Failed to stop TX DMA in 100 msec after killing last frame
    [40251.581606] ath: Failed to stop TX DMA. Resetting hardware!
    [40251.592679] ath: DMA failed to stop in 10 ms AR_CR=0xffffffff AR_DIAG_SW=0xffffffff
    [40251.703330] ath: timeout (100000 us) on reg 0x7000: 0xffffffff & 0x00000003 != 0x00000000
    [40251.703333] ath: RTC stuck in MAC reset
    [40251.703334] ath: Chip reset failed
    [40251.703335] ath: Unable to reset hardware; reset status -22
    
    This is currently only reproducible with some HB92 (Half Mini-PCIE)
    cards but the fix applies to all AR9280 cards. This patch fixes this
    issue by setting bit 22 during radio disable.
    
    This patch has fixes for all kernels that has ath9k.
    
    [1] http://wireless.kernel.org/en/developers/Testing/wifi-test
    
    
    
    Cc: kyungwan.nam@atheros.com
    Cc: amod.bodas@atheros.com
    Cc: david.quan@atheros.com
    Cc: stable@kernel.org
    Signed-off-by: default avatarVasanthakumar Thiagarajan <vasanth@atheros.com>
    Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
    f119da30