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