Changeset View
Changeset View
Standalone View
Standalone View
sys/net80211/ieee80211_vht.c
Show First 20 Lines • Show All 47 Lines • ▼ Show 20 Lines | |||||
#include <net/if_media.h> | #include <net/if_media.h> | ||||
#include <net/ethernet.h> | #include <net/ethernet.h> | ||||
#include <net80211/ieee80211_var.h> | #include <net80211/ieee80211_var.h> | ||||
#include <net80211/ieee80211_action.h> | #include <net80211/ieee80211_action.h> | ||||
#include <net80211/ieee80211_input.h> | #include <net80211/ieee80211_input.h> | ||||
#include <net80211/ieee80211_vht.h> | #include <net80211/ieee80211_vht.h> | ||||
/* define here, used throughout file */ | |||||
#define MS(_v, _f) (((_v) & _f) >> _f##_S) | |||||
#define SM(_v, _f) (((_v) << _f##_S) & _f) | |||||
#define ADDSHORT(frm, v) do { \ | #define ADDSHORT(frm, v) do { \ | ||||
frm[0] = (v) & 0xff; \ | frm[0] = (v) & 0xff; \ | ||||
frm[1] = (v) >> 8; \ | frm[1] = (v) >> 8; \ | ||||
frm += 2; \ | frm += 2; \ | ||||
} while (0) | } while (0) | ||||
#define ADDWORD(frm, v) do { \ | #define ADDWORD(frm, v) do { \ | ||||
frm[0] = (v) & 0xff; \ | frm[0] = (v) & 0xff; \ | ||||
frm[1] = ((v) >> 8) & 0xff; \ | frm[1] = ((v) >> 8) & 0xff; \ | ||||
▲ Show 20 Lines • Show All 134 Lines • ▼ Show 20 Lines | |||||
{ | { | ||||
int i, tx, rx; | int i, tx, rx; | ||||
if (! IEEE80211_CONF_VHT(ic)) | if (! IEEE80211_CONF_VHT(ic)) | ||||
return; | return; | ||||
/* Channel width */ | /* Channel width */ | ||||
ic_printf(ic, "[VHT] Channel Widths: 20MHz, 40MHz, 80MHz"); | ic_printf(ic, "[VHT] Channel Widths: 20MHz, 40MHz, 80MHz"); | ||||
if (MS(ic->ic_vhtcaps, IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_MASK) >= 1) | if (_IEEE80211_MASKSHIFT(ic->ic_vhtcaps, IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_MASK) >= 1) | ||||
printf(" 160MHz"); | printf(" 160MHz"); | ||||
if (MS(ic->ic_vhtcaps, IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_MASK) == 2) | if (_IEEE80211_MASKSHIFT(ic->ic_vhtcaps, IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_MASK) == 2) | ||||
printf(" 80+80MHz"); | printf(" 80+80MHz"); | ||||
printf("\n"); | printf("\n"); | ||||
/* Features */ | /* Features */ | ||||
ic_printf(ic, "[VHT] Features: %b\n", ic->ic_vhtcaps, | ic_printf(ic, "[VHT] Features: %b\n", ic->ic_vhtcaps, | ||||
IEEE80211_VHTCAP_BITS); | IEEE80211_VHTCAP_BITS); | ||||
/* For now, just 5GHz VHT. Worry about 2GHz VHT later */ | /* For now, just 5GHz VHT. Worry about 2GHz VHT later */ | ||||
▲ Show 20 Lines • Show All 150 Lines • ▼ Show 20 Lines | // struct ieee80211com *ic = vap->iv_ic; | ||||
/* | /* | ||||
* Station - use our desired configuration based on | * Station - use our desired configuration based on | ||||
* local config, local device bits and the already-learnt | * local config, local device bits and the already-learnt | ||||
* vhtcap/vhtinfo IE in the node. | * vhtcap/vhtinfo IE in the node. | ||||
*/ | */ | ||||
/* Limit MPDU size to the smaller of the two */ | /* Limit MPDU size to the smaller of the two */ | ||||
val2 = val1 = MS(vap->iv_vhtcaps, IEEE80211_VHTCAP_MAX_MPDU_MASK); | val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vhtcaps, IEEE80211_VHTCAP_MAX_MPDU_MASK); | ||||
if (opmode == 1) { | if (opmode == 1) { | ||||
val2 = MS(ni->ni_vhtcap, IEEE80211_VHTCAP_MAX_MPDU_MASK); | val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap, IEEE80211_VHTCAP_MAX_MPDU_MASK); | ||||
} | } | ||||
val = MIN(val1, val2); | val = MIN(val1, val2); | ||||
new_vhtcap |= SM(val, IEEE80211_VHTCAP_MAX_MPDU_MASK); | new_vhtcap |= _IEEE80211_SHIFTMASK(val, IEEE80211_VHTCAP_MAX_MPDU_MASK); | ||||
/* Limit supp channel config */ | /* Limit supp channel config */ | ||||
val2 = val1 = MS(vap->iv_vhtcaps, | val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vhtcaps, | ||||
IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_MASK); | IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_MASK); | ||||
if (opmode == 1) { | if (opmode == 1) { | ||||
val2 = MS(ni->ni_vhtcap, | val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap, | ||||
IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_MASK); | IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_MASK); | ||||
} | } | ||||
if ((val2 == 2) && | if ((val2 == 2) && | ||||
((vap->iv_flags_vht & IEEE80211_FVHT_USEVHT80P80) == 0)) | ((vap->iv_flags_vht & IEEE80211_FVHT_USEVHT80P80) == 0)) | ||||
val2 = 1; | val2 = 1; | ||||
if ((val2 == 1) && | if ((val2 == 1) && | ||||
((vap->iv_flags_vht & IEEE80211_FVHT_USEVHT160) == 0)) | ((vap->iv_flags_vht & IEEE80211_FVHT_USEVHT160) == 0)) | ||||
val2 = 0; | val2 = 0; | ||||
val = MIN(val1, val2); | val = MIN(val1, val2); | ||||
new_vhtcap |= SM(val, IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_MASK); | new_vhtcap |= _IEEE80211_SHIFTMASK(val, IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_MASK); | ||||
/* RX LDPC */ | /* RX LDPC */ | ||||
val2 = val1 = MS(vap->iv_vhtcaps, IEEE80211_VHTCAP_RXLDPC); | val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vhtcaps, IEEE80211_VHTCAP_RXLDPC); | ||||
if (opmode == 1) { | if (opmode == 1) { | ||||
val2 = MS(ni->ni_vhtcap, IEEE80211_VHTCAP_RXLDPC); | val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap, IEEE80211_VHTCAP_RXLDPC); | ||||
} | } | ||||
val = MIN(val1, val2); | val = MIN(val1, val2); | ||||
new_vhtcap |= SM(val, IEEE80211_VHTCAP_RXLDPC); | new_vhtcap |= _IEEE80211_SHIFTMASK(val, IEEE80211_VHTCAP_RXLDPC); | ||||
/* Short-GI 80 */ | /* Short-GI 80 */ | ||||
val2 = val1 = MS(vap->iv_vhtcaps, IEEE80211_VHTCAP_SHORT_GI_80); | val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vhtcaps, IEEE80211_VHTCAP_SHORT_GI_80); | ||||
if (opmode == 1) { | if (opmode == 1) { | ||||
val2 = MS(ni->ni_vhtcap, IEEE80211_VHTCAP_SHORT_GI_80); | val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap, IEEE80211_VHTCAP_SHORT_GI_80); | ||||
} | } | ||||
val = MIN(val1, val2); | val = MIN(val1, val2); | ||||
new_vhtcap |= SM(val, IEEE80211_VHTCAP_SHORT_GI_80); | new_vhtcap |= _IEEE80211_SHIFTMASK(val, IEEE80211_VHTCAP_SHORT_GI_80); | ||||
/* Short-GI 160 */ | /* Short-GI 160 */ | ||||
val2 = val1 = MS(vap->iv_vhtcaps, IEEE80211_VHTCAP_SHORT_GI_160); | val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vhtcaps, IEEE80211_VHTCAP_SHORT_GI_160); | ||||
if (opmode == 1) { | if (opmode == 1) { | ||||
val2 = MS(ni->ni_vhtcap, IEEE80211_VHTCAP_SHORT_GI_160); | val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap, IEEE80211_VHTCAP_SHORT_GI_160); | ||||
} | } | ||||
val = MIN(val1, val2); | val = MIN(val1, val2); | ||||
new_vhtcap |= SM(val, IEEE80211_VHTCAP_SHORT_GI_160); | new_vhtcap |= _IEEE80211_SHIFTMASK(val, IEEE80211_VHTCAP_SHORT_GI_160); | ||||
/* | /* | ||||
* STBC is slightly more complicated. | * STBC is slightly more complicated. | ||||
* | * | ||||
* In non-STA mode, we just announce our capabilities and that | * In non-STA mode, we just announce our capabilities and that | ||||
* is that. | * is that. | ||||
* | * | ||||
* In STA mode, we should calculate our capabilities based on | * In STA mode, we should calculate our capabilities based on | ||||
* local capabilities /and/ what the remote says. So: | * local capabilities /and/ what the remote says. So: | ||||
* | * | ||||
* + Only TX STBC if we support it and the remote supports RX STBC; | * + Only TX STBC if we support it and the remote supports RX STBC; | ||||
* + Only announce RX STBC if we support it and the remote supports | * + Only announce RX STBC if we support it and the remote supports | ||||
* TX STBC; | * TX STBC; | ||||
* + RX STBC should be the minimum of local and remote RX STBC; | * + RX STBC should be the minimum of local and remote RX STBC; | ||||
*/ | */ | ||||
/* TX STBC */ | /* TX STBC */ | ||||
val2 = val1 = MS(vap->iv_vhtcaps, IEEE80211_VHTCAP_TXSTBC); | val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vhtcaps, IEEE80211_VHTCAP_TXSTBC); | ||||
if (opmode == 1) { | if (opmode == 1) { | ||||
/* STA mode - enable it only if node RXSTBC is non-zero */ | /* STA mode - enable it only if node RXSTBC is non-zero */ | ||||
val2 = !! MS(ni->ni_vhtcap, IEEE80211_VHTCAP_RXSTBC_MASK); | val2 = !! _IEEE80211_MASKSHIFT(ni->ni_vhtcap, IEEE80211_VHTCAP_RXSTBC_MASK); | ||||
} | } | ||||
val = MIN(val1, val2); | val = MIN(val1, val2); | ||||
/* XXX For now, use the 11n config flag */ | /* XXX For now, use the 11n config flag */ | ||||
if ((vap->iv_flags_ht & IEEE80211_FHT_STBC_TX) == 0) | if ((vap->iv_flags_ht & IEEE80211_FHT_STBC_TX) == 0) | ||||
val = 0; | val = 0; | ||||
new_vhtcap |= SM(val, IEEE80211_VHTCAP_TXSTBC); | new_vhtcap |= _IEEE80211_SHIFTMASK(val, IEEE80211_VHTCAP_TXSTBC); | ||||
/* RX STBC1..4 */ | /* RX STBC1..4 */ | ||||
val2 = val1 = MS(vap->iv_vhtcaps, IEEE80211_VHTCAP_RXSTBC_MASK); | val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vhtcaps, IEEE80211_VHTCAP_RXSTBC_MASK); | ||||
if (opmode == 1) { | if (opmode == 1) { | ||||
/* STA mode - enable it only if node TXSTBC is non-zero */ | /* STA mode - enable it only if node TXSTBC is non-zero */ | ||||
val2 = MS(ni->ni_vhtcap, IEEE80211_VHTCAP_TXSTBC); | val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap, IEEE80211_VHTCAP_TXSTBC); | ||||
} | } | ||||
val = MIN(val1, val2); | val = MIN(val1, val2); | ||||
/* XXX For now, use the 11n config flag */ | /* XXX For now, use the 11n config flag */ | ||||
if ((vap->iv_flags_ht & IEEE80211_FHT_STBC_RX) == 0) | if ((vap->iv_flags_ht & IEEE80211_FHT_STBC_RX) == 0) | ||||
val = 0; | val = 0; | ||||
new_vhtcap |= SM(val, IEEE80211_VHTCAP_RXSTBC_MASK); | new_vhtcap |= _IEEE80211_SHIFTMASK(val, IEEE80211_VHTCAP_RXSTBC_MASK); | ||||
/* | /* | ||||
* Finally - if RXSTBC is 0, then don't enable TXSTBC. | * Finally - if RXSTBC is 0, then don't enable TXSTBC. | ||||
* Strictly speaking a device can TXSTBC and not RXSTBC, but | * Strictly speaking a device can TXSTBC and not RXSTBC, but | ||||
* it would be silly. | * it would be silly. | ||||
*/ | */ | ||||
if (val == 0) | if (val == 0) | ||||
new_vhtcap &= ~IEEE80211_VHTCAP_TXSTBC; | new_vhtcap &= ~IEEE80211_VHTCAP_TXSTBC; | ||||
/* | /* | ||||
* Some of these fields require other fields to exist. | * Some of these fields require other fields to exist. | ||||
* So before using it, the parent field needs to be checked | * So before using it, the parent field needs to be checked | ||||
* otherwise the overridden value may be wrong. | * otherwise the overridden value may be wrong. | ||||
* | * | ||||
* For example, if SU beamformee is set to 0, then BF STS | * For example, if SU beamformee is set to 0, then BF STS | ||||
* needs to be 0. | * needs to be 0. | ||||
*/ | */ | ||||
/* SU Beamformer capable */ | /* SU Beamformer capable */ | ||||
val2 = val1 = MS(vap->iv_vhtcaps, | val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vhtcaps, | ||||
IEEE80211_VHTCAP_SU_BEAMFORMER_CAPABLE); | IEEE80211_VHTCAP_SU_BEAMFORMER_CAPABLE); | ||||
if (opmode == 1) { | if (opmode == 1) { | ||||
val2 = MS(ni->ni_vhtcap, | val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap, | ||||
IEEE80211_VHTCAP_SU_BEAMFORMER_CAPABLE); | IEEE80211_VHTCAP_SU_BEAMFORMER_CAPABLE); | ||||
} | } | ||||
val = MIN(val1, val2); | val = MIN(val1, val2); | ||||
new_vhtcap |= SM(val, IEEE80211_VHTCAP_SU_BEAMFORMER_CAPABLE); | new_vhtcap |= _IEEE80211_SHIFTMASK(val, IEEE80211_VHTCAP_SU_BEAMFORMER_CAPABLE); | ||||
/* SU Beamformee capable */ | /* SU Beamformee capable */ | ||||
val2 = val1 = MS(vap->iv_vhtcaps, | val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vhtcaps, | ||||
IEEE80211_VHTCAP_SU_BEAMFORMEE_CAPABLE); | IEEE80211_VHTCAP_SU_BEAMFORMEE_CAPABLE); | ||||
if (opmode == 1) { | if (opmode == 1) { | ||||
val2 = MS(ni->ni_vhtcap, | val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap, | ||||
IEEE80211_VHTCAP_SU_BEAMFORMEE_CAPABLE); | IEEE80211_VHTCAP_SU_BEAMFORMEE_CAPABLE); | ||||
} | } | ||||
val = MIN(val1, val2); | val = MIN(val1, val2); | ||||
new_vhtcap |= SM(val, IEEE80211_VHTCAP_SU_BEAMFORMEE_CAPABLE); | new_vhtcap |= _IEEE80211_SHIFTMASK(val, IEEE80211_VHTCAP_SU_BEAMFORMEE_CAPABLE); | ||||
/* Beamformee STS capability - only if SU beamformee capable */ | /* Beamformee STS capability - only if SU beamformee capable */ | ||||
val2 = val1 = MS(vap->iv_vhtcaps, IEEE80211_VHTCAP_BEAMFORMEE_STS_MASK); | val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vhtcaps, IEEE80211_VHTCAP_BEAMFORMEE_STS_MASK); | ||||
if (opmode == 1) { | if (opmode == 1) { | ||||
val2 = MS(ni->ni_vhtcap, IEEE80211_VHTCAP_BEAMFORMEE_STS_MASK); | val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap, IEEE80211_VHTCAP_BEAMFORMEE_STS_MASK); | ||||
} | } | ||||
val = MIN(val1, val2); | val = MIN(val1, val2); | ||||
if ((new_vhtcap & IEEE80211_VHTCAP_SU_BEAMFORMEE_CAPABLE) == 0) | if ((new_vhtcap & IEEE80211_VHTCAP_SU_BEAMFORMEE_CAPABLE) == 0) | ||||
val = 0; | val = 0; | ||||
new_vhtcap |= SM(val, IEEE80211_VHTCAP_BEAMFORMEE_STS_MASK); | new_vhtcap |= _IEEE80211_SHIFTMASK(val, IEEE80211_VHTCAP_BEAMFORMEE_STS_MASK); | ||||
/* Sounding dimensions - only if SU beamformer capable */ | /* Sounding dimensions - only if SU beamformer capable */ | ||||
val2 = val1 = MS(vap->iv_vhtcaps, | val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vhtcaps, | ||||
IEEE80211_VHTCAP_SOUNDING_DIMENSIONS_MASK); | IEEE80211_VHTCAP_SOUNDING_DIMENSIONS_MASK); | ||||
if (opmode == 1) | if (opmode == 1) | ||||
val2 = MS(ni->ni_vhtcap, | val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap, | ||||
IEEE80211_VHTCAP_SOUNDING_DIMENSIONS_MASK); | IEEE80211_VHTCAP_SOUNDING_DIMENSIONS_MASK); | ||||
val = MIN(val1, val2); | val = MIN(val1, val2); | ||||
if ((new_vhtcap & IEEE80211_VHTCAP_SU_BEAMFORMER_CAPABLE) == 0) | if ((new_vhtcap & IEEE80211_VHTCAP_SU_BEAMFORMER_CAPABLE) == 0) | ||||
val = 0; | val = 0; | ||||
new_vhtcap |= SM(val, IEEE80211_VHTCAP_SOUNDING_DIMENSIONS_MASK); | new_vhtcap |= _IEEE80211_SHIFTMASK(val, IEEE80211_VHTCAP_SOUNDING_DIMENSIONS_MASK); | ||||
/* | /* | ||||
* MU Beamformer capable - only if SU BFF capable, MU BFF capable | * MU Beamformer capable - only if SU BFF capable, MU BFF capable | ||||
* and STA (not AP) | * and STA (not AP) | ||||
*/ | */ | ||||
val2 = val1 = MS(vap->iv_vhtcaps, | val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vhtcaps, | ||||
IEEE80211_VHTCAP_MU_BEAMFORMER_CAPABLE); | IEEE80211_VHTCAP_MU_BEAMFORMER_CAPABLE); | ||||
if (opmode == 1) | if (opmode == 1) | ||||
val2 = MS(ni->ni_vhtcap, | val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap, | ||||
IEEE80211_VHTCAP_MU_BEAMFORMER_CAPABLE); | IEEE80211_VHTCAP_MU_BEAMFORMER_CAPABLE); | ||||
val = MIN(val1, val2); | val = MIN(val1, val2); | ||||
if ((new_vhtcap & IEEE80211_VHTCAP_SU_BEAMFORMER_CAPABLE) == 0) | if ((new_vhtcap & IEEE80211_VHTCAP_SU_BEAMFORMER_CAPABLE) == 0) | ||||
val = 0; | val = 0; | ||||
if (opmode != 1) /* Only enable for STA mode */ | if (opmode != 1) /* Only enable for STA mode */ | ||||
val = 0; | val = 0; | ||||
new_vhtcap |= SM(val, IEEE80211_VHTCAP_SU_BEAMFORMER_CAPABLE); | new_vhtcap |= _IEEE80211_SHIFTMASK(val, IEEE80211_VHTCAP_SU_BEAMFORMER_CAPABLE); | ||||
/* | /* | ||||
* MU Beamformee capable - only if SU BFE capable, MU BFE capable | * MU Beamformee capable - only if SU BFE capable, MU BFE capable | ||||
* and AP (not STA) | * and AP (not STA) | ||||
*/ | */ | ||||
val2 = val1 = MS(vap->iv_vhtcaps, | val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vhtcaps, | ||||
IEEE80211_VHTCAP_MU_BEAMFORMEE_CAPABLE); | IEEE80211_VHTCAP_MU_BEAMFORMEE_CAPABLE); | ||||
if (opmode == 1) | if (opmode == 1) | ||||
val2 = MS(ni->ni_vhtcap, | val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap, | ||||
IEEE80211_VHTCAP_MU_BEAMFORMEE_CAPABLE); | IEEE80211_VHTCAP_MU_BEAMFORMEE_CAPABLE); | ||||
val = MIN(val1, val2); | val = MIN(val1, val2); | ||||
if ((new_vhtcap & IEEE80211_VHTCAP_SU_BEAMFORMEE_CAPABLE) == 0) | if ((new_vhtcap & IEEE80211_VHTCAP_SU_BEAMFORMEE_CAPABLE) == 0) | ||||
val = 0; | val = 0; | ||||
if (opmode != 0) /* Only enable for AP mode */ | if (opmode != 0) /* Only enable for AP mode */ | ||||
val = 0; | val = 0; | ||||
new_vhtcap |= SM(val, IEEE80211_VHTCAP_SU_BEAMFORMEE_CAPABLE); | new_vhtcap |= _IEEE80211_SHIFTMASK(val, IEEE80211_VHTCAP_SU_BEAMFORMEE_CAPABLE); | ||||
/* VHT TXOP PS */ | /* VHT TXOP PS */ | ||||
val2 = val1 = MS(vap->iv_vhtcaps, IEEE80211_VHTCAP_VHT_TXOP_PS); | val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vhtcaps, IEEE80211_VHTCAP_VHT_TXOP_PS); | ||||
if (opmode == 1) | if (opmode == 1) | ||||
val2 = MS(ni->ni_vhtcap, IEEE80211_VHTCAP_VHT_TXOP_PS); | val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap, IEEE80211_VHTCAP_VHT_TXOP_PS); | ||||
val = MIN(val1, val2); | val = MIN(val1, val2); | ||||
new_vhtcap |= SM(val, IEEE80211_VHTCAP_VHT_TXOP_PS); | new_vhtcap |= _IEEE80211_SHIFTMASK(val, IEEE80211_VHTCAP_VHT_TXOP_PS); | ||||
/* HTC_VHT */ | /* HTC_VHT */ | ||||
val2 = val1 = MS(vap->iv_vhtcaps, IEEE80211_VHTCAP_HTC_VHT); | val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vhtcaps, IEEE80211_VHTCAP_HTC_VHT); | ||||
if (opmode == 1) | if (opmode == 1) | ||||
val2 = MS(ni->ni_vhtcap, IEEE80211_VHTCAP_HTC_VHT); | val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap, IEEE80211_VHTCAP_HTC_VHT); | ||||
val = MIN(val1, val2); | val = MIN(val1, val2); | ||||
new_vhtcap |= SM(val, IEEE80211_VHTCAP_HTC_VHT); | new_vhtcap |= _IEEE80211_SHIFTMASK(val, IEEE80211_VHTCAP_HTC_VHT); | ||||
/* A-MPDU length max */ | /* A-MPDU length max */ | ||||
/* XXX TODO: we need a userland config knob for this */ | /* XXX TODO: we need a userland config knob for this */ | ||||
val2 = val1 = MS(vap->iv_vhtcaps, | val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vhtcaps, | ||||
IEEE80211_VHTCAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK); | IEEE80211_VHTCAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK); | ||||
if (opmode == 1) | if (opmode == 1) | ||||
val2 = MS(ni->ni_vhtcap, | val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap, | ||||
IEEE80211_VHTCAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK); | IEEE80211_VHTCAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK); | ||||
val = MIN(val1, val2); | val = MIN(val1, val2); | ||||
new_vhtcap |= SM(val, IEEE80211_VHTCAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK); | new_vhtcap |= _IEEE80211_SHIFTMASK(val, IEEE80211_VHTCAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK); | ||||
/* | /* | ||||
* Link adaptation is only valid if HTC-VHT capable is 1. | * Link adaptation is only valid if HTC-VHT capable is 1. | ||||
* Otherwise, always set it to 0. | * Otherwise, always set it to 0. | ||||
*/ | */ | ||||
val2 = val1 = MS(vap->iv_vhtcaps, | val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vhtcaps, | ||||
IEEE80211_VHTCAP_VHT_LINK_ADAPTATION_VHT_MASK); | IEEE80211_VHTCAP_VHT_LINK_ADAPTATION_VHT_MASK); | ||||
if (opmode == 1) | if (opmode == 1) | ||||
val2 = MS(ni->ni_vhtcap, | val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap, | ||||
IEEE80211_VHTCAP_VHT_LINK_ADAPTATION_VHT_MASK); | IEEE80211_VHTCAP_VHT_LINK_ADAPTATION_VHT_MASK); | ||||
val = MIN(val1, val2); | val = MIN(val1, val2); | ||||
if ((new_vhtcap & IEEE80211_VHTCAP_HTC_VHT) == 0) | if ((new_vhtcap & IEEE80211_VHTCAP_HTC_VHT) == 0) | ||||
val = 0; | val = 0; | ||||
new_vhtcap |= SM(val, IEEE80211_VHTCAP_VHT_LINK_ADAPTATION_VHT_MASK); | new_vhtcap |= _IEEE80211_SHIFTMASK(val, IEEE80211_VHTCAP_VHT_LINK_ADAPTATION_VHT_MASK); | ||||
/* | /* | ||||
* The following two options are 0 if the pattern may change, 1 if it | * The following two options are 0 if the pattern may change, 1 if it | ||||
* does not change. So, downgrade to the higher value. | * does not change. So, downgrade to the higher value. | ||||
*/ | */ | ||||
/* RX antenna pattern */ | /* RX antenna pattern */ | ||||
val2 = val1 = MS(vap->iv_vhtcaps, IEEE80211_VHTCAP_RX_ANTENNA_PATTERN); | val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vhtcaps, IEEE80211_VHTCAP_RX_ANTENNA_PATTERN); | ||||
if (opmode == 1) | if (opmode == 1) | ||||
val2 = MS(ni->ni_vhtcap, IEEE80211_VHTCAP_RX_ANTENNA_PATTERN); | val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap, IEEE80211_VHTCAP_RX_ANTENNA_PATTERN); | ||||
val = MAX(val1, val2); | val = MAX(val1, val2); | ||||
new_vhtcap |= SM(val, IEEE80211_VHTCAP_RX_ANTENNA_PATTERN); | new_vhtcap |= _IEEE80211_SHIFTMASK(val, IEEE80211_VHTCAP_RX_ANTENNA_PATTERN); | ||||
/* TX antenna pattern */ | /* TX antenna pattern */ | ||||
val2 = val1 = MS(vap->iv_vhtcaps, IEEE80211_VHTCAP_TX_ANTENNA_PATTERN); | val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vhtcaps, IEEE80211_VHTCAP_TX_ANTENNA_PATTERN); | ||||
if (opmode == 1) | if (opmode == 1) | ||||
val2 = MS(ni->ni_vhtcap, IEEE80211_VHTCAP_TX_ANTENNA_PATTERN); | val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap, IEEE80211_VHTCAP_TX_ANTENNA_PATTERN); | ||||
val = MAX(val1, val2); | val = MAX(val1, val2); | ||||
new_vhtcap |= SM(val, IEEE80211_VHTCAP_TX_ANTENNA_PATTERN); | new_vhtcap |= _IEEE80211_SHIFTMASK(val, IEEE80211_VHTCAP_TX_ANTENNA_PATTERN); | ||||
/* | /* | ||||
* MCS set - again, we announce what we want to use | * MCS set - again, we announce what we want to use | ||||
* based on configuration, device capabilities and | * based on configuration, device capabilities and | ||||
* already-learnt vhtcap/vhtinfo IE information. | * already-learnt vhtcap/vhtinfo IE information. | ||||
*/ | */ | ||||
/* MCS set - start with whatever the device supports */ | /* MCS set - start with whatever the device supports */ | ||||
▲ Show 20 Lines • Show All 225 Lines • Show Last 20 Lines |