aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/ath/ath9k/beacon.c28
1 files changed, 21 insertions, 7 deletions
diff --git a/drivers/net/wireless/ath/ath9k/beacon.c b/drivers/net/wireless/ath/ath9k/beacon.c
index 57f91a9ff0eb..a21b21339fbc 100644
--- a/drivers/net/wireless/ath/ath9k/beacon.c
+++ b/drivers/net/wireless/ath/ath9k/beacon.c
@@ -559,6 +559,7 @@ static void ath_beacon_config_sta(struct ath_softc *sc,
559 int cfpperiod, cfpcount; 559 int cfpperiod, cfpcount;
560 u32 nexttbtt = 0, intval, tsftu; 560 u32 nexttbtt = 0, intval, tsftu;
561 u64 tsf; 561 u64 tsf;
562 int num_beacons, offset, dtim_dec_count, cfp_dec_count;
562 563
563 memset(&bs, 0, sizeof(bs)); 564 memset(&bs, 0, sizeof(bs));
564 intval = conf->beacon_interval & ATH9K_BEACON_PERIOD; 565 intval = conf->beacon_interval & ATH9K_BEACON_PERIOD;
@@ -586,14 +587,27 @@ static void ath_beacon_config_sta(struct ath_softc *sc,
586 */ 587 */
587 tsf = ath9k_hw_gettsf64(sc->sc_ah); 588 tsf = ath9k_hw_gettsf64(sc->sc_ah);
588 tsftu = TSF_TO_TU(tsf>>32, tsf) + FUDGE; 589 tsftu = TSF_TO_TU(tsf>>32, tsf) + FUDGE;
589 do { 590
591 num_beacons = tsftu / intval + 1;
592 offset = tsftu % intval;
593 nexttbtt = tsftu - offset;
594 if (offset)
590 nexttbtt += intval; 595 nexttbtt += intval;
591 if (--dtimcount < 0) { 596
592 dtimcount = dtimperiod - 1; 597 /* DTIM Beacon every dtimperiod Beacon */
593 if (--cfpcount < 0) 598 dtim_dec_count = num_beacons % dtimperiod;
594 cfpcount = cfpperiod - 1; 599 /* CFP every cfpperiod DTIM Beacon */
595 } 600 cfp_dec_count = (num_beacons / dtimperiod) % cfpperiod;
596 } while (nexttbtt < tsftu); 601 if (dtim_dec_count)
602 cfp_dec_count++;
603
604 dtimcount -= dtim_dec_count;
605 if (dtimcount < 0)
606 dtimcount += dtimperiod;
607
608 cfpcount -= cfp_dec_count;
609 if (cfpcount < 0)
610 cfpcount += cfpperiod;
597 611
598 bs.bs_intval = intval; 612 bs.bs_intval = intval;
599 bs.bs_nexttbtt = nexttbtt; 613 bs.bs_nexttbtt = nexttbtt;