Commit 08578b8f authored by Luis R. Rodriguez's avatar Luis R. Rodriguez Committed by John W. Linville

ath9k: enable the baseband watchdog events for AR9003

This enables the baseband watchdog events for the AR9003
family on ath9k. Upon an a baseband watchdog interrupt we reset
the hardware, this should address corner case conditions where
normal operation can stall. Enable ATH_DBG_RESET to be able
to review details of the bb watchdog interrupt once it happens.
If you're curious how often this happens just grep the debugfs
interrupt file.

Cc: Sam Ng <sam.ng@atheros.com>
Cc: Paul Shaw <paul.shaw@atheros.com>
Cc: Don Breslin <don.breslin@atheros.com>
Cc: Cliff Holden <cliff.holden@atheros.com
Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent aea702b7
...@@ -269,6 +269,8 @@ void ath_debug_stat_interrupt(struct ath_softc *sc, enum ath9k_int status) ...@@ -269,6 +269,8 @@ void ath_debug_stat_interrupt(struct ath_softc *sc, enum ath9k_int status)
sc->debug.stats.istats.rxlp++; sc->debug.stats.istats.rxlp++;
if (status & ATH9K_INT_RXHP) if (status & ATH9K_INT_RXHP)
sc->debug.stats.istats.rxhp++; sc->debug.stats.istats.rxhp++;
if (status & ATH9K_INT_BB_WATCHDOG)
sc->debug.stats.istats.bb_watchdog++;
} else { } else {
if (status & ATH9K_INT_RX) if (status & ATH9K_INT_RX)
sc->debug.stats.istats.rxok++; sc->debug.stats.istats.rxok++;
...@@ -319,6 +321,9 @@ static ssize_t read_file_interrupt(struct file *file, char __user *user_buf, ...@@ -319,6 +321,9 @@ static ssize_t read_file_interrupt(struct file *file, char __user *user_buf,
"%8s: %10u\n", "RXLP", sc->debug.stats.istats.rxlp); "%8s: %10u\n", "RXLP", sc->debug.stats.istats.rxlp);
len += snprintf(buf + len, sizeof(buf) - len, len += snprintf(buf + len, sizeof(buf) - len,
"%8s: %10u\n", "RXHP", sc->debug.stats.istats.rxhp); "%8s: %10u\n", "RXHP", sc->debug.stats.istats.rxhp);
len += snprintf(buf + len, sizeof(buf) - len,
"%8s: %10u\n", "WATCHDOG",
sc->debug.stats.istats.bb_watchdog);
} else { } else {
len += snprintf(buf + len, sizeof(buf) - len, len += snprintf(buf + len, sizeof(buf) - len,
"%8s: %10u\n", "RX", sc->debug.stats.istats.rxok); "%8s: %10u\n", "RX", sc->debug.stats.istats.rxok);
......
...@@ -53,6 +53,7 @@ struct ath_buf; ...@@ -53,6 +53,7 @@ struct ath_buf;
* @cabend: RX End of CAB traffic * @cabend: RX End of CAB traffic
* @dtimsync: DTIM sync lossage * @dtimsync: DTIM sync lossage
* @dtim: RX Beacon with DTIM * @dtim: RX Beacon with DTIM
* @bb_watchdog: Baseband watchdog
*/ */
struct ath_interrupt_stats { struct ath_interrupt_stats {
u32 total; u32 total;
...@@ -76,6 +77,7 @@ struct ath_interrupt_stats { ...@@ -76,6 +77,7 @@ struct ath_interrupt_stats {
u32 cabend; u32 cabend;
u32 dtimsync; u32 dtimsync;
u32 dtim; u32 dtim;
u32 bb_watchdog;
}; };
struct ath_rc_stats { struct ath_rc_stats {
......
...@@ -520,6 +520,12 @@ irqreturn_t ath_isr(int irq, void *dev) ...@@ -520,6 +520,12 @@ 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) &&
(status & ATH9K_INT_BB_WATCHDOG)) {
ar9003_hw_bb_watchdog_dbg_info(ah);
goto chip_reset;
}
if (status & ATH9K_INT_SWBA) if (status & ATH9K_INT_SWBA)
tasklet_schedule(&sc->bcon_tasklet); tasklet_schedule(&sc->bcon_tasklet);
...@@ -1195,7 +1201,9 @@ static int ath9k_start(struct ieee80211_hw *hw) ...@@ -1195,7 +1201,9 @@ static int ath9k_start(struct ieee80211_hw *hw)
ATH9K_INT_GLOBAL; ATH9K_INT_GLOBAL;
if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)
ah->imask |= ATH9K_INT_RXHP | ATH9K_INT_RXLP; ah->imask |= ATH9K_INT_RXHP |
ATH9K_INT_RXLP |
ATH9K_INT_BB_WATCHDOG;
else else
ah->imask |= ATH9K_INT_RX; ah->imask |= ATH9K_INT_RX;
......
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