aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/ath9k/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/main.c')
-rw-r--r--drivers/net/wireless/ath/ath9k/main.c18
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);