diff options
author | Rajkumar Manoharan <rmanohar@qca.qualcomm.com> | 2012-03-14 20:04:27 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2012-04-09 16:05:53 -0400 |
commit | 01e189182d62d6ee3603233fc88f9235e9830b92 (patch) | |
tree | 6dee11b6c24d86b99747dc625bdeaed6a7da8f5e /drivers/net/wireless/ath/ath9k/recv.c | |
parent | 54da20d83f0e7fe87b75aec44bc2b1448d119320 (diff) |
ath9k: recover ar9380 chips from rare stuck state
In the experiment with Azimuth ADEPT-n testbed where the APs transmit
power was reduced to 25% and the signal strength was futher attenuated
by 20dB and induced a path loss of ~7dB, the station was reporting
beacon losses and the following issue were observed.
* rx clear is stuck at low for more than 300ms
* dcu chain and complete state is stuck at one of the hang signature
This patch triggers the hang detection logic that recovers the chip
from any of the above conditions. As the issue was originally reported
in ChromeOs with AR9382 chips, this detection logic is enabled only for
AR9380/2 chips.
Cc: Paul Stewart <pstew@google.com>
Reported-by: Gary Morain <gmorain@google.com>
Signed-off-by: Rajkumar Manoharan <rmanohar@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/recv.c')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/recv.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c index 1c4583c7ff7c..858801735282 100644 --- a/drivers/net/wireless/ath/ath9k/recv.c +++ b/drivers/net/wireless/ath/ath9k/recv.c | |||
@@ -1855,6 +1855,10 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp) | |||
1855 | if (retval) | 1855 | if (retval) |
1856 | goto requeue_drop_frag; | 1856 | goto requeue_drop_frag; |
1857 | 1857 | ||
1858 | if (rs.is_mybeacon) { | ||
1859 | sc->hw_busy_count = 0; | ||
1860 | ath_start_rx_poll(sc, 3); | ||
1861 | } | ||
1858 | /* Ensure we always have an skb to requeue once we are done | 1862 | /* Ensure we always have an skb to requeue once we are done |
1859 | * processing the current buffer's skb */ | 1863 | * processing the current buffer's skb */ |
1860 | requeue_skb = ath_rxbuf_alloc(common, common->rx_bufsize, GFP_ATOMIC); | 1864 | requeue_skb = ath_rxbuf_alloc(common, common->rx_bufsize, GFP_ATOMIC); |