Commit 788f6875 authored by Vasanthakumar Thiagarajan's avatar Vasanthakumar Thiagarajan Committed by John W. Linville
Browse files

ath9k: Fix bug in configuring hw timer



Hw next tigger time is configured as current_tsf + (timer_period * 10) which
is wrong, it should be current_tsf + timer_period. The wrong hw timer configuration
would cause btcoex related issues.
Signed-off-by: default avatarVasanthakumar Thiagarajan <vasanth@atheros.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent ca45de77
...@@ -138,10 +138,10 @@ static void ath_detect_bt_priority(struct ath_softc *sc) ...@@ -138,10 +138,10 @@ static void ath_detect_bt_priority(struct ath_softc *sc)
static void ath9k_gen_timer_start(struct ath_hw *ah, static void ath9k_gen_timer_start(struct ath_hw *ah,
struct ath_gen_timer *timer, struct ath_gen_timer *timer,
u32 timer_next, u32 trig_timeout,
u32 timer_period) u32 timer_period)
{ {
ath9k_hw_gen_timer_start(ah, timer, timer_next, timer_period); ath9k_hw_gen_timer_start(ah, timer, trig_timeout, timer_period);
if ((ah->imask & ATH9K_INT_GENTIMER) == 0) { if ((ah->imask & ATH9K_INT_GENTIMER) == 0) {
ath9k_hw_disable_interrupts(ah); ath9k_hw_disable_interrupts(ah);
...@@ -195,7 +195,7 @@ static void ath_btcoex_period_timer(unsigned long data) ...@@ -195,7 +195,7 @@ static void ath_btcoex_period_timer(unsigned long data)
timer_period = is_btscan ? btcoex->btscan_no_stomp : timer_period = is_btscan ? btcoex->btscan_no_stomp :
btcoex->btcoex_no_stomp; btcoex->btcoex_no_stomp;
ath9k_gen_timer_start(ah, btcoex->no_stomp_timer, 0, ath9k_gen_timer_start(ah, btcoex->no_stomp_timer, timer_period,
timer_period * 10); timer_period * 10);
btcoex->hw_timer_enabled = true; btcoex->hw_timer_enabled = true;
} }
......
...@@ -2430,11 +2430,11 @@ EXPORT_SYMBOL(ath_gen_timer_alloc); ...@@ -2430,11 +2430,11 @@ EXPORT_SYMBOL(ath_gen_timer_alloc);
void ath9k_hw_gen_timer_start(struct ath_hw *ah, void ath9k_hw_gen_timer_start(struct ath_hw *ah,
struct ath_gen_timer *timer, struct ath_gen_timer *timer,
u32 timer_next, u32 trig_timeout,
u32 timer_period) u32 timer_period)
{ {
struct ath_gen_timer_table *timer_table = &ah->hw_gen_timers; struct ath_gen_timer_table *timer_table = &ah->hw_gen_timers;
u32 tsf; u32 tsf, timer_next;
BUG_ON(!timer_period); BUG_ON(!timer_period);
...@@ -2442,17 +2442,12 @@ void ath9k_hw_gen_timer_start(struct ath_hw *ah, ...@@ -2442,17 +2442,12 @@ void ath9k_hw_gen_timer_start(struct ath_hw *ah,
tsf = ath9k_hw_gettsf32(ah); tsf = ath9k_hw_gettsf32(ah);
timer_next = tsf + trig_timeout;
ath_dbg(ath9k_hw_common(ah), ATH_DBG_HWTIMER, ath_dbg(ath9k_hw_common(ah), ATH_DBG_HWTIMER,
"current tsf %x period %x timer_next %x\n", "current tsf %x period %x timer_next %x\n",
tsf, timer_period, timer_next); tsf, timer_period, timer_next);
/*
* Pull timer_next forward if the current TSF already passed it
* because of software latency
*/
if (timer_next < tsf)
timer_next = tsf + timer_period;
/* /*
* Program generic timer registers * Program generic timer registers
*/ */
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment