|
@@ -17,6 +17,7 @@
|
|
|
#include <linux/io.h>
|
|
|
#include <linux/slab.h>
|
|
|
#include <linux/module.h>
|
|
|
+#include <linux/time.h>
|
|
|
#include <asm/unaligned.h>
|
|
|
|
|
|
#include "hw.h"
|
|
@@ -1855,10 +1856,12 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
|
|
|
struct ath9k_hw_cal_data *caldata, bool fastcc)
|
|
|
{
|
|
|
struct ath_common *common = ath9k_hw_common(ah);
|
|
|
+ struct timespec ts;
|
|
|
u32 saveLedState;
|
|
|
u32 saveDefAntenna;
|
|
|
u32 macStaId1;
|
|
|
u64 tsf = 0;
|
|
|
+ s64 usec = 0;
|
|
|
int r;
|
|
|
bool start_mci_reset = false;
|
|
|
bool save_fullsleep = ah->chip_fullsleep;
|
|
@@ -1901,10 +1904,10 @@ 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;
|
|
|
|
|
|
- /* For chips on which RTC reset is done, save TSF before it gets cleared */
|
|
|
- if (AR_SREV_9100(ah) ||
|
|
|
- (AR_SREV_9280(ah) && ah->eep_ops->get_eeprom(ah, EEP_OL_PWRCTRL)))
|
|
|
- tsf = ath9k_hw_gettsf64(ah);
|
|
|
+ /* Save TSF before chip reset, a cold reset clears it */
|
|
|
+ tsf = ath9k_hw_gettsf64(ah);
|
|
|
+ getrawmonotonic(&ts);
|
|
|
+ usec = ts.tv_sec * 1000 + ts.tv_nsec / 1000;
|
|
|
|
|
|
saveLedState = REG_READ(ah, AR_CFG_LED) &
|
|
|
(AR_CFG_LED_ASSOC_CTL | AR_CFG_LED_MODE_SEL |
|
|
@@ -1937,8 +1940,9 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
|
|
|
}
|
|
|
|
|
|
/* Restore TSF */
|
|
|
- if (tsf)
|
|
|
- ath9k_hw_settsf64(ah, tsf);
|
|
|
+ getrawmonotonic(&ts);
|
|
|
+ usec = ts.tv_sec * 1000 + ts.tv_nsec / 1000 - usec;
|
|
|
+ ath9k_hw_settsf64(ah, tsf + usec);
|
|
|
|
|
|
if (AR_SREV_9280_20_OR_LATER(ah))
|
|
|
REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL, AR_GPIO_JTAG_DISABLE);
|