Changeset View
Changeset View
Standalone View
Standalone View
head/sys/net80211/ieee80211.c
Show First 20 Lines • Show All 1,914 Lines • ▼ Show 20 Lines | if (isset(ic->ic_modecaps, IEEE80211_MODE_11NA) || | ||||
else | else | ||||
rate = ieee80211_htrates[i].ht20_rate_800ns; | rate = ieee80211_htrates[i].ht20_rate_800ns; | ||||
if (rate > maxrate) | if (rate > maxrate) | ||||
maxrate = rate; | maxrate = rate; | ||||
} | } | ||||
/* | /* | ||||
* Add VHT media. | * 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)) | if (isclr(ic->ic_modecaps, mode)) | ||||
continue; | continue; | ||||
addmedia(media, caps, addsta, mode, IFM_AUTO); | addmedia(media, caps, addsta, mode, IFM_AUTO); | ||||
addmedia(media, caps, addsta, mode, IFM_IEEE80211_VHT); | 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 */ | /* XXX TODO: VHT maxrate */ | ||||
} | } | ||||
return maxrate; | return maxrate; | ||||
} | } | ||||
/* XXX inline or eliminate? */ | /* XXX inline or eliminate? */ | ||||
▲ Show 20 Lines • Show All 102 Lines • ▼ Show 20 Lines | case IFM_IEEE80211_FH: | ||||
*mode = IEEE80211_MODE_FH; | *mode = IEEE80211_MODE_FH; | ||||
break; | break; | ||||
case IFM_IEEE80211_11NA: | case IFM_IEEE80211_11NA: | ||||
*mode = IEEE80211_MODE_11NA; | *mode = IEEE80211_MODE_11NA; | ||||
break; | break; | ||||
case IFM_IEEE80211_11NG: | case IFM_IEEE80211_11NG: | ||||
*mode = IEEE80211_MODE_11NG; | *mode = IEEE80211_MODE_11NG; | ||||
break; | break; | ||||
case IFM_IEEE80211_VHT2G: | |||||
*mode = IEEE80211_MODE_VHT_2GHZ; | |||||
break; | |||||
case IFM_IEEE80211_VHT5G: | |||||
*mode = IEEE80211_MODE_VHT_5GHZ; | |||||
break; | |||||
case IFM_AUTO: | case IFM_AUTO: | ||||
*mode = IEEE80211_MODE_AUTO; | *mode = IEEE80211_MODE_AUTO; | ||||
break; | break; | ||||
default: | default: | ||||
return 0; | return 0; | ||||
} | } | ||||
/* | /* | ||||
* Turbo mode is an ``option''. | * Turbo mode is an ``option''. | ||||
▲ Show 20 Lines • Show All 327 Lines • ▼ Show 20 Lines | static const struct ratemedia htrates[] = { | ||||
{ 70, IFM_IEEE80211_MCS }, | { 70, IFM_IEEE80211_MCS }, | ||||
{ 71, IFM_IEEE80211_MCS }, | { 71, IFM_IEEE80211_MCS }, | ||||
{ 72, IFM_IEEE80211_MCS }, | { 72, IFM_IEEE80211_MCS }, | ||||
{ 73, IFM_IEEE80211_MCS }, | { 73, IFM_IEEE80211_MCS }, | ||||
{ 74, IFM_IEEE80211_MCS }, | { 74, IFM_IEEE80211_MCS }, | ||||
{ 75, IFM_IEEE80211_MCS }, | { 75, IFM_IEEE80211_MCS }, | ||||
{ 76, 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; | 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) { | if (rate & IEEE80211_RATE_MCS) { | ||||
rate &= ~IEEE80211_RATE_MCS; | rate &= ~IEEE80211_RATE_MCS; | ||||
m = findmedia(htrates, nitems(htrates), rate); | m = findmedia(htrates, nitems(htrates), rate); | ||||
if (m != IFM_AUTO) | if (m != IFM_AUTO) | ||||
return m | IFM_IEEE80211_11NA; | return m | IFM_IEEE80211_11NA; | ||||
} | } | ||||
} else if (mode == IEEE80211_MODE_11NG) { | } else if (mode == IEEE80211_MODE_11NG) { | ||||
/* NB: 12 is ambiguous, it will be treated as an MCS */ | /* NB: 12 is ambiguous, it will be treated as an MCS */ | ||||
▲ Show 20 Lines • Show All 134 Lines • Show Last 20 Lines |