diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/main.c')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/main.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c index ebbbfc7a193b..9a72640237cb 100644 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c | |||
@@ -512,16 +512,13 @@ irqreturn_t ath_isr(int irq, void *dev) | |||
512 | if (!ah || test_bit(ATH_OP_INVALID, &common->op_flags)) | 512 | if (!ah || test_bit(ATH_OP_INVALID, &common->op_flags)) |
513 | return IRQ_NONE; | 513 | return IRQ_NONE; |
514 | 514 | ||
515 | /* shared irq, not for us */ | 515 | if (!AR_SREV_9100(ah) && test_bit(ATH_OP_HW_RESET, &common->op_flags)) |
516 | return IRQ_NONE; | ||
516 | 517 | ||
518 | /* shared irq, not for us */ | ||
517 | if (!ath9k_hw_intrpend(ah)) | 519 | if (!ath9k_hw_intrpend(ah)) |
518 | return IRQ_NONE; | 520 | return IRQ_NONE; |
519 | 521 | ||
520 | if (test_bit(ATH_OP_HW_RESET, &common->op_flags)) { | ||
521 | ath9k_hw_kill_interrupts(ah); | ||
522 | return IRQ_HANDLED; | ||
523 | } | ||
524 | |||
525 | /* | 522 | /* |
526 | * Figure out the reason(s) for the interrupt. Note | 523 | * Figure out the reason(s) for the interrupt. Note |
527 | * that the hal returns a pseudo-ISR that may include | 524 | * that the hal returns a pseudo-ISR that may include |
@@ -532,6 +529,9 @@ irqreturn_t ath_isr(int irq, void *dev) | |||
532 | ath9k_debug_sync_cause(sc, sync_cause); | 529 | ath9k_debug_sync_cause(sc, sync_cause); |
533 | status &= ah->imask; /* discard unasked-for bits */ | 530 | status &= ah->imask; /* discard unasked-for bits */ |
534 | 531 | ||
532 | if (AR_SREV_9100(ah) && test_bit(ATH_OP_HW_RESET, &common->op_flags)) | ||
533 | return IRQ_HANDLED; | ||
534 | |||
535 | /* | 535 | /* |
536 | * If there are no status bits set, then this interrupt was not | 536 | * If there are no status bits set, then this interrupt was not |
537 | * for me (should have been caught above). | 537 | * for me (should have been caught above). |
@@ -613,6 +613,7 @@ int ath_reset(struct ath_softc *sc, struct ath9k_channel *hchan) | |||
613 | struct ath_common *common = ath9k_hw_common(sc->sc_ah); | 613 | struct ath_common *common = ath9k_hw_common(sc->sc_ah); |
614 | int r; | 614 | int r; |
615 | 615 | ||
616 | ath9k_hw_kill_interrupts(sc->sc_ah); | ||
616 | set_bit(ATH_OP_HW_RESET, &common->op_flags); | 617 | set_bit(ATH_OP_HW_RESET, &common->op_flags); |
617 | 618 | ||
618 | ath9k_ps_wakeup(sc); | 619 | ath9k_ps_wakeup(sc); |
@@ -633,6 +634,7 @@ void ath9k_queue_reset(struct ath_softc *sc, enum ath_reset_type type) | |||
633 | #ifdef CONFIG_ATH9K_DEBUGFS | 634 | #ifdef CONFIG_ATH9K_DEBUGFS |
634 | RESET_STAT_INC(sc, type); | 635 | RESET_STAT_INC(sc, type); |
635 | #endif | 636 | #endif |
637 | ath9k_hw_kill_interrupts(sc->sc_ah); | ||
636 | set_bit(ATH_OP_HW_RESET, &common->op_flags); | 638 | set_bit(ATH_OP_HW_RESET, &common->op_flags); |
637 | ieee80211_queue_work(sc->hw, &sc->hw_reset_work); | 639 | ieee80211_queue_work(sc->hw, &sc->hw_reset_work); |
638 | } | 640 | } |
@@ -887,6 +889,9 @@ static void ath9k_stop(struct ieee80211_hw *hw) | |||
887 | &sc->cur_chan->chandef); | 889 | &sc->cur_chan->chandef); |
888 | 890 | ||
889 | ath9k_hw_reset(ah, ah->curchan, ah->caldata, false); | 891 | ath9k_hw_reset(ah, ah->curchan, ah->caldata, false); |
892 | |||
893 | set_bit(ATH_OP_INVALID, &common->op_flags); | ||
894 | |||
890 | ath9k_hw_phy_disable(ah); | 895 | ath9k_hw_phy_disable(ah); |
891 | 896 | ||
892 | ath9k_hw_configpcipowersave(ah, true); | 897 | ath9k_hw_configpcipowersave(ah, true); |
@@ -895,7 +900,6 @@ static void ath9k_stop(struct ieee80211_hw *hw) | |||
895 | 900 | ||
896 | ath9k_ps_restore(sc); | 901 | ath9k_ps_restore(sc); |
897 | 902 | ||
898 | set_bit(ATH_OP_INVALID, &common->op_flags); | ||
899 | sc->ps_idle = prev_idle; | 903 | sc->ps_idle = prev_idle; |
900 | 904 | ||
901 | mutex_unlock(&sc->mutex); | 905 | mutex_unlock(&sc->mutex); |