Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 31 Jul 2012 23:54: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: r238961 - in head/sys/dev/ath: . ath_rate/sample
Message-ID:  <201207312354.q6VNsGfa086926@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: adrian
Date: Tue Jul 31 23:54:15 2012
New Revision: 238961
URL: http://svn.freebsd.org/changeset/base/238961

Log:
  Allow 802.11n hardware to support multi-rate retry when RTS/CTS is
  enabled.
  
  The legacy (pre-802.11n) hardware doesn't support this - although
  the AR5212 era hardware supports MRR, it doesn't have all the bits
  needed to support MRR + RTS/CTS.  The AR5416 and later support
  a packet duration and RTS/CTS flags per rate scenario, so we should
  support it.
  
  Tested:
  
  * AR9280, STA
  
  PR:		kern/170302

Modified:
  head/sys/dev/ath/ath_rate/sample/sample.c
  head/sys/dev/ath/if_ath.c
  head/sys/dev/ath/if_ath_tx.c
  head/sys/dev/ath/if_athvar.h

Modified: head/sys/dev/ath/ath_rate/sample/sample.c
==============================================================================
--- head/sys/dev/ath/ath_rate/sample/sample.c	Tue Jul 31 23:34:06 2012	(r238960)
+++ head/sys/dev/ath/ath_rate/sample/sample.c	Tue Jul 31 23:54:15 2012	(r238961)
@@ -502,8 +502,10 @@ ath_rate_findrate(struct ath_softc *sc, 
 		goto done;
 	}
 
-	/* XXX TODO: this doesn't know about 11gn vs 11g protection; teach it */
-	mrr = sc->sc_mrretry && !(ic->ic_flags & IEEE80211_F_USEPROT);
+	mrr = sc->sc_mrretry;
+	/* XXX check HT protmode too */
+	if (mrr && (ic->ic_flags & IEEE80211_F_USEPROT) && !sc->sc_mrrprot)
+		mrr = 0;
 
 	best_rix = pick_best_rate(an, rt, size_bin, !mrr);
 	if (best_rix >= 0) {
@@ -910,7 +912,11 @@ ath_rate_tx_complete(struct ath_softc *s
 		    short_tries, long_tries);
 		return;
 	}
-	mrr = sc->sc_mrretry && !(ic->ic_flags & IEEE80211_F_USEPROT);
+	mrr = sc->sc_mrretry;
+	/* XXX check HT protmode too */
+	if (mrr && (ic->ic_flags & IEEE80211_F_USEPROT) && !sc->sc_mrrprot)
+		mrr = 0;
+
 	if (!mrr || ts->ts_finaltsi == 0) {
 		if (!IS_RATE_DEFINED(sn, final_rix)) {
 			badrate(ifp, 0, ts->ts_rate, long_tries, status);

Modified: head/sys/dev/ath/if_ath.c
==============================================================================
--- head/sys/dev/ath/if_ath.c	Tue Jul 31 23:34:06 2012	(r238960)
+++ head/sys/dev/ath/if_ath.c	Tue Jul 31 23:54:15 2012	(r238961)
@@ -705,6 +705,12 @@ ath_attach(u_int16_t devid, struct ath_s
 		(void) ath_hal_settxchainmask(sc->sc_ah, tx_chainmask);
 	}
 
+	/*
+	 * Disable MRR with protected frames by default.
+	 * Only 802.11n series NICs can handle this.
+	 */
+	sc->sc_mrrprot = 0;	/* XXX should be a capability */
+
 #ifdef	ATH_ENABLE_11N
 	/*
 	 * Query HT capabilities
@@ -714,6 +720,9 @@ ath_attach(u_int16_t devid, struct ath_s
 		int rxs, txs;
 
 		device_printf(sc->sc_dev, "[HT] enabling HT modes\n");
+
+		sc->sc_mrrprot = 1;	/* XXX should be a capability */
+
 		ic->ic_htcaps = IEEE80211_HTC_HT	/* HT operation */
 			    | IEEE80211_HTC_AMPDU	/* A-MPDU tx/rx */
 			    | IEEE80211_HTC_AMSDU	/* A-MSDU tx/rx */

Modified: head/sys/dev/ath/if_ath_tx.c
==============================================================================
--- head/sys/dev/ath/if_ath_tx.c	Tue Jul 31 23:34:06 2012	(r238960)
+++ head/sys/dev/ath/if_ath_tx.c	Tue Jul 31 23:54:15 2012	(r238961)
@@ -1051,11 +1051,12 @@ ath_tx_set_rtscts(struct ath_softc *sc, 
 	
 	/*
 	 * Must disable multi-rate retry when using RTS/CTS.
-	 * XXX TODO: only for pre-11n NICs.
 	 */
-	bf->bf_state.bfs_ismrr = 0;
-	bf->bf_state.bfs_try0 =
-	    bf->bf_state.bfs_rc[0].tries = ATH_TXMGTTRY;	/* XXX ew */
+	if (!sc->sc_mrrprot) {
+		bf->bf_state.bfs_ismrr = 0;
+		bf->bf_state.bfs_try0 =
+		    bf->bf_state.bfs_rc[0].tries = ATH_TXMGTTRY; /* XXX ew */
+	}
 }
 
 /*

Modified: head/sys/dev/ath/if_athvar.h
==============================================================================
--- head/sys/dev/ath/if_athvar.h	Tue Jul 31 23:34:06 2012	(r238960)
+++ head/sys/dev/ath/if_athvar.h	Tue Jul 31 23:54:15 2012	(r238961)
@@ -463,6 +463,7 @@ struct ath_softc {
 	void			(*sc_setdefantenna)(struct ath_softc *, u_int);
 	unsigned int		sc_invalid  : 1,/* disable hardware accesses */
 				sc_mrretry  : 1,/* multi-rate retry support */
+				sc_mrrprot  : 1,/* MRR + protection support */
 				sc_softled  : 1,/* enable LED gpio status */
 				sc_hardled  : 1,/* enable MAC LED status */
 				sc_splitmic : 1,/* split TKIP MIC keys */



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