File Index
Files and directories
Sign in
FILE

ieee80211-he.h

File preview with syntax highlighting.

linux-6.19.14/include/linux/ieee80211-he.h C
  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 */
~/ Read-only file preview.