Author: avos
Date: Thu Apr 21 20:34:38 2016
New Revision: 298436
URL: https://svnweb.freebsd.org/changeset/base/298436

Log:
  urtwn: optimize rate lookup in the urtwn_ra_init()
  
  Replace loop with switch statement (rate2ridx())
  (should be noop).
  
  Tested with RTL8188EU / RTL8188CUS, STA mode.
  
  Reviewed by:  adrian
  Differential Revision:        https://reviews.freebsd.org/D4848 (rebased)

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       Thu Apr 21 20:30:38 2016        
(r298435)
+++ head/sys/dev/urtwn/if_urtwn.c       Thu Apr 21 20:34:38 2016        
(r298436)
@@ -1944,6 +1944,32 @@ urtwn_r88e_read_rom(struct urtwn_softc *
        return (0);
 }
 
+static __inline uint8_t
+rate2ridx(uint8_t rate)
+{
+       if (rate & IEEE80211_RATE_MCS) {
+               /* 11n rates start at idx 12 */
+               return ((rate & 0xf) + 12);
+       }
+       switch (rate) {
+       /* 11g */
+       case 12:        return 4;
+       case 18:        return 5;
+       case 24:        return 6;
+       case 36:        return 7;
+       case 48:        return 8;
+       case 72:        return 9;
+       case 96:        return 10;
+       case 108:       return 11;
+       /* 11b */
+       case 2:         return 0;
+       case 4:         return 1;
+       case 11:        return 2;
+       case 22:        return 3;
+       default:        return URTWN_RIDX_UNKNOWN;
+       }
+}
+
 /*
  * Initialize rate adaptation in firmware.
  */
@@ -1956,8 +1982,8 @@ urtwn_ra_init(struct urtwn_softc *sc)
        struct ieee80211_rateset *rs, *rs_ht;
        struct r92c_fw_cmd_macid_cfg cmd;
        uint32_t rates, basicrates;
-       uint8_t mode;
-       int maxrate, maxbasicrate, error, i, j;
+       uint8_t mode, ridx;
+       int maxrate, maxbasicrate, error, i;
 
        ni = ieee80211_ref_node(vap->iv_bss);
        rs = &ni->ni_rates;
@@ -1970,19 +1996,16 @@ urtwn_ra_init(struct urtwn_softc *sc)
        /* This is for 11bg */
        for (i = 0; i < rs->rs_nrates; i++) {
                /* Convert 802.11 rate to HW rate index. */
-               for (j = 0; j < nitems(ridx2rate); j++)
-                       if ((rs->rs_rates[i] & IEEE80211_RATE_VAL) ==
-                           ridx2rate[j])
-                               break;
-               if (j == nitems(ridx2rate))     /* Unknown rate, skip. */
+               ridx = rate2ridx(IEEE80211_RV(rs->rs_rates[i]));
+               if (ridx == URTWN_RIDX_UNKNOWN) /* Unknown rate, skip. */
                        continue;
-               rates |= 1 << j;
-               if (j > maxrate)
-                       maxrate = j;
+               rates |= 1 << ridx;
+               if (ridx > maxrate)
+                       maxrate = ridx;
                if (rs->rs_rates[i] & IEEE80211_RATE_BASIC) {
-                       basicrates |= 1 << j;
-                       if (j > maxbasicrate)
-                               maxbasicrate = j;
+                       basicrates |= 1 << ridx;
+                       if (ridx > maxbasicrate)
+                               maxbasicrate = ridx;
                }
        }
 
@@ -1992,12 +2015,12 @@ urtwn_ra_init(struct urtwn_softc *sc)
                        if ((rs_ht->rs_rates[i] & 0x7f) > 0xf)
                                continue;
                        /* 11n rates start at index 12 */
-                       j = ((rs_ht->rs_rates[i]) & 0xf) + 12;
-                       rates |= (1 << j);
+                       ridx = ((rs_ht->rs_rates[i]) & 0xf) + 12;
+                       rates |= (1 << ridx);
 
                        /* Guard against the rate table being oddly ordered */
-                       if (j > maxrate)
-                               maxrate = j;
+                       if (ridx > maxrate)
+                               maxrate = ridx;
                }
        }
 
@@ -2802,32 +2825,6 @@ urtwn_r88e_get_rssi(struct urtwn_softc *
        return (rssi);
 }
 
-static __inline uint8_t
-rate2ridx(uint8_t rate)
-{
-       if (rate & IEEE80211_RATE_MCS) {
-               /* 11n rates start at idx 12 */
-               return ((rate & 0xf) + 12);
-       }
-       switch (rate) {
-       /* 11g */
-       case 12:        return 4;
-       case 18:        return 5;
-       case 24:        return 6;
-       case 36:        return 7;
-       case 48:        return 8;
-       case 72:        return 9;
-       case 96:        return 10;
-       case 108:       return 11;
-       /* 11b */
-       case 2:         return 0;
-       case 4:         return 1;
-       case 11:        return 2;
-       case 22:        return 3;
-       default:        return 0;
-       }
-}
-
 static int
 urtwn_tx_data(struct urtwn_softc *sc, struct ieee80211_node *ni,
     struct mbuf *m, struct urtwn_data *data)

Modified: head/sys/dev/urtwn/if_urtwnreg.h
==============================================================================
--- head/sys/dev/urtwn/if_urtwnreg.h    Thu Apr 21 20:30:38 2016        
(r298435)
+++ head/sys/dev/urtwn/if_urtwnreg.h    Thu Apr 21 20:34:38 2016        
(r298436)
@@ -1242,6 +1242,7 @@ static const uint8_t ridx2rate[] =
 #define URTWN_RIDX_OFDM54      11
 
 #define URTWN_RIDX_COUNT       28
+#define URTWN_RIDX_UNKNOWN     (uint8_t)-1
 
 
 /*
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to