svn commit: r225607 - in user/adrian/if_ath_tx/sys/dev/ath/ath_hal: ar5212 ar5416

Adrian Chadd adrian at FreeBSD.org
Fri Sep 16 06:33:12 UTC 2011


Author: adrian
Date: Fri Sep 16 06:33:12 2011
New Revision: 225607
URL: http://svn.freebsd.org/changeset/base/225607

Log:
  Tidy up the CAB queue defaults; do the same for AR5212.
  
  * add a check to the AR5416 CABQ setup to ensure a minimum
    cabq time; that way a negative calculated cabq time doesn't
    annoy things;
  
  * Port the AR5416 CABQ setup stuff to AR5212.
  
  TODO: still do this in the driver..

Modified:
  user/adrian/if_ath_tx/sys/dev/ath/ath_hal/ar5212/ar5212_xmit.c
  user/adrian/if_ath_tx/sys/dev/ath/ath_hal/ar5416/ar5416_xmit.c

Modified: user/adrian/if_ath_tx/sys/dev/ath/ath_hal/ar5212/ar5212_xmit.c
==============================================================================
--- user/adrian/if_ath_tx/sys/dev/ath/ath_hal/ar5212/ar5212_xmit.c	Fri Sep 16 05:57:01 2011	(r225606)
+++ user/adrian/if_ath_tx/sys/dev/ath/ath_hal/ar5212/ar5212_xmit.c	Fri Sep 16 06:33:12 2011	(r225607)
@@ -263,6 +263,7 @@ ar5212ReleaseTxQueue(struct ath_hal *ah,
  * Assumes:
  *  phwChannel has been set to point to the current channel
  */
+#define	TU_TO_USEC(_tu)		((_tu) << 10)
 HAL_BOOL
 ar5212ResetTxQueue(struct ath_hal *ah, u_int q)
 {
@@ -270,7 +271,7 @@ ar5212ResetTxQueue(struct ath_hal *ah, u
 	HAL_CAPABILITIES *pCap = &AH_PRIVATE(ah)->ah_caps;
 	const struct ieee80211_channel *chan = AH_PRIVATE(ah)->ah_curchan;
 	HAL_TX_QUEUE_INFO *qi;
-	uint32_t cwMin, chanCwMin, value, qmisc, dmisc;
+	uint32_t cwMin, chanCwMin, qmisc, dmisc;
 
 	if (q >= pCap->halTotalQueues) {
 		HALDEBUG(ah, HAL_DEBUG_ANY, "%s: invalid queue num %u\n",
@@ -409,17 +410,40 @@ ar5212ResetTxQueue(struct ath_hal *ah, u
 		      |  AR_Q_MISC_CBR_INCR_DIS1
 		      |  AR_Q_MISC_CBR_INCR_DIS0;
 
-		if (!qi->tqi_readyTime) {
+		if (qi->tqi_readyTime) {
+			HALDEBUG(ah, HAL_DEBUG_TXQUEUE,
+			    "%s: using tqi_readyTime\n", __func__);
+			OS_REG_WRITE(ah, AR_QRDYTIMECFG(q),
+			    SM(qi->tqi_readyTime, AR_Q_RDYTIMECFG_INT) |
+			    AR_Q_RDYTIMECFG_ENA);
+		} else {
+			int value;
 			/*
 			 * NB: don't set default ready time if driver
 			 * has explicitly specified something.  This is
 			 * here solely for backwards compatibility.
 			 */
-			value = (ahp->ah_beaconInterval
+			/*
+			 * XXX for now, hard-code a CAB interval of 70%
+			 * XXX of the total beacon interval.
+			 */
+
+			value = (ahp->ah_beaconInterval * 70 / 100)
 				- (ah->ah_config.ah_sw_beacon_response_time -
-					ah->ah_config.ah_dma_beacon_response_time)
-				- ah->ah_config.ah_additional_swba_backoff) * 1024;
-			OS_REG_WRITE(ah, AR_QRDYTIMECFG(q), value | AR_Q_RDYTIMECFG_ENA);
+				+ ah->ah_config.ah_dma_beacon_response_time)
+				- ah->ah_config.ah_additional_swba_backoff;
+			/*
+			 * XXX Ensure it isn't too low - nothing lower
+			 * XXX than 10 TU
+			 */
+			if (value < 10)
+				value = 10;
+			HALDEBUG(ah, HAL_DEBUG_TXQUEUE,
+			    "%s: defaulting to rdytime = %d uS\n",
+			    __func__, value);
+			OS_REG_WRITE(ah, AR_QRDYTIMECFG(q),
+			    SM(TU_TO_USEC(value), AR_Q_RDYTIMECFG_INT) |
+			    AR_Q_RDYTIMECFG_ENA);
 		}
 		dmisc |= SM(AR_D_MISC_ARB_LOCKOUT_CNTRL_GLOBAL,
 			    AR_D_MISC_ARB_LOCKOUT_CNTRL);
@@ -481,6 +505,7 @@ ar5212ResetTxQueue(struct ath_hal *ah, u
 
 	return AH_TRUE;
 }
+#undef	TU_TO_USEC
 
 /*
  * Get the TXDP for the specified queue

Modified: user/adrian/if_ath_tx/sys/dev/ath/ath_hal/ar5416/ar5416_xmit.c
==============================================================================
--- user/adrian/if_ath_tx/sys/dev/ath/ath_hal/ar5416/ar5416_xmit.c	Fri Sep 16 05:57:01 2011	(r225606)
+++ user/adrian/if_ath_tx/sys/dev/ath/ath_hal/ar5416/ar5416_xmit.c	Fri Sep 16 06:33:12 2011	(r225607)
@@ -949,7 +949,7 @@ ar5416ResetTxQueue(struct ath_hal *ah, u
 	HAL_CAPABILITIES *pCap = &AH_PRIVATE(ah)->ah_caps;
 	const struct ieee80211_channel *chan = AH_PRIVATE(ah)->ah_curchan;
 	HAL_TX_QUEUE_INFO *qi;
-	uint32_t cwMin, chanCwMin, value, qmisc, dmisc;
+	uint32_t cwMin, chanCwMin, qmisc, dmisc;
 
 	if (q >= pCap->halTotalQueues) {
 		HALDEBUG(ah, HAL_DEBUG_ANY, "%s: invalid queue num %u\n",
@@ -1100,6 +1100,7 @@ ar5416ResetTxQueue(struct ath_hal *ah, u
 			    SM(qi->tqi_readyTime, AR_Q_RDYTIMECFG_INT) |
 			    AR_Q_RDYTIMECFG_ENA);
 		} else {
+			int value;
 			/*
 			 * NB: don't set default ready time if driver
 			 * has explicitly specified something.  This is
@@ -1108,20 +1109,27 @@ ar5416ResetTxQueue(struct ath_hal *ah, u
 			/*
 			 * XXX for now, hard-code a CAB interval of 70%
 			 * XXX of the total beacon interval.
+			 *
 			 * XXX This keeps Merlin and later based MACs
 			 * XXX quite a bit happier (stops stuck beacons,
 			 * XXX which I gather is because of such a long
 			 * XXX cabq time.)
 			 */
-			value = TU_TO_USEC((ahp->ah_beaconInterval * 70 / 100)
+			value = (ahp->ah_beaconInterval * 70 / 100)
 				- (ah->ah_config.ah_sw_beacon_response_time
 				+ ah->ah_config.ah_dma_beacon_response_time)
-				- ah->ah_config.ah_additional_swba_backoff);
+				- ah->ah_config.ah_additional_swba_backoff;
+			/*
+			 * XXX Ensure it isn't too low - nothing lower
+			 * XXX than 10 TU
+			 */
+			if (value < 10)
+				value = 10;
 			HALDEBUG(ah, HAL_DEBUG_TXQUEUE,
-			    "%s: defaulting to rdytime = %d\n",
+			    "%s: defaulting to rdytime = %d uS\n",
 			    __func__, value);
 			OS_REG_WRITE(ah, AR_QRDYTIMECFG(q),
-			    SM(value, AR_Q_RDYTIMECFG_INT) |
+			    SM(TU_TO_USEC(value), AR_Q_RDYTIMECFG_INT) |
 			    AR_Q_RDYTIMECFG_ENA);
 		}
 		dmisc |= SM(AR_D_MISC_ARB_LOCKOUT_CNTRL_GLOBAL,


More information about the svn-src-user mailing list