|
@@ -455,8 +455,11 @@ static void ath9k_tasklet(unsigned long data)
|
|
|
struct ath_softc *sc = (struct ath_softc *)data;
|
|
|
u32 status = sc->intrstatus;
|
|
|
|
|
|
+ ath9k_ps_wakeup(sc);
|
|
|
+
|
|
|
if (status & ATH9K_INT_FATAL) {
|
|
|
ath_reset(sc, false);
|
|
|
+ ath9k_ps_restore(sc);
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -471,6 +474,7 @@ static void ath9k_tasklet(unsigned long data)
|
|
|
|
|
|
/* re-enable hardware interrupt */
|
|
|
ath9k_hw_set_interrupts(sc->sc_ah, sc->imask);
|
|
|
+ ath9k_ps_restore(sc);
|
|
|
}
|
|
|
|
|
|
irqreturn_t ath_isr(int irq, void *dev)
|
|
@@ -498,14 +502,11 @@ irqreturn_t ath_isr(int irq, void *dev)
|
|
|
if (sc->sc_flags & SC_OP_INVALID)
|
|
|
return IRQ_NONE;
|
|
|
|
|
|
- ath9k_ps_wakeup(sc);
|
|
|
|
|
|
/* shared irq, not for us */
|
|
|
|
|
|
- if (!ath9k_hw_intrpend(ah)) {
|
|
|
- ath9k_ps_restore(sc);
|
|
|
+ if (!ath9k_hw_intrpend(ah))
|
|
|
return IRQ_NONE;
|
|
|
- }
|
|
|
|
|
|
/*
|
|
|
* Figure out the reason(s) for the interrupt. Note
|
|
@@ -520,10 +521,8 @@ irqreturn_t ath_isr(int irq, void *dev)
|
|
|
* If there are no status bits set, then this interrupt was not
|
|
|
* for me (should have been caught above).
|
|
|
*/
|
|
|
- if (!status) {
|
|
|
- ath9k_ps_restore(sc);
|
|
|
+ if (!status)
|
|
|
return IRQ_NONE;
|
|
|
- }
|
|
|
|
|
|
/* Cache the status */
|
|
|
sc->intrstatus = status;
|
|
@@ -560,20 +559,17 @@ irqreturn_t ath_isr(int irq, void *dev)
|
|
|
ath9k_hw_set_interrupts(ah, sc->imask);
|
|
|
}
|
|
|
|
|
|
- if (status & ATH9K_INT_TIM_TIMER) {
|
|
|
- if (!(ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) {
|
|
|
+ if (!(ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP))
|
|
|
+ if (status & ATH9K_INT_TIM_TIMER) {
|
|
|
/* Clear RxAbort bit so that we can
|
|
|
* receive frames */
|
|
|
ath9k_hw_setpower(ah, ATH9K_PM_AWAKE);
|
|
|
- ath9k_hw_setrxabort(ah, 0);
|
|
|
- sched = true;
|
|
|
+ ath9k_hw_setrxabort(sc->sc_ah, 0);
|
|
|
sc->sc_flags |= SC_OP_WAIT_FOR_BEACON;
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
chip_reset:
|
|
|
|
|
|
- ath9k_ps_restore(sc);
|
|
|
ath_debug_stat_interrupt(sc, status);
|
|
|
|
|
|
if (sched) {
|