summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoradrian <adrian@FreeBSD.org>2011-07-31 16:16:25 +0000
committeradrian <adrian@FreeBSD.org>2011-07-31 16:16:25 +0000
commit5c0a51687b6fe770aa2082408ca8b020b6b7be3c (patch)
tree935429f0b9d7f5f9cdb2c5a39719704e3d721e28
parent51a24f841717f59033bd77251478223c6cb9dfb0 (diff)
downloadFreeBSD-src-5c0a51687b6fe770aa2082408ca8b020b6b7be3c.zip
FreeBSD-src-5c0a51687b6fe770aa2082408ca8b020b6b7be3c.tar.gz
Disable the RXORN/RXEOL interrupts if RXEOL occurs, preventing an
interrupt storm. This is easily triggered by flipping on and off tcpdump -y IEEE802_11_RADIO w/ witness enabled. This causes a whole lot of console IO and when you're attached to a serial console (eg on my AR7161 embedded board), the RX interrupt doesn't get called quickly enough and the RX queue fills up. This wasn't a problem in the past because of the self-linked RX descriptor trick - the RX would never hit the "end" of the RX descriptor list. However this isn't possible for 802.11n (see previous commit history for why.) Both Linux ath9k and the Atheros reference driver code do this; I'm just looking now for where they then restart the PCU receive. Right now the RX will just stop until the interface is reset. Obtained from: Linux, Atheros Approved by: re (kib)
-rw-r--r--sys/dev/ath/if_ath.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/sys/dev/ath/if_ath.c b/sys/dev/ath/if_ath.c
index 4165710..7655c59 100644
--- a/sys/dev/ath/if_ath.c
+++ b/sys/dev/ath/if_ath.c
@@ -1395,6 +1395,12 @@ ath_intr(void *arg)
* least on older hardware revs.
*/
sc->sc_stats.ast_rxeol++;
+ /*
+ * Disable RXEOL/RXORN - prevent an interrupt
+ * storm until the PCU logic can be reset.
+ */
+ sc->sc_imask &= ~(HAL_INT_RXEOL | HAL_INT_RXORN);
+ ath_hal_intrset(ah, sc->sc_imask);
sc->sc_rxlink = NULL;
}
if (status & HAL_INT_TXURN) {
OpenPOWER on IntegriCloud