diff options
author | Felix Fietkau <nbd@openwrt.org> | 2010-02-19 12:21:42 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-02-19 15:52:50 -0500 |
commit | d8728ee919282c7b01b65cd479ec1e2a9c5d3ba8 (patch) | |
tree | 3ba3db193e2987927ba8d413066333395b387261 /drivers | |
parent | 528c3126a98e75f47fc9fa11b243c82a59271d0d (diff) |
ath9k: fix beacon timer restart after a card reset
In AP mode, ath_beacon_config_ap only restarts the timer if a TSF
restart is requested. Apparently this was added, because this function
unconditionally sets the flag for TSF reset.
The problem with this is, that ath9k_hw_reset() clobbers the timer
registers (specified in the initvals), thus effectively disabling the
SWBA interrupt whenever a card reset without TSF reset is issued
(happens in a few places in the code).
This patch fixes ath_beacon_config_ap to only issue the TSF reset flag
when necessary, but reinitialize the timer unconditionally. Tests show,
that this is enough to keep the SWBA interrupt going after a call to
ath_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.c | 9 |
1 files changed, 3 insertions, 6 deletions
diff --git a/drivers/net/wireless/ath/ath9k/beacon.c b/drivers/net/wireless/ath/ath9k/beacon.c index 42171d043c31..b4a31a43a62c 100644 --- a/drivers/net/wireless/ath/ath9k/beacon.c +++ b/drivers/net/wireless/ath/ath9k/beacon.c | |||
@@ -526,16 +526,13 @@ static void ath_beacon_config_ap(struct ath_softc *sc, | |||
526 | { | 526 | { |
527 | u32 nexttbtt, intval; | 527 | u32 nexttbtt, intval; |
528 | 528 | ||
529 | /* Configure the timers only when the TSF has to be reset */ | ||
530 | |||
531 | if (!(sc->sc_flags & SC_OP_TSF_RESET)) | ||
532 | return; | ||
533 | |||
534 | /* NB: the beacon interval is kept internally in TU's */ | 529 | /* NB: the beacon interval is kept internally in TU's */ |
535 | intval = conf->beacon_interval & ATH9K_BEACON_PERIOD; | 530 | intval = conf->beacon_interval & ATH9K_BEACON_PERIOD; |
536 | intval /= ATH_BCBUF; /* for staggered beacons */ | 531 | intval /= ATH_BCBUF; /* for staggered beacons */ |
537 | nexttbtt = intval; | 532 | nexttbtt = intval; |
538 | intval |= ATH9K_BEACON_RESET_TSF; | 533 | |
534 | if (sc->sc_flags & SC_OP_TSF_RESET) | ||
535 | intval |= ATH9K_BEACON_RESET_TSF; | ||
539 | 536 | ||
540 | /* | 537 | /* |
541 | * In AP mode we enable the beacon timers and SWBA interrupts to | 538 | * In AP mode we enable the beacon timers and SWBA interrupts to |