Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 19 Aug 2012 02:16:23 +0000 (UTC)
From:      Adrian Chadd <adrian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r239380 - head/sys/dev/ath
Message-ID:  <201208190216.q7J2GNq8012941@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: adrian
Date: Sun Aug 19 02:16:22 2012
New Revision: 239380
URL: http://svn.freebsd.org/changeset/base/239380

Log:
  When assembling the descriptor list, make sure that the "first" descriptor
  is marked correctly.
  
  The existing logic assumed that the first descriptor is i == 0, which
  doesn't hold for EDMA TX.  In this instance, the first time filltxdesc()
  is called can be up to i == 3.
  
  So for a two-buffer descriptor:
  
  * firstSeg is set to 0;
  * lastSeg is set to 1;
  * the ath_hal_filltxdesc() code will treat it as the last segment in
    a descriptor chain and blank some of the descriptor fields, causing
    the TX to stop.
  
  When firstSeg is set to 1 (regardless of lastSeg), it overrides the
  lastSeg setting.  Thus, ath_hal_filltxdesc() won't blank out these
  fields.
  
  Tested: AR9380, STA mode.  With this, association is successful.

Modified:
  head/sys/dev/ath/if_ath_tx.c

Modified: head/sys/dev/ath/if_ath_tx.c
==============================================================================
--- head/sys/dev/ath/if_ath_tx.c	Sat Aug 18 23:28:34 2012	(r239379)
+++ head/sys/dev/ath/if_ath_tx.c	Sun Aug 19 02:16:22 2012	(r239380)
@@ -306,6 +306,7 @@ ath_tx_chaindesclist(struct ath_softc *s
 	HAL_DMA_ADDR bufAddrList[4];
 	uint32_t segLenList[4];
 	int numTxMaps = 1;
+	int isFirstDesc = 1;
 
 	/*
 	 * XXX There's txdma and txdma_mgmt; the descriptor
@@ -369,10 +370,11 @@ ath_tx_chaindesclist(struct ath_softc *s
 			, segLenList
 			, bf->bf_descid		/* XXX desc id */
 			, bf->bf_state.bfs_txq->axq_qnum	/* XXX multicast? */
-			, i == 0		/* first segment */
+			, isFirstDesc		/* first segment */
 			, i == bf->bf_nseg - 1	/* last segment */
 			, ds0			/* first descriptor */
 		);
+		isFirstDesc = 0;
 		DPRINTF(sc, ATH_DEBUG_XMIT,
 			"%s: %d: %08x %08x %08x %08x %08x %08x\n",
 			__func__, i, ds->ds_link, ds->ds_data,



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201208190216.q7J2GNq8012941>