summaryrefslogtreecommitdiffstats
path: root/sys/dev/ath/if_ath_beacon.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/ath/if_ath_beacon.c')
-rw-r--r--sys/dev/ath/if_ath_beacon.c93
1 files changed, 12 insertions, 81 deletions
diff --git a/sys/dev/ath/if_ath_beacon.c b/sys/dev/ath/if_ath_beacon.c
index a672c71..11b0426 100644
--- a/sys/dev/ath/if_ath_beacon.c
+++ b/sys/dev/ath/if_ath_beacon.c
@@ -73,7 +73,6 @@ __FBSDID("$FreeBSD$");
#include <machine/bus.h>
#include <net/if.h>
-#include <net/if_var.h>
#include <net/if_dl.h>
#include <net/if_media.h>
#include <net/if_types.h>
@@ -382,7 +381,7 @@ ath_beacon_update(struct ieee80211vap *vap, int item)
/*
* Handle a beacon miss.
*/
-void
+static void
ath_beacon_miss(struct ath_softc *sc)
{
HAL_SURVEY_SAMPLE hs;
@@ -749,11 +748,6 @@ ath_beacon_generate(struct ath_softc *sc, struct ieee80211vap *vap)
*
* More thought is required here.
*/
- /*
- * XXX can we even stop TX DMA here? Check what the
- * reference driver does for cabq for beacons, given
- * that stopping TX requires RX is paused.
- */
ath_tx_draintxq(sc, cabq);
}
}
@@ -921,7 +915,7 @@ ath_beacon_config(struct ath_softc *sc, struct ieee80211vap *vap)
struct ieee80211_node *ni;
u_int32_t nexttbtt, intval, tsftu;
u_int32_t nexttbtt_u8, intval_u8;
- u_int64_t tsf, tsf_beacon;
+ u_int64_t tsf;
if (vap == NULL)
vap = TAILQ_FIRST(&ic->ic_vaps); /* XXX */
@@ -937,17 +931,9 @@ ath_beacon_config(struct ath_softc *sc, struct ieee80211vap *vap)
ni = ieee80211_ref_node(vap->iv_bss);
- ATH_LOCK(sc);
- ath_power_set_power_state(sc, HAL_PM_AWAKE);
- ATH_UNLOCK(sc);
-
/* extract tstamp from last beacon and convert to TU */
nexttbtt = TSF_TO_TU(LE_READ_4(ni->ni_tstamp.data + 4),
LE_READ_4(ni->ni_tstamp.data));
-
- tsf_beacon = ((uint64_t) LE_READ_4(ni->ni_tstamp.data + 4)) << 32;
- tsf_beacon |= LE_READ_4(ni->ni_tstamp.data);
-
if (ic->ic_opmode == IEEE80211_M_HOSTAP ||
ic->ic_opmode == IEEE80211_M_MBSS) {
/*
@@ -993,63 +979,14 @@ ath_beacon_config(struct ath_softc *sc, struct ieee80211vap *vap)
*/
tsf = ath_hal_gettsf64(ah);
tsftu = TSF_TO_TU(tsf>>32, tsf) + FUDGE;
-
- DPRINTF(sc, ATH_DEBUG_BEACON,
- "%s: beacon tsf=%llu, hw tsf=%llu, nexttbtt=%u, tsftu=%u\n",
- __func__,
- (unsigned long long) tsf_beacon,
- (unsigned long long) tsf,
- nexttbtt,
- tsftu);
- DPRINTF(sc, ATH_DEBUG_BEACON,
- "%s: beacon tsf=%llu, hw tsf=%llu, tsf delta=%lld\n",
- __func__,
- (unsigned long long) tsf_beacon,
- (unsigned long long) tsf,
- (long long) tsf -
- (long long) tsf_beacon);
-
- DPRINTF(sc, ATH_DEBUG_BEACON,
- "%s: nexttbtt=%llu, beacon tsf delta=%lld\n",
- __func__,
- (unsigned long long) nexttbtt,
- (long long) ((long long) nexttbtt * 1024LL) - (long long) tsf_beacon);
-
- /* XXX cfpcount? */
-
- if (nexttbtt > tsftu) {
- uint32_t countdiff, oldtbtt, remainder;
-
- oldtbtt = nexttbtt;
- remainder = (nexttbtt - tsftu) % intval;
- nexttbtt = tsftu + remainder;
-
- countdiff = (oldtbtt - nexttbtt) / intval % dtimperiod;
- if (dtimcount > countdiff) {
- dtimcount -= countdiff;
- } else {
- dtimcount += dtimperiod - countdiff;
- }
- } else { //nexttbtt <= tsftu
- uint32_t countdiff, oldtbtt, remainder;
-
- oldtbtt = nexttbtt;
- remainder = (tsftu - nexttbtt) % intval;
- nexttbtt = tsftu - remainder + intval;
- countdiff = (nexttbtt - oldtbtt) / intval % dtimperiod;
- if (dtimcount > countdiff) {
- dtimcount -= countdiff;
- } else {
- dtimcount += dtimperiod - countdiff;
+ do {
+ nexttbtt += intval;
+ if (--dtimcount < 0) {
+ dtimcount = dtimperiod - 1;
+ if (--cfpcount < 0)
+ cfpcount = cfpperiod - 1;
}
- }
-
- DPRINTF(sc, ATH_DEBUG_BEACON,
- "%s: adj nexttbtt=%llu, rx tsf delta=%lld\n",
- __func__,
- (unsigned long long) nexttbtt,
- (long long) ((long long)nexttbtt * 1024LL) - (long long)tsf);
-
+ } while (nexttbtt < tsftu);
memset(&bs, 0, sizeof(bs));
bs.bs_intval = intval;
bs.bs_nexttbtt = nexttbtt;
@@ -1096,12 +1033,9 @@ ath_beacon_config(struct ath_softc *sc, struct ieee80211vap *vap)
bs.bs_sleepduration = roundup(bs.bs_sleepduration, bs.bs_dtimperiod);
DPRINTF(sc, ATH_DEBUG_BEACON,
- "%s: tsf %ju tsf:tu %u intval %u nexttbtt %u dtim %u "
- "nextdtim %u bmiss %u sleep %u cfp:period %u "
- "maxdur %u next %u timoffset %u\n"
+ "%s: tsf %ju tsf:tu %u intval %u nexttbtt %u dtim %u nextdtim %u bmiss %u sleep %u cfp:period %u maxdur %u next %u timoffset %u\n"
, __func__
- , tsf
- , tsftu
+ , tsf, tsftu
, bs.bs_intval
, bs.bs_nexttbtt
, bs.bs_dtimperiod
@@ -1178,11 +1112,8 @@ ath_beacon_config(struct ath_softc *sc, struct ieee80211vap *vap)
if (ic->ic_opmode == IEEE80211_M_IBSS && sc->sc_hasveol)
ath_beacon_start_adhoc(sc, vap);
}
+ sc->sc_syncbeacon = 0;
ieee80211_free_node(ni);
-
- ATH_LOCK(sc);
- ath_power_restore_power_state(sc);
- ATH_UNLOCK(sc);
#undef FUDGE
#undef TSF_TO_TU
}
OpenPOWER on IntegriCloud