Fix up the nexttbtt -> TSF delta calculation to not wrap ridiculously

on the 802.11n NICs.

The 802.11n NICs return a TBTT value that continues far past the 16 bit
HAL_BEACON_PERIOD time (in TU.)  The code would constrain nextslot to
HAL_BEACON_PERIOD, but it wasn't constraining nexttbtt - the pre-11n
NICs would only return TU values from 0 -> HAL_BEACON_PERIOD.  Thus,
when nexttbtt exceeded 64 milliseconds, it would not wrap (but nextslot
did) which lead to a huge tsfdelta.

So until the slot calculation is converted to work in TSF rather than
a mix of TSF and TU, "make" the nexttbtt values match the TU assumptions
for pre-11n NICs.

This fixes the crazy deltatsf calculations but it doesn't fix the
non-convergent tsfdelta issue.  That'll be fixed in a subsequent commit.
This commit is contained in:
adrian 2012-11-23 05:38:38 +00:00
parent 8b099e2d4f
commit 428f085c83

View File

@ -336,7 +336,21 @@ ath_tdma_update(struct ieee80211_node *ni,
* adjustments are done by pulling the TSF forward and possibly
* rewriting the beacon timers.
*/
nexttbtt = ath_hal_getnexttbtt(ah);
/*
* The logic here assumes the nexttbtt counter is in TSF
* but the prr-11n NICs are in TU. The HAL shifts them
* to TSF but there's two important differences:
*
* + The TU->TSF values have 0's for the low 9 bits, and
* + The counter wraps at TU_TO_TSF(HAL_BEACON_PERIOD + 1) for
* the pre-11n NICs, but not for the 11n NICs.
*
* So for now, just make sure the nexttbtt value we get
* matches the second issue or once nexttbtt exceeds this
* value, tsfdelta ends up becoming very negative and all
* of the adjustments get very messed up.
*/
nexttbtt = ath_hal_getnexttbtt(ah) % (TU_TO_TSF(HAL_BEACON_PERIOD + 1));
tsfdelta = (int32_t)((nextslot % TU_TO_TSF(HAL_BEACON_PERIOD + 1)) - nexttbtt);
DPRINTF(sc, ATH_DEBUG_TDMA_TIMER,