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:
parent
8b099e2d4f
commit
428f085c83
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user