ath9k: Handle fatal interrupts properly
authorSujith Manoharan <c_manoha@qca.qualcomm.com>
Mon, 4 Jun 2012 14:54:01 +0000 (20:24 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 6 Jun 2012 19:20:31 +0000 (15:20 -0400)
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: Sujith Manoharan <c_manoha@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/ath9k.h
drivers/net/wireless/ath/ath9k/main.c

index ae43de1cbb03f7952a63a6f709442368b9827ef6..02fc1c1e5eeb05c2d99bca67ea16f45f91e32165 100644 (file)
@@ -611,6 +611,7 @@ enum sc_op_flags {
        SC_OP_TSF_RESET,
        SC_OP_ANI_RUN,
        SC_OP_PRIM_STA_VIF,
+       SC_OP_HW_RESET,
 };
 
 /* Powersave flags */
index e4f7d0ea5f20bce76274e08e8a3882e5816ce049..34d6f26c6bc74d474c682a3521af78068a5f5606 100644 (file)
@@ -218,6 +218,8 @@ static bool ath_complete_reset(struct ath_softc *sc, bool start)
 
        ath9k_cmn_update_txpow(ah, sc->curtxpow,
                               sc->config.txpowlimit, &sc->curtxpow);
+
+       clear_bit(SC_OP_HW_RESET, &sc->sc_flags);
        ath9k_hw_set_interrupts(ah);
        ath9k_hw_enable_interrupts(ah);
 
@@ -362,6 +364,7 @@ void ath9k_tasklet(unsigned long data)
 
                RESET_STAT_INC(sc, type);
 #endif
+               set_bit(SC_OP_HW_RESET, &sc->sc_flags);
                ieee80211_queue_work(sc->hw, &sc->hw_reset_work);
                goto out;
        }
@@ -438,12 +441,14 @@ irqreturn_t ath_isr(int irq, void *dev)
        if (test_bit(SC_OP_INVALID, &sc->sc_flags))
                return IRQ_NONE;
 
-
        /* shared irq, not for us */
 
        if (!ath9k_hw_intrpend(ah))
                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
         * that the hal returns a pseudo-ISR that may include