blob: 4cea8f1df4bc22f47de273b86bba2f5983d64682 [file] [log] [blame]
/*
* Fundamental types and constants relating to 802.11ac -
* "Enhancements for Very High Throughput for Operation in Bands below 6 GHz"
*
* VHT - Very High Throughput
* OPER_MODE - Operating Mode
*
* Copyright (C) 2024, Broadcom.
*
* Unless you and Broadcom execute a separate written software license
* agreement governing use of this software, this software is licensed to you
* under the terms of the GNU General Public License version 2 (the "GPL"),
* available at http://www.broadcom.com/licenses/GPLv2.php, with the
* following added to such license:
*
* As a special exception, the copyright holders of this software give you
* permission to link this software with independent modules, and to copy and
* distribute the resulting executable under terms of your choice, provided that
* you also meet, for each linked independent module, the terms and conditions of
* the license of that module. An independent module is a module which is not
* derived from this software. The special exception does not apply to any
* modifications of the software.
*
*
* <<Broadcom-WL-IPTag/Dual:>>
*/
#ifndef _802_11ac_h_
#define _802_11ac_h_
#ifndef _TYPEDEFS_H_
#include <typedefs.h>
#endif
#ifndef _NET_ETHERNET_H_
#include <ethernet.h>
#endif
/* This marks the start of a packed structure section. */
#include <packed_section_start.h>
BWL_PRE_PACKED_STRUCT struct dot11_action_vht_oper_mode {
uint8 category;
uint8 action;
uint8 mode;
} BWL_POST_PACKED_STRUCT;
/* These lengths assume 64 MU groups, as specified in 802.11ac-2013 */
#define DOT11_ACTION_GID_MEMBERSHIP_LEN 8 /* bytes */
#define DOT11_ACTION_GID_USER_POS_LEN 16 /* bytes */
BWL_PRE_PACKED_STRUCT struct dot11_action_group_id {
uint8 category;
uint8 action;
uint8 membership_status[DOT11_ACTION_GID_MEMBERSHIP_LEN];
uint8 user_position[DOT11_ACTION_GID_USER_POS_LEN];
} BWL_POST_PACKED_STRUCT;
/** Wide Bandwidth Channel Switch IE data structure */
BWL_PRE_PACKED_STRUCT struct dot11_wide_bw_channel_switch {
uint8 id; /* id DOT11_MNG_WIDE_BW_CHANNEL_SWITCH_ID */
uint8 len; /* length of IE */
uint8 channel_width; /* new channel width */
uint8 center_frequency_segment_0; /* center frequency segment 0 */
uint8 center_frequency_segment_1; /* center frequency segment 1 */
} BWL_POST_PACKED_STRUCT;
typedef struct dot11_wide_bw_channel_switch dot11_wide_bw_chan_switch_ie_t;
#define DOT11_WIDE_BW_SWITCH_IE_LEN 3 /* length of IE data, not including 2 byte header */
/** Channel Switch Wrapper IE data structure */
BWL_PRE_PACKED_STRUCT struct dot11_channel_switch_wrapper {
uint8 id; /* id DOT11_MNG_WIDE_BW_CHANNEL_SWITCH_ID */
uint8 len; /* length of IE */
dot11_wide_bw_chan_switch_ie_t wb_chan_switch_ie;
} BWL_POST_PACKED_STRUCT;
typedef struct dot11_channel_switch_wrapper dot11_chan_switch_wrapper_ie_t;
/* Proposed wide bandwidth channel IE */
typedef enum wide_bw_chan_width {
WIDE_BW_CHAN_WIDTH_20 = 0,
WIDE_BW_CHAN_WIDTH_40 = 1,
WIDE_BW_CHAN_WIDTH_80 = 2,
WIDE_BW_CHAN_WIDTH_160 = 3,
WIDE_BW_CHAN_WIDTH_80_80 = 4
} wide_bw_chan_width_t;
/** Wide Bandwidth Channel IE data structure */
BWL_PRE_PACKED_STRUCT struct dot11_wide_bw_channel {
uint8 id; /* id DOT11_MNG_WIDE_BW_CHANNEL_ID */
uint8 len; /* length of IE */
uint8 channel_width; /* channel width */
uint8 center_frequency_segment_0; /* center frequency segment 0 */
uint8 center_frequency_segment_1; /* center frequency segment 1 */
} BWL_POST_PACKED_STRUCT;
typedef struct dot11_wide_bw_channel dot11_wide_bw_chan_ie_t;
#define DOT11_WIDE_BW_IE_LEN 3 /* length of IE data, not including 2 byte header */
/** VHT Transmit Power Envelope IE data structure */
BWL_PRE_PACKED_STRUCT struct dot11_vht_transmit_power_envelope {
uint8 id; /* id DOT11_MNG_WIDE_BW_CHANNEL_SWITCH_ID */
uint8 len; /* length of IE */
uint8 transmit_power_info;
uint8 local_max_transmit_power_20;
} BWL_POST_PACKED_STRUCT;
typedef struct dot11_vht_transmit_power_envelope dot11_vht_transmit_power_envelope_ie_t;
/* vht transmit power envelope IE length depends on channel width */
#define DOT11_VHT_TRANSMIT_PWR_ENVELOPE_IE_LEN_40MHZ 1
#define DOT11_VHT_TRANSMIT_PWR_ENVELOPE_IE_LEN_80MHZ 2
#define DOT11_VHT_TRANSMIT_PWR_ENVELOPE_IE_LEN_160MHZ 3
/* VHT Operating mode bit fields - (11ac D8.0/802.11-2016 - 9.4.1.53) */
#define DOT11_OPER_MODE_CHANNEL_WIDTH_SHIFT 0
#define DOT11_OPER_MODE_CHANNEL_WIDTH_MASK 0x3
#define DOT11_OPER_MODE_160_8080_BW_SHIFT 2
#define DOT11_OPER_MODE_160_8080_BW_MASK 0x04
#define DOT11_OPER_MODE_NOLDPC_SHIFT 3
#define DOT11_OPER_MODE_NOLDPC_MASK 0x08
#define DOT11_OPER_MODE_RXNSS_SHIFT 4
#define DOT11_OPER_MODE_RXNSS_MASK 0x70
#define DOT11_OPER_MODE_RXNSS_TYPE_SHIFT 7
#define DOT11_OPER_MODE_RXNSS_TYPE_MASK 0x80
#define DOT11_OPER_MODE_RESET_CHAN_WIDTH_160MHZ(oper_mode) \
(oper_mode & (~(DOT11_OPER_MODE_CHANNEL_WIDTH_MASK | \
DOT11_OPER_MODE_160_8080_BW_MASK)))
#define DOT11_OPER_MODE_SET_CHAN_WIDTH_160MHZ(oper_mode) \
(oper_mode = (DOT11_OPER_MODE_RESET_CHAN_WIDTH_160MHZ(oper_mode) | \
(DOT11_OPER_MODE_80MHZ | DOT11_OPER_MODE_160_8080_BW_MASK)))
#ifdef DOT11_OPER_MODE_LEFT_SHIFT_FIX
#define DOT11_OPER_MODE(type, nss, chanw) (\
((type) << DOT11_OPER_MODE_RXNSS_TYPE_SHIFT &\
DOT11_OPER_MODE_RXNSS_TYPE_MASK) |\
(((nss) - 1u) << DOT11_OPER_MODE_RXNSS_SHIFT & DOT11_OPER_MODE_RXNSS_MASK) |\
((chanw) << DOT11_OPER_MODE_CHANNEL_WIDTH_SHIFT &\
DOT11_OPER_MODE_CHANNEL_WIDTH_MASK))
#define DOT11_D8_OPER_MODE(type, nss, ldpc, bw160_8080, chanw) (\
((type) << DOT11_OPER_MODE_RXNSS_TYPE_SHIFT &\
DOT11_OPER_MODE_RXNSS_TYPE_MASK) |\
(((nss) - 1u) << DOT11_OPER_MODE_RXNSS_SHIFT & DOT11_OPER_MODE_RXNSS_MASK) |\
((ldpc) << DOT11_OPER_MODE_NOLDPC_SHIFT & DOT11_OPER_MODE_NOLDPC_MASK) |\
((bw160_8080) << DOT11_OPER_MODE_160_8080_BW_SHIFT &\
DOT11_OPER_MODE_160_8080_BW_MASK) |\
((chanw) << DOT11_OPER_MODE_CHANNEL_WIDTH_SHIFT &\
DOT11_OPER_MODE_CHANNEL_WIDTH_MASK))
#else
/* avoid invalidation from above fix on release branches, can be removed when older release
* branches no longer use component/proto from trunk
*/
#define DOT11_OPER_MODE(type, nss, chanw) (\
((type) << DOT11_OPER_MODE_RXNSS_TYPE_SHIFT &\
DOT11_OPER_MODE_RXNSS_TYPE_MASK) |\
(((nss) - 1) << DOT11_OPER_MODE_RXNSS_SHIFT & DOT11_OPER_MODE_RXNSS_MASK) |\
((chanw) << DOT11_OPER_MODE_CHANNEL_WIDTH_SHIFT &\
DOT11_OPER_MODE_CHANNEL_WIDTH_MASK))
#define DOT11_D8_OPER_MODE(type, nss, ldpc, bw160_8080, chanw) (\
((type) << DOT11_OPER_MODE_RXNSS_TYPE_SHIFT &\
DOT11_OPER_MODE_RXNSS_TYPE_MASK) |\
(((nss) - 1) << DOT11_OPER_MODE_RXNSS_SHIFT & DOT11_OPER_MODE_RXNSS_MASK) |\
((ldpc) << DOT11_OPER_MODE_NOLDPC_SHIFT & DOT11_OPER_MODE_NOLDPC_MASK) |\
((bw160_8080) << DOT11_OPER_MODE_160_8080_BW_SHIFT &\
DOT11_OPER_MODE_160_8080_BW_MASK) |\
((chanw) << DOT11_OPER_MODE_CHANNEL_WIDTH_SHIFT &\
DOT11_OPER_MODE_CHANNEL_WIDTH_MASK))
#endif /* DOT11_OPER_MODE_LEFT_SHIFT_FIX */
#define DOT11_OPER_MODE_CHANNEL_WIDTH(mode) \
(((mode) & DOT11_OPER_MODE_CHANNEL_WIDTH_MASK)\
>> DOT11_OPER_MODE_CHANNEL_WIDTH_SHIFT)
#define DOT11_OPER_MODE_160_8080(mode) \
(((mode) & DOT11_OPER_MODE_160_8080_BW_MASK)\
>> DOT11_OPER_MODE_160_8080_BW_SHIFT)
#define DOT11_OPER_MODE_NOLDPC(mode) \
(((mode) & DOT11_OPER_MODE_NOLDPC_MASK)\
>> DOT11_OPER_MODE_NOLDPC_SHIFT)
#define DOT11_OPER_MODE_RXNSS(mode) \
((((mode) & DOT11_OPER_MODE_RXNSS_MASK) \
>> DOT11_OPER_MODE_RXNSS_SHIFT) + 1)
#define DOT11_OPER_MODE_RXNSS_TYPE(mode) \
(((mode) & DOT11_OPER_MODE_RXNSS_TYPE_MASK)\
>> DOT11_OPER_MODE_RXNSS_TYPE_SHIFT)
#define DOT11_OPER_MODE_20MHZ 0
#define DOT11_OPER_MODE_40MHZ 1
#define DOT11_OPER_MODE_80MHZ 2
#define DOT11_OPER_MODE_160MHZ 3
#define DOT11_OPER_MODE_8080MHZ 3
#define DOT11_OPER_MODE_1608080MHZ 1
#define DOT11_OPER_MODE_CHANNEL_WIDTH_20MHZ(mode) (\
((mode) & DOT11_OPER_MODE_CHANNEL_WIDTH_MASK) == DOT11_OPER_MODE_20MHZ)
#define DOT11_OPER_MODE_CHANNEL_WIDTH_40MHZ(mode) (\
((mode) & DOT11_OPER_MODE_CHANNEL_WIDTH_MASK) == DOT11_OPER_MODE_40MHZ)
#define DOT11_OPER_MODE_CHANNEL_WIDTH_80MHZ(mode) (\
((mode) & DOT11_OPER_MODE_CHANNEL_WIDTH_MASK) == DOT11_OPER_MODE_80MHZ)
#define DOT11_OPER_MODE_CHANNEL_WIDTH_160MHZ(mode) (\
((mode) & DOT11_OPER_MODE_160_8080_BW_MASK))
#define DOT11_OPER_MODE_CHANNEL_WIDTH_8080MHZ(mode) (\
((mode) & DOT11_OPER_MODE_160_8080_BW_MASK))
/* Operating mode information element 802.11ac D3.0 - 8.4.2.168 */
BWL_PRE_PACKED_STRUCT struct dot11_oper_mode_notif_ie {
uint8 mode;
} BWL_POST_PACKED_STRUCT;
typedef struct dot11_oper_mode_notif_ie dot11_oper_mode_notif_ie_t;
#define DOT11_OPER_MODE_NOTIF_IE_LEN 1
/* VHT category action types - 802.11ac D3.0 - 8.5.23.1 */
#define DOT11_VHT_ACTION_CBF 0 /* Compressed Beamforming */
#define DOT11_VHT_ACTION_GID_MGMT 1 /* Group ID Management */
#define DOT11_VHT_ACTION_OPER_MODE_NOTIF 2 /* Operating mode notif'n */
/* 802.11 VHT constants */
typedef int vht_group_id_t;
/* for VHT-A1 */
/* SIG-A1 reserved bits */
#define VHT_SIGA1_CONST_MASK 0x800004
#define VHT_SIGA1_BW_MASK 0x000003
#define VHT_SIGA1_20MHZ_VAL 0x000000
#define VHT_SIGA1_40MHZ_VAL 0x000001
#define VHT_SIGA1_80MHZ_VAL 0x000002
#define VHT_SIGA1_160MHZ_VAL 0x000003
#define VHT_SIGA1_STBC 0x000008
#define VHT_SIGA1_GID_MASK 0x0003f0
#define VHT_SIGA1_GID_SHIFT 4
#define VHT_SIGA1_GID_TO_AP 0x00
#define VHT_SIGA1_GID_NOT_TO_AP 0x3f
#define VHT_SIGA1_GID_MAX_GID 0x3f
#define VHT_SIGA1_NSTS_SHIFT_MASK_USER0 0x001C00
#define VHT_SIGA1_NSTS_SHIFT 10
#define VHT_SIGA1_MAX_USERPOS 3
#define VHT_SIGA1_PARTIAL_AID_MASK 0x3fe000
#define VHT_SIGA1_PARTIAL_AID_SHIFT 13
#define VHT_SIGA1_TXOP_PS_NOT_ALLOWED 0x400000
/* for VHT-A2 */
#define VHT_SIGA2_GI_NONE 0x000000
#define VHT_SIGA2_GI_SHORT 0x000001
#define VHT_SIGA2_GI_W_MOD10 0x000002
#define VHT_SIGA2_CODING_LDPC 0x000004
#define VHT_SIGA2_LDPC_EXTRA_OFDM_SYM 0x000008
#define VHT_SIGA2_BEAMFORM_ENABLE 0x000100
#define VHT_SIGA2_MCS_SHIFT 4
#define VHT_SIGA2_B9_RESERVED 0x000200
#define VHT_SIGA2_TAIL_MASK 0xfc0000
#define VHT_SIGA2_TAIL_VALUE 0x000000
/* VHT Timing-related parameters (802.11ac D4.0, sec 22.3.6) */
#define VHT_T_LEG_PREAMBLE 16
#define VHT_T_L_SIG 4
#define VHT_T_SIG_A 8
#define VHT_T_LTF 4
#define VHT_T_STF 4
#define VHT_T_SIG_B 4
#define VHT_T_SYML 4
#define VHT_N_SERVICE 16 /* bits in SERVICE field */
#define VHT_N_TAIL 6 /* tail bits per BCC encoder */
#define VHT_MAX_MPDU 11454 /* max mpdu size for now (bytes) */
#define VHT_MPDU_MSDU_DELTA 56 /* Difference in spec - vht mpdu, amsdu len */
/* Max AMSDU len - per spec */
#define VHT_MAX_AMSDU (VHT_MAX_MPDU - VHT_MPDU_MSDU_DELTA)
/* ************* VHT definitions. ************* */
/**
* VHT Capabilites IE (sec 8.4.2.160)
*/
BWL_PRE_PACKED_STRUCT struct vht_cap_ie {
uint32 vht_cap_info;
/* supported MCS set - 64 bit field */
uint16 rx_mcs_map;
uint16 rx_max_rate;
uint16 tx_mcs_map;
uint16 tx_max_rate;
} BWL_POST_PACKED_STRUCT;
typedef struct vht_cap_ie vht_cap_ie_t;
/* 4B cap_info + 8B supp_mcs */
#define VHT_CAP_IE_LEN 12
/* VHT Capabilities Info field - 32bit - in VHT Cap IE */
#define VHT_CAP_INFO_MAX_MPDU_LEN_MASK 0x00000003
#define VHT_CAP_INFO_SUPP_CHAN_WIDTH_MASK 0x0000000c
#define VHT_CAP_INFO_LDPC 0x00000010
#define VHT_CAP_INFO_SGI_80MHZ 0x00000020
#define VHT_CAP_INFO_SGI_160MHZ 0x00000040
#define VHT_CAP_INFO_TX_STBC 0x00000080
#define VHT_CAP_INFO_RX_STBC_MASK 0x00000700
#define VHT_CAP_INFO_RX_STBC_SHIFT 8u
#define VHT_CAP_INFO_SU_BEAMFMR 0x00000800
#define VHT_CAP_INFO_SU_BEAMFMEE 0x00001000
#define VHT_CAP_INFO_NUM_BMFMR_ANT_MASK 0x0000e000
#define VHT_CAP_INFO_NUM_BMFMR_ANT_SHIFT 13u
#define VHT_CAP_INFO_NUM_SOUNDING_DIM_MASK 0x00070000
#define VHT_CAP_INFO_NUM_SOUNDING_DIM_SHIFT 16u
#define VHT_CAP_INFO_MU_BEAMFMR 0x00080000
#define VHT_CAP_INFO_MU_BEAMFMEE 0x00100000
#define VHT_CAP_INFO_TXOPPS 0x00200000
#define VHT_CAP_INFO_HTCVHT 0x00400000
#define VHT_CAP_INFO_AMPDU_MAXLEN_EXP_MASK 0x03800000
#define VHT_CAP_INFO_AMPDU_MAXLEN_EXP_SHIFT 23u
#define VHT_CAP_INFO_LINK_ADAPT_CAP_MASK 0x0c000000
#define VHT_CAP_INFO_LINK_ADAPT_CAP_SHIFT 26u
#define VHT_CAP_INFO_EXT_NSS_BW_SUP_MASK 0xc0000000
#define VHT_CAP_INFO_EXT_NSS_BW_SUP_SHIFT 30u
/* get Extended NSS BW Support passing vht cap info */
#define VHT_CAP_EXT_NSS_BW_SUP(cap_info) \
(((cap_info) & VHT_CAP_INFO_EXT_NSS_BW_SUP_MASK) >> VHT_CAP_INFO_EXT_NSS_BW_SUP_SHIFT)
/* VHT CAP INFO extended NSS BW support - refer to IEEE 802.11 REVmc D8.0 Figure 9-559 */
#define VHT_CAP_INFO_EXT_NSS_BW_HALF_160 1 /* 160MHz at half NSS CAP */
#define VHT_CAP_INFO_EXT_NSS_BW_HALF_160_80P80 2 /* 160 & 80p80 MHz at half NSS CAP */
/* VHT Supported MCS Set - 64-bit - in VHT Cap IE */
#define VHT_CAP_SUPP_MCS_RX_HIGHEST_RATE_MASK 0x1fff
#define VHT_CAP_SUPP_MCS_RX_HIGHEST_RATE_SHIFT 0
#define VHT_CAP_SUPP_MCS_TX_HIGHEST_RATE_MASK 0x1fff
#define VHT_CAP_SUPP_MCS_TX_HIGHEST_RATE_SHIFT 0
/* defines for field(s) in vht_cap_ie->rx_max_rate */
#define VHT_CAP_MAX_NSTS_MASK 0xe000
#define VHT_CAP_MAX_NSTS_SHIFT 13
/* defines for field(s) in vht_cap_ie->tx_max_rate */
#define VHT_CAP_EXT_NSS_BW_CAP 0x2000
#define VHT_CAP_MCS_MAP_0_7 0
#define VHT_CAP_MCS_MAP_0_8 1
#define VHT_CAP_MCS_MAP_0_9 2
#define VHT_CAP_MCS_MAP_NONE 3
#define VHT_CAP_MCS_MAP_S 2 /* num bits for 1-stream */
#define VHT_CAP_MCS_MAP_M 0x3 /* mask for 1-stream */
/* assumes VHT_CAP_MCS_MAP_NONE is 3 and 2 bits are used for encoding */
#define VHT_CAP_MCS_MAP_NONE_ALL 0xffff
/* VHT rates bitmap */
#define VHT_CAP_MCS_0_7_RATEMAP 0x00ff
#define VHT_CAP_MCS_0_8_RATEMAP 0x01ff
#define VHT_CAP_MCS_0_9_RATEMAP 0x03ff
#define VHT_CAP_MCS_FULL_RATEMAP VHT_CAP_MCS_0_9_RATEMAP
#define VHT_PROP_MCS_MAP_10_11 0
#define VHT_PROP_MCS_MAP_UNUSED1 1
#define VHT_PROP_MCS_MAP_UNUSED2 2
#define VHT_PROP_MCS_MAP_NONE 3
#define VHT_PROP_MCS_MAP_NONE_ALL 0xffff
/* VHT prop rates bitmap */
#define VHT_PROP_MCS_10_11_RATEMAP 0x0c00
#define VHT_PROP_MCS_FULL_RATEMAP VHT_PROP_MCS_10_11_RATEMAP
#if !defined(VHT_CAP_MCS_MAP_0_9_NSS3)
/* remove after moving define to wlc_rate.h */
/* mcsmap with MCS0-9 for Nss = 3 */
#define VHT_CAP_MCS_MAP_0_9_NSS3 \
((VHT_CAP_MCS_MAP_0_9 << VHT_MCS_MAP_GET_SS_IDX(1)) | \
(VHT_CAP_MCS_MAP_0_9 << VHT_MCS_MAP_GET_SS_IDX(2)) | \
(VHT_CAP_MCS_MAP_0_9 << VHT_MCS_MAP_GET_SS_IDX(3)))
#endif /* !VHT_CAP_MCS_MAP_0_9_NSS3 */
#define VHT_CAP_MCS_MAP_NSS_MAX 8
/* get mcsmap with given mcs for given nss streams */
#define VHT_CAP_MCS_MAP_CREATE(mcsmap, nss, mcs) \
do { \
int i; \
for (i = 1; i <= nss; i++) { \
VHT_MCS_MAP_SET_MCS_PER_SS(i, mcs, mcsmap); \
} \
} while (0)
/* Map the mcs code to mcs bit map */
#define VHT_MCS_CODE_TO_MCS_MAP(mcs_code) \
((mcs_code == VHT_CAP_MCS_MAP_0_7) ? VHT_CAP_MCS_0_7_RATEMAP : \
(mcs_code == VHT_CAP_MCS_MAP_0_8) ? VHT_CAP_MCS_0_8_RATEMAP : \
(mcs_code == VHT_CAP_MCS_MAP_0_9) ? VHT_CAP_MCS_0_9_RATEMAP : 0)
/* Map the proprietary mcs code to proprietary mcs bitmap */
#define VHT_PROP_MCS_CODE_TO_PROP_MCS_MAP(mcs_code) \
((mcs_code == VHT_PROP_MCS_MAP_10_11) ? VHT_PROP_MCS_10_11_RATEMAP : 0)
/* Map the mcs bit map to mcs code */
#define VHT_MCS_MAP_TO_MCS_CODE(mcs_map) \
((mcs_map == VHT_CAP_MCS_0_7_RATEMAP) ? VHT_CAP_MCS_MAP_0_7 : \
(mcs_map == VHT_CAP_MCS_0_8_RATEMAP) ? VHT_CAP_MCS_MAP_0_8 : \
(mcs_map == VHT_CAP_MCS_0_9_RATEMAP) ? VHT_CAP_MCS_MAP_0_9 : VHT_CAP_MCS_MAP_NONE)
/* Map the proprietary mcs map to proprietary mcs code */
#define VHT_PROP_MCS_MAP_TO_PROP_MCS_CODE(mcs_map) \
(((mcs_map & 0xc00) == 0xc00) ? VHT_PROP_MCS_MAP_10_11 : VHT_PROP_MCS_MAP_NONE)
/** VHT Capabilities Supported Channel Width */
typedef enum vht_cap_chan_width {
VHT_CAP_CHAN_WIDTH_SUPPORT_MANDATORY = 0x00,
VHT_CAP_CHAN_WIDTH_SUPPORT_160 = 0x04,
VHT_CAP_CHAN_WIDTH_SUPPORT_160_8080 = 0x08
} vht_cap_chan_width_t;
/** VHT Capabilities Supported max MPDU LEN (sec 8.4.2.160.2) */
typedef enum vht_cap_max_mpdu_len {
VHT_CAP_MPDU_MAX_4K = 0x00,
VHT_CAP_MPDU_MAX_8K = 0x01,
VHT_CAP_MPDU_MAX_11K = 0x02
} vht_cap_max_mpdu_len_t;
/* Maximum MPDU Length byte counts for the VHT Capabilities advertised limits */
#define VHT_MPDU_LIMIT_4K 3895
#define VHT_MPDU_LIMIT_8K 7991
#define VHT_MPDU_LIMIT_11K 11454
/**
* VHT Operation IE (sec 8.4.2.161)
*/
BWL_PRE_PACKED_STRUCT struct vht_op_ie {
uint8 chan_width;
uint8 chan1;
uint8 chan2;
uint16 supp_mcs; /* same def as above in vht cap */
} BWL_POST_PACKED_STRUCT;
typedef struct vht_op_ie vht_op_ie_t;
/* 3B VHT Op info + 2B Basic MCS */
#define VHT_OP_IE_LEN 5
typedef enum vht_op_chan_width {
VHT_OP_CHAN_WIDTH_20_40 = 0,
VHT_OP_CHAN_WIDTH_80 = 1,
VHT_OP_CHAN_WIDTH_160 = 2, /* deprecated - IEEE 802.11 REVmc D8.0 Table 11-25 */
VHT_OP_CHAN_WIDTH_80_80 = 3 /* deprecated - IEEE 802.11 REVmc D8.0 Table 11-25 */
} vht_op_chan_width_t;
#define VHT_OP_INFO_LEN 3
/* AID length */
#define AID_IE_LEN 2
/* Def for rx & tx basic mcs maps - ea ss num has 2 bits of info */
#define VHT_MCS_MAP_GET_SS_IDX(nss) (((nss)-1) * VHT_CAP_MCS_MAP_S)
#define VHT_MCS_MAP_GET_MCS_PER_SS(nss, mcsMap) \
(((mcsMap) >> VHT_MCS_MAP_GET_SS_IDX(nss)) & VHT_CAP_MCS_MAP_M)
#define VHT_MCS_MAP_SET_MCS_PER_SS(nss, numMcs, mcsMap) \
do { \
(mcsMap) &= (~(VHT_CAP_MCS_MAP_M << VHT_MCS_MAP_GET_SS_IDX(nss))); \
(mcsMap) |= (((numMcs) & VHT_CAP_MCS_MAP_M) << VHT_MCS_MAP_GET_SS_IDX(nss)); \
} while (0)
#define VHT_MCS_SS_SUPPORTED(nss, mcsMap) \
(VHT_MCS_MAP_GET_MCS_PER_SS((nss), (mcsMap)) != VHT_CAP_MCS_MAP_NONE)
/* Get the max ss supported from the mcs map */
#define VHT_MAX_SS_SUPPORTED(mcsMap) \
VHT_MCS_SS_SUPPORTED(8, mcsMap) ? 8 : \
VHT_MCS_SS_SUPPORTED(7, mcsMap) ? 7 : \
VHT_MCS_SS_SUPPORTED(6, mcsMap) ? 6 : \
VHT_MCS_SS_SUPPORTED(5, mcsMap) ? 5 : \
VHT_MCS_SS_SUPPORTED(4, mcsMap) ? 4 : \
VHT_MCS_SS_SUPPORTED(3, mcsMap) ? 3 : \
VHT_MCS_SS_SUPPORTED(2, mcsMap) ? 2 : \
VHT_MCS_SS_SUPPORTED(1, mcsMap) ? 1 : 0
/* This marks the end of a packed structure section. */
#include <packed_section_end.h>
#endif /* _802_11ac_h_ */