xref: /OK3568_Linux_fs/external/rkwifibt/drivers/bcmdhd/include/802.11ax.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Basic types and constants relating to 802.11ax/HE STA
3*4882a593Smuzhiyun  * This is a portion of 802.11ax definition. The rest are in 802.11.h.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2020, Broadcom.
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  *      Unless you and Broadcom execute a separate written software license
8*4882a593Smuzhiyun  * agreement governing use of this software, this software is licensed to you
9*4882a593Smuzhiyun  * under the terms of the GNU General Public License version 2 (the "GPL"),
10*4882a593Smuzhiyun  * available at http://www.broadcom.com/licenses/GPLv2.php, with the
11*4882a593Smuzhiyun  * following added to such license:
12*4882a593Smuzhiyun  *
13*4882a593Smuzhiyun  *      As a special exception, the copyright holders of this software give you
14*4882a593Smuzhiyun  * permission to link this software with independent modules, and to copy and
15*4882a593Smuzhiyun  * distribute the resulting executable under terms of your choice, provided that
16*4882a593Smuzhiyun  * you also meet, for each linked independent module, the terms and conditions of
17*4882a593Smuzhiyun  * the license of that module.  An independent module is a module which is not
18*4882a593Smuzhiyun  * derived from this software.  The special exception does not apply to any
19*4882a593Smuzhiyun  * modifications of the software.
20*4882a593Smuzhiyun  *
21*4882a593Smuzhiyun  *
22*4882a593Smuzhiyun  * <<Broadcom-WL-IPTag/Dual:>>
23*4882a593Smuzhiyun  */
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #ifndef _802_11ax_h_
26*4882a593Smuzhiyun #define _802_11ax_h_
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun #include <typedefs.h>
29*4882a593Smuzhiyun #include <802.11.h>
30*4882a593Smuzhiyun #include <bcmtlv.h>
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun /* This marks the start of a packed structure section. */
33*4882a593Smuzhiyun #include <packed_section_start.h>
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun /* HT Control Field: (Table 9-9a) */
36*4882a593Smuzhiyun #define HTC_HE_VARIANT		0x03u
37*4882a593Smuzhiyun #define HTC_HEVAR_SHIFT		0	/* HE VARIANT shift */
38*4882a593Smuzhiyun #define HTC_HEVAR(htc)		(((htc) & HTC_HE_VARIANT) >> HTC_HEVAR_SHIFT)
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun /* HT Control IDs: (Table 9-18a & Table 9-9a) */
41*4882a593Smuzhiyun #define HTC_HE_CTLID_SHIFT	0x02u	/* HTC HE CTLID shift */
42*4882a593Smuzhiyun #define HTC_HE_CTLID_MASK	0x0Fu	/* HTC HE CTLID mask  */
43*4882a593Smuzhiyun #define HTC_HE_CTLID(htc)	(((htc) >> HTC_HE_CTLID_SHIFT) & HTC_HE_CTLID_MASK)
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun #define HTC_HE_CTLID_TRS	0x0u	/* Triggered response scheduling */
46*4882a593Smuzhiyun #define HTC_HE_CTLID_OMI	0x1u	/* Operating mode */
47*4882a593Smuzhiyun #define HTC_HE_CTLID_HLA	0x2u	/* HE link adaptation */
48*4882a593Smuzhiyun #define HTC_HE_CTLID_BSR	0x3u	/* Buffer status report */
49*4882a593Smuzhiyun #define HTC_HE_CTLID_UPH	0x4u	/* UL power headroom */
50*4882a593Smuzhiyun #define HTC_HE_CTLID_BQR	0x5u	/* Bandwidth query report */
51*4882a593Smuzhiyun #define HTC_HE_CTLID_CAS	0x6u	/* Command and status */
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun /* HTC-Control field definitions: (Table 9.9a HTC Control field) */
54*4882a593Smuzhiyun #define HTC_HE_CTL_SIZE		30u	/* HTC Control field size */
55*4882a593Smuzhiyun #define HTC_HE_CTL_DEFAULT	0xFFFFFFFC
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun /* A-Control offset definitions: (Figure 9.18a Control ID subfield values) */
58*4882a593Smuzhiyun #define HE_ACTRL_TRS_FSZ	26u
59*4882a593Smuzhiyun #define HE_ACTRL_OMI_FSZ	12u
60*4882a593Smuzhiyun #define HE_ACTRL_HLA_FSZ	26u
61*4882a593Smuzhiyun #define HE_ACTRL_BSR_FSZ	26u
62*4882a593Smuzhiyun #define HE_ACTRL_UPH_FSZ	8u
63*4882a593Smuzhiyun #define HE_ACTRL_BQR_FSZ	10u
64*4882a593Smuzhiyun #define HE_ACTRL_CAS_FSZ	8u
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun /* OM-Control Field definitions: (Figure 9.15d Control Information subfield for OM Control) */
67*4882a593Smuzhiyun #define HE_OMI_RXNSS_FSZ		3
68*4882a593Smuzhiyun #define HE_OMI_RXNSS_IDX		0
69*4882a593Smuzhiyun #define HE_OMI_RXNSS_MASK		0x07u
70*4882a593Smuzhiyun #define HE_OMI_CHW_FSZ			2
71*4882a593Smuzhiyun #define HE_OMI_CHW_IDX			3
72*4882a593Smuzhiyun #define HE_OMI_CHW_MASK			0x18u
73*4882a593Smuzhiyun #define HE_OMI_ULMU_DIS_FSZ		1
74*4882a593Smuzhiyun #define HE_OMI_ULMU_DIS_IDX		5
75*4882a593Smuzhiyun #define HE_OMI_ULMU_DIS_MASK		0x20u
76*4882a593Smuzhiyun #define HE_OMI_TXNSTS_FSZ		3
77*4882a593Smuzhiyun #define HE_OMI_TXNSTS_IDX		6
78*4882a593Smuzhiyun #define HE_OMI_TXNSTS_MASK		0x1c0u
79*4882a593Smuzhiyun #define HE_OMI_ERSU_DIS_FSZ		1
80*4882a593Smuzhiyun #define HE_OMI_ERSU_DIS_IDX		9
81*4882a593Smuzhiyun #define HE_OMI_ERSU_DIS_MASK		0x200u
82*4882a593Smuzhiyun #define HE_OMI_DLMU_RSD_RCM_FSZ		1
83*4882a593Smuzhiyun #define HE_OMI_DLMU_RSD_RCM_IDX		10
84*4882a593Smuzhiyun #define HE_OMI_DLMU_RSD_RCM_MASK	0x400u
85*4882a593Smuzhiyun #define HE_OMI_ULMU_DATA_DIS_FSZ	1
86*4882a593Smuzhiyun #define HE_OMI_ULMU_DATA_DIS_IDX	11
87*4882a593Smuzhiyun #define HE_OMI_ULMU_DATA_DIS_MASK	0x800u
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun /* OM-Control Channel Width Subfield definition, as per 9.2.4.6a.2 OM Control */
90*4882a593Smuzhiyun #define OMI_CHW_20MHZ			0
91*4882a593Smuzhiyun #define OMI_CHW_40MHZ			1
92*4882a593Smuzhiyun #define OMI_CHW_80MHZ			2
93*4882a593Smuzhiyun #define OMI_CHW_160MHZ_80P80MHZ		3
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun /* Table 9-18d ACI Bitmap subfield encoding */
96*4882a593Smuzhiyun #define HE_BSR_ACI_MAP_BE		0u
97*4882a593Smuzhiyun #define HE_BSR_ACI_MAP_BK		1u
98*4882a593Smuzhiyun #define HE_BSR_ACI_MAP_VI		2u
99*4882a593Smuzhiyun #define HE_BSR_ACI_MAP_VO		3u
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun /* GI And LTF Type subfield encoding (Table 9-31d) */
102*4882a593Smuzhiyun #define HE_LTF_1_GI_1_6us	(0u)
103*4882a593Smuzhiyun #define HE_LTF_2_GI_1_6us	(1u)
104*4882a593Smuzhiyun #define HE_LTF_4_GI_3_2us	(2u)
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun /* special STA-IDs (Section 27.11.1) */
107*4882a593Smuzhiyun #define HE_STAID_BSS_BCAST		0
108*4882a593Smuzhiyun #define HE_STAID_UNASSOCIATED_STA	2045u
109*4882a593Smuzhiyun #define HE_STAID_NO_USER		2046u
110*4882a593Smuzhiyun #define HE_STAID_MBSS_BCAST		2047u
111*4882a593Smuzhiyun #define HE_STAID_MASK			0x07FFu
112*4882a593Smuzhiyun #define HE_AID12_MASK			0x0FFFu
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun /**
115*4882a593Smuzhiyun  * HE Capabilites element (sec 9.4.2.218)
116*4882a593Smuzhiyun  */
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun /* HE MAC Capabilities Information field (figure 9-589ck) */
119*4882a593Smuzhiyun #define HE_MAC_CAP_INFO_SIZE	6u
120*4882a593Smuzhiyun typedef uint8 he_mac_cap_t[HE_MAC_CAP_INFO_SIZE];
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun /* bit position and field width */
123*4882a593Smuzhiyun #define HE_MAC_HTC_HE_SUPPORT_IDX		0	/* HTC HE Support */
124*4882a593Smuzhiyun #define HE_MAC_HTC_HE_SUPPORT_FSZ		1
125*4882a593Smuzhiyun #define HE_MAC_TWT_REQ_SUPPORT_IDX		1	/* TWT Requestor Support */
126*4882a593Smuzhiyun #define HE_MAC_TWT_REQ_SUPPORT_FSZ		1
127*4882a593Smuzhiyun #define HE_MAC_TWT_RESP_SUPPORT_IDX		2	/* TWT Responder Support */
128*4882a593Smuzhiyun #define HE_MAC_TWT_RESP_SUPPORT_FSZ		1
129*4882a593Smuzhiyun #define HE_MAC_FRAG_SUPPORT_IDX			3	/* Fragmentation Support */
130*4882a593Smuzhiyun #define HE_MAC_FRAG_SUPPORT_FSZ			2
131*4882a593Smuzhiyun #define HE_MAC_MAX_MSDU_FRAGS_IDX		5	/* Max. Fragmented MSDUs */
132*4882a593Smuzhiyun #define HE_MAC_MAX_MSDU_FRAGS_FSZ		3
133*4882a593Smuzhiyun #define HE_MAC_MIN_FRAG_SIZE_IDX		8	/* Min. Fragment Size */
134*4882a593Smuzhiyun #define HE_MAC_MIN_FRAG_SIZE_FSZ		2
135*4882a593Smuzhiyun #define HE_MAC_TRIG_MAC_PAD_DUR_IDX		10	/* Trigger Frame MAC Pad Dur */
136*4882a593Smuzhiyun #define HE_MAC_TRIG_MAC_PAD_DUR_FSZ		2
137*4882a593Smuzhiyun #define HE_MAC_MULTI_TID_AGG_RX_IDX		12	/* Multi TID Agg. Rx support */
138*4882a593Smuzhiyun #define HE_MAC_MULTI_TID_AGG_RX_FSZ		3
139*4882a593Smuzhiyun #define HE_MAC_LINK_ADAPT_IDX			15	/* HE Link Adaptation Support */
140*4882a593Smuzhiyun #define HE_MAC_LINK_ADAPT_FSZ			2
141*4882a593Smuzhiyun #define HE_MAC_ALL_ACK_SUPPORT_IDX		17	/* All Ack Support */
142*4882a593Smuzhiyun #define HE_MAC_ALL_ACK_SUPPORT_FSZ		1
143*4882a593Smuzhiyun #define HE_MAC_TRS_SUPPORT_IDX			18	/* TRS Support */
144*4882a593Smuzhiyun #define HE_MAC_TRS_SUPPORT_FSZ			1
145*4882a593Smuzhiyun #define HE_MAC_BSR_SUPPORT_IDX			19	/* BSR Support */
146*4882a593Smuzhiyun #define HE_MAC_BSR_SUPPORT_FSZ			1
147*4882a593Smuzhiyun #define HE_MAC_BCAST_TWT_SUPPORT_IDX		20	/* Broadcast TWT Support */
148*4882a593Smuzhiyun #define HE_MAC_BCAST_TWT_SUPPORT_FSZ		1
149*4882a593Smuzhiyun #define HE_MAC_32BA_BITMAP_SUPPORT_IDX		21	/* 32-bit BA Bitmap Support */
150*4882a593Smuzhiyun #define HE_MAC_32BA_BITMAP_SUPPORT_FSZ		1
151*4882a593Smuzhiyun #define HE_MAC_MU_CASCADE_SUPPORT_IDX		22	/* MU Cascade Support */
152*4882a593Smuzhiyun #define HE_MAC_MU_CASCADE_SUPPORT_FSZ		1
153*4882a593Smuzhiyun #define HE_MAC_ACK_ENAB_AGG_SUPPORT_IDX		23	/* Ack Enabled Agg. Support */
154*4882a593Smuzhiyun #define HE_MAC_ACK_ENAB_AGG_SUPPORT_FSZ		1
155*4882a593Smuzhiyun /* bit 24 - Reserved */
156*4882a593Smuzhiyun #define HE_MAC_OMI_CONTROL_SUPPORT_IDX		25	/* OMI Control Support */
157*4882a593Smuzhiyun #define HE_MAC_OMI_CONTROL_SUPPORT_FSZ		1
158*4882a593Smuzhiyun #define HE_MAC_OFDMA_RA_SUPPORT_IDX		26	/* OFDMA RA Support */
159*4882a593Smuzhiyun #define HE_MAC_OFDMA_RA_SUPPORT_FSZ		1
160*4882a593Smuzhiyun #define HE_MAC_MAX_AMPDU_LEN_EXP_IDX		27	/* Max AMPDU Length Exponent */
161*4882a593Smuzhiyun #define HE_MAC_MAX_AMPDU_LEN_EXP_FSZ		2
162*4882a593Smuzhiyun #define HE_MAC_AMSDU_FRAG_SUPPORT_IDX		29	/* AMSDU Fragementation Support */
163*4882a593Smuzhiyun #define HE_MAC_AMSDU_FRAG_SUPPORT_FSZ		1
164*4882a593Smuzhiyun #define HE_MAC_FLEX_TWT_SCHEDULE_IDX		30	/* Flexible TWT Schedule Support */
165*4882a593Smuzhiyun #define HE_MAC_FLEX_TWT_SCHEDULE_FSZ		1
166*4882a593Smuzhiyun #define HE_MAC_RX_MBSS_CTL_FRAME_IDX		31	/* Rx control frames to Multi BSS */
167*4882a593Smuzhiyun #define HE_MAC_RX_MBSS_CTL_FRAME_FSZ		1
168*4882a593Smuzhiyun #define HE_MAC_RX_AGG_BSRP_BQRP_IDX		32	/* Aggregated BSRP BQRP Rx */
169*4882a593Smuzhiyun #define HE_MAC_RX_AGG_BSRP_BQRP_FSZ		1
170*4882a593Smuzhiyun #define HE_MAC_QTP_SUPPORT_IDX			33	/* Support Quiet time period */
171*4882a593Smuzhiyun #define HE_MAC_QTP_SUPPORT_FSZ			1
172*4882a593Smuzhiyun #define HE_MAC_BQR_SUPPORT_IDX			34	/* Support BQR */
173*4882a593Smuzhiyun #define HE_MAC_BQR_SUPPORT_FSZ			1
174*4882a593Smuzhiyun #define HE_MAC_SRP_RESPONDER_IDX		35	/* SRP responder Support */
175*4882a593Smuzhiyun #define HE_MAC_SRP_RESPONDER_FSZ		1
176*4882a593Smuzhiyun #define HE_MAC_NDP_FDBK_SUPPORT_IDX		36	/* NDP feedback report Support */
177*4882a593Smuzhiyun #define HE_MAC_NDP_FDBK_SUPPORT_FSZ		1
178*4882a593Smuzhiyun #define HE_MAC_OPS_SUPPORT_IDX			37	/* OPS support */
179*4882a593Smuzhiyun #define HE_MAC_OPS_SUPPORT_FSZ			1
180*4882a593Smuzhiyun #define HE_MAC_AMSDU_IN_AMPDU_IDX		38	/* AMSDU in AMPDU support */
181*4882a593Smuzhiyun #define HE_MAC_AMSDU_IN_AMPDU_FSZ		1
182*4882a593Smuzhiyun #define HE_MAC_MULTI_TID_AGG_TX_IDX		39	/* Multi TID Agg. Tx support */
183*4882a593Smuzhiyun #define HE_MAC_MULTI_TID_AGG_TX_FSZ		3
184*4882a593Smuzhiyun #define HE_MAC_SST_SUPPORT_IDX			42	/* Sub-channel Selective channel */
185*4882a593Smuzhiyun #define HE_MAC_SST_SUPPORT_FSZ			1
186*4882a593Smuzhiyun #define HE_MAC_UL_2X_996_TONE_RU_SUPP_IDX	43	/* UL 2X 996 tone RU Support */
187*4882a593Smuzhiyun #define HE_MAC_UL_2X_996_TONE_RU_SUPP_FSZ	1
188*4882a593Smuzhiyun #define HE_MAC_UL_MU_DATA_DISABLE_RX_IDX	44	/* OM - UL MU Data Disable RX */
189*4882a593Smuzhiyun #define HE_MAC_UL_MU_DATA_DISABLE_RX_FSZ	1
190*4882a593Smuzhiyun #define HE_MAC_DYNAMIC_SM_PWR_SAVE_IDX		45	/* HE Dynamic SM Power Save */
191*4882a593Smuzhiyun #define HE_MAC_DYNAMIC_SM_PWR_SAVE_FSZ		1
192*4882a593Smuzhiyun #define HE_MAC_PUNCT_SOUNDING_SUPP_IDX		46	/* Punctured Sounding Support */
193*4882a593Smuzhiyun #define HE_MAC_PUNCT_SOUNDING_SUPP_FSZ		1
194*4882a593Smuzhiyun #define HE_MAC_HT_VHT_TRIG_FRAME_RX_IDX		47	/* HT And VHT Trigger Frame RX Support */
195*4882a593Smuzhiyun #define HE_MAC_HT_VHT_TRIG_FRAME_RX_FSZ		1
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun /* HE PHY Capabilities Information field (figure 9-589cl) */
198*4882a593Smuzhiyun #define HE_PHY_CAP_INFO_SIZE			11u
199*4882a593Smuzhiyun typedef uint8 he_phy_cap_t[HE_PHY_CAP_INFO_SIZE];
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun /* bit position and field width */
202*4882a593Smuzhiyun /* bit 0 - Reserved */
203*4882a593Smuzhiyun #define HE_PHY_CH_WIDTH_SET_IDX			1	/* Channel Width Set */
204*4882a593Smuzhiyun #define HE_PHY_CH_WIDTH_SET_FSZ			7
205*4882a593Smuzhiyun #define HE_PHY_PUNCT_PREAMBLE_RX_IDX		8	/* Punctured Preamble Rx */
206*4882a593Smuzhiyun #define HE_PHY_PUNCT_PREAMBLE_RX_FSZ		4
207*4882a593Smuzhiyun #define HE_PHY_DEVICE_CLASS_IDX			12	/* Device Class */
208*4882a593Smuzhiyun #define HE_PHY_DEVICE_CLASS_FSZ			1
209*4882a593Smuzhiyun #define HE_PHY_LDPC_PYLD_IDX			13	/* LDPC Coding In Payload */
210*4882a593Smuzhiyun #define HE_PHY_LDPC_PYLD_FSZ			1
211*4882a593Smuzhiyun #define HE_PHY_SU_PPDU_1x_LTF_0_8_GI_IDX	14	/* SU PPDU 1x LTF GI 0.8 us */
212*4882a593Smuzhiyun #define HE_PHY_SU_PPDU_1x_LTF_0_8_GI_FSZ	1
213*4882a593Smuzhiyun #define HE_PHY_MIDAMBLE_MAX_NSTS_IDX		15	/* Midamble Tx/Rx Max NSTS */
214*4882a593Smuzhiyun #define HE_PHY_MIDAMBLE_MAX_NSTS_FSZ		2
215*4882a593Smuzhiyun #define HE_PHY_NDP_4x_LTF_3_2_GI_IDX		17	/* NDP with 4xLTF 3.2us GI */
216*4882a593Smuzhiyun #define HE_PHY_NDP_4x_LTF_3_2_GI_FSZ		1
217*4882a593Smuzhiyun #define HE_PHY_STBC_TX_IDX			18	/* STBC Tx for <= 80 MHz */
218*4882a593Smuzhiyun #define HE_PHY_STBC_TX_FSZ			1
219*4882a593Smuzhiyun #define HE_PHY_STBC_RX_IDX			19	/* STBC Rx for <= 80 MHz */
220*4882a593Smuzhiyun #define HE_PHY_STBC_RX_FSZ			1
221*4882a593Smuzhiyun #define HE_PHY_DOPPLER_TX_IDX			20	/* Doppler Tx */
222*4882a593Smuzhiyun #define HE_PHY_DOPPLER_TX_FSZ			1
223*4882a593Smuzhiyun #define HE_PHY_DOPPLER_RX_IDX			21	/* Doppler Rx */
224*4882a593Smuzhiyun #define HE_PHY_DOPPLER_RX_FSZ			1
225*4882a593Smuzhiyun #define HE_PHY_FULL_BW_UL_MU_MIMO_IDX		22	/* Full bandwidth UL MU MIMO */
226*4882a593Smuzhiyun #define HE_PHY_FULL_BW_UL_MU_MIMO_FSZ		1
227*4882a593Smuzhiyun #define HE_PHY_PART_BW_UL_MU_MIMO_IDX		23	/* Partial bandwidth UL MU MIMO */
228*4882a593Smuzhiyun #define HE_PHY_PART_BW_UL_MU_MIMO_FSZ		1
229*4882a593Smuzhiyun #define HE_PHY_DCM_MAX_CONST_TX_IDX		24	/* DCM Max Constellation Tx */
230*4882a593Smuzhiyun #define HE_PHY_DCM_MAX_CONST_TX_FSZ		2
231*4882a593Smuzhiyun #define HE_PHY_DCM_MAX_NSS_TX_IDX		26	/* DCM Max NSS Tx */
232*4882a593Smuzhiyun #define HE_PHY_DCM_MAX_NSS_TX_FSZ		1
233*4882a593Smuzhiyun #define HE_PHY_DCM_MAX_CONST_RX_IDX		27	/* DCM Max Constellation Rx */
234*4882a593Smuzhiyun #define HE_PHY_DCM_MAX_CONST_RX_FSZ		2
235*4882a593Smuzhiyun #define HE_PHY_DCM_MAX_NSS_RX_IDX		29	/* DCM Max NSS Rx */
236*4882a593Smuzhiyun #define HE_PHY_DCM_MAX_NSS_RX_FSZ		1
237*4882a593Smuzhiyun #define HE_PHY_RX_MU_PPDU_IDX			30	/* Rx HE MU PPDU From nonAP STA */
238*4882a593Smuzhiyun #define HE_PHY_RX_MU_PPDU_FSZ			1
239*4882a593Smuzhiyun #define HE_PHY_SU_BEAMFORMER_IDX		31	/* SU Beamformer */
240*4882a593Smuzhiyun #define HE_PHY_SU_BEAMFORMER_FSZ		1
241*4882a593Smuzhiyun #define HE_PHY_SU_BEAMFORMEE_IDX		32	/* SU Beamformee */
242*4882a593Smuzhiyun #define HE_PHY_SU_BEAMFORMEE_FSZ		1
243*4882a593Smuzhiyun #define HE_PHY_MU_BEAMFORMER_IDX		33	/* MU Beamformer */
244*4882a593Smuzhiyun #define HE_PHY_MU_BEAMFORMER_FSZ		1
245*4882a593Smuzhiyun #define HE_PHY_BEAMFORMEE_STS_BELOW80MHZ_IDX	34	/* Beamformee STS For <= 80MHz */
246*4882a593Smuzhiyun #define HE_PHY_BEAMFORMEE_STS_BELOW80MHZ_FSZ	3
247*4882a593Smuzhiyun #define HE_PHY_BEAMFORMEE_STS_ABOVE80MHZ_IDX	37	/* Beamformee STS For >80 MHz */
248*4882a593Smuzhiyun #define HE_PHY_BEAMFORMEE_STS_ABOVE80MHZ_FSZ	3
249*4882a593Smuzhiyun #define HE_PHY_SOUND_DIM_BELOW80MHZ_IDX		40	/* Num. Sounding Dim.<= 80 MHz */
250*4882a593Smuzhiyun #define HE_PHY_SOUND_DIM_BELOW80MHZ_FSZ		3
251*4882a593Smuzhiyun #define HE_PHY_SOUND_DIM_ABOVE80MHZ_IDX		43	/* Num. Sounding Dim.> 80 MHz */
252*4882a593Smuzhiyun #define HE_PHY_SOUND_DIM_ABOVE80MHZ_FSZ		3
253*4882a593Smuzhiyun #define HE_PHY_SU_FEEDBACK_NG16_SUPPORT_IDX	46	/* Ng=16 For SU Feedback */
254*4882a593Smuzhiyun #define HE_PHY_SU_FEEDBACK_NG16_SUPPORT_FSZ	1
255*4882a593Smuzhiyun #define HE_PHY_MU_FEEDBACK_NG16_SUPPORT_IDX	47	/* Ng=16 For MU Feedback */
256*4882a593Smuzhiyun #define HE_PHY_MU_FEEDBACK_NG16_SUPPORT_FSZ	1
257*4882a593Smuzhiyun #define HE_PHY_SU_CODEBOOK_SUPPORT_IDX		48	/* Codebook Sz {4, 2} For SU */
258*4882a593Smuzhiyun #define HE_PHY_SU_CODEBOOK_SUPPORT_FSZ		1
259*4882a593Smuzhiyun #define HE_PHY_MU_CODEBOOK_SUPPORT_IDX		49	/* Codebook Size {7, 5} For MU */
260*4882a593Smuzhiyun #define HE_PHY_MU_CODEBOOK_SUPPORT_FSZ		1
261*4882a593Smuzhiyun #define HE_PHY_TRG_SU_BFM_FEEDBACK_IDX		50	/* Triggered SU TXBF Feedback */
262*4882a593Smuzhiyun #define HE_PHY_TRG_SU_BFM_FEEDBACK_FSZ		1
263*4882a593Smuzhiyun #define HE_PHY_TRG_MU_BFM_FEEDBACK_IDX		51	/* Triggered MU TXBF partial BW Feedback */
264*4882a593Smuzhiyun #define HE_PHY_TRG_MU_BFM_FEEDBACK_FSZ		1
265*4882a593Smuzhiyun #define HE_PHY_TRG_CQI_FEEDBACK_IDX		52	/* Triggered CQI Feedback */
266*4882a593Smuzhiyun #define HE_PHY_TRG_CQI_FEEDBACK_FSZ		1
267*4882a593Smuzhiyun #define HE_PHY_PART_BW_EXT_RANGE_IDX		53	/* Partial BW Extended Range */
268*4882a593Smuzhiyun #define HE_PHY_PART_BW_EXT_RANGE_FSZ		1
269*4882a593Smuzhiyun #define HE_PHY_DL_MU_MIMO_PART_BW_IDX		54	/* Partial Bandwidth DL MU MIMO */
270*4882a593Smuzhiyun #define HE_PHY_DL_MU_MIMO_PART_BW_FSZ		1
271*4882a593Smuzhiyun #define HE_PHY_PPE_THRESH_PRESENT_IDX		55	/* PPE Threshold Present */
272*4882a593Smuzhiyun #define HE_PHY_PPE_THRESH_PRESENT_FSZ		1
273*4882a593Smuzhiyun #define HE_PHY_SRP_SR_SUPPORT_IDX		56	/* SRP based SR Support */
274*4882a593Smuzhiyun #define HE_PHY_SRP_SR_SUPPORT_FSZ		1
275*4882a593Smuzhiyun #define HE_PHY_POWER_BOOST_FACTOR_IDX		57	/* Power Boost Factor Support */
276*4882a593Smuzhiyun #define HE_PHY_POWER_BOOST_FACTOR_FSZ		1
277*4882a593Smuzhiyun #define HE_PHY_4X_LTF_0_8_GI_SUPPORT_IDX	58	/* HE SU PPDU And HE MU PPDU with
278*4882a593Smuzhiyun 							* 4x HE-LTF And 0.8 us GI
279*4882a593Smuzhiyun 							*/
280*4882a593Smuzhiyun #define HE_PHY_4X_LTF_0_8_GI_SUPPORT_FSZ	1
281*4882a593Smuzhiyun #define HE_PHY_MAX_NC_IDX			59	/* Maximum NC */
282*4882a593Smuzhiyun #define HE_PHY_MAX_NC_FSZ			3
283*4882a593Smuzhiyun #define HE_PHY_STBC_TX_ABOVE_80_IDX		62	/* STBC Tx above 80 MHz */
284*4882a593Smuzhiyun #define HE_PHY_STBC_TX_ABOVE_80_FSZ		1
285*4882a593Smuzhiyun #define HE_PHY_STBC_RX_ABOVE_80_IDX		63	/* STBC Rx above 80 MHz */
286*4882a593Smuzhiyun #define HE_PHY_STBC_RX_ABOVE_80_FSZ		1
287*4882a593Smuzhiyun #define HE_PHY_ER_SU_4X_LTF_0_8_GI_IDX		64	/* ER SU PPDU 4x HE-LTF 0.8 GI */
288*4882a593Smuzhiyun #define HE_PHY_ER_SU_4X_LTF_0_8_GI_FSZ		1
289*4882a593Smuzhiyun #define HE_PHY_20_IN_40_2G_IDX			65	/* 20 in 40 MHz HE PPDU in 2G */
290*4882a593Smuzhiyun #define HE_PHY_20_IN_40_2G_FSZ			1
291*4882a593Smuzhiyun #define HE_PHY_20_IN_160_80P80_IDX		66	/* 20 in 160/80+80 MHz HE PPDU */
292*4882a593Smuzhiyun #define HE_PHY_20_IN_160_80P80_FSZ		1
293*4882a593Smuzhiyun #define HE_PHY_80_IN_160_80P80_IDX		67	/* 80 in 160/80+80 MHz HE PPDU */
294*4882a593Smuzhiyun #define HE_PHY_80_IN_160_80P80_FSZ		1
295*4882a593Smuzhiyun #define HE_PHY_ER_SU_1X_LTF_0_8_GI_IDX		68	/* HE ER SU 1x HE-LTF 0.8 GI */
296*4882a593Smuzhiyun #define HE_PHY_ER_SU_1X_LTF_0_8_GI_FSZ		1
297*4882a593Smuzhiyun #define HE_PHY_MIDAMBLE_2X_1X_LTF_IDX		69	/* Midamble TX/RX 2x & 1x HE LTF */
298*4882a593Smuzhiyun #define HE_PHY_MIDAMBLE_2X_1X_LTF_FSZ		1
299*4882a593Smuzhiyun #define HE_PHY_DCM_MAX_BW_IDX			70	/* DCM Max BW */
300*4882a593Smuzhiyun #define HE_PHY_DCM_MAX_BW_FSZ			2
301*4882a593Smuzhiyun #define HE_PHY_ABOVE16_OFDM_SYM_IDX		72	/* Longer than 16 HE-SIGB OFDM
302*4882a593Smuzhiyun 							 * Symbol support
303*4882a593Smuzhiyun 							 */
304*4882a593Smuzhiyun #define HE_PHY_ABOVE16_OFDM_SYM_FSZ		1
305*4882a593Smuzhiyun #define HE_PHY_NON_TRIG_CQI_FDBK_IDX		73	/* Non-triggered CQI feedback Support */
306*4882a593Smuzhiyun #define HE_PHY_NON_TRIG_CQI_FDBK_FSZ		1
307*4882a593Smuzhiyun #define HE_PHY_1024_QAM_TX_BELOW_242_RU_IDX	74	/* Tx 1024 QAM in < 242 RU Tone Support */
308*4882a593Smuzhiyun #define HE_PHY_1024_QAM_TX_BELOW_242_RU_FSZ	1
309*4882a593Smuzhiyun #define HE_PHY_1024_QAM_RX_BELOW_242_RU_IDX	75	/* Rx 1024 QAM in < 242 RU Tone Support */
310*4882a593Smuzhiyun #define HE_PHY_1024_QAM_RX_BELOW_242_RU_FSZ	1
311*4882a593Smuzhiyun #define HE_PHY_RX_FULL_BW_MU_COMP_SIGB_IDX	76	/* Rx Full BW MU PPDU with Comp. SIGB */
312*4882a593Smuzhiyun #define HE_PHY_RX_FULL_BW_MU_COMP_SIGB_FSZ	1
313*4882a593Smuzhiyun #define HE_PHY_RX_FULL_BW_MU_NON_COMP_SIGB_IDX	77	/* Rx Full BW MU PPDU Non-Comp SIGB */
314*4882a593Smuzhiyun #define HE_PHY_RX_FULL_BW_MU_NON_COMP_SIGB_FSZ	1
315*4882a593Smuzhiyun 
316*4882a593Smuzhiyun /* HE Mac Capabilities values */
317*4882a593Smuzhiyun /* b3-b4: Fragmentation Support field (table 9-262z) */
318*4882a593Smuzhiyun #define HE_MAC_FRAG_NOSUPPORT		0	/* dynamic fragmentation not supported */
319*4882a593Smuzhiyun #define HE_MAC_FRAG_PER_MPDU		1	/* dynamic fragmentation of MPDU/SMPDU */
320*4882a593Smuzhiyun #define HE_MAC_FRAG_ONE_PER_AMPDU	2	/* upto 1 fragment per AMPDU/MMPDU */
321*4882a593Smuzhiyun #define HE_MAC_FRAG_MULTI_PER_AMPDU	3	/* multiple fragment per AMPDU */
322*4882a593Smuzhiyun 
323*4882a593Smuzhiyun /* b5-b7 : Maximum Number Of Fragmented MSDUs/AMSDUs Exponent */
324*4882a593Smuzhiyun #define HE_MAC_MAXFRAG_NUM_NO_RESTRICT	7
325*4882a593Smuzhiyun 
326*4882a593Smuzhiyun /* b8-b9: Minimum payload size of first fragment */
327*4882a593Smuzhiyun #define HE_MAC_MINFRAG_NO_RESTRICT	0	/* no restriction on min. payload size */
328*4882a593Smuzhiyun #define HE_MAC_MINFRAG_SIZE_128		1	/* minimum payload size of 128 Bytes */
329*4882a593Smuzhiyun #define HE_MAC_MINFRAG_SIZE_256		2	/* minimum payload size of 256 Bytes */
330*4882a593Smuzhiyun #define HE_MAC_MINFRAG_SIZE_512		3	/* minimum payload size of 512 Bytes */
331*4882a593Smuzhiyun 
332*4882a593Smuzhiyun /* b10-b11: Trigger Frame MAC Padding Duration */
333*4882a593Smuzhiyun #define HE_MAC_TRIG_MAC_PAD_0		0
334*4882a593Smuzhiyun #define HE_MAC_TRIG_MAC_PAD_8us		1
335*4882a593Smuzhiyun #define HE_MAC_TRIG_MAC_PAD_16us	2
336*4882a593Smuzhiyun 
337*4882a593Smuzhiyun /* b15-b16: HE Link Adaptation */
338*4882a593Smuzhiyun #define HE_MAC_SEND_NO_MFB		0	/* if STA does not provide HE MFB */
339*4882a593Smuzhiyun #define HE_MAC_SEND_UNSOLICATED_MFB	2	/* if STA provides unsolicited HE MFB */
340*4882a593Smuzhiyun #define HE_MAC_SEND_MFB_IN_RESPONSE	3	/* if STA can provide HE MFB in response to
341*4882a593Smuzhiyun 						* HE MRQ and if the STA provides unsolicited HE MFB.
342*4882a593Smuzhiyun 						*/
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun /* b27-b28: Max. AMPDU Length HE Exponent */
345*4882a593Smuzhiyun /* Use Max AMPDU length exponent from VHT or HT */
346*4882a593Smuzhiyun #define HE_MAC_MAX_AMPDU_EXP_ADOPT_VHT	(0)
347*4882a593Smuzhiyun /* Max. AMPDU length =
348*4882a593Smuzhiyun  * 2^(20 + MAX_AMPDU_LEN_HE_EXPO_1) -1 (if this value in VHT CAP is 7) or
349*4882a593Smuzhiyun  * 2^(16 + MAX_AMPDU_LEN_HE_EXPO_1) -1 (if this value in HT CAP is 3).
350*4882a593Smuzhiyun  */
351*4882a593Smuzhiyun #define HE_MAC_MAX_AMPDU_EXP_HE_1	(1)
352*4882a593Smuzhiyun /* Max. AMPDU length =
353*4882a593Smuzhiyun  * 2^(20 + MAX_AMPDU_LEN_HE_EXPO_2) -1 (if this value in VHT CAP is 7) or
354*4882a593Smuzhiyun  * 2^(16 + MAX_AMPDU_LEN_HE_EXPO_2) -1 (if this value in HT CAP is 3).
355*4882a593Smuzhiyun  */
356*4882a593Smuzhiyun #define HE_MAC_MAX_AMPDU_EXP_HE_2	(2)
357*4882a593Smuzhiyun /* Max. AMPDU length =
358*4882a593Smuzhiyun  * 2^(20 + MAX_AMPDU_LEN_HE_EXPO_3) -1 (if this value in VHT CAP is 7) or
359*4882a593Smuzhiyun  * 2^(16 + MAX_AMPDU_LEN_HE_EXPO_3) -1 (if this value in HT CAP is 3).
360*4882a593Smuzhiyun  */
361*4882a593Smuzhiyun #define HE_MAC_MAX_AMPDU_EXP_HE_3	(3)
362*4882a593Smuzhiyun 
363*4882a593Smuzhiyun /* HE PHY Capabilities values */
364*4882a593Smuzhiyun /* b1-b7: Channel Width Support field */
365*4882a593Smuzhiyun #define HE_PHY_CH_WIDTH_2G_40		0x01
366*4882a593Smuzhiyun #define HE_PHY_CH_WIDTH_5G_80		0x02
367*4882a593Smuzhiyun #define HE_PHY_CH_WIDTH_5G_160		0x04
368*4882a593Smuzhiyun #define HE_PHY_CH_WIDTH_5G_80P80	0x08
369*4882a593Smuzhiyun #define HE_PHY_CH_WIDTH_2G_242RU	0x10
370*4882a593Smuzhiyun #define HE_PHY_CH_WIDTH_5G_242RU	0x20
371*4882a593Smuzhiyun 
372*4882a593Smuzhiyun /* b8-b11: Preamble puncturing Rx */
373*4882a593Smuzhiyun /* Rx of 80 MHz preamble where secondary 20 MHz subchannel is punctured */
374*4882a593Smuzhiyun #define HE_PHY_PREAMBLE_PUNC_RX_0	0x1
375*4882a593Smuzhiyun /* Rx of 80 MHz preamble where one of two 20 MHz subchannels in secondary 40 MHz is punctured */
376*4882a593Smuzhiyun #define HE_PHY_PREAMBLE_PUNC_RX_1	0x2
377*4882a593Smuzhiyun /* Rx of 160 MHz or 80+80 MHz preamble where primary 80 MHz of
378*4882a593Smuzhiyun  * preamble only the secondary 20 MHz is punctured
379*4882a593Smuzhiyun  */
380*4882a593Smuzhiyun #define HE_PHY_PREAMBLE_PUNC_RX_2	0x4
381*4882a593Smuzhiyun /* Rx of 160 MHz or 80+80 MHz preamble where primary 80 MHz of
382*4882a593Smuzhiyun  * the preamble, the primary 40 MHz is present
383*4882a593Smuzhiyun  */
384*4882a593Smuzhiyun #define HE_PHY_PREAMBLE_PUNC_RX_3	0x8
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun /* b24-b26: DCM Encoding Tx */
387*4882a593Smuzhiyun #define HE_PHY_TX_DCM_ENC_NOSUPPORT	0x00
388*4882a593Smuzhiyun #define HE_PHY_TX_DCM_ENC_BPSK		0x01
389*4882a593Smuzhiyun #define HE_PHY_TX_DCM_ENC_QPSK		0x02
390*4882a593Smuzhiyun #define HE_PHY_TX_DCM_ENC_QAM		0x03
391*4882a593Smuzhiyun 
392*4882a593Smuzhiyun #define HE_PHY_TX_DCM_1_SS		0x00
393*4882a593Smuzhiyun #define HE_PHY_TX_DCM_2_SS		0x01
394*4882a593Smuzhiyun 
395*4882a593Smuzhiyun /* b27-b29: DCM Encoding Rx */
396*4882a593Smuzhiyun #define HE_PHY_RX_DCM_ENC_NOSUPPORT	0x00
397*4882a593Smuzhiyun #define HE_PHY_RX_DCM_ENC_BPSK		0x01
398*4882a593Smuzhiyun #define HE_PHY_RX_DCM_ENC_QPSK		0x02
399*4882a593Smuzhiyun #define HE_PHY_RX_DCM_ENC_QAM		0x03
400*4882a593Smuzhiyun 
401*4882a593Smuzhiyun #define HE_PHY_RX_DCM_1_SS		0x00
402*4882a593Smuzhiyun #define HE_PHY_RX_DCM_2_SS		0x01
403*4882a593Smuzhiyun 
404*4882a593Smuzhiyun /* b70-b71: DCM Max BW */
405*4882a593Smuzhiyun #define HE_PHY_DCM_MAX_BW_20		0
406*4882a593Smuzhiyun #define HE_PHY_DCM_MAX_BW_40		1
407*4882a593Smuzhiyun #define HE_PHY_DCM_MAX_BW_80		2
408*4882a593Smuzhiyun #define HE_PHY_DCM_MAX_BW_160		3
409*4882a593Smuzhiyun 
410*4882a593Smuzhiyun /* HE Duration based RTS Threshold Figure 9-589cr */
411*4882a593Smuzhiyun #define HE_RTS_THRES_DISABLED		1023
412*4882a593Smuzhiyun #define HE_RTS_THRES_ALL_FRAMES		0
413*4882a593Smuzhiyun #define HE_RTS_THRES_MASK		0x03ff
414*4882a593Smuzhiyun 
415*4882a593Smuzhiyun /* Tx Rx HE MCS Support field format : Table 9-589cm */
416*4882a593Smuzhiyun #define HE_TX_RX_MCS_NSS_SUP_FIELD_MIN_SIZE	4u
417*4882a593Smuzhiyun 
418*4882a593Smuzhiyun /**
419*4882a593Smuzhiyun * Bandwidth configuration indices used in the HE TX-RX MCS support field
420*4882a593Smuzhiyun * Section 9.4.2.218.4
421*4882a593Smuzhiyun */
422*4882a593Smuzhiyun #define HE_BW20_CFG_IDX		0
423*4882a593Smuzhiyun #define HE_BW40_CFG_IDX		1
424*4882a593Smuzhiyun #define HE_BW80_CFG_IDX		2
425*4882a593Smuzhiyun #define HE_BW80P80_CFG_IDX	3
426*4882a593Smuzhiyun #define HE_BW160_CFG_IDX	4
427*4882a593Smuzhiyun #define HE_MAX_BW_CFG		5
428*4882a593Smuzhiyun 
429*4882a593Smuzhiyun #define HE_MCS_CODE_0_7		0u
430*4882a593Smuzhiyun #define HE_MCS_CODE_0_9		1u
431*4882a593Smuzhiyun #define HE_MCS_CODE_0_11	2u
432*4882a593Smuzhiyun #define HE_MCS_CODE_NONE	3u
433*4882a593Smuzhiyun #define HE_MCS_CODE_SIZE	2u	/* num bits */
434*4882a593Smuzhiyun #define HE_MCS_CODE_MASK	0x3u	/* mask for 1-stream */
435*4882a593Smuzhiyun 
436*4882a593Smuzhiyun /* Defines for The Max HE MCS For n SS subfield (where n = 1, ..., 8) */
437*4882a593Smuzhiyun #define HE_MCS_MAP_NSS_MAX	8u	/* Max number of streams possible */
438*4882a593Smuzhiyun #define HE_MCS_NSS_SET_MASK	0xffffu /* Field is to be 16 bits long */
439*4882a593Smuzhiyun #define HE_MCS_NSS_GET_SS_IDX(nss) (((nss)-1u) * HE_MCS_CODE_SIZE)
440*4882a593Smuzhiyun #define HE_MCS_NSS_GET_MCS(nss, mcs_nss_map) \
441*4882a593Smuzhiyun 	(((mcs_nss_map) >> HE_MCS_NSS_GET_SS_IDX(nss)) & HE_MCS_CODE_MASK)
442*4882a593Smuzhiyun #define HE_MCS_NSS_SET_MCS(nss, mcs_code, mcs_nss_map) \
443*4882a593Smuzhiyun 	do { \
444*4882a593Smuzhiyun 	(mcs_nss_map) &= (~(HE_MCS_CODE_MASK << HE_MCS_NSS_GET_SS_IDX(nss))); \
445*4882a593Smuzhiyun 	(mcs_nss_map) |= (((mcs_code) & HE_MCS_CODE_MASK) << HE_MCS_NSS_GET_SS_IDX(nss)); \
446*4882a593Smuzhiyun 	(mcs_nss_map) &= (HE_MCS_NSS_SET_MASK); \
447*4882a593Smuzhiyun 	} while (0)
448*4882a593Smuzhiyun 
449*4882a593Smuzhiyun #define HE_BW80_ORDR_IDX	0u
450*4882a593Smuzhiyun #define HE_BW160_ORDR_IDX	1u
451*4882a593Smuzhiyun #define HE_BW80P80_ORDR_IDX	2u
452*4882a593Smuzhiyun 
453*4882a593Smuzhiyun #define HE_MCS_NSS_SUP_FLD_UNIT_MAP_LEN	2u	/* 2 bytes */
454*4882a593Smuzhiyun #define HE_MCS_NSS_SUP_FLD_UNIT_MAP_SZ	(HE_MCS_NSS_SUP_FLD_UNIT_MAP_LEN * 8u) /* 16 bits */
455*4882a593Smuzhiyun 
456*4882a593Smuzhiyun /* Two unit-maps (TX+RX) */
457*4882a593Smuzhiyun #define HE_MCS_NSS_SUP_FLD_TXRX_MAP_LEN	(HE_MCS_NSS_SUP_FLD_UNIT_MAP_LEN * 2u)
458*4882a593Smuzhiyun #define HE_MCS_NSS_SUP_FLD_TXRX_MAP_SZ (HE_MCS_NSS_SUP_FLD_TXRX_MAP_LEN * 8u) /* 32 bits */
459*4882a593Smuzhiyun 
460*4882a593Smuzhiyun /* One TX-RX unit-map (80 MHz) */
461*4882a593Smuzhiyun #define HE_MCS_NSS_SUP_FLD_MIN_LEN	(HE_MCS_NSS_SUP_FLD_TXRX_MAP_LEN)
462*4882a593Smuzhiyun /* Three TX-RX unit-maps (80 MHz, 160MHz, 80+80MHz) */
463*4882a593Smuzhiyun #define HE_MCS_NSS_SUP_FLD_MAX_LEN	(HE_MCS_NSS_SUP_FLD_TXRX_MAP_LEN * 3u)
464*4882a593Smuzhiyun 
465*4882a593Smuzhiyun /* HE Capabilities element */
466*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct he_cap_ie {
467*4882a593Smuzhiyun 	uint8 id;
468*4882a593Smuzhiyun 	uint8 len;
469*4882a593Smuzhiyun 	uint8 id_ext;
470*4882a593Smuzhiyun 	he_mac_cap_t mac_cap;		/* MAC Capabilities Information */
471*4882a593Smuzhiyun 	he_phy_cap_t phy_cap;		/* PHY Capabilities Information */
472*4882a593Smuzhiyun 	/* he_tx_rx_mcs_nss_sup_t txx_rx_mcs_nss_sup; */ /* Tx Rx HE MCS NSS Support (variable) */
473*4882a593Smuzhiyun 	/* he_ppe_ths_t ppe_ths; */	/* PPE Thresholds (optional) */
474*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT;
475*4882a593Smuzhiyun 
476*4882a593Smuzhiyun typedef struct he_cap_ie he_cap_ie_t;
477*4882a593Smuzhiyun 
478*4882a593Smuzhiyun /* Multiple BSSID element */
479*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct nontrans_BSSID_cap {
480*4882a593Smuzhiyun 	uint8 id; /* 83 */
481*4882a593Smuzhiyun 	uint8 len;
482*4882a593Smuzhiyun 	uint16 capability;
483*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT;
484*4882a593Smuzhiyun 
485*4882a593Smuzhiyun typedef struct nontrans_BSSID_cap nontrans_BSSID_cap_t;
486*4882a593Smuzhiyun 
487*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct multi_BSSID_index {
488*4882a593Smuzhiyun 	uint8 id; /* 85 */
489*4882a593Smuzhiyun 	uint8 len; /* 3 in beacon, 1 in probe response */
490*4882a593Smuzhiyun 	uint8 bssid_index; /* between 1 and 2^n - 1 */
491*4882a593Smuzhiyun 	uint8 dtim_period; /* only valid in beacon */
492*4882a593Smuzhiyun 	uint8 dtim_count; /* only valid in beacon */
493*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT;
494*4882a593Smuzhiyun 
495*4882a593Smuzhiyun typedef struct multi_BSSID_index multi_BSSID_index_t;
496*4882a593Smuzhiyun 
497*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct fms_descriptor {
498*4882a593Smuzhiyun 	uint8 id; /* 86 */
499*4882a593Smuzhiyun 	uint8 len;
500*4882a593Smuzhiyun 	uint8 num_FMS_counters;
501*4882a593Smuzhiyun 	uint8 *FMS_counters;
502*4882a593Smuzhiyun 	uint8 *FMSID;
503*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT;
504*4882a593Smuzhiyun 
505*4882a593Smuzhiyun typedef struct fms_descriptor fms_descriptor_t;
506*4882a593Smuzhiyun 
507*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct nontrans_BSSID_profile_subie {
508*4882a593Smuzhiyun 	uint8 subie_id; /* 0 */
509*4882a593Smuzhiyun 	uint8 subie_len;
510*4882a593Smuzhiyun 	uint8 moreie[1];
511*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT;
512*4882a593Smuzhiyun 
513*4882a593Smuzhiyun typedef struct nontrans_BSSID_profile_subie nontrans_BSSID_profile_subie_t;
514*4882a593Smuzhiyun 
515*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct multi_BSSID_ie {
516*4882a593Smuzhiyun 	uint8 id;
517*4882a593Smuzhiyun 	uint8 len;
518*4882a593Smuzhiyun 	uint8 maxBSSID_indicator;
519*4882a593Smuzhiyun 	nontrans_BSSID_profile_subie_t profile[1];
520*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT;
521*4882a593Smuzhiyun 
522*4882a593Smuzhiyun typedef struct multi_BSSID_ie multi_BSSID_ie_t;
523*4882a593Smuzhiyun #define DOT11_MULTIPLE_BSSID_PROFILE_SUBID 0
524*4882a593Smuzhiyun 
525*4882a593Smuzhiyun /* Table 9-262ab, Highest MCS Supported subfield encoding */
526*4882a593Smuzhiyun #define HE_CAP_MCS_CODE_0_7		0
527*4882a593Smuzhiyun #define HE_CAP_MCS_CODE_0_8		1
528*4882a593Smuzhiyun #define HE_CAP_MCS_CODE_0_9		2
529*4882a593Smuzhiyun #define HE_CAP_MCS_CODE_0_10		3
530*4882a593Smuzhiyun #define HE_CAP_MCS_CODE_0_11		4
531*4882a593Smuzhiyun #define HE_CAP_MCS_CODE_SIZE		3	/* num bits for 1-stream */
532*4882a593Smuzhiyun #define HE_CAP_MCS_CODE_MASK		0x7	/* mask for 1-stream */
533*4882a593Smuzhiyun 
534*4882a593Smuzhiyun #define HE_CAP_MCS_MAP_NSS_MAX	8u	/* Max number of streams possible */
535*4882a593Smuzhiyun 
536*4882a593Smuzhiyun #define HE_MAX_RU_COUNT		4u	/* Max number of RU allocation possible */
537*4882a593Smuzhiyun 
538*4882a593Smuzhiyun #define HE_NSSM1_IDX		0	/* Offset of NSSM1 field */
539*4882a593Smuzhiyun #define HE_NSSM1_LEN		3	/* length of NSSM1 field in bits */
540*4882a593Smuzhiyun 
541*4882a593Smuzhiyun #define HE_RU_INDEX_MASK_IDX	3	/* Offset of RU index mask field */
542*4882a593Smuzhiyun #define HE_RU_INDEX_MASK_LEN	4u	/* length of RU Index mask field in bits */
543*4882a593Smuzhiyun 
544*4882a593Smuzhiyun /* PPE Threshold field (figure 9-589co) */
545*4882a593Smuzhiyun #define HE_PPE_THRESH_NSS_RU_FSZ	3u
546*4882a593Smuzhiyun 
547*4882a593Smuzhiyun /* PPE Threshold Info field (figure 9-589cp) */
548*4882a593Smuzhiyun /* ruc: RU Count; NSSnM1: NSSn - 1; RUmM1: RUm - 1 */
549*4882a593Smuzhiyun /* bit offset in PPE Threshold field */
550*4882a593Smuzhiyun #define HE_PPET16_BIT_OFFSET(ruc, NSSnM1, RUmM1) \
551*4882a593Smuzhiyun 	(HE_NSSM1_LEN + HE_RU_INDEX_MASK_LEN + ((NSSnM1) * (ruc) + (RUmM1)) * 6)
552*4882a593Smuzhiyun 
553*4882a593Smuzhiyun #define HE_PPET8_BIT_OFFSET(ruc, NSSnM1, RUmM1) \
554*4882a593Smuzhiyun 	(HE_NSSM1_LEN + HE_RU_INDEX_MASK_LEN + ((NSSnM1) * (ruc) + (RUmM1)) * 6 + 3)
555*4882a593Smuzhiyun 
556*4882a593Smuzhiyun /* Total PPE Threshold field byte length (Figure 9-589cq) */
557*4882a593Smuzhiyun #define HE_PPE_THRESH_LEN(nss, ruc) \
558*4882a593Smuzhiyun 	(CEIL((HE_NSSM1_LEN + HE_RU_INDEX_MASK_LEN + ((nss) * (ruc) * 6)), 8))
559*4882a593Smuzhiyun 
560*4882a593Smuzhiyun /* RU Allocation Index encoding (table 9-262ae) */
561*4882a593Smuzhiyun #define HE_RU_ALLOC_IDX_242		0	/* RU alloc: 282 tones */
562*4882a593Smuzhiyun #define HE_RU_ALLOC_IDX_484		1	/* RU alloc: 484 tones - 40Mhz */
563*4882a593Smuzhiyun #define HE_RU_ALLOC_IDX_996		2	/* RU alloc: 996 tones - 80Mhz */
564*4882a593Smuzhiyun #define HE_RU_ALLOC_IDX_2x996		3	/* RU alloc: 2x996 tones - 80p80/160Mhz */
565*4882a593Smuzhiyun 
566*4882a593Smuzhiyun /* Constellation Index encoding (table 9-262ac) */
567*4882a593Smuzhiyun #define HE_CONST_IDX_BPSK		0
568*4882a593Smuzhiyun #define HE_CONST_IDX_QPSK		1
569*4882a593Smuzhiyun #define HE_CONST_IDX_16QAM		2
570*4882a593Smuzhiyun #define HE_CONST_IDX_64QAM		3
571*4882a593Smuzhiyun #define HE_CONST_IDX_256QAM		4
572*4882a593Smuzhiyun #define HE_CONST_IDX_1024QAM		5
573*4882a593Smuzhiyun #define HE_CONST_IDX_RSVD		6
574*4882a593Smuzhiyun #define HE_CONST_IDX_NONE		7
575*4882a593Smuzhiyun 
576*4882a593Smuzhiyun /* Min HE cap ie length when only 80Mhz is supported */
577*4882a593Smuzhiyun #define HE_CAP_IE_MIN_LEN	(sizeof(he_cap_ie_t) - TLV_HDR_LEN + HE_MCS_NSS_SUP_FLD_MIN_LEN)
578*4882a593Smuzhiyun 
579*4882a593Smuzhiyun /* Max HE cap ie length considering MAX NSS and RU */
580*4882a593Smuzhiyun #define HE_CAP_IE_MAX_LEN	(sizeof(he_cap_ie_t) - TLV_HDR_LEN + HE_MCS_NSS_SUP_FLD_MAX_LEN + \
581*4882a593Smuzhiyun 				HE_PPE_THRESH_LEN(HE_CAP_MCS_MAP_NSS_MAX, HE_MAX_RU_COUNT))
582*4882a593Smuzhiyun /**
583*4882a593Smuzhiyun  * HE Operation IE (Section 9.4.2.238)
584*4882a593Smuzhiyun  */
585*4882a593Smuzhiyun /* HE Operation Parameters field (figure 9-589cr) */
586*4882a593Smuzhiyun #define HE_OP_PARAMS_SIZE		3u
587*4882a593Smuzhiyun typedef uint8 he_op_parms_t[HE_OP_PARAMS_SIZE];
588*4882a593Smuzhiyun 
589*4882a593Smuzhiyun /* bit position and field width */
590*4882a593Smuzhiyun #define HE_OP_DEF_PE_DUR_IDX		0u	/* Default PE Duration */
591*4882a593Smuzhiyun #define HE_OP_DEF_PE_DUR_FSZ		3u
592*4882a593Smuzhiyun #define HE_OP_TWT_REQD_IDX		3u	/* TWT Required */
593*4882a593Smuzhiyun #define HE_OP_TWT_REQD_FSZ		1u
594*4882a593Smuzhiyun #define HE_OP_TXOP_DUR_RTS_THRESH_IDX	4u	/* TXOP Duration Based RTS Threshold */
595*4882a593Smuzhiyun #define HE_OP_TXOP_DUR_RTS_THRESH_FSZ	10u
596*4882a593Smuzhiyun #define HE_OP_VHT_OP_PRESENT_IDX	14u	/* VHT Oper Info Present */
597*4882a593Smuzhiyun #define HE_OP_VHT_OP_PRESENT_FSZ	1u
598*4882a593Smuzhiyun #define HE_OP_COL_LOC_BSS_IDX		15u
599*4882a593Smuzhiyun #define HE_OP_COL_LOC_BSS_FSZ		1u
600*4882a593Smuzhiyun #define HE_OP_ER_SU_DISABLE_IDX		16u
601*4882a593Smuzhiyun #define HE_OP_ER_SU_DISABLE_FSZ		1u
602*4882a593Smuzhiyun #define HE_OP_6G_OP_INFO_PRESENT_IDX  17u
603*4882a593Smuzhiyun #define HE_OP_6G_OP_INFO_PRESENT_FSZ  1u
604*4882a593Smuzhiyun 
605*4882a593Smuzhiyun /* BSS Color Information field (figure 9-589cs) */
606*4882a593Smuzhiyun #define HE_OP_BSS_COLOR_IDX		0	/* BSS Color */
607*4882a593Smuzhiyun #define HE_OP_BSS_COLOR_FSZ		6
608*4882a593Smuzhiyun #define HE_OP_PART_BSS_COLOR_IDX	6	/* Partial BSS Color */
609*4882a593Smuzhiyun #define HE_OP_PART_BSS_COLOR_FSZ	1
610*4882a593Smuzhiyun #define HE_OP_DISABLE_BSSCOLOR_IDX	7	/* BSS Color Disable */
611*4882a593Smuzhiyun #define HE_OP_DISABLE_BSSCOLOR_FSZ	1
612*4882a593Smuzhiyun 
613*4882a593Smuzhiyun /* b4-b13: TXOP Duration RTS threshold */
614*4882a593Smuzhiyun #define HE_OP_TXOP_RTS_THRESH_DISABLED	1023u
615*4882a593Smuzhiyun 
616*4882a593Smuzhiyun #define HE_BASIC_MCS_NSS_SIZE		2u
617*4882a593Smuzhiyun typedef uint8 he_basic_mcs_nss_set_t[HE_BASIC_MCS_NSS_SIZE];
618*4882a593Smuzhiyun 
619*4882a593Smuzhiyun #define HE_OP_MAX_BSSID_IND_LEN		1u
620*4882a593Smuzhiyun #define HE_OP_6G_OPER_INFO_LEN		5u
621*4882a593Smuzhiyun /* HE Operation element */
622*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct he_op_ie {
623*4882a593Smuzhiyun 	uint8 id;
624*4882a593Smuzhiyun 	uint8 len;
625*4882a593Smuzhiyun 	uint8 id_ext;
626*4882a593Smuzhiyun 	he_op_parms_t parms;
627*4882a593Smuzhiyun 	uint8 bsscolor_info;
628*4882a593Smuzhiyun 	he_basic_mcs_nss_set_t mcs_nss_op;	/* Basic HE MCS & NSS Set */
629*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT;
630*4882a593Smuzhiyun 
631*4882a593Smuzhiyun typedef struct he_op_ie he_op_ie_t;
632*4882a593Smuzhiyun 
633*4882a593Smuzhiyun #define HE_OP_IE_MIN_LEN	(sizeof(he_op_ie_t) - TLV_HDR_LEN)
634*4882a593Smuzhiyun #define HE_OP_IE_MAX_LEN (sizeof(he_op_ie_t) - TLV_HDR_LEN + VHT_OP_INFO_LEN +\
635*4882a593Smuzhiyun 	HE_OP_MAX_BSSID_IND_LEN + HE_OP_6G_OPER_INFO_LEN)
636*4882a593Smuzhiyun 
637*4882a593Smuzhiyun #define HE_6G_OP_BW_20              0u
638*4882a593Smuzhiyun #define HE_6G_OP_BW_40              1u
639*4882a593Smuzhiyun #define HE_6G_OP_BW_80              2u
640*4882a593Smuzhiyun #define HE_6G_OP_BW_160_80P80       3u
641*4882a593Smuzhiyun 
642*4882a593Smuzhiyun /* Regulatory Info subfield in the United States */
643*4882a593Smuzhiyun #define HE_6G_OP_REG_INFO_INDOOR_AP_US  0u
644*4882a593Smuzhiyun #define HE_6G_OP_REG_INFO_SP_AP_US      1u
645*4882a593Smuzhiyun 
646*4882a593Smuzhiyun /* Figure 9-788l Control field format in Draft P802.11ax_D6.0 */
647*4882a593Smuzhiyun #define HE_6G_CTL_CHBW_MASK         0x03u
648*4882a593Smuzhiyun #define HE_6G_OP_CTL_CHBW(ctl) (ctl & HE_6G_CTL_CHBW_MASK)
649*4882a593Smuzhiyun #define HE_6G_CTL_DUP_BCN_MASK      0x04u
650*4882a593Smuzhiyun #define HE_6G_CTL_REG_INFO_MASK     0x38u
651*4882a593Smuzhiyun #define HE_6G_CTL_REG_INFO_SHIFT    3u
652*4882a593Smuzhiyun #define HE_6G_OP_CTL_REG_INFO(ctl) \
653*4882a593Smuzhiyun 	((ctl & HE_6G_CTL_REG_INFO_MASK) >> HE_6G_CTL_REG_INFO_SHIFT)
654*4882a593Smuzhiyun 
655*4882a593Smuzhiyun /* HE 6G Operation info */
656*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct he_6g_op_info {
657*4882a593Smuzhiyun 	uint8 pri_chan;
658*4882a593Smuzhiyun 	uint8 control;
659*4882a593Smuzhiyun 	uint8 seg0;
660*4882a593Smuzhiyun 	uint8 seg1;
661*4882a593Smuzhiyun 	uint8 min_rate;
662*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT;
663*4882a593Smuzhiyun 
664*4882a593Smuzhiyun typedef struct he_6g_op_info he_6g_op_info_t;
665*4882a593Smuzhiyun 
666*4882a593Smuzhiyun /* HE Extended Capabilities element */
667*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct he_6g_cap_ie {
668*4882a593Smuzhiyun 	uint8 id;
669*4882a593Smuzhiyun 	uint8 len;
670*4882a593Smuzhiyun 	uint8 id_ext;
671*4882a593Smuzhiyun 	uint16 cap_info;    /* Capabilities Information */
672*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT;
673*4882a593Smuzhiyun 
674*4882a593Smuzhiyun typedef struct he_6g_cap_ie he_6g_cap_ie_t;
675*4882a593Smuzhiyun #define HE_6G_CAP_IE_LEN  sizeof(he_6g_cap_ie_t)
676*4882a593Smuzhiyun 
677*4882a593Smuzhiyun /* HE Capabilities Information bit position and fieldwidth.
678*4882a593Smuzhiyun  * Figure 9-787ai Capabilities Information field format in
679*4882a593Smuzhiyun  * Draft P802.11ax_D5.0.
680*4882a593Smuzhiyun  */
681*4882a593Smuzhiyun #define HE_6G_CAP_MIN_MPDU_START_MASK          0x0007u
682*4882a593Smuzhiyun #define HE_6G_CAP_MAX_AMPDU_LEN_EXP_MASK       0x0038u
683*4882a593Smuzhiyun #define HE_6G_CAP_MAX_AMPDU_LEN_EXP_SHIFT           3u
684*4882a593Smuzhiyun #define HE_6G_CAP_MAX_MPDU_LEN_MASK            0x00C0u
685*4882a593Smuzhiyun #define HE_6G_CAP_MAX_MPDU_LEN_SHIFT                6u
686*4882a593Smuzhiyun #define HE_6G_CAP_SM_PW_SAVE_MASK              0x0600u
687*4882a593Smuzhiyun #define HE_6G_CAP_SM_PW_SAVE_SHIFT                  9u
688*4882a593Smuzhiyun #define HE_6G_CAP_RD_RESPONDER_MASK            0x0800u
689*4882a593Smuzhiyun #define HE_6G_CAP_RD_RESPONDER_SHIFT               11u
690*4882a593Smuzhiyun #define HE_6G_CAP_RX_ANT_PATN_CONST_MASK       0x1000u
691*4882a593Smuzhiyun #define HE_6G_CAP_RX_ANT_PATN_CONST_SHIFT          12u
692*4882a593Smuzhiyun #define HE_6G_CAP_TX_ANT_PATN_CONST_MASK       0x2000u
693*4882a593Smuzhiyun #define HE_6G_CAP_TX_ANT_PATN_CONST_SHIFT          13u
694*4882a593Smuzhiyun 
695*4882a593Smuzhiyun #define HE_6G_CAP_MIN_MPDU_START(cap)    ((cap) & HE_6G_CAP_MIN_MPDU_START_MASK)
696*4882a593Smuzhiyun #define HE_6G_CAP_MAX_AMPDU_LEN_EXP(cap) (((cap) & HE_6G_CAP_MAX_AMPDU_LEN_EXP_MASK) >> \
697*4882a593Smuzhiyun 	HE_6G_CAP_MAX_AMPDU_LEN_EXP_SHIFT)
698*4882a593Smuzhiyun #define HE_6G_CAP_MAX_MPDU_LEN(cap)      (((cap) & HE_6G_CAP_MAX_MPDU_LEN_MASK) >> \
699*4882a593Smuzhiyun 	HE_6G_CAP_MAX_MPDU_LEN_SHIFT)
700*4882a593Smuzhiyun #define HE_6G_CAP_SM_PW_SAVE(cap)        (((cap) & HE_6G_CAP_SM_PW_SAVE_MASK) >> \
701*4882a593Smuzhiyun 	HE_6G_CAP_SM_PW_SAVE_SHIFT)
702*4882a593Smuzhiyun #define HE_6G_CAP_RD_RESPONDER(cap)      (((cap) & HE_6G_CAP_RD_RESPONDER_MASK) != 0)
703*4882a593Smuzhiyun #define HE_6G_CAP_RX_ANT_PATN_CONST(cap) (((cap) & HE_6G_CAP_RX_ANT_PATN_CONST_MASK) != 0)
704*4882a593Smuzhiyun #define HE_6G_CAP_TX_ANT_PATN_CONST(cap) (((cap) & HE_6G_CAP_TX_ANT_PATN_CONST_MASK) != 0)
705*4882a593Smuzhiyun 
706*4882a593Smuzhiyun /**
707*4882a593Smuzhiyun  * UORA parameter set element (sec 9.4.2.244)
708*4882a593Smuzhiyun  */
709*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct he_uora_ie {
710*4882a593Smuzhiyun 	uint8 id;
711*4882a593Smuzhiyun 	uint8 len;
712*4882a593Smuzhiyun 	uint8 id_ext;
713*4882a593Smuzhiyun 	uint8 ocw_range;
714*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT;
715*4882a593Smuzhiyun 
716*4882a593Smuzhiyun typedef struct he_uora_ie he_uora_ie_t;
717*4882a593Smuzhiyun 
718*4882a593Smuzhiyun /* Bit field Masks */
719*4882a593Smuzhiyun #define HE_UORA_EOCW_MIN_IDX		0u
720*4882a593Smuzhiyun #define HE_UORA_EOCW_MIN_FSZ		3u
721*4882a593Smuzhiyun #define HE_UORA_EOCW_MAX_IDX		3u
722*4882a593Smuzhiyun #define HE_UORA_EOCW_MAX_FSZ		3u
723*4882a593Smuzhiyun /* Reserved -bit6 -7 */
724*4882a593Smuzhiyun 
725*4882a593Smuzhiyun /**
726*4882a593Smuzhiyun  * MU EDCA parameter set element (sec 9.4.2.245)
727*4882a593Smuzhiyun  */
728*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct he_mu_ac_param_record {
729*4882a593Smuzhiyun 	uint8 aci_aifsn;
730*4882a593Smuzhiyun 	uint8 ecw_min_max;
731*4882a593Smuzhiyun 	uint8 muedca_timer;
732*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT;
733*4882a593Smuzhiyun 
734*4882a593Smuzhiyun typedef struct he_mu_ac_param_record he_mu_ac_param_record_t;
735*4882a593Smuzhiyun 
736*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct he_muedca_ie {
737*4882a593Smuzhiyun 	uint8 id;
738*4882a593Smuzhiyun 	uint8 len;
739*4882a593Smuzhiyun 	uint8 id_ext;
740*4882a593Smuzhiyun 	uint8 mu_qos_info;
741*4882a593Smuzhiyun 	he_mu_ac_param_record_t param_ac[AC_COUNT];
742*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT;
743*4882a593Smuzhiyun 
744*4882a593Smuzhiyun typedef struct he_muedca_ie he_muedca_ie_t;
745*4882a593Smuzhiyun 
746*4882a593Smuzhiyun #define HE_MU_EDCA_PARAM_UPD_CNT_IDX	0u	/* EDCA Parameter Set Update Count */
747*4882a593Smuzhiyun #define HE_MU_EDCA_PARAM_UPD_CNT_LEN	4u
748*4882a593Smuzhiyun 
749*4882a593Smuzhiyun #define HE_MU_SIGA_SIGB_MCS_DPCU	0
750*4882a593Smuzhiyun #define HE_MU_SIGA_SIGB_SYMS_DPCU	3u
751*4882a593Smuzhiyun #define HE_MU_SIGA_GI_LTF_DPCU		3u
752*4882a593Smuzhiyun 
753*4882a593Smuzhiyun /**
754*4882a593Smuzhiyun  * Spatial Reuse Parameter Set element (sec 9.4.2.241)
755*4882a593Smuzhiyun  */
756*4882a593Smuzhiyun /* bit position and field width */
757*4882a593Smuzhiyun #define HE_SRP_CTRL_SRP_DISALLOW_IDX			0	/* SRP Disallowed */
758*4882a593Smuzhiyun #define HE_SRP_CTRL_SRP_DISALLOW_FSZ			1
759*4882a593Smuzhiyun #define HE_SRP_CTRL_NON_SRG_OBSS_PD_SR_DISALLOW_IDX	1	/* NonSRG OBSS PD SR Disallowed */
760*4882a593Smuzhiyun #define HE_SRP_CTRL_NON_SRG_OBSS_PD_SR_DISALLOW_FSZ	1
761*4882a593Smuzhiyun #define HE_SRP_CTRL_NON_SRG_OFFSET_PRESENT_IDX		2	/* NonSRG Offset Present */
762*4882a593Smuzhiyun #define HE_SRP_CTRL_NON_SRG_OFFSET_PRESENT_FSZ		1
763*4882a593Smuzhiyun #define HE_SRP_CTRL_SRG_INFO_PRESENT_IDX		3	/* SRG Information Present */
764*4882a593Smuzhiyun #define HE_SRP_CTRL_SRG_INFO_PRESENT_FSZ		1
765*4882a593Smuzhiyun #define HE_SRP_CTRL_HESIGA_SR_VALUE15_ALLOWED_IDX	4	/* HESIGA_SRP_value15_allowed */
766*4882a593Smuzhiyun #define HE_SRP_CTRL_HESIGA_SR_VALUE15_ALLOWED_FSZ	1
767*4882a593Smuzhiyun /* Reserved b5-b7 */
768*4882a593Smuzhiyun 
769*4882a593Smuzhiyun /* Spatial reuse element element */
770*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct he_srp_ie {
771*4882a593Smuzhiyun 	uint8 id;
772*4882a593Smuzhiyun 	uint8 len;
773*4882a593Smuzhiyun 	uint8 id_ext;
774*4882a593Smuzhiyun 	uint8 sr_control;
775*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT;
776*4882a593Smuzhiyun 
777*4882a593Smuzhiyun typedef struct he_srp_ie he_srp_ie_t;
778*4882a593Smuzhiyun 
779*4882a593Smuzhiyun #define HE_SRP_NON_SRG_OBSS_PD_MAX_OFFSET_LEN	1u
780*4882a593Smuzhiyun #define HE_SRP_SRG_OBSS_PD_MIN_OFFSET_LEN	1u
781*4882a593Smuzhiyun #define HE_SRP_SRG_OBSS_PD_MAX_OFFSET_LEN	1u
782*4882a593Smuzhiyun #define HE_SRP_SRG_BSSCOLOR_BITMAP_LEN		8u
783*4882a593Smuzhiyun #define HE_SRP_SRG_PARTIAL_BSSID_BITMAP_LEN	8u
784*4882a593Smuzhiyun 
785*4882a593Smuzhiyun #define HE_SRP_IE_MIN_LEN	(sizeof(he_srp_ie_t) - TLV_HDR_LEN)
786*4882a593Smuzhiyun #define HE_SRP_IE_MAX_LEN (sizeof(he_srp_ie_t) - TLV_HDR_LEN +\
787*4882a593Smuzhiyun 	HE_SRP_NON_SRG_OBSS_PD_MAX_OFFSET_LEN + HE_SRP_SRG_OBSS_PD_MIN_OFFSET_LEN\
788*4882a593Smuzhiyun 	HE_SRP_SRG_OBSS_PD_MAX_OFFSET_LEN + HE_SRP_SRG_BSSCOLOR_BITMAP_LEN\
789*4882a593Smuzhiyun 	HE_SRP_SRG_PARTIAL_BSSID_BITMAP_LEN)
790*4882a593Smuzhiyun 
791*4882a593Smuzhiyun /* Bit field Masks */
792*4882a593Smuzhiyun #define HE_SRP_CTRL_SRP_DISALLOW		(1 << HE_SRP_CTRL_SRP_DISALLOW_IDX)
793*4882a593Smuzhiyun #define HE_SRP_CTRL_NON_SRG_OBSS_PD_SR_DISALLOW (1 << HE_SRP_CTRL_NON_SRG_OBSS_PD_SR_DISALLOW_IDX)
794*4882a593Smuzhiyun #define HE_SRP_CTRL_NON_SRG_OFFSET_PRESENT	(1 << HE_SRP_CTRL_NON_SRG_OFFSET_PRESENT_IDX)
795*4882a593Smuzhiyun #define HE_SRP_CTRL_SRG_INFO_PRESENT		(1 << HE_SRP_CTRL_SRG_INFO_PRESENT_IDX)
796*4882a593Smuzhiyun #define HE_SRP_CTRL_HESIGA_SR_VALUE15_ALLOWED	(1 << HE_SRP_CTRL_HESIGA_SR_VALUE15_ALLOWED_IDX)
797*4882a593Smuzhiyun 
798*4882a593Smuzhiyun /**
799*4882a593Smuzhiyun  * ref: (Table 28-21 Page 473 D3.0)
800*4882a593Smuzhiyun  *
801*4882a593Smuzhiyun  * -Spatial Reuse field encoding for an HE SU PPDU, HE ER SU PPDU, and HE MU PPDU
802*4882a593Smuzhiyun  */
803*4882a593Smuzhiyun #define HE_SRP_DISALLOW	0u	/* SRP_DISALLOW */
804*4882a593Smuzhiyun /* Values 1 to 12 are reserved */
805*4882a593Smuzhiyun #define HE_SR_RESTRICTED	13u	/* SR Restricted */
806*4882a593Smuzhiyun #define HE_SR_DELAY		14u	/* SR Delay */
807*4882a593Smuzhiyun #define HE_SRP_AND_NON_SRG_OBSS_PD_PROHIBITED	15u	/* SRP_AND_NON_SRG_OBSS_PD_PROHIBITED */
808*4882a593Smuzhiyun #define HE_SRP_MASK		0x0Fu
809*4882a593Smuzhiyun 
810*4882a593Smuzhiyun /**
811*4882a593Smuzhiyun  * BSS Color Change Announcement element (sec 9.4.2.243)
812*4882a593Smuzhiyun  */
813*4882a593Smuzhiyun /* bit position and field width */
814*4882a593Smuzhiyun #define HE_BSSCOLOR_CHANGE_NEWCOLOR_IDX		0	/* New BSSColor info */
815*4882a593Smuzhiyun #define HE_BSSCOLOR_CHANGE_NEWCOLOR_FSZ		6u
816*4882a593Smuzhiyun 
817*4882a593Smuzhiyun /* HE Bsscolor change element */
818*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct he_bsscolor_change_ie {
819*4882a593Smuzhiyun 	uint8 id;
820*4882a593Smuzhiyun 	uint8 len;
821*4882a593Smuzhiyun 	uint8 id_ext;
822*4882a593Smuzhiyun 	uint8 color_switch_cntdwn;
823*4882a593Smuzhiyun 	uint8 new_bsscolor_info;
824*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT;
825*4882a593Smuzhiyun 
826*4882a593Smuzhiyun typedef struct he_bsscolor_change_ie he_bsscolor_change_ie_t;
827*4882a593Smuzhiyun 
828*4882a593Smuzhiyun /* HE SU bit position and field width */
829*4882a593Smuzhiyun #define HE_SU_PPDU_FORMAT_IDX			0u
830*4882a593Smuzhiyun #define HE_SU_PPDU_FORMAT_FSZ			1u
831*4882a593Smuzhiyun #define HE_SU_PPDU_BEAM_CHANGE_IDX		1u
832*4882a593Smuzhiyun #define HE_SU_PPDU_BEAM_CHANGE_FSZ		1u
833*4882a593Smuzhiyun #define HE_SU_PPDU_DL_UL_IDX			2u
834*4882a593Smuzhiyun #define HE_SU_PPDU_DL_UL_FSZ			1u
835*4882a593Smuzhiyun #define HE_SU_PPDU_MCS_IDX			3u
836*4882a593Smuzhiyun #define HE_SU_PPDU_MCS_FSZ			4u
837*4882a593Smuzhiyun #define HE_SU_PPDU_DCM_IDX			7u
838*4882a593Smuzhiyun #define HE_SU_PPDU_DCM_FSZ			1u
839*4882a593Smuzhiyun #define HE_SU_PPDU_BSS_COLOR_IDX		8u
840*4882a593Smuzhiyun #define HE_SU_PPDU_BSS_COLOR_FSZ		6u
841*4882a593Smuzhiyun #define HE_SU_PPDU_SR_IDX			15
842*4882a593Smuzhiyun #define HE_SU_PPDU_SR_FSZ			4u
843*4882a593Smuzhiyun #define HE_SU_PPDU_BW_IDX			19u
844*4882a593Smuzhiyun #define HE_SU_PPDU_BW_FSZ			2u
845*4882a593Smuzhiyun #define HE_SU_PPDU_GI_IDX			21u
846*4882a593Smuzhiyun #define HE_SU_PPDU_GI_FSZ			2u
847*4882a593Smuzhiyun #define HE_SU_PPDU_LTF_SIZE_IDX			21u
848*4882a593Smuzhiyun #define HE_SU_PPDU_LTF_SIZE_FSZ			2u
849*4882a593Smuzhiyun #define HE_SU_PPDU_NUM_LTF_IDX			21u
850*4882a593Smuzhiyun #define HE_SU_PPDU_NUM_LTF_FSZ			2u
851*4882a593Smuzhiyun #define HE_SU_PPDU_NSTS_IDX			23u
852*4882a593Smuzhiyun #define HE_SU_PPDU_NSTS_FSZ			3u
853*4882a593Smuzhiyun #define HE_SU_PPDU_DOPPLER_NOTSET_NSTS_IDX      23u
854*4882a593Smuzhiyun #define HE_SU_PPDU_DOPPLER_NOTSET_NSTS_FSZ      3u
855*4882a593Smuzhiyun #define HE_SU_PPDU_DOPPLER_SET_NSTS_IDX         23u
856*4882a593Smuzhiyun #define HE_SU_PPDU_DOPPLER_SET_NSTS_FSZ         2u
857*4882a593Smuzhiyun #define HE_SU_PPDU_MIDAMBLE_IDX                 25u
858*4882a593Smuzhiyun #define HE_SU_PPDU_MIDAMBLE_FSZ                 1u
859*4882a593Smuzhiyun #define HE_SU_PPDU_TXOP_IDX			26u
860*4882a593Smuzhiyun #define HE_SU_PPDU_TXOP_FSZ			7u
861*4882a593Smuzhiyun #define HE_SU_PPDU_CODING_IDX			33u
862*4882a593Smuzhiyun #define HE_SU_PPDU_CODING_FSZ			1u
863*4882a593Smuzhiyun #define HE_SU_PPDU_LDPC_IDX			34u
864*4882a593Smuzhiyun #define HE_SU_PPDU_LDPC_FSZ			1u
865*4882a593Smuzhiyun #define HE_SU_PPDU_STBC_IDX			35u
866*4882a593Smuzhiyun #define HE_SU_PPDU_STBC_FSZ			1u
867*4882a593Smuzhiyun #define HE_SU_PPDU_TXBF_IDX			36u
868*4882a593Smuzhiyun #define HE_SU_PPDU_TXBF_FSZ			1u
869*4882a593Smuzhiyun #define HE_SU_PPDU_PADDING_IDX			37u
870*4882a593Smuzhiyun #define HE_SU_PPDU_PADDING_FSZ			2u
871*4882a593Smuzhiyun #define HE_SU_PPDU_PE_IDX			39u
872*4882a593Smuzhiyun #define HE_SU_PPDU_PE_FSZ			1u
873*4882a593Smuzhiyun #define HE_SU_PPDU_DOPPLER_IDX			41u
874*4882a593Smuzhiyun #define HE_SU_PPDU_DOPPLER_FSZ			1u
875*4882a593Smuzhiyun 
876*4882a593Smuzhiyun /* For HE SU/RE SIG A : PLCP0 bit fields [32bit] */
877*4882a593Smuzhiyun #define HE_SU_RE_SIGA_FORMAT_MASK		0x00000001u
878*4882a593Smuzhiyun #define HE_SU_RE_SIGA_RE_VAL			0x00000000u
879*4882a593Smuzhiyun #define HE_SU_RE_SIGA_SU_VAL			0x00000001u
880*4882a593Smuzhiyun #define HE_SU_RE_SIGA_FORMAT_SHIFT		0u
881*4882a593Smuzhiyun #define HE_SU_RE_SIGA_BEAM_CHANGE_SHIFT	1u
882*4882a593Smuzhiyun #define HE_SU_RE_SIGA_UL_DL_SHIFT		2u
883*4882a593Smuzhiyun #define HE_SU_RE_SIGA_MCS_MASK			0x00000078u
884*4882a593Smuzhiyun #define HE_SU_RE_SIGA_MCS_SHIFT			3u
885*4882a593Smuzhiyun #define HE_SU_RE_SIGA_DCM_MASK			0x00000080u
886*4882a593Smuzhiyun #define HE_SU_RE_SIGA_DCM_SHIFT			7u
887*4882a593Smuzhiyun #define HE_SU_RE_SIGA_BSS_COLOR_SHIFT		8u	/* Bits 13:8 */
888*4882a593Smuzhiyun #define HE_SU_RE_SIGA_BSS_COLOR_MASK		0x00003F00u
889*4882a593Smuzhiyun #define HE_SU_RE_SIGA_RSVD_PLCP0_VAL		0x00004000u
890*4882a593Smuzhiyun #define HE_SU_RE_SIGA_SRP_VAL_SHIFT		15u	/* Bits 18:15 */
891*4882a593Smuzhiyun #define HE_SU_RE_SIGA_SRP_VAL_MASK		0x00078000u
892*4882a593Smuzhiyun #define HE_SU_SIGA_BW_MASK			0x00180000u
893*4882a593Smuzhiyun #define HE_SU_SIGA_BW_SHIFT			19u
894*4882a593Smuzhiyun #define HE_RE_SIGA_TONE_MASK			0x00180000u
895*4882a593Smuzhiyun #define HE_RE_SIGA_TONE_SHIFT			19u
896*4882a593Smuzhiyun #define HE_SU_RE_SIGA_20MHZ_VAL			0x00000000u
897*4882a593Smuzhiyun #define HE_SU_RE_SIGA_40MHZ_VAL			0x00080000u
898*4882a593Smuzhiyun #define HE_SU_RE_SIGA_80MHZ_VAL			0x00100000u
899*4882a593Smuzhiyun #define HE_SU_RE_SIGA_160MHZ_VAL		0x00180000u
900*4882a593Smuzhiyun #define HE_SU_RE_SIGA_GI_LTF_MASK		0x00600000u
901*4882a593Smuzhiyun #define HE_SU_RE_SIGA_1xLTF_GI8us_VAL		0x00000000u
902*4882a593Smuzhiyun #define HE_SU_RE_SIGA_2xLTF_GI8us_VAL		0x00200000u
903*4882a593Smuzhiyun #define HE_SU_RE_SIGA_2xLTF_GI16us_VAL		0x00400000u
904*4882a593Smuzhiyun #define HE_SU_RE_SIGA_4xLTF_GI32us_VAL		0x00600000u
905*4882a593Smuzhiyun #define HE_SU_RE_SIGA_GI_LTF_SHIFT		21u
906*4882a593Smuzhiyun #define HE_SU_RE_SIGA_NSTS_MASK			0x03800000u
907*4882a593Smuzhiyun #define HE_SU_RE_SIGA_NSTS_SHIFT		23u
908*4882a593Smuzhiyun #define HE_SU_RE_SIGA_TXOP_PLCP0_MASK		0xFC000000u
909*4882a593Smuzhiyun #define HE_SU_RE_SIGA_TXOP_PLCP0_SHIFT		26u
910*4882a593Smuzhiyun 
911*4882a593Smuzhiyun /* For HE SU SIG EXT : PLCP0 bit fields [32bit] */
912*4882a593Smuzhiyun #define HE_SU_SIG_EXT_GI_LTF_MASK         0x00000003u
913*4882a593Smuzhiyun #define HE_SU_SIG_EXT_1xLTF_GI8us_VAL     0x00000000u
914*4882a593Smuzhiyun #define HE_SU_SIG_EXT_2xLTF_GI8us_VAL     0x00000001u
915*4882a593Smuzhiyun #define HE_SU_SIG_EXT_2xLTF_GI16us_VAL    0x00000002u
916*4882a593Smuzhiyun #define HE_SU_SIG_EXT_4xLTF_GI32us_VAL    0x00000003u
917*4882a593Smuzhiyun #define HE_SU_SIG_EXT_STBC_MASK           0x00000040u
918*4882a593Smuzhiyun #define HE_SU_SIG_EXT_STBC_SHIFT          6u
919*4882a593Smuzhiyun #define HE_SU_SIG_EXT_LDPC_MASK           0x00000080u
920*4882a593Smuzhiyun #define HE_SU_SIG_EXT_LDPC_SHIFT          7u
921*4882a593Smuzhiyun #define HE_SU_SIG_EXT_MCS_MASK            0x0000f000u
922*4882a593Smuzhiyun #define HE_SU_SIG_EXT_MCS_SHIFT           12u
923*4882a593Smuzhiyun #define HE_SU_SIG_EXT_DCM_MASK            0x00010000u
924*4882a593Smuzhiyun #define HE_SU_SIG_EXT_DCM_SHIFT           16u
925*4882a593Smuzhiyun #define HE_SU_SIG_EXT_NSTS_MASK           0x000e0000u
926*4882a593Smuzhiyun #define HE_SU_SIG_EXT_NSTS_SHIFT          17u
927*4882a593Smuzhiyun #define HE_SU_SIG_EXT_CODING_MASK         0x00800000u
928*4882a593Smuzhiyun #define HE_SU_SIG_EXT_CODING_SHIFT        23u
929*4882a593Smuzhiyun 
930*4882a593Smuzhiyun /* HE mu ppdu - bit position and field width */
931*4882a593Smuzhiyun #define HE_MU_PPDU_DL_UL_IDX                    0u
932*4882a593Smuzhiyun #define HE_MU_PPDU_DL_UL_FSZ                    1u
933*4882a593Smuzhiyun #define HE_MU_PPDU_SIGB_MCS_IDX                 1u
934*4882a593Smuzhiyun #define HE_MU_PPDU_SIGB_MCS_FSZ                 3u
935*4882a593Smuzhiyun #define HE_MU_PPDU_SIGB_DCM_IDX                 4u
936*4882a593Smuzhiyun #define HE_MU_PPDU_SIGB_DCM_FSZ                 1u
937*4882a593Smuzhiyun #define HE_MU_PPDU_BSS_COLOR_IDX                5u
938*4882a593Smuzhiyun #define HE_MU_PPDU_BSS_COLOR_FSZ                6u
939*4882a593Smuzhiyun #define HE_MU_PPDU_SR_IDX                       11u
940*4882a593Smuzhiyun #define HE_MU_PPDU_SR_FSZ                       4u
941*4882a593Smuzhiyun 
942*4882a593Smuzhiyun #define HE_MU_PPDU_SIGB_SYM_MU_MIMO_USER_IDX    18u
943*4882a593Smuzhiyun #define HE_MU_PPDU_SIGB_SYM_MU_MIMO_USER_FSZ    3u
944*4882a593Smuzhiyun 
945*4882a593Smuzhiyun #define HE_MU_PPDU_PRE_PUNCR_SIGA_IDX           15u
946*4882a593Smuzhiyun #define HE_MU_PPDU_PRE_PUNCR_SIGA_FSZ           2u
947*4882a593Smuzhiyun 
948*4882a593Smuzhiyun #define HE_MU_PPDU_BW_SIGA_IDX                  15u
949*4882a593Smuzhiyun #define HE_MU_PPDU_BW_SIGA_FSZ                  2u
950*4882a593Smuzhiyun #define HE_MU_PPDU_BW_SIGA_KNOWN_IDX            17u
951*4882a593Smuzhiyun #define HE_MU_PPDU_BW_SIGA_KNOWN_FSZ            1u
952*4882a593Smuzhiyun 
953*4882a593Smuzhiyun #define HE_MU_PPDU_SIGB_SYMB_IDX                18u
954*4882a593Smuzhiyun #define HE_MU_PPDU_SIGB_SYMB_FSZ                4u
955*4882a593Smuzhiyun 
956*4882a593Smuzhiyun #define HE_MU_PPDU_SIGB_COMP_IDX                22u
957*4882a593Smuzhiyun #define HE_MU_PPDU_SIGB_COMP_FSZ                1u
958*4882a593Smuzhiyun #define HE_MU_PPDU_GI_IDX                       23u
959*4882a593Smuzhiyun #define HE_MU_PPDU_GI_FSZ                       2u
960*4882a593Smuzhiyun #define HE_MU_PPDU_LTF_SIZE_IDX                 23u
961*4882a593Smuzhiyun #define HE_MU_PPDU_LTF_SIZE_FSZ                 2u
962*4882a593Smuzhiyun #define HE_MU_PPDU_NUM_LTF_IDX			23u
963*4882a593Smuzhiyun #define HE_MU_PPDU_NUM_LTF_FSZ			2u
964*4882a593Smuzhiyun #define HE_MU_PPDU_DOPPLER_IDX                  25u
965*4882a593Smuzhiyun #define HE_MU_PPDU_DOPPLER_FSZ                  1u
966*4882a593Smuzhiyun #define HE_MU_PPDU_TXOP_IDX                     26u
967*4882a593Smuzhiyun #define HE_MU_PPDU_TXOP_FSZ                     7u
968*4882a593Smuzhiyun #define HE_MU_PPDU_MIDAMBLE_IDX                 34u
969*4882a593Smuzhiyun #define HE_MU_PPDU_MIDAMBLE_FSZ                 3u
970*4882a593Smuzhiyun #define HE_MU_PPDU_LDPC_IDX                     37u
971*4882a593Smuzhiyun #define HE_MU_PPDU_LDPC_FSZ                     1u
972*4882a593Smuzhiyun #define HE_MU_PPDU_STBC_IDX                     38u
973*4882a593Smuzhiyun #define HE_MU_PPDU_STBC_FSZ                     1u
974*4882a593Smuzhiyun #define HE_MU_PPDU_PADDING_IDX                  39u
975*4882a593Smuzhiyun #define HE_MU_PPDU_PADDING_FSZ                  2u
976*4882a593Smuzhiyun #define HE_MU_PPDU_PE_IDX                       41u
977*4882a593Smuzhiyun #define HE_MU_PPDU_PE_FSZ                       1u
978*4882a593Smuzhiyun 
979*4882a593Smuzhiyun /* he trigger ppdu - bit position and field width */
980*4882a593Smuzhiyun #define HE_TRIG_PPDU_BSS_COLOR_IDX                1u
981*4882a593Smuzhiyun #define HE_TRIG_PPDU_BSS_COLOR_FSZ                6u
982*4882a593Smuzhiyun 
983*4882a593Smuzhiyun /* full spatial reuse field */
984*4882a593Smuzhiyun #define HE_TRIG_PPDU_SR_IDX                       7u
985*4882a593Smuzhiyun #define HE_TRIG_PPDU_SR_FSZ                       16u
986*4882a593Smuzhiyun 
987*4882a593Smuzhiyun #define HE_TRIG_PPDU_SR1_IDX                      7u
988*4882a593Smuzhiyun #define HE_TRIG_PPDU_SR1_FSZ                      4u
989*4882a593Smuzhiyun #define HE_TRIG_PPDU_SR2_IDX                      11u
990*4882a593Smuzhiyun #define HE_TRIG_PPDU_SR2_FSZ                      4u
991*4882a593Smuzhiyun #define HE_TRIG_PPDU_SR3_IDX                      15u
992*4882a593Smuzhiyun #define HE_TRIG_PPDU_SR3_FSZ                      4u
993*4882a593Smuzhiyun #define HE_TRIG_PPDU_SR4_IDX                      19u
994*4882a593Smuzhiyun #define HE_TRIG_PPDU_SR4_FSZ                      4u
995*4882a593Smuzhiyun #define HE_TRIG_PPDU_TXOP_IDX                     26u
996*4882a593Smuzhiyun #define HE_TRIG_PPDU_TXOP_FSZ                     7u
997*4882a593Smuzhiyun 
998*4882a593Smuzhiyun /* For HE MU SIG A : PLCP0 bit fields [32bit] */
999*4882a593Smuzhiyun #define HE_MU_SIGA_UL_DL_SHIFT			0
1000*4882a593Smuzhiyun #define HE_MU_SIGA_UL_TB_PPDU			0
1001*4882a593Smuzhiyun #define HE_MU_SIGA_SIGB_MCS_MASK		0x000000E
1002*4882a593Smuzhiyun #define HE_MU_SIGA_SIGB_MCS_SHIFT		1
1003*4882a593Smuzhiyun #define HE_MU_SIGA_SIGB_DCM_SHIFT		4
1004*4882a593Smuzhiyun #define HE_MU_SIGA_SIGB_DCM_DISABLED		0
1005*4882a593Smuzhiyun #define HE_MU_SIGA_BW_SHIFT			15
1006*4882a593Smuzhiyun #define HE_MU_SIGA_BW_80_UNPUNCTURED		2
1007*4882a593Smuzhiyun #define HE_MU_SIGA_BW_SEC_20_PUNCTURED		4
1008*4882a593Smuzhiyun #define HE_MU_SIGA_BW_SEC_40_PUNCTURED		5
1009*4882a593Smuzhiyun #define HE_MU_SIGA_SIGB_SYMS_SHIFT		18
1010*4882a593Smuzhiyun #define HE_MU_SIGA_GI_LTF_MASK			0x01800000
1011*4882a593Smuzhiyun #define HE_MU_SIGA_GI_LTF_SHIFT			23
1012*4882a593Smuzhiyun 
1013*4882a593Smuzhiyun /* For HE MU SIG A : PLCP1 bit fields [32bit] */
1014*4882a593Smuzhiyun #define HE_MU_SIGA_STBC_MASK		0x00000040
1015*4882a593Smuzhiyun #define HE_MU_SIGA_STBC_SHIFT		6
1016*4882a593Smuzhiyun 
1017*4882a593Smuzhiyun /* For HE SU/RE SIG A : PLCP1 bit fields [16bit] */
1018*4882a593Smuzhiyun #define HE_SU_RE_SIGA_TXOP_PLCP1_MASK	0x0001
1019*4882a593Smuzhiyun #define HE_SU_RE_SIGA_TXOP_PLCP1_SHIFT	0
1020*4882a593Smuzhiyun #define HE_SU_RE_SIGA_CODING_MASK	0x0002
1021*4882a593Smuzhiyun #define HE_SU_RE_SIGA_CODING_SHIFT	1
1022*4882a593Smuzhiyun #define HE_SU_RE_SIGA_LDPC_EXTRA_MASK	0x0004
1023*4882a593Smuzhiyun #define HE_SU_RE_SIGA_LDPC_EXTRA_SHIFT	2
1024*4882a593Smuzhiyun #define HE_SU_RE_SIGA_STBC_MASK		0x0008
1025*4882a593Smuzhiyun #define HE_SU_RE_SIGA_STBC_SHIFT	3
1026*4882a593Smuzhiyun #define HE_SU_RE_SIGA_BEAMFORM_MASK	0x0010
1027*4882a593Smuzhiyun #define HE_SU_RE_SIGA_BEAMFORM_SHIFT	4
1028*4882a593Smuzhiyun #define HE_SU_RE_SIGA_RSVD_PLCP1_VAL	0x0100
1029*4882a593Smuzhiyun 
1030*4882a593Smuzhiyun /* For HE MU SIG A : PLCP1 bit fields [16bit] */
1031*4882a593Smuzhiyun #define HE_MU_SIGA_RSVD_SHIFT		1
1032*4882a593Smuzhiyun #define HE_MU_SIGA_LTF_SYMS_SHIFT	2
1033*4882a593Smuzhiyun 
1034*4882a593Smuzhiyun /* For HE SU SIG A : RX PLCP4 bit fields [8bit] */
1035*4882a593Smuzhiyun #define HE_SU_SIGA2_STBC_RX_MASK	0x08u
1036*4882a593Smuzhiyun 
1037*4882a593Smuzhiyun /* For HE ER SIG A : RX PLCP4 bit fields [8bit] */
1038*4882a593Smuzhiyun #define HE_ER_SIGA2_STBC_RX_MASK	0x08u
1039*4882a593Smuzhiyun 
1040*4882a593Smuzhiyun /* For HE MU SIG A : RX PLCP4 bit fields [8bit] */
1041*4882a593Smuzhiyun #define HE_MU_SIGA2_STBC_RX_MASK	0x40u
1042*4882a593Smuzhiyun 
1043*4882a593Smuzhiyun /* This marks the end of a packed structure section. */
1044*4882a593Smuzhiyun #include <packed_section_end.h>
1045*4882a593Smuzhiyun 
1046*4882a593Smuzhiyun /* HE Action Frame */
1047*4882a593Smuzhiyun /* FIXME: use temporary Offsets until the spec assigns them */
1048*4882a593Smuzhiyun #define HE_AF_CAT_OFF	0
1049*4882a593Smuzhiyun #define HE_AF_ACT_OFF	1
1050*4882a593Smuzhiyun 
1051*4882a593Smuzhiyun /* TWT Setup */
1052*4882a593Smuzhiyun #define HE_AF_TWT_SETUP_TOKEN_OFF	2
1053*4882a593Smuzhiyun #define HE_AF_TWT_SETUP_TWT_IE_OFF	3
1054*4882a593Smuzhiyun 
1055*4882a593Smuzhiyun /* TWT Teardown */
1056*4882a593Smuzhiyun #define HE_AF_TWT_TEARDOWN_FLOW_OFF	2
1057*4882a593Smuzhiyun 
1058*4882a593Smuzhiyun /* TWT Information */
1059*4882a593Smuzhiyun #define HE_AF_TWT_INFO_OFF	2
1060*4882a593Smuzhiyun 
1061*4882a593Smuzhiyun /* HE Action ID */
1062*4882a593Smuzhiyun /* FIXME: use temporary IDs until ANA assigns them */
1063*4882a593Smuzhiyun #define HE_ACTION_TWT_SETUP	1
1064*4882a593Smuzhiyun #define HE_ACTION_TWT_TEARDOWN	2
1065*4882a593Smuzhiyun #define HE_ACTION_TWT_INFO	3
1066*4882a593Smuzhiyun 
1067*4882a593Smuzhiyun /* HE Basic trigger frame common info fields */
1068*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_SZ	8
1069*4882a593Smuzhiyun typedef uint8 he_trig_cmninfo_set_t[HE_TRIG_CMNINFO_SZ];
1070*4882a593Smuzhiyun 
1071*4882a593Smuzhiyun /* bit position and field width */
1072*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_FRMTYPE_INDX		0	/* Trigger frame type */
1073*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_FRMTYPE_FSZ		4
1074*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_LSIGLEN_INDX		4	/* L-sig length */
1075*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_LSIGLEN_FSZ		12
1076*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_CASCADEIND_INDX		16	/* Cascade indication */
1077*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_CASCADEIND_FSZ		1
1078*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_CSREQ_INDX		17	/* Carrier sense indication */
1079*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_CSREQ_FSZ		1
1080*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_BWINFO_INDX		18	/* Bw info */
1081*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_BWINFO_FSZ		2
1082*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_GI_LTF_INDX		20	/* Cp-LTF size */
1083*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_GI_LTF_FSZ		2
1084*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_MUMIMO_LTF_INDX		22	/* HE-LTF mask enable */
1085*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_MUMIMO_LTF_FSZ		1
1086*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_HELTF_SYM_INDX		23	/* He-LTF sumbols */
1087*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_HELTF_SYM_FSZ		3
1088*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_STBC_INDX		26	/* STBC support */
1089*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_STBC_FSZ		1
1090*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_LDPC_EXTSYM_INDX	27	/* LDPC extra symbol */
1091*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_LDPC_EXTSYM_FSZ		1
1092*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_AP_TXPWR_INDX		28	/* AP TX power */
1093*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_AP_TXPWR_FSZ		6
1094*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_AFACT_INDX		34	/* a-factor */
1095*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_AFACT_FSZ		2
1096*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_PEDISAMBIG_INDX		36	/* PE disambiguity */
1097*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_PEDISAMBIG_FSZ		1
1098*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_SPTIAL_REUSE_INDX	37	/* spatial re-use */
1099*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_SPTIAL_REUSE_FSZ	16
1100*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_DOPPLER_INDX		53	/* doppler supoort */
1101*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_DOPPLER_FSZ		1
1102*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_HESIGA_RSVD_INDX	54	/* rsvd bits from HE-SIGA */
1103*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_HESIGA_RSVD_FSZ		9
1104*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_RSVD_INDX		63	/* reseved bit from HE-SIGA  */
1105*4882a593Smuzhiyun #define HE_TRIG_CMNINFO_RSVD_FSZ		1
1106*4882a593Smuzhiyun 
1107*4882a593Smuzhiyun /* HE Basic trigger frame user info fields */
1108*4882a593Smuzhiyun #define HE_TRIG_USRINFO_SZ	5
1109*4882a593Smuzhiyun typedef uint8 he_trig_usrinfo_set_t[HE_TRIG_USRINFO_SZ];
1110*4882a593Smuzhiyun 
1111*4882a593Smuzhiyun /* bit position and field width */
1112*4882a593Smuzhiyun #define HE_TRIG_USRINFO_AID_INDX		0	/* AID */
1113*4882a593Smuzhiyun #define HE_TRIG_USRINFO_AID_FSZ			12
1114*4882a593Smuzhiyun #define HE_TRIG_USRINFO_RU_ALLOC_INDX		12	/* RU allocation index */
1115*4882a593Smuzhiyun #define HE_TRIG_USRINFO_RU_ALLOC_FSZ		8
1116*4882a593Smuzhiyun #define HE_TRIG_USRINFO_CODING_INDX		20	/* coding type (BCC/LDPC) */
1117*4882a593Smuzhiyun #define HE_TRIG_USRINFO_CODING_FSZ		1
1118*4882a593Smuzhiyun #define HE_TRIG_USRINFO_MCS_INDX		21	/* MCS index value */
1119*4882a593Smuzhiyun #define HE_TRIG_USRINFO_MCS_FSZ			4
1120*4882a593Smuzhiyun #define HE_TRIG_USRINFO_DCM_INDX		25	/* Dual carrier modulation */
1121*4882a593Smuzhiyun #define HE_TRIG_USRINFO_DCM_FSZ			1
1122*4882a593Smuzhiyun #define HE_TRIG_USRINFO_SSALLOC_STRMOFFSET_INDX		26	/* stream offset */
1123*4882a593Smuzhiyun #define HE_TRIG_USRINFO_SSALLOC_STRMOFFSET_FSZ		3
1124*4882a593Smuzhiyun #define HE_TRIG_USRINFO_SSALLOC_NSS_INDX		29	/* number of spatial streams */
1125*4882a593Smuzhiyun #define HE_TRIG_USRINFO_SSALLOC_NSS_FSZ		3
1126*4882a593Smuzhiyun #define HE_TRIG_USRINFO_TARGET_RSSI_INDX	32	/* Target RSSI */
1127*4882a593Smuzhiyun #define HE_TRIG_USRINFO_TARGET_RSSI_FSZ		7
1128*4882a593Smuzhiyun #define HE_TRIG_USRINFO_RSVD_INDX		39	/* Reserved bit */
1129*4882a593Smuzhiyun #define HE_TRIG_USRINFO_RSVD_FSZ		1
1130*4882a593Smuzhiyun 
1131*4882a593Smuzhiyun /* Different types of trigger frame */
1132*4882a593Smuzhiyun #define HE_TRIG_TYPE_BASIC_FRM			0	/* basic trigger frame */
1133*4882a593Smuzhiyun #define HE_TRIG_TYPE_BEAM_RPT_POLL_FRM		1	/* beamforming report poll frame */
1134*4882a593Smuzhiyun #define HE_TRIG_TYPE_MU_BAR_FRM			2	/* MU-BAR frame */
1135*4882a593Smuzhiyun #define HE_TRIG_TYPE_MU_RTS__FRM		3	/* MU-RTS frame */
1136*4882a593Smuzhiyun #define HE_TRIG_TYPE_BSR_FRM			4	/* Buffer status report poll */
1137*4882a593Smuzhiyun 
1138*4882a593Smuzhiyun /* HE Timing related parameters (Table 28-9) */
1139*4882a593Smuzhiyun #define HE_T_LEG_STF			8
1140*4882a593Smuzhiyun #define HE_T_LEG_LTF			8
1141*4882a593Smuzhiyun #define HE_T_LEG_LSIG			4
1142*4882a593Smuzhiyun #define HE_T_RL_SIG			4
1143*4882a593Smuzhiyun #define HE_T_SIGA			8
1144*4882a593Smuzhiyun #define HE_T_STF			4	/* STF for SU / MU HE PPDUs */
1145*4882a593Smuzhiyun #define HE_T_TB_PPDU_STF		8	/* STF for HE trigger based PPDUs */
1146*4882a593Smuzhiyun #define HE_T_LEG_PREAMBLE		(HE_T_LEG_STF + HE_T_LEG_LTF + HE_T_LEG_LSIG)
1147*4882a593Smuzhiyun #define HE_T_LEG_SYMB			4
1148*4882a593Smuzhiyun #define HE_RU_26_TONE			26
1149*4882a593Smuzhiyun #define HE_RU_52_TONE			52
1150*4882a593Smuzhiyun #define HE_RU_106_TONE			106
1151*4882a593Smuzhiyun #define HE_RU_242_TONE			242
1152*4882a593Smuzhiyun #define HE_RU_484_TONE			484
1153*4882a593Smuzhiyun #define HE_RU_996_TONE			996
1154*4882a593Smuzhiyun #define HE_RU_2x996_TONE		1992
1155*4882a593Smuzhiyun #define HE_MAX_26_TONE_RU_INDX		36
1156*4882a593Smuzhiyun #define HE_MAX_52_TONE_RU_INDX		52
1157*4882a593Smuzhiyun #define HE_MAX_106_TONE_RU_INDX		60
1158*4882a593Smuzhiyun #define HE_MAX_242_TONE_RU_INDX		64
1159*4882a593Smuzhiyun #define HE_MAX_484_TONE_RU_INDX		66
1160*4882a593Smuzhiyun #define HE_MAX_996_TONE_RU_INDX		67
1161*4882a593Smuzhiyun #define HE_MAX_2x996_TONE_RU_INDX	68
1162*4882a593Smuzhiyun 
1163*4882a593Smuzhiyun /**
1164*4882a593Smuzhiyun  * ref: (Table 28-9 Page 285)
1165*4882a593Smuzhiyun  *
1166*4882a593Smuzhiyun  * - for calculation purpose - in multiples of 10 (*10)
1167*4882a593Smuzhiyun  */
1168*4882a593Smuzhiyun #define HE_T_LTF_1X			32
1169*4882a593Smuzhiyun #define HE_T_LTF_2X			64
1170*4882a593Smuzhiyun #define HE_T_LTF_4X			128
1171*4882a593Smuzhiyun #define HE_T_SYM1			136	/* OFDM symbol duration with base GI */
1172*4882a593Smuzhiyun #define HE_T_SYM2			144	/* OFDM symbol duration with double GI */
1173*4882a593Smuzhiyun #define HE_T_SYM4			160	/* OFDM symbol duration with quad GI */
1174*4882a593Smuzhiyun 
1175*4882a593Smuzhiyun #define HE_N_LEG_SYM			3	/* bytes per legacy symbol */
1176*4882a593Smuzhiyun #define HE_N_TAIL			6	/* tail field bits for BCC */
1177*4882a593Smuzhiyun #define HE_N_SERVICE			16	/* bits in service field */
1178*4882a593Smuzhiyun #define HE_T_MAX_PE			16	/* max Packet extension duration */
1179*4882a593Smuzhiyun 
1180*4882a593Smuzhiyun #endif /* _802_11ax_h_ */
1181