xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8852be/core/rtw_he.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2017 Realtek Corporation.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  *****************************************************************************/
15 #define _RTW_HE_C
16 
17 #include <drv_types.h>
18 
19 #ifdef CONFIG_80211AX_HE
20 
21 /* for now cover BW 20/40/80 bounded in 2SS */
22 const u16 HE_MCS_DATA_RATE[3][MAX_HE_GI_TYPE][MAX_HE_MCS_INDEX] = {
23 	{	/* 20M */
24 		{	/* 3.2us */
25 			14, 29, 43, 58, 87, 117, 131, 146, 175, 195, 219, 243,
26 			29, 58, 87, 117, 175, 234, 263, 292, 351, 390, 438, 487,
27 		},
28 		{	/* 1.6us */
29 			16, 32, 48, 65, 97, 130, 146, 162, 195, 216, 243, 270,
30 			32, 65, 97, 130, 195, 260, 292, 325, 390, 433, 487, 541,
31 		},
32 		{	/* 0.8us */
33 			17, 34, 51, 68, 103, 137, 154, 172, 206, 229, 258, 286,
34 			34, 68, 103, 137, 206, 275, 309, 344, 413, 458, 516, 573,
35 		}
36 	},
37 	{	/* 40M */
38 		{	/* 3.2us */
39 			29, 58, 87, 117, 175, 234, 263, 292, 351, 390, 438, 487,
40 			58, 117, 175, 234, 351, 468, 526, 585, 702, 780, 877, 975,
41 		},
42 		{	/* 1.6us */
43 			32, 65, 97, 130, 195, 260, 292, 325, 390, 433, 487, 541,
44 			65, 130, 195, 260, 390, 520, 585, 650, 780, 866, 975, 1083,
45 		},
46 		{	/* 0.8us */
47 			34, 68, 103, 138, 206, 275, 309, 344, 413, 458, 516, 573,
48 			68, 137, 206, 275, 413, 550, 619, 688, 825, 917, 1032, 1147,
49 		}
50 	},
51 	{	/* 80M */
52 		{	/* 3.2us */
53 			61, 122, 183, 245, 367, 490, 551, 612, 735, 816, 918, 1020,
54 			122, 245, 367, 490, 735, 980, 1102, 1225, 1470, 1633, 1839, 2041,
55 		},
56 		{	/* 1.6us */
57 			68, 136, 204, 272, 408, 544, 612, 680, 816, 907, 1020, 1134,
58 			136, 272, 408, 544, 816, 1088, 1225, 1361, 1633, 1814, 2041, 2268,
59 		},
60 		{	/* 0.8us */
61 			72, 144, 216, 288, 432, 576, 648, 720, 864, 960, 1080, 1200,
62 			144, 288, 432, 576, 864, 1153, 1297, 1441, 1729, 1921, 2161, 2402,
63 		}
64 	}
65 };
66 
rtw_he_mcs_to_data_rate(u8 bw,u8 guard_int,u8 he_mcs_rate)67 u16 rtw_he_mcs_to_data_rate(u8 bw, u8 guard_int, u8 he_mcs_rate)
68 {
69 	u8 gi = 2; /* use 0.8us GI since 2XLTF_0.8us GI is mandatory in HE */
70 	u8 mcs_idx = he_mcs_rate - MGN_HE1SS_MCS0;
71 
72 	return HE_MCS_DATA_RATE[bw][gi][mcs_idx];
73 }
74 
rtw_he_get_highest_rate(u8 * he_mcs_map)75 static u8 rtw_he_get_highest_rate(u8 *he_mcs_map)
76 {
77 	u8 i, j;
78 	u8 bit_map;
79 	u8 he_mcs_rate = 0;
80 
81 	/* currently only consider the BW 80M */
82 	for (i = 0; i < 2; i++) {
83 		if (he_mcs_map[i] != 0xff) {
84 			/* max to 4SS, each SS contains 2 bit */
85 			for (j = 0; j < 8; j += 2) {
86 				bit_map = (he_mcs_map[i] >> j) & 3;
87 
88 				if (bit_map != 3)
89 					he_mcs_rate = MGN_HE1SS_MCS7 + 12 * j / 2 + i * 48 + 2 * bit_map;
90 			}
91 		}
92 	}
93 
94 	/*RTW_INFO("####### HighestHEMCSRate is %x\n", he_mcs_rate);*/
95 	return he_mcs_rate;
96 }
97 
rtw_he_use_default_setting(_adapter * padapter)98 void	rtw_he_use_default_setting(_adapter *padapter)
99 {
100 	struct rtw_wifi_role_t *wrole = padapter->phl_role;
101 	struct protocol_cap_t *role_cap = &(wrole->proto_role_cap);
102 	struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
103 	struct he_priv *phepriv = &pmlmepriv->hepriv;
104 
105 	phepriv->he_highest_rate = rtw_he_get_highest_rate(role_cap->he_rx_mcs);
106 }
107 
rtw_he_set_asoc_cap_supp_mcs(_adapter * padapter,struct rtw_phl_stainfo_t * phl_sta,u8 * ele_start,u8 supp_mcs_len)108 static void rtw_he_set_asoc_cap_supp_mcs(_adapter *padapter, struct rtw_phl_stainfo_t *phl_sta, u8 *ele_start, u8 supp_mcs_len)
109 {
110 	struct rtw_wifi_role_t *wrole = padapter->phl_role;
111 	struct protocol_cap_t *role_cap = &(wrole->proto_role_cap);
112 	int nss = 0, nss_tx = 0, nss_rx = 0;
113 	u8 mcs_from_role = HE_MSC_NOT_SUPP;
114 	u8 mcs_from_ie = HE_MSC_NOT_SUPP;
115 	u8 mcs_val_rx = HE_MSC_NOT_SUPP;
116 	u8 mcs_val_tx = HE_MSC_NOT_SUPP;
117 
118 	_rtw_memset(phl_sta->asoc_cap.he_rx_mcs, HE_MSC_NOT_SUPP_BYTE, HE_CAP_ELE_SUPP_MCS_LEN_RX_80M);
119 	_rtw_memset(phl_sta->asoc_cap.he_tx_mcs, HE_MSC_NOT_SUPP_BYTE, HE_CAP_ELE_SUPP_MCS_LEN_TX_80M);
120 
121 	/* only deal with <= 80MHz now */
122 	for (nss = 1; nss <= 8; nss++) {
123 
124 		mcs_val_rx = HE_MSC_NOT_SUPP;
125 		mcs_val_tx = HE_MSC_NOT_SUPP;
126 
127 		switch (nss) {
128 		case 1:
129 			mcs_from_role = GET_HE_CAP_MCS_1SS(role_cap->he_tx_mcs);
130 			mcs_from_ie = GET_HE_CAP_RX_MCS_LESS_THAN_80MHZ_1SS(ele_start);
131 			if ((mcs_from_role != HE_MSC_NOT_SUPP) && (mcs_from_ie != HE_MSC_NOT_SUPP))
132 				mcs_val_rx = (mcs_from_role < mcs_from_ie) ? mcs_from_role : mcs_from_ie;
133 
134 			mcs_from_role = GET_HE_CAP_MCS_1SS(role_cap->he_rx_mcs);
135 			mcs_from_ie = GET_HE_CAP_TX_MCS_LESS_THAN_80MHZ_1SS(ele_start);
136 			if ((mcs_from_role != HE_MSC_NOT_SUPP) && (mcs_from_ie != HE_MSC_NOT_SUPP))
137 				mcs_val_tx = mcs_from_ie;
138 
139 			SET_HE_CAP_MCS_1SS(phl_sta->asoc_cap.he_rx_mcs, mcs_val_rx);
140 			SET_HE_CAP_MCS_1SS(phl_sta->asoc_cap.he_tx_mcs, mcs_val_tx);
141 			break;
142 		case 2:
143 			mcs_from_role = GET_HE_CAP_MCS_2SS(role_cap->he_tx_mcs);
144 			mcs_from_ie = GET_HE_CAP_RX_MCS_LESS_THAN_80MHZ_2SS(ele_start);
145 			if ((mcs_from_role != HE_MSC_NOT_SUPP) && (mcs_from_ie != HE_MSC_NOT_SUPP))
146 				mcs_val_rx = (mcs_from_role < mcs_from_ie) ? mcs_from_role : mcs_from_ie;
147 
148 			mcs_from_role = GET_HE_CAP_MCS_2SS(role_cap->he_rx_mcs);
149 			mcs_from_ie = GET_HE_CAP_TX_MCS_LESS_THAN_80MHZ_2SS(ele_start);
150 			if ((mcs_from_role != HE_MSC_NOT_SUPP) && (mcs_from_ie != HE_MSC_NOT_SUPP))
151 				mcs_val_tx = mcs_from_ie;
152 
153 			SET_HE_CAP_MCS_2SS(phl_sta->asoc_cap.he_rx_mcs, mcs_val_rx);
154 			SET_HE_CAP_MCS_2SS(phl_sta->asoc_cap.he_tx_mcs, mcs_val_tx);
155 			break;
156 		case 3:
157 			mcs_from_role = GET_HE_CAP_MCS_3SS(role_cap->he_tx_mcs);
158 			mcs_from_ie = GET_HE_CAP_RX_MCS_LESS_THAN_80MHZ_3SS(ele_start);
159 			if ((mcs_from_role != HE_MSC_NOT_SUPP) && (mcs_from_ie != HE_MSC_NOT_SUPP))
160 				mcs_val_rx = (mcs_from_role < mcs_from_ie) ? mcs_from_role : mcs_from_ie;
161 
162 			mcs_from_role = GET_HE_CAP_MCS_3SS(role_cap->he_rx_mcs);
163 			mcs_from_ie = GET_HE_CAP_TX_MCS_LESS_THAN_80MHZ_3SS(ele_start);
164 			if ((mcs_from_role != HE_MSC_NOT_SUPP) && (mcs_from_ie != HE_MSC_NOT_SUPP))
165 				mcs_val_tx = mcs_from_ie;
166 
167 			SET_HE_CAP_MCS_3SS(phl_sta->asoc_cap.he_rx_mcs, mcs_val_rx);
168 			SET_HE_CAP_MCS_3SS(phl_sta->asoc_cap.he_tx_mcs, mcs_val_tx);
169 			break;
170 		case 4:
171 			mcs_from_role = GET_HE_CAP_MCS_4SS(role_cap->he_tx_mcs);
172 			mcs_from_ie = GET_HE_CAP_RX_MCS_LESS_THAN_80MHZ_4SS(ele_start);
173 			if ((mcs_from_role != HE_MSC_NOT_SUPP) && (mcs_from_ie != HE_MSC_NOT_SUPP))
174 				mcs_val_rx = (mcs_from_role < mcs_from_ie) ? mcs_from_role : mcs_from_ie;
175 
176 			mcs_from_role = GET_HE_CAP_MCS_4SS(role_cap->he_rx_mcs);
177 			mcs_from_ie = GET_HE_CAP_TX_MCS_LESS_THAN_80MHZ_4SS(ele_start);
178 			if ((mcs_from_role != HE_MSC_NOT_SUPP) && (mcs_from_ie != HE_MSC_NOT_SUPP))
179 				mcs_val_tx = mcs_from_ie;
180 
181 			SET_HE_CAP_MCS_4SS(phl_sta->asoc_cap.he_rx_mcs, mcs_val_rx);
182 			SET_HE_CAP_MCS_4SS(phl_sta->asoc_cap.he_tx_mcs, mcs_val_tx);
183 			break;
184 		case 5:
185 			mcs_from_role = GET_HE_CAP_MCS_5SS(role_cap->he_tx_mcs);
186 			mcs_from_ie = GET_HE_CAP_RX_MCS_LESS_THAN_80MHZ_5SS(ele_start);
187 			if ((mcs_from_role != HE_MSC_NOT_SUPP) && (mcs_from_ie != HE_MSC_NOT_SUPP))
188 				mcs_val_rx = (mcs_from_role < mcs_from_ie) ? mcs_from_role : mcs_from_ie;
189 
190 			mcs_from_role = GET_HE_CAP_MCS_5SS(role_cap->he_rx_mcs);
191 			mcs_from_ie = GET_HE_CAP_TX_MCS_LESS_THAN_80MHZ_5SS(ele_start);
192 			if ((mcs_from_role != HE_MSC_NOT_SUPP) && (mcs_from_ie != HE_MSC_NOT_SUPP))
193 				mcs_val_tx = mcs_from_ie;
194 
195 			SET_HE_CAP_MCS_5SS(phl_sta->asoc_cap.he_rx_mcs, mcs_val_rx);
196 			SET_HE_CAP_MCS_5SS(phl_sta->asoc_cap.he_tx_mcs, mcs_val_tx);
197 			break;
198 		case 6:
199 			mcs_from_role = GET_HE_CAP_MCS_6SS(role_cap->he_tx_mcs);
200 			mcs_from_ie = GET_HE_CAP_RX_MCS_LESS_THAN_80MHZ_6SS(ele_start);
201 			if ((mcs_from_role != HE_MSC_NOT_SUPP) && (mcs_from_ie != HE_MSC_NOT_SUPP))
202 				mcs_val_rx = (mcs_from_role < mcs_from_ie) ? mcs_from_role : mcs_from_ie;
203 
204 			mcs_from_role = GET_HE_CAP_MCS_6SS(role_cap->he_rx_mcs);
205 			mcs_from_ie = GET_HE_CAP_TX_MCS_LESS_THAN_80MHZ_6SS(ele_start);
206 			if ((mcs_from_role != HE_MSC_NOT_SUPP) && (mcs_from_ie != HE_MSC_NOT_SUPP))
207 				mcs_val_tx = mcs_from_ie;
208 
209 			SET_HE_CAP_MCS_6SS(phl_sta->asoc_cap.he_rx_mcs, mcs_val_rx);
210 			SET_HE_CAP_MCS_6SS(phl_sta->asoc_cap.he_tx_mcs, mcs_val_tx);
211 			break;
212 		case 7:
213 			mcs_from_role = GET_HE_CAP_MCS_7SS(role_cap->he_tx_mcs);
214 			mcs_from_ie = GET_HE_CAP_RX_MCS_LESS_THAN_80MHZ_7SS(ele_start);
215 			if ((mcs_from_role != HE_MSC_NOT_SUPP) && (mcs_from_ie != HE_MSC_NOT_SUPP))
216 				mcs_val_rx = (mcs_from_role < mcs_from_ie) ? mcs_from_role : mcs_from_ie;
217 
218 			mcs_from_role = GET_HE_CAP_MCS_7SS(role_cap->he_rx_mcs);
219 			mcs_from_ie = GET_HE_CAP_TX_MCS_LESS_THAN_80MHZ_7SS(ele_start);
220 			if ((mcs_from_role != HE_MSC_NOT_SUPP) && (mcs_from_ie != HE_MSC_NOT_SUPP))
221 				mcs_val_tx = mcs_from_ie;
222 
223 			SET_HE_CAP_MCS_7SS(phl_sta->asoc_cap.he_rx_mcs, mcs_val_rx);
224 			SET_HE_CAP_MCS_7SS(phl_sta->asoc_cap.he_tx_mcs, mcs_val_tx);
225 			break;
226 		case 8:
227 			mcs_from_role = GET_HE_CAP_MCS_8SS(role_cap->he_tx_mcs);
228 			mcs_from_ie = GET_HE_CAP_RX_MCS_LESS_THAN_80MHZ_8SS(ele_start);
229 			if ((mcs_from_role != HE_MSC_NOT_SUPP) && (mcs_from_ie != HE_MSC_NOT_SUPP))
230 				mcs_val_rx = (mcs_from_role < mcs_from_ie) ? mcs_from_role : mcs_from_ie;
231 
232 			mcs_from_role = GET_HE_CAP_MCS_8SS(role_cap->he_rx_mcs);
233 			mcs_from_ie = GET_HE_CAP_TX_MCS_LESS_THAN_80MHZ_8SS(ele_start);
234 			if ((mcs_from_role != HE_MSC_NOT_SUPP) && (mcs_from_ie != HE_MSC_NOT_SUPP))
235 				mcs_val_tx = mcs_from_ie;
236 
237 			SET_HE_CAP_MCS_8SS(phl_sta->asoc_cap.he_rx_mcs, mcs_val_rx);
238 			SET_HE_CAP_MCS_8SS(phl_sta->asoc_cap.he_tx_mcs, mcs_val_tx);
239 			break;
240 		}
241 
242 		if (mcs_val_rx != HE_MSC_NOT_SUPP)
243 			nss_rx++;
244 
245 		if (mcs_val_tx != HE_MSC_NOT_SUPP)
246 			nss_tx++;
247 	}
248 
249 	phl_sta->asoc_cap.nss_rx = nss_rx;
250 	phl_sta->asoc_cap.nss_tx = nss_tx;
251 }
252 
rtw_he_set_asoc_cap_ppe_thre(_adapter * padapter,struct rtw_phl_stainfo_t * phl_sta,u8 * ele_start)253 static void rtw_he_set_asoc_cap_ppe_thre(_adapter *padapter, struct rtw_phl_stainfo_t *phl_sta, u8 *ele_start)
254 {
255 	u8 nsts, rumsk, i, j, offset, shift;
256 	u16 ppe8, ppe16;
257 
258 	if (phl_sta->asoc_cap.pkt_padding != 3)
259 		return;
260 
261 	nsts = GET_HE_CAP_PPE_NSTS(ele_start);
262 	rumsk = GET_HE_CAP_PPE_PU_IDX_BITMASK(ele_start);
263 	shift = 7;
264 
265 	for (i = 0; i <= nsts; i ++) {
266 		for (j = 0; j < 4; j++) {
267 			if (rumsk & (BIT(0) << j)) {
268 				offset = shift / 8;
269 				ppe16 = LE_BITS_TO_2BYTE(ele_start + offset, shift % 8, 3);
270 				shift += 3;
271 				offset = shift / 8;
272 				ppe8 = LE_BITS_TO_2BYTE(ele_start + offset, shift % 8, 3);
273 				shift += 3;
274 				phl_sta->asoc_cap.ppe_thr[i][j] = ((ppe16 & 0x07) | ((ppe8 & 0x07) << 3));
275 			} else {
276 				phl_sta->asoc_cap.ppe_thr[i][j] = 0;
277 			}
278 		}
279 	}
280 }
281 
update_sta_he_mac_cap_apmode(_adapter * padapter,struct rtw_phl_stainfo_t * phl_sta,u8 * ele_start)282 static void update_sta_he_mac_cap_apmode(_adapter *padapter, struct rtw_phl_stainfo_t *phl_sta, u8 *ele_start)
283 {
284 	/* CONFIG_80211AX_HE_TODO - we may need to refer to role_cap when setting some of asoc_cap  */
285 #if 0
286 	struct rtw_wifi_role_t *wrole = padapter->phl_role;
287 	struct protocol_cap_t *role_cap = &(wrole->proto_role_cap);
288 #endif
289 
290 	phl_sta->asoc_cap.htc_rx = GET_HE_MAC_CAP_HTC_HE_SUPPORT(ele_start);
291 	phl_sta->asoc_cap.twt = GET_HE_MAC_CAP_TWT_REQUESTER_SUPPORT(ele_start);
292 	phl_sta->asoc_cap.twt |= ((GET_HE_MAC_CAP_TWT_RESPONDER_SUPPORT(ele_start)) << 1);
293 	phl_sta->asoc_cap.trig_padding = GET_HE_MAC_CAP_TRI_FRAME_PADDING_DUR(ele_start);
294 	phl_sta->asoc_cap.all_ack = GET_HE_MAC_CAP_ALL_ACK_SUPPORT(ele_start);
295 	phl_sta->asoc_cap.a_ctrl = GET_HE_MAC_CAP_TRS_SUPPORT(ele_start);
296 	phl_sta->asoc_cap.a_ctrl |= ((GET_HE_MAC_CAP_BRS_SUPPORT(ele_start)) << 1);
297 	phl_sta->asoc_cap.twt |= ((GET_HE_MAC_CAP_BC_TWT_SUPPORT(ele_start)) << 2);
298 	phl_sta->asoc_cap.a_ctrl |= ((GET_HE_MAC_CAP_OM_CTRL_SUPPORT(ele_start)) << 2);
299 	phl_sta->asoc_cap.twt |= ((GET_HE_MAC_CAP_FLEX_TWT_SCHED_SUPPORT(ele_start)) << 3);
300 	phl_sta->asoc_cap.twt |= ((GET_HE_MAC_CAP_PSR_RESPONDER(ele_start)) << 4);
301 	phl_sta->asoc_cap.ops = GET_HE_MAC_CAP_OPS_SUPPORT(ele_start);
302 	phl_sta->asoc_cap.amsdu_in_ampdu =
303 		GET_HE_MAC_CAP_AMSDU_NOT_UNDER_BA_IN_ACK_EN_AMPDU(ele_start);
304 	phl_sta->asoc_cap.twt |= ((GET_HE_MAC_CAP_HE_SUB_CH_SELECTIVE_TX(ele_start)) << 5);
305 	phl_sta->asoc_cap.ht_vht_trig_rx =
306 		GET_HE_MAC_CAP_HT_VHT_TRIG_FRAME_RX(ele_start);
307 }
308 
update_sta_he_phy_cap_apmode(_adapter * padapter,struct rtw_phl_stainfo_t * phl_sta,u8 * ele_start,u8 * supp_mcs_len)309 static void update_sta_he_phy_cap_apmode(_adapter *padapter, struct rtw_phl_stainfo_t *phl_sta, u8 *ele_start, u8 *supp_mcs_len)
310 {
311 	struct rtw_wifi_role_t *wrole = padapter->phl_role;
312 	struct protocol_cap_t *role_cap = &(wrole->proto_role_cap);
313 	struct role_cap_t *cap = &(wrole->cap);
314 
315 	if (phl_sta->chandef.band == BAND_ON_24G) {
316 		if (GET_HE_PHY_CAP_SUPPORT_CHAN_WIDTH_SET(ele_start) & BIT(0))
317 			phl_sta->chandef.bw = (wrole->chandef.bw < CHANNEL_WIDTH_40) ?
318 			wrole->chandef.bw : CHANNEL_WIDTH_40;
319 	} else if (phl_sta->chandef.band == BAND_ON_5G) {
320 		if (GET_HE_PHY_CAP_SUPPORT_CHAN_WIDTH_SET(ele_start) & BIT(1))
321 			phl_sta->chandef.bw = (wrole->chandef.bw < CHANNEL_WIDTH_80) ?
322 			wrole->chandef.bw : CHANNEL_WIDTH_80;
323 		if (GET_HE_PHY_CAP_SUPPORT_CHAN_WIDTH_SET(ele_start) & BIT(2))
324 			*supp_mcs_len += 4;
325 		if (GET_HE_PHY_CAP_SUPPORT_CHAN_WIDTH_SET(ele_start) & BIT(3))
326 			*supp_mcs_len += 4;
327 	}
328 
329 	phl_sta->asoc_cap.he_ldpc = (GET_HE_PHY_CAP_LDPC_IN_PAYLOAD(ele_start) & role_cap->he_ldpc);
330 
331 	if (phl_sta->asoc_cap.er_su) {
332 		phl_sta->asoc_cap.ltf_gi = (BIT(RTW_GILTF_2XHE16) |
333 			BIT(RTW_GILTF_2XHE08) | BIT(RTW_GILTF_1XHE16) |
334 			(GET_HE_PHY_CAP_NDP_4X_LTF_3_POINT_2_GI(ele_start) ?
335 			BIT(RTW_GILTF_LGI_4XHE32) : 0) |
336 			(GET_HE_PHY_CAP_ERSU_PPDU_4X_LTF_0_POINT_8_GI(ele_start) ?
337 			BIT(RTW_GILTF_SGI_4XHE08) : 0) |
338 			(GET_HE_PHY_CAP_ERSU_PPDU_1X_LTF_0_POINT_8_GI(ele_start) ?
339 			BIT(RTW_GILTF_1XHE08) : 0));
340 	} else {
341 		phl_sta->asoc_cap.ltf_gi = (BIT(RTW_GILTF_2XHE16) |
342 			BIT(RTW_GILTF_2XHE08) | BIT(RTW_GILTF_1XHE16) |
343 			(GET_HE_PHY_CAP_NDP_4X_LTF_3_POINT_2_GI(ele_start) ?
344 			BIT(RTW_GILTF_LGI_4XHE32) : 0) |
345 			(GET_HE_PHY_CAP_SU_MU_PPDU_4X_LTF_0_POINT_8_GI(ele_start) ?
346 			BIT(RTW_GILTF_SGI_4XHE08) : 0) |
347 			(GET_HE_PHY_CAP_SU_PPDU_1X_LTF_0_POINT_8_GI(ele_start) ?
348 			BIT(RTW_GILTF_1XHE08) : 0));
349 	}
350 
351 	phl_sta->asoc_cap.stbc_he_tx = GET_HE_PHY_CAP_STBC_TX_LESS_THAN_80MHZ(ele_start);
352 	phl_sta->asoc_cap.stbc_he_rx = (GET_HE_PHY_CAP_STBC_RX_LESS_THAN_80MHZ(ele_start) & role_cap->stbc_he_tx);
353 	phl_sta->asoc_cap.doppler_tx = GET_HE_PHY_CAP_DOPPLER_TX(ele_start);
354 	phl_sta->asoc_cap.doppler_rx = (GET_HE_PHY_CAP_DOPPLER_RX(ele_start) & role_cap->doppler_tx);
355 
356 	phl_sta->asoc_cap.dcm_max_const_tx =
357 		GET_HE_PHY_CAP_DCM_MAX_CONSTELLATION_TX(ele_start);
358 	if (phl_sta->asoc_cap.dcm_max_const_tx > role_cap->dcm_max_const_rx)
359 		phl_sta->asoc_cap.dcm_max_const_tx = role_cap->dcm_max_const_rx;
360 
361 	phl_sta->asoc_cap.dcm_max_nss_tx = (GET_HE_PHY_CAP_DCM_MAX_NSS_TX(ele_start) & role_cap->dcm_max_nss_rx);
362 
363 	phl_sta->asoc_cap.dcm_max_const_rx =
364 		GET_HE_PHY_CAP_DCM_MAX_CONSTELLATION_RX(ele_start);
365 	if (phl_sta->asoc_cap.dcm_max_const_rx > role_cap->dcm_max_const_tx)
366 		phl_sta->asoc_cap.dcm_max_const_rx = role_cap->dcm_max_const_tx;
367 
368 	phl_sta->asoc_cap.dcm_max_nss_rx = (GET_HE_PHY_CAP_DCM_MAX_NSS_RX(ele_start) & role_cap->dcm_max_nss_tx);
369 
370 	phl_sta->asoc_cap.partial_bw_su_er =
371 		GET_HE_PHY_CAP_RX_PARTIAL_BW_SU_IN_20MHZ_MUPPDU(ele_start);
372 	phl_sta->asoc_cap.he_su_bfmr = GET_HE_PHY_CAP_SU_BFER(ele_start);
373 	phl_sta->asoc_cap.he_su_bfme = GET_HE_PHY_CAP_SU_BFEE(ele_start);
374 	phl_sta->asoc_cap.he_mu_bfmr = GET_HE_PHY_CAP_MU_BFER(ele_start);
375 	phl_sta->asoc_cap.bfme_sts =
376 		GET_HE_PHY_CAP_BFEE_STS_LESS_THAN_80MHZ(ele_start);
377 	phl_sta->asoc_cap.bfme_sts_greater_80mhz =
378 		GET_HE_PHY_CAP_BFEE_STS_GREATER_THAN_80MHZ(ele_start);
379 	phl_sta->asoc_cap.num_snd_dim =
380 		GET_HE_PHY_CAP_NUM_SND_DIMEN_LESS_THAN_80MHZ(ele_start);
381 	phl_sta->asoc_cap.num_snd_dim_greater_80mhz =
382 		GET_HE_PHY_CAP_NUM_SND_DIMEN_GREATER_THAN_80MHZ(ele_start);
383 	phl_sta->asoc_cap.ng_16_su_fb = GET_HE_PHY_CAP_NG_16_SU_FEEDBACK(ele_start);
384 	phl_sta->asoc_cap.ng_16_mu_fb = GET_HE_PHY_CAP_NG_16_MU_FEEDBACK(ele_start);
385 	phl_sta->asoc_cap.cb_sz_su_fb =
386 		GET_HE_PHY_CAP_CODEBOOK_4_2_SU_FEEDBACK(ele_start);
387 	phl_sta->asoc_cap.cb_sz_mu_fb =
388 		GET_HE_PHY_CAP_CODEBOOK_7_5_MU_FEEDBACK(ele_start);
389 	phl_sta->asoc_cap.trig_su_bfm_fb =
390 		GET_HE_PHY_CAP_TRIG_SUBF_FEEDBACK(ele_start);
391 	phl_sta->asoc_cap.trig_mu_bfm_fb =
392 		GET_HE_PHY_CAP_TRIG_MUBF_PARTIAL_BW_FEEDBACK(ele_start);
393 	phl_sta->asoc_cap.trig_cqi_fb = GET_HE_PHY_CAP_TRIG_CQI_FEEDBACK(ele_start);
394 	phl_sta->asoc_cap.partial_bw_su_er =
395 		GET_HE_PHY_CAP_PARTIAL_BW_EXT_RANGE(ele_start);
396 	phl_sta->asoc_cap.pwr_bst_factor =
397 		GET_HE_PHY_CAP_PWR_BOOST_FACTOR_SUPPORT(ele_start);
398 	phl_sta->asoc_cap.max_nc = GET_HE_PHY_CAP_MAX_NC(ele_start);
399 	phl_sta->asoc_cap.stbc_tx_greater_80mhz =
400 		(GET_HE_PHY_CAP_STBC_TX_GREATER_THAN_80MHZ(ele_start) & role_cap->stbc_rx_greater_80mhz);
401 	phl_sta->asoc_cap.stbc_rx_greater_80mhz =
402 		(GET_HE_PHY_CAP_STBC_RX_GREATER_THAN_80MHZ(ele_start) & role_cap->stbc_tx_greater_80mhz);
403 	phl_sta->asoc_cap.dcm_max_ru = GET_HE_PHY_CAP_DCM_MAX_RU(ele_start);
404 	phl_sta->asoc_cap.long_sigb_symbol =
405 		GET_HE_PHY_CAP_LONGER_THAN_16_HESIGB_OFDM_SYM(ele_start);
406 	phl_sta->asoc_cap.non_trig_cqi_fb =
407 		GET_HE_PHY_CAP_NON_TRIGGER_CQI_FEEDBACK(ele_start);
408 	phl_sta->asoc_cap.tx_1024q_ru =
409 		(GET_HE_PHY_CAP_TX_1024_QAM_LESS_THAN_242_TONE_RU(ele_start) & role_cap->rx_1024q_ru);
410 	phl_sta->asoc_cap.rx_1024q_ru =
411 		(GET_HE_PHY_CAP_RX_1024_QAM_LESS_THAN_242_TONE_RU(ele_start) & role_cap->tx_1024q_ru);
412 	phl_sta->asoc_cap.fbw_su_using_mu_cmprs_sigb =
413 		GET_HE_PHY_CAP_RX_FULLBW_SU_USE_MUPPDU_CMP_SIGB(ele_start);
414 	phl_sta->asoc_cap.fbw_su_using_mu_non_cmprs_sigb =
415 		GET_HE_PHY_CAP_RX_FULLBW_SU_USE_MUPPDU_NONCMP_SIGB(ele_start);
416 
417 	if (GET_HE_PHY_CAP_PPE_THRESHOLD_PRESENT(ele_start))
418 		phl_sta->asoc_cap.pkt_padding = 3;
419 	else
420 		phl_sta->asoc_cap.pkt_padding = GET_HE_PHY_CAP_NOMINAL_PACKET_PADDING(ele_start);
421 }
422 
update_sta_he_supp_mcs_apmode(_adapter * padapter,struct rtw_phl_stainfo_t * phl_sta,u8 * ele_start,u8 supp_mcs_len)423 static void update_sta_he_supp_mcs_apmode(_adapter *padapter, struct rtw_phl_stainfo_t *phl_sta, u8 *ele_start, u8 supp_mcs_len)
424 {
425 	rtw_he_set_asoc_cap_supp_mcs(padapter, phl_sta, ele_start, supp_mcs_len);
426 }
427 
update_sta_he_ppe_thre_apmode(_adapter * padapter,struct rtw_phl_stainfo_t * phl_sta,u8 * ele_start)428 static void update_sta_he_ppe_thre_apmode(_adapter *padapter, struct rtw_phl_stainfo_t *phl_sta, u8 *ele_start)
429 {
430 	rtw_he_set_asoc_cap_ppe_thre(padapter, phl_sta, ele_start);
431 }
432 
update_sta_he_info_apmode(_adapter * padapter,void * sta)433 void	update_sta_he_info_apmode(_adapter *padapter, void *sta)
434 {
435 	struct sta_info	*psta = (struct sta_info *)sta;
436 	struct rtw_phl_stainfo_t *phl_sta = psta->phl_sta;
437 	struct he_priv	*phepriv_sta = &psta->hepriv;
438 	u8 *ele_start = NULL;
439 	u8 supp_mcs_len = 4;
440 
441 	if (phepriv_sta->he_option == _FALSE)
442 		return;
443 
444 	ele_start = &(phepriv_sta->he_cap[1]);
445 	update_sta_he_mac_cap_apmode(padapter, phl_sta, ele_start);
446 
447 	ele_start += HE_CAP_ELE_MAC_CAP_LEN;
448 	update_sta_he_phy_cap_apmode(padapter, phl_sta, ele_start, &supp_mcs_len);
449 
450 	ele_start += HE_CAP_ELE_PHY_CAP_LEN;
451 	update_sta_he_supp_mcs_apmode(padapter, phl_sta, ele_start, supp_mcs_len);
452 
453 	ele_start += supp_mcs_len;
454 	update_sta_he_ppe_thre_apmode(padapter, phl_sta, ele_start);
455 }
456 
update_hw_he_param(_adapter * padapter)457 void	update_hw_he_param(_adapter *padapter)
458 {
459 	/* CONFIG_80211AX_HE_TODO */
460 }
461 
HE_mac_caps_handler(_adapter * padapter,struct rtw_phl_stainfo_t * phl_sta,u8 * ele_start)462 static void HE_mac_caps_handler(_adapter *padapter, struct rtw_phl_stainfo_t *phl_sta, u8 *ele_start)
463 {
464 	phl_sta->asoc_cap.htc_rx = GET_HE_MAC_CAP_HTC_HE_SUPPORT(ele_start);
465 	phl_sta->asoc_cap.twt = GET_HE_MAC_CAP_TWT_REQUESTER_SUPPORT(ele_start);
466 	phl_sta->asoc_cap.twt |= ((GET_HE_MAC_CAP_TWT_RESPONDER_SUPPORT(ele_start)) << 1);
467 	phl_sta->asoc_cap.trig_padding = GET_HE_MAC_CAP_TRI_FRAME_PADDING_DUR(ele_start);
468 	phl_sta->asoc_cap.all_ack = GET_HE_MAC_CAP_ALL_ACK_SUPPORT(ele_start);
469 	phl_sta->asoc_cap.a_ctrl = GET_HE_MAC_CAP_TRS_SUPPORT(ele_start);
470 	phl_sta->asoc_cap.a_ctrl |= ((GET_HE_MAC_CAP_BRS_SUPPORT(ele_start)) << 1);
471 	phl_sta->asoc_cap.twt |= ((GET_HE_MAC_CAP_BC_TWT_SUPPORT(ele_start)) << 2);
472 	phl_sta->asoc_cap.a_ctrl |= ((GET_HE_MAC_CAP_OM_CTRL_SUPPORT(ele_start)) << 2);
473 	phl_sta->asoc_cap.twt |= ((GET_HE_MAC_CAP_FLEX_TWT_SCHED_SUPPORT(ele_start)) << 3);
474 	phl_sta->asoc_cap.twt |= ((GET_HE_MAC_CAP_PSR_RESPONDER(ele_start)) << 4);
475 	phl_sta->asoc_cap.ops = GET_HE_MAC_CAP_OPS_SUPPORT(ele_start);
476 	phl_sta->asoc_cap.amsdu_in_ampdu =
477 		GET_HE_MAC_CAP_AMSDU_NOT_UNDER_BA_IN_ACK_EN_AMPDU(ele_start);
478 	phl_sta->asoc_cap.twt |= ((GET_HE_MAC_CAP_HE_SUB_CH_SELECTIVE_TX(ele_start)) << 5);
479 	phl_sta->asoc_cap.ht_vht_trig_rx =
480 		GET_HE_MAC_CAP_HT_VHT_TRIG_FRAME_RX(ele_start);
481 }
482 
HE_phy_caps_handler(_adapter * padapter,struct rtw_phl_stainfo_t * phl_sta,u8 * ele_start,u8 * supp_mcs_len)483 static void HE_phy_caps_handler(_adapter *padapter, struct rtw_phl_stainfo_t *phl_sta, u8 *ele_start, u8 *supp_mcs_len)
484 {
485 	struct rtw_wifi_role_t 	*wrole = padapter->phl_role;
486 	struct protocol_cap_t *role_cap = &(wrole->proto_role_cap);
487 
488 	if (phl_sta->chandef.band == BAND_ON_24G) {
489 		if (GET_HE_PHY_CAP_SUPPORT_CHAN_WIDTH_SET(ele_start) & BIT(0))
490 			phl_sta->chandef.bw = (wrole->chandef.bw < CHANNEL_WIDTH_40) ?
491 			wrole->chandef.bw : CHANNEL_WIDTH_40;
492 	} else if (phl_sta->chandef.band == BAND_ON_5G) {
493 		if (GET_HE_PHY_CAP_SUPPORT_CHAN_WIDTH_SET(ele_start) & BIT(1))
494 			phl_sta->chandef.bw = (wrole->chandef.bw < CHANNEL_WIDTH_80) ?
495 			wrole->chandef.bw : CHANNEL_WIDTH_80;
496 		if (GET_HE_PHY_CAP_SUPPORT_CHAN_WIDTH_SET(ele_start) & BIT(2))
497 			*supp_mcs_len += 4;
498 		if (GET_HE_PHY_CAP_SUPPORT_CHAN_WIDTH_SET(ele_start) & BIT(3))
499 			*supp_mcs_len += 4;
500 	}
501 	phl_sta->asoc_cap.he_ldpc = (GET_HE_PHY_CAP_LDPC_IN_PAYLOAD(ele_start) & role_cap->he_ldpc);
502 	if (phl_sta->asoc_cap.er_su) {
503 		phl_sta->asoc_cap.ltf_gi = (BIT(RTW_GILTF_2XHE16) |
504 			BIT(RTW_GILTF_2XHE08) | BIT(RTW_GILTF_1XHE16) |
505 			(GET_HE_PHY_CAP_NDP_4X_LTF_3_POINT_2_GI(ele_start) ?
506 			BIT(RTW_GILTF_LGI_4XHE32) : 0) |
507 			(GET_HE_PHY_CAP_ERSU_PPDU_4X_LTF_0_POINT_8_GI(ele_start) ?
508 			BIT(RTW_GILTF_SGI_4XHE08) : 0) |
509 			(GET_HE_PHY_CAP_ERSU_PPDU_1X_LTF_0_POINT_8_GI(ele_start) ?
510 			BIT(RTW_GILTF_1XHE08) : 0));
511 	} else {
512 		phl_sta->asoc_cap.ltf_gi = (BIT(RTW_GILTF_2XHE16) |
513 			BIT(RTW_GILTF_2XHE08) | BIT(RTW_GILTF_1XHE16) |
514 			(GET_HE_PHY_CAP_NDP_4X_LTF_3_POINT_2_GI(ele_start) ?
515 			BIT(RTW_GILTF_LGI_4XHE32) : 0) |
516 			(GET_HE_PHY_CAP_SU_MU_PPDU_4X_LTF_0_POINT_8_GI(ele_start) ?
517 			BIT(RTW_GILTF_SGI_4XHE08) : 0) |
518 			(GET_HE_PHY_CAP_SU_PPDU_1X_LTF_0_POINT_8_GI(ele_start) ?
519 			BIT(RTW_GILTF_1XHE08) : 0));
520 	}
521 	phl_sta->asoc_cap.stbc_he_tx = GET_HE_PHY_CAP_STBC_TX_LESS_THAN_80MHZ(ele_start);
522 	phl_sta->asoc_cap.stbc_he_rx = (GET_HE_PHY_CAP_STBC_RX_LESS_THAN_80MHZ(ele_start) & role_cap->stbc_he_tx);
523 	phl_sta->asoc_cap.doppler_tx = GET_HE_PHY_CAP_DOPPLER_TX(ele_start);
524 	phl_sta->asoc_cap.doppler_rx = (GET_HE_PHY_CAP_DOPPLER_RX(ele_start) & role_cap->doppler_tx);
525 	phl_sta->asoc_cap.dcm_max_const_tx =
526 		GET_HE_PHY_CAP_DCM_MAX_CONSTELLATION_TX(ele_start);
527 	phl_sta->asoc_cap.dcm_max_nss_tx = GET_HE_PHY_CAP_DCM_MAX_NSS_TX(ele_start);
528 	phl_sta->asoc_cap.dcm_max_const_rx =
529 		GET_HE_PHY_CAP_DCM_MAX_CONSTELLATION_RX(ele_start);
530 	phl_sta->asoc_cap.dcm_max_nss_rx = GET_HE_PHY_CAP_DCM_MAX_NSS_RX(ele_start);
531 	phl_sta->asoc_cap.partial_bw_su_er =
532 		GET_HE_PHY_CAP_RX_PARTIAL_BW_SU_IN_20MHZ_MUPPDU(ele_start);
533 	phl_sta->asoc_cap.he_su_bfmr = GET_HE_PHY_CAP_SU_BFER(ele_start);
534 	phl_sta->asoc_cap.he_su_bfme = GET_HE_PHY_CAP_SU_BFEE(ele_start);
535 	phl_sta->asoc_cap.he_mu_bfmr = GET_HE_PHY_CAP_MU_BFER(ele_start);
536 	phl_sta->asoc_cap.bfme_sts =
537 		GET_HE_PHY_CAP_BFEE_STS_LESS_THAN_80MHZ(ele_start);
538 	phl_sta->asoc_cap.bfme_sts_greater_80mhz =
539 		GET_HE_PHY_CAP_BFEE_STS_GREATER_THAN_80MHZ(ele_start);
540 	phl_sta->asoc_cap.num_snd_dim =
541 		GET_HE_PHY_CAP_NUM_SND_DIMEN_LESS_THAN_80MHZ(ele_start);
542 	phl_sta->asoc_cap.num_snd_dim_greater_80mhz =
543 		GET_HE_PHY_CAP_NUM_SND_DIMEN_GREATER_THAN_80MHZ(ele_start);
544 
545 	RTW_INFO("%s: HE STA assoc_cap:\n", __func__);
546 	RTW_INFO("- SU BFer: %d\n", phl_sta->asoc_cap.he_su_bfmr);
547 	RTW_INFO("- SU BFee: %d\n", phl_sta->asoc_cap.he_su_bfme);
548 	RTW_INFO("- MU BFer: %d\n", phl_sta->asoc_cap.he_mu_bfmr);
549 	RTW_INFO("- BFee STS: %d\n", phl_sta->asoc_cap.bfme_sts);
550 	RTW_INFO("- BFee STS(>80MHz): %d\n", phl_sta->asoc_cap.bfme_sts_greater_80mhz);
551 	RTW_INFO("- BFer SND DIM number: %d\n", phl_sta->asoc_cap.num_snd_dim);
552 	RTW_INFO("- BFer SND DIM number(>80MHz): %d\n", phl_sta->asoc_cap.num_snd_dim_greater_80mhz);
553 
554 	phl_sta->asoc_cap.ng_16_su_fb = GET_HE_PHY_CAP_NG_16_SU_FEEDBACK(ele_start);
555 	phl_sta->asoc_cap.ng_16_mu_fb = GET_HE_PHY_CAP_NG_16_MU_FEEDBACK(ele_start);
556 	phl_sta->asoc_cap.cb_sz_su_fb =
557 		GET_HE_PHY_CAP_CODEBOOK_4_2_SU_FEEDBACK(ele_start);
558 	phl_sta->asoc_cap.cb_sz_mu_fb =
559 		GET_HE_PHY_CAP_CODEBOOK_7_5_MU_FEEDBACK(ele_start);
560 	phl_sta->asoc_cap.trig_su_bfm_fb =
561 		GET_HE_PHY_CAP_TRIG_SUBF_FEEDBACK(ele_start);
562 	phl_sta->asoc_cap.trig_mu_bfm_fb =
563 		GET_HE_PHY_CAP_TRIG_MUBF_PARTIAL_BW_FEEDBACK(ele_start);
564 	phl_sta->asoc_cap.trig_cqi_fb = GET_HE_PHY_CAP_TRIG_CQI_FEEDBACK(ele_start);
565 	phl_sta->asoc_cap.partial_bw_su_er =
566 		GET_HE_PHY_CAP_PARTIAL_BW_EXT_RANGE(ele_start);
567 	phl_sta->asoc_cap.pwr_bst_factor =
568 		GET_HE_PHY_CAP_PWR_BOOST_FACTOR_SUPPORT(ele_start);
569 	phl_sta->asoc_cap.max_nc = GET_HE_PHY_CAP_MAX_NC(ele_start);
570 	phl_sta->asoc_cap.stbc_tx_greater_80mhz =
571 		GET_HE_PHY_CAP_STBC_TX_GREATER_THAN_80MHZ(ele_start);
572 	phl_sta->asoc_cap.stbc_rx_greater_80mhz =
573 		GET_HE_PHY_CAP_STBC_RX_GREATER_THAN_80MHZ(ele_start);
574 	phl_sta->asoc_cap.dcm_max_ru = GET_HE_PHY_CAP_DCM_MAX_RU(ele_start);
575 	phl_sta->asoc_cap.long_sigb_symbol =
576 		GET_HE_PHY_CAP_LONGER_THAN_16_HESIGB_OFDM_SYM(ele_start);
577 	phl_sta->asoc_cap.non_trig_cqi_fb =
578 		GET_HE_PHY_CAP_NON_TRIGGER_CQI_FEEDBACK(ele_start);
579 	phl_sta->asoc_cap.tx_1024q_ru =
580 		GET_HE_PHY_CAP_TX_1024_QAM_LESS_THAN_242_TONE_RU(ele_start);
581 	phl_sta->asoc_cap.rx_1024q_ru =
582 		GET_HE_PHY_CAP_RX_1024_QAM_LESS_THAN_242_TONE_RU(ele_start);
583 	phl_sta->asoc_cap.fbw_su_using_mu_cmprs_sigb =
584 		GET_HE_PHY_CAP_RX_FULLBW_SU_USE_MUPPDU_CMP_SIGB(ele_start);
585 	phl_sta->asoc_cap.fbw_su_using_mu_non_cmprs_sigb =
586 		GET_HE_PHY_CAP_RX_FULLBW_SU_USE_MUPPDU_NONCMP_SIGB(ele_start);
587 
588 	if (GET_HE_PHY_CAP_PPE_THRESHOLD_PRESENT(ele_start))
589 		phl_sta->asoc_cap.pkt_padding = 3;
590 	else
591 		phl_sta->asoc_cap.pkt_padding = GET_HE_PHY_CAP_NOMINAL_PACKET_PADDING(ele_start);
592 }
593 
HE_supp_mcs_handler(_adapter * padapter,struct rtw_phl_stainfo_t * phl_sta,u8 * ele_start,u8 supp_mcs_len)594 static void HE_supp_mcs_handler(_adapter *padapter, struct rtw_phl_stainfo_t *phl_sta, u8 *ele_start, u8 supp_mcs_len)
595 {
596 	struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
597 	struct he_priv *phepriv = &pmlmepriv->hepriv;
598 
599 	rtw_he_set_asoc_cap_supp_mcs(padapter, phl_sta, ele_start, supp_mcs_len);
600 	phepriv->he_highest_rate = rtw_he_get_highest_rate(phl_sta->asoc_cap.he_rx_mcs);
601 }
602 
HE_ppe_thre_handler(_adapter * padapter,struct rtw_phl_stainfo_t * phl_sta,u8 * ele_start)603 static void HE_ppe_thre_handler(_adapter *padapter, struct rtw_phl_stainfo_t *phl_sta, u8 *ele_start)
604 {
605 	rtw_he_set_asoc_cap_ppe_thre(padapter, phl_sta, ele_start);
606 }
607 
HE_caps_handler(_adapter * padapter,PNDIS_802_11_VARIABLE_IEs pIE)608 void HE_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
609 {
610 	struct rtw_wifi_role_t 	*wrole = padapter->phl_role;
611 	struct mlme_priv		*pmlmepriv = &padapter->mlmepriv;
612 	struct sta_priv 		*pstapriv = &padapter->stapriv;
613 	struct he_priv		*phepriv = &pmlmepriv->hepriv;
614 	struct mlme_ext_priv	*pmlmeext = &padapter->mlmeextpriv;
615 	struct mlme_ext_info	*pmlmeinfo = &(pmlmeext->mlmext_info);
616 	WLAN_BSSID_EX 		*cur_network = &(pmlmeinfo->network);
617 	struct sta_info 		*psta = NULL;
618 	struct rtw_phl_stainfo_t *phl_sta = NULL;
619 	u8 *ele_start = (&(pIE->data[0]) + 1);
620 	u8 supp_mcs_len = 4;
621 
622 	if (pIE == NULL)
623 		return;
624 
625 	if (phepriv->he_option == _FALSE)
626 		return;
627 
628 	psta = rtw_get_stainfo(pstapriv, cur_network->MacAddress);
629 	if (psta == NULL)
630 		return;
631 	if (psta->phl_sta == NULL)
632 		return;
633 
634 	phl_sta = psta->phl_sta;
635 
636 	/* HE MAC Caps */
637 	HE_mac_caps_handler(padapter, phl_sta, ele_start);
638 	ele_start += HE_CAP_ELE_MAC_CAP_LEN;
639 
640 	/* HE PHY Caps */
641 	HE_phy_caps_handler(padapter, phl_sta, ele_start, &supp_mcs_len);
642 	ele_start += HE_CAP_ELE_PHY_CAP_LEN;
643 
644 	/* HE Supp MCS Set */
645 	HE_supp_mcs_handler(padapter, phl_sta, ele_start, supp_mcs_len);
646 	ele_start += supp_mcs_len;
647 
648 	/* HE PPE Thresholds */
649 	HE_ppe_thre_handler(padapter, phl_sta, ele_start);
650 
651 	pmlmeinfo->HE_enable = 1;
652 }
653 
HE_operation_handler(_adapter * padapter,PNDIS_802_11_VARIABLE_IEs pIE)654 void HE_operation_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
655 {
656 	struct mlme_priv		*pmlmepriv = &padapter->mlmepriv;
657 	struct sta_priv 		*pstapriv = &padapter->stapriv;
658 	struct he_priv		*phepriv = &pmlmepriv->hepriv;
659 	struct mlme_ext_priv	*pmlmeext = &padapter->mlmeextpriv;
660 	struct mlme_ext_info	*pmlmeinfo = &(pmlmeext->mlmext_info);
661 	WLAN_BSSID_EX 		*cur_network = &(pmlmeinfo->network);
662 	struct sta_info 		*psta = NULL;
663 	struct rtw_phl_stainfo_t *phl_sta = NULL;
664 	u8 *ele_start = (&(pIE->data[0]) + 1);
665 	struct dvobj_priv *d;
666 	void *phl;
667 	u8 pre_bsscolor = 0;
668 	u16 pre_rts_th = 0;
669 
670 	if (pIE == NULL)
671 		return;
672 
673 	if (phepriv->he_option == _FALSE)
674 		return;
675 
676 	d = adapter_to_dvobj(padapter);
677 	phl = GET_PHL_INFO(d);
678 
679 	psta = rtw_get_stainfo(pstapriv, cur_network->MacAddress);
680 	if (psta == NULL)
681 		return;
682 	if (psta->phl_sta == NULL)
683 		return;
684 
685 	phl_sta = psta->phl_sta;
686 	phl_sta->tf_trs = _TRUE;
687 
688 	phl_sta->asoc_cap.er_su = !GET_HE_OP_PARA_ER_SU_DISABLE(ele_start);
689 	if (!GET_HE_OP_BSS_COLOR_INFO_BSS_COLOR_DISABLE(ele_start)) {
690 
691 		pre_bsscolor = phl_sta->asoc_cap.bsscolor;
692 		phl_sta->asoc_cap.bsscolor = GET_HE_OP_BSS_COLOR_INFO_BSS_COLOR(ele_start);
693 
694 		/* rx thread & assoc timer callback, use cmd no_wait */
695 		if (pre_bsscolor != phl_sta->asoc_cap.bsscolor) {
696 			RTW_INFO("%s, Update BSS Color = %d\n", __func__, phl_sta->asoc_cap.bsscolor);
697 #ifdef CONFIG_CMD_DISP
698 			rtw_phl_cmd_wrole_change(phl,
699 			                         padapter->phl_role,
700 			                         WR_CHG_BSS_COLOR,
701 			                         (u8 *)&phl_sta->asoc_cap.bsscolor,
702 			                         sizeof(phl_sta->asoc_cap.bsscolor),
703 			                         PHL_CMD_NO_WAIT,
704 			                         0);
705 #else
706 			/* role change here, but no implementation for not CMD_DISP case */
707 #endif
708 		}
709 	}
710 
711 	pre_rts_th = phl_sta->asoc_cap.rts_th;
712 	phl_sta->asoc_cap.rts_th =
713 		GET_HE_OP_PARA_TXOP_DUR_RTS_THRESHOLD(ele_start);
714 
715 	if ((phl_sta->asoc_cap.rts_th > 0) &&
716 	    (phl_sta->asoc_cap.rts_th != TXOP_DUR_RTS_TH_DISABLED)) {
717 		struct rtw_rts_threshold val = {0};
718 
719 		/* time preference */
720 		val.rts_len_th = 0xffff;
721 		/* IE field unit 32us, parameter unit 1us */
722 		val.rts_time_th = phl_sta->asoc_cap.rts_th * 32;
723 		/* rx thread & assoc timer callback, use cmd no_wait */
724 		if (pre_rts_th != phl_sta->asoc_cap.rts_th) {
725 			RTW_INFO("%s, Update TXOP Duration RTS Threshold =%d\n", __func__, phl_sta->asoc_cap.rts_th);
726 #ifdef CONFIG_CMD_DISP
727 			rtw_phl_cmd_wrole_change(phl,
728 			                         padapter->phl_role,
729 			                         WR_CHG_RTS_TH,
730 			                         (u8 *)&val,
731 			                         sizeof(struct rtw_rts_threshold),
732 			                         PHL_CMD_NO_WAIT,
733 			                         0);
734 #else
735 			/* role change here, but no implementation for not CMD_DISP case */
736 #endif
737 		}
738 	}
739 }
740 
HE_mu_edca_handler(_adapter * padapter,PNDIS_802_11_VARIABLE_IEs pIE,u8 first)741 void HE_mu_edca_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE, u8 first)
742 {
743 	struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
744 	struct sta_priv *pstapriv = &padapter->stapriv;
745 	struct he_priv *phepriv = &pmlmepriv->hepriv;
746 	struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
747 	struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
748 	WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network);
749 	struct sta_info *psta = NULL;
750 	struct rtw_phl_stainfo_t *phl_sta = NULL;
751 	u8 *ele_start = (&(pIE->data[0]) + 1);
752 	struct dvobj_priv *d;
753 	void *phl;
754 	struct rtw_mu_edca_param edca = {0};
755 	u8 pre_cnt = 0, cur_cnt = 0;
756 	u8 i = 0;
757 
758 	if (pIE == NULL)
759 		return;
760 
761 	if (phepriv->he_option == _FALSE)
762 		return;
763 
764 	d = adapter_to_dvobj(padapter);
765 	phl = GET_PHL_INFO(d);
766 	if (!phl)
767 		return;
768 
769 	psta = rtw_get_stainfo(pstapriv, cur_network->MacAddress);
770 	if (psta == NULL)
771 		return;
772 	if (psta->phl_sta == NULL)
773 		return;
774 
775 	phl_sta = psta->phl_sta;
776 
777 	pre_cnt = phepriv->pre_he_muedca_cnt;
778 	cur_cnt = GET_HE_MU_EDCA_QOS_INFO_UPDATE_CNT(ele_start);
779 	if (cur_cnt != pre_cnt || first == _TRUE) {
780 		phepriv->pre_he_muedca_cnt = cur_cnt;
781 		phl_sta->asoc_cap.mu_edca[0].ac =
782 			GET_HE_MU_EDCA_BE_ACI(ele_start);
783 		phl_sta->asoc_cap.mu_edca[0].aifsn =
784 			GET_HE_MU_EDCA_BE_AIFSN(ele_start);
785 		phl_sta->asoc_cap.mu_edca[0].cw =
786 			GET_HE_MU_EDCA_BE_ECW_MIN_MAX(ele_start);
787 		phl_sta->asoc_cap.mu_edca[0].timer =
788 			GET_HE_MU_EDCA_BE_TIMER(ele_start);
789 		phl_sta->asoc_cap.mu_edca[1].ac =
790 			GET_HE_MU_EDCA_BK_ACI(ele_start);
791 		phl_sta->asoc_cap.mu_edca[1].aifsn =
792 			GET_HE_MU_EDCA_BK_AIFSN(ele_start);
793 		phl_sta->asoc_cap.mu_edca[1].cw =
794 			GET_HE_MU_EDCA_BK_ECW_MIN_MAX(ele_start);
795 		phl_sta->asoc_cap.mu_edca[1].timer =
796 			GET_HE_MU_EDCA_BK_TIMER(ele_start);
797 		phl_sta->asoc_cap.mu_edca[2].ac =
798 			GET_HE_MU_EDCA_VI_ACI(ele_start);
799 		phl_sta->asoc_cap.mu_edca[2].aifsn =
800 			GET_HE_MU_EDCA_VI_AIFSN(ele_start);
801 		phl_sta->asoc_cap.mu_edca[2].cw =
802 			GET_HE_MU_EDCA_VI_ECW_MIN_MAX(ele_start);
803 		phl_sta->asoc_cap.mu_edca[2].timer =
804 			GET_HE_MU_EDCA_VI_TIMER(ele_start);
805 		phl_sta->asoc_cap.mu_edca[3].ac =
806 			GET_HE_MU_EDCA_VO_ACI(ele_start);
807 		phl_sta->asoc_cap.mu_edca[3].aifsn =
808 			GET_HE_MU_EDCA_VO_AIFSN(ele_start);
809 		phl_sta->asoc_cap.mu_edca[3].cw =
810 			GET_HE_MU_EDCA_VO_ECW_MIN_MAX(ele_start);
811 		phl_sta->asoc_cap.mu_edca[3].timer =
812 			GET_HE_MU_EDCA_VO_TIMER(ele_start);
813 		for (i = 0; i < 4; i++) {
814 #ifdef CONFIG_CMD_DISP
815 			rtw_phl_cmd_wrole_change(phl,
816 						 padapter->phl_role,
817 						 WR_CHG_MU_EDCA_PARAM,
818 						 (u8 *)&phl_sta->asoc_cap.mu_edca[i],
819 						 sizeof(struct rtw_mu_edca_param),
820 						 PHL_CMD_NO_WAIT,
821 						 0);
822 #endif
823 			RTW_INFO("%s, Update HE MU EDCA AC(%d) aifsn(%d) cw(0x%x) timer(0x%x)\n",
824 					__func__,
825 					phl_sta->asoc_cap.mu_edca[i].ac,
826 					phl_sta->asoc_cap.mu_edca[i].aifsn,
827 					phl_sta->asoc_cap.mu_edca[i].cw,
828 					phl_sta->asoc_cap.mu_edca[i].timer);
829 		}
830 
831 		if (first) {
832 #ifdef CONFIG_CMD_DISP
833 			rtw_phl_cmd_wrole_change(phl,
834 						 padapter->phl_role,
835 						 WR_CHG_MU_EDCA_CFG,
836 						 (u8 *)&first,
837 						 sizeof(first),
838 						 PHL_CMD_NO_WAIT,
839 						 0);
840 #else
841 			/* role change here, but no implementation for not CMD_DISP case */
842 #endif
843 		}
844 	}
845 }
846 
rtw_build_he_mac_caps(struct protocol_cap_t * proto_cap,u8 * pbuf)847 static int rtw_build_he_mac_caps(struct protocol_cap_t *proto_cap, u8 *pbuf)
848 {
849 	/* Set HE MAC Capabilities Information */
850 
851 	int info_len = HE_CAP_ELE_MAC_CAP_LEN;
852 
853 	if (proto_cap->htc_rx)
854 		SET_HE_MAC_CAP_HTC_HE_SUPPORT(pbuf, 1);
855 
856 	if (proto_cap->twt & BIT(0))
857 		SET_HE_MAC_CAP_TWT_REQUESTER_SUPPORT(pbuf, 1);
858 
859 	if (proto_cap->twt & BIT(1))
860 		SET_HE_MAC_CAP_TWT_RESPONDER_SUPPORT(pbuf, 1);
861 
862 	if (proto_cap->trig_padding)
863 		SET_HE_MAC_CAP_TRI_FRAME_PADDING_DUR(pbuf,
864 			proto_cap->trig_padding);
865 
866 	if (proto_cap->all_ack)
867 		SET_HE_MAC_CAP_ALL_ACK_SUPPORT(pbuf, 1);
868 
869 	if (proto_cap->htc_rx && (proto_cap->a_ctrl & BIT(0)))
870 		SET_HE_MAC_CAP_TRS_SUPPORT(pbuf, 1);
871 
872 	if (proto_cap->a_ctrl & BIT(1))
873 		SET_HE_MAC_CAP_BRS_SUPPORT(pbuf, 1);
874 
875 	if (proto_cap->twt & BIT(2))
876 		SET_HE_MAC_CAP_BC_TWT_SUPPORT(pbuf, 1);
877 
878 	if (proto_cap->htc_rx && (proto_cap->a_ctrl & BIT(2)))
879 		SET_HE_MAC_CAP_OM_CTRL_SUPPORT(pbuf, 1);
880 
881 	SET_HE_MAC_CAP_MAX_AMPDU_LEN_EXP_EXT(pbuf, 2);
882 
883 	if (proto_cap->twt & BIT(3))
884 		SET_HE_MAC_CAP_FLEX_TWT_SCHED_SUPPORT(pbuf, 1);
885 
886 	if (proto_cap->twt & BIT(4))
887 		SET_HE_MAC_CAP_PSR_RESPONDER(pbuf, 1);
888 
889 	if (proto_cap->ops)
890 		SET_HE_MAC_CAP_OPS_SUPPORT(pbuf, 1);
891 
892 	if (proto_cap->amsdu_in_ampdu)
893 		SET_HE_MAC_CAP_AMSDU_NOT_UNDER_BA_IN_ACK_EN_AMPDU(pbuf, 1);
894 
895 	if (proto_cap->twt & BIT(5))
896 		SET_HE_MAC_CAP_HE_SUB_CH_SELECTIVE_TX(pbuf, 1);
897 
898 	if (proto_cap->ht_vht_trig_rx)
899 		SET_HE_MAC_CAP_HT_VHT_TRIG_FRAME_RX(pbuf, 1);
900 
901 	return info_len;
902 }
903 
rtw_build_he_phy_caps(struct protocol_cap_t * proto_cap,u8 * pbuf)904 static int rtw_build_he_phy_caps(struct protocol_cap_t *proto_cap, u8 *pbuf)
905 {
906 	/* struct rtw_chan_def *chan_def = &(wrole->chandef); */
907 	/* Set HE PHY Capabilities Information */
908 
909 	int info_len = HE_CAP_ELE_PHY_CAP_LEN;
910 
911 #if 1
912 	SET_HE_PHY_CAP_SUPPORT_CHAN_WIDTH_SET(pbuf, (BIT(0) | BIT(1)));
913 #else
914 	u8 bw_cap = 0;
915 
916 	if (phy_cap->bw_sup & BW_CAP_40M)
917 		bw_cap |= BIT(0);
918 	if (phy_cap->bw_sup & BW_CAP_80M)
919 		bw_cap |= BIT(1);
920 
921 	if (chan_def->band == BAND_ON_24G) {
922 		if (chan_def->bw == CHANNEL_WIDTH_40)
923 			SET_HE_PHY_CAP_SUPPORT_CHAN_WIDTH_SET(pbuf, BIT(0));
924 	} else if (chan_def->band == BAND_ON_5G) {
925 		if (chan_def->bw == CHANNEL_WIDTH_80)
926 			SET_HE_PHY_CAP_SUPPORT_CHAN_WIDTH_SET(pbuf, BIT(1));
927 		else if (chan_def->bw == CHANNEL_WIDTH_160)
928 			SET_HE_PHY_CAP_SUPPORT_CHAN_WIDTH_SET(pbuf, (BIT(1) | BIT(2)));
929 		else if (chan_def->bw == CHANNEL_WIDTH_80_80)
930 			SET_HE_PHY_CAP_SUPPORT_CHAN_WIDTH_SET(pbuf, (BIT(1) | BIT(3)));
931 	}
932 #endif
933 
934 	SET_HE_PHY_CAP_DEVICE_CLASS(pbuf, HE_DEV_CLASS_A);
935 
936 	if (proto_cap->he_ldpc)
937 		SET_HE_PHY_CAP_LDPC_IN_PAYLOAD(pbuf, 1);
938 
939 	SET_HE_PHY_CAP_SU_PPDU_1X_LTF_0_POINT_8_GI(pbuf, 1);
940 
941 	if (proto_cap->he_rx_ndp_4x32) {
942 		SET_HE_PHY_CAP_NDP_4X_LTF_3_POINT_2_GI(pbuf, 1);
943 		RTW_INFO("NDP_4x32 is set.\n");;
944 	}
945 
946 	if (proto_cap->stbc_he_tx)
947 		SET_HE_PHY_CAP_STBC_TX_LESS_THAN_80MHZ(pbuf, 1);
948 
949 	if (proto_cap->stbc_he_rx)
950 		SET_HE_PHY_CAP_STBC_RX_LESS_THAN_80MHZ(pbuf, 1);
951 
952 	if (proto_cap->doppler_tx)
953 		SET_HE_PHY_CAP_DOPPLER_TX(pbuf, 1);
954 
955 	if (proto_cap->doppler_rx)
956 		SET_HE_PHY_CAP_DOPPLER_RX(pbuf, 1);
957 
958 	if (proto_cap->dcm_max_const_tx)
959 		SET_HE_PHY_CAP_DCM_MAX_CONSTELLATION_TX(pbuf,
960 			proto_cap->dcm_max_const_tx);
961 
962 	if (proto_cap->dcm_max_nss_tx)
963 		SET_HE_PHY_CAP_DCM_MAX_NSS_TX(pbuf, 1);
964 
965 	if (proto_cap->dcm_max_const_rx)
966 		SET_HE_PHY_CAP_DCM_MAX_CONSTELLATION_RX(pbuf,
967 			proto_cap->dcm_max_const_rx);
968 
969 	if (proto_cap->dcm_max_nss_rx)
970 		SET_HE_PHY_CAP_DCM_MAX_NSS_RX(pbuf, 1);
971 
972 	if (proto_cap->partial_bw_su_in_mu)
973 		SET_HE_PHY_CAP_RX_PARTIAL_BW_SU_IN_20MHZ_MUPPDU(pbuf, 1);
974 
975 	if (proto_cap->he_su_bfmr)
976 		SET_HE_PHY_CAP_SU_BFER(pbuf, 1);
977 
978 	if (proto_cap->he_su_bfme)
979 		SET_HE_PHY_CAP_SU_BFEE(pbuf, 1);
980 
981 	if (proto_cap->he_mu_bfmr)
982 		SET_HE_PHY_CAP_MU_BFER(pbuf, 1);
983 
984 	if (proto_cap->bfme_sts)
985 		SET_HE_PHY_CAP_BFEE_STS_LESS_THAN_80MHZ(pbuf,
986 			proto_cap->bfme_sts);
987 
988 	if (proto_cap->bfme_sts_greater_80mhz)
989 		SET_HE_PHY_CAP_BFEE_STS_GREATER_THAN_80MHZ(pbuf,
990 			proto_cap->bfme_sts_greater_80mhz);
991 
992 	if (proto_cap->num_snd_dim)
993 		SET_HE_PHY_CAP_NUM_SND_DIMEN_LESS_THAN_80MHZ(pbuf,
994 			proto_cap->num_snd_dim);
995 
996 	if (proto_cap->num_snd_dim_greater_80mhz)
997 		SET_HE_PHY_CAP_NUM_SND_DIMEN_GREATER_THAN_80MHZ(pbuf,
998 			proto_cap->num_snd_dim_greater_80mhz);
999 
1000 	if (proto_cap->ng_16_su_fb)
1001 		SET_HE_PHY_CAP_NG_16_SU_FEEDBACK(pbuf, 1);
1002 
1003 	if (proto_cap->ng_16_mu_fb)
1004 		SET_HE_PHY_CAP_NG_16_MU_FEEDBACK(pbuf, 1);
1005 
1006 	if (proto_cap->cb_sz_su_fb)
1007 		SET_HE_PHY_CAP_CODEBOOK_4_2_SU_FEEDBACK(pbuf, 1);
1008 
1009 	if (proto_cap->cb_sz_mu_fb)
1010 		SET_HE_PHY_CAP_CODEBOOK_7_5_MU_FEEDBACK(pbuf, 1);
1011 
1012 	if (proto_cap->trig_su_bfm_fb)
1013 		SET_HE_PHY_CAP_TRIG_SUBF_FEEDBACK(pbuf, 1);
1014 
1015 	if (proto_cap->trig_mu_bfm_fb)
1016 		SET_HE_PHY_CAP_TRIG_MUBF_PARTIAL_BW_FEEDBACK(pbuf, 1);
1017 
1018 	if (proto_cap->trig_cqi_fb)
1019 		SET_HE_PHY_CAP_TRIG_CQI_FEEDBACK(pbuf, 1);
1020 
1021 	if (proto_cap->partial_bw_su_er)
1022 		SET_HE_PHY_CAP_PARTIAL_BW_EXT_RANGE(pbuf, 1);
1023 
1024 	if (proto_cap->pwr_bst_factor)
1025 		SET_HE_PHY_CAP_PWR_BOOST_FACTOR_SUPPORT(pbuf, 1);
1026 
1027 	SET_HE_PHY_CAP_SU_MU_PPDU_4X_LTF_0_POINT_8_GI(pbuf, 1);
1028 
1029 	if (proto_cap->max_nc)
1030 		SET_HE_PHY_CAP_MAX_NC(pbuf, proto_cap->max_nc);
1031 
1032 	if (proto_cap->stbc_tx_greater_80mhz)
1033 		SET_HE_PHY_CAP_STBC_TX_GREATER_THAN_80MHZ(pbuf, 1);
1034 
1035 	if (proto_cap->stbc_rx_greater_80mhz)
1036 		SET_HE_PHY_CAP_STBC_RX_GREATER_THAN_80MHZ(pbuf, 1);
1037 
1038 	SET_HE_PHY_CAP_ERSU_PPDU_4X_LTF_0_POINT_8_GI(pbuf, 1);
1039 	SET_HE_PHY_CAP_ERSU_PPDU_1X_LTF_0_POINT_8_GI(pbuf, 1);
1040 
1041 	if (proto_cap->dcm_max_ru)
1042 		SET_HE_PHY_CAP_DCM_MAX_RU(pbuf, proto_cap->dcm_max_ru);
1043 
1044 	if (proto_cap->long_sigb_symbol)
1045 		SET_HE_PHY_CAP_LONGER_THAN_16_HESIGB_OFDM_SYM(pbuf, 1);
1046 
1047 	if (proto_cap->non_trig_cqi_fb)
1048 		SET_HE_PHY_CAP_NON_TRIGGER_CQI_FEEDBACK(pbuf, 1);
1049 
1050 	if (proto_cap->tx_1024q_ru)
1051 		SET_HE_PHY_CAP_TX_1024_QAM_LESS_THAN_242_TONE_RU(pbuf, 1);
1052 
1053 	if (proto_cap->rx_1024q_ru)
1054 		SET_HE_PHY_CAP_RX_1024_QAM_LESS_THAN_242_TONE_RU(pbuf, 1);
1055 
1056 	if (proto_cap->fbw_su_using_mu_cmprs_sigb)
1057 		SET_HE_PHY_CAP_RX_FULLBW_SU_USE_MUPPDU_CMP_SIGB(pbuf, 1);
1058 
1059 	if (proto_cap->fbw_su_using_mu_non_cmprs_sigb)
1060 		SET_HE_PHY_CAP_RX_FULLBW_SU_USE_MUPPDU_NONCMP_SIGB(pbuf, 1);
1061 
1062 	if (proto_cap->pkt_padding)
1063 		SET_HE_PHY_CAP_NOMINAL_PACKET_PADDING(pbuf,
1064 			proto_cap->pkt_padding);
1065 
1066 	return info_len;
1067 }
1068 
rtw_build_he_supp_mcs(struct protocol_cap_t * proto_cap,u8 * pbuf)1069 static int rtw_build_he_supp_mcs(struct protocol_cap_t *proto_cap, u8 *pbuf)
1070 {
1071 
1072 	 /* struct rtw_chan_def *chan_def = &(wrole->chandef); */
1073 
1074 	/* Set HE Supported MCS and NSS Set */
1075 
1076 	int info_len = 4;
1077 
1078 	_rtw_memset(pbuf, HE_MSC_NOT_SUPP_BYTE, info_len);
1079 
1080 	_rtw_memcpy(pbuf, proto_cap->he_rx_mcs, HE_CAP_ELE_SUPP_MCS_LEN_RX_80M);
1081 
1082 	_rtw_memcpy(pbuf + 2, proto_cap->he_tx_mcs, HE_CAP_ELE_SUPP_MCS_LEN_TX_80M);
1083 
1084 	return info_len;
1085 }
1086 
rtw_build_he_ppe_thre(struct protocol_cap_t * proto_cap,u8 * pbuf)1087 static int rtw_build_he_ppe_thre(struct protocol_cap_t *proto_cap, u8 *pbuf)
1088 {
1089 	/* Set HE PPE Thresholds (optional) */
1090 
1091 	int info_len = 0;
1092 
1093 	return info_len;
1094 }
1095 
rtw_get_dft_he_cap_ie(_adapter * padapter,struct phy_cap_t * phy_cap,struct protocol_cap_t * proto_cap,u8 * pbuf)1096 u32 rtw_get_dft_he_cap_ie(_adapter *padapter, struct phy_cap_t *phy_cap,
1097 		struct protocol_cap_t *proto_cap, u8 *pbuf)
1098 {
1099 	struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1100 	struct he_priv	*phepriv = &pmlmepriv->hepriv;
1101 	u32 he_cap_total_len = 0, len = 0;
1102 	u8* pcap_start = phepriv->he_cap;
1103 	u8* pcap = pcap_start;
1104 
1105 	_rtw_memset(pcap, 0, HE_CAP_ELE_MAX_LEN);
1106 
1107 	/* Ele ID Extension */
1108 	*pcap++ = WLAN_EID_EXTENSION_HE_CAPABILITY;
1109 
1110 	/* HE MAC Caps */
1111 	pcap += rtw_build_he_mac_caps(proto_cap, pcap);
1112 
1113 	/* HE PHY Caps */
1114 	pcap += rtw_build_he_phy_caps(proto_cap, pcap);
1115 
1116 	/* HE Supported MCS and NSS Set */
1117 	pcap += rtw_build_he_supp_mcs(proto_cap, pcap);
1118 
1119 	/* HE PPE Thresholds (optional) */
1120 	pcap += rtw_build_he_ppe_thre(proto_cap, pcap);
1121 
1122 	he_cap_total_len = (pcap - pcap_start);
1123 
1124 	pbuf = rtw_set_ie(pbuf, WLAN_EID_EXTENSION, he_cap_total_len, pcap_start, &len);
1125 
1126 	return len;
1127 }
1128 
rtw_build_he_cap_ie(_adapter * padapter,u8 * pbuf)1129 u32 rtw_build_he_cap_ie(_adapter *padapter, u8 *pbuf)
1130 {
1131 	struct rtw_wifi_role_t *wrole = padapter->phl_role;
1132 	struct protocol_cap_t *proto_cap = &(wrole->proto_role_cap);
1133 	struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1134 	struct he_priv	*phepriv = &pmlmepriv->hepriv;
1135 	u32 he_cap_total_len = 0, len = 0;
1136 	u8* pcap_start = phepriv->he_cap;
1137 	u8* pcap = pcap_start;
1138 
1139 	_rtw_memset(pcap, 0, HE_CAP_ELE_MAX_LEN);
1140 
1141 	/* Ele ID Extension */
1142 	*pcap++ = WLAN_EID_EXTENSION_HE_CAPABILITY;
1143 
1144 	/* HE MAC Caps */
1145 	pcap += rtw_build_he_mac_caps(proto_cap, pcap);
1146 
1147 	/* HE PHY Caps */
1148 	pcap += rtw_build_he_phy_caps(proto_cap, pcap);
1149 
1150 	/* HE Supported MCS and NSS Set */
1151 	pcap += rtw_build_he_supp_mcs(proto_cap, pcap);
1152 
1153 	/* HE PPE Thresholds (optional) */
1154 	pcap += rtw_build_he_ppe_thre(proto_cap, pcap);
1155 
1156 	he_cap_total_len = (pcap - pcap_start);
1157 
1158 	pbuf = rtw_set_ie(pbuf, WLAN_EID_EXTENSION, he_cap_total_len, pcap_start, &len);
1159 
1160 	return len;
1161 }
1162 
rtw_restructure_he_ie(_adapter * padapter,u8 * in_ie,u8 * out_ie,uint in_len,uint * pout_len,struct country_chplan * req_chplan)1163 u32 rtw_restructure_he_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, uint in_len, uint *pout_len, struct country_chplan *req_chplan)
1164 {
1165 	struct mlme_priv	*pmlmepriv = &padapter->mlmepriv;
1166 	struct he_priv	*phepriv = &pmlmepriv->hepriv;
1167 	u32	ielen;
1168 	u8 *out_he_op_ie, *he_cap_ie, *he_op_ie;
1169 	u8 he_cap_eid_ext = WLAN_EID_EXTENSION_HE_CAPABILITY;
1170 	u8 he_op_eid_ext = WLAN_EID_EXTENSION_HE_OPERATION;
1171 
1172 	rtw_he_use_default_setting(padapter);
1173 
1174 	he_cap_ie = rtw_get_ie_ex(in_ie + 12, in_len - 12, WLAN_EID_EXTENSION, &he_cap_eid_ext, 1, NULL, &ielen);
1175 	if (!he_cap_ie || (ielen > (HE_CAP_ELE_MAX_LEN + 2)))
1176 		goto exit;
1177 	he_op_ie = rtw_get_ie_ex(in_ie + 12, in_len - 12, WLAN_EID_EXTENSION, &he_op_eid_ext, 1, NULL, &ielen);
1178 	if (!he_op_ie || (ielen > (HE_OPER_ELE_MAX_LEN + 2)))
1179 		goto exit;
1180 
1181 	/* TODO: channel width adjustment according to current chan plan or request chan plan */
1182 
1183 	*pout_len += rtw_build_he_cap_ie(padapter, out_ie + *pout_len);
1184 
1185 	phepriv->he_option = _TRUE;
1186 
1187 exit:
1188 	return phepriv->he_option;
1189 }
1190 
rtw_build_he_oper_params(_adapter * padapter,u8 * pbuf)1191 static int rtw_build_he_oper_params(_adapter *padapter, u8 *pbuf)
1192 {
1193 	/* Set HE Operation Parameters */
1194 
1195 	int info_len = HE_OPER_PARAMS_LEN;
1196 
1197 	SET_HE_OP_PARA_DEFAULT_PE_DUR(pbuf, 0x4);
1198 
1199 	return info_len;
1200 }
1201 
rtw_build_he_oper_bss_color_info(_adapter * padapter,u8 * pbuf)1202 static int rtw_build_he_oper_bss_color_info(_adapter *padapter, u8 *pbuf)
1203 {
1204 	/* Set BSS Color Information */
1205 	int info_len = HE_OPER_BSS_COLOR_INFO_LEN;
1206 	struct rtw_wifi_role_t *wrole = padapter->phl_role;
1207 	struct protocol_cap_t *proto_cap = &(wrole->proto_role_cap);
1208 
1209 	SET_HE_OP_BSS_COLOR_INFO_BSS_COLOR(pbuf, proto_cap->bsscolor);
1210 
1211 	return info_len;
1212 }
1213 
rtw_build_he_oper_basic_mcs_set(_adapter * padapter,u8 * pbuf)1214 static int rtw_build_he_oper_basic_mcs_set(_adapter *padapter, u8 *pbuf)
1215 {
1216 	/* Set Basic HE-MCS and NSS Set */
1217 
1218 	int info_len = HE_OPER_BASIC_MCS_LEN;
1219 
1220 	_rtw_memset(pbuf, HE_MSC_NOT_SUPP_BYTE, info_len);
1221 
1222 	SET_HE_OP_BASIC_MCS_1SS(pbuf, HE_MCS_SUPP_MSC0_TO_MSC11);
1223 	SET_HE_OP_BASIC_MCS_2SS(pbuf, HE_MCS_SUPP_MSC0_TO_MSC11);
1224 
1225 	return info_len;
1226 }
1227 
rtw_build_vht_oper_info(_adapter * padapter,u8 * pbuf)1228 static int rtw_build_vht_oper_info(_adapter *padapter, u8 *pbuf)
1229 {
1230 	/* Set VHT Operation Information (optional) */
1231 
1232 	int info_len = 0;
1233 
1234 	return info_len;
1235 }
1236 
rtw_build_max_cohost_bssid_ind(_adapter * padapter,u8 * pbuf)1237 static int rtw_build_max_cohost_bssid_ind(_adapter *padapter, u8 *pbuf)
1238 {
1239 	/* Set Max Co-Hosted BSSID Indicator (optional) */
1240 
1241 	int info_len = 0;
1242 
1243 	return info_len;
1244 }
1245 
rtw_build_6g_oper_info(_adapter * padapter,u8 * pbuf)1246 static int rtw_build_6g_oper_info(_adapter *padapter, u8 *pbuf)
1247 {
1248 	/* Set 6GHz Operation Information (optional) */
1249 
1250 	int info_len = 0;
1251 
1252 	return info_len;
1253 }
1254 
rtw_build_he_operation_ie(_adapter * padapter,u8 * pbuf)1255 u32	rtw_build_he_operation_ie(_adapter *padapter, u8 *pbuf)
1256 {
1257 	struct mlme_priv		*pmlmepriv = &padapter->mlmepriv;
1258 	struct he_priv		*phepriv = &pmlmepriv->hepriv;
1259 	u32 he_oper_total_len = 0, len = 0;
1260 	u8* poper_start = phepriv->he_op;
1261 	u8* poper = poper_start;
1262 
1263 	_rtw_memset(poper, 0, HE_OPER_ELE_MAX_LEN);
1264 
1265 	/* Ele ID Extension */
1266 	*poper++ = WLAN_EID_EXTENSION_HE_OPERATION;
1267 
1268 	/* HE Oper Params */
1269 	poper += rtw_build_he_oper_params(padapter, poper);
1270 
1271 	/* BSS Color Info */
1272 	poper += rtw_build_he_oper_bss_color_info(padapter, poper);
1273 
1274 	/* Basic MCS and NSS Set */
1275 	poper += rtw_build_he_oper_basic_mcs_set(padapter, poper);
1276 
1277 	/* VHT Oper Info */
1278 	poper += rtw_build_vht_oper_info(padapter, poper);
1279 
1280 	/* Max Co-Hosted BSSID Indicator */
1281 	poper += rtw_build_max_cohost_bssid_ind(padapter, poper);
1282 
1283 	/* 6G Oper Info */
1284 	poper += rtw_build_6g_oper_info(padapter, poper);
1285 
1286 	he_oper_total_len = (poper - poper_start);
1287 
1288 	pbuf = rtw_set_ie(pbuf, WLAN_EID_EXTENSION, he_oper_total_len, poper_start, &len);
1289 
1290 	return len;
1291 }
1292 
HEOnAssocRsp(_adapter * padapter)1293 void HEOnAssocRsp(_adapter *padapter)
1294 {
1295 	struct mlme_priv		*pmlmepriv = &padapter->mlmepriv;
1296 	struct vht_priv		*pvhtpriv = &pmlmepriv->vhtpriv;
1297 	struct mlme_ext_priv	*pmlmeext = &padapter->mlmeextpriv;
1298 	struct mlme_ext_info	*pmlmeinfo = &(pmlmeext->mlmext_info);
1299 	u8	ht_AMPDU_len;
1300 
1301 	if (!pmlmeinfo->VHT_enable)
1302 		return;
1303 
1304 	if (!pmlmeinfo->HE_enable)
1305 		return;
1306 
1307 	RTW_INFO("%s\n", __FUNCTION__);
1308 
1309 	/* AMPDU related settings here ? */
1310 }
1311 
rtw_he_ies_attach(_adapter * padapter,WLAN_BSSID_EX * pnetwork)1312 void rtw_he_ies_attach(_adapter *padapter, WLAN_BSSID_EX *pnetwork)
1313 {
1314 	struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
1315 	u8 he_cap_eid_ext = WLAN_EID_EXTENSION_HE_CAPABILITY;
1316 	u8 cap_len, operation_len;
1317 	uint len = 0;
1318 	sint ie_len = 0;
1319 	u8 *p = NULL;
1320 
1321 	p = rtw_get_ie_ex(pnetwork->IEs + _BEACON_IE_OFFSET_, pnetwork->IELength - _BEACON_IE_OFFSET_,
1322 		WLAN_EID_EXTENSION, &he_cap_eid_ext, 1, NULL, &ie_len);
1323 	if (p && ie_len > 0)
1324 		return;
1325 
1326 	rtw_he_use_default_setting(padapter);
1327 
1328 	cap_len = rtw_build_he_cap_ie(padapter, pnetwork->IEs + pnetwork->IELength);
1329 	pnetwork->IELength += cap_len;
1330 
1331 	operation_len = rtw_build_he_operation_ie(padapter, pnetwork->IEs + pnetwork->IELength);
1332 	pnetwork->IELength += operation_len;
1333 
1334 	pmlmepriv->hepriv.he_option = _TRUE;
1335 }
1336 
rtw_he_ies_detach(_adapter * padapter,WLAN_BSSID_EX * pnetwork)1337 void rtw_he_ies_detach(_adapter *padapter, WLAN_BSSID_EX *pnetwork)
1338 {
1339 	struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
1340 	u8 he_cap_eid_ext = WLAN_EID_EXTENSION_HE_CAPABILITY;
1341 	u8 he_op_eid_ext = WLAN_EID_EXTENSION_HE_OPERATION;
1342 
1343 	rtw_remove_bcn_ie_ex(padapter, pnetwork, WLAN_EID_EXTENSION, &he_cap_eid_ext, 1);
1344 	rtw_remove_bcn_ie_ex(padapter, pnetwork, WLAN_EID_EXTENSION, &he_op_eid_ext, 1);
1345 
1346 	pmlmepriv->hepriv.he_option = _FALSE;
1347 }
1348 
rtw_he_htc_en(_adapter * padapter,struct sta_info * psta)1349 u8 rtw_he_htc_en(_adapter *padapter, struct sta_info *psta)
1350 {
1351 	return 1;
1352 }
1353 
rtw_he_fill_htc(_adapter * padapter,struct pkt_attrib * pattrib,u32 * phtc_buf)1354 void rtw_he_fill_htc(_adapter *padapter, struct pkt_attrib *pattrib, u32 *phtc_buf)
1355 {
1356 	struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
1357 	struct rtw_he_actrl_om *cur_om_info = &(pmlmepriv->hepriv.om_info);
1358 
1359 	SET_HE_VAR_HTC(phtc_buf);
1360 	SET_HE_VAR_HTC_CID_CAS(phtc_buf);
1361 
1362 	/* CONFIG_80211AX_HE_TODO */
1363 
1364 	if ((pattrib->type == WIFI_DATA_TYPE &&
1365 		cur_om_info->actrl_om_normal_tx &&
1366 		cur_om_info->actrl_om_normal_tx_cnt != 0) ||
1367 		pattrib->type == WIFI_MGT_TYPE) {
1368 
1369 		SET_HE_VAR_HTC_CID_OM(phtc_buf);
1370 		SET_HE_VAR_HTC_OM_RX_NSS(phtc_buf, cur_om_info->om_actrl_ele.rx_nss);
1371 		SET_HE_VAR_HTC_OM_CH_WIDTH(phtc_buf, cur_om_info->om_actrl_ele.channel_width);
1372 		SET_HE_VAR_HTC_OM_UL_MU_DIS(phtc_buf, cur_om_info->om_actrl_ele.ul_mu_disable);
1373 		SET_HE_VAR_HTC_OM_TX_NSTS(phtc_buf, cur_om_info->om_actrl_ele.tx_nsts);
1374 		SET_HE_VAR_HTC_OM_ER_SU_DIS(phtc_buf, cur_om_info->om_actrl_ele.er_su_disable);
1375 		SET_HE_VAR_HTC_OM_DL_MU_MIMO_RR(phtc_buf, cur_om_info->om_actrl_ele.dl_mu_mimo_rr);
1376 		SET_HE_VAR_HTC_OM_UL_MU_DATA_DIS(phtc_buf, cur_om_info->om_actrl_ele.ul_mu_data_disable);
1377 		if (cur_om_info->actrl_om_normal_tx_cnt) {
1378 			/*RTW_INFO("%s, cur_om_info->actrl_om_normal_tx_cnt=%d\n", __func__, cur_om_info->actrl_om_normal_tx_cnt);*/
1379 			cur_om_info->actrl_om_normal_tx_cnt --;
1380 		}
1381 	}
1382 
1383 }
1384 
rtw_he_set_om_info(_adapter * padapter,u8 om_mask,struct rtw_he_actrl_om * om_info)1385 void rtw_he_set_om_info(_adapter *padapter, u8 om_mask, struct rtw_he_actrl_om *om_info)
1386 {
1387 	struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
1388 	struct rtw_he_actrl_om *cur_om_info = &(pmlmepriv->hepriv.om_info);
1389 
1390 	if (om_mask & OM_RX_NSS)
1391 		cur_om_info->om_actrl_ele.rx_nss = om_info->om_actrl_ele.rx_nss;
1392 
1393 	if (om_mask & OM_CH_BW)
1394 		cur_om_info->om_actrl_ele.channel_width= om_info->om_actrl_ele.channel_width;
1395 
1396 	if (om_mask & OM_UL_MU_DIS)
1397 		cur_om_info->om_actrl_ele.ul_mu_disable= om_info->om_actrl_ele.ul_mu_disable;
1398 
1399 	if (om_mask & OM_TX_NSTS)
1400 		cur_om_info->om_actrl_ele.tx_nsts= om_info->om_actrl_ele.tx_nsts;
1401 
1402 	if (om_mask & OM_ER_SU_DIS)
1403 		cur_om_info->om_actrl_ele.er_su_disable= om_info->om_actrl_ele.er_su_disable;
1404 
1405 	if (om_mask & OM_DL_MU_RR)
1406 		cur_om_info->om_actrl_ele.dl_mu_mimo_rr= om_info->om_actrl_ele.dl_mu_mimo_rr;
1407 
1408 	if (om_mask & OM_UL_MU_DATA_DIS)
1409 		cur_om_info->om_actrl_ele.ul_mu_data_disable= om_info->om_actrl_ele.ul_mu_data_disable;
1410 
1411 	cur_om_info->actrl_om_normal_tx = om_info->actrl_om_normal_tx;
1412 	cur_om_info->actrl_om_normal_tx_cnt = om_info->actrl_om_normal_tx_cnt;
1413 #if 0
1414 	RTW_INFO("%s, cur_om_info->om_actrl_ele.rx_nss = %d\n", __func__, cur_om_info->om_actrl_ele.rx_nss);
1415 	RTW_INFO("%s, cur_om_info->om_actrl_ele.channel_width = %d\n", __func__, cur_om_info->om_actrl_ele.channel_width);
1416 	RTW_INFO("%s, cur_om_info->om_actrl_ele.ul_mu_disable = %d\n", __func__, cur_om_info->om_actrl_ele.ul_mu_disable);
1417 	RTW_INFO("%s, cur_om_info->om_actrl_ele.tx_nsts = %d\n", __func__, cur_om_info->om_actrl_ele.tx_nsts);
1418 	RTW_INFO("%s, cur_om_info->om_actrl_ele.er_su_disable = %d\n", __func__, cur_om_info->om_actrl_ele.er_su_disable);
1419 	RTW_INFO("%s, cur_om_info->om_actrl_ele.dl_mu_mimo_rr = %d\n", __func__, cur_om_info->om_actrl_ele.dl_mu_mimo_rr);
1420 	RTW_INFO("%s, cur_om_info->om_actrl_ele.ul_mu_data_disable = %d\n", __func__, cur_om_info->om_actrl_ele.ul_mu_data_disable);
1421 #endif
1422 }
1423 
rtw_he_init_om_info(_adapter * padapter)1424 void rtw_he_init_om_info(_adapter *padapter)
1425 {
1426 	struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
1427 	struct rtw_he_actrl_om *cur_om_info = &(pmlmepriv->hepriv.om_info);
1428 	struct rtw_wifi_role_t *wrole = padapter->phl_role;
1429 
1430 	cur_om_info->om_actrl_ele.rx_nss = wrole->proto_role_cap.nss_rx - 1;
1431 
1432 	switch (wrole->chandef.bw) {
1433 		case CHANNEL_WIDTH_20:
1434 			cur_om_info->om_actrl_ele.channel_width = 0;
1435 			break;
1436 		case CHANNEL_WIDTH_40:
1437 			cur_om_info->om_actrl_ele.channel_width = 1;
1438 			break;
1439 		case CHANNEL_WIDTH_80:
1440 			cur_om_info->om_actrl_ele.channel_width = 2;
1441 			break;
1442 		case CHANNEL_WIDTH_160:
1443 		case CHANNEL_WIDTH_80_80:
1444 			cur_om_info->om_actrl_ele.channel_width = 3;
1445 			break;
1446 		default:
1447 			RTW_WARN("%s, HE OM control not support CH BW (%d), set to 0 (20M)\n", __func__, wrole->chandef.bw);
1448 			cur_om_info->om_actrl_ele.channel_width = 0;
1449 			break;
1450 	}
1451 
1452 	cur_om_info->om_actrl_ele.ul_mu_disable = _FALSE;
1453 	cur_om_info->om_actrl_ele.tx_nsts = wrole->proto_role_cap.nss_tx - 1;
1454 	cur_om_info->om_actrl_ele.er_su_disable =  _FALSE;
1455 	cur_om_info->om_actrl_ele.dl_mu_mimo_rr = _FALSE;
1456 	cur_om_info->om_actrl_ele.ul_mu_data_disable = _FALSE;
1457 	cur_om_info->actrl_om_normal_tx = _FALSE;
1458 	cur_om_info->actrl_om_normal_tx_cnt = 0;
1459 
1460 }
1461 
rtw_process_he_triggerframe(_adapter * padapter,union recv_frame * precv_frame)1462 void rtw_process_he_triggerframe(_adapter *padapter,
1463 				union recv_frame *precv_frame)
1464 {
1465 
1466 	void *phl;
1467 	struct rtw_phl_stainfo_t *phl_sta;
1468 
1469 	struct dvobj_priv *d = adapter_to_dvobj(padapter);
1470 	u8 *trigger_frame = precv_frame->u.hdr.rx_data;
1471 	u16 trigger_length = precv_frame->u.hdr.len;
1472 	struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;
1473 	struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
1474 	struct wlan_network *cur_network = &(pmlmepriv->cur_network);
1475 	u16 aid = 0;
1476 	u8 *user_info;
1477 	u16 remain_length = 0;
1478 	u8 trigger_type = 0;
1479 	bool ra_is_bc = _FALSE;
1480 	phl = GET_PHL_INFO(d);
1481 
1482 
1483 	if (check_fwstate(pmlmepriv, WIFI_ASOC_STATE) == _FALSE)
1484 		return;
1485 
1486 	/* check length */
1487 	if (trigger_length < TRIGGER_FRAME_MIN_LENGTH) {
1488 		RTW_INFO("%s [T_Frame]TRIGGER_FRAME_MIN_LENGTH(%d) trigger_length=%d\n",
1489 			 __func__,
1490 			 TRIGGER_FRAME_MIN_LENGTH,
1491 			 trigger_length);
1492 		return;
1493 	}
1494 
1495 	/* Check TA : from connected AP*/
1496 	if(_rtw_memcmp(get_addr2_ptr(trigger_frame), cur_network->network.MacAddress, ETH_ALEN) == _FALSE) {
1497 		RTW_INFO("%s [T_Frame] Trigger Frame error, not from connected AP\n", __func__);
1498 		return;
1499 	}
1500 
1501 	/* parsing trigger frame sub-type*/
1502 	trigger_type = GET_TRIGGER_FRAME_TYPE(trigger_frame);
1503 	switch (trigger_type) {
1504 	case TRIGGER_FRAME_T_BASIC:
1505 		{
1506 			#ifdef RTW_WKARD_TRIGGER_FRAME_PARSER
1507 			user_info = trigger_frame + 24;
1508 			remain_length = trigger_length - 24;
1509 			phl_sta = rtw_phl_get_stainfo_by_addr(phl, padapter->phl_role, get_addr2_ptr(trigger_frame));
1510 
1511 			if(phl_sta == NULL)
1512 				break;
1513 			/* start from User Info */
1514 			while (remain_length >= TRIGGER_FRAME_BASIC_USER_INFO_SZ) {
1515 				aid = GET_TRIGGER_FRAME_USER_INFO_AID12(user_info);
1516 				RTW_DBG("%s [T_Frame] aid=0x%x, UL MCS=0x%x, RU_alloc=0x%x \n",
1517 					  __func__, aid,
1518 					  GET_TRIGGER_FRAME_USER_INFO_UL_MCS(user_info),
1519 					  GET_TRIGGER_FRAME_USER_INFO_RUA(user_info));
1520 				if ((aid == phl_sta->aid) && (aid != 0)) {
1521 					phl_sta->stats.rx_tf_cnt++;
1522 					RTW_DBG("%s [T_Frame]phl_sta->stats.rx_tf_cnt(%d)\n",
1523 						 __func__,
1524 						 phl_sta->stats.rx_tf_cnt);
1525 					break;
1526 				}
1527 				if (aid == 0xfff) {
1528 					/* padding content, break it */
1529 					break;
1530 				}
1531 				/* shift to next user info */
1532 				user_info += TRIGGER_FRAME_BASIC_USER_INFO_SZ;
1533 				remain_length -= TRIGGER_FRAME_BASIC_USER_INFO_SZ;
1534 			}
1535 			#endif /*RTW_WKARD_TRIGGER_FRAME_PARSER*/
1536 		}
1537 		break;
1538 	case TRIGGER_FRAME_T_BFRP:
1539 		/* fall through */
1540 	case TRIGGER_FRAME_T_MUBAR:
1541 		/* fall through */
1542 	case TRIGGER_FRAME_T_MURTS:
1543 		/* fall through */
1544 	case TRIGGER_FRAME_T_BSRP:
1545 		/* fall through */
1546 	case TRIGGER_FRAME_T_GCR_MUBAR:
1547 		/* fall through */
1548 	case TRIGGER_FRAME_T_BQRP:
1549 		/* fall through */
1550 	case TRIGGER_FRAME_T_NFRP:
1551 		/* fall through */
1552 	case TRIGGER_FRAME_T_RSVD:
1553 		break;
1554 	}
1555 }
1556 
rtw_update_he_ies(_adapter * padapter,WLAN_BSSID_EX * pnetwork)1557 void rtw_update_he_ies(_adapter *padapter, WLAN_BSSID_EX *pnetwork)
1558 {
1559 	u8 he_cap_ie_len;
1560 	u8 he_cap_ie[255];
1561 	u8 he_cap_eid_ext = WLAN_EID_EXTENSION_HE_CAPABILITY;
1562 	u8 he_op_ie_len;
1563 	u8 he_op_ie[255];
1564 	u8 he_op_eid_ext = WLAN_EID_EXTENSION_HE_OPERATION;
1565 
1566 	RTW_INFO("Don't setting HE capability/operation IE from hostap, builded by driver temporarily\n");
1567 	rtw_he_use_default_setting(padapter);
1568 
1569 	rtw_remove_bcn_ie_ex(padapter, pnetwork, WLAN_EID_EXTENSION, &he_cap_eid_ext, 1);
1570 	he_cap_ie_len = rtw_build_he_cap_ie(padapter, he_cap_ie);
1571 	rtw_add_bcn_ie_ex(padapter, pnetwork, he_cap_eid_ext, he_cap_ie + 2, he_cap_ie_len - 2);
1572 
1573 	rtw_remove_bcn_ie_ex(padapter, pnetwork, WLAN_EID_EXTENSION, &he_op_eid_ext, 1);
1574 	he_op_ie_len = rtw_build_he_operation_ie(padapter, he_op_ie);
1575 	rtw_add_bcn_ie_ex(padapter, pnetwork, he_op_eid_ext, he_op_ie + 2, he_op_ie_len - 2);
1576 }
1577 #endif /* CONFIG_80211AX_HE */
1578 
1579