From: Benjamin Berg <benjamin.b...@open-mesh.com>

Not much of a change. Only small fix is that we don't assume that
exactly 1.5ms have passed for the second AR91xx SoC TSF setting.

Signed-off-by: Benjamin Berg <benjamin.b...@open-mesh.com>
---
 drivers/net/wireless/ath/ath9k/hw.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/drivers/net/wireless/ath/ath9k/hw.c 
b/drivers/net/wireless/ath/ath9k/hw.c
index 8b2895f..1c27e2d 100644
--- a/drivers/net/wireless/ath/ath9k/hw.c
+++ b/drivers/net/wireless/ath/ath9k/hw.c
@@ -1832,8 +1832,9 @@ int ath9k_hw_reset(struct ath_hw *ah, struct 
ath9k_channel *chan,
        u32 saveLedState;
        u32 saveDefAntenna;
        u32 macStaId1;
+       struct timespec tsf_ts;
+       u32 tsf_offset;
        u64 tsf = 0;
-       s64 usec = 0;
        int r;
        bool start_mci_reset = false;
        bool save_fullsleep = ah->chip_fullsleep;
@@ -1877,8 +1878,8 @@ int ath9k_hw_reset(struct ath_hw *ah, struct 
ath9k_channel *chan,
        macStaId1 = REG_READ(ah, AR_STA_ID1) & AR_STA_ID1_BASE_RATE_11B;
 
        /* Save TSF before chip reset, a cold reset clears it */
+       getrawmonotonic(&tsf_ts);
        tsf = ath9k_hw_gettsf64(ah);
-       usec = ktime_to_us(ktime_get_raw());
 
        saveLedState = REG_READ(ah, AR_CFG_LED) &
                (AR_CFG_LED_ASSOC_CTL | AR_CFG_LED_MODE_SEL |
@@ -1911,8 +1912,8 @@ int ath9k_hw_reset(struct ath_hw *ah, struct 
ath9k_channel *chan,
        }
 
        /* Restore TSF */
-       usec = ktime_to_us(ktime_get_raw()) - usec;
-       ath9k_hw_settsf64(ah, tsf + usec);
+       tsf_offset = ath9k_hw_get_tsf_offset(&tsf_ts, NULL);
+       ath9k_hw_settsf64(ah, tsf + tsf_offset);
 
        if (AR_SREV_9280_20_OR_LATER(ah))
                REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL, AR_GPIO_JTAG_DISABLE);
@@ -1932,12 +1933,11 @@ int ath9k_hw_reset(struct ath_hw *ah, struct 
ath9k_channel *chan,
        /*
         * Some AR91xx SoC devices frequently fail to accept TSF writes
         * right after the chip reset. When that happens, write a new
-        * value after the initvals have been applied, with an offset
-        * based on measured time difference
+        * value after the initvals have been applied.
         */
        if (AR_SREV_9100(ah) && (ath9k_hw_gettsf64(ah) < tsf)) {
-               tsf += 1500;
-               ath9k_hw_settsf64(ah, tsf);
+               tsf_offset = ath9k_hw_get_tsf_offset(&tsf_ts, NULL);
+               ath9k_hw_settsf64(ah, tsf + tsf_offset);
        }
 
        ath9k_hw_init_mfp(ah);
-- 
2.8.1

_______________________________________________
ath9k-devel mailing list
ath9k-devel@lists.ath9k.org
https://lists.ath9k.org/mailman/listinfo/ath9k-devel

Reply via email to