Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 9 Sep 2012 05:06:16 +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: r240255 - head/sys/dev/ath
Message-ID:  <201209090506.q8956GCM010394@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: adrian
Date: Sun Sep  9 05:06:16 2012
New Revision: 240255
URL: http://svn.freebsd.org/changeset/base/240255

Log:
  Make sure the aggregate fields are properly cleared - both in the
  ath_buf and when forming a non-aggregate frame.
  
  The non-11n setds function is called when TXing aggregate frames (and
  yes, I should fix this!) and the non-11n TX aggregation code doesn't clear
  the delimiter field.  I figure it's nicer to do that.

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	Sun Sep  9 04:53:10 2012	(r240254)
+++ head/sys/dev/ath/if_ath_tx.c	Sun Sep  9 05:06:16 2012	(r240255)
@@ -377,6 +377,11 @@ ath_tx_chaindesclist(struct ath_softc *s
 			, i == bf->bf_nseg - 1	/* last segment */
 			, (struct ath_desc *) ds0	/* first descriptor */
 		);
+
+		/* Make sure the 11n aggregate fields are cleared */
+		if (ath_tx_is_11n(sc))
+			ath_hal_clr11n_aggr(sc->sc_ah, bf->bf_desc);
+
 		isFirstDesc = 0;
 #ifdef	ATH_DEBUG
 		if (sc->sc_debug & ATH_DEBUG_XMIT)
@@ -3459,6 +3464,7 @@ ath_tx_retry_subframe(struct ath_softc *
 
 	ATH_TXQ_LOCK_ASSERT(sc->sc_ac2q[atid->ac]);
 
+	/* XXX clr11naggr should be done for all subframes */
 	ath_hal_clr11n_aggr(sc->sc_ah, bf->bf_desc);
 	ath_hal_set11nburstduration(sc->sc_ah, bf->bf_desc, 0);
 	/* ath_hal_set11n_virtualmorefrag(sc->sc_ah, bf->bf_desc, 0); */
@@ -3499,6 +3505,11 @@ ath_tx_retry_subframe(struct ath_softc *
 	ath_tx_set_retry(sc, bf);
 	bf->bf_next = NULL;		/* Just to make sure */
 
+	/* Clear the aggregate state */
+	bf->bf_state.bfs_aggr = 0;
+	bf->bf_state.bfs_ndelim = 0;	/* ??? needed? */
+	bf->bf_state.bfs_nframes = 1;
+
 	TAILQ_INSERT_TAIL(bf_q, bf, bf_list);
 	return 0;
 }
@@ -4127,6 +4138,7 @@ ath_tx_tid_hw_queue_aggr(struct ath_soft
 			DPRINTF(sc, ATH_DEBUG_SW_TX_AGGR,
 			    "%s: single-frame aggregate\n", __func__);
 			bf->bf_state.bfs_aggr = 0;
+			bf->bf_state.bfs_ndelim = 0;
 			ath_tx_setds(sc, bf);
 			ath_hal_clr11n_aggr(sc->sc_ah, bf->bf_desc);
 			if (status == ATH_AGGR_BAW_CLOSED)



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