svn commit: r243426 - head/sys/dev/ath
Adrian Chadd
adrian at FreeBSD.org
Fri Nov 23 05:38:39 UTC 2012
Author: adrian
Date: Fri Nov 23 05:38:38 2012
New Revision: 243426
URL: http://svnweb.freebsd.org/changeset/base/243426
Log:
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.
Modified:
head/sys/dev/ath/if_ath_tdma.c
Modified: head/sys/dev/ath/if_ath_tdma.c
==============================================================================
--- head/sys/dev/ath/if_ath_tdma.c Fri Nov 23 05:33:01 2012 (r243425)
+++ head/sys/dev/ath/if_ath_tdma.c Fri Nov 23 05:38:38 2012 (r243426)
@@ -336,7 +336,21 @@ ath_tdma_update(struct ieee80211_node *n
* 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,
More information about the svn-src-head
mailing list