svn commit: r225455 - user/adrian/if_ath_tx/sys/dev/ath/ath_hal/ar5416

Adrian Chadd adrian at FreeBSD.org
Fri Sep 9 04:40:20 UTC 2011


Author: adrian
Date: Fri Sep  9 04:40:20 2011
New Revision: 225455
URL: http://svn.freebsd.org/changeset/base/225455

Log:
  I've been seeing situations where the TX queue has validly completed
  packets in it. This shouldn't occur - the hardware should've sent an
  interrupt to signal that a TX completion had occured.
  
  So on a hunch, I decided to shuffle the interrupt mitigation bits
  up a bit, because I figured that the hardware may be sending a
  TX mitigation interrupt but not asserting TXOK at the time.
  
  This seems to be doing the "right" thing - ie, at the time the
  mitigation timer expiry has occured, the AR_ISR_S0/AR_ISR_S1/AR_ISR_S2
  registers seem to have the correct TX queue interrupt cause bits set;
  as they would stay set (once set) until AR_ISR_RAC is read.
  
  I'm going to have to chase this up with the MAC guys at Atheros to see
  exactly what the correct behaviour is.
  
  (Now there are still device timeout messages, but with an empty TX
   queue- this signifies a different problem.)

Modified:
  user/adrian/if_ath_tx/sys/dev/ath/ath_hal/ar5416/ar5416_interrupts.c

Modified: user/adrian/if_ath_tx/sys/dev/ath/ath_hal/ar5416/ar5416_interrupts.c
==============================================================================
--- user/adrian/if_ath_tx/sys/dev/ath/ath_hal/ar5416/ar5416_interrupts.c	Fri Sep  9 01:39:19 2011	(r225454)
+++ user/adrian/if_ath_tx/sys/dev/ath/ath_hal/ar5416/ar5416_interrupts.c	Fri Sep  9 04:40:20 2011	(r225455)
@@ -118,10 +118,21 @@ ar5416GetPendingInterrupts(struct ath_ha
 			return AH_FALSE;
 		}
 
+		/*
+		 * XXX TODO: see whether the hardware signals AR_ISR_RXOK
+		 * even if RX interrupt mitigation is enabled (but then
+		 * doesn't trigger an interrupt per RX packet) - which means
+		 * we'll be setting HAL_INT_RX even before the RX mitigation
+		 * timers have expired.
+		 *
+		 * XXX TODO: do the same for the TX interrupts and TX interrupt
+		 * mitigation.
+		 */
+
 		*masked = isr & HAL_INT_COMMON;
-		if (isr & (AR_ISR_RXOK | AR_ISR_RXERR))
+		if (isr & (AR_ISR_RXOK | AR_ISR_RXERR | AR_ISR_RXMINTR | AR_ISR_RXINTM))
 			*masked |= HAL_INT_RX;
-		if (isr & (AR_ISR_TXOK | AR_ISR_TXDESC | AR_ISR_TXERR | AR_ISR_TXEOL)) {
+		if (isr & (AR_ISR_TXOK | AR_ISR_TXDESC | AR_ISR_TXERR | AR_ISR_TXEOL | AR_ISR_TXMINTR | AR_ISR_TXINTM)) {
 			*masked |= HAL_INT_TX;
 			isr0 = OS_REG_READ(ah, AR_ISR_S0_S);
 			ahp->ah_intrTxqs |= MS(isr0, AR_ISR_S0_QCU_TXOK);
@@ -138,13 +149,6 @@ ar5416GetPendingInterrupts(struct ath_ha
 				*masked |= HAL_INT_TIM_TIMER;
 		}
 
-		/* Interrupt Mitigation on AR5416 */
-#ifdef	AH_AR5416_INTERRUPT_MITIGATION
-		if (isr & (AR_ISR_RXMINTR | AR_ISR_RXINTM))
-			*masked |= HAL_INT_RX;
-		if (isr & (AR_ISR_TXMINTR | AR_ISR_TXINTM))
-			*masked |= HAL_INT_TX;
-#endif
 		*masked |= mask2;
 	}
 


More information about the svn-src-user mailing list