]>
Commit | Line | Data |
---|---|---|
c06f7f46 GKH |
1 | From fac6b6a065da42f826088c58bddad82e1b1ccb40 Mon Sep 17 00:00:00 2001 |
2 | From: Felix Fietkau <nbd@openwrt.org> | |
3 | Date: Sat, 23 Oct 2010 17:45:38 +0200 | |
4 | Subject: ath9k: resume aggregation immediately after a hardware reset | |
5 | ||
6 | From: Felix Fietkau <nbd@openwrt.org> | |
7 | ||
8 | commit fac6b6a065da42f826088c58bddad82e1b1ccb40 upstream. | |
9 | ||
10 | Since aggregation is usually triggered by tx completion, a hardware | |
11 | reset (because of beacon stuck, tx hang or baseband hang) can | |
12 | significantly delay the transmission of the next AMPDU (until the next | |
13 | tx completion event). | |
14 | Fix this by rescheduling aggregation after such a reset. | |
15 | ||
16 | Signed-off-by: Felix Fietkau <nbd@openwrt.org> | |
17 | Signed-off-by: John W. Linville <linville@tuxdriver.com> | |
18 | Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> | |
19 | ||
20 | --- | |
21 | drivers/net/wireless/ath/ath9k/beacon.c | 2 +- | |
22 | drivers/net/wireless/ath/ath9k/main.c | 4 ++-- | |
23 | drivers/net/wireless/ath/ath9k/xmit.c | 2 +- | |
24 | 3 files changed, 4 insertions(+), 4 deletions(-) | |
25 | ||
26 | --- a/drivers/net/wireless/ath/ath9k/beacon.c | |
27 | +++ b/drivers/net/wireless/ath/ath9k/beacon.c | |
28 | @@ -366,7 +366,7 @@ void ath_beacon_tasklet(unsigned long da | |
29 | ath_print(common, ATH_DBG_BEACON, | |
30 | "beacon is officially stuck\n"); | |
31 | sc->sc_flags |= SC_OP_TSF_RESET; | |
32 | - ath_reset(sc, false); | |
33 | + ath_reset(sc, true); | |
34 | } | |
35 | ||
36 | return; | |
37 | --- a/drivers/net/wireless/ath/ath9k/main.c | |
38 | +++ b/drivers/net/wireless/ath/ath9k/main.c | |
39 | @@ -554,7 +554,7 @@ void ath_hw_check(struct work_struct *wo | |
40 | ||
41 | msleep(1); | |
42 | } | |
43 | - ath_reset(sc, false); | |
44 | + ath_reset(sc, true); | |
45 | ||
46 | out: | |
47 | ath9k_ps_restore(sc); | |
48 | @@ -572,7 +572,7 @@ void ath9k_tasklet(unsigned long data) | |
49 | ath9k_ps_wakeup(sc); | |
50 | ||
51 | if (status & ATH9K_INT_FATAL) { | |
52 | - ath_reset(sc, false); | |
53 | + ath_reset(sc, true); | |
54 | ath9k_ps_restore(sc); | |
55 | return; | |
56 | } | |
57 | --- a/drivers/net/wireless/ath/ath9k/xmit.c | |
58 | +++ b/drivers/net/wireless/ath/ath9k/xmit.c | |
59 | @@ -2206,7 +2206,7 @@ static void ath_tx_complete_poll_work(st | |
60 | ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_RESET, | |
61 | "tx hung, resetting the chip\n"); | |
62 | ath9k_ps_wakeup(sc); | |
63 | - ath_reset(sc, false); | |
64 | + ath_reset(sc, true); | |
65 | ath9k_ps_restore(sc); | |
66 | } | |
67 |