svn commit: r224926 - user/adrian/if_ath_tx/sys/dev/ath

Adrian Chadd adrian at FreeBSD.org
Wed Aug 17 06:21:34 UTC 2011


Author: adrian
Date: Wed Aug 17 06:21:34 2011
New Revision: 224926
URL: http://svn.freebsd.org/changeset/base/224926

Log:
  Modify how/when the frame descriptor is being setup.
  
  For packets being immediately queued to the hardware, setup the
  descriptor before handing it off to the hardware.
  
  For packets being queued to the per-TID software queue, defer
  setting up the descriptor details (setup, rate control, chaining)
  until the packet is about to be queued to the hardware.
  
  This way, packet aggregation (RIFS burst, A-MPDU) can setup
  the descriptor list as needed.
  
  The only downside at the moment is that the rate control decision
  is done (very) early on. I'll fix this at a later stage so software
  retries can use different rates as needed.

Modified:
  user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.c

Modified: user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.c
==============================================================================
--- user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.c	Wed Aug 17 03:44:47 2011	(r224925)
+++ user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.c	Wed Aug 17 06:21:34 2011	(r224926)
@@ -1155,19 +1155,6 @@ ath_tx_start(struct ath_softc *sc, struc
 	/* At this point m0 could have changed! */
 	m0 = bf->bf_m;
 
-	/*
-	 * Formulate first tx descriptor with tx controls.
-	 */
-	ath_tx_setds(sc, bf);
-
-	/*
-	 * Setup rate control series.
-	 */
-	ath_tx_set_ratectrl(sc, ni, bf);
-
-	/* Fill in the details in the descriptor list */
-	ath_tx_chaindesclist(sc, bf);
-
 #if 1
 	/*
 	 * If it's a multicast frame, do a direct-dispatch to the
@@ -1179,9 +1166,16 @@ ath_tx_start(struct ath_softc *sc, struc
 	 * destination hardware queue. Don't bother software
 	 * queuing it, as the TID will now be paused.
 	 */
-	if (ismcast)
-		ath_tx_handoff_mcast(sc, txq, bf);
-	else if (type == IEEE80211_FC0_TYPE_CTL &&
+	if (ismcast) {
+		/* Setup the descriptor before handoff */
+		ath_tx_setds(sc, bf);
+		ath_tx_set_ratectrl(sc, ni, bf);
+		ath_tx_chaindesclist(sc, bf);
+
+		ATH_TXQ_LOCK(txq);
+		ath_tx_handoff(sc, txq, bf);
+		ATH_TXQ_UNLOCK(txq);
+	} else if (type == IEEE80211_FC0_TYPE_CTL &&
 		    subtype == IEEE80211_FC0_SUBTYPE_BAR) {
 		/*
 		 * XXX The following is dirty but needed for now.
@@ -1197,6 +1191,12 @@ ath_tx_start(struct ath_softc *sc, struc
 		 */
 		DPRINTF(sc, ATH_DEBUG_SW_TX_CTRL,
 		    "%s: BAR: TX'ing direct\n", __func__);
+
+		/* Setup the descriptor before handoff */
+		ath_tx_setds(sc, bf);
+		ath_tx_set_ratectrl(sc, ni, bf);
+		ath_tx_chaindesclist(sc, bf);
+
 		ATH_TXQ_LOCK(txq);
 		ath_tx_handoff(sc, txq, bf);
 		ATH_TXQ_UNLOCK(txq);
@@ -1212,6 +1212,12 @@ ath_tx_start(struct ath_softc *sc, struc
 	 * For now, since there's no software queue,
 	 * direct-dispatch to the hardware.
 	 */
+
+	/* Setup the descriptor before handoff */
+	ath_tx_setds(sc, bf);
+	ath_tx_set_ratectrl(sc, ni, bf);
+	ath_tx_chaindesclist(sc, bf);
+
 	ATH_TXQ_LOCK(txq);
 	ath_tx_handoff(sc, txq, bf);
 	ATH_TXQ_UNLOCK(txq);
@@ -1383,12 +1389,6 @@ ath_tx_raw_start(struct ath_softc *sc, s
 		bf->bf_state.bfs_rc[3].tries = params->ibp_try3;
 	}
 
-	/* Program the descriptor */
-	ath_tx_setds(sc, bf);
-
-	/* Program the rate control series */
-	ath_tx_set_ratectrl(sc, ni, bf);
-
 	/* NB: no buffered multicast in power save support */
 
 	/* XXX If it's an ADDBA, override the correct queue */
@@ -1404,9 +1404,6 @@ ath_tx_raw_start(struct ath_softc *sc, s
 		pri = TID_TO_WME_AC(o_tid);
 	}
 
-	/* Fill in the details in the descriptor list */
-	ath_tx_chaindesclist(sc, bf);
-
 	/*
 	 * If we're overiding the ADDBA destination, dump directly
 	 * into the hardware queue, right after any pending
@@ -1415,6 +1412,9 @@ ath_tx_raw_start(struct ath_softc *sc, s
 
 	if (do_override) {
 		ATH_TXQ_LOCK(sc->sc_ac2q[pri]);
+		ath_tx_setds(sc, bf);
+		ath_tx_set_ratectrl(sc, ni, bf);
+		ath_tx_chaindesclist(sc, bf);
 		ath_tx_handoff(sc, sc->sc_ac2q[pri], bf);
 		ATH_TXQ_UNLOCK(sc->sc_ac2q[pri]);
 	}
@@ -2312,6 +2312,7 @@ ath_tx_tid_hw_queue_aggr(struct ath_soft
 	struct ath_txq *txq;
 	struct ath_tid *atid = &an->an_tid[tid];
 	struct ieee80211_tx_ampdu *tap;
+	struct ieee80211_node *ni = &an->an_node;
 
 	DPRINTF(sc, ATH_DEBUG_SW_TX, "%s: tid=%d\n", __func__, tid);
 
@@ -2378,6 +2379,11 @@ ath_tx_tid_hw_queue_aggr(struct ath_soft
 		if (bf->bf_state.bfs_tid == IEEE80211_NONQOS_TID)
 			device_printf(sc->sc_dev, "%s: TID=16?\n", __func__);
 
+		/* Program descriptor */
+		ath_tx_setds(sc, bf);
+		ath_tx_set_ratectrl(sc, ni, bf);
+		ath_tx_chaindesclist(sc, bf);
+
 		/* Punt to hardware or software txq */
 		ATH_TXQ_LOCK(txq);
 		ath_tx_handoff(sc, txq, bf);
@@ -2394,6 +2400,7 @@ ath_tx_tid_hw_queue_norm(struct ath_soft
 	struct ath_buf *bf;
 	struct ath_txq *txq;
 	struct ath_tid *atid = &an->an_tid[tid];
+	struct ieee80211_node *ni = &an->an_node;
 
 	DPRINTF(sc, ATH_DEBUG_SW_TX, "%s: node %p: TID %d: called\n",
 	    __func__, an, tid);
@@ -2427,6 +2434,11 @@ ath_tx_tid_hw_queue_norm(struct ath_soft
 		/* Normal completion handler */
 		bf->bf_comp = ath_tx_normal_comp;
 
+		/* Program descriptor */
+		ath_tx_setds(sc, bf);
+		ath_tx_set_ratectrl(sc, ni, bf);
+		ath_tx_chaindesclist(sc, bf);
+
 		/* Punt to hardware or software txq */
 		ATH_TXQ_LOCK(txq);
 		ath_tx_handoff(sc, txq, bf);


More information about the svn-src-user mailing list