Author: avos
Date: Sun May 22 19:43:40 2016
New Revision: 300433
URL: https://svnweb.freebsd.org/changeset/base/300433

Log:
  urtwn: setup per-frame retry limit.
  
  Override global retry limit (which is set in R92C_RL) via per-frame
  TX descriptor field. Obsoletes D3840 (should work better with 2+ vaps).
  
  Tested with RTL8188EU and RTL8192CUS in STA mode (maxretry = [3-9]).

Modified:
  head/sys/dev/urtwn/if_urtwn.c
  head/sys/dev/urtwn/if_urtwnreg.h

Modified: head/sys/dev/urtwn/if_urtwn.c
==============================================================================
--- head/sys/dev/urtwn/if_urtwn.c       Sun May 22 19:25:53 2016        
(r300432)
+++ head/sys/dev/urtwn/if_urtwn.c       Sun May 22 19:43:40 2016        
(r300433)
@@ -2838,7 +2838,7 @@ urtwn_tx_data(struct urtwn_softc *sc, st
        struct ieee80211_channel *chan;
        struct ieee80211_frame *wh;
        struct r92c_tx_desc *txd;
-       uint8_t macid, raid, rate, ridx, subtype, type, tid, qsel;
+       uint8_t macid, raid, rate, ridx, subtype, type, tid, qos, qsel;
        int hasqos, ismcast;
 
        URTWN_ASSERT_LOCKED(sc);
@@ -2854,10 +2854,12 @@ urtwn_tx_data(struct urtwn_softc *sc, st
 
        /* Select TX ring for this frame. */
        if (hasqos) {
-               tid = ((const struct ieee80211_qosframe *)wh)->i_qos[0];
-               tid &= IEEE80211_QOS_TID;
-       } else
+               qos = ((const struct ieee80211_qosframe *)wh)->i_qos[0];
+               tid = qos & IEEE80211_QOS_TID;
+       } else {
+               qos = 0;
                tid = 0;
+       }
 
        chan = (ni->ni_chan != IEEE80211_CHAN_ANYC) ?
                ni->ni_chan : ic->ic_curchan;
@@ -2923,6 +2925,14 @@ urtwn_tx_data(struct urtwn_softc *sc, st
                txd->txdw0 |= htole32(R92C_TXDW0_BMCAST);
 
        if (!ismcast) {
+               /* Unicast frame, check if an ACK is expected. */
+               if (!qos || (qos & IEEE80211_QOS_ACKPOLICY) !=
+                   IEEE80211_QOS_ACKPOLICY_NOACK) {
+                       txd->txdw5 |= htole32(R92C_TXDW5_RTY_LMT_ENA);
+                       txd->txdw5 |= htole32(SM(R92C_TXDW5_RTY_LMT,
+                           tp->maxretry));
+               }
+
                if (sc->chip & URTWN_CHIP_88E) {
                        struct urtwn_node *un = URTWN_NODE(ni);
                        macid = un->id;
@@ -3102,6 +3112,11 @@ urtwn_tx_raw(struct urtwn_softc *sc, str
        if (IEEE80211_IS_MULTICAST(wh->i_addr1))
                txd->txdw0 |= htole32(R92C_TXDW0_BMCAST);
 
+       if ((params->ibp_flags & IEEE80211_BPF_NOACK) == 0) {
+               txd->txdw5 |= htole32(R92C_TXDW5_RTY_LMT_ENA);
+               txd->txdw5 |= htole32(SM(R92C_TXDW5_RTY_LMT,
+                   params->ibp_try0));
+       }
        if (params->ibp_flags & IEEE80211_BPF_RTS)
                txd->txdw4 |= htole32(R92C_TXDW4_RTSEN);
        if (params->ibp_flags & IEEE80211_BPF_CTS)

Modified: head/sys/dev/urtwn/if_urtwnreg.h
==============================================================================
--- head/sys/dev/urtwn/if_urtwnreg.h    Sun May 22 19:25:53 2016        
(r300432)
+++ head/sys/dev/urtwn/if_urtwnreg.h    Sun May 22 19:43:40 2016        
(r300433)
@@ -1198,6 +1198,9 @@ struct r92c_tx_desc {
 #define R92C_TXDW5_DATARATE_M  0x0000003f
 #define R92C_TXDW5_DATARATE_S  0
 #define R92C_TXDW5_SGI         0x00000040
+#define R92C_TXDW5_RTY_LMT_ENA 0x00020000
+#define R92C_TXDW5_RTY_LMT_M   0x00fc0000
+#define R92C_TXDW5_RTY_LMT_S   18
 #define R92C_TXDW5_AGGNUM_M    0xff000000
 #define R92C_TXDW5_AGGNUM_S    24
 
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to