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,
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to