aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorBruno Randolf <br1@einfach.org>2010-04-12 03:38:52 -0400
committerJohn W. Linville <linville@tuxdriver.com>2010-04-14 14:52:42 -0400
commit87d77c4ef132599eb3a6c49520719d39f7341efd (patch)
tree9b353e63a5fa50b6fc58b5cbf20a395166da4f5d /drivers/net
parent0edc9a6709d8e7d4f26c7f2a4b5ebdb641f8dfa0 (diff)
ath5k: treat RXORN as non-fatal
We get RXORN interrupts when all receive buffers are full. This is not necessarily a fatal situation. It can also happen when the bus is busy or the CPU is not fast enough to process all frames. Older chipsets apparently need a reset to come out of this situration, but on newer chips we can treat RXORN like RX, as going thru a full reset does more harm than good, there. The exact chip revisions which need a reset are unknown - this guess AR5K_SREV_AR5212 ("venice") is copied from the HAL. Inspired by openwrt 413-rxorn.patch: "treat rxorn like rx, reset after rxorn seems to do more harm than good" Signed-off-by: Bruno Randolf <br1@einfach.org> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/wireless/ath/ath5k/base.c15
-rw-r--r--drivers/net/wireless/ath/ath5k/base.h1
2 files changed, 15 insertions, 1 deletions
diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c
index 3f59bc2d7912..92327423325f 100644
--- a/drivers/net/wireless/ath/ath5k/base.c
+++ b/drivers/net/wireless/ath/ath5k/base.c
@@ -2705,7 +2705,20 @@ ath5k_intr(int irq, void *dev_id)
2705 */ 2705 */
2706 tasklet_schedule(&sc->restq); 2706 tasklet_schedule(&sc->restq);
2707 } else if (unlikely(status & AR5K_INT_RXORN)) { 2707 } else if (unlikely(status & AR5K_INT_RXORN)) {
2708 tasklet_schedule(&sc->restq); 2708 /*
2709 * Receive buffers are full. Either the bus is busy or
2710 * the CPU is not fast enough to process all received
2711 * frames.
2712 * Older chipsets need a reset to come out of this
2713 * condition, but we treat it as RX for newer chips.
2714 * We don't know exactly which versions need a reset -
2715 * this guess is copied from the HAL.
2716 */
2717 sc->stats.rxorn_intr++;
2718 if (ah->ah_mac_srev < AR5K_SREV_AR5212)
2719 tasklet_schedule(&sc->restq);
2720 else
2721 tasklet_schedule(&sc->rxtq);
2709 } else { 2722 } else {
2710 if (status & AR5K_INT_SWBA) { 2723 if (status & AR5K_INT_SWBA) {
2711 tasklet_hi_schedule(&sc->beacontq); 2724 tasklet_hi_schedule(&sc->beacontq);
diff --git a/drivers/net/wireless/ath/ath5k/base.h b/drivers/net/wireless/ath/ath5k/base.h
index 53a5651c57a2..56221bc7c8cd 100644
--- a/drivers/net/wireless/ath/ath5k/base.h
+++ b/drivers/net/wireless/ath/ath5k/base.h
@@ -135,6 +135,7 @@ struct ath5k_statistics {
135 unsigned int beacons; 135 unsigned int beacons;
136 136
137 unsigned int mib_intr; 137 unsigned int mib_intr;
138 unsigned int rxorn_intr;
138}; 139};
139 140
140#if CHAN_DEBUG 141#if CHAN_DEBUG