aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2010-10-23 11:45:38 -0400
committerJohn W. Linville <linville@tuxdriver.com>2010-10-25 14:45:56 -0400
commitfac6b6a065da42f826088c58bddad82e1b1ccb40 (patch)
tree75ba2bfb626d24615adb77ff9ffee931006c2238 /drivers
parentdafeac387d7f10d12d4fa9cc626af43c805540f7 (diff)
ath9k: resume aggregation immediately after a hardware reset
Since aggregation is usually triggered by tx completion, a hardware reset (because of beacon stuck, tx hang or baseband hang) can significantly delay the transmission of the next AMPDU (until the next tx completion event). Fix this by rescheduling aggregation after such a reset. Signed-off-by: Felix Fietkau <nbd@openwrt.org> Cc: stable@kernel.org Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/wireless/ath/ath9k/beacon.c2
-rw-r--r--drivers/net/wireless/ath/ath9k/main.c4
-rw-r--r--drivers/net/wireless/ath/ath9k/xmit.c2
3 files changed, 4 insertions, 4 deletions
diff --git a/drivers/net/wireless/ath/ath9k/beacon.c b/drivers/net/wireless/ath/ath9k/beacon.c
index 4ed010d4ef96..19891e7d49ae 100644
--- a/drivers/net/wireless/ath/ath9k/beacon.c
+++ b/drivers/net/wireless/ath/ath9k/beacon.c
@@ -370,7 +370,7 @@ void ath_beacon_tasklet(unsigned long data)
370 ath_print(common, ATH_DBG_BSTUCK, 370 ath_print(common, ATH_DBG_BSTUCK,
371 "beacon is officially stuck\n"); 371 "beacon is officially stuck\n");
372 sc->sc_flags |= SC_OP_TSF_RESET; 372 sc->sc_flags |= SC_OP_TSF_RESET;
373 ath_reset(sc, false); 373 ath_reset(sc, true);
374 } 374 }
375 375
376 return; 376 return;
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index 9679b3191975..c6ec800d7a6b 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -580,7 +580,7 @@ void ath_hw_check(struct work_struct *work)
580 580
581 msleep(1); 581 msleep(1);
582 } 582 }
583 ath_reset(sc, false); 583 ath_reset(sc, true);
584 584
585out: 585out:
586 ath9k_ps_restore(sc); 586 ath9k_ps_restore(sc);
@@ -598,7 +598,7 @@ void ath9k_tasklet(unsigned long data)
598 ath9k_ps_wakeup(sc); 598 ath9k_ps_wakeup(sc);
599 599
600 if (status & ATH9K_INT_FATAL) { 600 if (status & ATH9K_INT_FATAL) {
601 ath_reset(sc, false); 601 ath_reset(sc, true);
602 ath9k_ps_restore(sc); 602 ath9k_ps_restore(sc);
603 return; 603 return;
604 } 604 }
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
index 089b05ed6772..30ef2dfc1ed2 100644
--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
@@ -2163,7 +2163,7 @@ static void ath_tx_complete_poll_work(struct work_struct *work)
2163 ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_RESET, 2163 ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_RESET,
2164 "tx hung, resetting the chip\n"); 2164 "tx hung, resetting the chip\n");
2165 ath9k_ps_wakeup(sc); 2165 ath9k_ps_wakeup(sc);
2166 ath_reset(sc, false); 2166 ath_reset(sc, true);
2167 ath9k_ps_restore(sc); 2167 ath9k_ps_restore(sc);
2168 } 2168 }
2169 2169