aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSenthil Balasubramanian <senthilkumar@atheros.com>2008-09-22 04:52:39 -0400
committerJohn W. Linville <linville@tuxdriver.com>2008-09-22 17:22:15 -0400
commit6115e8557a75b5f24b56ed46c60dffef7e7fa992 (patch)
tree566cdd11c369a941893184255a8e0cc360098af6
parent5d89945e6ec44494285cb8de85d4f43d4647b740 (diff)
ath9k: Fix IRQ nobody cared issue with ath9k
IRQs should be disabled before calling free_irq. Also flush pending IRQs. Pasted the kernel log message for reference. kernel: irq 17: nobody cared (try booting with the "irqpoll" option) kernel: [<c0252d2c>] __report_bad_irq+0x2e/0x6f kernel: [<c0252f22>] note_interrupt+0x1b5/0x207 kernel: [<c025258b>] ? handle_IRQ_event+0x21/0x48 kernel: [<c02534cb>] handle_fasteoi_irq+0x8e/0xad kernel: [<c0205650>] do_IRQ+0x6c/0x84 kernel: [<c020425f>] common_interrupt+0x23/0x28 kernel: [<c034f6f6>] ? acpi_idle_enter_simple+0x198/0x205 kernel: [<c044686c>] ? menu_select+0x5c/0x78 kernel: [<c0445a95>] cpuidle_idle_call+0x59/0x89 kernel: [<c02029d7>] cpu_idle+0xae/0xcf kernel: [<c0543102>] rest_init+0x4e/0x50 kernel: ======================= kernel: handlers: kernel: [<f88fdd26>] (ath_isr+0x0/0x13a [ath9k]) kernel: Disabling IRQ #17 Signed-off-by: Senthil Balasubramanian <senthilkumar@atheros.com> Tested-by: Steven Noonan <steven@uplinklabs.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/ath9k/core.c4
-rw-r--r--drivers/net/wireless/ath9k/main.c9
2 files changed, 10 insertions, 3 deletions
diff --git a/drivers/net/wireless/ath9k/core.c b/drivers/net/wireless/ath9k/core.c
index f6c45288d0e7..c04959357bda 100644
--- a/drivers/net/wireless/ath9k/core.c
+++ b/drivers/net/wireless/ath9k/core.c
@@ -294,8 +294,6 @@ static int ath_stop(struct ath_softc *sc)
294 * hardware is gone (invalid). 294 * hardware is gone (invalid).
295 */ 295 */
296 296
297 if (!sc->sc_invalid)
298 ath9k_hw_set_interrupts(ah, 0);
299 ath_draintxq(sc, false); 297 ath_draintxq(sc, false);
300 if (!sc->sc_invalid) { 298 if (!sc->sc_invalid) {
301 ath_stoprecv(sc); 299 ath_stoprecv(sc);
@@ -1336,6 +1334,8 @@ void ath_deinit(struct ath_softc *sc)
1336 1334
1337 DPRINTF(sc, ATH_DBG_CONFIG, "%s\n", __func__); 1335 DPRINTF(sc, ATH_DBG_CONFIG, "%s\n", __func__);
1338 1336
1337 tasklet_kill(&sc->intr_tq);
1338 tasklet_kill(&sc->bcon_tasklet);
1339 ath_stop(sc); 1339 ath_stop(sc);
1340 if (!sc->sc_invalid) 1340 if (!sc->sc_invalid)
1341 ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_AWAKE); 1341 ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_AWAKE);
diff --git a/drivers/net/wireless/ath9k/main.c b/drivers/net/wireless/ath9k/main.c
index 099719649c98..acebdf1d20a8 100644
--- a/drivers/net/wireless/ath9k/main.c
+++ b/drivers/net/wireless/ath9k/main.c
@@ -1411,10 +1411,17 @@ static void ath_pci_remove(struct pci_dev *pdev)
1411{ 1411{
1412 struct ieee80211_hw *hw = pci_get_drvdata(pdev); 1412 struct ieee80211_hw *hw = pci_get_drvdata(pdev);
1413 struct ath_softc *sc = hw->priv; 1413 struct ath_softc *sc = hw->priv;
1414 enum ath9k_int status;
1414 1415
1415 if (pdev->irq) 1416 if (pdev->irq) {
1417 ath9k_hw_set_interrupts(sc->sc_ah, 0);
1418 /* clear the ISR */
1419 ath9k_hw_getisr(sc->sc_ah, &status);
1420 sc->sc_invalid = 1;
1416 free_irq(pdev->irq, sc); 1421 free_irq(pdev->irq, sc);
1422 }
1417 ath_detach(sc); 1423 ath_detach(sc);
1424
1418 pci_iounmap(pdev, sc->mem); 1425 pci_iounmap(pdev, sc->mem);
1419 pci_release_region(pdev, 0); 1426 pci_release_region(pdev, 0);
1420 pci_disable_device(pdev); 1427 pci_disable_device(pdev);