svn commit: r219975 - head/sys/dev/ath/ath_hal/ar5416
Adrian Chadd
adrian at FreeBSD.org
Fri Mar 25 00:03:22 UTC 2011
Author: adrian
Date: Fri Mar 25 00:03:21 2011
New Revision: 219975
URL: http://svn.freebsd.org/changeset/base/219975
Log:
Bring over interrupt mitigation changes from ath9k.
* The existing interrupt mitigation code didn't mitigate anything - the
per-packet TX/RX interrupts are still occuring. It's possible this
worked for the AR5416 but not any later chipsets; I'll investigate and
update as needed.
* Set both the RX and TX threshold registers whilst I'm at it.
This is verified to work on the AR9220 and AR9160. I'm leaving it off
by default in case it's truely broken, but I need to have it enabled
when doing 11n testing or interrupt loads exceed 10,000 interrupts/sec.
Modified:
head/sys/dev/ath/ath_hal/ar5416/ar5416_interrupts.c
head/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c
Modified: head/sys/dev/ath/ath_hal/ar5416/ar5416_interrupts.c
==============================================================================
--- head/sys/dev/ath/ath_hal/ar5416/ar5416_interrupts.c Thu Mar 24 21:31:32 2011 (r219974)
+++ head/sys/dev/ath/ath_hal/ar5416/ar5416_interrupts.c Fri Mar 25 00:03:21 2011 (r219975)
@@ -194,6 +194,23 @@ ar5416SetInterrupts(struct ath_hal *ah,
mask = ints & HAL_INT_COMMON;
mask2 = 0;
+#ifdef AR5416_INT_MITIGATION
+ /*
+ * Overwrite default mask if Interrupt mitigation
+ * is specified for AR5416
+ */
+ mask = ints & HAL_INT_COMMON;
+ if (ints & HAL_INT_TX)
+ mask |= AR_IMR_TXMINTR | AR_IMR_TXINTM;
+ if (ints & HAL_INT_RX)
+ mask |= AR_IMR_RXERR | AR_IMR_RXMINTR | AR_IMR_RXINTM;
+ if (ints & HAL_INT_TX) {
+ if (ahp->ah_txErrInterruptMask)
+ mask |= AR_IMR_TXERR;
+ if (ahp->ah_txEolInterruptMask)
+ mask |= AR_IMR_TXEOL;
+ }
+#else
if (ints & HAL_INT_TX) {
if (ahp->ah_txOkInterruptMask)
mask |= AR_IMR_TXOK;
@@ -206,16 +223,6 @@ ar5416SetInterrupts(struct ath_hal *ah,
}
if (ints & HAL_INT_RX)
mask |= AR_IMR_RXOK | AR_IMR_RXERR | AR_IMR_RXDESC;
-#ifdef AR5416_INT_MITIGATION
- /*
- * Overwrite default mask if Interrupt mitigation
- * is specified for AR5416
- */
- mask = ints & HAL_INT_COMMON;
- if (ints & HAL_INT_TX)
- mask |= AR_IMR_TXMINTR | AR_IMR_TXINTM;
- if (ints & HAL_INT_RX)
- mask |= AR_IMR_RXERR | AR_IMR_RXMINTR | AR_IMR_RXINTM;
#endif
if (ints & (HAL_INT_BMISC)) {
mask |= AR_IMR_BCNMISC;
Modified: head/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c
==============================================================================
--- head/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c Thu Mar 24 21:31:32 2011 (r219974)
+++ head/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c Fri Mar 25 00:03:21 2011 (r219975)
@@ -307,8 +307,11 @@ ar5416Reset(struct ath_hal *ah, HAL_OPMO
#ifdef AR5416_INT_MITIGATION
OS_REG_WRITE(ah, AR_MIRT, 0);
+
OS_REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_LAST, 500);
OS_REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_FIRST, 2000);
+ OS_REG_RMW_FIELD(ah, AR_TIMT, AR_TIMT_LAST, 300);
+ OS_REG_RMW_FIELD(ah, AR_TIMT, AR_TIMT_FIRST, 750);
#endif
ar5416InitBB(ah, chan);
More information about the svn-src-all
mailing list