at master 30 kB view raw
1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * IEEE 802.11 HE definitions 4 * 5 * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen 6 * <jkmaline@cc.hut.fi> 7 * Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi> 8 * Copyright (c) 2005, Devicescape Software, Inc. 9 * Copyright (c) 2006, Michael Wu <flamingice@sourmilk.net> 10 * Copyright (c) 2013 - 2014 Intel Mobile Communications GmbH 11 * Copyright (c) 2016 - 2017 Intel Deutschland GmbH 12 * Copyright (c) 2018 - 2025 Intel Corporation 13 */ 14 15#ifndef LINUX_IEEE80211_HE_H 16#define LINUX_IEEE80211_HE_H 17 18#include <linux/types.h> 19#include <linux/if_ether.h> 20 21#define IEEE80211_TWT_CONTROL_NDP BIT(0) 22#define IEEE80211_TWT_CONTROL_RESP_MODE BIT(1) 23#define IEEE80211_TWT_CONTROL_NEG_TYPE_BROADCAST BIT(3) 24#define IEEE80211_TWT_CONTROL_RX_DISABLED BIT(4) 25#define IEEE80211_TWT_CONTROL_WAKE_DUR_UNIT BIT(5) 26 27#define IEEE80211_TWT_REQTYPE_REQUEST BIT(0) 28#define IEEE80211_TWT_REQTYPE_SETUP_CMD GENMASK(3, 1) 29#define IEEE80211_TWT_REQTYPE_TRIGGER BIT(4) 30#define IEEE80211_TWT_REQTYPE_IMPLICIT BIT(5) 31#define IEEE80211_TWT_REQTYPE_FLOWTYPE BIT(6) 32#define IEEE80211_TWT_REQTYPE_FLOWID GENMASK(9, 7) 33#define IEEE80211_TWT_REQTYPE_WAKE_INT_EXP GENMASK(14, 10) 34#define IEEE80211_TWT_REQTYPE_PROTECTION BIT(15) 35 36enum ieee80211_twt_setup_cmd { 37 TWT_SETUP_CMD_REQUEST, 38 TWT_SETUP_CMD_SUGGEST, 39 TWT_SETUP_CMD_DEMAND, 40 TWT_SETUP_CMD_GROUPING, 41 TWT_SETUP_CMD_ACCEPT, 42 TWT_SETUP_CMD_ALTERNATE, 43 TWT_SETUP_CMD_DICTATE, 44 TWT_SETUP_CMD_REJECT, 45}; 46 47struct ieee80211_twt_params { 48 __le16 req_type; 49 __le64 twt; 50 u8 min_twt_dur; 51 __le16 mantissa; 52 u8 channel; 53} __packed; 54 55struct ieee80211_twt_setup { 56 u8 dialog_token; 57 u8 element_id; 58 u8 length; 59 u8 control; 60 u8 params[]; 61} __packed; 62 63/** 64 * struct ieee80211_he_cap_elem - HE capabilities element 65 * @mac_cap_info: HE MAC Capabilities Information 66 * @phy_cap_info: HE PHY Capabilities Information 67 * 68 * This structure represents the fixed fields of the payload of the 69 * "HE capabilities element" as described in IEEE Std 802.11ax-2021 70 * sections 9.4.2.248.2 and 9.4.2.248.3. 71 */ 72struct ieee80211_he_cap_elem { 73 u8 mac_cap_info[6]; 74 u8 phy_cap_info[11]; 75} __packed; 76 77#define IEEE80211_TX_RX_MCS_NSS_DESC_MAX_LEN 5 78 79/** 80 * enum ieee80211_he_mcs_support - HE MCS support definitions 81 * @IEEE80211_HE_MCS_SUPPORT_0_7: MCSes 0-7 are supported for the 82 * number of streams 83 * @IEEE80211_HE_MCS_SUPPORT_0_9: MCSes 0-9 are supported 84 * @IEEE80211_HE_MCS_SUPPORT_0_11: MCSes 0-11 are supported 85 * @IEEE80211_HE_MCS_NOT_SUPPORTED: This number of streams isn't supported 86 * 87 * These definitions are used in each 2-bit subfield of the rx_mcs_* 88 * and tx_mcs_* fields of &struct ieee80211_he_mcs_nss_supp, which are 89 * both split into 8 subfields by number of streams. These values indicate 90 * which MCSes are supported for the number of streams the value appears 91 * for. 92 */ 93enum ieee80211_he_mcs_support { 94 IEEE80211_HE_MCS_SUPPORT_0_7 = 0, 95 IEEE80211_HE_MCS_SUPPORT_0_9 = 1, 96 IEEE80211_HE_MCS_SUPPORT_0_11 = 2, 97 IEEE80211_HE_MCS_NOT_SUPPORTED = 3, 98}; 99 100/** 101 * struct ieee80211_he_mcs_nss_supp - HE Tx/Rx HE MCS NSS Support Field 102 * 103 * This structure holds the data required for the Tx/Rx HE MCS NSS Support Field 104 * described in P802.11ax_D2.0 section 9.4.2.237.4 105 * 106 * @rx_mcs_80: Rx MCS map 2 bits for each stream, total 8 streams, for channel 107 * widths less than 80MHz. 108 * @tx_mcs_80: Tx MCS map 2 bits for each stream, total 8 streams, for channel 109 * widths less than 80MHz. 110 * @rx_mcs_160: Rx MCS map 2 bits for each stream, total 8 streams, for channel 111 * width 160MHz. 112 * @tx_mcs_160: Tx MCS map 2 bits for each stream, total 8 streams, for channel 113 * width 160MHz. 114 * @rx_mcs_80p80: Rx MCS map 2 bits for each stream, total 8 streams, for 115 * channel width 80p80MHz. 116 * @tx_mcs_80p80: Tx MCS map 2 bits for each stream, total 8 streams, for 117 * channel width 80p80MHz. 118 */ 119struct ieee80211_he_mcs_nss_supp { 120 __le16 rx_mcs_80; 121 __le16 tx_mcs_80; 122 __le16 rx_mcs_160; 123 __le16 tx_mcs_160; 124 __le16 rx_mcs_80p80; 125 __le16 tx_mcs_80p80; 126} __packed; 127 128/** 129 * struct ieee80211_he_operation - HE Operation element 130 * @he_oper_params: HE Operation Parameters + BSS Color Information 131 * @he_mcs_nss_set: Basic HE-MCS And NSS Set 132 * @optional: Optional fields VHT Operation Information, Max Co-Hosted 133 * BSSID Indicator, and 6 GHz Operation Information 134 * 135 * This structure represents the payload of the "HE Operation 136 * element" as described in IEEE Std 802.11ax-2021 section 9.4.2.249. 137 */ 138struct ieee80211_he_operation { 139 __le32 he_oper_params; 140 __le16 he_mcs_nss_set; 141 u8 optional[]; 142} __packed; 143 144/** 145 * struct ieee80211_he_spr - Spatial Reuse Parameter Set element 146 * @he_sr_control: SR Control 147 * @optional: Optional fields Non-SRG OBSS PD Max Offset, SRG OBSS PD 148 * Min Offset, SRG OBSS PD Max Offset, SRG BSS Color 149 * Bitmap, and SRG Partial BSSID Bitmap 150 * 151 * This structure represents the payload of the "Spatial Reuse 152 * Parameter Set element" as described in IEEE Std 802.11ax-2021 153 * section 9.4.2.252. 154 */ 155struct ieee80211_he_spr { 156 u8 he_sr_control; 157 u8 optional[]; 158} __packed; 159 160/** 161 * struct ieee80211_he_mu_edca_param_ac_rec - MU AC Parameter Record field 162 * @aifsn: ACI/AIFSN 163 * @ecw_min_max: ECWmin/ECWmax 164 * @mu_edca_timer: MU EDCA Timer 165 * 166 * This structure represents the "MU AC Parameter Record" as described 167 * in IEEE Std 802.11ax-2021 section 9.4.2.251, Figure 9-788p. 168 */ 169struct ieee80211_he_mu_edca_param_ac_rec { 170 u8 aifsn; 171 u8 ecw_min_max; 172 u8 mu_edca_timer; 173} __packed; 174 175/** 176 * struct ieee80211_mu_edca_param_set - MU EDCA Parameter Set element 177 * @mu_qos_info: QoS Info 178 * @ac_be: MU AC_BE Parameter Record 179 * @ac_bk: MU AC_BK Parameter Record 180 * @ac_vi: MU AC_VI Parameter Record 181 * @ac_vo: MU AC_VO Parameter Record 182 * 183 * This structure represents the payload of the "MU EDCA Parameter Set 184 * element" as described in IEEE Std 802.11ax-2021 section 9.4.2.251. 185 */ 186struct ieee80211_mu_edca_param_set { 187 u8 mu_qos_info; 188 struct ieee80211_he_mu_edca_param_ac_rec ac_be; 189 struct ieee80211_he_mu_edca_param_ac_rec ac_bk; 190 struct ieee80211_he_mu_edca_param_ac_rec ac_vi; 191 struct ieee80211_he_mu_edca_param_ac_rec ac_vo; 192} __packed; 193 194/* 802.11ax HE MAC capabilities */ 195#define IEEE80211_HE_MAC_CAP0_HTC_HE 0x01 196#define IEEE80211_HE_MAC_CAP0_TWT_REQ 0x02 197#define IEEE80211_HE_MAC_CAP0_TWT_RES 0x04 198#define IEEE80211_HE_MAC_CAP0_DYNAMIC_FRAG_NOT_SUPP 0x00 199#define IEEE80211_HE_MAC_CAP0_DYNAMIC_FRAG_LEVEL_1 0x08 200#define IEEE80211_HE_MAC_CAP0_DYNAMIC_FRAG_LEVEL_2 0x10 201#define IEEE80211_HE_MAC_CAP0_DYNAMIC_FRAG_LEVEL_3 0x18 202#define IEEE80211_HE_MAC_CAP0_DYNAMIC_FRAG_MASK 0x18 203#define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_1 0x00 204#define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_2 0x20 205#define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_4 0x40 206#define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_8 0x60 207#define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_16 0x80 208#define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_32 0xa0 209#define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_64 0xc0 210#define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_UNLIMITED 0xe0 211#define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_MASK 0xe0 212 213#define IEEE80211_HE_MAC_CAP1_MIN_FRAG_SIZE_UNLIMITED 0x00 214#define IEEE80211_HE_MAC_CAP1_MIN_FRAG_SIZE_128 0x01 215#define IEEE80211_HE_MAC_CAP1_MIN_FRAG_SIZE_256 0x02 216#define IEEE80211_HE_MAC_CAP1_MIN_FRAG_SIZE_512 0x03 217#define IEEE80211_HE_MAC_CAP1_MIN_FRAG_SIZE_MASK 0x03 218#define IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_0US 0x00 219#define IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_8US 0x04 220#define IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US 0x08 221#define IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK 0x0c 222#define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_1 0x00 223#define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_2 0x10 224#define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_3 0x20 225#define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_4 0x30 226#define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_5 0x40 227#define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_6 0x50 228#define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_7 0x60 229#define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8 0x70 230#define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_MASK 0x70 231 232/* Link adaptation is split between byte HE_MAC_CAP1 and 233 * HE_MAC_CAP2. It should be set only if IEEE80211_HE_MAC_CAP0_HTC_HE 234 * in which case the following values apply: 235 * 0 = No feedback. 236 * 1 = reserved. 237 * 2 = Unsolicited feedback. 238 * 3 = both 239 */ 240#define IEEE80211_HE_MAC_CAP1_LINK_ADAPTATION 0x80 241 242#define IEEE80211_HE_MAC_CAP2_LINK_ADAPTATION 0x01 243#define IEEE80211_HE_MAC_CAP2_ALL_ACK 0x02 244#define IEEE80211_HE_MAC_CAP2_TRS 0x04 245#define IEEE80211_HE_MAC_CAP2_BSR 0x08 246#define IEEE80211_HE_MAC_CAP2_BCAST_TWT 0x10 247#define IEEE80211_HE_MAC_CAP2_32BIT_BA_BITMAP 0x20 248#define IEEE80211_HE_MAC_CAP2_MU_CASCADING 0x40 249#define IEEE80211_HE_MAC_CAP2_ACK_EN 0x80 250 251#define IEEE80211_HE_MAC_CAP3_OMI_CONTROL 0x02 252#define IEEE80211_HE_MAC_CAP3_OFDMA_RA 0x04 253 254/* The maximum length of an A-MDPU is defined by the combination of the Maximum 255 * A-MDPU Length Exponent field in the HT capabilities, VHT capabilities and the 256 * same field in the HE capabilities. 257 */ 258#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_0 0x00 259#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_1 0x08 260#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_2 0x10 261#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3 0x18 262#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK 0x18 263#define IEEE80211_HE_MAC_CAP3_AMSDU_FRAG 0x20 264#define IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED 0x40 265#define IEEE80211_HE_MAC_CAP3_RX_CTRL_FRAME_TO_MULTIBSS 0x80 266 267#define IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG 0x01 268#define IEEE80211_HE_MAC_CAP4_QTP 0x02 269#define IEEE80211_HE_MAC_CAP4_BQR 0x04 270#define IEEE80211_HE_MAC_CAP4_PSR_RESP 0x08 271#define IEEE80211_HE_MAC_CAP4_NDP_FB_REP 0x10 272#define IEEE80211_HE_MAC_CAP4_OPS 0x20 273#define IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU 0x40 274/* Multi TID agg TX is split between byte #4 and #5 275 * The value is a combination of B39,B40,B41 276 */ 277#define IEEE80211_HE_MAC_CAP4_MULTI_TID_AGG_TX_QOS_B39 0x80 278 279#define IEEE80211_HE_MAC_CAP5_MULTI_TID_AGG_TX_QOS_B40 0x01 280#define IEEE80211_HE_MAC_CAP5_MULTI_TID_AGG_TX_QOS_B41 0x02 281#define IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION 0x04 282#define IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU 0x08 283#define IEEE80211_HE_MAC_CAP5_OM_CTRL_UL_MU_DATA_DIS_RX 0x10 284#define IEEE80211_HE_MAC_CAP5_HE_DYNAMIC_SM_PS 0x20 285#define IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING 0x40 286#define IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX 0x80 287 288#define IEEE80211_HE_VHT_MAX_AMPDU_FACTOR 20 289#define IEEE80211_HE_HT_MAX_AMPDU_FACTOR 16 290#define IEEE80211_HE_6GHZ_MAX_AMPDU_FACTOR 13 291 292/* 802.11ax HE PHY capabilities */ 293#define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G 0x02 294#define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G 0x04 295#define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G 0x08 296#define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G 0x10 297#define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_MASK_ALL 0x1e 298 299#define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_2G 0x20 300#define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_5G 0x40 301#define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_MASK 0xfe 302 303#define IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_80MHZ_ONLY_SECOND_20MHZ 0x01 304#define IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_80MHZ_ONLY_SECOND_40MHZ 0x02 305#define IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_160MHZ_ONLY_SECOND_20MHZ 0x04 306#define IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_160MHZ_ONLY_SECOND_40MHZ 0x08 307#define IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK 0x0f 308#define IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A 0x10 309#define IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD 0x20 310#define IEEE80211_HE_PHY_CAP1_HE_LTF_AND_GI_FOR_HE_PPDUS_0_8US 0x40 311/* Midamble RX/TX Max NSTS is split between byte #2 and byte #3 */ 312#define IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS 0x80 313 314#define IEEE80211_HE_PHY_CAP2_MIDAMBLE_RX_TX_MAX_NSTS 0x01 315#define IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US 0x02 316#define IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ 0x04 317#define IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ 0x08 318#define IEEE80211_HE_PHY_CAP2_DOPPLER_TX 0x10 319#define IEEE80211_HE_PHY_CAP2_DOPPLER_RX 0x20 320 321/* Note that the meaning of UL MU below is different between an AP and a non-AP 322 * sta, where in the AP case it indicates support for Rx and in the non-AP sta 323 * case it indicates support for Tx. 324 */ 325#define IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO 0x40 326#define IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO 0x80 327 328#define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_NO_DCM 0x00 329#define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_BPSK 0x01 330#define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_QPSK 0x02 331#define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_16_QAM 0x03 332#define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK 0x03 333#define IEEE80211_HE_PHY_CAP3_DCM_MAX_TX_NSS_1 0x00 334#define IEEE80211_HE_PHY_CAP3_DCM_MAX_TX_NSS_2 0x04 335#define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_NO_DCM 0x00 336#define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_BPSK 0x08 337#define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_QPSK 0x10 338#define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_16_QAM 0x18 339#define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK 0x18 340#define IEEE80211_HE_PHY_CAP3_DCM_MAX_RX_NSS_1 0x00 341#define IEEE80211_HE_PHY_CAP3_DCM_MAX_RX_NSS_2 0x20 342#define IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU 0x40 343#define IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER 0x80 344 345#define IEEE80211_HE_PHY_CAP4_SU_BEAMFORMEE 0x01 346#define IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER 0x02 347 348/* Minimal allowed value of Max STS under 80MHz is 3 */ 349#define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_4 0x0c 350#define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_5 0x10 351#define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_6 0x14 352#define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_7 0x18 353#define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_8 0x1c 354#define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_MASK 0x1c 355 356/* Minimal allowed value of Max STS above 80MHz is 3 */ 357#define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_4 0x60 358#define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_5 0x80 359#define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_6 0xa0 360#define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_7 0xc0 361#define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_8 0xe0 362#define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_MASK 0xe0 363 364#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_1 0x00 365#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_2 0x01 366#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_3 0x02 367#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_4 0x03 368#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_5 0x04 369#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_6 0x05 370#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_7 0x06 371#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_8 0x07 372#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK 0x07 373 374#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_1 0x00 375#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_2 0x08 376#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_3 0x10 377#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_4 0x18 378#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_5 0x20 379#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_6 0x28 380#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_7 0x30 381#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_8 0x38 382#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_MASK 0x38 383 384#define IEEE80211_HE_PHY_CAP5_NG16_SU_FEEDBACK 0x40 385#define IEEE80211_HE_PHY_CAP5_NG16_MU_FEEDBACK 0x80 386 387#define IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_42_SU 0x01 388#define IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU 0x02 389#define IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMING_FB 0x04 390#define IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB 0x08 391#define IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB 0x10 392#define IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE 0x20 393#define IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO 0x40 394#define IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT 0x80 395 396#define IEEE80211_HE_PHY_CAP7_PSR_BASED_SR 0x01 397#define IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP 0x02 398#define IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI 0x04 399#define IEEE80211_HE_PHY_CAP7_MAX_NC_1 0x08 400#define IEEE80211_HE_PHY_CAP7_MAX_NC_2 0x10 401#define IEEE80211_HE_PHY_CAP7_MAX_NC_3 0x18 402#define IEEE80211_HE_PHY_CAP7_MAX_NC_4 0x20 403#define IEEE80211_HE_PHY_CAP7_MAX_NC_5 0x28 404#define IEEE80211_HE_PHY_CAP7_MAX_NC_6 0x30 405#define IEEE80211_HE_PHY_CAP7_MAX_NC_7 0x38 406#define IEEE80211_HE_PHY_CAP7_MAX_NC_MASK 0x38 407#define IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ 0x40 408#define IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ 0x80 409 410#define IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI 0x01 411#define IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G 0x02 412#define IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU 0x04 413#define IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU 0x08 414#define IEEE80211_HE_PHY_CAP8_HE_ER_SU_1XLTF_AND_08_US_GI 0x10 415#define IEEE80211_HE_PHY_CAP8_MIDAMBLE_RX_TX_2X_AND_1XLTF 0x20 416#define IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_242 0x00 417#define IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_484 0x40 418#define IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_996 0x80 419#define IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_2x996 0xc0 420#define IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_MASK 0xc0 421 422#define IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM 0x01 423#define IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK 0x02 424#define IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU 0x04 425#define IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU 0x08 426#define IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB 0x10 427#define IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB 0x20 428#define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_0US 0x0 429#define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_8US 0x1 430#define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_16US 0x2 431#define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_RESERVED 0x3 432#define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_POS 6 433#define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_MASK 0xc0 434 435#define IEEE80211_HE_PHY_CAP10_HE_MU_M1RU_MAX_LTF 0x01 436 437/* 802.11ax HE TX/RX MCS NSS Support */ 438#define IEEE80211_TX_RX_MCS_NSS_SUPP_HIGHEST_MCS_POS (3) 439#define IEEE80211_TX_RX_MCS_NSS_SUPP_TX_BITMAP_POS (6) 440#define IEEE80211_TX_RX_MCS_NSS_SUPP_RX_BITMAP_POS (11) 441#define IEEE80211_TX_RX_MCS_NSS_SUPP_TX_BITMAP_MASK 0x07c0 442#define IEEE80211_TX_RX_MCS_NSS_SUPP_RX_BITMAP_MASK 0xf800 443 444/* TX/RX HE MCS Support field Highest MCS subfield encoding */ 445enum ieee80211_he_highest_mcs_supported_subfield_enc { 446 HIGHEST_MCS_SUPPORTED_MCS7 = 0, 447 HIGHEST_MCS_SUPPORTED_MCS8, 448 HIGHEST_MCS_SUPPORTED_MCS9, 449 HIGHEST_MCS_SUPPORTED_MCS10, 450 HIGHEST_MCS_SUPPORTED_MCS11, 451}; 452 453/* Calculate 802.11ax HE capabilities IE Tx/Rx HE MCS NSS Support Field size */ 454static inline u8 455ieee80211_he_mcs_nss_size(const struct ieee80211_he_cap_elem *he_cap) 456{ 457 u8 count = 4; 458 459 if (he_cap->phy_cap_info[0] & 460 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G) 461 count += 4; 462 463 if (he_cap->phy_cap_info[0] & 464 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) 465 count += 4; 466 467 return count; 468} 469 470/* 802.11ax HE PPE Thresholds */ 471#define IEEE80211_PPE_THRES_NSS_SUPPORT_2NSS (1) 472#define IEEE80211_PPE_THRES_NSS_POS (0) 473#define IEEE80211_PPE_THRES_NSS_MASK (7) 474#define IEEE80211_PPE_THRES_RU_INDEX_BITMASK_2x966_AND_966_RU \ 475 (BIT(5) | BIT(6)) 476#define IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK 0x78 477#define IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS (3) 478#define IEEE80211_PPE_THRES_INFO_PPET_SIZE (3) 479#define IEEE80211_HE_PPE_THRES_INFO_HEADER_SIZE (7) 480 481/* 482 * Calculate 802.11ax HE capabilities IE PPE field size 483 * Input: Header byte of ppe_thres (first byte), and HE capa IE's PHY cap u8* 484 */ 485static inline u8 486ieee80211_he_ppe_size(u8 ppe_thres_hdr, const u8 *phy_cap_info) 487{ 488 u8 n; 489 490 if ((phy_cap_info[6] & 491 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) == 0) 492 return 0; 493 494 n = hweight8(ppe_thres_hdr & 495 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK); 496 n *= (1 + ((ppe_thres_hdr & IEEE80211_PPE_THRES_NSS_MASK) >> 497 IEEE80211_PPE_THRES_NSS_POS)); 498 499 /* 500 * Each pair is 6 bits, and we need to add the 7 "header" bits to the 501 * total size. 502 */ 503 n = (n * IEEE80211_PPE_THRES_INFO_PPET_SIZE * 2) + 7; 504 n = DIV_ROUND_UP(n, 8); 505 506 return n; 507} 508 509static inline bool ieee80211_he_capa_size_ok(const u8 *data, u8 len) 510{ 511 const struct ieee80211_he_cap_elem *he_cap_ie_elem = (const void *)data; 512 u8 needed = sizeof(*he_cap_ie_elem); 513 514 if (len < needed) 515 return false; 516 517 needed += ieee80211_he_mcs_nss_size(he_cap_ie_elem); 518 if (len < needed) 519 return false; 520 521 if (he_cap_ie_elem->phy_cap_info[6] & 522 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) { 523 if (len < needed + 1) 524 return false; 525 needed += ieee80211_he_ppe_size(data[needed], 526 he_cap_ie_elem->phy_cap_info); 527 } 528 529 return len >= needed; 530} 531 532/* HE Operation defines */ 533#define IEEE80211_HE_OPERATION_DFLT_PE_DURATION_MASK 0x00000007 534#define IEEE80211_HE_OPERATION_TWT_REQUIRED 0x00000008 535#define IEEE80211_HE_OPERATION_RTS_THRESHOLD_MASK 0x00003ff0 536#define IEEE80211_HE_OPERATION_RTS_THRESHOLD_OFFSET 4 537#define IEEE80211_HE_OPERATION_VHT_OPER_INFO 0x00004000 538#define IEEE80211_HE_OPERATION_CO_HOSTED_BSS 0x00008000 539#define IEEE80211_HE_OPERATION_ER_SU_DISABLE 0x00010000 540#define IEEE80211_HE_OPERATION_6GHZ_OP_INFO 0x00020000 541#define IEEE80211_HE_OPERATION_BSS_COLOR_MASK 0x3f000000 542#define IEEE80211_HE_OPERATION_BSS_COLOR_OFFSET 24 543#define IEEE80211_HE_OPERATION_PARTIAL_BSS_COLOR 0x40000000 544#define IEEE80211_HE_OPERATION_BSS_COLOR_DISABLED 0x80000000 545 546#define IEEE80211_6GHZ_CTRL_REG_LPI_AP 0 547#define IEEE80211_6GHZ_CTRL_REG_SP_AP 1 548#define IEEE80211_6GHZ_CTRL_REG_VLP_AP 2 549#define IEEE80211_6GHZ_CTRL_REG_INDOOR_LPI_AP 3 550#define IEEE80211_6GHZ_CTRL_REG_INDOOR_SP_AP_OLD 4 551#define IEEE80211_6GHZ_CTRL_REG_AP_ROLE_NOT_RELEVANT 7 552#define IEEE80211_6GHZ_CTRL_REG_INDOOR_SP_AP 8 553 554/** 555 * struct ieee80211_he_6ghz_oper - HE 6 GHz operation Information field 556 * @primary: primary channel 557 * @control: control flags 558 * @ccfs0: channel center frequency segment 0 559 * @ccfs1: channel center frequency segment 1 560 * @minrate: minimum rate (in 1 Mbps units) 561 */ 562struct ieee80211_he_6ghz_oper { 563 u8 primary; 564#define IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH 0x3 565#define IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_20MHZ 0 566#define IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_40MHZ 1 567#define IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_80MHZ 2 568#define IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_160MHZ 3 569#define IEEE80211_HE_6GHZ_OPER_CTRL_DUP_BEACON 0x4 570#define IEEE80211_HE_6GHZ_OPER_CTRL_REG_INFO 0x78 571 u8 control; 572 u8 ccfs0; 573 u8 ccfs1; 574 u8 minrate; 575} __packed; 576 577/** 578 * enum ieee80211_reg_conn_bits - represents Regulatory connectivity field bits. 579 * 580 * This enumeration defines bit flags used to represent regulatory connectivity 581 * field bits. 582 * 583 * @IEEE80211_REG_CONN_LPI_VALID: Indicates whether the LPI bit is valid. 584 * @IEEE80211_REG_CONN_LPI_VALUE: Represents the value of the LPI bit. 585 * @IEEE80211_REG_CONN_SP_VALID: Indicates whether the SP bit is valid. 586 * @IEEE80211_REG_CONN_SP_VALUE: Represents the value of the SP bit. 587 */ 588enum ieee80211_reg_conn_bits { 589 IEEE80211_REG_CONN_LPI_VALID = BIT(0), 590 IEEE80211_REG_CONN_LPI_VALUE = BIT(1), 591 IEEE80211_REG_CONN_SP_VALID = BIT(2), 592 IEEE80211_REG_CONN_SP_VALUE = BIT(3), 593}; 594 595/* transmit power interpretation type of transmit power envelope element */ 596enum ieee80211_tx_power_intrpt_type { 597 IEEE80211_TPE_LOCAL_EIRP, 598 IEEE80211_TPE_LOCAL_EIRP_PSD, 599 IEEE80211_TPE_REG_CLIENT_EIRP, 600 IEEE80211_TPE_REG_CLIENT_EIRP_PSD, 601}; 602 603/* category type of transmit power envelope element */ 604enum ieee80211_tx_power_category_6ghz { 605 IEEE80211_TPE_CAT_6GHZ_DEFAULT = 0, 606 IEEE80211_TPE_CAT_6GHZ_SUBORDINATE = 1, 607}; 608 609/* 610 * For IEEE80211_TPE_LOCAL_EIRP / IEEE80211_TPE_REG_CLIENT_EIRP, 611 * setting to 63.5 dBm means no constraint. 612 */ 613#define IEEE80211_TPE_MAX_TX_PWR_NO_CONSTRAINT 127 614 615/* 616 * For IEEE80211_TPE_LOCAL_EIRP_PSD / IEEE80211_TPE_REG_CLIENT_EIRP_PSD, 617 * setting to 127 indicates no PSD limit for the 20 MHz channel. 618 */ 619#define IEEE80211_TPE_PSD_NO_LIMIT 127 620 621/** 622 * struct ieee80211_tx_pwr_env - Transmit Power Envelope 623 * @info: Transmit Power Information field 624 * @variable: Maximum Transmit Power field 625 * 626 * This structure represents the payload of the "Transmit Power 627 * Envelope element" as described in IEEE Std 802.11ax-2021 section 628 * 9.4.2.161 629 */ 630struct ieee80211_tx_pwr_env { 631 u8 info; 632 u8 variable[]; 633} __packed; 634 635#define IEEE80211_TX_PWR_ENV_INFO_COUNT 0x7 636#define IEEE80211_TX_PWR_ENV_INFO_INTERPRET 0x38 637#define IEEE80211_TX_PWR_ENV_INFO_CATEGORY 0xC0 638 639#define IEEE80211_TX_PWR_ENV_EXT_COUNT 0xF 640 641static inline bool ieee80211_valid_tpe_element(const u8 *data, u8 len) 642{ 643 const struct ieee80211_tx_pwr_env *env = (const void *)data; 644 u8 count, interpret, category; 645 u8 needed = sizeof(*env); 646 u8 N; /* also called N in the spec */ 647 648 if (len < needed) 649 return false; 650 651 count = u8_get_bits(env->info, IEEE80211_TX_PWR_ENV_INFO_COUNT); 652 interpret = u8_get_bits(env->info, IEEE80211_TX_PWR_ENV_INFO_INTERPRET); 653 category = u8_get_bits(env->info, IEEE80211_TX_PWR_ENV_INFO_CATEGORY); 654 655 switch (category) { 656 case IEEE80211_TPE_CAT_6GHZ_DEFAULT: 657 case IEEE80211_TPE_CAT_6GHZ_SUBORDINATE: 658 break; 659 default: 660 return false; 661 } 662 663 switch (interpret) { 664 case IEEE80211_TPE_LOCAL_EIRP: 665 case IEEE80211_TPE_REG_CLIENT_EIRP: 666 if (count > 3) 667 return false; 668 669 /* count == 0 encodes 1 value for 20 MHz, etc. */ 670 needed += count + 1; 671 672 if (len < needed) 673 return false; 674 675 /* there can be extension fields not accounted for in 'count' */ 676 677 return true; 678 case IEEE80211_TPE_LOCAL_EIRP_PSD: 679 case IEEE80211_TPE_REG_CLIENT_EIRP_PSD: 680 if (count > 4) 681 return false; 682 683 N = count ? 1 << (count - 1) : 1; 684 needed += N; 685 686 if (len < needed) 687 return false; 688 689 if (len > needed) { 690 u8 K = u8_get_bits(env->variable[N], 691 IEEE80211_TX_PWR_ENV_EXT_COUNT); 692 693 needed += 1 + K; 694 if (len < needed) 695 return false; 696 } 697 698 return true; 699 } 700 701 return false; 702} 703 704/* 705 * ieee80211_he_oper_size - calculate 802.11ax HE Operations IE size 706 * @he_oper_ie: byte data of the He Operations IE, stating from the byte 707 * after the ext ID byte. It is assumed that he_oper_ie has at least 708 * sizeof(struct ieee80211_he_operation) bytes, the caller must have 709 * validated this. 710 * @return the actual size of the IE data (not including header), or 0 on error 711 */ 712static inline u8 713ieee80211_he_oper_size(const u8 *he_oper_ie) 714{ 715 const struct ieee80211_he_operation *he_oper = (const void *)he_oper_ie; 716 u8 oper_len = sizeof(struct ieee80211_he_operation); 717 u32 he_oper_params; 718 719 /* Make sure the input is not NULL */ 720 if (!he_oper_ie) 721 return 0; 722 723 /* Calc required length */ 724 he_oper_params = le32_to_cpu(he_oper->he_oper_params); 725 if (he_oper_params & IEEE80211_HE_OPERATION_VHT_OPER_INFO) 726 oper_len += 3; 727 if (he_oper_params & IEEE80211_HE_OPERATION_CO_HOSTED_BSS) 728 oper_len++; 729 if (he_oper_params & IEEE80211_HE_OPERATION_6GHZ_OP_INFO) 730 oper_len += sizeof(struct ieee80211_he_6ghz_oper); 731 732 /* Add the first byte (extension ID) to the total length */ 733 oper_len++; 734 735 return oper_len; 736} 737 738/** 739 * ieee80211_he_6ghz_oper - obtain 6 GHz operation field 740 * @he_oper: HE operation element (must be pre-validated for size) 741 * but may be %NULL 742 * 743 * Return: a pointer to the 6 GHz operation field, or %NULL 744 */ 745static inline const struct ieee80211_he_6ghz_oper * 746ieee80211_he_6ghz_oper(const struct ieee80211_he_operation *he_oper) 747{ 748 const u8 *ret; 749 u32 he_oper_params; 750 751 if (!he_oper) 752 return NULL; 753 754 ret = (const void *)&he_oper->optional; 755 756 he_oper_params = le32_to_cpu(he_oper->he_oper_params); 757 758 if (!(he_oper_params & IEEE80211_HE_OPERATION_6GHZ_OP_INFO)) 759 return NULL; 760 if (he_oper_params & IEEE80211_HE_OPERATION_VHT_OPER_INFO) 761 ret += 3; 762 if (he_oper_params & IEEE80211_HE_OPERATION_CO_HOSTED_BSS) 763 ret++; 764 765 return (const void *)ret; 766} 767 768/* HE Spatial Reuse defines */ 769#define IEEE80211_HE_SPR_PSR_DISALLOWED BIT(0) 770#define IEEE80211_HE_SPR_NON_SRG_OBSS_PD_SR_DISALLOWED BIT(1) 771#define IEEE80211_HE_SPR_NON_SRG_OFFSET_PRESENT BIT(2) 772#define IEEE80211_HE_SPR_SRG_INFORMATION_PRESENT BIT(3) 773#define IEEE80211_HE_SPR_HESIGA_SR_VAL15_ALLOWED BIT(4) 774 775/* 776 * ieee80211_he_spr_size - calculate 802.11ax HE Spatial Reuse IE size 777 * @he_spr_ie: byte data of the He Spatial Reuse IE, stating from the byte 778 * after the ext ID byte. It is assumed that he_spr_ie has at least 779 * sizeof(struct ieee80211_he_spr) bytes, the caller must have validated 780 * this 781 * @return the actual size of the IE data (not including header), or 0 on error 782 */ 783static inline u8 784ieee80211_he_spr_size(const u8 *he_spr_ie) 785{ 786 const struct ieee80211_he_spr *he_spr = (const void *)he_spr_ie; 787 u8 spr_len = sizeof(struct ieee80211_he_spr); 788 u8 he_spr_params; 789 790 /* Make sure the input is not NULL */ 791 if (!he_spr_ie) 792 return 0; 793 794 /* Calc required length */ 795 he_spr_params = he_spr->he_sr_control; 796 if (he_spr_params & IEEE80211_HE_SPR_NON_SRG_OFFSET_PRESENT) 797 spr_len++; 798 if (he_spr_params & IEEE80211_HE_SPR_SRG_INFORMATION_PRESENT) 799 spr_len += 18; 800 801 /* Add the first byte (extension ID) to the total length */ 802 spr_len++; 803 804 return spr_len; 805} 806 807struct ieee80211_he_6ghz_capa { 808 /* uses IEEE80211_HE_6GHZ_CAP_* below */ 809 __le16 capa; 810} __packed; 811 812/* HE 6 GHz band capabilities */ 813/* uses enum ieee80211_min_mpdu_spacing values */ 814#define IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START 0x0007 815/* uses enum ieee80211_vht_max_ampdu_length_exp values */ 816#define IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP 0x0038 817/* uses IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_* values */ 818#define IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN 0x00c0 819/* WLAN_HT_CAP_SM_PS_* values */ 820#define IEEE80211_HE_6GHZ_CAP_SM_PS 0x0600 821#define IEEE80211_HE_6GHZ_CAP_RD_RESPONDER 0x0800 822#define IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS 0x1000 823#define IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS 0x2000 824 825#endif /* LINUX_IEEE80211_HE_H */