ath5k: write beacon control register twice when resetting tsf
authorBob Copeland <me@bobcopeland.com>
Sun, 28 Sep 2008 16:09:43 +0000 (12:09 -0400)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 30 Sep 2008 18:07:25 +0000 (14:07 -0400)
According to the newly-released Atheros HAL code, asserting the
TSF reset bit will toggle a hardware internal state, resulting in a
spurious reset on the next chip reset.  Whenever we force a TSF bit,
write the bit twice to clear the internal signal.

Signed-off-by: Bob Copeland <me@bobcopeland.com>
Acked-by: Nick Kossifidis <mickflemm@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath5k/pcu.c

index c77cee2..a47df9a 100644 (file)
@@ -633,8 +633,20 @@ u64 ath5k_hw_get_tsf64(struct ath5k_hw *ah)
  */
 void ath5k_hw_reset_tsf(struct ath5k_hw *ah)
 {
+       u32 val;
+
        ATH5K_TRACE(ah->ah_sc);
-       AR5K_REG_ENABLE_BITS(ah, AR5K_BEACON, AR5K_BEACON_RESET_TSF);
+
+       val = ath5k_hw_reg_read(ah, AR5K_BEACON) | AR5K_BEACON_RESET_TSF;
+
+       /*
+        * Each write to the RESET_TSF bit toggles a hardware internal
+        * signal to reset TSF, but if left high it will cause a TSF reset
+        * on the next chip reset as well.  Thus we always write the value
+        * twice to clear the signal.
+        */
+       ath5k_hw_reg_write(ah, val, AR5K_BEACON);
+       ath5k_hw_reg_write(ah, val, AR5K_BEACON);
 }
 
 /*