From owner-svn-src-all@freebsd.org Thu Apr 21 20:34:39 2016 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 5C57CB17750; Thu, 21 Apr 2016 20:34:39 +0000 (UTC) (envelope-from avos@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 37CF21F7B; Thu, 21 Apr 2016 20:34:39 +0000 (UTC) (envelope-from avos@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id u3LKYcT9029121; Thu, 21 Apr 2016 20:34:38 GMT (envelope-from avos@FreeBSD.org) Received: (from avos@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id u3LKYcbY029119; Thu, 21 Apr 2016 20:34:38 GMT (envelope-from avos@FreeBSD.org) Message-Id: <201604212034.u3LKYcbY029119@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: avos set sender to avos@FreeBSD.org using -f From: Andriy Voskoboinyk Date: Thu, 21 Apr 2016 20:34:38 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r298436 - head/sys/dev/urtwn X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 21 Apr 2016 20:34:39 -0000 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 /*