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 */
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to