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

Adrian Chadd adrian at FreeBSD.org
Wed Aug 17 02:01:37 UTC 2011


Author: adrian
Date: Wed Aug 17 02:01:37 2011
New Revision: 224923
URL: http://svn.freebsd.org/changeset/base/224923

Log:
  Break out the rate setup code into a new function, ath_tx_set_ratectrl(),
  which programs the 11n or non-11n rate setup as needed.

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

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	Tue Aug 16 23:47:53 2011	(r224922)
+++ user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.c	Wed Aug 17 02:01:37 2011	(r224923)
@@ -631,6 +631,49 @@ ath_tx_setds(struct ath_softc *sc, struc
 	/* XXX TODO: Setup descriptor chain */
 }
 
+/*
+ * Set the rate control fields in the given descriptor based on
+ * the bf_state fields and node state.
+ *
+ * The bfs fields should already be set with the relevant rate
+ * control information, including whether MRR is to be enabled.
+ *
+ * Since the FreeBSD HAL currently sets up the first TX rate
+ * in ath_hal_setuptxdesc(), this will setup the MRR
+ * conditionally for the pre-11n chips, and call ath_buf_set_rate
+ * unconditionally for 11n chips. These require the 11n rate
+ * scenario to be set if MCS rates are enabled, so it's easier
+ * to just always call it. The caller can then only set rates 2, 3
+ * and 4 if multi-rate retry is needed.
+ */
+static void
+ath_tx_set_ratectrl(struct ath_softc *sc, struct ieee80211_node *ni,
+    struct ath_buf *bf)
+{
+	const HAL_RATE_TABLE *rt = sc->sc_currates;
+	struct ath_rc_series *rc = bf->bf_state.bfs_rc;
+	uint8_t rate[4];
+	int i;
+
+	if (ath_tx_is_11n(sc)) {
+		/* Always setup rate series */
+		ath_buf_set_rate(sc, ni, bf);
+	} else if (bf->bf_state.bfs_ismrr) {
+		/* Only call for legacy NICs if MRR */
+		for (i = 0; i < 4; i++) {
+			rate[i] = rt->info[rc[i].rix].rateCode;
+			if (bf->bf_state.bfs_shpream) {
+				rate[i] |= rt->info[rc[i].rix].shortPreamble;
+			}
+		}
+		ath_hal_setupxtxdesc(sc->sc_ah, bf->bf_desc
+			, rate[1], rc[1].tries
+			, rate[2], rc[2].tries
+			, rate[3], rc[3].tries
+		);
+	}
+}
+
 static int
 ath_tx_normal_setup(struct ath_softc *sc, struct ieee80211_node *ni,
     struct ath_buf *bf, struct mbuf *m0)
