Commit a6bb860b authored by Sujith Manoharan's avatar Sujith Manoharan Committed by John W. Linville

ath9k: Fix baseband watchdog interrupts

Program the required baseband watchdog interrupt
mask to ensure that the correct watchdog interrupts
are raised when the BB is hung for some reason.

Also, use the capability HW_BB_WATCHDOG instead of
relying on other flags.
Signed-off-by: default avatarSujith Manoharan <c_manoha@qca.qualcomm.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent a7abaf7d
...@@ -922,11 +922,29 @@ void ath9k_hw_set_interrupts(struct ath_hw *ah) ...@@ -922,11 +922,29 @@ void ath9k_hw_set_interrupts(struct ath_hw *ah)
mask2 |= AR_IMR_S2_CST; mask2 |= AR_IMR_S2_CST;
} }
if (ah->config.hw_hang_checks & HW_BB_WATCHDOG) {
if (ints & ATH9K_INT_BB_WATCHDOG) {
mask |= AR_IMR_BCNMISC;
mask2 |= AR_IMR_S2_BB_WATCHDOG;
}
}
ath_dbg(common, INTERRUPT, "new IMR 0x%x\n", mask); ath_dbg(common, INTERRUPT, "new IMR 0x%x\n", mask);
REG_WRITE(ah, AR_IMR, mask); REG_WRITE(ah, AR_IMR, mask);
ah->imrs2_reg &= ~(AR_IMR_S2_TIM | AR_IMR_S2_DTIM | AR_IMR_S2_DTIMSYNC | ah->imrs2_reg &= ~(AR_IMR_S2_TIM |
AR_IMR_S2_CABEND | AR_IMR_S2_CABTO | AR_IMR_S2_DTIM |
AR_IMR_S2_TSFOOR | AR_IMR_S2_GTT | AR_IMR_S2_CST); AR_IMR_S2_DTIMSYNC |
AR_IMR_S2_CABEND |
AR_IMR_S2_CABTO |
AR_IMR_S2_TSFOOR |
AR_IMR_S2_GTT |
AR_IMR_S2_CST);
if (ah->config.hw_hang_checks & HW_BB_WATCHDOG) {
if (ints & ATH9K_INT_BB_WATCHDOG)
ah->imrs2_reg &= ~AR_IMR_S2_BB_WATCHDOG;
}
ah->imrs2_reg |= mask2; ah->imrs2_reg |= mask2;
REG_WRITE(ah, AR_IMR_S2, ah->imrs2_reg); REG_WRITE(ah, AR_IMR_S2, ah->imrs2_reg);
......
...@@ -587,7 +587,7 @@ irqreturn_t ath_isr(int irq, void *dev) ...@@ -587,7 +587,7 @@ irqreturn_t ath_isr(int irq, void *dev)
!(ah->caps.hw_caps & ATH9K_HW_CAP_EDMA))) !(ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)))
goto chip_reset; goto chip_reset;
if ((ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) && if ((ah->config.hw_hang_checks & HW_BB_WATCHDOG) &&
(status & ATH9K_INT_BB_WATCHDOG)) { (status & ATH9K_INT_BB_WATCHDOG)) {
spin_lock(&common->cc_lock); spin_lock(&common->cc_lock);
...@@ -726,11 +726,13 @@ static int ath9k_start(struct ieee80211_hw *hw) ...@@ -726,11 +726,13 @@ static int ath9k_start(struct ieee80211_hw *hw)
if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)
ah->imask |= ATH9K_INT_RXHP | ah->imask |= ATH9K_INT_RXHP |
ATH9K_INT_RXLP | ATH9K_INT_RXLP;
ATH9K_INT_BB_WATCHDOG;
else else
ah->imask |= ATH9K_INT_RX; ah->imask |= ATH9K_INT_RX;
if (ah->config.hw_hang_checks & HW_BB_WATCHDOG)
ah->imask |= ATH9K_INT_BB_WATCHDOG;
ah->imask |= ATH9K_INT_GTT; ah->imask |= ATH9K_INT_GTT;
if (ah->caps.hw_caps & ATH9K_HW_CAP_HT) if (ah->caps.hw_caps & ATH9K_HW_CAP_HT)
......
...@@ -304,6 +304,7 @@ ...@@ -304,6 +304,7 @@
#define AR_IMR_S2 0x00ac #define AR_IMR_S2 0x00ac
#define AR_IMR_S2_QCU_TXURN 0x000003FF #define AR_IMR_S2_QCU_TXURN 0x000003FF
#define AR_IMR_S2_QCU_TXURN_S 0 #define AR_IMR_S2_QCU_TXURN_S 0
#define AR_IMR_S2_BB_WATCHDOG 0x00010000
#define AR_IMR_S2_CST 0x00400000 #define AR_IMR_S2_CST 0x00400000
#define AR_IMR_S2_GTT 0x00800000 #define AR_IMR_S2_GTT 0x00800000
#define AR_IMR_S2_TIM 0x01000000 #define AR_IMR_S2_TIM 0x01000000
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment