diff options
author | Felix Fietkau <nbd@openwrt.org> | 2011-09-14 15:23:01 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2011-09-16 16:45:36 -0400 |
commit | e392700741a4a5f061f3fcc9f5f2ceb0e0b0953e (patch) | |
tree | 93fa2813c5c182042dc510bf0c4de35d210196e0 /drivers | |
parent | c5d2593bad0d3440ce3b464d9e3c514d364820f8 (diff) |
ath9k: fix enabling interrupts after a hardware error interrupt
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>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/main.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c index c8ac2ce61ffe..03b402bb9c4e 100644 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c | |||
@@ -669,15 +669,15 @@ void ath9k_tasklet(unsigned long data) | |||
669 | u32 status = sc->intrstatus; | 669 | u32 status = sc->intrstatus; |
670 | u32 rxmask; | 670 | u32 rxmask; |
671 | 671 | ||
672 | ath9k_ps_wakeup(sc); | ||
673 | spin_lock(&sc->sc_pcu_lock); | ||
674 | |||
672 | if ((status & ATH9K_INT_FATAL) || | 675 | if ((status & ATH9K_INT_FATAL) || |
673 | (status & ATH9K_INT_BB_WATCHDOG)) { | 676 | (status & ATH9K_INT_BB_WATCHDOG)) { |
674 | ieee80211_queue_work(sc->hw, &sc->hw_reset_work); | 677 | ieee80211_queue_work(sc->hw, &sc->hw_reset_work); |
675 | return; | 678 | goto out; |
676 | } | 679 | } |
677 | 680 | ||
678 | ath9k_ps_wakeup(sc); | ||
679 | spin_lock(&sc->sc_pcu_lock); | ||
680 | |||
681 | /* | 681 | /* |
682 | * Only run the baseband hang check if beacons stop working in AP or | 682 | * Only run the baseband hang check if beacons stop working in AP or |
683 | * IBSS mode, because it has a high false positive rate. For station | 683 | * IBSS mode, because it has a high false positive rate. For station |
@@ -725,6 +725,7 @@ void ath9k_tasklet(unsigned long data) | |||
725 | if (status & ATH9K_INT_GENTIMER) | 725 | if (status & ATH9K_INT_GENTIMER) |
726 | ath_gen_timer_isr(sc->sc_ah); | 726 | ath_gen_timer_isr(sc->sc_ah); |
727 | 727 | ||
728 | out: | ||
728 | /* re-enable hardware interrupt */ | 729 | /* re-enable hardware interrupt */ |
729 | ath9k_hw_enable_interrupts(ah); | 730 | ath9k_hw_enable_interrupts(ah); |
730 | 731 | ||