@@ -975,10 +1018,8 @@ ath_tx_normal_setup(struct ath_softc *sc
 	 * ath_buf_set_rate needs at least one rate/try to setup
 	 * the rate scenario.
 	 */
-	if (ath_tx_is_11n(sc)) {
-		bf->bf_state.bfs_rc[0].rix = rix;
-		bf->bf_state.bfs_rc[0].tries = try0;
-	}
+	bf->bf_state.bfs_rc[0].rix = rix;
+	bf->bf_state.bfs_rc[0].tries = try0;
 
 	/* Store the decided rate index values away */
 	bf->bf_state.bfs_pktlen = pktlen;
@@ -999,11 +1040,6 @@ ath_tx_normal_setup(struct ath_softc *sc
 	bf->bf_state.bfs_ismrr = ismrr;
 
 	/*
-	 * Formulate first tx descriptor with tx controls.
-	 */
-	ath_tx_setds(sc, bf);
-
-	/*
 	 * Setup the multi-rate retry state only when we're
 	 * going to use it.  This assumes ath_hal_setuptxdesc
 	 * initializes the descriptors (so we don't have to)
@@ -1012,16 +1048,19 @@ ath_tx_normal_setup(struct ath_softc *sc
 	 */
         if (ismrr) {
 		ATH_NODE_LOCK(an);
-                if (ath_tx_is_11n(sc))
-                        ath_rate_getxtxrates(sc, an, rix, bf->bf_state.bfs_rc);
-                else
-                        ath_rate_setupxtxdesc(sc, an, ds, shortPreamble, rix);
+		ath_rate_getxtxrates(sc, an, rix, bf->bf_state.bfs_rc);
 		ATH_NODE_UNLOCK(an);
         }
 
-	/* Setup 11n rate scenario for 11n NICs only */
-	if (ath_tx_is_11n(sc))
-		ath_buf_set_rate(sc, ni, bf);
+	/*
+	 * Formulate first tx descriptor with tx controls.
+	 */
+	ath_tx_setds(sc, bf);
+
+	/*
+	 * Setup rate control series.
+	 */
+	ath_tx_set_ratectrl(sc, ni, bf);
 
 	return 0;
 }
@@ -1193,7 +1232,7 @@ ath_tx_raw_start(struct ath_softc *sc, s
 	struct ieee80211vap *vap = ni->ni_vap;
 	int error, ismcast, ismrr;
 	int keyix, hdrlen, pktlen, try0, txantenna;
-	u_int8_t rix, cix, txrate, ctsrate, rate1, rate2, rate3;
+	u_int8_t rix, cix, txrate, ctsrate;
 	struct ieee80211_frame *wh;
 	u_int flags, ctsduration;
 	HAL_PKT_TYPE atype;
@@ -1325,70 +1364,31 @@ ath_tx_raw_start(struct ath_softc *sc, s
 	bf->bf_state.bfs_ctsduration = ctsduration;
 	bf->bf_state.bfs_ismrr = ismrr;
 
-	ath_tx_setds(sc, bf);
-
 	/* Blank the legacy rate array */
 	bzero(&bf->bf_state.bfs_rc, sizeof(bf->bf_state.bfs_rc));
 
-	if (ath_tx_is_11n(sc)) {
-		bf->bf_state.bfs_rc[0].rix = ath_tx_findrix(sc, params->ibp_rate0);
-		bf->bf_state.bfs_rc[0].tries = params->ibp_try0;
-
-		if (ismrr) {
-			/* Remember, rate[] is actually an array of rix's -adrian */
-			bf->bf_state.bfs_rc[0].rix =
-			    ath_tx_findrix(sc, params->ibp_rate0);
-			bf->bf_state.bfs_rc[1].rix =
-			    ath_tx_findrix(sc, params->ibp_rate1);
-			bf->bf_state.bfs_rc[2].rix =
-			    ath_tx_findrix(sc, params->ibp_rate2);
-			bf->bf_state.bfs_rc[3].rix =
-			    ath_tx_findrix(sc, params->ibp_rate3);
-
-			bf->bf_state.bfs_rc[0].tries =
-			    params->ibp_try0;
-			bf->bf_state.bfs_rc[1].tries =
-			    params->ibp_try1;
-			bf->bf_state.bfs_rc[2].tries =
-			    params->ibp_try2;
-			bf->bf_state.bfs_rc[3].tries =
-			    params->ibp_try3;
-		}
-	} else {
-		if (ismrr) {
-			rix = ath_tx_findrix(sc, params->ibp_rate1);
-			rate1 = rt->info[rix].rateCode;
-			if (params->ibp_flags & IEEE80211_BPF_SHORTPRE)
-				rate1 |= rt->info[rix].shortPreamble;
-			if (params->ibp_try2) {
-				rix = ath_tx_findrix(sc, params->ibp_rate2);
-				rate2 = rt->info[rix].rateCode;
-				if (params->ibp_flags & IEEE80211_BPF_SHORTPRE)
-					rate2 |= rt->info[rix].shortPreamble;
-			} else
-				rate2 = 0;
-			if (params->ibp_try3) {
-				rix = ath_tx_findrix(sc, params->ibp_rate3);
-				rate3 = rt->info[rix].rateCode;
-				if (params->ibp_flags & IEEE80211_BPF_SHORTPRE)
-					rate3 |= rt->info[rix].shortPreamble;
-			} else
-				rate3 = 0;
-			ath_hal_setupxtxdesc(ah, ds
-				, rate1, params->ibp_try1	/* series 1 */
-				, rate2, params->ibp_try2	/* series 2 */
-				, rate3, params->ibp_try3	/* series 3 */
-			);
-		}
+	bf->bf_state.bfs_rc[0].rix =
+	    ath_tx_findrix(sc, params->ibp_rate0);
+	bf->bf_state.bfs_rc[0].tries = try0;
+
+	if (ismrr) {
+		bf->bf_state.bfs_rc[1].rix =
+		    ath_tx_findrix(sc, params->ibp_rate1);
+		bf->bf_state.bfs_rc[2].rix =
+		    ath_tx_findrix(sc, params->ibp_rate2);
+		bf->bf_state.bfs_rc[3].rix =
+		    ath_tx_findrix(sc, params->ibp_rate3);
+
+		bf->bf_state.bfs_rc[1].tries = params->ibp_try1;
+		bf->bf_state.bfs_rc[2].tries = params->ibp_try2;
+		bf->bf_state.bfs_rc[3].tries = params->ibp_try3;
 	}
 
-	if (ath_tx_is_11n(sc)) {
-		/*
-		 * notice that rix doesn't include any of the "magic" flags txrate
-		 * does for communicating "other stuff" to the HAL.
-		 */
-		ath_buf_set_rate(sc, ni, bf);
-	}
+	/* 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 */
 

Modified: user/adrian/if_ath_tx/sys/dev/ath/if_athrate.h
==============================================================================
--- user/adrian/if_ath_tx/sys/dev/ath/if_athrate.h	Tue Aug 16 23:47:53 2011	(r224922)
+++ user/adrian/if_ath_tx/sys/dev/ath/if_athrate.h	Wed Aug 17 02:01:37 2011	(r224923)
@@ -80,7 +80,7 @@ void	ath_rate_detach(struct ath_ratectrl
 #define	ATH_RC_NUM		4
 
 struct ath_rc_series {
-	uint8_t rix;
+	uint8_t rix;		/* ratetable index, not rate code */
 	uint8_t tries;
 	uint8_t flags;
 	uint32_t max4msframelen;


More information about the svn-src-user mailing list