aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2010-02-19 12:21:42 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2010-03-15 12:06:38 -0400
commit3203358238f16e5ff8caa1ee10d5f23ec53547f3 (patch)
tree121607cc4394e40a49008e1708b86defd6b8109c /drivers
parent82d8cfa27fbce6dd1d3fd39cb808410337e143eb (diff)
ath9k: fix beacon timer restart after a card reset
commit d8728ee919282c7b01b65cd479ec1e2a9c5d3ba8 upstream. 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> Signed-off-by: John W. Linville <linville@tuxdriver.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/wireless/ath/ath9k/beacon.c9
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 1660ef17aaf5..06eaaa9ece6b 100644
--- a/drivers/net/wireless/ath/ath9k/beacon.c
+++ b/drivers/net/wireless/ath/ath9k/beacon.c
@@ -525,16 +525,13 @@ static void ath_beacon_config_ap(struct ath_softc *sc,
525{ 525{
526 u32 nexttbtt, intval; 526 u32 nexttbtt, intval;
527 527
528 /* Configure the timers only when the TSF has to be reset */
529
530 if (!(sc->sc_flags & SC_OP_TSF_RESET))
531 return;
532
533 /* NB: the beacon interval is kept internally in TU's */ 528 /* NB: the beacon interval is kept internally in TU's */
534 intval = conf->beacon_interval & ATH9K_BEACON_PERIOD; 529 intval = conf->beacon_interval & ATH9K_BEACON_PERIOD;
535 intval /= ATH_BCBUF; /* for staggered beacons */ 530 intval /= ATH_BCBUF; /* for staggered beacons */
536 nexttbtt = intval; 531 nexttbtt = intval;
537 intval |= ATH9K_BEACON_RESET_TSF; 532
533 if (sc->sc_flags & SC_OP_TSF_RESET)
534 intval |= ATH9K_BEACON_RESET_TSF;
538 535
539 /* 536 /*
540 * In AP mode we enable the beacon timers and SWBA interrupts to 537 * In AP mode we enable the beacon timers and SWBA interrupts to