diff options
author | adrian <adrian@FreeBSD.org> | 2011-02-08 12:49:01 +0000 |
---|---|---|
committer | adrian <adrian@FreeBSD.org> | 2011-02-08 12:49:01 +0000 |
commit | 44dfaf952a7967d189f26651e2b6a5b528202378 (patch) | |
tree | 1506073f2100e382aec6ebe867a5e03b6a4714d4 | |
parent | 461f2c12fe23d67162780f5c935cc956e24b1f30 (diff) | |
download | FreeBSD-src-44dfaf952a7967d189f26651e2b6a5b528202378.zip FreeBSD-src-44dfaf952a7967d189f26651e2b6a5b528202378.tar.gz |
There's apparently a bug with Merlin (AR9280) and later chipsets where
putting descriptors (not buffers) across a 4k page boundary can cause issues.
I've not seen it in production myself but it apparently can cause problems.
So, in preparation for addressing this workaround, (re)-expose the particular
HAL capability bit which marks whether the chipset has support for cross-4k-
boundary transactions or not.
A subsequent commit will modify the descriptor allocation to avoid allocating
descriptor entries that straddle a 4k page boundary.
-rw-r--r-- | sys/dev/ath/ath_hal/ah_internal.h | 3 | ||||
-rw-r--r-- | sys/dev/ath/ath_hal/ar5210/ar5210_attach.c | 2 | ||||
-rw-r--r-- | sys/dev/ath/ath_hal/ar5211/ar5211_attach.c | 2 | ||||
-rw-r--r-- | sys/dev/ath/ath_hal/ar5212/ar5212_attach.c | 2 | ||||
-rw-r--r-- | sys/dev/ath/ath_hal/ar9002/ar9280_attach.c | 2 | ||||
-rw-r--r-- | sys/dev/ath/ath_hal/ar9002/ar9285_attach.c | 2 |
6 files changed, 8 insertions, 5 deletions
diff --git a/sys/dev/ath/ath_hal/ah_internal.h b/sys/dev/ath/ath_hal/ah_internal.h index f3fd9e8..2caf5cc 100644 --- a/sys/dev/ath/ath_hal/ah_internal.h +++ b/sys/dev/ath/ath_hal/ah_internal.h @@ -195,7 +195,8 @@ typedef struct { halForcePpmSupport : 1, halEnhancedPmSupport : 1, halMbssidAggrSupport : 1, - halBssidMatchSupport : 1; + halBssidMatchSupport : 1, + hal4kbSplitTransSupport : 1; uint32_t halWirelessModes; uint16_t halTotalQueues; uint16_t halKeyCacheSize; diff --git a/sys/dev/ath/ath_hal/ar5210/ar5210_attach.c b/sys/dev/ath/ath_hal/ar5210/ar5210_attach.c index c76e188..e1a5067 100644 --- a/sys/dev/ath/ath_hal/ar5210/ar5210_attach.c +++ b/sys/dev/ath/ath_hal/ar5210/ar5210_attach.c @@ -377,6 +377,8 @@ ar5210FillCapabilityInfo(struct ath_hal *ah) | HAL_INT_FATAL ; + pCap->hal4kbSplitTransSupport = AH_TRUE; + ahpriv->ah_rxornIsFatal = AH_TRUE; return AH_TRUE; } diff --git a/sys/dev/ath/ath_hal/ar5211/ar5211_attach.c b/sys/dev/ath/ath_hal/ar5211/ar5211_attach.c index fe87fce..bace648 100644 --- a/sys/dev/ath/ath_hal/ar5211/ar5211_attach.c +++ b/sys/dev/ath/ath_hal/ar5211/ar5211_attach.c @@ -509,6 +509,8 @@ ar5211FillCapabilityInfo(struct ath_hal *ah) | HAL_INT_TIM ; + pCap->hal4kbSplitTransSupport = AH_TRUE; + /* XXX might be ok w/ some chip revs */ ahpriv->ah_rxornIsFatal = AH_TRUE; return AH_TRUE; diff --git a/sys/dev/ath/ath_hal/ar5212/ar5212_attach.c b/sys/dev/ath/ath_hal/ar5212/ar5212_attach.c index 9a2bc70..3aabdcc 100644 --- a/sys/dev/ath/ath_hal/ar5212/ar5212_attach.c +++ b/sys/dev/ath/ath_hal/ar5212/ar5212_attach.c @@ -860,6 +860,8 @@ ar5212FillCapabilityInfo(struct ath_hal *ah) if (AH_PRIVATE(ah)->ah_macVersion < AR_SREV_VERSION_GRIFFIN) pCap->halIntrMask &= ~HAL_INT_TBTT; + pCap->hal4kbSplitTransSupport = AH_TRUE; + return AH_TRUE; #undef IS_COBRA #undef IS_GRIFFIN_LITE diff --git a/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c b/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c index 698f9a9..80281d8 100644 --- a/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c +++ b/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c @@ -698,9 +698,7 @@ ar9280FillCapabilityInfo(struct ath_hal *ah) pCap->halBtCoexSupport = AH_TRUE; #endif pCap->halAutoSleepSupport = AH_FALSE; /* XXX? */ -#if 0 pCap->hal4kbSplitTransSupport = AH_FALSE; -#endif pCap->halRxStbcSupport = 1; pCap->halTxStbcSupport = 1; diff --git a/sys/dev/ath/ath_hal/ar9002/ar9285_attach.c b/sys/dev/ath/ath_hal/ar9002/ar9285_attach.c index d62d0e6..ee65841 100644 --- a/sys/dev/ath/ath_hal/ar9002/ar9285_attach.c +++ b/sys/dev/ath/ath_hal/ar9002/ar9285_attach.c @@ -384,9 +384,7 @@ ar9285FillCapabilityInfo(struct ath_hal *ah) pCap->halBtCoexSupport = AH_TRUE; #endif pCap->halAutoSleepSupport = AH_FALSE; /* XXX? */ -#if 0 pCap->hal4kbSplitTransSupport = AH_FALSE; -#endif pCap->halRxStbcSupport = 1; pCap->halTxStbcSupport = 1; |