From owner-svn-src-all@freebsd.org Wed Mar 1 00:42:39 2017 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 89813CF1BFD; Wed, 1 Mar 2017 00:42: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 48DDE6A0; Wed, 1 Mar 2017 00:42: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 v210gcds030814; Wed, 1 Mar 2017 00:42:38 GMT (envelope-from avos@FreeBSD.org) Received: (from avos@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id v210gc65030811; Wed, 1 Mar 2017 00:42:38 GMT (envelope-from avos@FreeBSD.org) Message-Id: <201703010042.v210gc65030811@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: avos set sender to avos@FreeBSD.org using -f From: Andriy Voskoboinyk Date: Wed, 1 Mar 2017 00:42:38 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r314443 - head/sys/dev/iwn 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.23 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: Wed, 01 Mar 2017 00:42:39 -0000 Author: avos Date: Wed Mar 1 00:42:38 2017 New Revision: 314443 URL: https://svnweb.freebsd.org/changeset/base/314443 Log: iwn: fix data rate parsing for Rx radiotap header. Tested with Intel 6205, MONITOR mode + RTL8188EU, STA mode. Modified: head/sys/dev/iwn/if_iwn.c head/sys/dev/iwn/if_iwnreg.h Modified: head/sys/dev/iwn/if_iwn.c ============================================================================== --- head/sys/dev/iwn/if_iwn.c Wed Mar 1 00:28:04 2017 (r314442) +++ head/sys/dev/iwn/if_iwn.c Wed Mar 1 00:42:38 2017 (r314443) @@ -2667,6 +2667,26 @@ rate2plcp(int rate) return 0; } +static __inline uint8_t +plcp2rate(const uint8_t rate_plcp) +{ + switch (rate_plcp) { + case 0xd: return 12; + case 0xf: return 18; + case 0x5: return 24; + case 0x7: return 36; + case 0x9: return 48; + case 0xb: return 72; + case 0x1: return 96; + case 0x3: return 108; + case 10: return 2; + case 20: return 4; + case 55: return 11; + case 110: return 22; + default: return 0; + } +} + static int iwn_get_1stream_tx_antmask(struct iwn_softc *sc) { @@ -3078,6 +3098,7 @@ iwn_rx_done(struct iwn_softc *sc, struct if (ieee80211_radiotap_active(ic)) { struct iwn_rx_radiotap_header *tap = &sc->sc_rxtap; + uint32_t rate = le32toh(stat->rate); tap->wr_flags = 0; if (stat->flags & htole16(IWN_STAT_FLAG_SHPREAMBLE)) @@ -3085,24 +3106,11 @@ iwn_rx_done(struct iwn_softc *sc, struct tap->wr_dbm_antsignal = (int8_t)rssi; tap->wr_dbm_antnoise = (int8_t)nf; tap->wr_tsft = stat->tstamp; - switch (stat->rate) { - /* CCK rates. */ - case 10: tap->wr_rate = 2; break; - case 20: tap->wr_rate = 4; break; - case 55: tap->wr_rate = 11; break; - case 110: tap->wr_rate = 22; break; - /* OFDM rates. */ - case 0xd: tap->wr_rate = 12; break; - case 0xf: tap->wr_rate = 18; break; - case 0x5: tap->wr_rate = 24; break; - case 0x7: tap->wr_rate = 36; break; - case 0x9: tap->wr_rate = 48; break; - case 0xb: tap->wr_rate = 72; break; - case 0x1: tap->wr_rate = 96; break; - case 0x3: tap->wr_rate = 108; break; - /* Unknown rate: should not happen. */ - default: tap->wr_rate = 0; - } + if (rate & IWN_RFLAG_MCS) { + tap->wr_rate = rate & IWN_RFLAG_RATE_MCS; + tap->wr_rate |= IEEE80211_RATE_MCS; + } else + tap->wr_rate = plcp2rate(rate & IWN_RFLAG_RATE); } /* Modified: head/sys/dev/iwn/if_iwnreg.h ============================================================================== --- head/sys/dev/iwn/if_iwnreg.h Wed Mar 1 00:28:04 2017 (r314442) +++ head/sys/dev/iwn/if_iwnreg.h Wed Mar 1 00:42:38 2017 (r314443) @@ -736,6 +736,10 @@ struct iwn4965_node_info { uint32_t reserved7; } __packed; +#define IWN_RFLAG_RATE 0xff +#define IWN_RFLAG_RATE_MCS 0x1f +#define IWN_RFLAG_HT40_DUP 0x20 + #define IWN_RFLAG_MCS (1 << 8) #define IWN_RFLAG_CCK (1 << 9) #define IWN_RFLAG_GREENFIELD (1 << 10)