ath9k: Handle FATAL interrupts correctly
When a FATAL interrupt is received, a full chip reset is required, which is done in the main tasklet. But since the reset routine is scheduled as a work item, make sure that interrupts are not enabled in the tasklet before the reset is done. Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
8a5b7ab36b
commit
c6cc47b101
|
@ -362,6 +362,13 @@ void ath9k_tasklet(unsigned long data)
|
||||||
type = RESET_TYPE_BB_WATCHDOG;
|
type = RESET_TYPE_BB_WATCHDOG;
|
||||||
|
|
||||||
ath9k_queue_reset(sc, type);
|
ath9k_queue_reset(sc, type);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Increment the ref. counter here so that
|
||||||
|
* interrupts are enabled in the reset routine.
|
||||||
|
*/
|
||||||
|
atomic_inc(&ah->intr_ref_cnt);
|
||||||
|
ath_dbg(common, ANY, "FATAL: Skipping interrupts\n");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -400,10 +407,9 @@ void ath9k_tasklet(unsigned long data)
|
||||||
|
|
||||||
ath9k_btcoex_handle_interrupt(sc, status);
|
ath9k_btcoex_handle_interrupt(sc, status);
|
||||||
|
|
||||||
out:
|
|
||||||
/* re-enable hardware interrupt */
|
/* re-enable hardware interrupt */
|
||||||
ath9k_hw_enable_interrupts(ah);
|
ath9k_hw_enable_interrupts(ah);
|
||||||
|
out:
|
||||||
spin_unlock(&sc->sc_pcu_lock);
|
spin_unlock(&sc->sc_pcu_lock);
|
||||||
ath9k_ps_restore(sc);
|
ath9k_ps_restore(sc);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue