Commit d8728ee9 authored by Felix Fietkau's avatar Felix Fietkau Committed by John W. Linville

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: default avatarFelix Fietkau <nbd@openwrt.org>
Cc: stable@kernel.org
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 528c3126
...@@ -526,15 +526,12 @@ static void ath_beacon_config_ap(struct ath_softc *sc, ...@@ -526,15 +526,12 @@ static void ath_beacon_config_ap(struct ath_softc *sc,
{ {
u32 nexttbtt, intval; u32 nexttbtt, intval;
/* Configure the timers only when the TSF has to be reset */
if (!(sc->sc_flags & SC_OP_TSF_RESET))
return;
/* NB: the beacon interval is kept internally in TU's */ /* NB: the beacon interval is kept internally in TU's */
intval = conf->beacon_interval & ATH9K_BEACON_PERIOD; intval = conf->beacon_interval & ATH9K_BEACON_PERIOD;
intval /= ATH_BCBUF; /* for staggered beacons */ intval /= ATH_BCBUF; /* for staggered beacons */
nexttbtt = intval; nexttbtt = intval;
if (sc->sc_flags & SC_OP_TSF_RESET)
intval |= ATH9K_BEACON_RESET_TSF; intval |= ATH9K_BEACON_RESET_TSF;
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment