Commit b74713d0 authored by Sujith Manoharan's avatar Sujith Manoharan Committed by John W. Linville

ath9k: Handle fatal interrupts properly

When a fatal interrupt is received or it is detected that the baseband
has hung, the chip has to be reset immediately.  Otherwise, we end up
processing spurious interrupts. Ensure that we bail out properly in
the ISR when the reset work hasn't completed yet.
Signed-off-by: default avatarSujith Manoharan <c_manoha@qca.qualcomm.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 781b14a3
...@@ -611,6 +611,7 @@ enum sc_op_flags { ...@@ -611,6 +611,7 @@ enum sc_op_flags {
SC_OP_TSF_RESET, SC_OP_TSF_RESET,
SC_OP_ANI_RUN, SC_OP_ANI_RUN,
SC_OP_PRIM_STA_VIF, SC_OP_PRIM_STA_VIF,
SC_OP_HW_RESET,
}; };
/* Powersave flags */ /* Powersave flags */
......
...@@ -218,6 +218,8 @@ static bool ath_complete_reset(struct ath_softc *sc, bool start) ...@@ -218,6 +218,8 @@ static bool ath_complete_reset(struct ath_softc *sc, bool start)
ath9k_cmn_update_txpow(ah, sc->curtxpow, ath9k_cmn_update_txpow(ah, sc->curtxpow,
sc->config.txpowlimit, &sc->curtxpow); sc->config.txpowlimit, &sc->curtxpow);
clear_bit(SC_OP_HW_RESET, &sc->sc_flags);
ath9k_hw_set_interrupts(ah); ath9k_hw_set_interrupts(ah);
ath9k_hw_enable_interrupts(ah); ath9k_hw_enable_interrupts(ah);
...@@ -362,6 +364,7 @@ void ath9k_tasklet(unsigned long data) ...@@ -362,6 +364,7 @@ void ath9k_tasklet(unsigned long data)
RESET_STAT_INC(sc, type); RESET_STAT_INC(sc, type);
#endif #endif
set_bit(SC_OP_HW_RESET, &sc->sc_flags);
ieee80211_queue_work(sc->hw, &sc->hw_reset_work); ieee80211_queue_work(sc->hw, &sc->hw_reset_work);
goto out; goto out;
} }
...@@ -438,12 +441,14 @@ irqreturn_t ath_isr(int irq, void *dev) ...@@ -438,12 +441,14 @@ irqreturn_t ath_isr(int irq, void *dev)
if (test_bit(SC_OP_INVALID, &sc->sc_flags)) if (test_bit(SC_OP_INVALID, &sc->sc_flags))
return IRQ_NONE; return IRQ_NONE;
/* shared irq, not for us */ /* shared irq, not for us */
if (!ath9k_hw_intrpend(ah)) if (!ath9k_hw_intrpend(ah))
return IRQ_NONE; return IRQ_NONE;
if(test_bit(SC_OP_HW_RESET, &sc->sc_flags))
return IRQ_HANDLED;
/* /*
* Figure out the reason(s) for the interrupt. Note * Figure out the reason(s) for the interrupt. Note
* that the hal returns a pseudo-ISR that may include * that the hal returns a pseudo-ISR that may include
......
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