From 8f32e493cc1df9b61537ce9c5d5b4ec8e2bb4563 Mon Sep 17 00:00:00 2001 From: "Bjoern A. Zeeb" Date: Sun, 23 Aug 2020 21:42:23 +0000 Subject: [PATCH] net80211: improve media information for VHT5GHZ Improve ieee80211_media_setup(), media2mode(), and ieee80211_rate2media() for VHT5GHZ at least. Reviewed by: adrian, gnn MFC after: 2 weeks Sponsored by: Rubicon Communications, LLC (d/b/a "Netgate") Differential Revision: https://reviews.freebsd.org/D26089 --- sys/net80211/ieee80211.c | 42 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/sys/net80211/ieee80211.c b/sys/net80211/ieee80211.c index 38d749876452..56add28c2fd8 100644 --- a/sys/net80211/ieee80211.c +++ b/sys/net80211/ieee80211.c @@ -1920,12 +1920,18 @@ ieee80211_media_setup(struct ieee80211com *ic, /* * Add VHT media. + * XXX-BZ skip "VHT_2GHZ" for now. */ - for (; mode <= IEEE80211_MODE_VHT_5GHZ; mode++) { + for (mode = IEEE80211_MODE_VHT_5GHZ; mode <= IEEE80211_MODE_VHT_5GHZ; + mode++) { if (isclr(ic->ic_modecaps, mode)) continue; addmedia(media, caps, addsta, mode, IFM_AUTO); addmedia(media, caps, addsta, mode, IFM_IEEE80211_VHT); + } + if (isset(ic->ic_modecaps, IEEE80211_MODE_VHT_5GHZ)) { + addmedia(media, caps, addsta, + IEEE80211_MODE_AUTO, IFM_IEEE80211_VHT); /* XXX TODO: VHT maxrate */ } @@ -2044,6 +2050,12 @@ media2mode(const struct ifmedia_entry *ime, uint32_t flags, uint16_t *mode) case IFM_IEEE80211_11NG: *mode = IEEE80211_MODE_11NG; break; + case IFM_IEEE80211_VHT2G: + *mode = IEEE80211_MODE_VHT_2GHZ; + break; + case IFM_IEEE80211_VHT5G: + *mode = IEEE80211_MODE_VHT_5GHZ; + break; case IFM_AUTO: *mode = IEEE80211_MODE_AUTO; break; @@ -2387,12 +2399,36 @@ ieee80211_rate2media(struct ieee80211com *ic, int rate, enum ieee80211_phymode m { 75, IFM_IEEE80211_MCS }, { 76, IFM_IEEE80211_MCS }, }; + static const struct ratemedia vhtrates[] = { + { 0, IFM_IEEE80211_VHT }, + { 1, IFM_IEEE80211_VHT }, + { 2, IFM_IEEE80211_VHT }, + { 3, IFM_IEEE80211_VHT }, + { 4, IFM_IEEE80211_VHT }, + { 5, IFM_IEEE80211_VHT }, + { 6, IFM_IEEE80211_VHT }, + { 7, IFM_IEEE80211_VHT }, + { 8, IFM_IEEE80211_VHT }, /* Optional. */ + { 9, IFM_IEEE80211_VHT }, /* Optional. */ +#if 0 + /* Some QCA and BRCM seem to support this; offspec. */ + { 10, IFM_IEEE80211_VHT }, + { 11, IFM_IEEE80211_VHT }, +#endif + }; int m; /* - * Check 11n rates first for match as an MCS. + * Check 11ac/11n rates first for match as an MCS. */ - if (mode == IEEE80211_MODE_11NA) { + if (mode == IEEE80211_MODE_VHT_5GHZ) { + if (rate & IFM_IEEE80211_VHT) { + rate &= ~IFM_IEEE80211_VHT; + m = findmedia(vhtrates, nitems(vhtrates), rate); + if (m != IFM_AUTO) + return (m | IFM_IEEE80211_VHT); + } + } else if (mode == IEEE80211_MODE_11NA) { if (rate & IEEE80211_RATE_MCS) { rate &= ~IEEE80211_RATE_MCS; m = findmedia(htrates, nitems(htrates), rate);