|
@@ -1960,6 +1960,8 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
|
|
|
|
|
|
REGWRITE_BUFFER_FLUSH(ah);
|
|
|
|
|
|
+ ath9k_hw_gen_timer_start_tsf2(ah);
|
|
|
+
|
|
|
ath9k_hw_init_desc(ah);
|
|
|
|
|
|
if (ath9k_hw_btcoex_is_enabled(ah))
|
|
@@ -2924,6 +2926,16 @@ u32 ath9k_hw_gettsf32(struct ath_hw *ah)
|
|
|
}
|
|
|
EXPORT_SYMBOL(ath9k_hw_gettsf32);
|
|
|
|
|
|
+void ath9k_hw_gen_timer_start_tsf2(struct ath_hw *ah)
|
|
|
+{
|
|
|
+ struct ath_gen_timer_table *timer_table = &ah->hw_gen_timers;
|
|
|
+
|
|
|
+ if (timer_table->tsf2_enabled) {
|
|
|
+ REG_SET_BIT(ah, AR_DIRECT_CONNECT, AR_DC_AP_STA_EN);
|
|
|
+ REG_SET_BIT(ah, AR_RESET_TSF, AR_RESET_TSF2_ONCE);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
struct ath_gen_timer *ath_gen_timer_alloc(struct ath_hw *ah,
|
|
|
void (*trigger)(void *),
|
|
|
void (*overflow)(void *),
|
|
@@ -2934,7 +2946,11 @@ struct ath_gen_timer *ath_gen_timer_alloc(struct ath_hw *ah,
|
|
|
struct ath_gen_timer *timer;
|
|
|
|
|
|
if ((timer_index < AR_FIRST_NDP_TIMER) ||
|
|
|
- (timer_index >= ATH_MAX_GEN_TIMER))
|
|
|
+ (timer_index >= ATH_MAX_GEN_TIMER))
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ if ((timer_index > AR_FIRST_NDP_TIMER) &&
|
|
|
+ !AR_SREV_9300_20_OR_LATER(ah))
|
|
|
return NULL;
|
|
|
|
|
|
timer = kzalloc(sizeof(struct ath_gen_timer), GFP_KERNEL);
|
|
@@ -2948,6 +2964,11 @@ struct ath_gen_timer *ath_gen_timer_alloc(struct ath_hw *ah,
|
|
|
timer->overflow = overflow;
|
|
|
timer->arg = arg;
|
|
|
|
|
|
+ if ((timer_index > AR_FIRST_NDP_TIMER) && !timer_table->tsf2_enabled) {
|
|
|
+ timer_table->tsf2_enabled = true;
|
|
|
+ ath9k_hw_gen_timer_start_tsf2(ah);
|
|
|
+ }
|
|
|
+
|
|
|
return timer;
|
|
|
}
|
|
|
EXPORT_SYMBOL(ath_gen_timer_alloc);
|