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: Vasanthakumar Thiagarajan <vasanth@atheros.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
committed by
John W. Linville
parent
ca45de77ad
commit
788f6875fc
@@ -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)
|
|||||||
|
|
||||||
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);
|
|||||||
|
|
||||||
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,
|
|||||||
|
|
||||||
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
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user