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

Reply via email to