aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/ath9k
diff options
context:
space:
mode:
authorLuis R. Rodriguez <lrodriguez@atheros.com>2010-05-13 13:33:44 -0400
committerJohn W. Linville <linville@tuxdriver.com>2010-06-02 16:13:00 -0400
commit08578b8f16ca551499c54f2cd229df3e58c8f381 (patch)
treefb44cbd61cdad7494a63fa6b35a3936e4f792162 /drivers/net/wireless/ath/ath9k
parentaea702b70ae0964c16e17944e4a5ce2c2b038ced (diff)
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: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath/ath9k')
-rw-r--r--drivers/net/wireless/ath/ath9k/debug.c5
-rw-r--r--drivers/net/wireless/ath/ath9k/debug.h2
-rw-r--r--drivers/net/wireless/ath/ath9k/main.c10
3 files changed, 16 insertions, 1 deletions
diff --git a/drivers/net/wireless/ath/ath9k/debug.c b/drivers/net/wireless/ath/ath9k/debug.c
index 29898f8d1893..ee8387740ebe 100644
--- a/drivers/net/wireless/ath/ath9k/debug.c
+++ b/drivers/net/wireless/ath/ath9k/debug.c
@@ -269,6 +269,8 @@ void ath_debug_stat_interrupt(struct ath_softc *sc, enum ath9k_int status)
269 sc->debug.stats.istats.rxlp++; 269 sc->debug.stats.istats.rxlp++;
270 if (status & ATH9K_INT_RXHP) 270 if (status & ATH9K_INT_RXHP)
271 sc->debug.stats.istats.rxhp++; 271 sc->debug.stats.istats.rxhp++;
272 if (status & ATH9K_INT_BB_WATCHDOG)
273 sc->debug.stats.istats.bb_watchdog++;
272 } else { 274 } else {
273 if (status & ATH9K_INT_RX) 275 if (status & ATH9K_INT_RX)
274 sc->debug.stats.istats.rxok++; 276 sc->debug.stats.istats.rxok++;
@@ -319,6 +321,9 @@ static ssize_t read_file_interrupt(struct file *file, char __user *user_buf,
319 "%8s: %10u\n", "RXLP", sc->debug.stats.istats.rxlp); 321 "%8s: %10u\n", "RXLP", sc->debug.stats.istats.rxlp);
320 len += snprintf(buf + len, sizeof(buf) - len, 322 len += snprintf(buf + len, sizeof(buf) - len,
321 "%8s: %10u\n", "RXHP", sc->debug.stats.istats.rxhp); 323 "%8s: %10u\n", "RXHP", sc->debug.stats.istats.rxhp);
324 len += snprintf(buf + len, sizeof(buf) - len,
325 "%8s: %10u\n", "WATCHDOG",
326 sc->debug.stats.istats.bb_watchdog);
322 } else { 327 } else {
323 len += snprintf(buf + len, sizeof(buf) - len, 328 len += snprintf(buf + len, sizeof(buf) - len,
324 "%8s: %10u\n", "RX", sc->debug.stats.istats.rxok); 329 "%8s: %10u\n", "RX", sc->debug.stats.istats.rxok);
diff --git a/drivers/net/wireless/ath/ath9k/debug.h b/drivers/net/wireless/ath/ath9k/debug.h
index 5147b8709e10..5d21704e87ff 100644
--- a/drivers/net/wireless/ath/ath9k/debug.h
+++ b/drivers/net/wireless/ath/ath9k/debug.h
@@ -53,6 +53,7 @@ struct ath_buf;
53 * @cabend: RX End of CAB traffic 53 * @cabend: RX End of CAB traffic
54 * @dtimsync: DTIM sync lossage 54 * @dtimsync: DTIM sync lossage
55 * @dtim: RX Beacon with DTIM 55 * @dtim: RX Beacon with DTIM
56 * @bb_watchdog: Baseband watchdog
56 */ 57 */
57struct ath_interrupt_stats { 58struct ath_interrupt_stats {
58 u32 total; 59 u32 total;
@@ -76,6 +77,7 @@ struct ath_interrupt_stats {
76 u32 cabend; 77 u32 cabend;
77 u32 dtimsync; 78 u32 dtimsync;
78 u32 dtim; 79 u32 dtim;
80 u32 bb_watchdog;
79}; 81};
80 82
81struct ath_rc_stats { 83struct ath_rc_stats {
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index abfa0493236f..b98b2f2ed07d 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -520,6 +520,12 @@ irqreturn_t ath_isr(int irq, void *dev)
520 !(ah->caps.hw_caps & ATH9K_HW_CAP_EDMA))) 520 !(ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)))
521 goto chip_reset; 521 goto chip_reset;
522 522
523 if ((ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) &&
524 (status & ATH9K_INT_BB_WATCHDOG)) {
525 ar9003_hw_bb_watchdog_dbg_info(ah);
526 goto chip_reset;
527 }
528
523 if (status & ATH9K_INT_SWBA) 529 if (status & ATH9K_INT_SWBA)
524 tasklet_schedule(&sc->bcon_tasklet); 530 tasklet_schedule(&sc->bcon_tasklet);
525 531
@@ -1195,7 +1201,9 @@ static int ath9k_start(struct ieee80211_hw *hw)
1195 ATH9K_INT_GLOBAL; 1201 ATH9K_INT_GLOBAL;
1196 1202
1197 if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) 1203 if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)
1198 ah->imask |= ATH9K_INT_RXHP | ATH9K_INT_RXLP; 1204 ah->imask |= ATH9K_INT_RXHP |
1205 ATH9K_INT_RXLP |
1206 ATH9K_INT_BB_WATCHDOG;
1199 else 1207 else
1200 ah->imask |= ATH9K_INT_RX; 1208 ah->imask |= ATH9K_INT_RX;
1201 1209