Commit 267a9012 authored by Jouni Malinen's avatar Jouni Malinen Committed by John W. Linville

ath9k: Optimize TBTT/DTIM calculation for timers

The previous version used a simple loop to go through all Beacon
frames when determining the next TBTT and DTIM count. This is not too
bad for the case where the setup happens before timesync (i.e., very
small TSF), but this can become very heavy operation if a short Beacon
interval is used and the current TSF is large.

In preparation for a patch to update timer setup based on Beacon
timestamp, optimize this routine to take fixed time regardless of the
actual TSF value.
Signed-off-by: default avatarJouni Malinen <jouni.malinen@atheros.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent d26285f8
...@@ -559,6 +559,7 @@ static void ath_beacon_config_sta(struct ath_softc *sc, ...@@ -559,6 +559,7 @@ static void ath_beacon_config_sta(struct ath_softc *sc,
int cfpperiod, cfpcount; int cfpperiod, cfpcount;
u32 nexttbtt = 0, intval, tsftu; u32 nexttbtt = 0, intval, tsftu;
u64 tsf; u64 tsf;
int num_beacons, offset, dtim_dec_count, cfp_dec_count;
memset(&bs, 0, sizeof(bs)); memset(&bs, 0, sizeof(bs));
intval = conf->beacon_interval & ATH9K_BEACON_PERIOD; intval = conf->beacon_interval & ATH9K_BEACON_PERIOD;
...@@ -586,14 +587,27 @@ static void ath_beacon_config_sta(struct ath_softc *sc, ...@@ -586,14 +587,27 @@ static void ath_beacon_config_sta(struct ath_softc *sc,
*/ */
tsf = ath9k_hw_gettsf64(sc->sc_ah); tsf = ath9k_hw_gettsf64(sc->sc_ah);
tsftu = TSF_TO_TU(tsf>>32, tsf) + FUDGE; tsftu = TSF_TO_TU(tsf>>32, tsf) + FUDGE;
do {
num_beacons = tsftu / intval + 1;
offset = tsftu % intval;
nexttbtt = tsftu - offset;
if (offset)
nexttbtt += intval; nexttbtt += intval;
if (--dtimcount < 0) {
dtimcount = dtimperiod - 1; /* DTIM Beacon every dtimperiod Beacon */
if (--cfpcount < 0) dtim_dec_count = num_beacons % dtimperiod;
cfpcount = cfpperiod - 1; /* CFP every cfpperiod DTIM Beacon */
} cfp_dec_count = (num_beacons / dtimperiod) % cfpperiod;
} while (nexttbtt < tsftu); if (dtim_dec_count)
cfp_dec_count++;
dtimcount -= dtim_dec_count;
if (dtimcount < 0)
dtimcount += dtimperiod;
cfpcount -= cfp_dec_count;
if (cfpcount < 0)
cfpcount += cfpperiod;
bs.bs_intval = intval; bs.bs_intval = intval;
bs.bs_nexttbtt = nexttbtt; bs.bs_nexttbtt = nexttbtt;
......
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