ath9k: fix enabling interrupts after a hardware error interrupt
authorFelix Fietkau <nbd@openwrt.org>
Wed, 14 Sep 2011 19:23:01 +0000 (21:23 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 16 Sep 2011 20:45:36 +0000 (16:45 -0400)
The interrupt handler increases the interrupt disable refcount, so the
tasklet needs to always call ath9k_hw_enable_interrupts.

Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/main.c

index c8ac2ce61ffe86e218cfc96d8b049f3b985b79cc..03b402bb9c4e6f25d25063b04b857c9dc4857528 100644 (file)
@@ -669,15 +669,15 @@ void ath9k_tasklet(unsigned long data)
        u32 status = sc->intrstatus;
        u32 rxmask;
 
+       ath9k_ps_wakeup(sc);
+       spin_lock(&sc->sc_pcu_lock);
+
        if ((status & ATH9K_INT_FATAL) ||
            (status & ATH9K_INT_BB_WATCHDOG)) {
                ieee80211_queue_work(sc->hw, &sc->hw_reset_work);
-               return;
+               goto out;
        }
 
-       ath9k_ps_wakeup(sc);
-       spin_lock(&sc->sc_pcu_lock);
-
        /*
         * Only run the baseband hang check if beacons stop working in AP or
         * IBSS mode, because it has a high false positive rate. For station
@@ -725,6 +725,7 @@ void ath9k_tasklet(unsigned long data)
                if (status & ATH9K_INT_GENTIMER)
                        ath_gen_timer_isr(sc->sc_ah);
 
+out:
        /* re-enable hardware interrupt */
        ath9k_hw_enable_interrupts(ah);