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

Adrian Chadd adrian at FreeBSD.org
Thu Sep 8 12:19:58 UTC 2011


Author: adrian
Date: Thu Sep  8 12:19:58 2011
New Revision: 225447
URL: http://svn.freebsd.org/changeset/base/225447

Log:
  Add txq stop debugging; always memzero the 11n descriptors before chaining.
  
  * To help me trace down some ath txq device timeout issues, print out some
    TXQ state before the TXQ is halted.
  
  * Always memzero the descriptor in ar5416ChainTxDesc(). It was being called
    for the non-first descriptor in a (sub) frame.
    Problem is, I'm calling this function first, and THEN setting up the first
    descriptor, because of the way that ar5416ChainTxDesc() overwrites
    some fields that ar5416SetupFirstTxDesc() sets up.
  
    It's quite possible that ar5416SetupFirstTxDesc() should be called first;
    and ar5416ChainTxDesc() should be modified to merge in these changes
    rather than overwrite them. If I decide this, I'll revert this part of the
    patch.

Modified:
  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/ar5416/ar5416_xmit.c
==============================================================================
--- user/adrian/if_ath_tx/sys/dev/ath/ath_hal/ar5416/ar5416_xmit.c	Thu Sep  8 09:33:49 2011	(r225446)
+++ user/adrian/if_ath_tx/sys/dev/ath/ath_hal/ar5416/ar5416_xmit.c	Thu Sep  8 12:19:58 2011	(r225447)
@@ -41,6 +41,14 @@ ar5416StopTxDma(struct ath_hal *ah, u_in
 
 	HALASSERT(AH5212(ah)->ah_txq[q].tqi_type != HAL_TX_QUEUE_INACTIVE);
 
+	HALDEBUG(ah, HAL_DEBUG_TXQUEUE,
+	    "%s: Q(%d) QTXDP: 0x%.8x, QSTS: 0x%.8x, TXE: 0x%.8x, TXD: 0x%.8x\n",
+	    __func__, q,
+	    OS_REG_READ(ah, AR_QTXDP(q)),
+	    OS_REG_READ(ah, AR_QSTS(q)),
+	    OS_REG_READ(ah, AR_Q_TXE),
+	    OS_REG_READ(ah, AR_Q_TXD));
+
 	OS_REG_WRITE(ah, AR_Q_TXD, 1 << q);
 	for (i = STOP_DMA_TIMEOUT/STOP_DMA_ITER; i != 0; i--) {
 		if (ar5212NumTxPending(ah, q) == 0)
@@ -350,9 +358,16 @@ ar5416ChainTxDesc(struct ath_hal *ah, st
 		isaggr = 1;
 	}
 
-	if (!firstSeg) {
-		OS_MEMZERO(ds->ds_hw, AR5416_DESC_TX_CTL_SZ);
-	}
+	/*
+	 * Since this function is called before any of the other
+	 * descriptor setup functions (at least in this particular
+	 * 802.11n aggregation implementation), always bzero() the
+	 * descriptor. Previously this would be done for all but
+	 * the first segment.
+	 * XXX TODO: figure out why; perhaps I'm using this slightly
+	 * XXX incorrectly.
+	 */
+	OS_MEMZERO(ds->ds_hw, AR5416_DESC_TX_CTL_SZ);
 
 	ads->ds_ctl0 = (pktLen & AR_FrameLen);
 	ads->ds_ctl1 = (type << AR_FrameType_S)


More information about the svn-src-user mailing list