1 /*
2 * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
3 * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4 *
5 * Permission to use, copy, modify, and/or distribute this software for
6 * any purpose with or without fee is hereby granted, provided that the
7 * above copyright notice and this permission notice appear in all
8 * copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17 * PERFORMANCE OF THIS SOFTWARE.
18 */
19 /**
20 * DOC: define public APIs exposed by the mlme component
21 */
22
23 #include "cfg_ucfg_api.h"
24 #include "wlan_mlme_main.h"
25 #include "wlan_mlme_ucfg_api.h"
26 #include "wma_types.h"
27 #include "wmi_unified.h"
28 #include "wma.h"
29 #include "wma_internal.h"
30 #include "wlan_crypto_global_api.h"
31 #include "wlan_utility.h"
32 #include "wlan_policy_mgr_ucfg.h"
33 #include "wlan_vdev_mgr_utils_api.h"
34 #include <../../core/src/wlan_cm_vdev_api.h>
35 #include "wlan_psoc_mlme_api.h"
36 #include "wlan_action_oui_main.h"
37 #include "target_if.h"
38 #include "wlan_vdev_mgr_tgt_if_tx_api.h"
39 #include "wmi_unified_vdev_api.h"
40 #include "wlan_mlme_api.h"
41 #include "../../core/src/wlan_cp_stats_defs.h"
42 #include "wlan_reg_services_api.h"
43
44 /* quota in milliseconds */
45 #define MCC_DUTY_CYCLE 70
46
wlan_mlme_get_cfg_str(uint8_t * dst,struct mlme_cfg_str * cfg_str,qdf_size_t * len)47 QDF_STATUS wlan_mlme_get_cfg_str(uint8_t *dst, struct mlme_cfg_str *cfg_str,
48 qdf_size_t *len)
49 {
50 if (*len < cfg_str->len) {
51 mlme_legacy_err("Invalid len %zd", *len);
52 return QDF_STATUS_E_INVAL;
53 }
54
55 *len = cfg_str->len;
56 qdf_mem_copy(dst, cfg_str->data, *len);
57
58 return QDF_STATUS_SUCCESS;
59 }
60
wlan_mlme_set_cfg_str(uint8_t * src,struct mlme_cfg_str * dst_cfg_str,qdf_size_t len)61 QDF_STATUS wlan_mlme_set_cfg_str(uint8_t *src, struct mlme_cfg_str *dst_cfg_str,
62 qdf_size_t len)
63 {
64 if (len > dst_cfg_str->max_len) {
65 mlme_legacy_err("Invalid len %zd (>%zd)", len,
66 dst_cfg_str->max_len);
67 return QDF_STATUS_E_INVAL;
68 }
69
70 dst_cfg_str->len = len;
71 qdf_mem_copy(dst_cfg_str->data, src, len);
72
73 return QDF_STATUS_SUCCESS;
74 }
75
wlan_mlme_get_tx_power(struct wlan_objmgr_psoc * psoc,enum band_info band)76 uint8_t wlan_mlme_get_tx_power(struct wlan_objmgr_psoc *psoc,
77 enum band_info band)
78 {
79 struct wlan_mlme_psoc_ext_obj *mlme_obj;
80
81 mlme_obj = mlme_get_psoc_ext_obj(psoc);
82 if (!mlme_obj)
83 return 0;
84
85 switch (band) {
86 case BAND_2G:
87 return mlme_obj->cfg.power.tx_power_2g;
88 case BAND_5G:
89 return mlme_obj->cfg.power.tx_power_5g;
90 default:
91 break;
92 }
93 return 0;
94 }
95
wlan_mlme_get_power_usage(struct wlan_objmgr_psoc * psoc)96 char *wlan_mlme_get_power_usage(struct wlan_objmgr_psoc *psoc)
97 {
98 struct wlan_mlme_psoc_ext_obj *mlme_obj;
99
100 mlme_obj = mlme_get_psoc_ext_obj(psoc);
101 if (!mlme_obj)
102 return NULL;
103
104 return mlme_obj->cfg.power.power_usage.data;
105 }
106
107 QDF_STATUS
wlan_mlme_get_enable_deauth_to_disassoc_map(struct wlan_objmgr_psoc * psoc,bool * value)108 wlan_mlme_get_enable_deauth_to_disassoc_map(struct wlan_objmgr_psoc *psoc,
109 bool *value)
110 {
111 struct wlan_mlme_psoc_ext_obj *mlme_obj;
112
113 mlme_obj = mlme_get_psoc_ext_obj(psoc);
114 if (!mlme_obj)
115 return QDF_STATUS_E_INVAL;
116
117 *value = mlme_obj->cfg.gen.enable_deauth_to_disassoc_map;
118 return QDF_STATUS_SUCCESS;
119 }
120
wlan_mlme_get_ht_cap_info(struct wlan_objmgr_psoc * psoc,struct mlme_ht_capabilities_info * ht_cap_info)121 QDF_STATUS wlan_mlme_get_ht_cap_info(struct wlan_objmgr_psoc *psoc,
122 struct mlme_ht_capabilities_info
123 *ht_cap_info)
124 {
125 struct wlan_mlme_psoc_ext_obj *mlme_obj;
126
127 mlme_obj = mlme_get_psoc_ext_obj(psoc);
128 if (!mlme_obj)
129 return QDF_STATUS_E_FAILURE;
130
131 *ht_cap_info = mlme_obj->cfg.ht_caps.ht_cap_info;
132
133 return QDF_STATUS_SUCCESS;
134 }
135
wlan_mlme_set_ht_cap_info(struct wlan_objmgr_psoc * psoc,struct mlme_ht_capabilities_info ht_cap_info)136 QDF_STATUS wlan_mlme_set_ht_cap_info(struct wlan_objmgr_psoc *psoc,
137 struct mlme_ht_capabilities_info
138 ht_cap_info)
139 {
140 struct wlan_mlme_psoc_ext_obj *mlme_obj;
141
142 mlme_obj = mlme_get_psoc_ext_obj(psoc);
143 if (!mlme_obj)
144 return QDF_STATUS_E_FAILURE;
145
146 mlme_obj->cfg.ht_caps.ht_cap_info = ht_cap_info;
147
148 return QDF_STATUS_SUCCESS;
149 }
150
wlan_mlme_get_max_amsdu_num(struct wlan_objmgr_psoc * psoc,uint8_t * value)151 QDF_STATUS wlan_mlme_get_max_amsdu_num(struct wlan_objmgr_psoc *psoc,
152 uint8_t *value)
153 {
154 struct wlan_mlme_psoc_ext_obj *mlme_obj;
155
156 mlme_obj = mlme_get_psoc_ext_obj(psoc);
157 if (!mlme_obj)
158 return QDF_STATUS_E_FAILURE;
159
160 *value = mlme_obj->cfg.ht_caps.max_num_amsdu;
161
162 return QDF_STATUS_SUCCESS;
163 }
164
wlan_mlme_set_max_amsdu_num(struct wlan_objmgr_psoc * psoc,uint8_t value)165 QDF_STATUS wlan_mlme_set_max_amsdu_num(struct wlan_objmgr_psoc *psoc,
166 uint8_t value)
167 {
168 struct wlan_mlme_psoc_ext_obj *mlme_obj;
169
170 mlme_obj = mlme_get_psoc_ext_obj(psoc);
171 if (!mlme_obj)
172 return QDF_STATUS_E_FAILURE;
173
174 if (!cfg_in_range(CFG_MAX_AMSDU_NUM, value)) {
175 mlme_legacy_err("Error in setting Max AMSDU Num");
176 return QDF_STATUS_E_INVAL;
177 }
178
179 mlme_obj->cfg.ht_caps.max_num_amsdu = value;
180
181 return QDF_STATUS_SUCCESS;
182 }
183
wlan_mlme_get_ht_mpdu_density(struct wlan_objmgr_psoc * psoc,uint8_t * value)184 QDF_STATUS wlan_mlme_get_ht_mpdu_density(struct wlan_objmgr_psoc *psoc,
185 uint8_t *value)
186 {
187 struct wlan_mlme_psoc_ext_obj *mlme_obj;
188
189 mlme_obj = mlme_get_psoc_ext_obj(psoc);
190 if (!mlme_obj)
191 return QDF_STATUS_E_FAILURE;
192
193 *value = (uint8_t)mlme_obj->cfg.ht_caps.ampdu_params.mpdu_density;
194
195 return QDF_STATUS_SUCCESS;
196 }
197
wlan_mlme_set_ht_mpdu_density(struct wlan_objmgr_psoc * psoc,uint8_t value)198 QDF_STATUS wlan_mlme_set_ht_mpdu_density(struct wlan_objmgr_psoc *psoc,
199 uint8_t value)
200 {
201 struct wlan_mlme_psoc_ext_obj *mlme_obj;
202
203 mlme_obj = mlme_get_psoc_ext_obj(psoc);
204 if (!mlme_obj)
205 return QDF_STATUS_E_FAILURE;
206
207 if (!cfg_in_range(CFG_MPDU_DENSITY, value)) {
208 mlme_legacy_err("Invalid value %d", value);
209 return QDF_STATUS_E_INVAL;
210 }
211
212 mlme_obj->cfg.ht_caps.ampdu_params.mpdu_density = value;
213
214 return QDF_STATUS_SUCCESS;
215 }
216
217 #ifdef MULTI_CLIENT_LL_SUPPORT
wlan_mlme_get_wlm_multi_client_ll_caps(struct wlan_objmgr_psoc * psoc)218 bool wlan_mlme_get_wlm_multi_client_ll_caps(struct wlan_objmgr_psoc *psoc)
219 {
220 return wlan_psoc_nif_fw_ext2_cap_get(psoc,
221 WLAN_SOC_WLM_MULTI_CLIENT_LL_SUPPORT);
222 }
223 #endif
224
225 #ifdef FEATURE_WLAN_CH_AVOID_EXT
wlan_mlme_get_coex_unsafe_chan_nb_user_prefer(struct wlan_objmgr_psoc * psoc)226 uint32_t wlan_mlme_get_coex_unsafe_chan_nb_user_prefer(
227 struct wlan_objmgr_psoc *psoc)
228 {
229 struct wlan_mlme_psoc_ext_obj *mlme_obj;
230
231 mlme_obj = mlme_get_psoc_ext_obj(psoc);
232 if (!mlme_obj) {
233 mlme_legacy_err("Failed to get MLME Obj");
234 return cfg_default(CFG_COEX_UNSAFE_CHAN_NB_USER_PREFER);
235 }
236
237 return mlme_obj->cfg.reg.coex_unsafe_chan_nb_user_prefer;
238 }
239
wlan_mlme_get_coex_unsafe_chan_nb_user_prefer_for_sap(struct wlan_objmgr_psoc * psoc)240 bool wlan_mlme_get_coex_unsafe_chan_nb_user_prefer_for_sap(
241 struct wlan_objmgr_psoc *psoc)
242 {
243 return !!(wlan_mlme_get_coex_unsafe_chan_nb_user_prefer(psoc) &
244 IGNORE_FW_COEX_INFO_ON_SAP_MODE);
245 }
246
wlan_mlme_get_coex_unsafe_chan_nb_user_prefer_for_p2p_go(struct wlan_objmgr_psoc * psoc)247 bool wlan_mlme_get_coex_unsafe_chan_nb_user_prefer_for_p2p_go(
248 struct wlan_objmgr_psoc *psoc)
249 {
250 return !!(wlan_mlme_get_coex_unsafe_chan_nb_user_prefer(psoc) &
251 IGNORE_FW_COEX_INFO_ON_P2P_GO_MODE);
252 }
253 #endif
254
wlan_mlme_get_band_capability(struct wlan_objmgr_psoc * psoc,uint32_t * band_capability)255 QDF_STATUS wlan_mlme_get_band_capability(struct wlan_objmgr_psoc *psoc,
256 uint32_t *band_capability)
257 {
258 struct wlan_mlme_psoc_ext_obj *mlme_obj;
259
260 mlme_obj = mlme_get_psoc_ext_obj(psoc);
261 if (!mlme_obj)
262 return QDF_STATUS_E_FAILURE;
263
264 *band_capability = mlme_obj->cfg.gen.band_capability;
265
266 return QDF_STATUS_SUCCESS;
267 }
268
269 #ifdef QCA_MULTIPASS_SUPPORT
270 QDF_STATUS
wlan_mlme_peer_config_vlan(struct wlan_objmgr_vdev * vdev,uint8_t * mac_addr)271 wlan_mlme_peer_config_vlan(struct wlan_objmgr_vdev *vdev,
272 uint8_t *mac_addr)
273 {
274 QDF_STATUS status;
275 wmi_unified_t wmi_handle;
276 struct peer_vlan_config_param param;
277
278 wmi_handle = get_wmi_unified_hdl_from_pdev(wlan_vdev_get_pdev(vdev));
279 if (!wmi_handle) {
280 mlme_err("unable to get wmi_handle");
281 return QDF_STATUS_E_INVAL;
282 }
283
284 qdf_mem_set(¶m, sizeof(param), 0);
285
286 param.rx_cmd = 1;
287 /* Enabling Rx_insert_inner_vlan_tag */
288 param.rx_insert_c_tag = 1;
289 param.vdev_id = wlan_vdev_get_id(vdev);
290
291 status = wmi_send_peer_vlan_config(wmi_handle, mac_addr, param);
292 if (QDF_IS_STATUS_ERROR(status))
293 return status;
294
295 return QDF_STATUS_SUCCESS;
296 }
297 #endif
298
wlan_mlme_set_band_capability(struct wlan_objmgr_psoc * psoc,uint32_t band_capability)299 QDF_STATUS wlan_mlme_set_band_capability(struct wlan_objmgr_psoc *psoc,
300 uint32_t band_capability)
301
302 {
303 struct wlan_mlme_psoc_ext_obj *mlme_obj;
304
305 mlme_obj = mlme_get_psoc_ext_obj(psoc);
306 if (!mlme_obj)
307 return QDF_STATUS_E_FAILURE;
308
309 mlme_obj->cfg.gen.band_capability = band_capability;
310
311 return QDF_STATUS_SUCCESS;
312 }
313
314 #ifdef WLAN_VENDOR_HANDOFF_CONTROL
wlan_mlme_get_vendor_handoff_control_caps(struct wlan_objmgr_psoc * psoc)315 bool wlan_mlme_get_vendor_handoff_control_caps(struct wlan_objmgr_psoc *psoc)
316 {
317 return wlan_psoc_nif_fw_ext2_cap_get(psoc,
318 WLAN_SOC_VENDOR_HANDOFF_CONTROL);
319 }
320 #endif
321
wlan_mlme_set_dual_sta_policy(struct wlan_objmgr_psoc * psoc,uint8_t dual_sta_config)322 QDF_STATUS wlan_mlme_set_dual_sta_policy(struct wlan_objmgr_psoc *psoc,
323 uint8_t dual_sta_config)
324
325 {
326 struct wlan_mlme_psoc_ext_obj *mlme_obj;
327
328 mlme_obj = mlme_get_psoc_ext_obj(psoc);
329 if (!mlme_obj)
330 return QDF_STATUS_E_FAILURE;
331
332 mlme_obj->cfg.gen.dual_sta_policy.concurrent_sta_policy =
333 dual_sta_config;
334 mlme_debug("Set dual_sta_config to :%d", dual_sta_config);
335
336 return QDF_STATUS_SUCCESS;
337 }
338
wlan_mlme_get_dual_sta_policy(struct wlan_objmgr_psoc * psoc,uint8_t * dual_sta_config)339 QDF_STATUS wlan_mlme_get_dual_sta_policy(struct wlan_objmgr_psoc *psoc,
340 uint8_t *dual_sta_config)
341
342 {
343 struct wlan_mlme_psoc_ext_obj *mlme_obj;
344
345 mlme_obj = mlme_get_psoc_ext_obj(psoc);
346 if (!mlme_obj)
347 return QDF_STATUS_E_FAILURE;
348
349 *dual_sta_config =
350 mlme_obj->cfg.gen.dual_sta_policy.concurrent_sta_policy;
351
352 return QDF_STATUS_SUCCESS;
353 }
354
355 enum host_concurrent_ap_policy
wlan_mlme_convert_ap_policy_config(enum qca_wlan_concurrent_ap_policy_config ap_config)356 wlan_mlme_convert_ap_policy_config(
357 enum qca_wlan_concurrent_ap_policy_config ap_config)
358 {
359 switch (ap_config) {
360 case QCA_WLAN_CONCURRENT_AP_POLICY_UNSPECIFIED:
361 return HOST_CONCURRENT_AP_POLICY_UNSPECIFIED;
362 case QCA_WLAN_CONCURRENT_AP_POLICY_GAMING_AUDIO:
363 return HOST_CONCURRENT_AP_POLICY_GAMING_AUDIO;
364 case QCA_WLAN_CONCURRENT_AP_POLICY_LOSSLESS_AUDIO_STREAMING:
365 return HOST_CONCURRENT_AP_POLICY_LOSSLESS_AUDIO_STREAMING;
366 case QCA_WLAN_CONCURRENT_AP_POLICY_XR:
367 return HOST_CONCURRENT_AP_POLICY_XR;
368 default:
369 return HOST_CONCURRENT_AP_POLICY_UNSPECIFIED;
370 }
371 }
372
wlan_mlme_ll_lt_sap_send_oce_flags_fw(struct wlan_objmgr_vdev * vdev)373 void wlan_mlme_ll_lt_sap_send_oce_flags_fw(struct wlan_objmgr_vdev *vdev)
374 {
375 struct wlan_objmgr_psoc *psoc = NULL;
376 uint8_t vdev_id;
377 uint8_t updated_fw_value = 0;
378 struct wlan_mlme_psoc_ext_obj *mlme_obj;
379
380 psoc = wlan_vdev_get_psoc(vdev);
381 if (!psoc)
382 return;
383
384 mlme_obj = mlme_get_psoc_ext_obj(psoc);
385
386 if (!mlme_obj)
387 return;
388
389 updated_fw_value = mlme_obj->cfg.oce.feature_bitmap;
390 vdev_id = wlan_vdev_get_id(vdev);
391 wma_debug("Vdev %d Disable FILS discovery", vdev_id);
392 updated_fw_value &= ~(WMI_VDEV_OCE_FILS_DISCOVERY_FRAME_FEATURE_BITMAP);
393 if (wma_cli_set_command(vdev_id,
394 wmi_vdev_param_enable_disable_oce_features,
395 updated_fw_value, VDEV_CMD))
396 mlme_legacy_err("Vdev %d failed to send OCE update", vdev_id);
397 }
398
wlan_mlme_set_ap_policy(struct wlan_objmgr_vdev * vdev,enum host_concurrent_ap_policy ap_cfg_policy)399 QDF_STATUS wlan_mlme_set_ap_policy(struct wlan_objmgr_vdev *vdev,
400 enum host_concurrent_ap_policy ap_cfg_policy)
401
402 {
403 struct mlme_legacy_priv *mlme_priv;
404
405 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
406 if (!mlme_priv) {
407 mlme_legacy_err("vdev legacy private object is NULL");
408 return QDF_STATUS_E_FAILURE;
409 }
410
411 mlme_priv->mlme_ap.ap_policy = ap_cfg_policy;
412 mlme_debug("Set ap_cfg_policy to :%d", mlme_priv->mlme_ap.ap_policy);
413
414 return QDF_STATUS_SUCCESS;
415 }
416
417 enum host_concurrent_ap_policy
wlan_mlme_get_ap_policy(struct wlan_objmgr_vdev * vdev)418 wlan_mlme_get_ap_policy(struct wlan_objmgr_vdev *vdev)
419 {
420 struct mlme_legacy_priv *mlme_priv;
421
422 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
423 if (!mlme_priv) {
424 mlme_legacy_err("vdev legacy private object is NULL");
425 return HOST_CONCURRENT_AP_POLICY_UNSPECIFIED;
426 }
427
428 mlme_debug("Get ap_cfg_policy to :%d", mlme_priv->mlme_ap.ap_policy);
429
430 return mlme_priv->mlme_ap.ap_policy;
431 }
432
wlan_mlme_get_prevent_link_down(struct wlan_objmgr_psoc * psoc,bool * prevent_link_down)433 QDF_STATUS wlan_mlme_get_prevent_link_down(struct wlan_objmgr_psoc *psoc,
434 bool *prevent_link_down)
435 {
436 struct wlan_mlme_psoc_ext_obj *mlme_obj;
437
438 mlme_obj = mlme_get_psoc_ext_obj(psoc);
439 if (!mlme_obj)
440 return QDF_STATUS_E_FAILURE;
441
442 *prevent_link_down = mlme_obj->cfg.gen.prevent_link_down;
443
444 return QDF_STATUS_SUCCESS;
445 }
446
wlan_mlme_get_select_5ghz_margin(struct wlan_objmgr_psoc * psoc,uint8_t * select_5ghz_margin)447 QDF_STATUS wlan_mlme_get_select_5ghz_margin(struct wlan_objmgr_psoc *psoc,
448 uint8_t *select_5ghz_margin)
449 {
450 struct wlan_mlme_psoc_ext_obj *mlme_obj;
451
452 mlme_obj = mlme_get_psoc_ext_obj(psoc);
453 if (!mlme_obj)
454 return QDF_STATUS_E_FAILURE;
455
456 *select_5ghz_margin = mlme_obj->cfg.gen.select_5ghz_margin;
457
458 return QDF_STATUS_SUCCESS;
459 }
460
wlan_mlme_get_rtt_mac_randomization(struct wlan_objmgr_psoc * psoc,bool * rtt_mac_randomization)461 QDF_STATUS wlan_mlme_get_rtt_mac_randomization(struct wlan_objmgr_psoc *psoc,
462 bool *rtt_mac_randomization)
463 {
464 struct wlan_mlme_psoc_ext_obj *mlme_obj;
465
466 mlme_obj = mlme_get_psoc_ext_obj(psoc);
467 if (!mlme_obj)
468 return QDF_STATUS_E_FAILURE;
469
470 *rtt_mac_randomization = mlme_obj->cfg.gen.rtt_mac_randomization;
471
472 return QDF_STATUS_SUCCESS;
473 }
474
wlan_mlme_get_crash_inject(struct wlan_objmgr_psoc * psoc,bool * crash_inject)475 QDF_STATUS wlan_mlme_get_crash_inject(struct wlan_objmgr_psoc *psoc,
476 bool *crash_inject)
477 {
478 struct wlan_mlme_psoc_ext_obj *mlme_obj;
479
480 mlme_obj = mlme_get_psoc_ext_obj(psoc);
481 if (!mlme_obj)
482 return QDF_STATUS_E_FAILURE;
483
484 *crash_inject = mlme_obj->cfg.gen.crash_inject;
485
486 return QDF_STATUS_SUCCESS;
487 }
488
wlan_mlme_get_lpass_support(struct wlan_objmgr_psoc * psoc,bool * lpass_support)489 QDF_STATUS wlan_mlme_get_lpass_support(struct wlan_objmgr_psoc *psoc,
490 bool *lpass_support)
491 {
492 struct wlan_mlme_psoc_ext_obj *mlme_obj;
493
494 mlme_obj = mlme_get_psoc_ext_obj(psoc);
495 if (!mlme_obj)
496 return QDF_STATUS_E_FAILURE;
497
498 *lpass_support = mlme_obj->cfg.gen.lpass_support;
499
500 return QDF_STATUS_SUCCESS;
501 }
502
wlan_mlme_get_wls_6ghz_cap(struct wlan_objmgr_psoc * psoc,bool * wls_6ghz_capable)503 void wlan_mlme_get_wls_6ghz_cap(struct wlan_objmgr_psoc *psoc,
504 bool *wls_6ghz_capable)
505 {
506 struct wlan_mlme_psoc_ext_obj *mlme_obj;
507
508 mlme_obj = mlme_get_psoc_ext_obj(psoc);
509 if (!mlme_obj) {
510 *wls_6ghz_capable = cfg_default(CFG_WLS_6GHZ_CAPABLE);
511 return;
512 }
513 *wls_6ghz_capable = mlme_obj->cfg.gen.wls_6ghz_capable;
514 }
515
wlan_mlme_get_self_recovery(struct wlan_objmgr_psoc * psoc,bool * self_recovery)516 QDF_STATUS wlan_mlme_get_self_recovery(struct wlan_objmgr_psoc *psoc,
517 bool *self_recovery)
518 {
519 struct wlan_mlme_psoc_ext_obj *mlme_obj;
520
521 mlme_obj = mlme_get_psoc_ext_obj(psoc);
522 if (!mlme_obj)
523 return QDF_STATUS_E_FAILURE;
524
525 *self_recovery = mlme_obj->cfg.gen.self_recovery;
526
527 return QDF_STATUS_SUCCESS;
528 }
529
wlan_mlme_get_sub_20_chan_width(struct wlan_objmgr_psoc * psoc,uint8_t * sub_20_chan_width)530 QDF_STATUS wlan_mlme_get_sub_20_chan_width(struct wlan_objmgr_psoc *psoc,
531 uint8_t *sub_20_chan_width)
532 {
533 struct wlan_mlme_psoc_ext_obj *mlme_obj;
534
535 mlme_obj = mlme_get_psoc_ext_obj(psoc);
536 if (!mlme_obj)
537 return QDF_STATUS_E_FAILURE;
538
539 *sub_20_chan_width = mlme_obj->cfg.gen.sub_20_chan_width;
540
541 return QDF_STATUS_SUCCESS;
542 }
543
wlan_mlme_get_fw_timeout_crash(struct wlan_objmgr_psoc * psoc,bool * fw_timeout_crash)544 QDF_STATUS wlan_mlme_get_fw_timeout_crash(struct wlan_objmgr_psoc *psoc,
545 bool *fw_timeout_crash)
546 {
547 struct wlan_mlme_psoc_ext_obj *mlme_obj;
548
549 mlme_obj = mlme_get_psoc_ext_obj(psoc);
550 if (!mlme_obj)
551 return QDF_STATUS_E_FAILURE;
552
553 *fw_timeout_crash = mlme_obj->cfg.gen.fw_timeout_crash;
554
555 return QDF_STATUS_SUCCESS;
556 }
557
wlan_mlme_get_ito_repeat_count(struct wlan_objmgr_psoc * psoc,uint8_t * ito_repeat_count)558 QDF_STATUS wlan_mlme_get_ito_repeat_count(struct wlan_objmgr_psoc *psoc,
559 uint8_t *ito_repeat_count)
560 {
561 struct wlan_mlme_psoc_ext_obj *mlme_obj;
562
563 mlme_obj = mlme_get_psoc_ext_obj(psoc);
564 if (!mlme_obj)
565 return QDF_STATUS_E_FAILURE;
566
567 *ito_repeat_count = mlme_obj->cfg.gen.ito_repeat_count;
568
569 return QDF_STATUS_SUCCESS;
570 }
571
wlan_mlme_get_sap_inactivity_override(struct wlan_objmgr_psoc * psoc,bool * val)572 void wlan_mlme_get_sap_inactivity_override(struct wlan_objmgr_psoc *psoc,
573 bool *val)
574 {
575 struct wlan_mlme_psoc_ext_obj *mlme_obj;
576
577 mlme_obj = mlme_get_psoc_ext_obj(psoc);
578 if (!mlme_obj)
579 return;
580
581 *val = mlme_obj->cfg.qos_mlme_params.sap_max_inactivity_override;
582 }
583
wlan_mlme_get_acs_with_more_param(struct wlan_objmgr_psoc * psoc,bool * value)584 QDF_STATUS wlan_mlme_get_acs_with_more_param(struct wlan_objmgr_psoc *psoc,
585 bool *value)
586 {
587 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
588
589 if (!mlme_obj)
590 return QDF_STATUS_E_FAILURE;
591
592 *value = mlme_obj->cfg.acs.is_acs_with_more_param;
593 return QDF_STATUS_SUCCESS;
594 }
595
wlan_mlme_get_auto_channel_weight(struct wlan_objmgr_psoc * psoc,uint32_t * value)596 QDF_STATUS wlan_mlme_get_auto_channel_weight(struct wlan_objmgr_psoc *psoc,
597 uint32_t *value)
598 {
599 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
600
601 if (!mlme_obj) {
602 *value = cfg_default(CFG_AUTO_CHANNEL_SELECT_WEIGHT);
603 return QDF_STATUS_E_FAILURE;
604 }
605
606 *value = mlme_obj->cfg.acs.auto_channel_select_weight;
607 return QDF_STATUS_SUCCESS;
608 }
609
wlan_mlme_get_vendor_acs_support(struct wlan_objmgr_psoc * psoc,bool * value)610 QDF_STATUS wlan_mlme_get_vendor_acs_support(struct wlan_objmgr_psoc *psoc,
611 bool *value)
612 {
613 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
614
615 if (!mlme_obj)
616 return QDF_STATUS_E_FAILURE;
617
618 *value = mlme_obj->cfg.acs.is_vendor_acs_support;
619 return QDF_STATUS_SUCCESS;
620 }
621
622 QDF_STATUS
wlan_mlme_get_acs_support_for_dfs_ltecoex(struct wlan_objmgr_psoc * psoc,bool * value)623 wlan_mlme_get_acs_support_for_dfs_ltecoex(struct wlan_objmgr_psoc *psoc,
624 bool *value)
625 {
626 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
627
628 if (!mlme_obj)
629 return QDF_STATUS_E_FAILURE;
630
631 *value = mlme_obj->cfg.acs.is_acs_support_for_dfs_ltecoex;
632 return QDF_STATUS_SUCCESS;
633 }
634
635 QDF_STATUS
wlan_mlme_get_external_acs_policy(struct wlan_objmgr_psoc * psoc,bool * value)636 wlan_mlme_get_external_acs_policy(struct wlan_objmgr_psoc *psoc,
637 bool *value)
638 {
639 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
640
641 if (!mlme_obj)
642 return QDF_STATUS_E_FAILURE;
643
644 *value = mlme_obj->cfg.acs.is_external_acs_policy;
645 return QDF_STATUS_SUCCESS;
646 }
647
wlan_mlme_get_tx_chainmask_cck(struct wlan_objmgr_psoc * psoc,bool * value)648 QDF_STATUS wlan_mlme_get_tx_chainmask_cck(struct wlan_objmgr_psoc *psoc,
649 bool *value)
650 {
651 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
652
653 if (!mlme_obj)
654 return QDF_STATUS_E_FAILURE;
655
656 *value = mlme_obj->cfg.chainmask_cfg.tx_chain_mask_cck;
657 return QDF_STATUS_SUCCESS;
658 }
659
wlan_mlme_get_tx_chainmask_1ss(struct wlan_objmgr_psoc * psoc,uint8_t * value)660 QDF_STATUS wlan_mlme_get_tx_chainmask_1ss(struct wlan_objmgr_psoc *psoc,
661 uint8_t *value)
662 {
663 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
664
665 if (!mlme_obj)
666 return QDF_STATUS_E_FAILURE;
667
668 *value = mlme_obj->cfg.chainmask_cfg.tx_chain_mask_1ss;
669 return QDF_STATUS_SUCCESS;
670 }
671
672 bool
wlan_mlme_is_data_stall_recovery_fw_supported(struct wlan_objmgr_psoc * psoc)673 wlan_mlme_is_data_stall_recovery_fw_supported(struct wlan_objmgr_psoc *psoc)
674 {
675 struct wlan_mlme_psoc_ext_obj *mlme_obj;
676
677 mlme_obj = mlme_get_psoc_ext_obj(psoc);
678 if (!mlme_obj) {
679 mlme_err("MLME obj is NULL");
680 return false;
681 }
682
683 return mlme_obj->cfg.gen.data_stall_recovery_fw_support;
684 }
685
686 void
wlan_mlme_update_cfg_with_tgt_caps(struct wlan_objmgr_psoc * psoc,struct mlme_tgt_caps * tgt_caps)687 wlan_mlme_update_cfg_with_tgt_caps(struct wlan_objmgr_psoc *psoc,
688 struct mlme_tgt_caps *tgt_caps)
689 {
690 struct wlan_mlme_psoc_ext_obj *mlme_obj;
691
692 mlme_obj = mlme_get_psoc_ext_obj(psoc);
693 if (!mlme_obj)
694 return;
695
696 /* Update the mlme cfg according to the tgt capability received */
697
698 mlme_obj->cfg.gen.data_stall_recovery_fw_support =
699 tgt_caps->data_stall_recovery_fw_support;
700
701 mlme_obj->cfg.gen.bigtk_support = tgt_caps->bigtk_support;
702 mlme_obj->cfg.gen.stop_all_host_scan_support =
703 tgt_caps->stop_all_host_scan_support;
704 mlme_obj->cfg.gen.dual_sta_roam_fw_support =
705 tgt_caps->dual_sta_roam_fw_support;
706 mlme_obj->cfg.gen.ocv_support = tgt_caps->ocv_support;
707 }
708
709 void
wlan_mlme_update_aux_dev_caps(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_aux_dev_caps wlan_mlme_aux_dev_caps[])710 wlan_mlme_update_aux_dev_caps(
711 struct wlan_objmgr_psoc *psoc,
712 struct wlan_mlme_aux_dev_caps wlan_mlme_aux_dev_caps[])
713 {
714 struct wlan_mlme_psoc_ext_obj *mlme_obj;
715
716 mlme_obj = mlme_get_psoc_ext_obj(psoc);
717 if (!mlme_obj)
718 return;
719
720 qdf_mem_copy(&mlme_obj->cfg.gen.wlan_mlme_aux0_dev_caps[0],
721 &wlan_mlme_aux_dev_caps[0],
722 sizeof(mlme_obj->cfg.gen.wlan_mlme_aux0_dev_caps));
723 }
724
wlan_mlme_cfg_get_aux_supported_modes(struct wlan_objmgr_psoc * psoc,uint32_t aux_index,enum wlan_mlme_hw_mode_config_type hw_mode_id,uint32_t * supported_modes_bitmap)725 bool wlan_mlme_cfg_get_aux_supported_modes(
726 struct wlan_objmgr_psoc *psoc,
727 uint32_t aux_index,
728 enum wlan_mlme_hw_mode_config_type hw_mode_id,
729 uint32_t *supported_modes_bitmap)
730 {
731 struct wlan_mlme_psoc_ext_obj *mlme_obj;
732 struct wlan_mlme_aux_dev_caps *wlan_mlme_aux0_dev_caps;
733
734 if (aux_index != 0) {
735 mlme_err("current only support aux0");
736 return false;
737 }
738
739 if (hw_mode_id >= WLAN_MLME_HW_MODE_MAX) {
740 mlme_err("invalid hw mode id %d.", hw_mode_id);
741 return false;
742 }
743
744 mlme_obj = mlme_get_psoc_ext_obj(psoc);
745 if (!mlme_obj) {
746 mlme_err("MLME obj is NULL");
747 return false;
748 }
749 wlan_mlme_aux0_dev_caps = mlme_obj->cfg.gen.wlan_mlme_aux0_dev_caps;
750 *supported_modes_bitmap =
751 wlan_mlme_aux0_dev_caps[hw_mode_id].supported_modes_bitmap;
752 return true;
753 }
754
755 /**
756 * wlan_mlme_is_aux_cap_support() - checking the corresponding capability
757 * @psoc: wlan_objmgr_psoc pointer
758 * @bit: the corresponding bit
759 * @hw_mode_id: hw mode id
760 *
761 * Return: true if corresponding capability supporting
762 */
763 static bool
wlan_mlme_is_aux_cap_support(struct wlan_objmgr_psoc * psoc,enum wlan_mlme_aux_caps_bit bit,enum wlan_mlme_hw_mode_config_type hw_mode_id)764 wlan_mlme_is_aux_cap_support(struct wlan_objmgr_psoc *psoc,
765 enum wlan_mlme_aux_caps_bit bit,
766 enum wlan_mlme_hw_mode_config_type hw_mode_id)
767 {
768 uint32_t supported_modes_bitmap = 0;
769 struct wlan_mlme_psoc_ext_obj *mlme_obj;
770 struct wlan_mlme_aux_dev_caps *wlan_mlme_aux0_dev_caps;
771 int idx;
772
773 mlme_obj = mlme_get_psoc_ext_obj(psoc);
774 if (!mlme_obj) {
775 mlme_err("MLME obj is NULL");
776 return false;
777 }
778
779 wlan_mlme_aux0_dev_caps = mlme_obj->cfg.gen.wlan_mlme_aux0_dev_caps;
780 if (hw_mode_id >= WLAN_MLME_HW_MODE_MAX) {
781 for (idx = 0; idx < WLAN_MLME_HW_MODE_MAX; idx++)
782 supported_modes_bitmap |=
783 wlan_mlme_aux0_dev_caps[idx].supported_modes_bitmap;
784 } else {
785 supported_modes_bitmap =
786 wlan_mlme_aux0_dev_caps[hw_mode_id].supported_modes_bitmap;
787 }
788
789 return (supported_modes_bitmap & (0x1 << bit)) ? true : false;
790 }
791
792 bool
wlan_mlme_is_aux_scan_support(struct wlan_objmgr_psoc * psoc,enum wlan_mlme_hw_mode_config_type hw_mode_id)793 wlan_mlme_is_aux_scan_support(struct wlan_objmgr_psoc *psoc,
794 enum wlan_mlme_hw_mode_config_type hw_mode_id)
795 {
796 return wlan_mlme_is_aux_cap_support(psoc, WLAN_MLME_AUX_MODE_SCAN_BIT,
797 hw_mode_id);
798 }
799
800 bool
wlan_mlme_is_aux_listen_support(struct wlan_objmgr_psoc * psoc,enum wlan_mlme_hw_mode_config_type hw_mode_id)801 wlan_mlme_is_aux_listen_support(struct wlan_objmgr_psoc *psoc,
802 enum wlan_mlme_hw_mode_config_type hw_mode_id)
803 {
804 return wlan_mlme_is_aux_cap_support(psoc, WLAN_MLME_AUX_MODE_LISTEN_BIT,
805 hw_mode_id);
806 }
807
808 bool
wlan_mlme_is_aux_emlsr_support(struct wlan_objmgr_psoc * psoc,enum wlan_mlme_hw_mode_config_type hw_mode_id)809 wlan_mlme_is_aux_emlsr_support(struct wlan_objmgr_psoc *psoc,
810 enum wlan_mlme_hw_mode_config_type hw_mode_id)
811 {
812 return wlan_mlme_is_aux_cap_support(psoc, WLAN_MLME_AUX_MODE_EMLSR_BIT,
813 hw_mode_id);
814 }
815
816 #ifdef WLAN_FEATURE_11AX
wlan_mlme_cfg_get_he_ul_mumimo(struct wlan_objmgr_psoc * psoc,uint32_t * value)817 QDF_STATUS wlan_mlme_cfg_get_he_ul_mumimo(struct wlan_objmgr_psoc *psoc,
818 uint32_t *value)
819 {
820 struct wlan_mlme_psoc_ext_obj *mlme_obj;
821
822 mlme_obj = mlme_get_psoc_ext_obj(psoc);
823 if (!mlme_obj)
824 return QDF_STATUS_E_FAILURE;
825
826 *value = mlme_obj->cfg.he_caps.dot11_he_cap.ul_mu;
827
828 return QDF_STATUS_SUCCESS;
829 }
830
mlme_cfg_get_he_caps(struct wlan_objmgr_psoc * psoc,tDot11fIEhe_cap * he_cap)831 QDF_STATUS mlme_cfg_get_he_caps(struct wlan_objmgr_psoc *psoc,
832 tDot11fIEhe_cap *he_cap)
833 {
834 struct wlan_mlme_psoc_ext_obj *mlme_obj;
835
836 mlme_obj = mlme_get_psoc_ext_obj(psoc);
837 if (!mlme_obj)
838 return QDF_STATUS_E_FAILURE;
839
840 *he_cap = mlme_obj->cfg.he_caps.he_cap_orig;
841
842 return QDF_STATUS_SUCCESS;
843 }
844
wlan_mlme_cfg_set_he_ul_mumimo(struct wlan_objmgr_psoc * psoc,uint32_t value)845 QDF_STATUS wlan_mlme_cfg_set_he_ul_mumimo(struct wlan_objmgr_psoc *psoc,
846 uint32_t value)
847 {
848 struct wlan_mlme_psoc_ext_obj *mlme_obj;
849
850 mlme_obj = mlme_get_psoc_ext_obj(psoc);
851 if (!mlme_obj)
852 return QDF_STATUS_E_FAILURE;
853
854 if (!cfg_in_range(CFG_HE_UL_MUMIMO, value)) {
855 mlme_legacy_debug("Failed to set CFG_HE_UL_MUMIMO with %d",
856 value);
857 return QDF_STATUS_E_FAILURE;
858 }
859
860 mlme_obj->cfg.he_caps.dot11_he_cap.ul_mu = value;
861
862 return QDF_STATUS_SUCCESS;
863 }
864
wlan_mlme_cfg_get_enable_ul_mimo(struct wlan_objmgr_psoc * psoc,uint8_t * value)865 QDF_STATUS wlan_mlme_cfg_get_enable_ul_mimo(struct wlan_objmgr_psoc *psoc,
866 uint8_t *value)
867 {
868 struct wlan_mlme_psoc_ext_obj *mlme_obj;
869
870 mlme_obj = mlme_get_psoc_ext_obj(psoc);
871 if (!mlme_obj)
872 return QDF_STATUS_E_FAILURE;
873
874 *value = mlme_obj->cfg.he_caps.enable_ul_mimo;
875
876 return QDF_STATUS_SUCCESS;
877 }
878
wlan_mlme_cfg_get_enable_ul_ofdm(struct wlan_objmgr_psoc * psoc,uint8_t * value)879 QDF_STATUS wlan_mlme_cfg_get_enable_ul_ofdm(struct wlan_objmgr_psoc *psoc,
880 uint8_t *value)
881 {
882 struct wlan_mlme_psoc_ext_obj *mlme_obj;
883
884 mlme_obj = mlme_get_psoc_ext_obj(psoc);
885 if (!mlme_obj)
886 return QDF_STATUS_E_FAILURE;
887
888
889 *value = mlme_obj->cfg.he_caps.enable_ul_ofdm;
890
891 return QDF_STATUS_SUCCESS;
892 }
893
894 /* mlme_get_min_rate_cap() - get minimum capability for HE-MCS between
895 * ini value and fw capability.
896 *
897 * Rx HE-MCS Map and Tx HE-MCS Map subfields format where 2-bit indicates
898 * 0 indicates support for HE-MCS 0-7 for n spatial streams
899 * 1 indicates support for HE-MCS 0-9 for n spatial streams
900 * 2 indicates support for HE-MCS 0-11 for n spatial streams
901 * 3 indicates that n spatial streams is not supported for HE PPDUs
902 *
903 */
mlme_get_min_rate_cap(uint16_t val1,uint16_t val2)904 static uint16_t mlme_get_min_rate_cap(uint16_t val1, uint16_t val2)
905 {
906 uint16_t ret = 0, i;
907
908 for (i = 0; i < 8; i++) {
909 if (((val1 >> (2 * i)) & 0x3) == 0x3 ||
910 ((val2 >> (2 * i)) & 0x3) == 0x3) {
911 ret |= 0x3 << (2 * i);
912 continue;
913 }
914 ret |= QDF_MIN((val1 >> (2 * i)) & 0x3,
915 (val2 >> (2 * i)) & 0x3) << (2 * i);
916 }
917 return ret;
918 }
919
mlme_update_tgt_he_caps_in_cfg(struct wlan_objmgr_psoc * psoc,struct wma_tgt_cfg * wma_cfg)920 QDF_STATUS mlme_update_tgt_he_caps_in_cfg(struct wlan_objmgr_psoc *psoc,
921 struct wma_tgt_cfg *wma_cfg)
922 {
923 uint8_t chan_width;
924 QDF_STATUS status = QDF_STATUS_SUCCESS;
925 tDot11fIEhe_cap *he_cap = &wma_cfg->he_cap;
926 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
927 uint8_t value, twt_req, twt_resp;
928 uint16_t tx_mcs_map = 0;
929 uint16_t rx_mcs_map = 0;
930 uint8_t nss;
931
932 if (!mlme_obj)
933 return QDF_STATUS_E_FAILURE;
934
935 mlme_obj->cfg.he_caps.dot11_he_cap.present = 1;
936 mlme_obj->cfg.he_caps.dot11_he_cap.htc_he = he_cap->htc_he;
937
938 twt_req = QDF_MIN(he_cap->twt_request,
939 mlme_obj->cfg.he_caps.dot11_he_cap.twt_request);
940 mlme_obj->cfg.he_caps.dot11_he_cap.twt_request = twt_req;
941
942 twt_resp = QDF_MIN(he_cap->twt_responder,
943 mlme_obj->cfg.he_caps.dot11_he_cap.twt_responder);
944 mlme_obj->cfg.he_caps.dot11_he_cap.twt_responder = twt_resp;
945
946 value = QDF_MIN(he_cap->fragmentation,
947 mlme_obj->cfg.he_caps.he_dynamic_fragmentation);
948
949 if (cfg_in_range(CFG_HE_FRAGMENTATION, value))
950 mlme_obj->cfg.he_caps.dot11_he_cap.fragmentation = value;
951
952 if (cfg_in_range(CFG_HE_MAX_FRAG_MSDU,
953 he_cap->max_num_frag_msdu_amsdu_exp))
954 mlme_obj->cfg.he_caps.dot11_he_cap.max_num_frag_msdu_amsdu_exp =
955 he_cap->max_num_frag_msdu_amsdu_exp;
956 if (cfg_in_range(CFG_HE_MIN_FRAG_SIZE, he_cap->min_frag_size))
957 mlme_obj->cfg.he_caps.dot11_he_cap.min_frag_size =
958 he_cap->min_frag_size;
959 if (cfg_in_range(CFG_HE_TRIG_PAD, he_cap->trigger_frm_mac_pad))
960 mlme_obj->cfg.he_caps.dot11_he_cap.trigger_frm_mac_pad =
961 QDF_MIN(he_cap->trigger_frm_mac_pad,
962 mlme_obj->cfg.he_caps.dot11_he_cap.trigger_frm_mac_pad);
963 if (cfg_in_range(CFG_HE_MTID_AGGR_RX, he_cap->multi_tid_aggr_rx_supp))
964 mlme_obj->cfg.he_caps.dot11_he_cap.multi_tid_aggr_rx_supp =
965 he_cap->multi_tid_aggr_rx_supp;
966 if (cfg_in_range(CFG_HE_MTID_AGGR_TX, he_cap->multi_tid_aggr_tx_supp))
967 mlme_obj->cfg.he_caps.dot11_he_cap.multi_tid_aggr_tx_supp =
968 he_cap->multi_tid_aggr_tx_supp;
969 if (cfg_in_range(CFG_HE_LINK_ADAPTATION, he_cap->he_link_adaptation))
970 mlme_obj->cfg.he_caps.dot11_he_cap.he_link_adaptation =
971 he_cap->he_link_adaptation;
972 mlme_obj->cfg.he_caps.dot11_he_cap.all_ack = he_cap->all_ack;
973 mlme_obj->cfg.he_caps.dot11_he_cap.trigd_rsp_sched =
974 he_cap->trigd_rsp_sched;
975 mlme_obj->cfg.he_caps.dot11_he_cap.a_bsr = he_cap->a_bsr;
976
977 value = QDF_MIN(he_cap->broadcast_twt,
978 mlme_obj->cfg.he_caps.dot11_he_cap.broadcast_twt);
979 mlme_obj->cfg.he_caps.dot11_he_cap.broadcast_twt = value;
980
981 /*
982 * As per 802.11ax spec, Flexible TWT capability can be set
983 * independent of TWT Requestor/Responder capability.
984 * But currently we don't have any such usecase and firmware
985 * does not support it. Hence enabling Flexible TWT only when
986 * either or both of the TWT Requestor/Responder capability
987 * is set/enabled.
988 */
989 value = QDF_MIN(he_cap->flex_twt_sched, (twt_req || twt_resp));
990 mlme_obj->cfg.he_caps.dot11_he_cap.flex_twt_sched = value;
991
992 mlme_obj->cfg.he_caps.dot11_he_cap.ba_32bit_bitmap =
993 he_cap->ba_32bit_bitmap;
994 mlme_obj->cfg.he_caps.dot11_he_cap.mu_cascade = he_cap->mu_cascade;
995 mlme_obj->cfg.he_caps.dot11_he_cap.ack_enabled_multitid =
996 he_cap->ack_enabled_multitid;
997 mlme_obj->cfg.he_caps.dot11_he_cap.omi_a_ctrl = he_cap->omi_a_ctrl;
998 mlme_obj->cfg.he_caps.dot11_he_cap.ofdma_ra = he_cap->ofdma_ra;
999 if (cfg_in_range(CFG_HE_MAX_AMPDU_LEN, he_cap->max_ampdu_len_exp_ext))
1000 mlme_obj->cfg.he_caps.dot11_he_cap.max_ampdu_len_exp_ext =
1001 he_cap->max_ampdu_len_exp_ext;
1002 mlme_obj->cfg.he_caps.dot11_he_cap.amsdu_frag = he_cap->amsdu_frag;
1003 mlme_obj->cfg.he_caps.dot11_he_cap.rx_ctrl_frame =
1004 he_cap->rx_ctrl_frame;
1005 mlme_obj->cfg.he_caps.dot11_he_cap.bsrp_ampdu_aggr =
1006 he_cap->bsrp_ampdu_aggr;
1007 mlme_obj->cfg.he_caps.dot11_he_cap.qtp = he_cap->qtp;
1008 mlme_obj->cfg.he_caps.dot11_he_cap.a_bqr = he_cap->a_bqr;
1009 mlme_obj->cfg.he_caps.dot11_he_cap.spatial_reuse_param_rspder =
1010 he_cap->spatial_reuse_param_rspder;
1011 mlme_obj->cfg.he_caps.dot11_he_cap.ndp_feedback_supp =
1012 he_cap->ndp_feedback_supp;
1013 mlme_obj->cfg.he_caps.dot11_he_cap.ops_supp = he_cap->ops_supp;
1014 mlme_obj->cfg.he_caps.dot11_he_cap.amsdu_in_ampdu =
1015 he_cap->amsdu_in_ampdu;
1016 mlme_obj->cfg.he_caps.dot11_he_cap.he_sub_ch_sel_tx_supp =
1017 he_cap->he_sub_ch_sel_tx_supp;
1018 mlme_obj->cfg.he_caps.dot11_he_cap.ul_2x996_tone_ru_supp =
1019 he_cap->ul_2x996_tone_ru_supp;
1020 mlme_obj->cfg.he_caps.dot11_he_cap.om_ctrl_ul_mu_data_dis_rx =
1021 he_cap->om_ctrl_ul_mu_data_dis_rx;
1022 mlme_obj->cfg.he_caps.dot11_he_cap.he_dynamic_smps =
1023 he_cap->he_dynamic_smps;
1024 mlme_obj->cfg.he_caps.dot11_he_cap.punctured_sounding_supp =
1025 he_cap->punctured_sounding_supp;
1026 mlme_obj->cfg.he_caps.dot11_he_cap.ht_vht_trg_frm_rx_supp =
1027 he_cap->ht_vht_trg_frm_rx_supp;
1028
1029 chan_width = HE_CH_WIDTH_COMBINE(he_cap->chan_width_0,
1030 he_cap->chan_width_1,
1031 he_cap->chan_width_2,
1032 he_cap->chan_width_3,
1033 he_cap->chan_width_4,
1034 he_cap->chan_width_5,
1035 he_cap->chan_width_6);
1036 if (cfg_in_range(CFG_HE_CHAN_WIDTH, chan_width)) {
1037 mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_0 =
1038 he_cap->chan_width_0;
1039 mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_1 =
1040 he_cap->chan_width_1;
1041 mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_2 =
1042 he_cap->chan_width_2;
1043 mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_3 =
1044 he_cap->chan_width_3;
1045 mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_4 =
1046 he_cap->chan_width_4;
1047 mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_5 =
1048 he_cap->chan_width_5;
1049 mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_6 =
1050 he_cap->chan_width_6;
1051 }
1052 if (cfg_in_range(CFG_HE_RX_PREAM_PUNC, he_cap->rx_pream_puncturing))
1053 mlme_obj->cfg.he_caps.dot11_he_cap.rx_pream_puncturing =
1054 he_cap->rx_pream_puncturing;
1055 mlme_obj->cfg.he_caps.dot11_he_cap.device_class = he_cap->device_class;
1056 mlme_obj->cfg.he_caps.dot11_he_cap.ldpc_coding = he_cap->ldpc_coding;
1057 if (cfg_in_range(CFG_HE_LTF_PPDU, he_cap->he_1x_ltf_800_gi_ppdu))
1058 mlme_obj->cfg.he_caps.dot11_he_cap.he_1x_ltf_800_gi_ppdu =
1059 he_cap->he_1x_ltf_800_gi_ppdu;
1060 if (cfg_in_range(CFG_HE_MIDAMBLE_RX_MAX_NSTS,
1061 he_cap->midamble_tx_rx_max_nsts))
1062 mlme_obj->cfg.he_caps.dot11_he_cap.midamble_tx_rx_max_nsts =
1063 he_cap->midamble_tx_rx_max_nsts;
1064 mlme_obj->cfg.he_caps.dot11_he_cap.he_4x_ltf_3200_gi_ndp =
1065 he_cap->he_4x_ltf_3200_gi_ndp;
1066 if (mlme_obj->cfg.vht_caps.vht_cap_info.rx_stbc) {
1067 mlme_obj->cfg.he_caps.dot11_he_cap.rx_stbc_lt_80mhz =
1068 he_cap->rx_stbc_lt_80mhz;
1069 mlme_obj->cfg.he_caps.dot11_he_cap.rx_stbc_gt_80mhz =
1070 he_cap->rx_stbc_gt_80mhz;
1071 } else {
1072 mlme_obj->cfg.he_caps.dot11_he_cap.rx_stbc_lt_80mhz = 0;
1073 mlme_obj->cfg.he_caps.dot11_he_cap.rx_stbc_gt_80mhz = 0;
1074 }
1075 if (mlme_obj->cfg.vht_caps.vht_cap_info.tx_stbc) {
1076 mlme_obj->cfg.he_caps.dot11_he_cap.tb_ppdu_tx_stbc_lt_80mhz =
1077 he_cap->tb_ppdu_tx_stbc_lt_80mhz;
1078 mlme_obj->cfg.he_caps.dot11_he_cap.tb_ppdu_tx_stbc_gt_80mhz =
1079 he_cap->tb_ppdu_tx_stbc_gt_80mhz;
1080 } else {
1081 mlme_obj->cfg.he_caps.dot11_he_cap.tb_ppdu_tx_stbc_lt_80mhz = 0;
1082 mlme_obj->cfg.he_caps.dot11_he_cap.tb_ppdu_tx_stbc_gt_80mhz = 0;
1083 }
1084
1085 if (cfg_in_range(CFG_HE_DOPPLER, he_cap->doppler))
1086 mlme_obj->cfg.he_caps.dot11_he_cap.doppler = he_cap->doppler;
1087 if (cfg_in_range(CFG_HE_DCM_TX, he_cap->dcm_enc_tx))
1088 mlme_obj->cfg.he_caps.dot11_he_cap.dcm_enc_tx =
1089 he_cap->dcm_enc_tx;
1090 if (cfg_in_range(CFG_HE_DCM_RX, he_cap->dcm_enc_rx))
1091 mlme_obj->cfg.he_caps.dot11_he_cap.dcm_enc_rx =
1092 he_cap->dcm_enc_rx;
1093 mlme_obj->cfg.he_caps.dot11_he_cap.ul_he_mu = he_cap->ul_he_mu;
1094 if (mlme_obj->cfg.vht_caps.vht_cap_info.su_bformer) {
1095 mlme_obj->cfg.he_caps.dot11_he_cap.su_beamformer =
1096 he_cap->su_beamformer;
1097 if (cfg_in_range(CFG_HE_NUM_SOUND_LT80,
1098 he_cap->num_sounding_lt_80))
1099 mlme_obj->cfg.he_caps.dot11_he_cap.num_sounding_lt_80 =
1100 he_cap->num_sounding_lt_80;
1101 if (cfg_in_range(CFG_HE_NUM_SOUND_GT80,
1102 he_cap->num_sounding_gt_80))
1103 mlme_obj->cfg.he_caps.dot11_he_cap.num_sounding_gt_80 =
1104 he_cap->num_sounding_gt_80;
1105 mlme_obj->cfg.he_caps.dot11_he_cap.mu_beamformer =
1106 he_cap->mu_beamformer;
1107
1108 } else {
1109 mlme_obj->cfg.he_caps.dot11_he_cap.su_beamformer = 0;
1110 mlme_obj->cfg.he_caps.dot11_he_cap.num_sounding_lt_80 = 0;
1111 mlme_obj->cfg.he_caps.dot11_he_cap.num_sounding_gt_80 = 0;
1112 mlme_obj->cfg.he_caps.dot11_he_cap.mu_beamformer = 0;
1113 }
1114
1115 if (mlme_obj->cfg.vht_caps.vht_cap_info.su_bformee) {
1116 mlme_obj->cfg.he_caps.dot11_he_cap.su_beamformee =
1117 he_cap->su_beamformee;
1118 if (cfg_in_range(CFG_HE_BFEE_STS_LT80, he_cap->bfee_sts_lt_80))
1119 mlme_obj->cfg.he_caps.dot11_he_cap.bfee_sts_lt_80 =
1120 he_cap->bfee_sts_lt_80;
1121 if (cfg_in_range(CFG_HE_BFEE_STS_GT80, he_cap->bfee_sts_gt_80))
1122 mlme_obj->cfg.he_caps.dot11_he_cap.bfee_sts_gt_80 =
1123 he_cap->bfee_sts_gt_80;
1124
1125 } else {
1126 mlme_obj->cfg.he_caps.dot11_he_cap.su_beamformee = 0;
1127 mlme_obj->cfg.he_caps.dot11_he_cap.bfee_sts_lt_80 = 0;
1128 mlme_obj->cfg.he_caps.dot11_he_cap.bfee_sts_gt_80 = 0;
1129 }
1130
1131 if (!mlme_obj->cfg.he_caps.enable_ul_mimo) {
1132 mlme_debug("UL MIMO feature is disabled via ini, fw caps :%d",
1133 he_cap->ul_mu);
1134 mlme_obj->cfg.he_caps.dot11_he_cap.ul_mu = 0;
1135 } else {
1136 mlme_obj->cfg.he_caps.dot11_he_cap.ul_mu = he_cap->ul_mu;
1137 }
1138
1139 mlme_obj->cfg.he_caps.dot11_he_cap.su_feedback_tone16 =
1140 he_cap->su_feedback_tone16;
1141 mlme_obj->cfg.he_caps.dot11_he_cap.mu_feedback_tone16 =
1142 he_cap->mu_feedback_tone16;
1143 mlme_obj->cfg.he_caps.dot11_he_cap.codebook_su = he_cap->codebook_su;
1144 mlme_obj->cfg.he_caps.dot11_he_cap.codebook_mu = he_cap->codebook_mu;
1145 if (cfg_in_range(CFG_HE_BFRM_FEED, he_cap->beamforming_feedback))
1146 mlme_obj->cfg.he_caps.dot11_he_cap.beamforming_feedback =
1147 he_cap->beamforming_feedback;
1148 mlme_obj->cfg.he_caps.dot11_he_cap.he_er_su_ppdu =
1149 he_cap->he_er_su_ppdu;
1150 mlme_obj->cfg.he_caps.dot11_he_cap.dl_mu_mimo_part_bw =
1151 he_cap->dl_mu_mimo_part_bw;
1152 mlme_obj->cfg.he_caps.dot11_he_cap.ppet_present = he_cap->ppet_present;
1153 mlme_obj->cfg.he_caps.dot11_he_cap.srp = he_cap->srp;
1154 mlme_obj->cfg.he_caps.dot11_he_cap.power_boost = he_cap->power_boost;
1155 mlme_obj->cfg.he_caps.dot11_he_cap.he_ltf_800_gi_4x =
1156 he_cap->he_ltf_800_gi_4x;
1157 if (cfg_in_range(CFG_HE_MAX_NC, he_cap->max_nc))
1158 mlme_obj->cfg.he_caps.dot11_he_cap.max_nc = he_cap->max_nc;
1159 mlme_obj->cfg.he_caps.dot11_he_cap.er_he_ltf_800_gi_4x =
1160 he_cap->er_he_ltf_800_gi_4x;
1161 mlme_obj->cfg.he_caps.dot11_he_cap.he_ppdu_20_in_40Mhz_2G =
1162 he_cap->he_ppdu_20_in_40Mhz_2G;
1163 mlme_obj->cfg.he_caps.dot11_he_cap.he_ppdu_20_in_160_80p80Mhz =
1164 he_cap->he_ppdu_20_in_160_80p80Mhz;
1165 mlme_obj->cfg.he_caps.dot11_he_cap.he_ppdu_80_in_160_80p80Mhz =
1166 he_cap->he_ppdu_80_in_160_80p80Mhz;
1167 mlme_obj->cfg.he_caps.dot11_he_cap.er_1x_he_ltf_gi =
1168 he_cap->er_1x_he_ltf_gi;
1169 mlme_obj->cfg.he_caps.dot11_he_cap.midamble_tx_rx_1x_he_ltf =
1170 he_cap->midamble_tx_rx_1x_he_ltf;
1171 if (cfg_in_range(CFG_HE_DCM_MAX_BW, he_cap->dcm_max_bw))
1172 mlme_obj->cfg.he_caps.dot11_he_cap.dcm_max_bw =
1173 he_cap->dcm_max_bw;
1174 mlme_obj->cfg.he_caps.dot11_he_cap.longer_than_16_he_sigb_ofdm_sym =
1175 he_cap->longer_than_16_he_sigb_ofdm_sym;
1176 mlme_obj->cfg.he_caps.dot11_he_cap.tx_1024_qam_lt_242_tone_ru =
1177 he_cap->tx_1024_qam_lt_242_tone_ru;
1178 mlme_obj->cfg.he_caps.dot11_he_cap.rx_1024_qam_lt_242_tone_ru =
1179 he_cap->rx_1024_qam_lt_242_tone_ru;
1180 mlme_obj->cfg.he_caps.dot11_he_cap.non_trig_cqi_feedback =
1181 he_cap->non_trig_cqi_feedback;
1182 mlme_obj->cfg.he_caps.dot11_he_cap.rx_full_bw_su_he_mu_compress_sigb =
1183 he_cap->rx_full_bw_su_he_mu_compress_sigb;
1184 mlme_obj->cfg.he_caps.dot11_he_cap.rx_full_bw_su_he_mu_non_cmpr_sigb =
1185 he_cap->rx_full_bw_su_he_mu_non_cmpr_sigb;
1186
1187 tx_mcs_map = mlme_get_min_rate_cap(
1188 mlme_obj->cfg.he_caps.dot11_he_cap.tx_he_mcs_map_lt_80,
1189 he_cap->tx_he_mcs_map_lt_80);
1190 rx_mcs_map = mlme_get_min_rate_cap(
1191 mlme_obj->cfg.he_caps.dot11_he_cap.rx_he_mcs_map_lt_80,
1192 he_cap->rx_he_mcs_map_lt_80);
1193 if (!mlme_obj->cfg.vht_caps.vht_cap_info.enable2x2) {
1194 nss = 2;
1195 tx_mcs_map = HE_SET_MCS_4_NSS(tx_mcs_map, HE_MCS_DISABLE, nss);
1196 rx_mcs_map = HE_SET_MCS_4_NSS(rx_mcs_map, HE_MCS_DISABLE, nss);
1197 }
1198
1199 if (cfg_in_range(CFG_HE_RX_MCS_MAP_LT_80, rx_mcs_map))
1200 mlme_obj->cfg.he_caps.dot11_he_cap.rx_he_mcs_map_lt_80 =
1201 rx_mcs_map;
1202 if (cfg_in_range(CFG_HE_TX_MCS_MAP_LT_80, tx_mcs_map))
1203 mlme_obj->cfg.he_caps.dot11_he_cap.tx_he_mcs_map_lt_80 =
1204 tx_mcs_map;
1205 tx_mcs_map = mlme_get_min_rate_cap(
1206 *((uint16_t *)mlme_obj->cfg.he_caps.dot11_he_cap.tx_he_mcs_map_160),
1207 *((uint16_t *)he_cap->tx_he_mcs_map_160));
1208 rx_mcs_map = mlme_get_min_rate_cap(
1209 *((uint16_t *)mlme_obj->cfg.he_caps.dot11_he_cap.rx_he_mcs_map_160),
1210 *((uint16_t *)he_cap->rx_he_mcs_map_160));
1211
1212 if (!mlme_obj->cfg.vht_caps.vht_cap_info.enable2x2) {
1213 nss = 2;
1214 tx_mcs_map = HE_SET_MCS_4_NSS(tx_mcs_map, HE_MCS_DISABLE, nss);
1215 rx_mcs_map = HE_SET_MCS_4_NSS(rx_mcs_map, HE_MCS_DISABLE, nss);
1216 }
1217
1218 if (cfg_in_range(CFG_HE_RX_MCS_MAP_160, rx_mcs_map))
1219 qdf_mem_copy(mlme_obj->cfg.he_caps.dot11_he_cap.
1220 rx_he_mcs_map_160,
1221 &rx_mcs_map, sizeof(uint16_t));
1222
1223 if (cfg_in_range(CFG_HE_TX_MCS_MAP_160, tx_mcs_map))
1224 qdf_mem_copy(mlme_obj->cfg.he_caps.dot11_he_cap.
1225 tx_he_mcs_map_160,
1226 &tx_mcs_map, sizeof(uint16_t));
1227
1228 if (cfg_in_range(CFG_HE_RX_MCS_MAP_80_80,
1229 *((uint16_t *)he_cap->rx_he_mcs_map_80_80)))
1230 qdf_mem_copy(mlme_obj->cfg.he_caps.dot11_he_cap.
1231 rx_he_mcs_map_80_80,
1232 he_cap->rx_he_mcs_map_80_80, sizeof(uint16_t));
1233
1234 if (cfg_in_range(CFG_HE_TX_MCS_MAP_80_80,
1235 *((uint16_t *)he_cap->tx_he_mcs_map_80_80)))
1236 qdf_mem_copy(mlme_obj->cfg.he_caps.dot11_he_cap.
1237 tx_he_mcs_map_80_80,
1238 he_cap->tx_he_mcs_map_80_80, sizeof(uint16_t));
1239
1240 qdf_mem_copy(mlme_obj->cfg.he_caps.he_ppet_2g, wma_cfg->ppet_2g,
1241 HE_MAX_PPET_SIZE);
1242
1243 qdf_mem_copy(mlme_obj->cfg.he_caps.he_ppet_5g, wma_cfg->ppet_5g,
1244 HE_MAX_PPET_SIZE);
1245
1246 mlme_obj->cfg.he_caps.he_cap_orig = mlme_obj->cfg.he_caps.dot11_he_cap;
1247 /* Take intersection of host and FW capabilities */
1248 mlme_obj->cfg.he_caps.he_mcs_12_13_supp_2g &=
1249 wma_cfg->he_mcs_12_13_supp_2g;
1250 mlme_obj->cfg.he_caps.he_mcs_12_13_supp_5g &=
1251 wma_cfg->he_mcs_12_13_supp_5g;
1252 mlme_debug("mcs_12_13 2G: %x 5G: %x FW_cap: 2G: %x 5G: %x",
1253 mlme_obj->cfg.he_caps.he_mcs_12_13_supp_2g,
1254 mlme_obj->cfg.he_caps.he_mcs_12_13_supp_5g,
1255 wma_cfg->he_mcs_12_13_supp_2g,
1256 wma_cfg->he_mcs_12_13_supp_5g);
1257
1258 return status;
1259 }
1260 #ifdef WLAN_FEATURE_SR
1261 void
wlan_mlme_get_sr_enable_modes(struct wlan_objmgr_psoc * psoc,uint8_t * val)1262 wlan_mlme_get_sr_enable_modes(struct wlan_objmgr_psoc *psoc, uint8_t *val)
1263 {
1264 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
1265
1266 if (!mlme_obj) {
1267 *val = cfg_default(CFG_SR_ENABLE_MODES);
1268 return;
1269 }
1270 *val = mlme_obj->cfg.gen.sr_enable_modes;
1271 }
1272 #endif
1273 #endif
1274
1275 #ifdef WLAN_FEATURE_11BE
mlme_update_tgt_eht_caps_in_cfg(struct wlan_objmgr_psoc * psoc,struct wma_tgt_cfg * wma_cfg)1276 QDF_STATUS mlme_update_tgt_eht_caps_in_cfg(struct wlan_objmgr_psoc *psoc,
1277 struct wma_tgt_cfg *wma_cfg)
1278 {
1279 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
1280 tDot11fIEeht_cap *eht_cap = &wma_cfg->eht_cap;
1281 tDot11fIEeht_cap *mlme_eht_cap;
1282 bool eht_capab;
1283
1284 if (!mlme_obj)
1285 return QDF_STATUS_E_FAILURE;
1286
1287 wlan_psoc_mlme_get_11be_capab(psoc, &eht_capab);
1288 if (!eht_capab)
1289 return QDF_STATUS_SUCCESS;
1290
1291 mlme_obj->cfg.eht_caps.dot11_eht_cap.present = 1;
1292 qdf_mem_copy(&mlme_obj->cfg.eht_caps.dot11_eht_cap, eht_cap,
1293 sizeof(tDot11fIEeht_cap));
1294 mlme_eht_cap = &mlme_obj->cfg.eht_caps.dot11_eht_cap;
1295 if (mlme_obj->cfg.vht_caps.vht_cap_info.su_bformer) {
1296 mlme_eht_cap->su_beamformer = eht_cap->su_beamformer;
1297 if (cfg_in_range(CFG_EHT_NUM_SOUNDING_DIM_LE_80MHZ,
1298 eht_cap->num_sounding_dim_le_80mhz))
1299 mlme_eht_cap->num_sounding_dim_le_80mhz =
1300 eht_cap->num_sounding_dim_le_80mhz;
1301 if (cfg_in_range(CFG_EHT_NUM_SOUNDING_DIM_160MHZ,
1302 eht_cap->num_sounding_dim_160mhz))
1303 mlme_eht_cap->num_sounding_dim_160mhz =
1304 eht_cap->num_sounding_dim_160mhz;
1305 if (cfg_in_range(CFG_EHT_NUM_SOUNDING_DIM_320MHZ,
1306 eht_cap->num_sounding_dim_320mhz))
1307 mlme_eht_cap->num_sounding_dim_320mhz =
1308 eht_cap->num_sounding_dim_320mhz;
1309 mlme_eht_cap->mu_bformer_le_80mhz =
1310 eht_cap->mu_bformer_le_80mhz;
1311 mlme_eht_cap->mu_bformer_160mhz = eht_cap->mu_bformer_160mhz;
1312 mlme_eht_cap->mu_bformer_320mhz = eht_cap->mu_bformer_320mhz;
1313
1314 } else {
1315 mlme_eht_cap->su_beamformer = 0;
1316 mlme_eht_cap->num_sounding_dim_le_80mhz = 0;
1317 mlme_eht_cap->num_sounding_dim_160mhz = 0;
1318 mlme_eht_cap->num_sounding_dim_320mhz = 0;
1319 mlme_eht_cap->mu_bformer_le_80mhz = 0;
1320 mlme_eht_cap->mu_bformer_160mhz = 0;
1321 mlme_eht_cap->mu_bformer_320mhz = 0;
1322 }
1323
1324 if (mlme_obj->cfg.vht_caps.vht_cap_info.su_bformee) {
1325 mlme_eht_cap->su_beamformee = eht_cap->su_beamformee;
1326 if (cfg_in_range(CFG_EHT_BFEE_SS_LE_80MHZ,
1327 eht_cap->bfee_ss_le_80mhz))
1328 mlme_eht_cap->bfee_ss_le_80mhz =
1329 eht_cap->bfee_ss_le_80mhz;
1330 if (cfg_in_range(CFG_EHT_BFEE_SS_160MHZ,
1331 eht_cap->bfee_ss_160mhz))
1332 mlme_eht_cap->bfee_ss_160mhz = eht_cap->bfee_ss_160mhz;
1333 if (cfg_in_range(CFG_EHT_BFEE_SS_320MHZ,
1334 eht_cap->bfee_ss_320mhz))
1335 mlme_eht_cap->bfee_ss_320mhz = eht_cap->bfee_ss_320mhz;
1336
1337 } else {
1338 mlme_eht_cap->su_beamformee = 0;
1339 mlme_eht_cap->bfee_ss_le_80mhz = 0;
1340 mlme_eht_cap->bfee_ss_160mhz = 0;
1341 mlme_eht_cap->bfee_ss_320mhz = 0;
1342 }
1343 mlme_obj->cfg.eht_caps.eht_cap_orig =
1344 mlme_obj->cfg.eht_caps.dot11_eht_cap;
1345
1346 return QDF_STATUS_SUCCESS;
1347 }
1348
mlme_update_tgt_mlo_caps_in_cfg(struct wlan_objmgr_psoc * psoc)1349 QDF_STATUS mlme_update_tgt_mlo_caps_in_cfg(struct wlan_objmgr_psoc *psoc)
1350 {
1351 struct target_psoc_info *tgt_hdl;
1352 QDF_STATUS status;
1353 uint16_t value;
1354
1355 tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
1356 if (!tgt_hdl) {
1357 mlme_debug("target psoc info is NULL");
1358 return QDF_STATUS_E_FAILURE;
1359 }
1360
1361 value = target_if_res_cfg_get_num_max_mlo_link(tgt_hdl);
1362 status = wlan_mlme_set_sta_mlo_conn_max_num(psoc, value);
1363 mlme_debug("Max ML link supported: %d", value);
1364
1365 return status;
1366 }
1367
wlan_mlme_convert_phy_ch_width_to_eht_op_bw(enum phy_ch_width ch_width)1368 uint8_t wlan_mlme_convert_phy_ch_width_to_eht_op_bw(enum phy_ch_width ch_width)
1369 {
1370 switch (ch_width) {
1371 case CH_WIDTH_320MHZ:
1372 return WLAN_EHT_CHWIDTH_320;
1373 case CH_WIDTH_160MHZ:
1374 return WLAN_EHT_CHWIDTH_160;
1375 case CH_WIDTH_80MHZ:
1376 return WLAN_EHT_CHWIDTH_80;
1377 case CH_WIDTH_40MHZ:
1378 return WLAN_EHT_CHWIDTH_40;
1379 default:
1380 return WLAN_EHT_CHWIDTH_20;
1381 }
1382 }
1383
wlan_mlme_convert_eht_op_bw_to_phy_ch_width(uint8_t channel_width)1384 enum phy_ch_width wlan_mlme_convert_eht_op_bw_to_phy_ch_width(
1385 uint8_t channel_width)
1386 {
1387 enum phy_ch_width phy_bw = CH_WIDTH_20MHZ;
1388
1389 if (channel_width == WLAN_EHT_CHWIDTH_320)
1390 phy_bw = CH_WIDTH_320MHZ;
1391 else if (channel_width == WLAN_EHT_CHWIDTH_160)
1392 phy_bw = CH_WIDTH_160MHZ;
1393 else if (channel_width == WLAN_EHT_CHWIDTH_80)
1394 phy_bw = CH_WIDTH_80MHZ;
1395 else if (channel_width == WLAN_EHT_CHWIDTH_40)
1396 phy_bw = CH_WIDTH_40MHZ;
1397
1398 return phy_bw;
1399 }
1400
wlan_mlme_get_epcs_capability(struct wlan_objmgr_psoc * psoc)1401 bool wlan_mlme_get_epcs_capability(struct wlan_objmgr_psoc *psoc)
1402 {
1403 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
1404
1405 if (!mlme_obj)
1406 return true;
1407
1408 return mlme_obj->cfg.sta.epcs_capability;
1409 }
1410
wlan_mlme_set_epcs_capability(struct wlan_objmgr_psoc * psoc,bool flag)1411 void wlan_mlme_set_epcs_capability(struct wlan_objmgr_psoc *psoc, bool flag)
1412 {
1413 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
1414 struct mac_context *mac_ctx = cds_get_context(QDF_MODULE_ID_PE);
1415
1416 if (!mlme_obj || !mac_ctx)
1417 return;
1418
1419 mlme_debug("set mlme epcs capability from %d to %d",
1420 mlme_obj->cfg.sta.epcs_capability, flag);
1421 mlme_obj->cfg.sta.epcs_capability = flag;
1422 if (flag) {
1423 mlme_obj->cfg.eht_caps.dot11_eht_cap.epcs_pri_access = 1;
1424 mac_ctx->eht_cap_2g.epcs_pri_access = 1;
1425 mac_ctx->eht_cap_5g.epcs_pri_access = 1;
1426 } else {
1427 mlme_obj->cfg.eht_caps.dot11_eht_cap.epcs_pri_access = 0;
1428 mac_ctx->eht_cap_2g.epcs_pri_access = 0;
1429 mac_ctx->eht_cap_5g.epcs_pri_access = 0;
1430 }
1431 }
1432
wlan_mlme_get_eht_disable_punct_in_us_lpi(struct wlan_objmgr_psoc * psoc)1433 bool wlan_mlme_get_eht_disable_punct_in_us_lpi(struct wlan_objmgr_psoc *psoc)
1434 {
1435 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
1436
1437 if (!mlme_obj)
1438 return false;
1439
1440 return mlme_obj->cfg.sta.eht_disable_punct_in_us_lpi;
1441 }
1442
wlan_mlme_set_eht_disable_punct_in_us_lpi(struct wlan_objmgr_psoc * psoc,bool flag)1443 void wlan_mlme_set_eht_disable_punct_in_us_lpi(struct wlan_objmgr_psoc *psoc, bool flag)
1444 {
1445 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
1446
1447 if (!mlme_obj)
1448 return;
1449
1450 mlme_debug("set mlme epcs capability to %d", flag);
1451 mlme_obj->cfg.sta.eht_disable_punct_in_us_lpi = flag;
1452 }
1453
wlan_mlme_get_usr_disable_sta_eht(struct wlan_objmgr_psoc * psoc)1454 bool wlan_mlme_get_usr_disable_sta_eht(struct wlan_objmgr_psoc *psoc)
1455 {
1456 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
1457
1458 if (!mlme_obj)
1459 return true;
1460
1461 return mlme_obj->cfg.sta.usr_disable_eht;
1462 }
1463
wlan_mlme_set_usr_disable_sta_eht(struct wlan_objmgr_psoc * psoc,bool disable)1464 void wlan_mlme_set_usr_disable_sta_eht(struct wlan_objmgr_psoc *psoc,
1465 bool disable)
1466 {
1467 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
1468
1469 if (!mlme_obj)
1470 return;
1471
1472 mlme_debug("set usr_disable_eht from %d to %d",
1473 mlme_obj->cfg.sta.usr_disable_eht, disable);
1474 mlme_obj->cfg.sta.usr_disable_eht = disable;
1475 }
1476
wlan_mlme_get_max_bw(void)1477 enum phy_ch_width wlan_mlme_get_max_bw(void)
1478 {
1479 uint32_t max_bw = wma_get_eht_ch_width();
1480
1481 if (max_bw == WNI_CFG_EHT_CHANNEL_WIDTH_320MHZ)
1482 return CH_WIDTH_320MHZ;
1483 else if (max_bw == WNI_CFG_VHT_CHANNEL_WIDTH_160MHZ)
1484 return CH_WIDTH_160MHZ;
1485 else if (max_bw == WNI_CFG_VHT_CHANNEL_WIDTH_80_PLUS_80MHZ)
1486 return CH_WIDTH_80P80MHZ;
1487 else if (max_bw == WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ)
1488 return CH_WIDTH_80MHZ;
1489 else
1490 return CH_WIDTH_40MHZ;
1491 }
1492 #else
wlan_mlme_get_max_bw(void)1493 enum phy_ch_width wlan_mlme_get_max_bw(void)
1494 {
1495 uint32_t max_bw = wma_get_vht_ch_width();
1496
1497 if (max_bw == WNI_CFG_VHT_CHANNEL_WIDTH_160MHZ)
1498 return CH_WIDTH_160MHZ;
1499 else if (max_bw == WNI_CFG_VHT_CHANNEL_WIDTH_80_PLUS_80MHZ)
1500 return CH_WIDTH_80P80MHZ;
1501 else if (max_bw == WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ)
1502 return CH_WIDTH_80MHZ;
1503 else
1504 return CH_WIDTH_40MHZ;
1505 }
1506 #endif
1507
wlan_mlme_get_sta_ch_width(struct wlan_objmgr_vdev * vdev,enum phy_ch_width * ch_width)1508 QDF_STATUS wlan_mlme_get_sta_ch_width(struct wlan_objmgr_vdev *vdev,
1509 enum phy_ch_width *ch_width)
1510 {
1511 QDF_STATUS status = QDF_STATUS_E_INVAL;
1512 struct wlan_objmgr_peer *peer;
1513 enum wlan_phymode phymode;
1514 enum QDF_OPMODE op_mode;
1515
1516 peer = wlan_vdev_get_bsspeer(vdev);
1517 op_mode = wlan_vdev_mlme_get_opmode(vdev);
1518
1519 if (ch_width && peer &&
1520 (op_mode == QDF_STA_MODE ||
1521 op_mode == QDF_P2P_CLIENT_MODE)) {
1522 wlan_peer_obj_lock(peer);
1523 phymode = wlan_peer_get_phymode(peer);
1524 wlan_peer_obj_unlock(peer);
1525 *ch_width = wlan_mlme_get_ch_width_from_phymode(phymode);
1526 status = QDF_STATUS_SUCCESS;
1527 }
1528
1529 return status;
1530 }
1531
1532 void
wlan_mlme_set_bt_profile_con(struct wlan_objmgr_psoc * psoc,bool bt_profile_con)1533 wlan_mlme_set_bt_profile_con(struct wlan_objmgr_psoc *psoc,
1534 bool bt_profile_con)
1535 {
1536 struct wlan_mlme_psoc_ext_obj *mlme_obj;
1537
1538 mlme_obj = mlme_get_psoc_ext_obj(psoc);
1539 if (!mlme_obj)
1540 return;
1541
1542 mlme_obj->cfg.gen.bt_profile_con = bt_profile_con;
1543 }
1544
1545 bool
wlan_mlme_get_bt_profile_con(struct wlan_objmgr_psoc * psoc)1546 wlan_mlme_get_bt_profile_con(struct wlan_objmgr_psoc *psoc)
1547 {
1548 struct wlan_mlme_psoc_ext_obj *mlme_obj;
1549
1550 mlme_obj = mlme_get_psoc_ext_obj(psoc);
1551 if (!mlme_obj)
1552 return false;
1553
1554 return mlme_obj->cfg.gen.bt_profile_con;
1555 }
1556
1557 #ifdef WLAN_FEATURE_11BE_MLO
wlan_mlme_get_sta_mlo_simultaneous_links(struct wlan_objmgr_psoc * psoc)1558 uint8_t wlan_mlme_get_sta_mlo_simultaneous_links(struct wlan_objmgr_psoc *psoc)
1559 {
1560 struct wlan_mlme_psoc_ext_obj *mlme_obj;
1561
1562 mlme_obj = mlme_get_psoc_ext_obj(psoc);
1563 if (!mlme_obj)
1564 return 0;
1565
1566 return mlme_obj->cfg.sta.mlo_max_simultaneous_links;
1567 }
1568
1569 QDF_STATUS
wlan_mlme_set_sta_mlo_simultaneous_links(struct wlan_objmgr_psoc * psoc,uint8_t value)1570 wlan_mlme_set_sta_mlo_simultaneous_links(struct wlan_objmgr_psoc *psoc,
1571 uint8_t value)
1572 {
1573 struct wlan_mlme_psoc_ext_obj *mlme_obj;
1574
1575 mlme_obj = mlme_get_psoc_ext_obj(psoc);
1576 if (!mlme_obj)
1577 return QDF_STATUS_E_FAILURE;
1578
1579 mlme_obj->cfg.sta.mlo_max_simultaneous_links = value;
1580 mlme_legacy_debug("mlo_max_simultaneous_links %d", value);
1581
1582 return QDF_STATUS_SUCCESS;
1583 }
1584
wlan_mlme_get_sta_mlo_conn_max_num(struct wlan_objmgr_psoc * psoc)1585 uint8_t wlan_mlme_get_sta_mlo_conn_max_num(struct wlan_objmgr_psoc *psoc)
1586 {
1587 struct wlan_mlme_psoc_ext_obj *mlme_obj;
1588
1589 mlme_obj = mlme_get_psoc_ext_obj(psoc);
1590 if (!mlme_obj)
1591 return 0;
1592
1593 return mlme_obj->cfg.sta.mlo_support_link_num;
1594 }
1595
wlan_mlme_set_sta_mlo_conn_max_num(struct wlan_objmgr_psoc * psoc,uint8_t value)1596 QDF_STATUS wlan_mlme_set_sta_mlo_conn_max_num(struct wlan_objmgr_psoc *psoc,
1597 uint8_t value)
1598 {
1599 struct wlan_mlme_psoc_ext_obj *mlme_obj;
1600 struct target_psoc_info *tgt_hdl;
1601
1602 mlme_obj = mlme_get_psoc_ext_obj(psoc);
1603 if (!mlme_obj)
1604 return QDF_STATUS_E_FAILURE;
1605
1606 tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
1607 if (!tgt_hdl) {
1608 mlme_err("target psoc info is NULL");
1609 return QDF_STATUS_E_FAILURE;
1610 }
1611
1612 if (!value)
1613 mlme_obj->cfg.sta.mlo_support_link_num =
1614 target_if_res_cfg_get_num_max_mlo_link(tgt_hdl);
1615 else
1616 mlme_obj->cfg.sta.mlo_support_link_num = value;
1617
1618 mlme_legacy_debug("mlo_support_link_num user input %d intersected value :%d",
1619 value, mlme_obj->cfg.sta.mlo_support_link_num);
1620
1621 return QDF_STATUS_SUCCESS;
1622 }
1623
wlan_mlme_set_user_set_link_num(struct wlan_objmgr_psoc * psoc,uint8_t value)1624 QDF_STATUS wlan_mlme_set_user_set_link_num(struct wlan_objmgr_psoc *psoc,
1625 uint8_t value)
1626 {
1627 struct wlan_mlme_psoc_ext_obj *mlme_obj;
1628
1629 mlme_obj = mlme_get_psoc_ext_obj(psoc);
1630 if (!mlme_obj)
1631 return QDF_STATUS_E_FAILURE;
1632
1633 mlme_obj->cfg.sta.user_set_link_num = value;
1634 mlme_legacy_debug("user_set_link_num %d", value);
1635
1636 return QDF_STATUS_SUCCESS;
1637 }
1638
wlan_mlme_set_ml_link_control_mode(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,uint8_t value)1639 void wlan_mlme_set_ml_link_control_mode(struct wlan_objmgr_psoc *psoc,
1640 uint8_t vdev_id, uint8_t value)
1641 {
1642 struct wlan_mlme_psoc_ext_obj *mlme_obj;
1643 struct wlan_objmgr_vdev *vdev;
1644
1645 mlme_obj = mlme_get_psoc_ext_obj(psoc);
1646 if (!mlme_obj)
1647 return;
1648
1649 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
1650 WLAN_MLME_SB_ID);
1651 if (!vdev)
1652 return;
1653
1654 if (!wlan_vdev_mlme_is_mlo_vdev(vdev)) {
1655 mlme_legacy_debug("not mlo vdev");
1656 goto release_ref;
1657 }
1658
1659 if (!vdev->mlo_dev_ctx || !vdev->mlo_dev_ctx->sta_ctx) {
1660 mlme_legacy_debug("mlo dev/sta ctx is null");
1661 goto release_ref;
1662 }
1663
1664 vdev->mlo_dev_ctx->sta_ctx->ml_link_control_mode = value;
1665 mlme_legacy_debug("set ml_link_control_mode %d", value);
1666
1667 release_ref:
1668 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_SB_ID);
1669 return;
1670 }
1671
wlan_mlme_get_ml_link_control_mode(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id)1672 uint8_t wlan_mlme_get_ml_link_control_mode(struct wlan_objmgr_psoc *psoc,
1673 uint8_t vdev_id)
1674 {
1675 struct wlan_mlme_psoc_ext_obj *mlme_obj;
1676 struct wlan_objmgr_vdev *vdev;
1677 uint8_t value = 0;
1678
1679 mlme_obj = mlme_get_psoc_ext_obj(psoc);
1680 if (!mlme_obj)
1681 return 0;
1682
1683 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
1684 WLAN_MLME_SB_ID);
1685 if (!vdev)
1686 return 0;
1687
1688 if (!wlan_vdev_mlme_is_mlo_vdev(vdev)) {
1689 mlme_legacy_debug("not mlo vdev");
1690 goto release_ref;
1691 }
1692
1693 if (!vdev->mlo_dev_ctx || !vdev->mlo_dev_ctx->sta_ctx) {
1694 mlme_legacy_debug("mlo dev/sta ctx is null");
1695 goto release_ref;
1696 }
1697
1698 value = vdev->mlo_dev_ctx->sta_ctx->ml_link_control_mode;
1699 mlme_legacy_debug("get ml_link_control_mode %d", value);
1700 release_ref:
1701 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_SB_ID);
1702 return value;
1703 }
1704
wlan_mlme_restore_user_set_link_num(struct wlan_objmgr_psoc * psoc)1705 void wlan_mlme_restore_user_set_link_num(struct wlan_objmgr_psoc *psoc)
1706 {
1707 struct wlan_mlme_psoc_ext_obj *mlme_obj;
1708
1709 mlme_obj = mlme_get_psoc_ext_obj(psoc);
1710 if (!mlme_obj)
1711 return;
1712
1713 if (!mlme_obj->cfg.sta.user_set_link_num)
1714 return;
1715
1716 mlme_obj->cfg.sta.mlo_support_link_num =
1717 mlme_obj->cfg.sta.user_set_link_num;
1718 mlme_legacy_debug("restore mlo_support_link_num %d",
1719 mlme_obj->cfg.sta.user_set_link_num);
1720 }
1721
wlan_mlme_clear_user_set_link_num(struct wlan_objmgr_psoc * psoc)1722 void wlan_mlme_clear_user_set_link_num(struct wlan_objmgr_psoc *psoc)
1723 {
1724 struct wlan_mlme_psoc_ext_obj *mlme_obj;
1725
1726 mlme_obj = mlme_get_psoc_ext_obj(psoc);
1727 if (!mlme_obj)
1728 return;
1729
1730 mlme_obj->cfg.sta.user_set_link_num = 0;
1731 }
1732
wlan_mlme_get_sta_mlo_conn_band_bmp(struct wlan_objmgr_psoc * psoc)1733 uint8_t wlan_mlme_get_sta_mlo_conn_band_bmp(struct wlan_objmgr_psoc *psoc)
1734 {
1735 struct wlan_mlme_psoc_ext_obj *mlme_obj;
1736
1737 mlme_obj = mlme_get_psoc_ext_obj(psoc);
1738 if (!mlme_obj)
1739 return 0;
1740
1741 return mlme_obj->cfg.sta.mlo_support_link_band;
1742 }
1743
wlan_mlme_set_sta_mlo_conn_band_bmp(struct wlan_objmgr_psoc * psoc,uint8_t value)1744 QDF_STATUS wlan_mlme_set_sta_mlo_conn_band_bmp(struct wlan_objmgr_psoc *psoc,
1745 uint8_t value)
1746 {
1747 struct wlan_mlme_psoc_ext_obj *mlme_obj;
1748
1749 mlme_obj = mlme_get_psoc_ext_obj(psoc);
1750 if (!mlme_obj)
1751 return QDF_STATUS_E_FAILURE;
1752
1753 mlme_obj->cfg.sta.mlo_support_link_band = value;
1754 mlme_legacy_debug("mlo_support_link_conn band %d", value);
1755
1756 return QDF_STATUS_SUCCESS;
1757 }
1758
wlan_mlme_is_5gl_5gh_mlsr_supported(struct wlan_objmgr_psoc * psoc)1759 bool wlan_mlme_is_5gl_5gh_mlsr_supported(struct wlan_objmgr_psoc *psoc)
1760 {
1761 struct wlan_mlme_psoc_ext_obj *mlme_obj;
1762
1763 mlme_obj = mlme_get_psoc_ext_obj(psoc);
1764 if (!mlme_obj)
1765 return 0;
1766 return mlme_obj->cfg.sta.mlo_5gl_5gh_mlsr;
1767 }
1768
1769 void
wlan_mlme_get_mlo_prefer_percentage(struct wlan_objmgr_psoc * psoc,int8_t * mlo_prefer_percentage)1770 wlan_mlme_get_mlo_prefer_percentage(struct wlan_objmgr_psoc *psoc,
1771 int8_t *mlo_prefer_percentage)
1772 {
1773 struct wlan_mlme_psoc_ext_obj *mlme_obj;
1774
1775 mlme_obj = mlme_get_psoc_ext_obj(psoc);
1776 if (!mlme_obj) {
1777 mlme_legacy_err("invalid mlo object");
1778 return;
1779 }
1780
1781 *mlo_prefer_percentage = mlme_obj->cfg.sta.mlo_prefer_percentage;
1782 mlme_legacy_debug("mlo_prefer_percentage %d", *mlo_prefer_percentage);
1783 }
1784
wlan_mlme_get_sta_same_link_mld_addr(struct wlan_objmgr_psoc * psoc)1785 bool wlan_mlme_get_sta_same_link_mld_addr(struct wlan_objmgr_psoc *psoc)
1786 {
1787 struct wlan_mlme_psoc_ext_obj *mlme_obj;
1788
1789 mlme_obj = mlme_get_psoc_ext_obj(psoc);
1790 if (!mlme_obj)
1791 return false;
1792
1793 return mlme_obj->cfg.sta.mlo_same_link_mld_address;
1794 }
1795 #endif
1796
wlan_mlme_get_num_11b_tx_chains(struct wlan_objmgr_psoc * psoc,uint16_t * value)1797 QDF_STATUS wlan_mlme_get_num_11b_tx_chains(struct wlan_objmgr_psoc *psoc,
1798 uint16_t *value)
1799 {
1800 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
1801
1802 if (!mlme_obj)
1803 return QDF_STATUS_E_FAILURE;
1804
1805 *value = mlme_obj->cfg.chainmask_cfg.num_11b_tx_chains;
1806 return QDF_STATUS_SUCCESS;
1807 }
1808
wlan_mlme_get_bt_chain_separation_flag(struct wlan_objmgr_psoc * psoc,bool * value)1809 QDF_STATUS wlan_mlme_get_bt_chain_separation_flag(struct wlan_objmgr_psoc *psoc,
1810 bool *value)
1811 {
1812 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
1813
1814 if (!mlme_obj)
1815 return QDF_STATUS_E_FAILURE;
1816
1817 *value = mlme_obj->cfg.chainmask_cfg.enable_bt_chain_separation;
1818 return QDF_STATUS_SUCCESS;
1819 }
1820
wlan_mlme_get_num_11ag_tx_chains(struct wlan_objmgr_psoc * psoc,uint16_t * value)1821 QDF_STATUS wlan_mlme_get_num_11ag_tx_chains(struct wlan_objmgr_psoc *psoc,
1822 uint16_t *value)
1823 {
1824 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
1825
1826 if (!mlme_obj)
1827 return QDF_STATUS_E_FAILURE;
1828
1829 *value = mlme_obj->cfg.chainmask_cfg.num_11ag_tx_chains;
1830 return QDF_STATUS_SUCCESS;
1831 }
1832
1833
1834 static
wlan_mlme_configure_chain_mask_supported(struct wlan_objmgr_psoc * psoc)1835 bool wlan_mlme_configure_chain_mask_supported(struct wlan_objmgr_psoc *psoc)
1836 {
1837 struct wma_caps_per_phy non_dbs_phy_cap = {0};
1838 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
1839 QDF_STATUS status;
1840 bool as_enabled, enable_bt_chain_sep, enable2x2;
1841 uint8_t dual_mac_feature;
1842 bool hw_dbs_2x2_cap;
1843
1844 if (!mlme_obj)
1845 return false;
1846
1847 status = wma_get_caps_for_phyidx_hwmode(&non_dbs_phy_cap,
1848 HW_MODE_DBS_NONE,
1849 CDS_BAND_ALL);
1850 if (QDF_IS_STATUS_ERROR(status)) {
1851 mlme_legacy_err("couldn't get phy caps. skip chain mask programming");
1852 return false;
1853 }
1854
1855 if (non_dbs_phy_cap.tx_chain_mask_2G < 3 ||
1856 non_dbs_phy_cap.rx_chain_mask_2G < 3 ||
1857 non_dbs_phy_cap.tx_chain_mask_5G < 3 ||
1858 non_dbs_phy_cap.rx_chain_mask_5G < 3) {
1859 mlme_legacy_debug("firmware not capable. skip chain mask programming");
1860 return false;
1861 }
1862
1863 enable_bt_chain_sep =
1864 mlme_obj->cfg.chainmask_cfg.enable_bt_chain_separation;
1865 as_enabled = mlme_obj->cfg.gen.as_enabled;
1866 ucfg_policy_mgr_get_dual_mac_feature(psoc, &dual_mac_feature);
1867
1868 hw_dbs_2x2_cap = policy_mgr_is_hw_dbs_2x2_capable(psoc);
1869 enable2x2 = mlme_obj->cfg.vht_caps.vht_cap_info.enable2x2;
1870
1871 if ((enable2x2 && !enable_bt_chain_sep) || as_enabled ||
1872 (!hw_dbs_2x2_cap && (dual_mac_feature != DISABLE_DBS_CXN_AND_SCAN) &&
1873 enable2x2)) {
1874 mlme_legacy_debug("Cannot configure chainmask enable_bt_chain_sep %d as_enabled %d enable2x2 %d hw_dbs_2x2_cap %d dual_mac_feature %d",
1875 enable_bt_chain_sep, as_enabled, enable2x2,
1876 hw_dbs_2x2_cap, dual_mac_feature);
1877 return false;
1878 }
1879
1880 return true;
1881 }
1882
wlan_mlme_is_chain_mask_supported(struct wlan_objmgr_psoc * psoc)1883 bool wlan_mlme_is_chain_mask_supported(struct wlan_objmgr_psoc *psoc)
1884
1885 {
1886 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
1887
1888 if (!mlme_obj)
1889 return false;
1890
1891 if (!wlan_mlme_configure_chain_mask_supported(psoc))
1892 return false;
1893
1894 /* If user has configured 1x1 from INI */
1895 if (mlme_obj->cfg.chainmask_cfg.txchainmask1x1 != 3 ||
1896 mlme_obj->cfg.chainmask_cfg.rxchainmask1x1 != 3) {
1897 mlme_legacy_debug("txchainmask1x1 %d rxchainmask1x1 %d",
1898 mlme_obj->cfg.chainmask_cfg.txchainmask1x1,
1899 mlme_obj->cfg.chainmask_cfg.rxchainmask1x1);
1900 return false;
1901 }
1902
1903 return true;
1904
1905 }
1906
1907 #define MAX_PDEV_CHAIN_MASK_PARAMS 6
1908 /* params being sent:
1909 * wmi_pdev_param_tx_chain_mask
1910 * wmi_pdev_param_rx_chain_mask
1911 * wmi_pdev_param_tx_chain_mask_2g
1912 * wmi_pdev_param_rx_chain_mask_2g
1913 * wmi_pdev_param_tx_chain_mask_5g
1914 * wmi_pdev_param_rx_chain_mask_5g
1915 */
wlan_mlme_configure_chain_mask(struct wlan_objmgr_psoc * psoc,uint8_t session_id)1916 QDF_STATUS wlan_mlme_configure_chain_mask(struct wlan_objmgr_psoc *psoc,
1917 uint8_t session_id)
1918 {
1919 QDF_STATUS ret_val = QDF_STATUS_E_FAILURE;
1920 uint8_t ch_msk_val;
1921 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
1922 bool mrc_disabled_2g_rx, mrc_disabled_2g_tx;
1923 bool mrc_disabled_5g_rx, mrc_disabled_5g_tx;
1924 struct dev_set_param setparam[MAX_PDEV_CHAIN_MASK_PARAMS];
1925 uint8_t index = 0;
1926
1927 if (!mlme_obj)
1928 return QDF_STATUS_E_FAILURE;
1929
1930 mlme_legacy_debug("txchainmask1x1: %d rxchainmask1x1: %d",
1931 mlme_obj->cfg.chainmask_cfg.txchainmask1x1,
1932 mlme_obj->cfg.chainmask_cfg.rxchainmask1x1);
1933 mlme_legacy_debug("tx_chain_mask_2g: %d, rx_chain_mask_2g: %d",
1934 mlme_obj->cfg.chainmask_cfg.tx_chain_mask_2g,
1935 mlme_obj->cfg.chainmask_cfg.rx_chain_mask_2g);
1936 mlme_legacy_debug("tx_chain_mask_5g: %d, rx_chain_mask_5g: %d",
1937 mlme_obj->cfg.chainmask_cfg.tx_chain_mask_5g,
1938 mlme_obj->cfg.chainmask_cfg.rx_chain_mask_5g);
1939
1940 mrc_disabled_2g_rx =
1941 mlme_obj->cfg.nss_chains_ini_cfg.disable_rx_mrc[NSS_CHAINS_BAND_2GHZ];
1942 mrc_disabled_2g_tx =
1943 mlme_obj->cfg.nss_chains_ini_cfg.disable_tx_mrc[NSS_CHAINS_BAND_2GHZ];
1944 mrc_disabled_5g_rx =
1945 mlme_obj->cfg.nss_chains_ini_cfg.disable_rx_mrc[NSS_CHAINS_BAND_5GHZ];
1946 mrc_disabled_5g_tx =
1947 mlme_obj->cfg.nss_chains_ini_cfg.disable_tx_mrc[NSS_CHAINS_BAND_5GHZ];
1948
1949 mlme_legacy_debug("MRC values TX:- 2g %d 5g %d RX:- 2g %d 5g %d",
1950 mrc_disabled_2g_tx, mrc_disabled_5g_tx,
1951 mrc_disabled_2g_rx, mrc_disabled_5g_rx);
1952
1953 if (!wlan_mlme_configure_chain_mask_supported(psoc))
1954 return QDF_STATUS_E_FAILURE;
1955
1956 if (mlme_obj->cfg.chainmask_cfg.txchainmask1x1) {
1957 ch_msk_val = mlme_obj->cfg.chainmask_cfg.txchainmask1x1;
1958 if (wma_validate_txrx_chain_mask(wmi_pdev_param_tx_chain_mask,
1959 ch_msk_val)) {
1960 goto error;
1961 }
1962 ret_val = mlme_check_index_setparam(
1963 setparam,
1964 wmi_pdev_param_tx_chain_mask,
1965 ch_msk_val, index++,
1966 MAX_PDEV_CHAIN_MASK_PARAMS);
1967 if (QDF_IS_STATUS_ERROR(ret_val)) {
1968 mlme_err("failed at wmi_pdev_param_tx_chain_mask");
1969 goto error;
1970 }
1971 }
1972
1973 if (mlme_obj->cfg.chainmask_cfg.rxchainmask1x1) {
1974 ch_msk_val = mlme_obj->cfg.chainmask_cfg.rxchainmask1x1;
1975 if (wma_validate_txrx_chain_mask(wmi_pdev_param_rx_chain_mask,
1976 ch_msk_val)) {
1977 goto error;
1978 }
1979 ret_val = mlme_check_index_setparam(
1980 setparam,
1981 wmi_pdev_param_rx_chain_mask,
1982 ch_msk_val, index++,
1983 MAX_PDEV_CHAIN_MASK_PARAMS);
1984 if (QDF_IS_STATUS_ERROR(ret_val)) {
1985 mlme_err("failed at wmi_pdev_param_rx_chain_mask");
1986 goto error;
1987 }
1988 }
1989
1990 if (mlme_obj->cfg.chainmask_cfg.txchainmask1x1 ||
1991 mlme_obj->cfg.chainmask_cfg.rxchainmask1x1) {
1992 mlme_legacy_debug("band agnostic tx/rx chain mask set. skip per band chain mask");
1993 goto sendparam;
1994 }
1995
1996 if (mlme_obj->cfg.chainmask_cfg.tx_chain_mask_2g &&
1997 mrc_disabled_2g_tx) {
1998 ch_msk_val = mlme_obj->cfg.chainmask_cfg.tx_chain_mask_2g;
1999 ret_val = mlme_check_index_setparam(
2000 setparam,
2001 wmi_pdev_param_tx_chain_mask_2g,
2002 ch_msk_val, index++,
2003 MAX_PDEV_CHAIN_MASK_PARAMS);
2004 if (QDF_IS_STATUS_ERROR(ret_val)) {
2005 mlme_err("failed at wmi_pdev_param_tx_chain_mask_2g");
2006 goto error;
2007 }
2008 }
2009
2010 if (mlme_obj->cfg.chainmask_cfg.rx_chain_mask_2g &&
2011 mrc_disabled_2g_rx) {
2012 ch_msk_val = mlme_obj->cfg.chainmask_cfg.rx_chain_mask_2g;
2013 ret_val = mlme_check_index_setparam(
2014 setparam,
2015 wmi_pdev_param_rx_chain_mask_2g,
2016 ch_msk_val, index++,
2017 MAX_PDEV_CHAIN_MASK_PARAMS);
2018 if (QDF_IS_STATUS_ERROR(ret_val)) {
2019 mlme_err("failed at wmi_pdev_param_rx_chain_mask_2g");
2020 goto error;
2021 }
2022 }
2023
2024 if (mlme_obj->cfg.chainmask_cfg.tx_chain_mask_5g &&
2025 mrc_disabled_5g_tx) {
2026 ch_msk_val = mlme_obj->cfg.chainmask_cfg.tx_chain_mask_5g;
2027 ret_val = mlme_check_index_setparam(
2028 setparam,
2029 wmi_pdev_param_tx_chain_mask_5g,
2030 ch_msk_val, index++,
2031 MAX_PDEV_CHAIN_MASK_PARAMS);
2032 if (QDF_IS_STATUS_ERROR(ret_val)) {
2033 mlme_err("failed at wmi_pdev_param_tx_chain_mask_5g");
2034 goto error;
2035 }
2036 }
2037
2038 if (mlme_obj->cfg.chainmask_cfg.rx_chain_mask_5g &&
2039 mrc_disabled_5g_rx) {
2040 ch_msk_val = mlme_obj->cfg.chainmask_cfg.rx_chain_mask_5g;
2041 ret_val = mlme_check_index_setparam(
2042 setparam,
2043 wmi_pdev_param_rx_chain_mask_5g,
2044 ch_msk_val, index++,
2045 MAX_PDEV_CHAIN_MASK_PARAMS);
2046 if (QDF_IS_STATUS_ERROR(ret_val)) {
2047 mlme_err("failed at wmi_pdev_param_rx_chain_mask_5g");
2048 goto error;
2049 }
2050 }
2051 sendparam:
2052 ret_val = wma_send_multi_pdev_vdev_set_params(MLME_PDEV_SETPARAM,
2053 WMI_PDEV_ID_SOC, setparam,
2054 index);
2055 if (QDF_IS_STATUS_ERROR(ret_val))
2056 mlme_err("failed to send chainmask params");
2057 error:
2058 return ret_val;
2059 }
2060
2061 QDF_STATUS
wlan_mlme_get_manufacturer_name(struct wlan_objmgr_psoc * psoc,uint8_t * pbuf,uint32_t * plen)2062 wlan_mlme_get_manufacturer_name(struct wlan_objmgr_psoc *psoc,
2063 uint8_t *pbuf, uint32_t *plen)
2064 {
2065 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2066
2067 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2068 if (!mlme_obj)
2069 return QDF_STATUS_E_FAILURE;
2070
2071 *plen = qdf_str_lcopy(pbuf,
2072 mlme_obj->cfg.product_details.manufacturer_name,
2073 *plen);
2074 return QDF_STATUS_SUCCESS;
2075 }
2076
2077 QDF_STATUS
wlan_mlme_get_model_number(struct wlan_objmgr_psoc * psoc,uint8_t * pbuf,uint32_t * plen)2078 wlan_mlme_get_model_number(struct wlan_objmgr_psoc *psoc,
2079 uint8_t *pbuf, uint32_t *plen)
2080 {
2081 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2082
2083 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2084 if (!mlme_obj)
2085 return QDF_STATUS_E_FAILURE;
2086
2087 *plen = qdf_str_lcopy(pbuf,
2088 mlme_obj->cfg.product_details.model_number,
2089 *plen);
2090
2091 return QDF_STATUS_SUCCESS;
2092 }
2093
2094 QDF_STATUS
wlan_mlme_get_model_name(struct wlan_objmgr_psoc * psoc,uint8_t * pbuf,uint32_t * plen)2095 wlan_mlme_get_model_name(struct wlan_objmgr_psoc *psoc,
2096 uint8_t *pbuf, uint32_t *plen)
2097 {
2098 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2099
2100 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2101 if (!mlme_obj)
2102 return QDF_STATUS_E_FAILURE;
2103
2104 *plen = qdf_str_lcopy(pbuf,
2105 mlme_obj->cfg.product_details.model_name,
2106 *plen);
2107 return QDF_STATUS_SUCCESS;
2108 }
2109
2110 QDF_STATUS
wlan_mlme_get_manufacture_product_version(struct wlan_objmgr_psoc * psoc,uint8_t * pbuf,uint32_t * plen)2111 wlan_mlme_get_manufacture_product_version(struct wlan_objmgr_psoc *psoc,
2112 uint8_t *pbuf, uint32_t *plen)
2113 {
2114 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2115
2116 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2117 if (!mlme_obj)
2118 return QDF_STATUS_E_FAILURE;
2119
2120 *plen = qdf_str_lcopy(pbuf,
2121 mlme_obj->cfg.product_details.manufacture_product_version,
2122 *plen);
2123 return QDF_STATUS_SUCCESS;
2124 }
2125
2126 QDF_STATUS
wlan_mlme_get_manufacture_product_name(struct wlan_objmgr_psoc * psoc,uint8_t * pbuf,uint32_t * plen)2127 wlan_mlme_get_manufacture_product_name(struct wlan_objmgr_psoc *psoc,
2128 uint8_t *pbuf, uint32_t *plen)
2129 {
2130 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2131
2132 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2133 if (!mlme_obj)
2134 return QDF_STATUS_E_FAILURE;
2135
2136 *plen = qdf_str_lcopy(pbuf,
2137 mlme_obj->cfg.product_details.manufacture_product_name,
2138 *plen);
2139 return QDF_STATUS_SUCCESS;
2140 }
2141
2142
wlan_mlme_get_tl_delayed_trgr_frm_int(struct wlan_objmgr_psoc * psoc,uint32_t * value)2143 void wlan_mlme_get_tl_delayed_trgr_frm_int(struct wlan_objmgr_psoc *psoc,
2144 uint32_t *value)
2145 {
2146 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2147
2148 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2149 if (!mlme_obj) {
2150 *value = cfg_default(CFG_TL_DELAYED_TRGR_FRM_INTERVAL);
2151 return;
2152 }
2153
2154 *value = mlme_obj->cfg.wmm_params.delayed_trigger_frm_int;
2155 }
2156
2157
wlan_mlme_get_wmm_dir_ac_vo(struct wlan_objmgr_psoc * psoc,uint8_t * value)2158 QDF_STATUS wlan_mlme_get_wmm_dir_ac_vo(struct wlan_objmgr_psoc *psoc,
2159 uint8_t *value)
2160 {
2161 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2162
2163 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2164 if (!mlme_obj)
2165 return QDF_STATUS_E_FAILURE;
2166
2167 *value = mlme_obj->cfg.wmm_params.ac_vo.dir_ac_vo;
2168
2169 return QDF_STATUS_SUCCESS;
2170 }
2171
2172
wlan_mlme_get_wmm_nom_msdu_size_ac_vo(struct wlan_objmgr_psoc * psoc,uint16_t * value)2173 QDF_STATUS wlan_mlme_get_wmm_nom_msdu_size_ac_vo(struct wlan_objmgr_psoc *psoc,
2174 uint16_t *value)
2175 {
2176 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2177
2178 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2179 if (!mlme_obj)
2180 return QDF_STATUS_E_FAILURE;
2181
2182 *value = mlme_obj->cfg.wmm_params.ac_vo.nom_msdu_size_ac_vo;
2183 return QDF_STATUS_SUCCESS;
2184 }
2185
2186 QDF_STATUS
wlan_mlme_get_wmm_mean_data_rate_ac_vo(struct wlan_objmgr_psoc * psoc,uint32_t * value)2187 wlan_mlme_get_wmm_mean_data_rate_ac_vo(struct wlan_objmgr_psoc *psoc,
2188 uint32_t *value)
2189 {
2190 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2191
2192 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2193 if (!mlme_obj)
2194 return QDF_STATUS_E_FAILURE;
2195
2196 *value = mlme_obj->cfg.wmm_params.ac_vo.mean_data_rate_ac_vo;
2197
2198 return QDF_STATUS_SUCCESS;
2199 }
2200
wlan_mlme_get_wmm_min_phy_rate_ac_vo(struct wlan_objmgr_psoc * psoc,uint32_t * value)2201 QDF_STATUS wlan_mlme_get_wmm_min_phy_rate_ac_vo(struct wlan_objmgr_psoc *psoc,
2202 uint32_t *value)
2203 {
2204 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2205
2206 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2207 if (!mlme_obj)
2208 return QDF_STATUS_E_FAILURE;
2209
2210 *value = mlme_obj->cfg.wmm_params.ac_vo.min_phy_rate_ac_vo;
2211 return QDF_STATUS_SUCCESS;
2212 }
2213
2214 QDF_STATUS
wlan_mlme_get_wmm_sba_ac_vo(struct wlan_objmgr_psoc * psoc,uint16_t * value)2215 wlan_mlme_get_wmm_sba_ac_vo(struct wlan_objmgr_psoc *psoc, uint16_t *value)
2216 {
2217 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2218
2219 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2220 if (!mlme_obj) {
2221 return QDF_STATUS_E_FAILURE;
2222 }
2223
2224 *value = mlme_obj->cfg.wmm_params.ac_vo.sba_ac_vo;
2225
2226 return QDF_STATUS_SUCCESS;
2227 }
2228
wlan_mlme_get_wmm_uapsd_vo_srv_intv(struct wlan_objmgr_psoc * psoc,uint32_t * value)2229 QDF_STATUS wlan_mlme_get_wmm_uapsd_vo_srv_intv(struct wlan_objmgr_psoc *psoc,
2230 uint32_t *value)
2231 {
2232 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2233
2234 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2235 if (!mlme_obj)
2236 return QDF_STATUS_E_FAILURE;
2237
2238 *value = mlme_obj->cfg.wmm_params.ac_vo.uapsd_vo_srv_intv;
2239
2240 return QDF_STATUS_SUCCESS;
2241 }
2242
wlan_mlme_get_wmm_uapsd_vo_sus_intv(struct wlan_objmgr_psoc * psoc,uint32_t * value)2243 QDF_STATUS wlan_mlme_get_wmm_uapsd_vo_sus_intv(struct wlan_objmgr_psoc *psoc,
2244 uint32_t *value)
2245 {
2246 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2247
2248 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2249 if (!mlme_obj)
2250 return QDF_STATUS_E_FAILURE;
2251
2252 *value = mlme_obj->cfg.wmm_params.ac_vo.uapsd_vo_sus_intv;
2253
2254 return QDF_STATUS_SUCCESS;
2255 }
2256
wlan_mlme_cfg_get_vht_ampdu_len_exp(struct wlan_objmgr_psoc * psoc,uint8_t * value)2257 QDF_STATUS wlan_mlme_cfg_get_vht_ampdu_len_exp(struct wlan_objmgr_psoc *psoc,
2258 uint8_t *value)
2259 {
2260 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2261
2262 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2263 if (!mlme_obj)
2264 return QDF_STATUS_E_FAILURE;
2265
2266 *value = mlme_obj->cfg.vht_caps.vht_cap_info.ampdu_len_exponent;
2267
2268 return QDF_STATUS_SUCCESS;
2269 }
2270
wlan_mlme_cfg_get_vht_max_mpdu_len(struct wlan_objmgr_psoc * psoc,uint8_t * value)2271 QDF_STATUS wlan_mlme_cfg_get_vht_max_mpdu_len(struct wlan_objmgr_psoc *psoc,
2272 uint8_t *value)
2273 {
2274 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2275
2276 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2277 if (!mlme_obj)
2278 return QDF_STATUS_E_FAILURE;
2279
2280 *value = mlme_obj->cfg.vht_caps.vht_cap_info.ampdu_len;
2281
2282 return QDF_STATUS_SUCCESS;
2283 }
2284
wlan_mlme_cfg_get_ht_smps(struct wlan_objmgr_psoc * psoc,uint8_t * value)2285 QDF_STATUS wlan_mlme_cfg_get_ht_smps(struct wlan_objmgr_psoc *psoc,
2286 uint8_t *value)
2287 {
2288 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2289
2290 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2291 if (!mlme_obj)
2292 return QDF_STATUS_E_FAILURE;
2293
2294 *value = mlme_obj->cfg.ht_caps.smps;
2295
2296 return QDF_STATUS_SUCCESS;
2297 }
2298
2299 QDF_STATUS
wlan_mlme_get_wmm_dir_ac_vi(struct wlan_objmgr_psoc * psoc,uint8_t * value)2300 wlan_mlme_get_wmm_dir_ac_vi(struct wlan_objmgr_psoc *psoc, uint8_t *value)
2301 {
2302 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2303
2304 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2305 if (!mlme_obj)
2306 return QDF_STATUS_E_FAILURE;
2307
2308 *value = mlme_obj->cfg.wmm_params.ac_vi.dir_ac_vi;
2309
2310 return QDF_STATUS_SUCCESS;
2311 }
2312
wlan_mlme_get_wmm_nom_msdu_size_ac_vi(struct wlan_objmgr_psoc * psoc,uint16_t * value)2313 QDF_STATUS wlan_mlme_get_wmm_nom_msdu_size_ac_vi(struct wlan_objmgr_psoc *psoc,
2314 uint16_t *value)
2315 {
2316 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2317
2318 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2319 if (!mlme_obj)
2320 return QDF_STATUS_E_FAILURE;
2321
2322 *value =
2323 mlme_obj->cfg.wmm_params.ac_vi.nom_msdu_size_ac_vi;
2324
2325 return QDF_STATUS_SUCCESS;
2326 }
2327
2328 QDF_STATUS
wlan_mlme_get_wmm_mean_data_rate_ac_vi(struct wlan_objmgr_psoc * psoc,uint32_t * value)2329 wlan_mlme_get_wmm_mean_data_rate_ac_vi(struct wlan_objmgr_psoc *psoc,
2330 uint32_t *value)
2331 {
2332 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2333
2334 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2335 if (!mlme_obj)
2336 return QDF_STATUS_E_FAILURE;
2337
2338 *value = mlme_obj->cfg.wmm_params.ac_vi.mean_data_rate_ac_vi;
2339
2340 return QDF_STATUS_SUCCESS;
2341 }
2342
wlan_mlme_get_wmm_min_phy_rate_ac_vi(struct wlan_objmgr_psoc * psoc,uint32_t * value)2343 QDF_STATUS wlan_mlme_get_wmm_min_phy_rate_ac_vi(struct wlan_objmgr_psoc *psoc,
2344 uint32_t *value)
2345 {
2346 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2347
2348 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2349 if (!mlme_obj)
2350 return QDF_STATUS_E_FAILURE;
2351
2352 *value = mlme_obj->cfg.wmm_params.ac_vi.min_phy_rate_ac_vi;
2353
2354 return QDF_STATUS_SUCCESS;
2355 }
2356
wlan_mlme_get_wmm_sba_ac_vi(struct wlan_objmgr_psoc * psoc,uint16_t * value)2357 QDF_STATUS wlan_mlme_get_wmm_sba_ac_vi(struct wlan_objmgr_psoc *psoc,
2358 uint16_t *value)
2359 {
2360 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2361
2362 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2363 if (!mlme_obj)
2364 return QDF_STATUS_E_FAILURE;
2365
2366 *value = mlme_obj->cfg.wmm_params.ac_vi.sba_ac_vi;
2367
2368 return QDF_STATUS_SUCCESS;
2369 }
2370
2371 QDF_STATUS
wlan_mlme_get_wmm_uapsd_vi_srv_intv(struct wlan_objmgr_psoc * psoc,uint32_t * value)2372 wlan_mlme_get_wmm_uapsd_vi_srv_intv(struct wlan_objmgr_psoc *psoc,
2373 uint32_t *value)
2374 {
2375 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2376
2377 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2378 if (!mlme_obj)
2379 return QDF_STATUS_E_FAILURE;
2380
2381 *value = mlme_obj->cfg.wmm_params.ac_vi.uapsd_vi_srv_intv;
2382
2383 return QDF_STATUS_SUCCESS;
2384 }
2385
wlan_mlme_get_wmm_uapsd_vi_sus_intv(struct wlan_objmgr_psoc * psoc,uint32_t * value)2386 QDF_STATUS wlan_mlme_get_wmm_uapsd_vi_sus_intv(struct wlan_objmgr_psoc *psoc,
2387 uint32_t *value)
2388 {
2389 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2390
2391 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2392 if (!mlme_obj)
2393 return QDF_STATUS_E_FAILURE;
2394
2395 *value = mlme_obj->cfg.wmm_params.ac_vi.uapsd_vi_sus_intv;
2396
2397 return QDF_STATUS_SUCCESS;
2398 }
2399
2400 QDF_STATUS
wlan_mlme_get_wmm_dir_ac_be(struct wlan_objmgr_psoc * psoc,uint8_t * value)2401 wlan_mlme_get_wmm_dir_ac_be(struct wlan_objmgr_psoc *psoc, uint8_t *value)
2402 {
2403 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2404
2405 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2406 if (!mlme_obj)
2407 return QDF_STATUS_E_FAILURE;
2408
2409 *value = mlme_obj->cfg.wmm_params.ac_be.dir_ac_be;
2410
2411 return QDF_STATUS_SUCCESS;
2412 }
2413
wlan_mlme_get_wmm_nom_msdu_size_ac_be(struct wlan_objmgr_psoc * psoc,uint16_t * value)2414 QDF_STATUS wlan_mlme_get_wmm_nom_msdu_size_ac_be(struct wlan_objmgr_psoc *psoc,
2415 uint16_t *value)
2416 {
2417 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2418
2419 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2420 if (!mlme_obj)
2421 return QDF_STATUS_E_FAILURE;
2422
2423 *value = mlme_obj->cfg.wmm_params.ac_be.nom_msdu_size_ac_be;
2424
2425 return QDF_STATUS_SUCCESS;
2426 }
2427
2428 QDF_STATUS
wlan_mlme_get_wmm_mean_data_rate_ac_be(struct wlan_objmgr_psoc * psoc,uint32_t * value)2429 wlan_mlme_get_wmm_mean_data_rate_ac_be(struct wlan_objmgr_psoc *psoc,
2430 uint32_t *value)
2431 {
2432 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2433
2434 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2435 if (!mlme_obj)
2436 return QDF_STATUS_E_FAILURE;
2437
2438 *value = mlme_obj->cfg.wmm_params.ac_be.mean_data_rate_ac_be;
2439
2440 return QDF_STATUS_SUCCESS;
2441 }
2442
wlan_mlme_get_wmm_min_phy_rate_ac_be(struct wlan_objmgr_psoc * psoc,uint32_t * value)2443 QDF_STATUS wlan_mlme_get_wmm_min_phy_rate_ac_be(struct wlan_objmgr_psoc *psoc,
2444 uint32_t *value)
2445 {
2446 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2447
2448 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2449 if (!mlme_obj)
2450 return QDF_STATUS_E_FAILURE;
2451
2452 *value = mlme_obj->cfg.wmm_params.ac_be.min_phy_rate_ac_be;
2453
2454 return QDF_STATUS_SUCCESS;
2455 }
2456
2457 QDF_STATUS
wlan_mlme_get_wmm_sba_ac_be(struct wlan_objmgr_psoc * psoc,uint16_t * value)2458 wlan_mlme_get_wmm_sba_ac_be(struct wlan_objmgr_psoc *psoc, uint16_t *value)
2459 {
2460 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2461
2462 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2463 if (!mlme_obj)
2464 return QDF_STATUS_E_FAILURE;
2465
2466 *value = mlme_obj->cfg.wmm_params.ac_be.sba_ac_be;
2467
2468 return QDF_STATUS_SUCCESS;
2469 }
2470
wlan_mlme_get_wmm_uapsd_be_srv_intv(struct wlan_objmgr_psoc * psoc,uint32_t * value)2471 QDF_STATUS wlan_mlme_get_wmm_uapsd_be_srv_intv(struct wlan_objmgr_psoc *psoc,
2472 uint32_t *value)
2473 {
2474 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2475
2476 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2477 if (!mlme_obj)
2478 return QDF_STATUS_E_FAILURE;
2479
2480 *value = mlme_obj->cfg.wmm_params.ac_be.uapsd_be_srv_intv;
2481
2482 return QDF_STATUS_SUCCESS;
2483 }
2484
wlan_mlme_get_wmm_uapsd_be_sus_intv(struct wlan_objmgr_psoc * psoc,uint32_t * value)2485 QDF_STATUS wlan_mlme_get_wmm_uapsd_be_sus_intv(struct wlan_objmgr_psoc *psoc,
2486 uint32_t *value)
2487 {
2488 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2489
2490 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2491 if (!mlme_obj)
2492 return QDF_STATUS_E_FAILURE;
2493
2494 *value = mlme_obj->cfg.wmm_params.ac_be.uapsd_be_sus_intv;
2495
2496 return QDF_STATUS_SUCCESS;
2497 }
2498
2499 QDF_STATUS
wlan_mlme_get_wmm_dir_ac_bk(struct wlan_objmgr_psoc * psoc,uint8_t * value)2500 wlan_mlme_get_wmm_dir_ac_bk(struct wlan_objmgr_psoc *psoc, uint8_t *value)
2501 {
2502 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2503
2504 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2505 if (!mlme_obj)
2506 return QDF_STATUS_E_FAILURE;
2507
2508 *value = mlme_obj->cfg.wmm_params.ac_bk.dir_ac_bk;
2509
2510 return QDF_STATUS_SUCCESS;
2511 }
2512
wlan_mlme_get_wmm_nom_msdu_size_ac_bk(struct wlan_objmgr_psoc * psoc,uint16_t * value)2513 QDF_STATUS wlan_mlme_get_wmm_nom_msdu_size_ac_bk(struct wlan_objmgr_psoc *psoc,
2514 uint16_t *value)
2515 {
2516 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2517
2518 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2519 if (!mlme_obj)
2520 return QDF_STATUS_E_FAILURE;
2521
2522 *value = mlme_obj->cfg.wmm_params.ac_bk.nom_msdu_size_ac_bk;
2523
2524 return QDF_STATUS_SUCCESS;
2525 }
2526
2527 QDF_STATUS
wlan_mlme_get_wmm_mean_data_rate_ac_bk(struct wlan_objmgr_psoc * psoc,uint32_t * value)2528 wlan_mlme_get_wmm_mean_data_rate_ac_bk(struct wlan_objmgr_psoc *psoc,
2529 uint32_t *value)
2530 {
2531 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2532
2533 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2534 if (!mlme_obj)
2535 return QDF_STATUS_E_FAILURE;
2536
2537 *value = mlme_obj->cfg.wmm_params.ac_bk.mean_data_rate_ac_bk;
2538
2539 return QDF_STATUS_SUCCESS;
2540 }
2541
wlan_mlme_get_wmm_min_phy_rate_ac_bk(struct wlan_objmgr_psoc * psoc,uint32_t * value)2542 QDF_STATUS wlan_mlme_get_wmm_min_phy_rate_ac_bk(struct wlan_objmgr_psoc *psoc,
2543 uint32_t *value)
2544 {
2545 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2546
2547 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2548 if (!mlme_obj)
2549 return QDF_STATUS_E_FAILURE;
2550
2551 *value = mlme_obj->cfg.wmm_params.ac_bk.min_phy_rate_ac_bk;
2552
2553 return QDF_STATUS_SUCCESS;
2554 }
2555
2556 QDF_STATUS
wlan_mlme_get_wmm_sba_ac_bk(struct wlan_objmgr_psoc * psoc,uint16_t * value)2557 wlan_mlme_get_wmm_sba_ac_bk(struct wlan_objmgr_psoc *psoc, uint16_t *value)
2558 {
2559 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2560
2561 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2562 if (!mlme_obj)
2563 return QDF_STATUS_E_FAILURE;
2564
2565 *value = mlme_obj->cfg.wmm_params.ac_bk.sba_ac_bk;
2566
2567 return QDF_STATUS_SUCCESS;
2568 }
2569
2570 QDF_STATUS
wlan_mlme_get_wmm_uapsd_bk_srv_intv(struct wlan_objmgr_psoc * psoc,uint32_t * value)2571 wlan_mlme_get_wmm_uapsd_bk_srv_intv(struct wlan_objmgr_psoc *psoc,
2572 uint32_t *value)
2573 {
2574 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2575
2576 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2577 if (!mlme_obj)
2578 return QDF_STATUS_E_FAILURE;
2579
2580 *value = mlme_obj->cfg.wmm_params.ac_bk.uapsd_bk_srv_intv;
2581
2582 return QDF_STATUS_SUCCESS;
2583 }
2584
2585 QDF_STATUS
wlan_mlme_get_wmm_uapsd_bk_sus_intv(struct wlan_objmgr_psoc * psoc,uint32_t * value)2586 wlan_mlme_get_wmm_uapsd_bk_sus_intv(struct wlan_objmgr_psoc *psoc,
2587 uint32_t *value)
2588 {
2589 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2590
2591 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2592 if (!mlme_obj)
2593 return QDF_STATUS_E_FAILURE;
2594
2595 *value = mlme_obj->cfg.wmm_params.ac_bk.uapsd_bk_sus_intv;
2596
2597 return QDF_STATUS_SUCCESS;
2598 }
2599
2600 QDF_STATUS
wlan_mlme_get_wmm_mode(struct wlan_objmgr_psoc * psoc,uint8_t * value)2601 wlan_mlme_get_wmm_mode(struct wlan_objmgr_psoc *psoc, uint8_t *value)
2602 {
2603 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2604
2605 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2606 if (!mlme_obj)
2607 return QDF_STATUS_E_FAILURE;
2608
2609 *value = mlme_obj->cfg.wmm_params.wmm_config.wmm_mode;
2610
2611 return QDF_STATUS_SUCCESS;
2612 }
2613
2614 QDF_STATUS
wlan_mlme_get_80211e_is_enabled(struct wlan_objmgr_psoc * psoc,bool * value)2615 wlan_mlme_get_80211e_is_enabled(struct wlan_objmgr_psoc *psoc, bool *value)
2616 {
2617 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2618
2619 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2620 if (!mlme_obj)
2621 return QDF_STATUS_E_FAILURE;
2622
2623 *value = mlme_obj->cfg.wmm_params.wmm_config.b80211e_is_enabled;
2624
2625 return QDF_STATUS_SUCCESS;
2626 }
2627
2628 QDF_STATUS
wlan_mlme_get_wmm_uapsd_mask(struct wlan_objmgr_psoc * psoc,uint8_t * value)2629 wlan_mlme_get_wmm_uapsd_mask(struct wlan_objmgr_psoc *psoc, uint8_t *value)
2630 {
2631 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2632
2633 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2634 if (!mlme_obj)
2635 return QDF_STATUS_E_FAILURE;
2636
2637 *value = mlme_obj->cfg.wmm_params.wmm_config.uapsd_mask;
2638
2639 return QDF_STATUS_SUCCESS;
2640 }
2641
2642 #ifdef FEATURE_WLAN_ESE
wlan_mlme_get_inactivity_interval(struct wlan_objmgr_psoc * psoc,uint32_t * value)2643 void wlan_mlme_get_inactivity_interval(struct wlan_objmgr_psoc *psoc,
2644 uint32_t *value)
2645 {
2646 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2647
2648 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2649 if (!mlme_obj) {
2650 *value = cfg_default(CFG_QOS_WMM_INACTIVITY_INTERVAL);
2651 return;
2652 }
2653
2654 *value = mlme_obj->cfg.wmm_params.wmm_tspec_element.inactivity_intv;
2655 }
2656 #endif
2657
wlan_mlme_get_is_ts_burst_size_enable(struct wlan_objmgr_psoc * psoc,bool * value)2658 void wlan_mlme_get_is_ts_burst_size_enable(struct wlan_objmgr_psoc *psoc,
2659 bool *value)
2660 {
2661 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2662
2663 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2664 if (!mlme_obj) {
2665 *value = cfg_default(CFG_QOS_WMM_BURST_SIZE_DEFN);
2666 return;
2667 }
2668
2669 *value = mlme_obj->cfg.wmm_params.wmm_tspec_element.burst_size_def;
2670 }
2671
wlan_mlme_get_ts_info_ack_policy(struct wlan_objmgr_psoc * psoc,enum mlme_ts_info_ack_policy * value)2672 void wlan_mlme_get_ts_info_ack_policy(struct wlan_objmgr_psoc *psoc,
2673 enum mlme_ts_info_ack_policy *value)
2674 {
2675 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2676
2677 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2678 if (!mlme_obj) {
2679 *value = cfg_default(CFG_QOS_WMM_TS_INFO_ACK_POLICY);
2680 return;
2681 }
2682
2683 *value = mlme_obj->cfg.wmm_params.wmm_tspec_element.ts_ack_policy;
2684
2685 }
2686
2687 QDF_STATUS
wlan_mlme_get_ts_acm_value_for_ac(struct wlan_objmgr_psoc * psoc,bool * value)2688 wlan_mlme_get_ts_acm_value_for_ac(struct wlan_objmgr_psoc *psoc, bool *value)
2689 {
2690 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2691
2692 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2693 if (!mlme_obj)
2694 return QDF_STATUS_E_FAILURE;
2695
2696 *value = mlme_obj->cfg.wmm_params.wmm_tspec_element.ts_acm_is_off;
2697
2698 return QDF_STATUS_SUCCESS;
2699 }
2700
wlan_mlme_get_listen_interval(struct wlan_objmgr_psoc * psoc,int * value)2701 QDF_STATUS wlan_mlme_get_listen_interval(struct wlan_objmgr_psoc *psoc,
2702 int *value)
2703 {
2704 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2705
2706 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2707 if (!mlme_obj)
2708 return QDF_STATUS_E_FAILURE;
2709
2710 *value = mlme_obj->cfg.sap_cfg.listen_interval;
2711
2712 return QDF_STATUS_SUCCESS;
2713 }
2714
wlan_mlme_set_sap_listen_interval(struct wlan_objmgr_psoc * psoc,int value)2715 QDF_STATUS wlan_mlme_set_sap_listen_interval(struct wlan_objmgr_psoc *psoc,
2716 int value)
2717 {
2718 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2719
2720 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2721 if (!mlme_obj)
2722 return QDF_STATUS_E_FAILURE;
2723
2724 if (cfg_in_range(CFG_LISTEN_INTERVAL, value))
2725 mlme_obj->cfg.sap_cfg.listen_interval = value;
2726 else
2727 return QDF_STATUS_E_FAILURE;
2728
2729 return QDF_STATUS_SUCCESS;
2730 }
2731
wlan_mlme_set_assoc_sta_limit(struct wlan_objmgr_psoc * psoc,int value)2732 QDF_STATUS wlan_mlme_set_assoc_sta_limit(struct wlan_objmgr_psoc *psoc,
2733 int value)
2734 {
2735 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2736
2737 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2738 if (!mlme_obj)
2739 return QDF_STATUS_E_FAILURE;
2740
2741 if (cfg_in_range(CFG_ASSOC_STA_LIMIT, value) &&
2742 (value <= mlme_obj->cfg.sap_cfg.sap_max_no_peers))
2743 mlme_obj->cfg.sap_cfg.assoc_sta_limit = value;
2744 else
2745 return QDF_STATUS_E_FAILURE;
2746
2747 return QDF_STATUS_SUCCESS;
2748 }
2749
wlan_mlme_get_assoc_sta_limit(struct wlan_objmgr_psoc * psoc,int * value)2750 QDF_STATUS wlan_mlme_get_assoc_sta_limit(struct wlan_objmgr_psoc *psoc,
2751 int *value)
2752 {
2753 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2754
2755 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2756 if (!mlme_obj)
2757 return QDF_STATUS_E_FAILURE;
2758
2759 *value = mlme_obj->cfg.sap_cfg.assoc_sta_limit;
2760
2761 return QDF_STATUS_SUCCESS;
2762 }
2763
wlan_mlme_get_sap_get_peer_info(struct wlan_objmgr_psoc * psoc,bool * value)2764 QDF_STATUS wlan_mlme_get_sap_get_peer_info(struct wlan_objmgr_psoc *psoc,
2765 bool *value)
2766 {
2767 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2768
2769 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2770 if (!mlme_obj)
2771 return QDF_STATUS_E_FAILURE;
2772
2773 *value = mlme_obj->cfg.sap_cfg.sap_get_peer_info;
2774
2775 return QDF_STATUS_SUCCESS;
2776 }
2777
wlan_mlme_set_sap_get_peer_info(struct wlan_objmgr_psoc * psoc,bool value)2778 QDF_STATUS wlan_mlme_set_sap_get_peer_info(struct wlan_objmgr_psoc *psoc,
2779 bool value)
2780 {
2781 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2782
2783 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2784 if (!mlme_obj)
2785 return QDF_STATUS_E_FAILURE;
2786
2787 mlme_obj->cfg.sap_cfg.sap_get_peer_info = value;
2788
2789 return QDF_STATUS_SUCCESS;
2790 }
2791
2792 QDF_STATUS
wlan_mlme_get_sap_bcast_deauth_enabled(struct wlan_objmgr_psoc * psoc,bool * value)2793 wlan_mlme_get_sap_bcast_deauth_enabled(struct wlan_objmgr_psoc *psoc,
2794 bool *value)
2795 {
2796 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2797
2798 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2799 if (!mlme_obj)
2800 return QDF_STATUS_E_FAILURE;
2801
2802 *value = mlme_obj->cfg.sap_cfg.is_sap_bcast_deauth_enabled;
2803
2804 return QDF_STATUS_SUCCESS;
2805 }
2806
2807 QDF_STATUS
wlan_mlme_is_6g_sap_fd_enabled(struct wlan_objmgr_psoc * psoc,bool * value)2808 wlan_mlme_is_6g_sap_fd_enabled(struct wlan_objmgr_psoc *psoc,
2809 bool *value)
2810 {
2811 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2812
2813 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2814 if (!mlme_obj)
2815 return QDF_STATUS_E_FAILURE;
2816
2817 *value = mlme_obj->cfg.sap_cfg.is_6g_sap_fd_enabled;
2818
2819 return QDF_STATUS_SUCCESS;
2820 }
2821
wlan_mlme_get_sap_allow_all_channels(struct wlan_objmgr_psoc * psoc,bool * value)2822 QDF_STATUS wlan_mlme_get_sap_allow_all_channels(struct wlan_objmgr_psoc *psoc,
2823 bool *value)
2824 {
2825 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2826
2827 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2828 if (!mlme_obj)
2829 return QDF_STATUS_E_FAILURE;
2830
2831 *value = mlme_obj->cfg.sap_cfg.sap_allow_all_chan_param_name;
2832
2833 return QDF_STATUS_SUCCESS;
2834 }
2835
wlan_mlme_get_sap_max_peers(struct wlan_objmgr_psoc * psoc,int * value)2836 QDF_STATUS wlan_mlme_get_sap_max_peers(struct wlan_objmgr_psoc *psoc,
2837 int *value)
2838 {
2839 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2840
2841 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2842 if (!mlme_obj)
2843 return QDF_STATUS_E_FAILURE;
2844
2845 *value = mlme_obj->cfg.sap_cfg.sap_max_no_peers;
2846
2847 return QDF_STATUS_SUCCESS;
2848 }
2849
wlan_mlme_set_sap_max_peers(struct wlan_objmgr_psoc * psoc,int value)2850 QDF_STATUS wlan_mlme_set_sap_max_peers(struct wlan_objmgr_psoc *psoc,
2851 int value)
2852 {
2853 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2854
2855 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2856 if (!mlme_obj)
2857 return QDF_STATUS_E_FAILURE;
2858
2859 if (cfg_in_range(CFG_SAP_MAX_NO_PEERS, value))
2860 mlme_obj->cfg.sap_cfg.sap_max_no_peers = value;
2861 else
2862 return QDF_STATUS_E_FAILURE;
2863
2864 return QDF_STATUS_SUCCESS;
2865 }
2866
wlan_mlme_get_sap_max_offload_peers(struct wlan_objmgr_psoc * psoc,int * value)2867 QDF_STATUS wlan_mlme_get_sap_max_offload_peers(struct wlan_objmgr_psoc *psoc,
2868 int *value)
2869 {
2870 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2871
2872 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2873 if (!mlme_obj)
2874 return QDF_STATUS_E_FAILURE;
2875
2876 *value = mlme_obj->cfg.sap_cfg.sap_max_offload_peers;
2877
2878 return QDF_STATUS_SUCCESS;
2879 }
2880
wlan_mlme_get_sap_max_offload_reorder_buffs(struct wlan_objmgr_psoc * psoc,int * value)2881 QDF_STATUS wlan_mlme_get_sap_max_offload_reorder_buffs(struct wlan_objmgr_psoc
2882 *psoc, int *value)
2883 {
2884 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2885
2886 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2887 if (!mlme_obj)
2888 return QDF_STATUS_E_FAILURE;
2889
2890 *value = mlme_obj->cfg.sap_cfg.sap_max_offload_reorder_buffs;
2891
2892 return QDF_STATUS_SUCCESS;
2893 }
2894
wlan_mlme_get_sap_chn_switch_bcn_count(struct wlan_objmgr_psoc * psoc,int * value)2895 QDF_STATUS wlan_mlme_get_sap_chn_switch_bcn_count(struct wlan_objmgr_psoc *psoc,
2896 int *value)
2897 {
2898 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2899
2900 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2901 if (!mlme_obj)
2902 return QDF_STATUS_E_FAILURE;
2903
2904 *value = mlme_obj->cfg.sap_cfg.sap_ch_switch_beacon_cnt;
2905
2906 return QDF_STATUS_SUCCESS;
2907 }
2908
wlan_mlme_get_sap_chn_switch_mode(struct wlan_objmgr_psoc * psoc,bool * value)2909 QDF_STATUS wlan_mlme_get_sap_chn_switch_mode(struct wlan_objmgr_psoc *psoc,
2910 bool *value)
2911 {
2912 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2913
2914 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2915 if (!mlme_obj)
2916 return QDF_STATUS_E_FAILURE;
2917
2918 *value = mlme_obj->cfg.sap_cfg.sap_ch_switch_mode;
2919
2920 return QDF_STATUS_SUCCESS;
2921 }
2922
wlan_mlme_get_sap_internal_restart(struct wlan_objmgr_psoc * psoc,bool * value)2923 QDF_STATUS wlan_mlme_get_sap_internal_restart(struct wlan_objmgr_psoc *psoc,
2924 bool *value)
2925 {
2926 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2927
2928 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2929 if (!mlme_obj)
2930 return QDF_STATUS_E_FAILURE;
2931
2932 *value = mlme_obj->cfg.sap_cfg.sap_internal_restart;
2933
2934 return QDF_STATUS_SUCCESS;
2935 }
2936
wlan_mlme_get_sap_max_modulated_dtim(struct wlan_objmgr_psoc * psoc,uint8_t * value)2937 QDF_STATUS wlan_mlme_get_sap_max_modulated_dtim(struct wlan_objmgr_psoc *psoc,
2938 uint8_t *value)
2939 {
2940 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2941
2942 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2943 if (!mlme_obj)
2944 return QDF_STATUS_E_FAILURE;
2945
2946 *value = mlme_obj->cfg.sap_cfg.max_li_modulated_dtim_time;
2947
2948 return QDF_STATUS_SUCCESS;
2949 }
2950
wlan_mlme_get_sap_chan_pref_location(struct wlan_objmgr_psoc * psoc,uint8_t * value)2951 QDF_STATUS wlan_mlme_get_sap_chan_pref_location(struct wlan_objmgr_psoc *psoc,
2952 uint8_t *value)
2953 {
2954 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2955
2956 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2957 if (!mlme_obj)
2958 return QDF_STATUS_E_FAILURE;
2959
2960 *value = mlme_obj->cfg.sap_cfg.sap_pref_chan_location;
2961
2962 return QDF_STATUS_SUCCESS;
2963 }
2964
wlan_mlme_get_sap_country_priority(struct wlan_objmgr_psoc * psoc,bool * value)2965 QDF_STATUS wlan_mlme_get_sap_country_priority(struct wlan_objmgr_psoc *psoc,
2966 bool *value)
2967 {
2968 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2969
2970 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2971 if (!mlme_obj)
2972 return QDF_STATUS_E_FAILURE;
2973
2974 *value = mlme_obj->cfg.sap_cfg.country_code_priority;
2975
2976 return QDF_STATUS_SUCCESS;
2977 }
2978
wlan_mlme_get_sap_reduced_beacon_interval(struct wlan_objmgr_psoc * psoc,int * value)2979 QDF_STATUS wlan_mlme_get_sap_reduced_beacon_interval(struct wlan_objmgr_psoc
2980 *psoc, int *value)
2981 {
2982 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2983
2984 mlme_obj = mlme_get_psoc_ext_obj(psoc);
2985 if (!mlme_obj) {
2986 *value = cfg_default(CFG_REDUCED_BEACON_INTERVAL);
2987 return QDF_STATUS_E_FAILURE;
2988 }
2989
2990 *value = mlme_obj->cfg.sap_cfg.reduced_beacon_interval;
2991
2992 return QDF_STATUS_SUCCESS;
2993 }
2994
wlan_mlme_get_sap_chan_switch_rate_enabled(struct wlan_objmgr_psoc * psoc,bool * value)2995 QDF_STATUS wlan_mlme_get_sap_chan_switch_rate_enabled(struct wlan_objmgr_psoc
2996 *psoc, bool *value)
2997 {
2998 struct wlan_mlme_psoc_ext_obj *mlme_obj;
2999
3000 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3001 if (!mlme_obj)
3002 return QDF_STATUS_E_FAILURE;
3003
3004 *value = mlme_obj->cfg.sap_cfg.chan_switch_hostapd_rate_enabled_name;
3005
3006 return QDF_STATUS_SUCCESS;
3007 }
3008
wlan_mlme_get_sap_force_11n_for_11ac(struct wlan_objmgr_psoc * psoc,bool * value)3009 QDF_STATUS wlan_mlme_get_sap_force_11n_for_11ac(struct wlan_objmgr_psoc
3010 *psoc, bool *value)
3011 {
3012 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3013
3014 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3015 if (!mlme_obj)
3016 return QDF_STATUS_E_FAILURE;
3017
3018 *value = mlme_obj->cfg.sap_cfg.sap_force_11n_for_11ac;
3019
3020 return QDF_STATUS_SUCCESS;
3021 }
3022
wlan_mlme_get_go_force_11n_for_11ac(struct wlan_objmgr_psoc * psoc,bool * value)3023 QDF_STATUS wlan_mlme_get_go_force_11n_for_11ac(struct wlan_objmgr_psoc
3024 *psoc, bool *value)
3025 {
3026 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3027
3028 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3029 if (!mlme_obj)
3030 return QDF_STATUS_E_FAILURE;
3031
3032 *value = mlme_obj->cfg.sap_cfg.go_force_11n_for_11ac;
3033
3034 return QDF_STATUS_SUCCESS;
3035 }
3036
wlan_mlme_is_sap_11ac_override(struct wlan_objmgr_psoc * psoc,bool * value)3037 QDF_STATUS wlan_mlme_is_sap_11ac_override(struct wlan_objmgr_psoc *psoc,
3038 bool *value)
3039 {
3040 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3041
3042 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3043 if (!mlme_obj) {
3044 *value = cfg_default(CFG_SAP_11AC_OVERRIDE);
3045 return QDF_STATUS_E_FAILURE;
3046 }
3047 *value = mlme_obj->cfg.sap_cfg.sap_11ac_override;
3048
3049 return QDF_STATUS_SUCCESS;
3050 }
3051
wlan_mlme_is_go_11ac_override(struct wlan_objmgr_psoc * psoc,bool * value)3052 QDF_STATUS wlan_mlme_is_go_11ac_override(struct wlan_objmgr_psoc *psoc,
3053 bool *value)
3054 {
3055 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3056
3057 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3058 if (!mlme_obj) {
3059 *value = cfg_default(CFG_GO_11AC_OVERRIDE);
3060 return QDF_STATUS_E_FAILURE;
3061 }
3062 *value = mlme_obj->cfg.sap_cfg.go_11ac_override;
3063
3064 return QDF_STATUS_SUCCESS;
3065 }
3066
wlan_mlme_set_sap_11ac_override(struct wlan_objmgr_psoc * psoc,bool value)3067 QDF_STATUS wlan_mlme_set_sap_11ac_override(struct wlan_objmgr_psoc *psoc,
3068 bool value)
3069 {
3070 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3071
3072 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3073 if (!mlme_obj)
3074 return QDF_STATUS_E_FAILURE;
3075 mlme_obj->cfg.sap_cfg.sap_11ac_override = value;
3076
3077 return QDF_STATUS_SUCCESS;
3078 }
3079
wlan_mlme_set_go_11ac_override(struct wlan_objmgr_psoc * psoc,bool value)3080 QDF_STATUS wlan_mlme_set_go_11ac_override(struct wlan_objmgr_psoc *psoc,
3081 bool value)
3082 {
3083 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3084
3085 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3086 if (!mlme_obj)
3087 return QDF_STATUS_E_FAILURE;
3088 mlme_obj->cfg.sap_cfg.go_11ac_override = value;
3089
3090 return QDF_STATUS_SUCCESS;
3091 }
3092
wlan_mlme_get_bigtk_support(struct wlan_objmgr_psoc * psoc,bool * value)3093 QDF_STATUS wlan_mlme_get_bigtk_support(struct wlan_objmgr_psoc *psoc,
3094 bool *value)
3095 {
3096 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
3097
3098 if (!mlme_obj)
3099 return QDF_STATUS_E_FAILURE;
3100
3101 *value = mlme_obj->cfg.gen.bigtk_support;
3102
3103 return QDF_STATUS_SUCCESS;
3104 }
3105
wlan_mlme_get_ocv_support(struct wlan_objmgr_psoc * psoc,bool * value)3106 QDF_STATUS wlan_mlme_get_ocv_support(struct wlan_objmgr_psoc *psoc,
3107 bool *value)
3108 {
3109 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
3110
3111 if (!mlme_obj)
3112 return QDF_STATUS_E_FAILURE;
3113
3114 *value = mlme_obj->cfg.gen.ocv_support;
3115
3116 return QDF_STATUS_SUCCESS;
3117 }
3118
wlan_mlme_get_host_scan_abort_support(struct wlan_objmgr_psoc * psoc)3119 bool wlan_mlme_get_host_scan_abort_support(struct wlan_objmgr_psoc *psoc)
3120 {
3121 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
3122
3123 if (!mlme_obj)
3124 return false;
3125
3126 return mlme_obj->cfg.gen.stop_all_host_scan_support;
3127 }
3128
wlan_mlme_get_dual_sta_roam_support(struct wlan_objmgr_psoc * psoc)3129 bool wlan_mlme_get_dual_sta_roam_support(struct wlan_objmgr_psoc *psoc)
3130 {
3131 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
3132
3133 if (!mlme_obj)
3134 return false;
3135
3136 return mlme_obj->cfg.gen.dual_sta_roam_fw_support;
3137 }
3138
wlan_mlme_get_oce_sta_enabled_info(struct wlan_objmgr_psoc * psoc,bool * value)3139 QDF_STATUS wlan_mlme_get_oce_sta_enabled_info(struct wlan_objmgr_psoc *psoc,
3140 bool *value)
3141 {
3142 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
3143
3144 if (!mlme_obj)
3145 return QDF_STATUS_E_FAILURE;
3146
3147 *value = mlme_obj->cfg.oce.oce_sta_enabled;
3148 return QDF_STATUS_SUCCESS;
3149 }
3150
wlan_mlme_get_oce_sap_enabled_info(struct wlan_objmgr_psoc * psoc,bool * value)3151 QDF_STATUS wlan_mlme_get_oce_sap_enabled_info(struct wlan_objmgr_psoc *psoc,
3152 bool *value)
3153 {
3154 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
3155
3156 if (!mlme_obj)
3157 return QDF_STATUS_E_FAILURE;
3158
3159 *value = mlme_obj->cfg.oce.oce_sap_enabled;
3160 return QDF_STATUS_SUCCESS;
3161 }
3162
3163 /**
3164 * wlan_mlme_send_oce_flags_fw() - Send the oce flags to FW
3165 * @pdev: pointer to pdev object
3166 * @object: vdev object
3167 * @arg: Arguments to the handler
3168 *
3169 * Return: void
3170 */
wlan_mlme_send_oce_flags_fw(struct wlan_objmgr_pdev * pdev,void * object,void * arg)3171 static void wlan_mlme_send_oce_flags_fw(struct wlan_objmgr_pdev *pdev,
3172 void *object, void *arg)
3173 {
3174 struct wlan_objmgr_vdev *vdev = object;
3175 uint8_t *updated_fw_value = arg;
3176 uint8_t *dynamic_fw_value = 0;
3177 uint8_t vdev_id;
3178
3179 if (wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE) {
3180 dynamic_fw_value = mlme_get_dynamic_oce_flags(vdev);
3181 if (!dynamic_fw_value)
3182 return;
3183 if (*updated_fw_value == *dynamic_fw_value) {
3184 mlme_legacy_debug("Current FW flags matches with updated value.");
3185 return;
3186 }
3187 *dynamic_fw_value = *updated_fw_value;
3188 vdev_id = wlan_vdev_get_id(vdev);
3189 if (wma_cli_set_command(vdev_id,
3190 wmi_vdev_param_enable_disable_oce_features,
3191 *updated_fw_value, VDEV_CMD))
3192 mlme_legacy_err("Failed to send OCE update to FW");
3193 }
3194 }
3195
wlan_mlme_update_oce_flags(struct wlan_objmgr_pdev * pdev)3196 void wlan_mlme_update_oce_flags(struct wlan_objmgr_pdev *pdev)
3197 {
3198 uint16_t sap_connected_peer, go_connected_peer;
3199 struct wlan_objmgr_psoc *psoc = NULL;
3200 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3201 uint8_t updated_fw_value = 0;
3202
3203 psoc = wlan_pdev_get_psoc(pdev);
3204 if (!psoc)
3205 return;
3206
3207 sap_connected_peer =
3208 wlan_util_get_peer_count_for_mode(pdev, QDF_SAP_MODE);
3209 go_connected_peer =
3210 wlan_util_get_peer_count_for_mode(pdev, QDF_P2P_GO_MODE);
3211 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3212
3213 if (!mlme_obj)
3214 return;
3215
3216 if (sap_connected_peer || go_connected_peer) {
3217 updated_fw_value = mlme_obj->cfg.oce.feature_bitmap;
3218 updated_fw_value &=
3219 ~(WMI_VDEV_OCE_PROBE_REQUEST_RATE_FEATURE_BITMAP);
3220 updated_fw_value &=
3221 ~(WMI_VDEV_OCE_PROBE_REQUEST_DEFERRAL_FEATURE_BITMAP);
3222 mlme_legacy_debug("Disable STA OCE probe req rate and defferal updated_fw_value :%d",
3223 updated_fw_value);
3224 } else {
3225 updated_fw_value = mlme_obj->cfg.oce.feature_bitmap;
3226 mlme_legacy_debug("Update the STA OCE flags to default INI updated_fw_value :%d",
3227 updated_fw_value);
3228 }
3229
3230 wlan_objmgr_pdev_iterate_obj_list(pdev, WLAN_VDEV_OP,
3231 wlan_mlme_send_oce_flags_fw,
3232 &updated_fw_value, 0, WLAN_MLME_NB_ID);
3233 }
3234
wlan_mlme_is_ap_prot_enabled(struct wlan_objmgr_psoc * psoc)3235 bool wlan_mlme_is_ap_prot_enabled(struct wlan_objmgr_psoc *psoc)
3236 {
3237 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3238
3239 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3240 if (!mlme_obj)
3241 return false;
3242
3243 return mlme_obj->cfg.sap_protection_cfg.is_ap_prot_enabled;
3244 }
3245
wlan_mlme_get_ap_protection_mode(struct wlan_objmgr_psoc * psoc,uint16_t * value)3246 QDF_STATUS wlan_mlme_get_ap_protection_mode(struct wlan_objmgr_psoc *psoc,
3247 uint16_t *value)
3248 {
3249 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3250
3251 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3252 if (!mlme_obj)
3253 return QDF_STATUS_E_FAILURE;
3254
3255 *value = mlme_obj->cfg.sap_protection_cfg.ap_protection_mode;
3256
3257 return QDF_STATUS_SUCCESS;
3258 }
3259
wlan_mlme_is_ap_obss_prot_enabled(struct wlan_objmgr_psoc * psoc,bool * value)3260 QDF_STATUS wlan_mlme_is_ap_obss_prot_enabled(struct wlan_objmgr_psoc *psoc,
3261 bool *value)
3262 {
3263 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3264
3265 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3266 if (!mlme_obj)
3267 return QDF_STATUS_E_FAILURE;
3268
3269 *value = mlme_obj->cfg.sap_protection_cfg.enable_ap_obss_protection;
3270
3271 return QDF_STATUS_SUCCESS;
3272 }
3273
wlan_mlme_get_rts_threshold(struct wlan_objmgr_psoc * psoc,uint32_t * value)3274 QDF_STATUS wlan_mlme_get_rts_threshold(struct wlan_objmgr_psoc *psoc,
3275 uint32_t *value)
3276 {
3277 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3278
3279 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3280 if (!mlme_obj)
3281 return QDF_STATUS_E_FAILURE;
3282
3283 *value = mlme_obj->cfg.threshold.rts_threshold;
3284
3285 return QDF_STATUS_SUCCESS;
3286 }
3287
wlan_mlme_set_rts_threshold(struct wlan_objmgr_psoc * psoc,uint32_t value)3288 QDF_STATUS wlan_mlme_set_rts_threshold(struct wlan_objmgr_psoc *psoc,
3289 uint32_t value)
3290 {
3291 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3292 tp_wma_handle wma_handle;
3293
3294 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
3295
3296 if (!wma_handle)
3297 return QDF_STATUS_E_INVAL;
3298
3299 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3300
3301 if (!mlme_obj)
3302 return QDF_STATUS_E_FAILURE;
3303
3304 mlme_obj->cfg.threshold.rts_threshold = value;
3305 wma_update_rts_params(wma_handle, value);
3306
3307 return QDF_STATUS_SUCCESS;
3308 }
3309
wlan_mlme_get_frag_threshold(struct wlan_objmgr_psoc * psoc,uint32_t * value)3310 QDF_STATUS wlan_mlme_get_frag_threshold(struct wlan_objmgr_psoc *psoc,
3311 uint32_t *value)
3312 {
3313 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3314
3315 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3316 if (!mlme_obj)
3317 return QDF_STATUS_E_FAILURE;
3318
3319 *value = mlme_obj->cfg.threshold.frag_threshold;
3320
3321 return QDF_STATUS_SUCCESS;
3322 }
3323
wlan_mlme_set_frag_threshold(struct wlan_objmgr_psoc * psoc,uint32_t value)3324 QDF_STATUS wlan_mlme_set_frag_threshold(struct wlan_objmgr_psoc *psoc,
3325 uint32_t value)
3326 {
3327 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3328 tp_wma_handle wma_handle;
3329
3330 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
3331
3332 if (!wma_handle)
3333 return QDF_STATUS_E_INVAL;
3334
3335 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3336
3337 if (!mlme_obj)
3338 return QDF_STATUS_E_FAILURE;
3339
3340 mlme_obj->cfg.threshold.frag_threshold = value;
3341 wma_update_frag_params(wma_handle,
3342 value);
3343
3344 return QDF_STATUS_SUCCESS;
3345 }
3346
wlan_mlme_get_fils_enabled_info(struct wlan_objmgr_psoc * psoc,bool * value)3347 QDF_STATUS wlan_mlme_get_fils_enabled_info(struct wlan_objmgr_psoc *psoc,
3348 bool *value)
3349 {
3350 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
3351
3352 if (!mlme_obj)
3353 return QDF_STATUS_E_FAILURE;
3354
3355 *value = mlme_obj->cfg.oce.fils_enabled;
3356 return QDF_STATUS_SUCCESS;
3357 }
3358
wlan_mlme_set_fils_enabled_info(struct wlan_objmgr_psoc * psoc,bool value)3359 QDF_STATUS wlan_mlme_set_fils_enabled_info(struct wlan_objmgr_psoc *psoc,
3360 bool value)
3361 {
3362 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
3363
3364 if (!mlme_obj)
3365 return QDF_STATUS_E_FAILURE;
3366
3367 mlme_obj->cfg.oce.fils_enabled = value;
3368 return QDF_STATUS_SUCCESS;
3369 }
3370
wlan_mlme_set_primary_interface(struct wlan_objmgr_psoc * psoc,uint8_t value)3371 QDF_STATUS wlan_mlme_set_primary_interface(struct wlan_objmgr_psoc *psoc,
3372 uint8_t value)
3373 {
3374 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
3375
3376 if (!mlme_obj)
3377 return QDF_STATUS_E_FAILURE;
3378
3379 mlme_obj->cfg.gen.dual_sta_policy.primary_vdev_id = value;
3380 mlme_debug("Set primary iface to :%d", value);
3381
3382 return QDF_STATUS_SUCCESS;
3383 }
3384
wlan_mlme_is_primary_interface_configured(struct wlan_objmgr_psoc * psoc)3385 bool wlan_mlme_is_primary_interface_configured(struct wlan_objmgr_psoc *psoc)
3386 {
3387 return wlan_cm_same_band_sta_allowed(psoc);
3388 }
3389
wlan_mlme_peer_get_assoc_rsp_ies(struct wlan_objmgr_peer * peer,const uint8_t ** ie_buf,size_t * ie_len)3390 QDF_STATUS wlan_mlme_peer_get_assoc_rsp_ies(struct wlan_objmgr_peer *peer,
3391 const uint8_t **ie_buf,
3392 size_t *ie_len)
3393 {
3394 struct peer_mlme_priv_obj *peer_priv;
3395
3396 if (!peer || !ie_buf || !ie_len)
3397 return QDF_STATUS_E_INVAL;
3398
3399 *ie_buf = NULL;
3400 *ie_len = 0;
3401
3402 peer_priv = wlan_objmgr_peer_get_comp_private_obj(peer,
3403 WLAN_UMAC_COMP_MLME);
3404
3405 if (!peer_priv || peer_priv->assoc_rsp.len == 0)
3406 return QDF_STATUS_SUCCESS;
3407
3408 *ie_buf = peer_priv->assoc_rsp.ptr;
3409 *ie_len = peer_priv->assoc_rsp.len;
3410
3411 return QDF_STATUS_SUCCESS;
3412 }
3413
wlan_mlme_get_mcc_duty_cycle_percentage(struct wlan_objmgr_pdev * pdev)3414 int wlan_mlme_get_mcc_duty_cycle_percentage(struct wlan_objmgr_pdev *pdev)
3415 {
3416 struct wlan_objmgr_psoc *psoc = NULL;
3417 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3418 uint32_t op_ch_freq_list[MAX_NUMBER_OF_CONC_CONNECTIONS];
3419 uint8_t vdev_id_list[MAX_NUMBER_OF_CONC_CONNECTIONS];
3420 uint32_t i, operating_channel, quota_value = MCC_DUTY_CYCLE;
3421 struct dual_sta_policy *dual_sta_policy;
3422 uint32_t count, primary_sta_freq = 0, secondary_sta_freq = 0;
3423
3424 psoc = wlan_pdev_get_psoc(pdev);
3425 if (!psoc)
3426 return -EINVAL;
3427
3428 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3429 if (!mlme_obj)
3430 return -EINVAL;
3431 dual_sta_policy = &mlme_obj->cfg.gen.dual_sta_policy;
3432
3433 if (dual_sta_policy->primary_vdev_id == WLAN_INVALID_VDEV_ID ||
3434 (dual_sta_policy->concurrent_sta_policy ==
3435 QCA_WLAN_CONCURRENT_STA_POLICY_UNBIASED)) {
3436 mlme_debug("Invalid primary vdev id or policy is unbaised :%d",
3437 dual_sta_policy->concurrent_sta_policy);
3438 return -EINVAL;
3439 }
3440
3441 count = policy_mgr_get_mode_specific_conn_info(psoc, op_ch_freq_list,
3442 vdev_id_list,
3443 PM_STA_MODE);
3444
3445 /* Proceed only in case of STA+STA */
3446 if (count != 2) {
3447 mlme_debug("STA+STA concurrency is not present");
3448 return -EINVAL;
3449 }
3450
3451 for (i = 0; i < count; i++) {
3452 if (vdev_id_list[i] == dual_sta_policy->primary_vdev_id) {
3453 primary_sta_freq = op_ch_freq_list[i];
3454 mlme_debug("primary sta vdev:%d at inxex:%d, freq:%d",
3455 i, vdev_id_list[i], op_ch_freq_list[i]);
3456 } else {
3457 secondary_sta_freq = op_ch_freq_list[i];
3458 mlme_debug("secondary sta vdev:%d at inxex:%d, freq:%d",
3459 i, vdev_id_list[i], op_ch_freq_list[i]);
3460 }
3461 }
3462
3463 if (!primary_sta_freq || !secondary_sta_freq) {
3464 mlme_debug("Invalid primary or secondary sta freq");
3465 return -EINVAL;
3466 }
3467
3468 operating_channel = wlan_freq_to_chan(primary_sta_freq);
3469
3470 /*
3471 * The channel numbers for both adapters and the time
3472 * quota for the 1st adapter, i.e., one specified in cmd
3473 * are formatted as a bit vector
3474 * ******************************************************
3475 * |bit 31-24 | bit 23-16 | bits 15-8 |bits 7-0 |
3476 * | Unused | Quota for | chan. # for |chan. # for|
3477 * | | 1st chan | 1st chan. |2nd chan. |
3478 * ******************************************************
3479 */
3480 mlme_debug("First connection channel No.:%d and quota:%dms",
3481 operating_channel, quota_value);
3482 /* Move the time quota for first channel to bits 15-8 */
3483 quota_value = quota_value << 8;
3484 /*
3485 * Store the channel number of 1st channel at bits 7-0
3486 * of the bit vector
3487 */
3488 quota_value |= operating_channel;
3489 /* Second STA Connection */
3490 operating_channel = wlan_freq_to_chan(secondary_sta_freq);
3491 if (!operating_channel)
3492 mlme_debug("Secondary adapter op channel is invalid");
3493 /*
3494 * Now move the time quota and channel number of the
3495 * 1st adapter to bits 23-16 and bits 15-8 of the bit
3496 * vector, respectively.
3497 */
3498 quota_value = quota_value << 8;
3499 /*
3500 * Set the channel number for 2nd MCC vdev at bits
3501 * 7-0 of set_value
3502 */
3503 quota_value |= operating_channel;
3504 mlme_debug("quota value:%x", quota_value);
3505
3506 return quota_value;
3507 }
3508
wlan_mlme_set_enable_bcast_probe_rsp(struct wlan_objmgr_psoc * psoc,bool value)3509 QDF_STATUS wlan_mlme_set_enable_bcast_probe_rsp(struct wlan_objmgr_psoc *psoc,
3510 bool value)
3511 {
3512 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
3513
3514 if (!mlme_obj)
3515 return QDF_STATUS_E_FAILURE;
3516
3517 mlme_obj->cfg.oce.enable_bcast_probe_rsp = value;
3518 return QDF_STATUS_SUCCESS;
3519 }
3520
3521 QDF_STATUS
wlan_mlme_get_sta_miracast_mcc_rest_time(struct wlan_objmgr_psoc * psoc,uint32_t * value)3522 wlan_mlme_get_sta_miracast_mcc_rest_time(struct wlan_objmgr_psoc *psoc,
3523 uint32_t *value)
3524 {
3525 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3526
3527 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3528 if (!mlme_obj)
3529 return QDF_STATUS_E_FAILURE;
3530
3531 *value = mlme_obj->cfg.sta.sta_miracast_mcc_rest_time;
3532
3533 return QDF_STATUS_SUCCESS;
3534 }
3535
3536 QDF_STATUS
wlan_mlme_get_max_modulated_dtim_ms(struct wlan_objmgr_psoc * psoc,uint16_t * value)3537 wlan_mlme_get_max_modulated_dtim_ms(struct wlan_objmgr_psoc *psoc,
3538 uint16_t *value)
3539 {
3540 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3541
3542 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3543 if (!mlme_obj)
3544 return QDF_STATUS_E_FAILURE;
3545
3546 *value = mlme_obj->cfg.sta.max_li_modulated_dtim_time_ms;
3547
3548 return QDF_STATUS_SUCCESS;
3549 }
3550
3551 QDF_STATUS
wlan_mlme_get_scan_probe_unicast_ra(struct wlan_objmgr_psoc * psoc,bool * value)3552 wlan_mlme_get_scan_probe_unicast_ra(struct wlan_objmgr_psoc *psoc,
3553 bool *value)
3554 {
3555 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3556
3557 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3558 if (!mlme_obj)
3559 return QDF_STATUS_E_FAILURE;
3560
3561 *value = mlme_obj->cfg.sta.usr_scan_probe_unicast_ra;
3562
3563 mlme_legacy_debug("scan_probe_unicast_ra %d", *value);
3564
3565 return QDF_STATUS_SUCCESS;
3566 }
3567
3568 QDF_STATUS
wlan_mlme_set_scan_probe_unicast_ra(struct wlan_objmgr_psoc * psoc,bool value)3569 wlan_mlme_set_scan_probe_unicast_ra(struct wlan_objmgr_psoc *psoc,
3570 bool value)
3571 {
3572 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3573
3574 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3575 if (!mlme_obj)
3576 return QDF_STATUS_E_FAILURE;
3577
3578 mlme_legacy_debug("scan_probe_unicast_ra %d", value);
3579 mlme_obj->cfg.sta.usr_scan_probe_unicast_ra = value;
3580
3581 return QDF_STATUS_SUCCESS;
3582 }
3583
3584 QDF_STATUS
wlan_mlme_get_sap_mcc_chnl_avoid(struct wlan_objmgr_psoc * psoc,uint8_t * value)3585 wlan_mlme_get_sap_mcc_chnl_avoid(struct wlan_objmgr_psoc *psoc,
3586 uint8_t *value)
3587 {
3588 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3589
3590 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3591 if (!mlme_obj)
3592 return QDF_STATUS_E_FAILURE;
3593
3594 *value = mlme_obj->cfg.sap_cfg.sap_mcc_chnl_avoid;
3595
3596 return QDF_STATUS_SUCCESS;
3597 }
3598
3599 QDF_STATUS
wlan_mlme_get_mcc_bcast_prob_resp(struct wlan_objmgr_psoc * psoc,uint8_t * value)3600 wlan_mlme_get_mcc_bcast_prob_resp(struct wlan_objmgr_psoc *psoc,
3601 uint8_t *value)
3602 {
3603 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3604
3605 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3606 if (!mlme_obj)
3607 return QDF_STATUS_E_FAILURE;
3608
3609 *value = mlme_obj->cfg.feature_flags.mcc_bcast_prob_rsp;
3610
3611 return QDF_STATUS_SUCCESS;
3612 }
3613
3614 QDF_STATUS
wlan_mlme_get_mcc_rts_cts_prot(struct wlan_objmgr_psoc * psoc,uint8_t * value)3615 wlan_mlme_get_mcc_rts_cts_prot(struct wlan_objmgr_psoc *psoc,
3616 uint8_t *value)
3617 {
3618 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3619
3620 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3621 if (!mlme_obj)
3622 return QDF_STATUS_E_FAILURE;
3623
3624 *value = mlme_obj->cfg.feature_flags.mcc_rts_cts_prot;
3625
3626 return QDF_STATUS_SUCCESS;
3627 }
3628
3629 QDF_STATUS
wlan_mlme_get_mcc_feature(struct wlan_objmgr_psoc * psoc,uint8_t * value)3630 wlan_mlme_get_mcc_feature(struct wlan_objmgr_psoc *psoc,
3631 uint8_t *value)
3632 {
3633 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3634
3635 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3636 if (!mlme_obj)
3637 return QDF_STATUS_E_FAILURE;
3638
3639 *value = mlme_obj->cfg.feature_flags.enable_mcc;
3640
3641 return QDF_STATUS_SUCCESS;
3642 }
3643
wlan_mlme_get_edca_params(struct wlan_mlme_edca_params * edca_params,uint8_t * data,enum e_edca_type edca_ac)3644 QDF_STATUS wlan_mlme_get_edca_params(struct wlan_mlme_edca_params *edca_params,
3645 uint8_t *data, enum e_edca_type edca_ac)
3646 {
3647 qdf_size_t len;
3648
3649 switch (edca_ac) {
3650 case edca_ani_acbe_local:
3651 len = edca_params->ani_acbe_l.len;
3652 wlan_mlme_get_cfg_str(data, &edca_params->ani_acbe_l, &len);
3653 break;
3654
3655 case edca_ani_acbk_local:
3656 len = edca_params->ani_acbk_l.len;
3657 wlan_mlme_get_cfg_str(data, &edca_params->ani_acbk_l, &len);
3658 break;
3659
3660 case edca_ani_acvi_local:
3661 len = edca_params->ani_acvi_l.len;
3662 wlan_mlme_get_cfg_str(data, &edca_params->ani_acvi_l, &len);
3663 break;
3664
3665 case edca_ani_acvo_local:
3666 len = edca_params->ani_acvo_l.len;
3667 wlan_mlme_get_cfg_str(data, &edca_params->ani_acvo_l, &len);
3668 break;
3669
3670 case edca_ani_acbk_bcast:
3671 len = edca_params->ani_acbk_b.len;
3672 wlan_mlme_get_cfg_str(data, &edca_params->ani_acbk_b, &len);
3673 break;
3674
3675 case edca_ani_acbe_bcast:
3676 len = edca_params->ani_acbe_b.len;
3677 wlan_mlme_get_cfg_str(data, &edca_params->ani_acbe_b, &len);
3678 break;
3679
3680 case edca_ani_acvi_bcast:
3681 len = edca_params->ani_acvi_b.len;
3682 wlan_mlme_get_cfg_str(data, &edca_params->ani_acvi_b, &len);
3683 break;
3684
3685 case edca_ani_acvo_bcast:
3686 len = edca_params->ani_acvo_b.len;
3687 wlan_mlme_get_cfg_str(data, &edca_params->ani_acvo_b, &len);
3688 break;
3689
3690 case edca_wme_acbe_local:
3691 len = edca_params->wme_acbe_l.len;
3692 wlan_mlme_get_cfg_str(data, &edca_params->wme_acbe_l, &len);
3693 break;
3694
3695 case edca_wme_acbk_local:
3696 len = edca_params->wme_acbk_l.len;
3697 wlan_mlme_get_cfg_str(data, &edca_params->wme_acbk_l, &len);
3698 break;
3699
3700 case edca_wme_acvi_local:
3701 len = edca_params->wme_acvi_l.len;
3702 wlan_mlme_get_cfg_str(data, &edca_params->wme_acvi_l, &len);
3703 break;
3704
3705 case edca_wme_acvo_local:
3706 len = edca_params->wme_acvo_l.len;
3707 wlan_mlme_get_cfg_str(data, &edca_params->wme_acvo_l, &len);
3708 break;
3709
3710 case edca_wme_acbe_bcast:
3711 len = edca_params->wme_acbe_b.len;
3712 wlan_mlme_get_cfg_str(data, &edca_params->wme_acbe_b, &len);
3713 break;
3714
3715 case edca_wme_acbk_bcast:
3716 len = edca_params->wme_acbk_b.len;
3717 wlan_mlme_get_cfg_str(data, &edca_params->wme_acbk_b, &len);
3718 break;
3719
3720 case edca_wme_acvi_bcast:
3721 len = edca_params->wme_acvi_b.len;
3722 wlan_mlme_get_cfg_str(data, &edca_params->wme_acvi_b, &len);
3723 break;
3724
3725 case edca_wme_acvo_bcast:
3726 len = edca_params->wme_acvo_b.len;
3727 wlan_mlme_get_cfg_str(data, &edca_params->wme_acvo_b, &len);
3728 break;
3729
3730 case edca_etsi_acbe_local:
3731 len = edca_params->etsi_acbe_l.len;
3732 wlan_mlme_get_cfg_str(data, &edca_params->etsi_acbe_l, &len);
3733 break;
3734
3735 case edca_etsi_acbk_local:
3736 len = edca_params->etsi_acbk_l.len;
3737 wlan_mlme_get_cfg_str(data, &edca_params->etsi_acbk_l, &len);
3738 break;
3739
3740 case edca_etsi_acvi_local:
3741 len = edca_params->etsi_acvi_l.len;
3742 wlan_mlme_get_cfg_str(data, &edca_params->etsi_acvi_l, &len);
3743 break;
3744
3745 case edca_etsi_acvo_local:
3746 len = edca_params->etsi_acvo_l.len;
3747 wlan_mlme_get_cfg_str(data, &edca_params->etsi_acvo_l, &len);
3748 break;
3749
3750 case edca_etsi_acbe_bcast:
3751 len = edca_params->etsi_acbe_b.len;
3752 wlan_mlme_get_cfg_str(data, &edca_params->etsi_acbe_b, &len);
3753 break;
3754
3755 case edca_etsi_acbk_bcast:
3756 len = edca_params->etsi_acbk_b.len;
3757 wlan_mlme_get_cfg_str(data, &edca_params->etsi_acbk_b, &len);
3758 break;
3759
3760 case edca_etsi_acvi_bcast:
3761 len = edca_params->etsi_acvi_b.len;
3762 wlan_mlme_get_cfg_str(data, &edca_params->etsi_acvi_b, &len);
3763 break;
3764
3765 case edca_etsi_acvo_bcast:
3766 len = edca_params->etsi_acvo_b.len;
3767 wlan_mlme_get_cfg_str(data, &edca_params->etsi_acvo_b, &len);
3768 break;
3769 default:
3770 mlme_legacy_err("Invalid edca access category");
3771 return QDF_STATUS_E_INVAL;
3772 }
3773 return QDF_STATUS_SUCCESS;
3774 }
3775
mlme_get_wep_key(struct wlan_objmgr_vdev * vdev,struct wlan_mlme_wep_cfg * wep_params,enum wep_key_id wep_keyid,uint8_t * default_key,qdf_size_t * key_len)3776 QDF_STATUS mlme_get_wep_key(struct wlan_objmgr_vdev *vdev,
3777 struct wlan_mlme_wep_cfg *wep_params,
3778 enum wep_key_id wep_keyid, uint8_t *default_key,
3779 qdf_size_t *key_len)
3780 {
3781 struct wlan_crypto_key *crypto_key = NULL;
3782
3783 if (wep_keyid >= WLAN_CRYPTO_MAXKEYIDX) {
3784 mlme_legacy_err("Incorrect wep key index %d", wep_keyid);
3785 return QDF_STATUS_E_INVAL;
3786 }
3787 crypto_key = wlan_crypto_get_key(vdev, wep_keyid);
3788 if (!crypto_key) {
3789 mlme_legacy_err("Crypto KEY not present");
3790 return QDF_STATUS_E_INVAL;
3791 }
3792
3793 if (crypto_key->keylen > WLAN_CRYPTO_KEY_WEP104_LEN) {
3794 mlme_legacy_err("Key too large to hold");
3795 return QDF_STATUS_E_INVAL;
3796 }
3797 *key_len = crypto_key->keylen;
3798 qdf_mem_copy(default_key, &crypto_key->keyval, crypto_key->keylen);
3799
3800 return QDF_STATUS_SUCCESS;
3801 }
3802
3803 QDF_STATUS
wlan_mlme_is_11h_enabled(struct wlan_objmgr_psoc * psoc,bool * value)3804 wlan_mlme_is_11h_enabled(struct wlan_objmgr_psoc *psoc, bool *value)
3805 {
3806 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3807
3808 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3809 if (!mlme_obj)
3810 return QDF_STATUS_E_FAILURE;
3811
3812 *value = mlme_obj->cfg.gen.enabled_11h;
3813
3814 return QDF_STATUS_SUCCESS;
3815 }
3816
3817 QDF_STATUS
wlan_mlme_set_11h_enabled(struct wlan_objmgr_psoc * psoc,bool value)3818 wlan_mlme_set_11h_enabled(struct wlan_objmgr_psoc *psoc, bool value)
3819 {
3820 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3821
3822 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3823 if (!mlme_obj)
3824 return QDF_STATUS_E_FAILURE;
3825
3826 mlme_obj->cfg.gen.enabled_11h = value;
3827
3828 return QDF_STATUS_SUCCESS;
3829 }
3830
3831 QDF_STATUS
wlan_mlme_is_11d_enabled(struct wlan_objmgr_psoc * psoc,bool * value)3832 wlan_mlme_is_11d_enabled(struct wlan_objmgr_psoc *psoc, bool *value)
3833 {
3834 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3835
3836 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3837 if (!mlme_obj)
3838 return QDF_STATUS_E_FAILURE;
3839
3840 *value = mlme_obj->cfg.gen.enabled_11d;
3841
3842 return QDF_STATUS_SUCCESS;
3843 }
3844
3845 QDF_STATUS
wlan_mlme_set_11d_enabled(struct wlan_objmgr_psoc * psoc,bool value)3846 wlan_mlme_set_11d_enabled(struct wlan_objmgr_psoc *psoc, bool value)
3847 {
3848 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3849
3850 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3851 if (!mlme_obj)
3852 return QDF_STATUS_E_FAILURE;
3853
3854 mlme_obj->cfg.gen.enabled_11d = value;
3855
3856 return QDF_STATUS_SUCCESS;
3857 }
3858
3859 QDF_STATUS
wlan_mlme_is_rf_test_mode_enabled(struct wlan_objmgr_psoc * psoc,bool * value)3860 wlan_mlme_is_rf_test_mode_enabled(struct wlan_objmgr_psoc *psoc, bool *value)
3861 {
3862 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3863
3864 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3865 if (!mlme_obj) {
3866 *value = false;
3867 return QDF_STATUS_E_FAILURE;
3868 }
3869
3870 *value = mlme_obj->cfg.gen.enabled_rf_test_mode;
3871
3872 return QDF_STATUS_SUCCESS;
3873 }
3874
3875 QDF_STATUS
wlan_mlme_set_rf_test_mode_enabled(struct wlan_objmgr_psoc * psoc,bool value)3876 wlan_mlme_set_rf_test_mode_enabled(struct wlan_objmgr_psoc *psoc, bool value)
3877 {
3878 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3879
3880 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3881 if (!mlme_obj)
3882 return QDF_STATUS_E_FAILURE;
3883
3884 mlme_obj->cfg.gen.enabled_rf_test_mode = value;
3885
3886 return QDF_STATUS_SUCCESS;
3887 }
3888
3889 #ifdef CONFIG_BAND_6GHZ
3890 QDF_STATUS
wlan_mlme_is_standard_6ghz_conn_policy_enabled(struct wlan_objmgr_psoc * psoc,bool * value)3891 wlan_mlme_is_standard_6ghz_conn_policy_enabled(struct wlan_objmgr_psoc *psoc,
3892 bool *value)
3893 {
3894 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3895
3896 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3897 if (!mlme_obj)
3898 return QDF_STATUS_E_FAILURE;
3899
3900 *value = mlme_obj->cfg.gen.std_6ghz_conn_policy;
3901
3902 return QDF_STATUS_SUCCESS;
3903 }
3904
3905 QDF_STATUS
wlan_mlme_is_disable_vlp_sta_conn_to_sp_ap_enabled(struct wlan_objmgr_psoc * psoc,bool * value)3906 wlan_mlme_is_disable_vlp_sta_conn_to_sp_ap_enabled(
3907 struct wlan_objmgr_psoc *psoc,
3908 bool *value)
3909 {
3910 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3911
3912 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3913 if (!mlme_obj)
3914 return QDF_STATUS_E_FAILURE;
3915
3916 *value = mlme_obj->cfg.gen.disable_vlp_sta_conn_to_sp_ap;
3917
3918 return QDF_STATUS_SUCCESS;
3919 }
3920 #endif
3921
3922 #ifdef WLAN_FEATURE_11BE_MLO
3923 QDF_STATUS
wlan_mlme_get_eht_mode(struct wlan_objmgr_psoc * psoc,enum wlan_eht_mode * value)3924 wlan_mlme_get_eht_mode(struct wlan_objmgr_psoc *psoc, enum wlan_eht_mode *value)
3925 {
3926 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3927
3928 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3929 if (!mlme_obj)
3930 return QDF_STATUS_E_FAILURE;
3931
3932 *value = mlme_obj->cfg.gen.eht_mode;
3933
3934 return QDF_STATUS_SUCCESS;
3935 }
3936
3937 QDF_STATUS
wlan_mlme_get_emlsr_mode_enabled(struct wlan_objmgr_psoc * psoc,bool * value)3938 wlan_mlme_get_emlsr_mode_enabled(struct wlan_objmgr_psoc *psoc, bool *value)
3939 {
3940 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3941
3942 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3943 if (!mlme_obj)
3944 return QDF_STATUS_E_FAILURE;
3945
3946 *value = mlme_obj->cfg.gen.enable_emlsr_mode;
3947
3948 return QDF_STATUS_SUCCESS;
3949 }
3950
3951 QDF_STATUS
wlan_mlme_set_eht_mode(struct wlan_objmgr_psoc * psoc,enum wlan_eht_mode value)3952 wlan_mlme_set_eht_mode(struct wlan_objmgr_psoc *psoc, enum wlan_eht_mode value)
3953 {
3954 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3955
3956 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3957 if (!mlme_obj)
3958 return QDF_STATUS_E_FAILURE;
3959
3960 mlme_obj->cfg.gen.eht_mode = value;
3961
3962 return QDF_STATUS_SUCCESS;
3963 }
3964
3965 QDF_STATUS
wlan_mlme_set_emlsr_mode_enabled(struct wlan_objmgr_psoc * psoc,bool value)3966 wlan_mlme_set_emlsr_mode_enabled(struct wlan_objmgr_psoc *psoc, bool value)
3967 {
3968 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3969
3970 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3971 if (!mlme_obj)
3972 return QDF_STATUS_E_FAILURE;
3973
3974 mlme_obj->cfg.gen.enable_emlsr_mode = value;
3975
3976 return QDF_STATUS_SUCCESS;
3977 }
3978
3979 void
wlan_mlme_set_eml_params(struct wlan_objmgr_psoc * psoc,struct wlan_psoc_host_mac_phy_caps_ext2 * cap)3980 wlan_mlme_set_eml_params(struct wlan_objmgr_psoc *psoc,
3981 struct wlan_psoc_host_mac_phy_caps_ext2 *cap)
3982 {
3983 struct wlan_mlme_psoc_ext_obj *mlme_obj;
3984
3985 if (!cap->emlcap.emlsr_supp) {
3986 mlme_legacy_debug("EMLSR supp: %d", cap->emlcap.emlsr_supp);
3987 return;
3988 }
3989
3990 mlme_obj = mlme_get_psoc_ext_obj(psoc);
3991 if (!mlme_obj) {
3992 mlme_legacy_err("No psoc object");
3993 return;
3994 }
3995 mlme_obj->cfg.eml_cap.emlsr_supp = cap->emlcap.emlsr_supp;
3996 mlme_obj->cfg.eml_cap.emlsr_pad_delay = cap->emlcap.emlsr_pad_delay;
3997 mlme_obj->cfg.eml_cap.emlsr_trans_delay = cap->emlcap.emlsr_trans_delay;
3998 mlme_obj->cfg.eml_cap.emlmr_supp = cap->emlcap.emlmr_supp;
3999 }
4000
4001 void
wlan_mlme_get_eml_params(struct wlan_objmgr_psoc * psoc,struct wlan_mlo_eml_cap * cap)4002 wlan_mlme_get_eml_params(struct wlan_objmgr_psoc *psoc,
4003 struct wlan_mlo_eml_cap *cap)
4004 {
4005 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4006
4007 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4008 if (!mlme_obj) {
4009 mlme_legacy_err("No psoc object");
4010 return;
4011 }
4012 cap->emlsr_supp = mlme_obj->cfg.eml_cap.emlsr_supp;
4013 cap->emlsr_pad_delay = mlme_obj->cfg.eml_cap.emlsr_pad_delay;
4014 cap->emlsr_trans_delay = mlme_obj->cfg.eml_cap.emlsr_trans_delay;
4015 cap->emlmr_supp = mlme_obj->cfg.eml_cap.emlmr_supp;
4016 }
4017
4018 void
wlan_mlme_cfg_set_emlsr_pad_delay(struct wlan_objmgr_psoc * psoc,uint8_t val)4019 wlan_mlme_cfg_set_emlsr_pad_delay(struct wlan_objmgr_psoc *psoc, uint8_t val)
4020 {
4021 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4022
4023 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4024 if (!mlme_obj) {
4025 mlme_legacy_err("No psoc object");
4026 return;
4027 }
4028
4029 if (val > mlme_obj->cfg.eml_cap.emlsr_pad_delay &&
4030 val <= WLAN_ML_BV_CINFO_EMLCAP_EMLSRDELAY_256US) {
4031 mlme_obj->cfg.eml_cap.emlsr_pad_delay = val;
4032 mlme_debug("EMLSR padding delay configured to %d", val);
4033 }
4034 }
4035
4036 enum t2lm_negotiation_support
wlan_mlme_get_t2lm_negotiation_supported(struct wlan_objmgr_psoc * psoc)4037 wlan_mlme_get_t2lm_negotiation_supported(struct wlan_objmgr_psoc *psoc)
4038 {
4039 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4040
4041 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4042 if (!mlme_obj)
4043 return T2LM_NEGOTIATION_DISABLED;
4044
4045 return mlme_obj->cfg.gen.t2lm_negotiation_support;
4046 }
4047
4048 QDF_STATUS
wlan_mlme_set_t2lm_negotiation_supported(struct wlan_objmgr_psoc * psoc,uint8_t value)4049 wlan_mlme_set_t2lm_negotiation_supported(struct wlan_objmgr_psoc *psoc,
4050 uint8_t value)
4051 {
4052 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4053
4054 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4055 if (!mlme_obj)
4056 return QDF_STATUS_E_FAILURE;
4057
4058 if (value > T2LM_NEGOTIATION_MAX) {
4059 mlme_err("Invalid value %d", value);
4060 return QDF_STATUS_E_INVAL;
4061 }
4062
4063 mlme_obj->cfg.gen.t2lm_negotiation_support = value;
4064
4065 return QDF_STATUS_SUCCESS;
4066 }
4067
4068 uint8_t
wlan_mlme_get_eht_mld_id(struct wlan_objmgr_psoc * psoc)4069 wlan_mlme_get_eht_mld_id(struct wlan_objmgr_psoc *psoc)
4070 {
4071 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4072
4073 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4074 if (!mlme_obj)
4075 return 0;
4076
4077 return mlme_obj->cfg.gen.mld_id;
4078 }
4079
4080 QDF_STATUS
wlan_mlme_set_eht_mld_id(struct wlan_objmgr_psoc * psoc,uint8_t value)4081 wlan_mlme_set_eht_mld_id(struct wlan_objmgr_psoc *psoc,
4082 uint8_t value)
4083 {
4084 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4085
4086 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4087 if (!mlme_obj)
4088 return QDF_STATUS_E_FAILURE;
4089
4090 mlme_obj->cfg.gen.mld_id = value;
4091
4092 return QDF_STATUS_SUCCESS;
4093 }
4094 #endif
4095
4096 QDF_STATUS
wlan_mlme_set_btm_abridge_flag(struct wlan_objmgr_psoc * psoc,bool value)4097 wlan_mlme_set_btm_abridge_flag(struct wlan_objmgr_psoc *psoc,
4098 bool value)
4099 {
4100 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4101
4102 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4103 if (!mlme_obj)
4104 return QDF_STATUS_E_FAILURE;
4105
4106 mlme_obj->cfg.btm.abridge_flag = value;
4107
4108 return QDF_STATUS_SUCCESS;
4109 }
4110
4111 bool
wlan_mlme_get_btm_abridge_flag(struct wlan_objmgr_psoc * psoc)4112 wlan_mlme_get_btm_abridge_flag(struct wlan_objmgr_psoc *psoc)
4113 {
4114 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4115
4116 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4117 if (!mlme_obj)
4118 return false;
4119
4120 return mlme_obj->cfg.btm.abridge_flag;
4121 }
4122
4123 QDF_STATUS
wlan_mlme_cfg_set_vht_chan_width(struct wlan_objmgr_psoc * psoc,uint8_t value)4124 wlan_mlme_cfg_set_vht_chan_width(struct wlan_objmgr_psoc *psoc, uint8_t value)
4125 {
4126 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4127
4128 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4129 if (!mlme_obj)
4130 return QDF_STATUS_E_FAILURE;
4131
4132 mlme_obj->cfg.vht_caps.vht_cap_info.supp_chan_width = value;
4133 if (value == VHT_CAP_160_AND_80P80_SUPP ||
4134 value == VHT_CAP_160_SUPP) {
4135 mlme_obj->cfg.vht_caps.vht_cap_info.vht_extended_nss_bw_cap = 1;
4136 mlme_obj->cfg.vht_caps.vht_cap_info.extended_nss_bw_supp = 0;
4137 }
4138
4139 return QDF_STATUS_SUCCESS;
4140 }
4141
4142 QDF_STATUS
wlan_mlme_cfg_get_vht_chan_width(struct wlan_objmgr_psoc * psoc,uint8_t * value)4143 wlan_mlme_cfg_get_vht_chan_width(struct wlan_objmgr_psoc *psoc, uint8_t *value)
4144 {
4145 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4146
4147 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4148 if (!mlme_obj)
4149 return QDF_STATUS_E_FAILURE;
4150
4151 *value = mlme_obj->cfg.vht_caps.vht_cap_info.supp_chan_width;
4152
4153 return QDF_STATUS_SUCCESS;
4154 }
4155
wlan_mlme_cfg_set_vht_ldpc_coding_cap(struct wlan_objmgr_psoc * psoc,bool value)4156 QDF_STATUS wlan_mlme_cfg_set_vht_ldpc_coding_cap(struct wlan_objmgr_psoc *psoc,
4157 bool value)
4158 {
4159 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4160
4161 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4162 if (!mlme_obj)
4163 return QDF_STATUS_E_FAILURE;
4164
4165 mlme_obj->cfg.vht_caps.vht_cap_info.ldpc_coding_cap = value;
4166
4167 return QDF_STATUS_SUCCESS;
4168 }
4169
4170 QDF_STATUS
wlan_mlme_cfg_set_short_gi_160_mhz(struct wlan_objmgr_psoc * psoc,bool value)4171 wlan_mlme_cfg_set_short_gi_160_mhz(struct wlan_objmgr_psoc *psoc,
4172 bool value)
4173 {
4174 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4175
4176 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4177 if (!mlme_obj)
4178 return QDF_STATUS_E_FAILURE;
4179
4180 mlme_obj->cfg.vht_caps.vht_cap_info.short_gi_160mhz = value;
4181
4182 return QDF_STATUS_SUCCESS;
4183 }
4184
4185 QDF_STATUS
wlan_mlme_cfg_get_short_gi_160_mhz(struct wlan_objmgr_psoc * psoc,bool * value)4186 wlan_mlme_cfg_get_short_gi_160_mhz(struct wlan_objmgr_psoc *psoc, bool *value)
4187 {
4188 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4189
4190 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4191 if (!mlme_obj)
4192 return QDF_STATUS_E_FAILURE;
4193
4194 *value = mlme_obj->cfg.vht_caps.vht_cap_info.short_gi_160mhz;
4195
4196 return QDF_STATUS_SUCCESS;
4197 }
4198
4199 QDF_STATUS
wlan_mlme_cfg_get_vht_tx_stbc(struct wlan_objmgr_psoc * psoc,bool * value)4200 wlan_mlme_cfg_get_vht_tx_stbc(struct wlan_objmgr_psoc *psoc, bool *value)
4201 {
4202 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4203
4204 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4205 if (!mlme_obj)
4206 return QDF_STATUS_E_FAILURE;
4207
4208 *value = mlme_obj->cfg.vht_caps.vht_cap_info.tx_stbc;
4209
4210 return QDF_STATUS_SUCCESS;
4211 }
4212
4213 QDF_STATUS
wlan_mlme_cfg_get_vht_rx_stbc(struct wlan_objmgr_psoc * psoc,bool * value)4214 wlan_mlme_cfg_get_vht_rx_stbc(struct wlan_objmgr_psoc *psoc, bool *value)
4215 {
4216 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4217
4218 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4219 if (!mlme_obj)
4220 return QDF_STATUS_E_FAILURE;
4221
4222 *value = mlme_obj->cfg.vht_caps.vht_cap_info.rx_stbc;
4223
4224 return QDF_STATUS_SUCCESS;
4225 }
4226
4227 QDF_STATUS
wlan_mlme_cfg_set_vht_tx_bfee_ant_supp(struct wlan_objmgr_psoc * psoc,uint8_t value)4228 wlan_mlme_cfg_set_vht_tx_bfee_ant_supp(struct wlan_objmgr_psoc *psoc,
4229 uint8_t value)
4230 {
4231 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4232
4233 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4234 if (!mlme_obj)
4235 return QDF_STATUS_E_FAILURE;
4236
4237 mlme_obj->cfg.vht_caps.vht_cap_info.tx_bfee_ant_supp = value;
4238
4239 return QDF_STATUS_SUCCESS;
4240 }
4241
4242 QDF_STATUS
wlan_mlme_cfg_get_vht_tx_bfee_ant_supp(struct wlan_objmgr_psoc * psoc,uint8_t * value)4243 wlan_mlme_cfg_get_vht_tx_bfee_ant_supp(struct wlan_objmgr_psoc *psoc,
4244 uint8_t *value)
4245 {
4246 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4247
4248 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4249 if (!mlme_obj)
4250 return QDF_STATUS_E_FAILURE;
4251
4252 *value = mlme_obj->cfg.vht_caps.vht_cap_info.tx_bfee_ant_supp;
4253
4254 return QDF_STATUS_SUCCESS;
4255 }
4256
wlan_mlme_cfg_get_vht_rx_mcs_map(struct wlan_objmgr_psoc * psoc,uint32_t * value)4257 QDF_STATUS wlan_mlme_cfg_get_vht_rx_mcs_map(struct wlan_objmgr_psoc *psoc,
4258 uint32_t *value)
4259 {
4260 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4261
4262 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4263 if (!mlme_obj)
4264 return QDF_STATUS_E_FAILURE;
4265
4266 *value = mlme_obj->cfg.vht_caps.vht_cap_info.rx_mcs_map;
4267
4268 return QDF_STATUS_SUCCESS;
4269 }
4270
wlan_mlme_cfg_set_vht_rx_mcs_map(struct wlan_objmgr_psoc * psoc,uint32_t value)4271 QDF_STATUS wlan_mlme_cfg_set_vht_rx_mcs_map(struct wlan_objmgr_psoc *psoc,
4272 uint32_t value)
4273 {
4274 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4275
4276 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4277 if (!mlme_obj)
4278 return QDF_STATUS_E_FAILURE;
4279
4280 mlme_obj->cfg.vht_caps.vht_cap_info.rx_mcs_map = value;
4281
4282 return QDF_STATUS_SUCCESS;
4283 }
4284
wlan_mlme_cfg_get_vht_tx_mcs_map(struct wlan_objmgr_psoc * psoc,uint32_t * value)4285 QDF_STATUS wlan_mlme_cfg_get_vht_tx_mcs_map(struct wlan_objmgr_psoc *psoc,
4286 uint32_t *value)
4287 {
4288 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4289
4290 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4291 if (!mlme_obj)
4292 return QDF_STATUS_E_FAILURE;
4293
4294 *value = mlme_obj->cfg.vht_caps.vht_cap_info.tx_mcs_map;
4295
4296 return QDF_STATUS_SUCCESS;
4297 }
4298
wlan_mlme_cfg_set_vht_tx_mcs_map(struct wlan_objmgr_psoc * psoc,uint32_t value)4299 QDF_STATUS wlan_mlme_cfg_set_vht_tx_mcs_map(struct wlan_objmgr_psoc *psoc,
4300 uint32_t value)
4301 {
4302 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4303
4304 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4305 if (!mlme_obj)
4306 return QDF_STATUS_E_FAILURE;
4307
4308 mlme_obj->cfg.vht_caps.vht_cap_info.tx_mcs_map = value;
4309
4310 return QDF_STATUS_SUCCESS;
4311 }
4312
4313 QDF_STATUS
wlan_mlme_cfg_set_vht_rx_supp_data_rate(struct wlan_objmgr_psoc * psoc,uint32_t value)4314 wlan_mlme_cfg_set_vht_rx_supp_data_rate(struct wlan_objmgr_psoc *psoc,
4315 uint32_t value)
4316 {
4317 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4318
4319 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4320 if (!mlme_obj)
4321 return QDF_STATUS_E_FAILURE;
4322
4323 mlme_obj->cfg.vht_caps.vht_cap_info.rx_supp_data_rate = value;
4324
4325 return QDF_STATUS_SUCCESS;
4326 }
4327
4328 QDF_STATUS
wlan_mlme_cfg_set_vht_tx_supp_data_rate(struct wlan_objmgr_psoc * psoc,uint32_t value)4329 wlan_mlme_cfg_set_vht_tx_supp_data_rate(struct wlan_objmgr_psoc *psoc,
4330 uint32_t value)
4331 {
4332 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4333
4334 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4335 if (!mlme_obj)
4336 return QDF_STATUS_E_FAILURE;
4337
4338 mlme_obj->cfg.vht_caps.vht_cap_info.tx_supp_data_rate = value;
4339
4340 return QDF_STATUS_SUCCESS;
4341 }
4342
4343 QDF_STATUS
wlan_mlme_cfg_get_vht_basic_mcs_set(struct wlan_objmgr_psoc * psoc,uint32_t * value)4344 wlan_mlme_cfg_get_vht_basic_mcs_set(struct wlan_objmgr_psoc *psoc,
4345 uint32_t *value)
4346 {
4347 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4348
4349 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4350 if (!mlme_obj)
4351 return QDF_STATUS_E_FAILURE;
4352
4353 *value = mlme_obj->cfg.vht_caps.vht_cap_info.basic_mcs_set;
4354
4355 return QDF_STATUS_SUCCESS;
4356 }
4357
4358 QDF_STATUS
wlan_mlme_cfg_set_vht_basic_mcs_set(struct wlan_objmgr_psoc * psoc,uint32_t value)4359 wlan_mlme_cfg_set_vht_basic_mcs_set(struct wlan_objmgr_psoc *psoc,
4360 uint32_t value)
4361 {
4362 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4363
4364 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4365 if (!mlme_obj)
4366 return QDF_STATUS_E_FAILURE;
4367
4368 mlme_obj->cfg.vht_caps.vht_cap_info.basic_mcs_set = value;
4369
4370 return QDF_STATUS_SUCCESS;
4371 }
4372
4373 QDF_STATUS
wlan_mlme_get_vht_enable_tx_bf(struct wlan_objmgr_psoc * psoc,bool * value)4374 wlan_mlme_get_vht_enable_tx_bf(struct wlan_objmgr_psoc *psoc, bool *value)
4375 {
4376 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4377
4378 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4379 if (!mlme_obj)
4380 return QDF_STATUS_E_FAILURE;
4381
4382 *value = mlme_obj->cfg.vht_caps.vht_cap_info.su_bformee;
4383
4384 return QDF_STATUS_SUCCESS;
4385 }
4386
4387 QDF_STATUS
wlan_mlme_get_vht_tx_su_beamformer(struct wlan_objmgr_psoc * psoc,bool * value)4388 wlan_mlme_get_vht_tx_su_beamformer(struct wlan_objmgr_psoc *psoc, bool *value)
4389 {
4390 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4391
4392 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4393 if (!mlme_obj)
4394 return QDF_STATUS_E_FAILURE;
4395
4396 *value = mlme_obj->cfg.vht_caps.vht_cap_info.su_bformer;
4397
4398 return QDF_STATUS_SUCCESS;
4399 }
4400
4401 QDF_STATUS
wlan_mlme_get_vht_channel_width(struct wlan_objmgr_psoc * psoc,uint8_t * value)4402 wlan_mlme_get_vht_channel_width(struct wlan_objmgr_psoc *psoc, uint8_t *value)
4403 {
4404 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4405
4406 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4407 if (!mlme_obj)
4408 return QDF_STATUS_E_FAILURE;
4409
4410 *value = mlme_obj->cfg.vht_caps.vht_cap_info.channel_width;
4411
4412 return QDF_STATUS_SUCCESS;
4413 }
4414
4415
4416 QDF_STATUS
wlan_mlme_get_vht_rx_mcs_8_9(struct wlan_objmgr_psoc * psoc,uint8_t * value)4417 wlan_mlme_get_vht_rx_mcs_8_9(struct wlan_objmgr_psoc *psoc, uint8_t *value)
4418 {
4419 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4420
4421 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4422 if (!mlme_obj)
4423 return QDF_STATUS_E_FAILURE;
4424
4425 *value = mlme_obj->cfg.vht_caps.vht_cap_info.rx_mcs;
4426
4427 return QDF_STATUS_SUCCESS;
4428 }
4429
4430 QDF_STATUS
wlan_mlme_get_vht_tx_mcs_8_9(struct wlan_objmgr_psoc * psoc,uint8_t * value)4431 wlan_mlme_get_vht_tx_mcs_8_9(struct wlan_objmgr_psoc *psoc, uint8_t *value)
4432 {
4433 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4434
4435 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4436 if (!mlme_obj)
4437 return QDF_STATUS_E_FAILURE;
4438
4439 *value = mlme_obj->cfg.vht_caps.vht_cap_info.tx_mcs;
4440
4441 return QDF_STATUS_SUCCESS;
4442 }
4443
4444 QDF_STATUS
wlan_mlme_get_vht_rx_mcs_2x2(struct wlan_objmgr_psoc * psoc,uint8_t * value)4445 wlan_mlme_get_vht_rx_mcs_2x2(struct wlan_objmgr_psoc *psoc, uint8_t *value)
4446 {
4447 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4448
4449 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4450 if (!mlme_obj)
4451 return QDF_STATUS_E_FAILURE;
4452
4453 *value = mlme_obj->cfg.vht_caps.vht_cap_info.rx_mcs2x2;
4454
4455 return QDF_STATUS_SUCCESS;
4456 }
4457
4458 QDF_STATUS
wlan_mlme_get_vht_tx_mcs_2x2(struct wlan_objmgr_psoc * psoc,uint8_t * value)4459 wlan_mlme_get_vht_tx_mcs_2x2(struct wlan_objmgr_psoc *psoc, uint8_t *value)
4460 {
4461 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4462
4463 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4464 if (!mlme_obj)
4465 return QDF_STATUS_E_FAILURE;
4466
4467 *value = mlme_obj->cfg.vht_caps.vht_cap_info.tx_mcs2x2;
4468
4469 return QDF_STATUS_SUCCESS;
4470 }
4471
4472 QDF_STATUS
wlan_mlme_get_vht20_mcs9(struct wlan_objmgr_psoc * psoc,bool * value)4473 wlan_mlme_get_vht20_mcs9(struct wlan_objmgr_psoc *psoc, bool *value)
4474 {
4475 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4476
4477 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4478 if (!mlme_obj)
4479 return QDF_STATUS_E_FAILURE;
4480
4481 *value = mlme_obj->cfg.vht_caps.vht_cap_info.enable_vht20_mcs9;
4482
4483 return QDF_STATUS_SUCCESS;
4484 }
4485
4486 QDF_STATUS
wlan_mlme_get_indoor_support_for_nan(struct wlan_objmgr_psoc * psoc,bool * value)4487 wlan_mlme_get_indoor_support_for_nan(struct wlan_objmgr_psoc *psoc,
4488 bool *value)
4489 {
4490 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4491
4492 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4493 if (!mlme_obj) {
4494 *value = false;
4495 mlme_legacy_err("Failed to get MLME Obj");
4496 return QDF_STATUS_E_INVAL;
4497 }
4498
4499 *value = mlme_obj->cfg.reg.enable_nan_on_indoor_channels;
4500
4501 return QDF_STATUS_SUCCESS;
4502 }
4503
4504 QDF_STATUS
wlan_mlme_get_srd_master_mode_for_vdev(struct wlan_objmgr_psoc * psoc,enum QDF_OPMODE vdev_opmode,bool * value)4505 wlan_mlme_get_srd_master_mode_for_vdev(struct wlan_objmgr_psoc *psoc,
4506 enum QDF_OPMODE vdev_opmode,
4507 bool *value)
4508 {
4509 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4510
4511 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4512 if (!mlme_obj) {
4513 *value = false;
4514 mlme_legacy_err("Failed to get MLME Obj");
4515 return QDF_STATUS_E_INVAL;
4516 }
4517
4518 switch (vdev_opmode) {
4519 case QDF_SAP_MODE:
4520 *value = mlme_obj->cfg.reg.etsi_srd_chan_in_master_mode &
4521 MLME_SRD_MASTER_MODE_SAP;
4522 break;
4523 case QDF_P2P_GO_MODE:
4524 *value = mlme_obj->cfg.reg.etsi_srd_chan_in_master_mode &
4525 MLME_SRD_MASTER_MODE_P2P_GO;
4526 break;
4527 case QDF_NAN_DISC_MODE:
4528 *value = mlme_obj->cfg.reg.etsi_srd_chan_in_master_mode &
4529 MLME_SRD_MASTER_MODE_NAN;
4530 break;
4531 default:
4532 mlme_legacy_err("Unexpected opmode %d", vdev_opmode);
4533 *value = false;
4534 }
4535
4536 return QDF_STATUS_SUCCESS;
4537 }
4538
4539 QDF_STATUS
wlan_mlme_get_enable_dynamic_nss_chains_cfg(struct wlan_objmgr_psoc * psoc,bool * value)4540 wlan_mlme_get_enable_dynamic_nss_chains_cfg(struct wlan_objmgr_psoc *psoc,
4541 bool *value)
4542 {
4543 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4544
4545 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4546 if (!mlme_obj)
4547 return QDF_STATUS_E_FAILURE;
4548
4549 *value = mlme_obj->cfg.nss_chains_ini_cfg.enable_dynamic_nss_chains_cfg;
4550
4551 return QDF_STATUS_SUCCESS;
4552 }
4553
4554 QDF_STATUS
wlan_mlme_get_restart_sap_on_dynamic_nss_chains_cfg(struct wlan_objmgr_psoc * psoc,bool * value)4555 wlan_mlme_get_restart_sap_on_dynamic_nss_chains_cfg(
4556 struct wlan_objmgr_psoc *psoc,
4557 bool *value)
4558 {
4559 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4560
4561 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4562 if (!mlme_obj)
4563 return QDF_STATUS_E_FAILURE;
4564
4565 *value =
4566 mlme_obj->cfg.nss_chains_ini_cfg.restart_sap_on_dyn_nss_chains_cfg;
4567
4568 return QDF_STATUS_SUCCESS;
4569 }
4570
4571 QDF_STATUS
wlan_mlme_cfg_get_dynamic_nss_chains_support(struct wlan_objmgr_psoc * psoc,bool * value)4572 wlan_mlme_cfg_get_dynamic_nss_chains_support(struct wlan_objmgr_psoc *psoc,
4573 bool *value)
4574 {
4575 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4576
4577 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4578 if (!mlme_obj)
4579 return QDF_STATUS_E_FAILURE;
4580
4581 *value = mlme_obj->cfg.dynamic_nss_chains_support;
4582
4583 return QDF_STATUS_SUCCESS;
4584 }
4585
4586 QDF_STATUS
wlan_mlme_cfg_set_dynamic_nss_chains_support(struct wlan_objmgr_psoc * psoc,bool value)4587 wlan_mlme_cfg_set_dynamic_nss_chains_support(struct wlan_objmgr_psoc *psoc,
4588 bool value)
4589 {
4590 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4591
4592 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4593 if (!mlme_obj)
4594 return QDF_STATUS_E_FAILURE;
4595
4596 mlme_obj->cfg.dynamic_nss_chains_support = value;
4597
4598 return QDF_STATUS_SUCCESS;
4599 }
4600
4601 QDF_STATUS
wlan_mlme_get_vht_enable2x2(struct wlan_objmgr_psoc * psoc,bool * value)4602 wlan_mlme_get_vht_enable2x2(struct wlan_objmgr_psoc *psoc, bool *value)
4603 {
4604 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4605
4606 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4607 if (!mlme_obj)
4608 return QDF_STATUS_E_FAILURE;
4609
4610 *value = mlme_obj->cfg.vht_caps.vht_cap_info.enable2x2;
4611
4612 return QDF_STATUS_SUCCESS;
4613 }
4614
4615 QDF_STATUS
wlan_mlme_get_force_sap_enabled(struct wlan_objmgr_psoc * psoc,bool * value)4616 wlan_mlme_get_force_sap_enabled(struct wlan_objmgr_psoc *psoc, bool *value)
4617 {
4618 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4619
4620 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4621 if (!mlme_obj)
4622 return QDF_STATUS_E_FAILURE;
4623
4624 *value = mlme_obj->cfg.acs.force_sap_start;
4625
4626 return QDF_STATUS_SUCCESS;
4627 }
4628
4629 QDF_STATUS
wlan_mlme_set_vht_enable2x2(struct wlan_objmgr_psoc * psoc,bool value)4630 wlan_mlme_set_vht_enable2x2(struct wlan_objmgr_psoc *psoc, bool value)
4631 {
4632 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4633
4634 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4635 if (!mlme_obj)
4636 return QDF_STATUS_E_FAILURE;
4637
4638 mlme_obj->cfg.vht_caps.vht_cap_info.enable2x2 = value;
4639
4640 return QDF_STATUS_SUCCESS;
4641 }
4642
4643 QDF_STATUS
wlan_mlme_get_vht_enable_paid(struct wlan_objmgr_psoc * psoc,bool * value)4644 wlan_mlme_get_vht_enable_paid(struct wlan_objmgr_psoc *psoc, bool *value)
4645 {
4646 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4647
4648 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4649 if (!mlme_obj)
4650 return QDF_STATUS_E_FAILURE;
4651
4652 *value = mlme_obj->cfg.vht_caps.vht_cap_info.enable_paid;
4653
4654 return QDF_STATUS_SUCCESS;
4655 }
4656
4657 QDF_STATUS
wlan_mlme_get_vht_enable_gid(struct wlan_objmgr_psoc * psoc,bool * value)4658 wlan_mlme_get_vht_enable_gid(struct wlan_objmgr_psoc *psoc, bool *value)
4659 {
4660 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4661
4662 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4663 if (!mlme_obj)
4664 return QDF_STATUS_E_FAILURE;
4665
4666 *value = mlme_obj->cfg.vht_caps.vht_cap_info.enable_gid;
4667
4668 return QDF_STATUS_SUCCESS;
4669 }
4670
4671 QDF_STATUS
wlan_mlme_get_vht_for_24ghz(struct wlan_objmgr_psoc * psoc,bool * value)4672 wlan_mlme_get_vht_for_24ghz(struct wlan_objmgr_psoc *psoc, bool *value)
4673 {
4674 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4675
4676 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4677 if (!mlme_obj)
4678 return QDF_STATUS_E_FAILURE;
4679
4680 *value = mlme_obj->cfg.vht_caps.vht_cap_info.b24ghz_band;
4681
4682 return QDF_STATUS_SUCCESS;
4683 }
4684
4685 QDF_STATUS
wlan_mlme_set_vht_for_24ghz(struct wlan_objmgr_psoc * psoc,bool value)4686 wlan_mlme_set_vht_for_24ghz(struct wlan_objmgr_psoc *psoc, bool value)
4687 {
4688 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4689
4690 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4691 if (!mlme_obj)
4692 return QDF_STATUS_E_FAILURE;
4693
4694 mlme_obj->cfg.vht_caps.vht_cap_info.b24ghz_band = value;
4695
4696 return QDF_STATUS_SUCCESS;
4697 }
4698
4699 QDF_STATUS
wlan_mlme_get_vendor_vht_for_24ghz(struct wlan_objmgr_psoc * psoc,bool * value)4700 wlan_mlme_get_vendor_vht_for_24ghz(struct wlan_objmgr_psoc *psoc, bool *value)
4701 {
4702 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4703
4704 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4705 if (!mlme_obj)
4706 return QDF_STATUS_E_FAILURE;
4707
4708 *value = mlme_obj->cfg.vht_caps.vht_cap_info.vendor_24ghz_band;
4709
4710 return QDF_STATUS_SUCCESS;
4711 }
4712
4713 QDF_STATUS
mlme_update_vht_cap(struct wlan_objmgr_psoc * psoc,struct wma_tgt_vht_cap * cfg)4714 mlme_update_vht_cap(struct wlan_objmgr_psoc *psoc, struct wma_tgt_vht_cap *cfg)
4715 {
4716 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4717 struct mlme_vht_capabilities_info *vht_cap_info;
4718 uint32_t value = 0;
4719 bool hw_rx_ldpc_enabled;
4720
4721 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4722 if (!mlme_obj)
4723 return QDF_STATUS_E_FAILURE;
4724
4725 vht_cap_info = &mlme_obj->cfg.vht_caps.vht_cap_info;
4726
4727 /*
4728 * VHT max MPDU length:
4729 * override if user configured value is too high
4730 * that the target cannot support
4731 */
4732 if (vht_cap_info->ampdu_len > cfg->vht_max_mpdu)
4733 vht_cap_info->ampdu_len = cfg->vht_max_mpdu;
4734 if (vht_cap_info->ampdu_len >= 1)
4735 mlme_obj->cfg.ht_caps.ht_cap_info.maximal_amsdu_size = 1;
4736 value = (CFG_VHT_BASIC_MCS_SET_STADEF & VHT_MCS_1x1) |
4737 vht_cap_info->basic_mcs_set;
4738 if (vht_cap_info->enable2x2)
4739 value = (value & VHT_MCS_2x2) | (vht_cap_info->rx_mcs2x2 << 2);
4740 vht_cap_info->basic_mcs_set = value;
4741
4742 value = (CFG_VHT_RX_MCS_MAP_STADEF & VHT_MCS_1x1) |
4743 vht_cap_info->rx_mcs;
4744
4745 if (vht_cap_info->enable2x2)
4746 value = (value & VHT_MCS_2x2) | (vht_cap_info->rx_mcs2x2 << 2);
4747 vht_cap_info->rx_mcs_map = value;
4748
4749 value = (CFG_VHT_TX_MCS_MAP_STADEF & VHT_MCS_1x1) |
4750 vht_cap_info->tx_mcs;
4751 if (vht_cap_info->enable2x2)
4752 value = (value & VHT_MCS_2x2) | (vht_cap_info->tx_mcs2x2 << 2);
4753 vht_cap_info->tx_mcs_map = value;
4754
4755 /* Set HW RX LDPC capability */
4756 hw_rx_ldpc_enabled = !!cfg->vht_rx_ldpc;
4757 if (vht_cap_info->ldpc_coding_cap && !hw_rx_ldpc_enabled)
4758 vht_cap_info->ldpc_coding_cap = hw_rx_ldpc_enabled;
4759
4760 /* set the Guard interval 80MHz */
4761 if (vht_cap_info->short_gi_80mhz && !cfg->vht_short_gi_80)
4762 vht_cap_info->short_gi_80mhz = cfg->vht_short_gi_80;
4763
4764 /* Set VHT TX/RX STBC cap */
4765 if (vht_cap_info->enable2x2) {
4766 if (vht_cap_info->tx_stbc && !cfg->vht_tx_stbc)
4767 vht_cap_info->tx_stbc = cfg->vht_tx_stbc;
4768
4769 if (vht_cap_info->rx_stbc && !cfg->vht_rx_stbc)
4770 vht_cap_info->rx_stbc = cfg->vht_rx_stbc;
4771 } else {
4772 vht_cap_info->tx_stbc = 0;
4773 vht_cap_info->rx_stbc = 0;
4774 }
4775
4776 /* Set VHT SU Beamformer cap */
4777 if (vht_cap_info->su_bformer && !cfg->vht_su_bformer)
4778 vht_cap_info->su_bformer = cfg->vht_su_bformer;
4779
4780 /* check and update SU BEAMFORMEE capabality */
4781 if (vht_cap_info->su_bformee && !cfg->vht_su_bformee)
4782 vht_cap_info->su_bformee = cfg->vht_su_bformee;
4783
4784 /* Set VHT MU Beamformer cap */
4785 if (vht_cap_info->mu_bformer && !cfg->vht_mu_bformer)
4786 vht_cap_info->mu_bformer = cfg->vht_mu_bformer;
4787
4788 /* Set VHT MU Beamformee cap */
4789 if (vht_cap_info->enable_mu_bformee && !cfg->vht_mu_bformee)
4790 vht_cap_info->enable_mu_bformee = cfg->vht_mu_bformee;
4791
4792 /*
4793 * VHT max AMPDU len exp:
4794 * override if user configured value is too high
4795 * that the target cannot support.
4796 * Even though Rome publish ampdu_len=7, it can
4797 * only support 4 because of some h/w bug.
4798 */
4799 if (vht_cap_info->ampdu_len_exponent > cfg->vht_max_ampdu_len_exp)
4800 vht_cap_info->ampdu_len_exponent = cfg->vht_max_ampdu_len_exp;
4801
4802 /* Set VHT TXOP PS CAP */
4803 if (vht_cap_info->txop_ps && !cfg->vht_txop_ps)
4804 vht_cap_info->txop_ps = cfg->vht_txop_ps;
4805
4806 /* set the Guard interval 160MHz */
4807 if (vht_cap_info->short_gi_160mhz && !cfg->vht_short_gi_160)
4808 vht_cap_info->short_gi_160mhz = cfg->vht_short_gi_160;
4809
4810 if (cfg_get(psoc, CFG_ENABLE_VHT_MCS_10_11))
4811 vht_cap_info->vht_mcs_10_11_supp = cfg->vht_mcs_10_11_supp;
4812
4813 mlme_legacy_debug("vht_mcs_10_11_supp %d",
4814 vht_cap_info->vht_mcs_10_11_supp);
4815
4816 return QDF_STATUS_SUCCESS;
4817 }
4818
mlme_update_nss_vht_cap(struct wlan_objmgr_psoc * psoc)4819 QDF_STATUS mlme_update_nss_vht_cap(struct wlan_objmgr_psoc *psoc)
4820 {
4821 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4822 struct mlme_vht_capabilities_info *vht_cap_info;
4823 uint32_t temp = 0;
4824
4825 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4826 if (!mlme_obj)
4827 return QDF_STATUS_E_FAILURE;
4828
4829 vht_cap_info = &mlme_obj->cfg.vht_caps.vht_cap_info;
4830
4831 temp = vht_cap_info->basic_mcs_set;
4832 temp = (temp & 0xFFFC) | vht_cap_info->rx_mcs;
4833 if (vht_cap_info->enable2x2)
4834 temp = (temp & 0xFFF3) | (vht_cap_info->rx_mcs2x2 << 2);
4835 else
4836 temp |= 0x000C;
4837
4838 vht_cap_info->basic_mcs_set = temp;
4839
4840 temp = vht_cap_info->rx_mcs_map;
4841 temp = (temp & 0xFFFC) | vht_cap_info->rx_mcs;
4842 if (vht_cap_info->enable2x2)
4843 temp = (temp & 0xFFF3) | (vht_cap_info->rx_mcs2x2 << 2);
4844 else
4845 temp |= 0x000C;
4846
4847 vht_cap_info->rx_mcs_map = temp;
4848
4849 temp = vht_cap_info->tx_mcs_map;
4850 temp = (temp & 0xFFFC) | vht_cap_info->tx_mcs;
4851 if (vht_cap_info->enable2x2)
4852 temp = (temp & 0xFFF3) | (vht_cap_info->tx_mcs2x2 << 2);
4853 else
4854 temp |= 0x000C;
4855
4856 vht_cap_info->tx_mcs_map = temp;
4857
4858 return QDF_STATUS_SUCCESS;
4859 }
4860
4861 #ifdef WLAN_FEATURE_11BE
mlme_get_bss_11be_allowed(struct wlan_objmgr_psoc * psoc,struct qdf_mac_addr * bssid,uint8_t * ie_data,uint32_t ie_length)4862 bool mlme_get_bss_11be_allowed(struct wlan_objmgr_psoc *psoc,
4863 struct qdf_mac_addr *bssid,
4864 uint8_t *ie_data,
4865 uint32_t ie_length)
4866 {
4867 struct action_oui_search_attr search_attr;
4868
4869 if (wlan_action_oui_is_empty(psoc, ACTION_OUI_11BE_OUI_ALLOW))
4870 return true;
4871
4872 qdf_mem_zero(&search_attr, sizeof(search_attr));
4873 search_attr.ie_data = ie_data;
4874 search_attr.ie_length = ie_length;
4875 if (wlan_action_oui_search(psoc, &search_attr,
4876 ACTION_OUI_11BE_OUI_ALLOW))
4877 return true;
4878
4879 mlme_legacy_debug("AP not in 11be oui allow list "QDF_MAC_ADDR_FMT,
4880 QDF_MAC_ADDR_REF(bssid->bytes));
4881
4882 return false;
4883 }
4884
wlan_mlme_get_oem_eht_mlo_config(struct wlan_objmgr_psoc * psoc,uint32_t * oem_eht_cfg)4885 QDF_STATUS wlan_mlme_get_oem_eht_mlo_config(struct wlan_objmgr_psoc *psoc,
4886 uint32_t *oem_eht_cfg)
4887 {
4888 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4889
4890 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4891 if (!mlme_obj)
4892 return QDF_STATUS_E_FAILURE;
4893
4894 *oem_eht_cfg = mlme_obj->cfg.gen.oem_eht_mlo_crypto_bitmap;
4895
4896 return QDF_STATUS_SUCCESS;
4897 }
4898 #endif
4899
wlan_mlme_is_sap_uapsd_enabled(struct wlan_objmgr_psoc * psoc,bool * value)4900 QDF_STATUS wlan_mlme_is_sap_uapsd_enabled(struct wlan_objmgr_psoc *psoc,
4901 bool *value)
4902 {
4903 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4904
4905 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4906 if (!mlme_obj)
4907 return QDF_STATUS_E_FAILURE;
4908
4909 *value = mlme_obj->cfg.qos_mlme_params.sap_uapsd_enabled;
4910
4911 return QDF_STATUS_SUCCESS;
4912 }
4913
wlan_mlme_get_dtim_selection_diversity(struct wlan_objmgr_psoc * psoc,uint32_t * dtim_selection_div)4914 QDF_STATUS wlan_mlme_get_dtim_selection_diversity(struct wlan_objmgr_psoc *psoc,
4915 uint32_t *dtim_selection_div)
4916 {
4917 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4918
4919 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4920 if (!mlme_obj) {
4921 *dtim_selection_div = cfg_default(CFG_DTIM_SELECTION_DIVERSITY);
4922 return QDF_STATUS_E_FAILURE;
4923 }
4924
4925 *dtim_selection_div = mlme_obj->cfg.ps_params.dtim_selection_diversity;
4926
4927 return QDF_STATUS_SUCCESS;
4928 }
4929
wlan_mlme_get_bmps_min_listen_interval(struct wlan_objmgr_psoc * psoc,uint32_t * value)4930 QDF_STATUS wlan_mlme_get_bmps_min_listen_interval(struct wlan_objmgr_psoc *psoc,
4931 uint32_t *value)
4932 {
4933 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4934
4935 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4936 if (!mlme_obj) {
4937 *value = cfg_default(CFG_BMPS_MINIMUM_LI);
4938 return QDF_STATUS_E_FAILURE;
4939 }
4940
4941 *value = mlme_obj->cfg.ps_params.bmps_min_listen_interval;
4942
4943 return QDF_STATUS_SUCCESS;
4944 }
4945
wlan_mlme_get_bmps_max_listen_interval(struct wlan_objmgr_psoc * psoc,uint32_t * value)4946 QDF_STATUS wlan_mlme_get_bmps_max_listen_interval(struct wlan_objmgr_psoc *psoc,
4947 uint32_t *value)
4948 {
4949 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4950
4951 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4952 if (!mlme_obj) {
4953 *value = cfg_default(CFG_BMPS_MAXIMUM_LI);
4954 return QDF_STATUS_E_FAILURE;
4955 }
4956
4957 *value = mlme_obj->cfg.ps_params.bmps_max_listen_interval;
4958
4959 return QDF_STATUS_SUCCESS;
4960 }
4961
wlan_mlme_set_sap_uapsd_flag(struct wlan_objmgr_psoc * psoc,bool value)4962 QDF_STATUS wlan_mlme_set_sap_uapsd_flag(struct wlan_objmgr_psoc *psoc,
4963 bool value)
4964 {
4965 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4966
4967 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4968 if (!mlme_obj)
4969 return QDF_STATUS_E_FAILURE;
4970
4971 mlme_obj->cfg.qos_mlme_params.sap_uapsd_enabled &= value;
4972
4973 return QDF_STATUS_SUCCESS;
4974 }
4975
wlan_mlme_get_rrm_enabled(struct wlan_objmgr_psoc * psoc,bool * value)4976 QDF_STATUS wlan_mlme_get_rrm_enabled(struct wlan_objmgr_psoc *psoc,
4977 bool *value)
4978 {
4979 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4980
4981 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4982 if (!mlme_obj)
4983 return QDF_STATUS_E_FAILURE;
4984
4985 *value = mlme_obj->cfg.rrm_config.rrm_enabled;
4986 return QDF_STATUS_SUCCESS;
4987 }
4988
wlan_mlme_get_auto_bmps_timer_value(struct wlan_objmgr_psoc * psoc,uint32_t * value)4989 QDF_STATUS wlan_mlme_get_auto_bmps_timer_value(struct wlan_objmgr_psoc *psoc,
4990 uint32_t *value)
4991 {
4992 struct wlan_mlme_psoc_ext_obj *mlme_obj;
4993
4994 mlme_obj = mlme_get_psoc_ext_obj(psoc);
4995 if (!mlme_obj) {
4996 *value = cfg_default(CFG_AUTO_BMPS_ENABLE_TIMER);
4997 return QDF_STATUS_E_FAILURE;
4998 }
4999
5000 *value = mlme_obj->cfg.ps_params.auto_bmps_timer_val;
5001
5002 return QDF_STATUS_SUCCESS;
5003 }
5004
wlan_mlme_is_bmps_enabled(struct wlan_objmgr_psoc * psoc,bool * value)5005 QDF_STATUS wlan_mlme_is_bmps_enabled(struct wlan_objmgr_psoc *psoc,
5006 bool *value)
5007 {
5008 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5009
5010 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5011 if (!mlme_obj) {
5012 *value = cfg_default(CFG_ENABLE_PS);
5013 return QDF_STATUS_E_FAILURE;
5014 }
5015
5016 *value = mlme_obj->cfg.ps_params.is_bmps_enabled;
5017
5018 return QDF_STATUS_SUCCESS;
5019 }
5020
wlan_mlme_is_imps_enabled(struct wlan_objmgr_psoc * psoc,bool * value)5021 QDF_STATUS wlan_mlme_is_imps_enabled(struct wlan_objmgr_psoc *psoc,
5022 bool *value)
5023 {
5024 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5025
5026 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5027 if (!mlme_obj) {
5028 *value = cfg_default(CFG_ENABLE_IMPS);
5029 return QDF_STATUS_E_FAILURE;
5030 }
5031
5032 *value = mlme_obj->cfg.ps_params.is_imps_enabled;
5033
5034 return QDF_STATUS_SUCCESS;
5035 }
5036
wlan_mlme_override_bmps_imps(struct wlan_objmgr_psoc * psoc)5037 QDF_STATUS wlan_mlme_override_bmps_imps(struct wlan_objmgr_psoc *psoc)
5038 {
5039 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5040
5041 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5042 if (!mlme_obj)
5043 return QDF_STATUS_E_FAILURE;
5044
5045 mlme_obj->cfg.ps_params.is_imps_enabled = 0;
5046 mlme_obj->cfg.ps_params.is_bmps_enabled = 0;
5047
5048 return QDF_STATUS_SUCCESS;
5049 }
5050
wlan_mlme_get_wps_uuid(struct wlan_mlme_wps_params * wps_params,uint8_t * data)5051 void wlan_mlme_get_wps_uuid(struct wlan_mlme_wps_params *wps_params,
5052 uint8_t *data)
5053 {
5054 qdf_size_t len = wps_params->wps_uuid.len;
5055
5056 wlan_mlme_get_cfg_str(data, &wps_params->wps_uuid, &len);
5057 }
5058
5059 QDF_STATUS
wlan_mlme_get_self_gen_frm_pwr(struct wlan_objmgr_psoc * psoc,uint32_t * value)5060 wlan_mlme_get_self_gen_frm_pwr(struct wlan_objmgr_psoc *psoc,
5061 uint32_t *value)
5062 {
5063 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5064
5065 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5066 if (!mlme_obj) {
5067 *value = cfg_default(CFG_SELF_GEN_FRM_PWR);
5068 mlme_legacy_err("Failed to get MLME Obj");
5069 return QDF_STATUS_E_FAILURE;
5070 }
5071
5072 *value = mlme_obj->cfg.reg.self_gen_frm_pwr;
5073
5074 return QDF_STATUS_SUCCESS;
5075 }
5076
5077 QDF_STATUS
wlan_mlme_get_4way_hs_offload(struct wlan_objmgr_psoc * psoc,uint32_t * value)5078 wlan_mlme_get_4way_hs_offload(struct wlan_objmgr_psoc *psoc, uint32_t *value)
5079 {
5080 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5081
5082 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5083 if (!mlme_obj) {
5084 *value = cfg_default(CFG_DISABLE_4WAY_HS_OFFLOAD);
5085 mlme_legacy_err("Failed to get MLME Obj");
5086 return QDF_STATUS_E_FAILURE;
5087 }
5088
5089 *value = mlme_obj->cfg.gen.disable_4way_hs_offload;
5090
5091 return QDF_STATUS_SUCCESS;
5092 }
5093
5094 QDF_STATUS
wlan_mlme_get_bmiss_skip_full_scan_value(struct wlan_objmgr_psoc * psoc,bool * value)5095 wlan_mlme_get_bmiss_skip_full_scan_value(struct wlan_objmgr_psoc *psoc,
5096 bool *value)
5097 {
5098 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5099
5100 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5101 if (!mlme_obj) {
5102 *value = cfg_default(CFG_BMISS_SKIP_FULL_SCAN);
5103 mlme_legacy_err("Failed to get MLME Obj");
5104 return QDF_STATUS_E_FAILURE;
5105 }
5106
5107 *value = mlme_obj->cfg.gen.bmiss_skip_full_scan;
5108
5109 return QDF_STATUS_SUCCESS;
5110 }
5111
mlme_get_peer_phymode(struct wlan_objmgr_psoc * psoc,uint8_t * mac,enum wlan_phymode * peer_phymode)5112 QDF_STATUS mlme_get_peer_phymode(struct wlan_objmgr_psoc *psoc, uint8_t *mac,
5113 enum wlan_phymode *peer_phymode)
5114 {
5115 struct wlan_objmgr_peer *peer;
5116
5117 peer = wlan_objmgr_get_peer_by_mac(psoc, mac, WLAN_MLME_NB_ID);
5118 if (!peer) {
5119 mlme_legacy_err("peer object is null");
5120 return QDF_STATUS_E_NULL_VALUE;
5121 }
5122
5123 *peer_phymode = wlan_peer_get_phymode(peer);
5124 wlan_objmgr_peer_release_ref(peer, WLAN_MLME_NB_ID);
5125
5126 return QDF_STATUS_SUCCESS;
5127 }
5128
mlme_set_tgt_wpa3_roam_cap(struct wlan_objmgr_psoc * psoc,uint32_t akm_bitmap)5129 QDF_STATUS mlme_set_tgt_wpa3_roam_cap(struct wlan_objmgr_psoc *psoc,
5130 uint32_t akm_bitmap)
5131 {
5132 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5133
5134 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5135 if (!mlme_obj)
5136 return QDF_STATUS_E_FAILURE;
5137
5138 mlme_obj->cfg.lfr.fw_akm_bitmap |= akm_bitmap;
5139
5140 return QDF_STATUS_SUCCESS;
5141 }
5142
5143 QDF_STATUS
wlan_mlme_get_ignore_fw_reg_offload_ind(struct wlan_objmgr_psoc * psoc,bool * disabled)5144 wlan_mlme_get_ignore_fw_reg_offload_ind(struct wlan_objmgr_psoc *psoc,
5145 bool *disabled)
5146 {
5147 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5148
5149 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5150
5151 if (!mlme_obj)
5152 return QDF_STATUS_E_FAILURE;
5153
5154 *disabled = mlme_obj->cfg.reg.ignore_fw_reg_offload_ind;
5155 return QDF_STATUS_SUCCESS;
5156 }
5157
mlme_get_roam_status_str(uint32_t roam_status)5158 char *mlme_get_roam_status_str(uint32_t roam_status)
5159 {
5160 switch (roam_status) {
5161 case 0:
5162 return "SUCCESS";
5163 case 1:
5164 return "FAILED";
5165 case 2:
5166 return "NO ROAM";
5167 default:
5168 return "UNKNOWN";
5169 }
5170 }
5171
mlme_get_roam_trigger_str(uint32_t roam_scan_trigger)5172 char *mlme_get_roam_trigger_str(uint32_t roam_scan_trigger)
5173 {
5174 switch (roam_scan_trigger) {
5175 case WMI_ROAM_TRIGGER_REASON_PER:
5176 return "PER";
5177 case WMI_ROAM_TRIGGER_REASON_BMISS:
5178 return "BEACON MISS";
5179 case WMI_ROAM_TRIGGER_REASON_LOW_RSSI:
5180 return "LOW RSSI";
5181 case WMI_ROAM_TRIGGER_REASON_HIGH_RSSI:
5182 return "HIGH RSSI";
5183 case WMI_ROAM_TRIGGER_REASON_PERIODIC:
5184 return "PERIODIC SCAN";
5185 case WMI_ROAM_TRIGGER_REASON_MAWC:
5186 return "MAWC";
5187 case WMI_ROAM_TRIGGER_REASON_DENSE:
5188 return "DENSE ENVIRONMENT";
5189 case WMI_ROAM_TRIGGER_REASON_BACKGROUND:
5190 return "BACKGROUND SCAN";
5191 case WMI_ROAM_TRIGGER_REASON_FORCED:
5192 return "FORCED SCAN";
5193 case WMI_ROAM_TRIGGER_REASON_BTM:
5194 return "BTM TRIGGER";
5195 case WMI_ROAM_TRIGGER_REASON_UNIT_TEST:
5196 return "TEST COMMAND";
5197 case WMI_ROAM_TRIGGER_REASON_BSS_LOAD:
5198 return "HIGH BSS LOAD";
5199 case WMI_ROAM_TRIGGER_REASON_DEAUTH:
5200 return "DEAUTH RECEIVED";
5201 case WMI_ROAM_TRIGGER_REASON_IDLE:
5202 return "IDLE STATE SCAN";
5203 case WMI_ROAM_TRIGGER_REASON_STA_KICKOUT:
5204 return "STA KICKOUT";
5205 case WMI_ROAM_TRIGGER_REASON_ESS_RSSI:
5206 return "ESS RSSI";
5207 case WMI_ROAM_TRIGGER_REASON_WTC_BTM:
5208 return "WTC BTM";
5209 case WMI_ROAM_TRIGGER_REASON_NONE:
5210 return "NONE";
5211 case WMI_ROAM_TRIGGER_REASON_PMK_TIMEOUT:
5212 return "PMK Expired";
5213 case WMI_ROAM_TRIGGER_REASON_BTC:
5214 return "BTC TRIGGER";
5215 default:
5216 return "UNKNOWN";
5217 }
5218 }
5219
mlme_get_converted_timestamp(uint32_t timestamp,char * time)5220 void mlme_get_converted_timestamp(uint32_t timestamp, char *time)
5221 {
5222 uint32_t hr, mins, secs;
5223
5224 secs = timestamp / 1000;
5225 mins = secs / 60;
5226 hr = mins / 60;
5227 qdf_snprint(time, TIME_STRING_LEN, "[%02d:%02d:%02d.%06u]",
5228 (hr % 24), (mins % 60), (secs % 60),
5229 (timestamp % 1000) * 1000);
5230 }
5231
5232 #if defined(WLAN_SAE_SINGLE_PMK) && defined(WLAN_FEATURE_ROAM_OFFLOAD)
wlan_mlme_set_sae_single_pmk_bss_cap(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,bool val)5233 void wlan_mlme_set_sae_single_pmk_bss_cap(struct wlan_objmgr_psoc *psoc,
5234 uint8_t vdev_id, bool val)
5235 {
5236 struct mlme_legacy_priv *mlme_priv;
5237 struct wlan_objmgr_vdev *vdev;
5238
5239 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
5240 WLAN_MLME_OBJMGR_ID);
5241
5242 if (!vdev) {
5243 mlme_err("get vdev failed");
5244 return;
5245 }
5246
5247 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
5248 if (!mlme_priv) {
5249 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
5250 mlme_legacy_err("vdev legacy private object is NULL");
5251 return;
5252 }
5253
5254 mlme_priv->mlme_roam.sae_single_pmk.sae_single_pmk_ap = val;
5255
5256 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
5257 }
5258
wlan_mlme_update_sae_single_pmk(struct wlan_objmgr_vdev * vdev,struct mlme_pmk_info * sae_single_pmk)5259 void wlan_mlme_update_sae_single_pmk(struct wlan_objmgr_vdev *vdev,
5260 struct mlme_pmk_info *sae_single_pmk)
5261 {
5262 struct mlme_legacy_priv *mlme_priv;
5263 int32_t keymgmt;
5264 bool is_sae_connection = false;
5265
5266 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
5267 if (!mlme_priv) {
5268 mlme_legacy_err("vdev legacy private object is NULL");
5269 return;
5270 }
5271
5272 keymgmt = wlan_crypto_get_param(vdev, WLAN_CRYPTO_PARAM_KEY_MGMT);
5273 if (keymgmt < 0) {
5274 mlme_legacy_err("Invalid mgmt cipher");
5275 return;
5276 }
5277
5278 if (QDF_HAS_PARAM(keymgmt, WLAN_CRYPTO_KEY_MGMT_SAE) ||
5279 QDF_HAS_PARAM(keymgmt, WLAN_CRYPTO_KEY_MGMT_SAE_EXT_KEY))
5280 is_sae_connection = true;
5281
5282 mlme_legacy_debug("SAE_SPMK: single_pmk_ap:%d, is_sae_connection:%d, pmk_len:%d",
5283 mlme_priv->mlme_roam.sae_single_pmk.sae_single_pmk_ap,
5284 is_sae_connection, sae_single_pmk->pmk_len);
5285
5286 if (mlme_priv->mlme_roam.sae_single_pmk.sae_single_pmk_ap &&
5287 is_sae_connection)
5288 mlme_priv->mlme_roam.sae_single_pmk.pmk_info = *sae_single_pmk;
5289 }
5290
wlan_mlme_is_sae_single_pmk_enabled(struct wlan_objmgr_psoc * psoc)5291 bool wlan_mlme_is_sae_single_pmk_enabled(struct wlan_objmgr_psoc *psoc)
5292 {
5293 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5294
5295 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5296 if (!mlme_obj)
5297 return cfg_default(CFG_SAE_SINGLE_PMK);
5298
5299 return mlme_obj->cfg.lfr.sae_single_pmk_feature_enabled;
5300 }
5301
wlan_mlme_get_sae_single_pmk_info(struct wlan_objmgr_vdev * vdev,struct wlan_mlme_sae_single_pmk * pmksa)5302 void wlan_mlme_get_sae_single_pmk_info(struct wlan_objmgr_vdev *vdev,
5303 struct wlan_mlme_sae_single_pmk *pmksa)
5304 {
5305 struct mlme_legacy_priv *mlme_priv;
5306 struct mlme_pmk_info *pmk_info;
5307
5308 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
5309 if (!mlme_priv) {
5310 mlme_legacy_err("vdev legacy private object is NULL");
5311 return;
5312 }
5313
5314 pmk_info = &mlme_priv->mlme_roam.sae_single_pmk.pmk_info;
5315
5316 pmksa->sae_single_pmk_ap =
5317 mlme_priv->mlme_roam.sae_single_pmk.sae_single_pmk_ap;
5318 pmksa->pmk_info.spmk_timeout_period = pmk_info->spmk_timeout_period;
5319 pmksa->pmk_info.spmk_timestamp = pmk_info->spmk_timestamp;
5320
5321 if (pmk_info->pmk_len) {
5322 qdf_mem_copy(pmksa->pmk_info.pmk, pmk_info->pmk,
5323 pmk_info->pmk_len);
5324 pmksa->pmk_info.pmk_len = pmk_info->pmk_len;
5325 return;
5326 }
5327
5328 qdf_mem_zero(pmksa->pmk_info.pmk, sizeof(*pmksa->pmk_info.pmk));
5329 pmksa->pmk_info.pmk_len = 0;
5330 }
5331
wlan_mlme_clear_sae_single_pmk_info(struct wlan_objmgr_vdev * vdev,struct mlme_pmk_info * pmk_recv)5332 void wlan_mlme_clear_sae_single_pmk_info(struct wlan_objmgr_vdev *vdev,
5333 struct mlme_pmk_info *pmk_recv)
5334 {
5335 struct mlme_legacy_priv *mlme_priv;
5336 struct wlan_mlme_sae_single_pmk *sae_single_pmk;
5337
5338 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
5339 if (!mlme_priv) {
5340 mlme_legacy_err("vdev legacy private object is NULL");
5341 return;
5342 }
5343
5344 sae_single_pmk = &mlme_priv->mlme_roam.sae_single_pmk;
5345
5346 if (!pmk_recv) {
5347 /* Process flush pmk cmd */
5348 mlme_legacy_debug("Flush sae_single_pmk info");
5349 qdf_mem_zero(&sae_single_pmk->pmk_info,
5350 sizeof(sae_single_pmk->pmk_info));
5351 } else if (pmk_recv->pmk_len != sae_single_pmk->pmk_info.pmk_len) {
5352 mlme_legacy_debug("Invalid pmk len");
5353 return;
5354 } else if (!qdf_mem_cmp(&sae_single_pmk->pmk_info.pmk, pmk_recv->pmk,
5355 pmk_recv->pmk_len)) {
5356 /* Process delete pmk cmd */
5357 mlme_legacy_debug("Clear sae_single_pmk info");
5358 qdf_mem_zero(&sae_single_pmk->pmk_info,
5359 sizeof(sae_single_pmk->pmk_info));
5360 }
5361 }
5362 #endif
5363
mlme_get_roam_fail_reason_str(enum wlan_roam_failure_reason_code result)5364 char *mlme_get_roam_fail_reason_str(enum wlan_roam_failure_reason_code result)
5365 {
5366 switch (result) {
5367 case ROAM_FAIL_REASON_NO_SCAN_START:
5368 return "SCAN NOT STARTED";
5369 case ROAM_FAIL_REASON_NO_AP_FOUND:
5370 return "NO AP FOUND";
5371 case ROAM_FAIL_REASON_NO_CAND_AP_FOUND:
5372 return "NO CANDIDATE FOUND";
5373 case ROAM_FAIL_REASON_HOST:
5374 return "HOST ABORTED";
5375 case ROAM_FAIL_REASON_AUTH_SEND:
5376 return "Send AUTH Failed";
5377 case ROAM_FAIL_REASON_AUTH_RECV:
5378 return "Received AUTH with FAILURE Status";
5379 case ROAM_FAIL_REASON_NO_AUTH_RESP:
5380 return "No Auth response from AP";
5381 case ROAM_FAIL_REASON_REASSOC_SEND:
5382 return "Send Re-assoc request failed";
5383 case ROAM_FAIL_REASON_REASSOC_RECV:
5384 return "Received Re-Assoc resp with Failure status";
5385 case ROAM_FAIL_REASON_NO_REASSOC_RESP:
5386 return "No Re-assoc response from AP";
5387 case ROAM_FAIL_REASON_EAPOL_TIMEOUT:
5388 return "EAPOL M1 timed out";
5389 case ROAM_FAIL_REASON_MLME:
5390 return "MLME error";
5391 case ROAM_FAIL_REASON_INTERNAL_ABORT:
5392 return "Fw aborted roam";
5393 case ROAM_FAIL_REASON_SCAN_START:
5394 return "Unable to start roam scan";
5395 case ROAM_FAIL_REASON_AUTH_NO_ACK:
5396 return "No ACK for Auth req";
5397 case ROAM_FAIL_REASON_AUTH_INTERNAL_DROP:
5398 return "Auth req dropped internally";
5399 case ROAM_FAIL_REASON_REASSOC_NO_ACK:
5400 return "No ACK for Re-assoc req";
5401 case ROAM_FAIL_REASON_REASSOC_INTERNAL_DROP:
5402 return "Re-assoc dropped internally";
5403 case ROAM_FAIL_REASON_EAPOL_M2_SEND:
5404 return "Unable to send M2 frame";
5405 case ROAM_FAIL_REASON_EAPOL_M2_INTERNAL_DROP:
5406 return "M2 Frame dropped internally";
5407 case ROAM_FAIL_REASON_EAPOL_M2_NO_ACK:
5408 return "No ACK for M2 frame";
5409 case ROAM_FAIL_REASON_EAPOL_M3_TIMEOUT:
5410 return "EAPOL M3 timed out";
5411 case ROAM_FAIL_REASON_EAPOL_M4_SEND:
5412 return "Unable to send M4 frame";
5413 case ROAM_FAIL_REASON_EAPOL_M4_INTERNAL_DROP:
5414 return "M4 frame dropped internally";
5415 case ROAM_FAIL_REASON_EAPOL_M4_NO_ACK:
5416 return "No ACK for M4 frame";
5417 case ROAM_FAIL_REASON_NO_SCAN_FOR_FINAL_BMISS:
5418 return "No scan on final BMISS";
5419 case ROAM_FAIL_REASON_DISCONNECT:
5420 return "Disconnect received during handoff";
5421 case ROAM_FAIL_REASON_SYNC:
5422 return "Previous roam sync pending";
5423 case ROAM_FAIL_REASON_SAE_INVALID_PMKID:
5424 return "Reason assoc reject - invalid PMKID";
5425 case ROAM_FAIL_REASON_SAE_PREAUTH_TIMEOUT:
5426 return "SAE preauth timed out";
5427 case ROAM_FAIL_REASON_SAE_PREAUTH_FAIL:
5428 return "SAE preauth failed";
5429 case ROAM_FAIL_REASON_UNABLE_TO_START_ROAM_HO:
5430 return "Start handoff failed- internal error";
5431 case ROAM_FAIL_REASON_NO_AP_FOUND_AND_FINAL_BMISS_SENT:
5432 return "No AP found on final BMISS";
5433 case ROAM_FAIL_REASON_NO_CAND_AP_FOUND_AND_FINAL_BMISS_SENT:
5434 return "No Candidate AP found on final BMISS";
5435 case ROAM_FAIL_REASON_CURR_AP_STILL_OK:
5436 return "CURRENT AP STILL OK";
5437 default:
5438 return "UNKNOWN";
5439 }
5440 }
5441
mlme_get_sub_reason_str(enum roam_trigger_sub_reason sub_reason)5442 char *mlme_get_sub_reason_str(enum roam_trigger_sub_reason sub_reason)
5443 {
5444 switch (sub_reason) {
5445 case ROAM_TRIGGER_SUB_REASON_PERIODIC_TIMER:
5446 return "PERIODIC TIMER";
5447 case ROAM_TRIGGER_SUB_REASON_LOW_RSSI_PERIODIC:
5448 return "LOW RSSI PERIODIC TIMER1";
5449 case ROAM_TRIGGER_SUB_REASON_BTM_DI_TIMER:
5450 return "BTM DISASSOC IMMINENT TIMER";
5451 case ROAM_TRIGGER_SUB_REASON_FULL_SCAN:
5452 return "FULL SCAN";
5453 case ROAM_TRIGGER_SUB_REASON_CU_PERIODIC:
5454 return "CU PERIODIC Timer1";
5455 case ROAM_TRIGGER_SUB_REASON_INACTIVITY_TIMER_LOW_RSSI:
5456 return "LOW RSSI INACTIVE TIMER";
5457 case ROAM_TRIGGER_SUB_REASON_PERIODIC_TIMER_AFTER_INACTIVITY_CU:
5458 return "CU PERIODIC TIMER2";
5459 case ROAM_TRIGGER_SUB_REASON_PERIODIC_TIMER_AFTER_INACTIVITY:
5460 return "LOW RSSI PERIODIC TIMER2";
5461 case ROAM_TRIGGER_SUB_REASON_INACTIVITY_TIMER_CU:
5462 return "CU INACTIVITY TIMER";
5463 default:
5464 return "NONE";
5465 }
5466 }
5467
5468 QDF_STATUS
wlan_mlme_get_mgmt_max_retry(struct wlan_objmgr_psoc * psoc,uint8_t * max_retry)5469 wlan_mlme_get_mgmt_max_retry(struct wlan_objmgr_psoc *psoc,
5470 uint8_t *max_retry)
5471 {
5472 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5473
5474 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5475
5476 if (!mlme_obj) {
5477 *max_retry = cfg_default(CFG_MGMT_RETRY_MAX);
5478 return QDF_STATUS_E_FAILURE;
5479 }
5480
5481 *max_retry = mlme_obj->cfg.gen.mgmt_retry_max;
5482 return QDF_STATUS_SUCCESS;
5483 }
5484
5485 QDF_STATUS
wlan_mlme_get_mgmt_6ghz_rate_support(struct wlan_objmgr_psoc * psoc,bool * enable_he_mcs0_for_6ghz_mgmt)5486 wlan_mlme_get_mgmt_6ghz_rate_support(struct wlan_objmgr_psoc *psoc,
5487 bool *enable_he_mcs0_for_6ghz_mgmt)
5488 {
5489 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5490
5491 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5492
5493 if (!mlme_obj) {
5494 *enable_he_mcs0_for_6ghz_mgmt =
5495 cfg_default(CFG_ENABLE_HE_MCS0_MGMT_6GHZ);
5496 return QDF_STATUS_E_FAILURE;
5497 }
5498
5499 *enable_he_mcs0_for_6ghz_mgmt =
5500 mlme_obj->cfg.gen.enable_he_mcs0_for_6ghz_mgmt;
5501 return QDF_STATUS_SUCCESS;
5502 }
5503
5504 QDF_STATUS
wlan_mlme_get_status_ring_buffer(struct wlan_objmgr_psoc * psoc,bool * enable_ring_buffer)5505 wlan_mlme_get_status_ring_buffer(struct wlan_objmgr_psoc *psoc,
5506 bool *enable_ring_buffer)
5507 {
5508 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5509
5510 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5511
5512 if (!mlme_obj) {
5513 *enable_ring_buffer = cfg_default(CFG_ENABLE_RING_BUFFER);
5514 return QDF_STATUS_E_FAILURE;
5515 }
5516
5517 *enable_ring_buffer = mlme_obj->cfg.gen.enable_ring_buffer;
5518 return QDF_STATUS_SUCCESS;
5519 }
5520
wlan_mlme_get_peer_unmap_conf(struct wlan_objmgr_psoc * psoc)5521 bool wlan_mlme_get_peer_unmap_conf(struct wlan_objmgr_psoc *psoc)
5522 {
5523 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5524
5525 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5526 if (!mlme_obj)
5527 return false;
5528
5529 return mlme_obj->cfg.gen.enable_peer_unmap_conf_support;
5530 }
5531
5532 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
5533 QDF_STATUS
wlan_mlme_get_roam_reason_vsie_status(struct wlan_objmgr_psoc * psoc,uint8_t * roam_reason_vsie_enable)5534 wlan_mlme_get_roam_reason_vsie_status(struct wlan_objmgr_psoc *psoc,
5535 uint8_t *roam_reason_vsie_enable)
5536 {
5537 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5538
5539 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5540 if (!mlme_obj) {
5541 *roam_reason_vsie_enable =
5542 cfg_default(CFG_ENABLE_ROAM_REASON_VSIE);
5543 return QDF_STATUS_E_FAILURE;
5544 }
5545
5546 *roam_reason_vsie_enable = mlme_obj->cfg.lfr.enable_roam_reason_vsie;
5547 return QDF_STATUS_SUCCESS;
5548 }
5549
5550 QDF_STATUS
wlan_mlme_set_roam_reason_vsie_status(struct wlan_objmgr_psoc * psoc,uint8_t roam_reason_vsie_enable)5551 wlan_mlme_set_roam_reason_vsie_status(struct wlan_objmgr_psoc *psoc,
5552 uint8_t roam_reason_vsie_enable)
5553 {
5554 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5555
5556 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5557 if (!mlme_obj)
5558 return QDF_STATUS_E_FAILURE;
5559
5560 mlme_obj->cfg.lfr.enable_roam_reason_vsie = roam_reason_vsie_enable;
5561 return QDF_STATUS_SUCCESS;
5562 }
5563
wlan_mlme_get_roaming_triggers(struct wlan_objmgr_psoc * psoc)5564 uint32_t wlan_mlme_get_roaming_triggers(struct wlan_objmgr_psoc *psoc)
5565 {
5566 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5567
5568 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5569 if (!mlme_obj)
5570 return cfg_default(CFG_ROAM_TRIGGER_BITMAP);
5571
5572 return mlme_obj->cfg.lfr.roam_trigger_bitmap;
5573 }
5574
wlan_mlme_set_roaming_triggers(struct wlan_objmgr_psoc * psoc,uint32_t trigger_bitmap)5575 void wlan_mlme_set_roaming_triggers(struct wlan_objmgr_psoc *psoc,
5576 uint32_t trigger_bitmap)
5577 {
5578 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5579
5580 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5581 if (!mlme_obj)
5582 return;
5583
5584 mlme_obj->cfg.lfr.roam_trigger_bitmap = trigger_bitmap;
5585 }
5586
5587 QDF_STATUS
wlan_mlme_get_roaming_offload(struct wlan_objmgr_psoc * psoc,bool * val)5588 wlan_mlme_get_roaming_offload(struct wlan_objmgr_psoc *psoc,
5589 bool *val)
5590 {
5591 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5592
5593 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5594 if (!mlme_obj) {
5595 *val = cfg_default(CFG_LFR3_ROAMING_OFFLOAD);
5596 return QDF_STATUS_E_INVAL;
5597 }
5598
5599 *val = mlme_obj->cfg.lfr.lfr3_roaming_offload;
5600
5601 return QDF_STATUS_SUCCESS;
5602 }
5603
5604 QDF_STATUS
wlan_mlme_get_enable_disconnect_roam_offload(struct wlan_objmgr_psoc * psoc,bool * val)5605 wlan_mlme_get_enable_disconnect_roam_offload(struct wlan_objmgr_psoc *psoc,
5606 bool *val)
5607 {
5608 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5609
5610 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5611 if (!mlme_obj) {
5612 *val = cfg_default(CFG_LFR_ENABLE_DISCONNECT_ROAM);
5613 return QDF_STATUS_E_INVAL;
5614 }
5615
5616 *val = mlme_obj->cfg.lfr.enable_disconnect_roam_offload;
5617
5618 return QDF_STATUS_SUCCESS;
5619 }
5620
5621 QDF_STATUS
wlan_mlme_get_enable_idle_roam(struct wlan_objmgr_psoc * psoc,bool * val)5622 wlan_mlme_get_enable_idle_roam(struct wlan_objmgr_psoc *psoc, bool *val)
5623 {
5624 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5625
5626 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5627 if (!mlme_obj) {
5628 *val = cfg_default(CFG_LFR_ENABLE_IDLE_ROAM);
5629 return QDF_STATUS_E_INVAL;
5630 }
5631
5632 *val = mlme_obj->cfg.lfr.enable_idle_roam;
5633
5634 return QDF_STATUS_SUCCESS;
5635 }
5636
5637 QDF_STATUS
wlan_mlme_get_idle_roam_rssi_delta(struct wlan_objmgr_psoc * psoc,uint32_t * val)5638 wlan_mlme_get_idle_roam_rssi_delta(struct wlan_objmgr_psoc *psoc, uint32_t *val)
5639 {
5640 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5641
5642 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5643 if (!mlme_obj) {
5644 *val = cfg_default(CFG_LFR_IDLE_ROAM_RSSI_DELTA);
5645 return QDF_STATUS_E_INVAL;
5646 }
5647
5648 *val = mlme_obj->cfg.lfr.idle_roam_rssi_delta;
5649
5650 return QDF_STATUS_SUCCESS;
5651 }
5652
5653 QDF_STATUS
wlan_mlme_get_roam_info_stats_num(struct wlan_objmgr_psoc * psoc,uint32_t * val)5654 wlan_mlme_get_roam_info_stats_num(struct wlan_objmgr_psoc *psoc, uint32_t *val)
5655 {
5656 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5657
5658 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5659 if (!mlme_obj) {
5660 *val = cfg_default(CFG_LFR3_ROAM_INFO_STATS_NUM);
5661 return QDF_STATUS_E_INVAL;
5662 }
5663
5664 *val = mlme_obj->cfg.lfr.roam_info_stats_num;
5665
5666 return QDF_STATUS_SUCCESS;
5667 }
5668
5669 QDF_STATUS
wlan_mlme_get_idle_roam_inactive_time(struct wlan_objmgr_psoc * psoc,uint32_t * val)5670 wlan_mlme_get_idle_roam_inactive_time(struct wlan_objmgr_psoc *psoc,
5671 uint32_t *val)
5672 {
5673 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5674
5675 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5676 if (!mlme_obj) {
5677 *val = cfg_default(CFG_LFR_IDLE_ROAM_INACTIVE_TIME);
5678 return QDF_STATUS_E_INVAL;
5679 }
5680
5681 *val = mlme_obj->cfg.lfr.idle_roam_inactive_time;
5682
5683 return QDF_STATUS_SUCCESS;
5684 }
5685
5686 QDF_STATUS
wlan_mlme_get_idle_data_packet_count(struct wlan_objmgr_psoc * psoc,uint32_t * val)5687 wlan_mlme_get_idle_data_packet_count(struct wlan_objmgr_psoc *psoc,
5688 uint32_t *val)
5689 {
5690 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5691
5692 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5693 if (!mlme_obj) {
5694 *val = cfg_default(CFG_LFR_IDLE_ROAM_PACKET_COUNT);
5695 return QDF_STATUS_E_INVAL;
5696 }
5697
5698 *val = mlme_obj->cfg.lfr.idle_data_packet_count;
5699
5700 return QDF_STATUS_SUCCESS;
5701 }
5702
5703 QDF_STATUS
wlan_mlme_get_idle_roam_min_rssi(struct wlan_objmgr_psoc * psoc,uint32_t * val)5704 wlan_mlme_get_idle_roam_min_rssi(struct wlan_objmgr_psoc *psoc, uint32_t *val)
5705 {
5706 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5707
5708 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5709 if (!mlme_obj) {
5710 *val = cfg_default(CFG_LFR_IDLE_ROAM_MIN_RSSI);
5711 return QDF_STATUS_E_INVAL;
5712 }
5713
5714 *val = mlme_obj->cfg.lfr.idle_roam_min_rssi;
5715
5716 return QDF_STATUS_SUCCESS;
5717 }
5718
5719 QDF_STATUS
wlan_mlme_get_idle_roam_band(struct wlan_objmgr_psoc * psoc,uint32_t * val)5720 wlan_mlme_get_idle_roam_band(struct wlan_objmgr_psoc *psoc, uint32_t *val)
5721 {
5722 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5723
5724 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5725 if (!mlme_obj) {
5726 *val = cfg_default(CFG_LFR_IDLE_ROAM_BAND);
5727 return QDF_STATUS_E_INVAL;
5728 }
5729
5730 *val = mlme_obj->cfg.lfr.idle_roam_band;
5731
5732 return QDF_STATUS_SUCCESS;
5733 }
5734
5735 QDF_STATUS
wlan_mlme_get_self_bss_roam(struct wlan_objmgr_psoc * psoc,uint8_t * enable_self_bss_roam)5736 wlan_mlme_get_self_bss_roam(struct wlan_objmgr_psoc *psoc,
5737 uint8_t *enable_self_bss_roam)
5738 {
5739 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5740
5741 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5742
5743 if (!mlme_obj) {
5744 *enable_self_bss_roam =
5745 cfg_get(psoc, CFG_LFR3_ENABLE_SELF_BSS_ROAM);
5746 return QDF_STATUS_E_FAILURE;
5747 }
5748
5749 *enable_self_bss_roam = mlme_obj->cfg.lfr.enable_self_bss_roam;
5750
5751 return QDF_STATUS_SUCCESS;
5752 }
5753 #endif
5754
5755 QDF_STATUS
wlan_mlme_get_peer_indicated_ch_width(struct wlan_objmgr_psoc * psoc,struct peer_oper_mode_event * data)5756 wlan_mlme_get_peer_indicated_ch_width(struct wlan_objmgr_psoc *psoc,
5757 struct peer_oper_mode_event *data)
5758 {
5759 struct wlan_objmgr_peer *peer;
5760 struct peer_mlme_priv_obj *peer_priv;
5761 QDF_STATUS status = QDF_STATUS_SUCCESS;
5762
5763 if (!data) {
5764 mlme_err("Data params is NULL");
5765 return QDF_STATUS_E_INVAL;
5766 }
5767
5768 peer = wlan_objmgr_get_peer_by_mac(psoc, data->peer_mac_address.bytes,
5769 WLAN_MLME_NB_ID);
5770 if (!peer) {
5771 mlme_err("peer not found for mac: " QDF_MAC_ADDR_FMT,
5772 QDF_MAC_ADDR_REF(data->peer_mac_address.bytes));
5773 return QDF_STATUS_E_NULL_VALUE;
5774 }
5775
5776 peer_priv = wlan_objmgr_peer_get_comp_private_obj(peer,
5777 WLAN_UMAC_COMP_MLME);
5778 if (!peer_priv) {
5779 mlme_err("peer priv not found for mac: " QDF_MAC_ADDR_FMT,
5780 QDF_MAC_ADDR_REF(peer->macaddr));
5781 status = QDF_STATUS_E_NULL_VALUE;
5782 goto done;
5783 }
5784
5785 if (peer_priv->peer_ind_bw == CH_WIDTH_INVALID) {
5786 status = QDF_STATUS_E_INVAL;
5787 goto done;
5788 }
5789
5790 data->new_bw = peer_priv->peer_ind_bw;
5791
5792 done:
5793 wlan_objmgr_peer_release_ref(peer, WLAN_MLME_NB_ID);
5794
5795 return status;
5796 }
5797
5798 QDF_STATUS
wlan_mlme_set_peer_indicated_ch_width(struct wlan_objmgr_psoc * psoc,struct peer_oper_mode_event * data)5799 wlan_mlme_set_peer_indicated_ch_width(struct wlan_objmgr_psoc *psoc,
5800 struct peer_oper_mode_event *data)
5801 {
5802 struct wlan_objmgr_peer *peer;
5803 struct peer_mlme_priv_obj *peer_priv;
5804 QDF_STATUS status = QDF_STATUS_SUCCESS;
5805
5806 if (!data) {
5807 mlme_err("Data params is NULL");
5808 return QDF_STATUS_E_INVAL;
5809 }
5810
5811 peer = wlan_objmgr_get_peer_by_mac(psoc, data->peer_mac_address.bytes,
5812 WLAN_MLME_NB_ID);
5813 if (!peer) {
5814 mlme_err("peer not found for mac: " QDF_MAC_ADDR_FMT,
5815 QDF_MAC_ADDR_REF(data->peer_mac_address.bytes));
5816 return QDF_STATUS_E_NULL_VALUE;
5817 }
5818
5819 peer_priv = wlan_objmgr_peer_get_comp_private_obj(peer,
5820 WLAN_UMAC_COMP_MLME);
5821 if (!peer_priv) {
5822 mlme_err("peer priv not found for mac: " QDF_MAC_ADDR_FMT,
5823 QDF_MAC_ADDR_REF(peer->macaddr));
5824 status = QDF_STATUS_E_NULL_VALUE;
5825 goto done;
5826 }
5827
5828 peer_priv->peer_ind_bw =
5829 target_if_wmi_chan_width_to_phy_ch_width(data->new_bw);
5830
5831 done:
5832 wlan_objmgr_peer_release_ref(peer, WLAN_MLME_NB_ID);
5833
5834 return status;
5835 }
5836
5837 QDF_STATUS
wlan_mlme_set_ft_over_ds(struct wlan_objmgr_psoc * psoc,uint8_t ft_over_ds_enable)5838 wlan_mlme_set_ft_over_ds(struct wlan_objmgr_psoc *psoc,
5839 uint8_t ft_over_ds_enable)
5840 {
5841 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5842
5843 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5844 if (!mlme_obj)
5845 return QDF_STATUS_E_FAILURE;
5846
5847 mlme_obj->cfg.lfr.enable_ft_over_ds = ft_over_ds_enable;
5848 return QDF_STATUS_SUCCESS;
5849 }
5850
5851 QDF_STATUS
wlan_mlme_get_dfs_chan_ageout_time(struct wlan_objmgr_psoc * psoc,uint8_t * dfs_chan_ageout_time)5852 wlan_mlme_get_dfs_chan_ageout_time(struct wlan_objmgr_psoc *psoc,
5853 uint8_t *dfs_chan_ageout_time)
5854 {
5855 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5856
5857 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5858
5859 if (!mlme_obj) {
5860 *dfs_chan_ageout_time =
5861 cfg_default(CFG_DFS_CHAN_AGEOUT_TIME);
5862 return QDF_STATUS_E_FAILURE;
5863 }
5864
5865 *dfs_chan_ageout_time = mlme_obj->cfg.gen.dfs_chan_ageout_time;
5866
5867 return QDF_STATUS_SUCCESS;
5868 }
5869
5870 #ifdef WLAN_FEATURE_SAE
5871
5872 #define NUM_RETRY_BITS 3
5873 #define ROAM_AUTH_INDEX 2
5874 #define ASSOC_INDEX 1
5875 #define AUTH_INDEX 0
5876 #define MAX_RETRIES 2
5877 #define MAX_ROAM_AUTH_RETRIES 1
5878 #define MAX_AUTH_RETRIES 3
5879
5880 QDF_STATUS
wlan_mlme_get_sae_assoc_retry_count(struct wlan_objmgr_psoc * psoc,uint8_t * retry_count)5881 wlan_mlme_get_sae_assoc_retry_count(struct wlan_objmgr_psoc *psoc,
5882 uint8_t *retry_count)
5883 {
5884 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5885
5886 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5887
5888 if (!mlme_obj) {
5889 *retry_count = 0;
5890 return QDF_STATUS_E_FAILURE;
5891 }
5892
5893 *retry_count =
5894 QDF_GET_BITS(mlme_obj->cfg.gen.sae_connect_retries,
5895 ASSOC_INDEX * NUM_RETRY_BITS, NUM_RETRY_BITS);
5896
5897 *retry_count = QDF_MIN(MAX_RETRIES, *retry_count);
5898
5899 return QDF_STATUS_SUCCESS;
5900 }
5901
5902 QDF_STATUS
wlan_mlme_get_sae_auth_retry_count(struct wlan_objmgr_psoc * psoc,uint8_t * retry_count)5903 wlan_mlme_get_sae_auth_retry_count(struct wlan_objmgr_psoc *psoc,
5904 uint8_t *retry_count)
5905 {
5906 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5907
5908 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5909
5910 if (!mlme_obj) {
5911 *retry_count = 0;
5912 return QDF_STATUS_E_FAILURE;
5913 }
5914
5915 *retry_count =
5916 QDF_GET_BITS(mlme_obj->cfg.gen.sae_connect_retries,
5917 AUTH_INDEX * NUM_RETRY_BITS, NUM_RETRY_BITS);
5918
5919 *retry_count = QDF_MIN(MAX_AUTH_RETRIES, *retry_count);
5920
5921 return QDF_STATUS_SUCCESS;
5922 }
5923
5924 QDF_STATUS
wlan_mlme_get_sae_roam_auth_retry_count(struct wlan_objmgr_psoc * psoc,uint8_t * retry_count)5925 wlan_mlme_get_sae_roam_auth_retry_count(struct wlan_objmgr_psoc *psoc,
5926 uint8_t *retry_count)
5927 {
5928 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5929
5930 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5931
5932 if (!mlme_obj) {
5933 *retry_count = 0;
5934 return QDF_STATUS_E_FAILURE;
5935 }
5936
5937 *retry_count =
5938 QDF_GET_BITS(mlme_obj->cfg.gen.sae_connect_retries,
5939 ROAM_AUTH_INDEX * NUM_RETRY_BITS, NUM_RETRY_BITS);
5940
5941 *retry_count = QDF_MIN(MAX_ROAM_AUTH_RETRIES, *retry_count);
5942
5943 return QDF_STATUS_SUCCESS;
5944 }
5945
5946 #endif
5947
5948 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
5949 bool
wlan_mlme_get_dual_sta_roaming_enabled(struct wlan_objmgr_psoc * psoc)5950 wlan_mlme_get_dual_sta_roaming_enabled(struct wlan_objmgr_psoc *psoc)
5951 {
5952 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5953 bool dual_sta_roaming_enabled;
5954
5955 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5956
5957 if (!mlme_obj)
5958 return cfg_default(CFG_ENABLE_DUAL_STA_ROAM_OFFLOAD);
5959
5960 dual_sta_roaming_enabled =
5961 mlme_obj->cfg.lfr.lfr3_roaming_offload &&
5962 mlme_obj->cfg.lfr.lfr3_dual_sta_roaming_enabled &&
5963 wlan_mlme_get_dual_sta_roam_support(psoc) &&
5964 policy_mgr_is_hw_dbs_capable(psoc);
5965
5966 return dual_sta_roaming_enabled;
5967 }
5968 #endif
5969
5970 QDF_STATUS
wlan_mlme_get_roam_scan_offload_enabled(struct wlan_objmgr_psoc * psoc,bool * val)5971 wlan_mlme_get_roam_scan_offload_enabled(struct wlan_objmgr_psoc *psoc,
5972 bool *val)
5973 {
5974 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5975
5976 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5977 if (!mlme_obj) {
5978 *val = cfg_default(CFG_LFR_ROAM_SCAN_OFFLOAD_ENABLED);
5979 return QDF_STATUS_E_INVAL;
5980 }
5981
5982 *val = mlme_obj->cfg.lfr.roam_scan_offload_enabled;
5983
5984 return QDF_STATUS_SUCCESS;
5985 }
5986
5987 QDF_STATUS
wlan_mlme_get_roam_bmiss_final_bcnt(struct wlan_objmgr_psoc * psoc,uint8_t * val)5988 wlan_mlme_get_roam_bmiss_final_bcnt(struct wlan_objmgr_psoc *psoc,
5989 uint8_t *val)
5990 {
5991 struct wlan_mlme_psoc_ext_obj *mlme_obj;
5992
5993 mlme_obj = mlme_get_psoc_ext_obj(psoc);
5994 if (!mlme_obj) {
5995 *val = cfg_default(CFG_LFR_ROAM_BMISS_FINAL_BCNT);
5996 return QDF_STATUS_E_INVAL;
5997 }
5998
5999 *val = mlme_obj->cfg.lfr.roam_bmiss_final_bcnt;
6000
6001 return QDF_STATUS_SUCCESS;
6002 }
6003
6004 QDF_STATUS
wlan_mlme_get_bmiss_timeout_on_wakeup(struct wlan_objmgr_psoc * psoc,uint8_t * val)6005 wlan_mlme_get_bmiss_timeout_on_wakeup(struct wlan_objmgr_psoc *psoc,
6006 uint8_t *val)
6007 {
6008 struct wlan_mlme_psoc_ext_obj *mlme_obj;
6009
6010 mlme_obj = mlme_get_psoc_ext_obj(psoc);
6011 if (!mlme_obj) {
6012 *val = cfg_default(CFG_LFR_BEACONLOSS_TIMEOUT_ON_WAKEUP);
6013 return QDF_STATUS_E_INVAL;
6014 }
6015
6016 *val = mlme_obj->cfg.lfr.beaconloss_timeout_onwakeup;
6017
6018 return QDF_STATUS_SUCCESS;
6019 }
6020
6021 QDF_STATUS
wlan_mlme_get_bmiss_timeout_on_sleep(struct wlan_objmgr_psoc * psoc,uint8_t * val)6022 wlan_mlme_get_bmiss_timeout_on_sleep(struct wlan_objmgr_psoc *psoc,
6023 uint8_t *val)
6024 {
6025 struct wlan_mlme_psoc_ext_obj *mlme_obj;
6026
6027 mlme_obj = mlme_get_psoc_ext_obj(psoc);
6028 if (!mlme_obj) {
6029 *val = cfg_default(CFG_LFR_BEACONLOSS_TIMEOUT_ON_SLEEP);
6030 return QDF_STATUS_E_INVAL;
6031 }
6032
6033 *val = mlme_obj->cfg.lfr.beaconloss_timeout_onsleep;
6034
6035 return QDF_STATUS_SUCCESS;
6036 }
6037
6038 QDF_STATUS
wlan_mlme_get_roam_bmiss_first_bcnt(struct wlan_objmgr_psoc * psoc,uint8_t * val)6039 wlan_mlme_get_roam_bmiss_first_bcnt(struct wlan_objmgr_psoc *psoc,
6040 uint8_t *val)
6041 {
6042 struct wlan_mlme_psoc_ext_obj *mlme_obj;
6043
6044 mlme_obj = mlme_get_psoc_ext_obj(psoc);
6045 if (!mlme_obj) {
6046 *val = cfg_default(CFG_LFR_ROAM_BMISS_FIRST_BCNT);
6047 return QDF_STATUS_E_INVAL;
6048 }
6049
6050 *val = mlme_obj->cfg.lfr.roam_bmiss_first_bcnt;
6051
6052 return QDF_STATUS_SUCCESS;
6053 }
6054
6055 #ifdef WLAN_ADAPTIVE_11R
wlan_mlme_adaptive_11r_enabled(struct wlan_objmgr_psoc * psoc)6056 bool wlan_mlme_adaptive_11r_enabled(struct wlan_objmgr_psoc *psoc)
6057 {
6058 struct wlan_mlme_psoc_ext_obj *mlme_obj;
6059
6060 mlme_obj = mlme_get_psoc_ext_obj(psoc);
6061 if (!mlme_obj)
6062 return cfg_default(CFG_ADAPTIVE_11R);
6063
6064 return mlme_obj->cfg.lfr.enable_adaptive_11r;
6065 }
6066 #endif
6067
6068 QDF_STATUS
wlan_mlme_get_mawc_enabled(struct wlan_objmgr_psoc * psoc,bool * val)6069 wlan_mlme_get_mawc_enabled(struct wlan_objmgr_psoc *psoc, bool *val)
6070 {
6071 struct wlan_mlme_psoc_ext_obj *mlme_obj;
6072
6073 mlme_obj = mlme_get_psoc_ext_obj(psoc);
6074 if (!mlme_obj) {
6075 *val = cfg_default(CFG_LFR_MAWC_FEATURE_ENABLED);
6076 return QDF_STATUS_E_INVAL;
6077 }
6078
6079 *val = mlme_obj->cfg.lfr.mawc_enabled;
6080
6081 return QDF_STATUS_SUCCESS;
6082 }
6083
6084 QDF_STATUS
wlan_mlme_get_mawc_roam_enabled(struct wlan_objmgr_psoc * psoc,bool * val)6085 wlan_mlme_get_mawc_roam_enabled(struct wlan_objmgr_psoc *psoc, bool *val)
6086 {
6087 struct wlan_mlme_psoc_ext_obj *mlme_obj;
6088
6089 mlme_obj = mlme_get_psoc_ext_obj(psoc);
6090 if (!mlme_obj) {
6091 *val = cfg_default(CFG_LFR_MAWC_ROAM_ENABLED);
6092 return QDF_STATUS_E_INVAL;
6093 }
6094
6095 *val = mlme_obj->cfg.lfr.mawc_roam_enabled;
6096
6097 return QDF_STATUS_SUCCESS;
6098 }
6099
6100 QDF_STATUS
wlan_mlme_get_mawc_roam_traffic_threshold(struct wlan_objmgr_psoc * psoc,uint32_t * val)6101 wlan_mlme_get_mawc_roam_traffic_threshold(struct wlan_objmgr_psoc *psoc,
6102 uint32_t *val)
6103 {
6104 struct wlan_mlme_psoc_ext_obj *mlme_obj;
6105
6106 mlme_obj = mlme_get_psoc_ext_obj(psoc);
6107 if (!mlme_obj) {
6108 *val = cfg_default(CFG_LFR_MAWC_ROAM_TRAFFIC_THRESHOLD);
6109 return QDF_STATUS_E_INVAL;
6110 }
6111
6112 *val = mlme_obj->cfg.lfr.mawc_roam_traffic_threshold;
6113
6114 return QDF_STATUS_SUCCESS;
6115 }
6116
6117 QDF_STATUS
wlan_mlme_get_mawc_roam_ap_rssi_threshold(struct wlan_objmgr_psoc * psoc,uint32_t * val)6118 wlan_mlme_get_mawc_roam_ap_rssi_threshold(struct wlan_objmgr_psoc *psoc,
6119 uint32_t *val)
6120 {
6121 struct wlan_mlme_psoc_ext_obj *mlme_obj;
6122
6123 mlme_obj = mlme_get_psoc_ext_obj(psoc);
6124 if (!mlme_obj) {
6125 *val = cfg_default(CFG_LFR_MAWC_ROAM_AP_RSSI_THRESHOLD);
6126 return QDF_STATUS_E_INVAL;
6127 }
6128
6129 *val = mlme_obj->cfg.lfr.mawc_roam_ap_rssi_threshold;
6130
6131 return QDF_STATUS_SUCCESS;
6132 }
6133
6134 QDF_STATUS
wlan_mlme_get_mawc_roam_rssi_high_adjust(struct wlan_objmgr_psoc * psoc,uint8_t * val)6135 wlan_mlme_get_mawc_roam_rssi_high_adjust(struct wlan_objmgr_psoc *psoc,
6136 uint8_t *val)
6137 {
6138 struct wlan_mlme_psoc_ext_obj *mlme_obj;
6139
6140 mlme_obj = mlme_get_psoc_ext_obj(psoc);
6141 if (!mlme_obj) {
6142 *val = cfg_default(CFG_LFR_MAWC_ROAM_RSSI_HIGH_ADJUST);
6143 return QDF_STATUS_E_INVAL;
6144 }
6145
6146 *val = mlme_obj->cfg.lfr.mawc_roam_rssi_high_adjust;
6147
6148 return QDF_STATUS_SUCCESS;
6149 }
6150
6151 QDF_STATUS
wlan_mlme_get_mawc_roam_rssi_low_adjust(struct wlan_objmgr_psoc * psoc,uint8_t * val)6152 wlan_mlme_get_mawc_roam_rssi_low_adjust(struct wlan_objmgr_psoc *psoc,
6153 uint8_t *val)
6154 {
6155 struct wlan_mlme_psoc_ext_obj *mlme_obj;
6156
6157 mlme_obj = mlme_get_psoc_ext_obj(psoc);
6158 if (!mlme_obj) {
6159 *val = cfg_default(CFG_LFR_MAWC_ROAM_RSSI_LOW_ADJUST);
6160 return QDF_STATUS_E_INVAL;
6161 }
6162
6163 *val = mlme_obj->cfg.lfr.mawc_roam_rssi_low_adjust;
6164
6165 return QDF_STATUS_SUCCESS;
6166 }
6167
6168 QDF_STATUS
wlan_mlme_get_bss_load_enabled(struct wlan_objmgr_psoc * psoc,bool * val)6169 wlan_mlme_get_bss_load_enabled(struct wlan_objmgr_psoc *psoc, bool *val)
6170 {
6171 struct wlan_mlme_psoc_ext_obj *mlme_obj;
6172
6173 mlme_obj = mlme_get_psoc_ext_obj(psoc);
6174 if (!mlme_obj) {
6175 *val = cfg_default(CFG_ENABLE_BSS_LOAD_TRIGGERED_ROAM);
6176 return QDF_STATUS_E_INVAL;
6177 }
6178
6179 *val = mlme_obj->cfg.lfr.bss_load_trig.enabled;
6180
6181 return QDF_STATUS_SUCCESS;
6182 }
6183
6184 QDF_STATUS
wlan_mlme_get_bss_load_threshold(struct wlan_objmgr_psoc * psoc,uint32_t * val)6185 wlan_mlme_get_bss_load_threshold(struct wlan_objmgr_psoc *psoc, uint32_t *val)
6186 {
6187 struct wlan_mlme_psoc_ext_obj *mlme_obj;
6188
6189 mlme_obj = mlme_get_psoc_ext_obj(psoc);
6190 if (!mlme_obj) {
6191 *val = cfg_default(CFG_BSS_LOAD_THRESHOLD);
6192 return QDF_STATUS_E_INVAL;
6193 }
6194
6195 *val = mlme_obj->cfg.lfr.bss_load_trig.threshold;
6196
6197 return QDF_STATUS_SUCCESS;
6198 }
6199
6200 QDF_STATUS
wlan_mlme_get_bss_load_sample_time(struct wlan_objmgr_psoc * psoc,uint32_t * val)6201 wlan_mlme_get_bss_load_sample_time(struct wlan_objmgr_psoc *psoc,
6202 uint32_t *val)
6203 {
6204 struct wlan_mlme_psoc_ext_obj *mlme_obj;
6205
6206 mlme_obj = mlme_get_psoc_ext_obj(psoc);
6207 if (!mlme_obj) {
6208 *val = cfg_default(CFG_BSS_LOAD_SAMPLE_TIME);
6209 return QDF_STATUS_E_INVAL;
6210 }
6211
6212 *val = mlme_obj->cfg.lfr.bss_load_trig.sample_time;
6213
6214 return QDF_STATUS_SUCCESS;
6215 }
6216
6217 QDF_STATUS
wlan_mlme_get_bss_load_rssi_threshold_6ghz(struct wlan_objmgr_psoc * psoc,int32_t * val)6218 wlan_mlme_get_bss_load_rssi_threshold_6ghz(struct wlan_objmgr_psoc *psoc,
6219 int32_t *val)
6220 {
6221 struct wlan_mlme_psoc_ext_obj *mlme_obj;
6222
6223 mlme_obj = mlme_get_psoc_ext_obj(psoc);
6224 if (!mlme_obj) {
6225 *val = cfg_default(CFG_BSS_LOAD_TRIG_6G_RSSI_THRES);
6226 return QDF_STATUS_E_INVAL;
6227 }
6228
6229 *val = mlme_obj->cfg.lfr.bss_load_trig.rssi_threshold_6ghz;
6230
6231 return QDF_STATUS_SUCCESS;
6232 }
6233
6234 QDF_STATUS
wlan_mlme_get_bss_load_rssi_threshold_5ghz(struct wlan_objmgr_psoc * psoc,int32_t * val)6235 wlan_mlme_get_bss_load_rssi_threshold_5ghz(struct wlan_objmgr_psoc *psoc,
6236 int32_t *val)
6237 {
6238 struct wlan_mlme_psoc_ext_obj *mlme_obj;
6239
6240 mlme_obj = mlme_get_psoc_ext_obj(psoc);
6241 if (!mlme_obj) {
6242 *val = cfg_default(CFG_BSS_LOAD_TRIG_5G_RSSI_THRES);
6243 return QDF_STATUS_E_INVAL;
6244 }
6245
6246 *val = mlme_obj->cfg.lfr.bss_load_trig.rssi_threshold_5ghz;
6247
6248 return QDF_STATUS_SUCCESS;
6249 }
6250
6251 QDF_STATUS
wlan_mlme_get_bss_load_rssi_threshold_24ghz(struct wlan_objmgr_psoc * psoc,int32_t * val)6252 wlan_mlme_get_bss_load_rssi_threshold_24ghz(struct wlan_objmgr_psoc *psoc,
6253 int32_t *val)
6254 {
6255 struct wlan_mlme_psoc_ext_obj *mlme_obj;
6256
6257 mlme_obj = mlme_get_psoc_ext_obj(psoc);
6258 if (!mlme_obj) {
6259 *val = cfg_default(CFG_BSS_LOAD_TRIG_2G_RSSI_THRES);
6260 return QDF_STATUS_E_INVAL;
6261 }
6262
6263 *val = mlme_obj->cfg.lfr.bss_load_trig.rssi_threshold_24ghz;
6264
6265 return QDF_STATUS_SUCCESS;
6266 }
6267
6268 bool
wlan_mlme_check_chan_param_has_dfs(struct wlan_objmgr_pdev * pdev,struct ch_params * ch_params,uint32_t chan_freq)6269 wlan_mlme_check_chan_param_has_dfs(struct wlan_objmgr_pdev *pdev,
6270 struct ch_params *ch_params,
6271 uint32_t chan_freq)
6272 {
6273 bool is_dfs = false;
6274
6275 if (ch_params->ch_width == CH_WIDTH_160MHZ) {
6276 wlan_reg_set_create_punc_bitmap(ch_params, true);
6277 if (wlan_reg_get_5g_bonded_channel_state_for_pwrmode(pdev,
6278 chan_freq,
6279 ch_params,
6280 REG_CURRENT_PWR_MODE) ==
6281 CHANNEL_STATE_DFS)
6282 is_dfs = true;
6283 } else if (ch_params->ch_width == CH_WIDTH_80P80MHZ) {
6284 if (wlan_reg_get_channel_state_for_pwrmode(
6285 pdev,
6286 chan_freq,
6287 REG_CURRENT_PWR_MODE) == CHANNEL_STATE_DFS ||
6288 wlan_reg_get_channel_state_for_pwrmode(
6289 pdev,
6290 ch_params->mhz_freq_seg1,
6291 REG_CURRENT_PWR_MODE) == CHANNEL_STATE_DFS)
6292 is_dfs = true;
6293 } else if (wlan_reg_is_dfs_for_freq(pdev, chan_freq)) {
6294 /*Indoor channels are also marked DFS, therefore
6295 * check if the channel has REGULATORY_CHAN_RADAR
6296 * channel flag to identify if the channel is DFS
6297 */
6298 is_dfs = true;
6299 }
6300
6301 if (WLAN_REG_IS_6GHZ_CHAN_FREQ(chan_freq) ||
6302 WLAN_REG_IS_24GHZ_CH_FREQ(chan_freq))
6303 is_dfs = false;
6304
6305 return is_dfs;
6306 }
6307
6308 QDF_STATUS
wlan_mlme_set_usr_disabled_roaming(struct wlan_objmgr_psoc * psoc,bool val)6309 wlan_mlme_set_usr_disabled_roaming(struct wlan_objmgr_psoc *psoc, bool val)
6310 {
6311 struct wlan_mlme_psoc_ext_obj *mlme_obj;
6312
6313 mlme_obj = mlme_get_psoc_ext_obj(psoc);
6314 if (!mlme_obj)
6315 return QDF_STATUS_E_FAILURE;
6316
6317 mlme_obj->cfg.sta.usr_disabled_roaming = val;
6318
6319 return QDF_STATUS_SUCCESS;
6320 }
6321
6322 QDF_STATUS
wlan_mlme_get_usr_disabled_roaming(struct wlan_objmgr_psoc * psoc,bool * val)6323 wlan_mlme_get_usr_disabled_roaming(struct wlan_objmgr_psoc *psoc, bool *val)
6324 {
6325 struct wlan_mlme_psoc_ext_obj *mlme_obj;
6326
6327 mlme_obj = mlme_get_psoc_ext_obj(psoc);
6328 if (!mlme_obj)
6329 return QDF_STATUS_E_INVAL;
6330
6331 *val = mlme_obj->cfg.sta.usr_disabled_roaming;
6332
6333 return QDF_STATUS_SUCCESS;
6334 }
6335
mlme_get_opr_rate(struct wlan_objmgr_vdev * vdev,uint8_t * dst,qdf_size_t len)6336 qdf_size_t mlme_get_opr_rate(struct wlan_objmgr_vdev *vdev, uint8_t *dst,
6337 qdf_size_t len)
6338 {
6339 struct mlme_legacy_priv *mlme_priv;
6340
6341 if (!vdev || !dst || !len) {
6342 mlme_legacy_err("invalid params");
6343 return 0;
6344 }
6345
6346 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
6347 if (!mlme_priv) {
6348 mlme_legacy_err("vdev legacy private object is NULL");
6349 return 0;
6350 }
6351
6352 if (len < mlme_priv->opr_rate_set.len) {
6353 mlme_legacy_err("Invalid length %zd (<%zd)", len,
6354 mlme_priv->opr_rate_set.len);
6355 return 0;
6356 }
6357
6358 qdf_mem_copy(dst, mlme_priv->opr_rate_set.data,
6359 mlme_priv->opr_rate_set.len);
6360
6361 return mlme_priv->opr_rate_set.len;
6362 }
6363
mlme_set_opr_rate(struct wlan_objmgr_vdev * vdev,uint8_t * src,qdf_size_t len)6364 QDF_STATUS mlme_set_opr_rate(struct wlan_objmgr_vdev *vdev, uint8_t *src,
6365 qdf_size_t len)
6366 {
6367 struct mlme_legacy_priv *mlme_priv;
6368
6369 if (!vdev || !src) {
6370 mlme_legacy_err("invalid params");
6371 return QDF_STATUS_E_INVAL;
6372 }
6373
6374 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
6375 if (!mlme_priv) {
6376 mlme_legacy_err("vdev legacy private object is NULL");
6377 return QDF_STATUS_E_FAILURE;
6378 }
6379
6380 if (len > mlme_priv->opr_rate_set.max_len) {
6381 mlme_legacy_err("Invalid len %zd (>%zd)", len,
6382 mlme_priv->opr_rate_set.max_len);
6383 return QDF_STATUS_E_INVAL;
6384 }
6385
6386 mlme_priv->opr_rate_set.len = len;
6387 qdf_mem_copy(mlme_priv->opr_rate_set.data, src, len);
6388
6389 return QDF_STATUS_SUCCESS;
6390 }
6391
mlme_get_ext_opr_rate(struct wlan_objmgr_vdev * vdev,uint8_t * dst,qdf_size_t len)6392 qdf_size_t mlme_get_ext_opr_rate(struct wlan_objmgr_vdev *vdev, uint8_t *dst,
6393 qdf_size_t len)
6394 {
6395 struct mlme_legacy_priv *mlme_priv;
6396
6397 if (!vdev || !dst || !len) {
6398 mlme_legacy_err("invalid params");
6399 return 0;
6400 }
6401
6402 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
6403 if (!mlme_priv) {
6404 mlme_legacy_err("vdev legacy private object is NULL");
6405 return 0;
6406 }
6407
6408 if (len < mlme_priv->ext_opr_rate_set.len) {
6409 mlme_legacy_err("Invalid length %zd (<%zd)", len,
6410 mlme_priv->ext_opr_rate_set.len);
6411 return 0;
6412 }
6413
6414 qdf_mem_copy(dst, mlme_priv->ext_opr_rate_set.data,
6415 mlme_priv->ext_opr_rate_set.len);
6416
6417 return mlme_priv->ext_opr_rate_set.len;
6418 }
6419
mlme_set_ext_opr_rate(struct wlan_objmgr_vdev * vdev,uint8_t * src,qdf_size_t len)6420 QDF_STATUS mlme_set_ext_opr_rate(struct wlan_objmgr_vdev *vdev, uint8_t *src,
6421 qdf_size_t len)
6422 {
6423 struct mlme_legacy_priv *mlme_priv;
6424
6425 if (!vdev || !src) {
6426 mlme_legacy_err("invalid params");
6427 return QDF_STATUS_E_INVAL;
6428 }
6429
6430 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
6431 if (!mlme_priv) {
6432 mlme_legacy_err("vdev legacy private object is NULL");
6433 return QDF_STATUS_E_FAILURE;
6434 }
6435
6436 if (len > mlme_priv->ext_opr_rate_set.max_len) {
6437 mlme_legacy_err("Invalid len %zd (>%zd)", len,
6438 mlme_priv->ext_opr_rate_set.max_len);
6439 return QDF_STATUS_E_INVAL;
6440 }
6441
6442 mlme_priv->ext_opr_rate_set.len = len;
6443 qdf_mem_copy(mlme_priv->ext_opr_rate_set.data, src, len);
6444
6445 return QDF_STATUS_SUCCESS;
6446 }
6447
mlme_clear_ext_opr_rate(struct wlan_objmgr_vdev * vdev)6448 QDF_STATUS mlme_clear_ext_opr_rate(struct wlan_objmgr_vdev *vdev)
6449 {
6450 struct mlme_legacy_priv *mlme_priv;
6451
6452 if (!vdev) {
6453 mlme_legacy_err("invalid params");
6454 return QDF_STATUS_E_INVAL;
6455 }
6456
6457 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
6458 if (!mlme_priv) {
6459 mlme_legacy_err("vdev legacy private object is NULL");
6460 return QDF_STATUS_E_FAILURE;
6461 }
6462
6463 mlme_priv->ext_opr_rate_set.len = 0;
6464 qdf_mem_set(mlme_priv->ext_opr_rate_set.data, CFG_STR_DATA_LEN, 0);
6465
6466 return QDF_STATUS_SUCCESS;
6467 }
6468
mlme_get_mcs_rate(struct wlan_objmgr_vdev * vdev,uint8_t * dst,qdf_size_t len)6469 qdf_size_t mlme_get_mcs_rate(struct wlan_objmgr_vdev *vdev, uint8_t *dst,
6470 qdf_size_t len)
6471 {
6472 struct mlme_legacy_priv *mlme_priv;
6473
6474 if (!vdev || !dst || !len) {
6475 mlme_legacy_err("invalid params");
6476 return 0;
6477 }
6478
6479 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
6480 if (!mlme_priv) {
6481 mlme_legacy_err("vdev legacy private object is NULL");
6482 return 0;
6483 }
6484
6485 if (len < mlme_priv->mcs_rate_set.len) {
6486 mlme_legacy_err("Invalid length %zd (<%zd)", len,
6487 mlme_priv->mcs_rate_set.len);
6488 return 0;
6489 }
6490
6491 qdf_mem_copy(dst, mlme_priv->mcs_rate_set.data,
6492 mlme_priv->mcs_rate_set.len);
6493
6494 return mlme_priv->mcs_rate_set.len;
6495 }
6496
mlme_set_mcs_rate(struct wlan_objmgr_vdev * vdev,uint8_t * src,qdf_size_t len)6497 QDF_STATUS mlme_set_mcs_rate(struct wlan_objmgr_vdev *vdev, uint8_t *src,
6498 qdf_size_t len)
6499 {
6500 struct mlme_legacy_priv *mlme_priv;
6501
6502 if (!vdev || !src) {
6503 mlme_legacy_err("invalid params");
6504 return QDF_STATUS_E_INVAL;
6505 }
6506
6507 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
6508 if (!mlme_priv) {
6509 mlme_legacy_err("vdev legacy private object is NULL");
6510 return QDF_STATUS_E_FAILURE;
6511 }
6512
6513 if (len > mlme_priv->mcs_rate_set.max_len) {
6514 mlme_legacy_err("Invalid len %zd (>%zd)", len,
6515 mlme_priv->mcs_rate_set.max_len);
6516 return QDF_STATUS_E_INVAL;
6517 }
6518
6519 mlme_priv->mcs_rate_set.len = len;
6520 qdf_mem_copy(mlme_priv->mcs_rate_set.data, src, len);
6521
6522 return QDF_STATUS_SUCCESS;
6523 }
6524
mlme_clear_mcs_rate(struct wlan_objmgr_vdev * vdev)6525 QDF_STATUS mlme_clear_mcs_rate(struct wlan_objmgr_vdev *vdev)
6526 {
6527 struct mlme_legacy_priv *mlme_priv;
6528
6529 if (!vdev) {
6530 mlme_legacy_err("invalid params");
6531 return QDF_STATUS_E_INVAL;
6532 }
6533
6534 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
6535 if (!mlme_priv) {
6536 mlme_legacy_err("vdev legacy private object is NULL");
6537 return QDF_STATUS_E_FAILURE;
6538 }
6539
6540 mlme_priv->mcs_rate_set.len = 0;
6541 qdf_mem_set(mlme_priv->mcs_rate_set.data, CFG_STR_DATA_LEN, 0);
6542
6543 return QDF_STATUS_SUCCESS;
6544 }
6545
6546 static enum monitor_mode_concurrency
wlan_mlme_get_monitor_mode_concurrency(struct wlan_objmgr_psoc * psoc)6547 wlan_mlme_get_monitor_mode_concurrency(struct wlan_objmgr_psoc *psoc)
6548 {
6549 struct wlan_mlme_psoc_ext_obj *mlme_obj;
6550
6551 mlme_obj = mlme_get_psoc_ext_obj(psoc);
6552 if (!mlme_obj)
6553 return cfg_default(CFG_MONITOR_MODE_CONCURRENCY);
6554
6555 return mlme_obj->cfg.gen.monitor_mode_concurrency;
6556 }
6557
6558 #ifdef FEATURE_WDS
6559 enum wlan_wds_mode
wlan_mlme_get_wds_mode(struct wlan_objmgr_psoc * psoc)6560 wlan_mlme_get_wds_mode(struct wlan_objmgr_psoc *psoc)
6561 {
6562 struct wlan_mlme_psoc_ext_obj *mlme_obj;
6563
6564 mlme_obj = mlme_get_psoc_ext_obj(psoc);
6565 if (!mlme_obj)
6566 return cfg_default(CFG_WDS_MODE);
6567
6568 return mlme_obj->cfg.gen.wds_mode;
6569 }
6570
wlan_mlme_set_wds_mode(struct wlan_objmgr_psoc * psoc,enum wlan_wds_mode mode)6571 void wlan_mlme_set_wds_mode(struct wlan_objmgr_psoc *psoc,
6572 enum wlan_wds_mode mode)
6573 {
6574 struct wlan_mlme_psoc_ext_obj *mlme_obj;
6575
6576 mlme_obj = mlme_get_psoc_ext_obj(psoc);
6577 if (!mlme_obj)
6578 return;
6579 if (mode <= WLAN_WDS_MODE_MAX)
6580 mlme_obj->cfg.gen.wds_mode = mode;
6581 }
6582 #endif
6583
wlan_mlme_is_sta_mon_conc_supported(struct wlan_objmgr_psoc * psoc)6584 bool wlan_mlme_is_sta_mon_conc_supported(struct wlan_objmgr_psoc *psoc)
6585 {
6586 if (wlan_mlme_get_monitor_mode_concurrency(psoc) ==
6587 MONITOR_MODE_CONC_STA_SCAN_MON)
6588 return true;
6589
6590 return false;
6591 }
6592
wlan_mlme_skip_tpe(struct wlan_objmgr_psoc * psoc)6593 bool wlan_mlme_skip_tpe(struct wlan_objmgr_psoc *psoc)
6594 {
6595 struct wlan_mlme_psoc_ext_obj *mlme_obj;
6596
6597 mlme_obj = mlme_get_psoc_ext_obj(psoc);
6598 if (!mlme_obj)
6599 return false;
6600
6601 return mlme_obj->cfg.power.skip_tpe;
6602 }
6603
6604 #ifdef WLAN_FEATURE_11BE
mlme_cfg_get_orig_eht_caps(struct wlan_objmgr_psoc * psoc,tDot11fIEeht_cap * eht_cap)6605 QDF_STATUS mlme_cfg_get_orig_eht_caps(struct wlan_objmgr_psoc *psoc,
6606 tDot11fIEeht_cap *eht_cap)
6607 {
6608 struct wlan_mlme_psoc_ext_obj *mlme_obj;
6609
6610 mlme_obj = mlme_get_psoc_ext_obj(psoc);
6611 if (!mlme_obj)
6612 return QDF_STATUS_E_FAILURE;
6613
6614 *eht_cap = mlme_obj->cfg.eht_caps.eht_cap_orig;
6615
6616 return QDF_STATUS_SUCCESS;
6617 }
6618
mlme_cfg_get_eht_caps(struct wlan_objmgr_psoc * psoc,tDot11fIEeht_cap * eht_cap)6619 QDF_STATUS mlme_cfg_get_eht_caps(struct wlan_objmgr_psoc *psoc,
6620 tDot11fIEeht_cap *eht_cap)
6621 {
6622 struct wlan_mlme_psoc_ext_obj *mlme_obj;
6623
6624 mlme_obj = mlme_get_psoc_ext_obj(psoc);
6625 if (!mlme_obj)
6626 return QDF_STATUS_E_FAILURE;
6627
6628 *eht_cap = mlme_obj->cfg.eht_caps.dot11_eht_cap;
6629
6630 return QDF_STATUS_SUCCESS;
6631 }
6632 #endif
6633
6634 QDF_STATUS
wlan_mlme_set_ba_2k_jump_iot_ap(struct wlan_objmgr_vdev * vdev,bool found)6635 wlan_mlme_set_ba_2k_jump_iot_ap(struct wlan_objmgr_vdev *vdev, bool found)
6636 {
6637 struct mlme_legacy_priv *mlme_priv;
6638
6639 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
6640 if (!mlme_priv) {
6641 mlme_legacy_err("vdev legacy private object is NULL");
6642 return QDF_STATUS_E_FAILURE;
6643 }
6644
6645 mlme_priv->ba_2k_jump_iot_ap = found;
6646
6647 return QDF_STATUS_SUCCESS;
6648 }
6649
wlan_mlme_is_ba_2k_jump_iot_ap(struct wlan_objmgr_vdev * vdev)6650 bool wlan_mlme_is_ba_2k_jump_iot_ap(struct wlan_objmgr_vdev *vdev)
6651 {
6652 struct mlme_legacy_priv *mlme_priv;
6653
6654 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
6655 if (!mlme_priv) {
6656 mlme_legacy_err("vdev legacy private object is NULL");
6657 return false;
6658 }
6659
6660 return mlme_priv->ba_2k_jump_iot_ap;
6661 }
6662
6663 QDF_STATUS
wlan_mlme_set_last_delba_sent_time(struct wlan_objmgr_vdev * vdev,qdf_time_t delba_sent_time)6664 wlan_mlme_set_last_delba_sent_time(struct wlan_objmgr_vdev *vdev,
6665 qdf_time_t delba_sent_time)
6666 {
6667 struct mlme_legacy_priv *mlme_priv;
6668
6669 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
6670 if (!mlme_priv) {
6671 mlme_legacy_err("vdev legacy private object is NULL");
6672 return QDF_STATUS_E_FAILURE;
6673 }
6674
6675 mlme_priv->last_delba_sent_time = delba_sent_time;
6676
6677 return QDF_STATUS_SUCCESS;
6678 }
6679
6680 qdf_time_t
wlan_mlme_get_last_delba_sent_time(struct wlan_objmgr_vdev * vdev)6681 wlan_mlme_get_last_delba_sent_time(struct wlan_objmgr_vdev *vdev)
6682 {
6683 struct mlme_legacy_priv *mlme_priv;
6684
6685 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
6686 if (!mlme_priv) {
6687 mlme_legacy_err("vdev legacy private object is NULL");
6688 return 0;
6689 }
6690
6691 return mlme_priv->last_delba_sent_time;
6692 }
6693
mlme_set_user_ps(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,bool ps_enable)6694 QDF_STATUS mlme_set_user_ps(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
6695 bool ps_enable)
6696 {
6697 struct wlan_objmgr_vdev *vdev;
6698 struct mlme_legacy_priv *mlme_priv;
6699 QDF_STATUS status = QDF_STATUS_E_FAILURE;
6700
6701 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
6702 WLAN_MLME_OBJMGR_ID);
6703 if (!vdev)
6704 return status;
6705
6706 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
6707 if (mlme_priv) {
6708 mlme_priv->is_usr_ps_enabled = ps_enable;
6709 status = QDF_STATUS_SUCCESS;
6710 mlme_legacy_debug("vdev:%d user PS:%d", vdev_id,
6711 mlme_priv->is_usr_ps_enabled);
6712 }
6713
6714 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
6715
6716 return status;
6717 }
6718
mlme_get_user_ps(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id)6719 bool mlme_get_user_ps(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id)
6720 {
6721 struct wlan_objmgr_vdev *vdev;
6722 struct mlme_legacy_priv *mlme_priv;
6723 bool usr_ps_enable = false;
6724
6725 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
6726 WLAN_MLME_OBJMGR_ID);
6727 if (!vdev)
6728 return false;
6729
6730 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
6731 if (mlme_priv)
6732 usr_ps_enable = mlme_priv->is_usr_ps_enabled;
6733
6734 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
6735
6736 return usr_ps_enable;
6737 }
6738
wlan_mlme_is_multipass_sap(struct wlan_objmgr_psoc * psoc)6739 bool wlan_mlme_is_multipass_sap(struct wlan_objmgr_psoc *psoc)
6740 {
6741 struct target_psoc_info *info;
6742
6743 info = wlan_psoc_get_tgt_if_handle(psoc);
6744 if (!info) {
6745 mlme_legacy_err("target_psoc_info is null");
6746 return QDF_STATUS_E_FAILURE;
6747 }
6748
6749 return target_is_multipass_sap(info);
6750 }
6751
wlan_mlme_get_phy_max_freq_range(struct wlan_objmgr_psoc * psoc,uint32_t * low_2ghz_chan,uint32_t * high_2ghz_chan,uint32_t * low_5ghz_chan,uint32_t * high_5ghz_chan)6752 QDF_STATUS wlan_mlme_get_phy_max_freq_range(struct wlan_objmgr_psoc *psoc,
6753 uint32_t *low_2ghz_chan,
6754 uint32_t *high_2ghz_chan,
6755 uint32_t *low_5ghz_chan,
6756 uint32_t *high_5ghz_chan)
6757 {
6758 uint32_t i;
6759 uint32_t reg_low_2ghz_chan;
6760 uint32_t reg_high_2ghz_chan;
6761 uint32_t reg_low_5ghz_chan;
6762 uint32_t reg_high_5ghz_chan;
6763 struct target_psoc_info *info;
6764 struct wlan_psoc_host_mac_phy_caps *mac_phy_cap;
6765 struct wlan_psoc_host_hal_reg_cap_ext *reg_cap_ext;
6766
6767 info = wlan_psoc_get_tgt_if_handle(psoc);
6768 if (!info) {
6769 mlme_legacy_err("target_psoc_info is null");
6770 return QDF_STATUS_E_FAILURE;
6771 }
6772 mac_phy_cap = info->info.mac_phy_cap;
6773 reg_cap_ext = &mac_phy_cap->reg_cap_ext;
6774 reg_low_2ghz_chan = reg_cap_ext->low_2ghz_chan;
6775 reg_high_2ghz_chan = reg_cap_ext->high_2ghz_chan;
6776 reg_low_5ghz_chan = reg_cap_ext->low_5ghz_chan;
6777 reg_high_5ghz_chan = reg_cap_ext->high_5ghz_chan;
6778 for (i = 1; i < PSOC_MAX_MAC_PHY_CAP; i++) {
6779 mac_phy_cap = &info->info.mac_phy_cap[i];
6780 reg_cap_ext = &mac_phy_cap->reg_cap_ext;
6781
6782 if (reg_cap_ext->low_2ghz_chan) {
6783 reg_low_2ghz_chan = reg_low_2ghz_chan ?
6784 QDF_MIN(reg_cap_ext->low_2ghz_chan,
6785 reg_low_2ghz_chan) :
6786 reg_cap_ext->low_2ghz_chan;
6787 }
6788 if (reg_cap_ext->high_2ghz_chan) {
6789 reg_high_2ghz_chan = reg_high_2ghz_chan ?
6790 QDF_MAX(reg_cap_ext->high_2ghz_chan,
6791 reg_high_2ghz_chan) :
6792 reg_cap_ext->high_2ghz_chan;
6793 }
6794 if (reg_cap_ext->low_5ghz_chan) {
6795 reg_low_5ghz_chan = reg_low_5ghz_chan ?
6796 QDF_MIN(reg_cap_ext->low_5ghz_chan,
6797 reg_low_5ghz_chan) :
6798 reg_cap_ext->low_5ghz_chan;
6799 }
6800 if (reg_cap_ext->high_5ghz_chan) {
6801 reg_high_5ghz_chan = reg_high_5ghz_chan ?
6802 QDF_MAX(reg_cap_ext->high_5ghz_chan,
6803 reg_high_5ghz_chan) :
6804 reg_cap_ext->high_5ghz_chan;
6805 }
6806 }
6807 /* For old hw, no reg_cap_ext reported from service ready ext,
6808 * fill the low/high with default of regulatory.
6809 */
6810 if (!reg_low_2ghz_chan && !reg_high_2ghz_chan &&
6811 !reg_low_5ghz_chan && !reg_high_5ghz_chan) {
6812 mlme_legacy_debug("no reg_cap_ext in mac_phy_cap");
6813 reg_low_2ghz_chan = TWOG_STARTING_FREQ - 10;
6814 reg_high_2ghz_chan = TWOG_CHAN_14_IN_MHZ + 10;
6815 reg_low_5ghz_chan = FIVEG_STARTING_FREQ - 10;
6816 reg_high_5ghz_chan = SIXG_CHAN_233_IN_MHZ + 10;
6817 }
6818 if (!wlan_reg_is_6ghz_supported(psoc)) {
6819 mlme_legacy_debug("disabling 6ghz channels");
6820 reg_high_5ghz_chan = FIVEG_CHAN_177_IN_MHZ + 10;
6821 }
6822 mlme_legacy_debug("%d %d %d %d", reg_low_2ghz_chan, reg_high_2ghz_chan,
6823 reg_low_5ghz_chan, reg_high_5ghz_chan);
6824 *low_2ghz_chan = reg_low_2ghz_chan;
6825 *high_2ghz_chan = reg_high_2ghz_chan;
6826 *low_5ghz_chan = reg_low_5ghz_chan;
6827 *high_5ghz_chan = reg_high_5ghz_chan;
6828
6829 return QDF_STATUS_SUCCESS;
6830 }
6831
6832 #ifdef WLAN_FEATURE_P2P_P2P_STA
6833 bool
wlan_mlme_get_p2p_p2p_conc_support(struct wlan_objmgr_psoc * psoc)6834 wlan_mlme_get_p2p_p2p_conc_support(struct wlan_objmgr_psoc *psoc)
6835 {
6836 return wlan_psoc_nif_fw_ext_cap_get(psoc,
6837 WLAN_SOC_EXT_P2P_P2P_CONC_SUPPORT);
6838 }
6839 #endif
6840
mlme_get_vht_ch_width(void)6841 enum phy_ch_width mlme_get_vht_ch_width(void)
6842 {
6843 enum phy_ch_width bandwidth = CH_WIDTH_INVALID;
6844 uint32_t fw_ch_wd = wma_get_vht_ch_width();
6845
6846 if (fw_ch_wd == WNI_CFG_VHT_CHANNEL_WIDTH_80_PLUS_80MHZ)
6847 bandwidth = CH_WIDTH_80P80MHZ;
6848 else if (fw_ch_wd == WNI_CFG_VHT_CHANNEL_WIDTH_160MHZ)
6849 bandwidth = CH_WIDTH_160MHZ;
6850 else
6851 bandwidth = CH_WIDTH_80MHZ;
6852
6853 return bandwidth;
6854 }
6855
6856 uint8_t
wlan_mlme_get_mgmt_hw_tx_retry_count(struct wlan_objmgr_psoc * psoc,enum mlme_cfg_frame_type frm_type)6857 wlan_mlme_get_mgmt_hw_tx_retry_count(struct wlan_objmgr_psoc *psoc,
6858 enum mlme_cfg_frame_type frm_type)
6859 {
6860 struct wlan_mlme_psoc_ext_obj *mlme_obj;
6861
6862 mlme_obj = mlme_get_psoc_ext_obj(psoc);
6863
6864 if (!mlme_obj)
6865 return 0;
6866
6867 if (frm_type >= CFG_FRAME_TYPE_MAX)
6868 return 0;
6869
6870 return mlme_obj->cfg.gen.mgmt_hw_tx_retry_count[frm_type];
6871 }
6872
6873 QDF_STATUS
wlan_mlme_get_tx_retry_multiplier(struct wlan_objmgr_psoc * psoc,uint32_t * tx_retry_multiplier)6874 wlan_mlme_get_tx_retry_multiplier(struct wlan_objmgr_psoc *psoc,
6875 uint32_t *tx_retry_multiplier)
6876 {
6877 struct wlan_mlme_psoc_ext_obj *mlme_obj;
6878
6879 mlme_obj = mlme_get_psoc_ext_obj(psoc);
6880
6881 if (!mlme_obj) {
6882 *tx_retry_multiplier =
6883 cfg_default(CFG_TX_RETRY_MULTIPLIER);
6884 return QDF_STATUS_E_FAILURE;
6885 }
6886
6887 *tx_retry_multiplier = mlme_obj->cfg.gen.tx_retry_multiplier;
6888 return QDF_STATUS_SUCCESS;
6889 }
6890
6891 QDF_STATUS
wlan_mlme_get_update_chan_width_allowed(struct wlan_objmgr_psoc * psoc,bool * value)6892 wlan_mlme_get_update_chan_width_allowed(struct wlan_objmgr_psoc *psoc,
6893 bool *value)
6894 {
6895 struct wlan_mlme_psoc_ext_obj *mlme_obj;
6896
6897 mlme_obj = mlme_get_psoc_ext_obj(psoc);
6898 if (!mlme_obj) {
6899 *value = cfg_default(CFG_ALLOW_UPDATE_CHANNEL_WIDTH);
6900 return QDF_STATUS_E_INVAL;
6901 }
6902
6903 *value = mlme_obj->cfg.feature_flags.update_cw_allowed;
6904
6905 return QDF_STATUS_SUCCESS;
6906 }
6907
6908 QDF_STATUS
wlan_mlme_get_channel_bonding_5ghz(struct wlan_objmgr_psoc * psoc,uint32_t * value)6909 wlan_mlme_get_channel_bonding_5ghz(struct wlan_objmgr_psoc *psoc,
6910 uint32_t *value)
6911 {
6912 struct wlan_mlme_psoc_ext_obj *mlme_obj;
6913
6914 mlme_obj = mlme_get_psoc_ext_obj(psoc);
6915 if (!mlme_obj) {
6916 *value = cfg_default(CFG_CHANNEL_BONDING_MODE_5GHZ);
6917 return QDF_STATUS_E_INVAL;
6918 }
6919
6920 *value = mlme_obj->cfg.feature_flags.channel_bonding_mode_5ghz;
6921
6922 return QDF_STATUS_SUCCESS;
6923 }
6924
6925 QDF_STATUS
wlan_mlme_update_ratemask_params(struct wlan_objmgr_vdev * vdev,uint8_t num_ratemask,struct config_ratemask_params * rate_params)6926 wlan_mlme_update_ratemask_params(struct wlan_objmgr_vdev *vdev,
6927 uint8_t num_ratemask,
6928 struct config_ratemask_params *rate_params)
6929 {
6930 struct vdev_mlme_obj *vdev_mlme;
6931 struct vdev_mlme_rate_info *rate_info;
6932 QDF_STATUS ret;
6933 uint8_t i = 0;
6934 uint8_t index;
6935
6936 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
6937 if (!vdev_mlme)
6938 return QDF_STATUS_E_FAILURE;
6939
6940 rate_info = &vdev_mlme->mgmt.rate_info;
6941 while (i < num_ratemask) {
6942 index = rate_params[i].type;
6943 if (index >= WLAN_VDEV_RATEMASK_TYPE_MAX) {
6944 mlme_legacy_err("Invalid ratemask type");
6945 ++i;
6946 continue;
6947 }
6948
6949 if (rate_info->ratemask_params[index].lower32 !=
6950 rate_params[i].lower32 ||
6951 rate_info->ratemask_params[index].lower32_2 !=
6952 rate_params[i].lower32_2 ||
6953 rate_info->ratemask_params[index].higher32 !=
6954 rate_params[i].higher32 ||
6955 rate_info->ratemask_params[index].higher32_2 !=
6956 rate_params[i].higher32_2) {
6957 rate_info->ratemask_params[index].lower32 =
6958 rate_params[i].lower32;
6959 rate_info->ratemask_params[index].higher32 =
6960 rate_params[i].higher32;
6961 rate_info->ratemask_params[index].lower32_2 =
6962 rate_params[i].lower32_2;
6963 rate_info->ratemask_params[index].higher32_2 =
6964 rate_params[i].higher32_2;
6965 ret = wlan_util_vdev_mlme_set_ratemask_config(vdev_mlme,
6966 index);
6967 if (ret != QDF_STATUS_SUCCESS)
6968 mlme_legacy_err("ratemask config failed");
6969 } else {
6970 mlme_legacy_debug("Ratemask same as configured mask");
6971 }
6972 ++i;
6973 }
6974 return QDF_STATUS_SUCCESS;
6975 }
6976
wlan_mlme_is_channel_valid(struct wlan_objmgr_psoc * psoc,uint32_t chan_freq)6977 bool wlan_mlme_is_channel_valid(struct wlan_objmgr_psoc *psoc,
6978 uint32_t chan_freq)
6979 {
6980 struct wlan_mlme_psoc_ext_obj *mlme_obj;
6981
6982 mlme_obj = mlme_get_psoc_ext_obj(psoc);
6983 if (!mlme_obj)
6984 return false;
6985
6986 return wlan_roam_is_channel_valid(&mlme_obj->cfg.reg,
6987 chan_freq);
6988 }
6989
6990 #ifdef WLAN_FEATURE_MCC_QUOTA
6991 #define WLAN_MCC_MIN_QUOTA 10 /* in %age */
6992 #define WLAN_MCC_MAX_QUOTA 90 /* in %age */
wlan_mlme_set_user_mcc_quota(struct wlan_objmgr_psoc * psoc,struct wlan_user_mcc_quota * quota)6993 QDF_STATUS wlan_mlme_set_user_mcc_quota(struct wlan_objmgr_psoc *psoc,
6994 struct wlan_user_mcc_quota *quota)
6995
6996 {
6997 struct wlan_mlme_psoc_ext_obj *mlme_obj;
6998
6999 if (!quota)
7000 return QDF_STATUS_E_NULL_VALUE;
7001
7002 mlme_obj = mlme_get_psoc_ext_obj(psoc);
7003 if (!mlme_obj)
7004 return QDF_STATUS_E_FAILURE;
7005
7006 if (quota->quota < WLAN_MCC_MIN_QUOTA)
7007 quota->quota = WLAN_MCC_MIN_QUOTA;
7008 else if (quota->quota > WLAN_MCC_MAX_QUOTA)
7009 quota->quota = WLAN_MCC_MAX_QUOTA;
7010
7011 mlme_obj->cfg.gen.user_mcc_quota.quota = quota->quota;
7012 mlme_obj->cfg.gen.user_mcc_quota.op_mode = quota->op_mode;
7013 mlme_obj->cfg.gen.user_mcc_quota.vdev_id = quota->vdev_id;
7014
7015 mlme_debug("quota : %u, op_mode : %d, vdev_id : %u",
7016 quota->quota, quota->op_mode, quota->vdev_id);
7017
7018 return QDF_STATUS_SUCCESS;
7019 }
7020
wlan_mlme_get_user_mcc_quota(struct wlan_objmgr_psoc * psoc,struct wlan_user_mcc_quota * quota)7021 QDF_STATUS wlan_mlme_get_user_mcc_quota(struct wlan_objmgr_psoc *psoc,
7022 struct wlan_user_mcc_quota *quota)
7023 {
7024 struct wlan_mlme_psoc_ext_obj *mlme_obj;
7025
7026 if (!quota)
7027 return QDF_STATUS_E_NULL_VALUE;
7028
7029 mlme_obj = mlme_get_psoc_ext_obj(psoc);
7030 if (!mlme_obj)
7031 return QDF_STATUS_E_FAILURE;
7032
7033 quota->quota = mlme_obj->cfg.gen.user_mcc_quota.quota;
7034 quota->op_mode = mlme_obj->cfg.gen.user_mcc_quota.op_mode;
7035 quota->vdev_id = mlme_obj->cfg.gen.user_mcc_quota.vdev_id;
7036
7037 return QDF_STATUS_SUCCESS;
7038 }
7039
7040 uint32_t
wlan_mlme_get_user_mcc_duty_cycle_percentage(struct wlan_objmgr_psoc * psoc)7041 wlan_mlme_get_user_mcc_duty_cycle_percentage(struct wlan_objmgr_psoc *psoc)
7042 {
7043 uint32_t mcc_freq, ch_freq, quota_value;
7044 struct wlan_user_mcc_quota quota;
7045 uint8_t operating_channel;
7046 int status;
7047
7048 quota.vdev_id = WLAN_UMAC_VDEV_ID_MAX;
7049 quota.quota = 0;
7050 if (QDF_IS_STATUS_ERROR(wlan_mlme_get_user_mcc_quota(psoc, "a))) {
7051 mlme_debug("Error getting user quota set");
7052 return 0;
7053 }
7054
7055 if (quota.vdev_id == WLAN_UMAC_VDEV_ID_MAX || quota.quota == 0) {
7056 mlme_debug("Invalid quota : vdev %u, quota %u",
7057 quota.vdev_id, quota.quota);
7058 return 0;
7059 }
7060 status = policy_mgr_get_chan_by_session_id(psoc, quota.vdev_id,
7061 &ch_freq);
7062 if (QDF_IS_STATUS_ERROR(status)) {
7063 mlme_debug("Could not get vdev %u chan", quota.vdev_id);
7064 return 0;
7065 }
7066 mcc_freq = policy_mgr_get_mcc_operating_channel(psoc, quota.vdev_id);
7067 if (mcc_freq == INVALID_CHANNEL_ID)
7068 return 0;
7069
7070 operating_channel = wlan_freq_to_chan(ch_freq);
7071 if (!operating_channel) {
7072 mlme_debug("Primary op channel is invalid");
7073 return 0;
7074 }
7075 /*
7076 * The channel numbers for both adapters and the time
7077 * quota for the 1st adapter, i.e., one specified in cmd
7078 * are formatted as a bit vector
7079 * ******************************************************
7080 * |bit 31-24 | bit 23-16 | bits 15-8 |bits 7-0 |
7081 * | Unused | Quota for | chan. # for |chan. # for|
7082 * | | 1st chan | 1st chan. |2nd chan. |
7083 * ******************************************************
7084 */
7085 mlme_debug("Opmode (%d) vdev (%u) channel %u and quota %u",
7086 quota.op_mode, quota.vdev_id,
7087 operating_channel, quota.quota);
7088 quota_value = quota.quota;
7089 /* Move the time quota for first channel to bits 15-8 */
7090 quota_value = quota_value << 8;
7091 /*
7092 * Store the channel number of 1st channel at bits 7-0
7093 * of the bit vector
7094 */
7095 quota_value |= operating_channel;
7096
7097 operating_channel = wlan_freq_to_chan(mcc_freq);
7098 if (!operating_channel) {
7099 mlme_debug("Secondary op channel is invalid");
7100 return 0;
7101 }
7102
7103 /*
7104 * Now move the time quota and channel number of the
7105 * 1st adapter to bits 23-16 and bits 15-8 of the bit
7106 * vector, respectively.
7107 */
7108 quota_value = quota_value << 8;
7109 /*
7110 * Set the channel number for 2nd MCC vdev at bits
7111 * 7-0 of set_value
7112 */
7113 quota_value |= operating_channel;
7114 mlme_debug("quota value:%x", quota_value);
7115
7116 return quota_value;
7117 }
7118 #endif /* WLAN_FEATURE_MCC_QUOTA */
7119
mlme_get_max_he_mcs_idx(enum phy_ch_width mcs_ch_width,u_int16_t * hecap_rxmcsnssmap,u_int16_t * hecap_txmcsnssmap)7120 uint8_t mlme_get_max_he_mcs_idx(enum phy_ch_width mcs_ch_width,
7121 u_int16_t *hecap_rxmcsnssmap,
7122 u_int16_t *hecap_txmcsnssmap)
7123 {
7124 uint8_t rx_max_mcs, tx_max_mcs, max_mcs = INVALID_MCS_NSS_INDEX;
7125
7126 switch (mcs_ch_width) {
7127 case CH_WIDTH_80P80MHZ:
7128 if (hecap_rxmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_80_80] &&
7129 hecap_txmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_80_80]) {
7130 rx_max_mcs = hecap_rxmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_80_80] & 0x03;
7131 tx_max_mcs = hecap_txmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_80_80] & 0x03;
7132 max_mcs = rx_max_mcs < tx_max_mcs ? rx_max_mcs : tx_max_mcs;
7133 if (max_mcs < 0x03)
7134 max_mcs = 7 + 2 * max_mcs;
7135 }
7136 fallthrough;
7137 case CH_WIDTH_160MHZ:
7138 if (hecap_rxmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_160] &&
7139 hecap_txmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_160]) {
7140 rx_max_mcs = hecap_rxmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_160] & 0x03;
7141 tx_max_mcs = hecap_txmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_160] & 0x03;
7142 max_mcs = rx_max_mcs < tx_max_mcs ? rx_max_mcs : tx_max_mcs;
7143 if (max_mcs < 0x03)
7144 max_mcs = 7 + 2 * max_mcs;
7145 }
7146 fallthrough;
7147 default:
7148 if (hecap_rxmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_80] &&
7149 hecap_txmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_80]) {
7150 rx_max_mcs = hecap_rxmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_80] & 0x03;
7151 tx_max_mcs = hecap_txmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_80] & 0x03;
7152 max_mcs = rx_max_mcs < tx_max_mcs ? rx_max_mcs : tx_max_mcs;
7153 if (max_mcs < 0x03)
7154 max_mcs = 7 + 2 * max_mcs;
7155 }
7156 }
7157
7158 return max_mcs;
7159 }
7160
mlme_get_max_vht_mcs_idx(u_int16_t rx_vht_mcs_map,u_int16_t tx_vht_mcs_map)7161 uint8_t mlme_get_max_vht_mcs_idx(u_int16_t rx_vht_mcs_map,
7162 u_int16_t tx_vht_mcs_map)
7163 {
7164 uint8_t rx_max_mcs, tx_max_mcs, max_mcs = INVALID_MCS_NSS_INDEX;
7165
7166 if (rx_vht_mcs_map && tx_vht_mcs_map) {
7167 rx_max_mcs = rx_vht_mcs_map & 0x03;
7168 tx_max_mcs = tx_vht_mcs_map & 0x03;
7169 max_mcs = rx_max_mcs < tx_max_mcs ? rx_max_mcs : tx_max_mcs;
7170 if (max_mcs < 0x03)
7171 return 7 + max_mcs;
7172 }
7173
7174 return max_mcs;
7175 }
7176
7177 #ifdef WLAN_FEATURE_SON
mlme_save_vdev_max_mcs_idx(struct wlan_objmgr_vdev * vdev,uint8_t max_mcs_idx)7178 QDF_STATUS mlme_save_vdev_max_mcs_idx(struct wlan_objmgr_vdev *vdev,
7179 uint8_t max_mcs_idx)
7180 {
7181 struct mlme_legacy_priv *mlme_priv;
7182
7183 if (!vdev) {
7184 mlme_legacy_err("invalid vdev");
7185 return QDF_STATUS_E_INVAL;
7186 }
7187
7188 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
7189 if (!mlme_priv) {
7190 mlme_legacy_err("vdev legacy private object is NULL");
7191 return QDF_STATUS_E_FAILURE;
7192 }
7193
7194 mlme_priv->max_mcs_index = max_mcs_idx;
7195
7196 return QDF_STATUS_SUCCESS;
7197 }
7198
mlme_get_vdev_max_mcs_idx(struct wlan_objmgr_vdev * vdev)7199 uint8_t mlme_get_vdev_max_mcs_idx(struct wlan_objmgr_vdev *vdev)
7200 {
7201 struct mlme_legacy_priv *mlme_priv;
7202
7203 if (!vdev) {
7204 mlme_legacy_err("invalid vdev");
7205 return INVALID_MCS_NSS_INDEX;
7206 }
7207
7208 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
7209 if (!mlme_priv) {
7210 mlme_legacy_err("vdev legacy private object is NULL");
7211 return INVALID_MCS_NSS_INDEX;
7212 }
7213
7214 return mlme_priv->max_mcs_index;
7215 }
7216 #endif /* WLAN_FEATURE_SON */
7217
wlan_mlme_get_safe_mode_enable(struct wlan_objmgr_psoc * psoc,bool * safe_mode_enable)7218 void wlan_mlme_get_safe_mode_enable(struct wlan_objmgr_psoc *psoc,
7219 bool *safe_mode_enable)
7220 {
7221 struct wlan_mlme_psoc_ext_obj *mlme_obj;
7222
7223 mlme_obj = mlme_get_psoc_ext_obj(psoc);
7224 if (!mlme_obj) {
7225 mlme_legacy_err("invalid mlme obj");
7226 *safe_mode_enable = false;
7227 return;
7228 }
7229
7230 *safe_mode_enable = mlme_obj->cfg.gen.safe_mode_enable;
7231 }
7232
wlan_mlme_set_safe_mode_enable(struct wlan_objmgr_psoc * psoc,bool safe_mode_enable)7233 void wlan_mlme_set_safe_mode_enable(struct wlan_objmgr_psoc *psoc,
7234 bool safe_mode_enable)
7235 {
7236 struct wlan_mlme_psoc_ext_obj *mlme_obj;
7237
7238 mlme_obj = mlme_get_psoc_ext_obj(psoc);
7239 if (!mlme_obj) {
7240 mlme_legacy_err("invalid mlme obj");
7241 return;
7242 }
7243
7244 mlme_obj->cfg.gen.safe_mode_enable = safe_mode_enable;
7245 }
7246
wlan_mlme_get_6g_ap_power_type(struct wlan_objmgr_vdev * vdev)7247 uint32_t wlan_mlme_get_6g_ap_power_type(struct wlan_objmgr_vdev *vdev)
7248 {
7249 struct vdev_mlme_obj *mlme_obj;
7250
7251 mlme_obj = wlan_vdev_mlme_get_cmpt_obj(vdev);
7252
7253 if (!mlme_obj) {
7254 mlme_legacy_err("vdev component object is NULL");
7255 return REG_MAX_AP_TYPE;
7256 }
7257
7258 return mlme_obj->reg_tpc_obj.power_type_6g;
7259 }
7260
wlan_connect_hw_mode_change_resp(struct wlan_objmgr_pdev * pdev,uint8_t vdev_id,wlan_cm_id cm_id,QDF_STATUS status)7261 QDF_STATUS wlan_connect_hw_mode_change_resp(struct wlan_objmgr_pdev *pdev,
7262 uint8_t vdev_id,
7263 wlan_cm_id cm_id, QDF_STATUS status)
7264 {
7265 return wlan_cm_handle_hw_mode_change_resp(pdev, vdev_id, cm_id,
7266 status);
7267 }
7268
7269 enum phy_ch_width
wlan_mlme_get_ch_width_from_phymode(enum wlan_phymode phy_mode)7270 wlan_mlme_get_ch_width_from_phymode(enum wlan_phymode phy_mode)
7271 {
7272 enum phy_ch_width ch_width;
7273
7274 if (IS_WLAN_PHYMODE_320MHZ(phy_mode))
7275 ch_width = CH_WIDTH_320MHZ;
7276 else if (IS_WLAN_PHYMODE_160MHZ(phy_mode))
7277 ch_width = CH_WIDTH_160MHZ;
7278 else if (IS_WLAN_PHYMODE_80MHZ(phy_mode))
7279 ch_width = CH_WIDTH_80MHZ;
7280 else if (IS_WLAN_PHYMODE_40MHZ(phy_mode))
7281 ch_width = CH_WIDTH_40MHZ;
7282 else
7283 ch_width = CH_WIDTH_20MHZ;
7284
7285 mlme_legacy_debug("phymode: %d, ch_width: %d ", phy_mode, ch_width);
7286
7287 return ch_width;
7288 }
7289
7290 enum phy_ch_width
wlan_mlme_get_peer_ch_width(struct wlan_objmgr_psoc * psoc,uint8_t * mac)7291 wlan_mlme_get_peer_ch_width(struct wlan_objmgr_psoc *psoc, uint8_t *mac)
7292 {
7293 enum wlan_phymode phy_mode;
7294 QDF_STATUS status;
7295
7296 status = mlme_get_peer_phymode(psoc, mac, &phy_mode);
7297 if (QDF_IS_STATUS_ERROR(status)) {
7298 mlme_legacy_err("failed to fetch phy_mode status: %d for mac: " QDF_MAC_ADDR_FMT,
7299 status, QDF_MAC_ADDR_REF(mac));
7300 return CH_WIDTH_20MHZ;
7301 }
7302
7303 return wlan_mlme_get_ch_width_from_phymode(phy_mode);
7304 }
7305
7306 #ifdef FEATURE_SET
7307
7308 /**
7309 * wlan_mlme_get_latency_enable() - get wlm latency cfg value
7310 * @psoc: psoc context
7311 * @value: Pointer in which wlam latency cfg value needs to be filled
7312 *
7313 * Return: QDF_STATUS_SUCCESS on success or QDF_STATUS_E_INVAL on failure
7314 */
7315 static QDF_STATUS
wlan_mlme_get_latency_enable(struct wlan_objmgr_psoc * psoc,bool * value)7316 wlan_mlme_get_latency_enable(struct wlan_objmgr_psoc *psoc, bool *value)
7317 {
7318 struct wlan_mlme_psoc_ext_obj *mlme_obj;
7319
7320 mlme_obj = mlme_get_psoc_ext_obj(psoc);
7321 if (!mlme_obj) {
7322 mlme_legacy_err("mlme obj null");
7323 return QDF_STATUS_E_INVAL;
7324 }
7325
7326 *value = mlme_obj->cfg.wlm_config.latency_enable;
7327 return QDF_STATUS_SUCCESS;
7328 }
7329
7330 #ifdef WLAN_ADAPTIVE_11R
7331 /**
7332 * wlan_mlme_get_adaptive11r_enabled() - get adaptive 11r cfg value
7333 * @psoc: psoc context
7334 * @val: Pointer in which adaptive 11r cfg value needs to be filled
7335 *
7336 * Return: QDF_STATUS_SUCCESS on success or QDF_STATUS_E_INVAL on failure
7337 */
7338 static QDF_STATUS
wlan_mlme_get_adaptive11r_enabled(struct wlan_objmgr_psoc * psoc,bool * val)7339 wlan_mlme_get_adaptive11r_enabled(struct wlan_objmgr_psoc *psoc, bool *val)
7340 {
7341 struct wlan_mlme_psoc_ext_obj *mlme_obj;
7342
7343 mlme_obj = mlme_get_psoc_ext_obj(psoc);
7344 if (!mlme_obj) {
7345 *val = cfg_default(CFG_ADAPTIVE_11R);
7346 return QDF_STATUS_E_INVAL;
7347 }
7348
7349 *val = mlme_obj->cfg.lfr.enable_adaptive_11r;
7350
7351 return QDF_STATUS_SUCCESS;
7352 }
7353 #else
7354 static inline QDF_STATUS
wlan_mlme_get_adaptive11r_enabled(struct wlan_objmgr_psoc * psoc,bool * val)7355 wlan_mlme_get_adaptive11r_enabled(struct wlan_objmgr_psoc *psoc, bool *val)
7356 {
7357 *val = false;
7358 return QDF_STATUS_SUCCESS;
7359 }
7360 #endif
7361
7362 #if defined(WLAN_FEATURE_P2P_P2P_STA) && \
7363 !defined(WLAN_FEATURE_NO_P2P_CONCURRENCY)
7364 static bool
wlan_mlme_get_p2p_p2p_host_conc_support(void)7365 wlan_mlme_get_p2p_p2p_host_conc_support(void)
7366 {
7367 return true;
7368 }
7369 #else
7370 static bool
wlan_mlme_get_p2p_p2p_host_conc_support(void)7371 wlan_mlme_get_p2p_p2p_host_conc_support(void)
7372 {
7373 return false;
7374 }
7375 #endif
7376
7377 #ifndef WLAN_FEATURE_NO_STA_SAP_CONCURRENCY
7378 static bool
wlan_mlme_get_sta_sap_host_conc_support(void)7379 wlan_mlme_get_sta_sap_host_conc_support(void)
7380 {
7381 return true;
7382 }
7383 #else
7384 static bool
wlan_mlme_get_sta_sap_host_conc_support(void)7385 wlan_mlme_get_sta_sap_host_conc_support(void)
7386 {
7387 return false;
7388 }
7389 #endif
7390
7391 #ifndef WLAN_FEATURE_NO_STA_NAN_CONCURRENCY
7392 static bool
wlan_mlme_get_sta_nan_host_conc_support(void)7393 wlan_mlme_get_sta_nan_host_conc_support(void)
7394 {
7395 return true;
7396 }
7397 #else
7398 static bool
wlan_mlme_get_sta_nan_host_conc_support(void)7399 wlan_mlme_get_sta_nan_host_conc_support(void)
7400 {
7401 return false;
7402 }
7403 #endif
7404
7405 #ifdef FEATURE_WLAN_TDLS
7406 static bool
wlan_mlme_get_sta_tdls_host_conc_support(void)7407 wlan_mlme_get_sta_tdls_host_conc_support(void)
7408 {
7409 return true;
7410 }
7411 #else
7412 static bool
wlan_mlme_get_sta_tdls_host_conc_support(void)7413 wlan_mlme_get_sta_tdls_host_conc_support(void)
7414 {
7415 return false;
7416 }
7417 #endif
7418
7419 #if !defined(WLAN_FEATURE_NO_STA_SAP_CONCURRENCY) && \
7420 (!defined(WLAN_FEATURE_NO_P2P_CONCURRENCY) || \
7421 defined(WLAN_FEATURE_STA_SAP_P2P_CONCURRENCY))
7422 static bool
wlan_mlme_get_sta_sap_p2p_host_conc_support(void)7423 wlan_mlme_get_sta_sap_p2p_host_conc_support(void)
7424 {
7425 return true;
7426 }
7427 #else
7428 static bool
wlan_mlme_get_sta_sap_p2p_host_conc_support(void)7429 wlan_mlme_get_sta_sap_p2p_host_conc_support(void)
7430 {
7431 return false;
7432 }
7433 #endif
7434
7435 #if defined(FEATURE_WLAN_TDLS)
7436 static bool
wlan_mlme_get_sta_p2p_tdls_host_conc_support(void)7437 wlan_mlme_get_sta_p2p_tdls_host_conc_support(void)
7438 {
7439 return true;
7440 }
7441 #else
7442 static bool
wlan_mlme_get_sta_p2p_tdls_host_conc_support(void)7443 wlan_mlme_get_sta_p2p_tdls_host_conc_support(void)
7444 {
7445 return false;
7446 }
7447 #endif
7448
7449 #if defined(FEATURE_WLAN_TDLS) && !defined(WLAN_FEATURE_NO_STA_SAP_CONCURRENCY)
7450 static bool
wlan_mlme_get_sta_sap_tdls_host_conc_support(void)7451 wlan_mlme_get_sta_sap_tdls_host_conc_support(void)
7452 {
7453 return true;
7454 }
7455 #else
7456 static bool
wlan_mlme_get_sta_sap_tdls_host_conc_support(void)7457 wlan_mlme_get_sta_sap_tdls_host_conc_support(void)
7458 {
7459 return false;
7460 }
7461 #endif
7462
7463 #if defined(FEATURE_WLAN_TDLS) && \
7464 !defined(WLAN_FEATURE_NO_STA_SAP_CONCURRENCY) && \
7465 (!defined(WLAN_FEATURE_NO_P2P_CONCURRENCY) || \
7466 defined(WLAN_FEATURE_STA_SAP_P2P_CONCURRENCY))
7467
7468 static bool
wlan_mlme_get_sta_sap_p2p_tdls_host_conc_support(void)7469 wlan_mlme_get_sta_sap_p2p_tdls_host_conc_support(void)
7470 {
7471 return true;
7472 }
7473 #else
7474 static bool
wlan_mlme_get_sta_sap_p2p_tdls_host_conc_support(void)7475 wlan_mlme_get_sta_sap_p2p_tdls_host_conc_support(void)
7476 {
7477 return false;
7478 }
7479 #endif
7480
7481 #if defined(FEATURE_WLAN_TDLS) && defined(WLAN_FEATURE_P2P_P2P_STA) && \
7482 !defined(WLAN_FEATURE_NO_P2P_CONCURRENCY)
7483 static bool
wlan_mlme_get_sta_p2p_p2p_tdls_host_conc_support(void)7484 wlan_mlme_get_sta_p2p_p2p_tdls_host_conc_support(void)
7485 {
7486 return true;
7487 }
7488 #else
7489 static bool
wlan_mlme_get_sta_p2p_p2p_tdls_host_conc_support(void)7490 wlan_mlme_get_sta_p2p_p2p_tdls_host_conc_support(void)
7491 {
7492 return false;
7493 }
7494 #endif
7495
7496 /**
7497 * wlan_mlme_set_iface_combinations() - Set interface combinations
7498 * @mlme_feature_set: Pointer to wlan_mlme_features
7499 *
7500 * Return: None
7501 */
7502 static void
wlan_mlme_set_iface_combinations(struct wlan_mlme_features * mlme_feature_set)7503 wlan_mlme_set_iface_combinations(struct wlan_mlme_features *mlme_feature_set)
7504 {
7505 mlme_feature_set->iface_combinations = 0;
7506 mlme_feature_set->iface_combinations |= MLME_IFACE_STA_P2P_SUPPORT;
7507 if (wlan_mlme_get_sta_sap_host_conc_support())
7508 mlme_feature_set->iface_combinations |=
7509 MLME_IFACE_STA_SAP_SUPPORT;
7510 if (wlan_mlme_get_sta_nan_host_conc_support())
7511 mlme_feature_set->iface_combinations |=
7512 MLME_IFACE_STA_NAN_SUPPORT;
7513 if (wlan_mlme_get_sta_tdls_host_conc_support())
7514 mlme_feature_set->iface_combinations |=
7515 MLME_IFACE_STA_TDLS_SUPPORT;
7516 if (wlan_mlme_get_p2p_p2p_host_conc_support())
7517 mlme_feature_set->iface_combinations |=
7518 MLME_IFACE_STA_DUAL_P2P_SUPPORT;
7519 if (wlan_mlme_get_sta_sap_p2p_host_conc_support())
7520 mlme_feature_set->iface_combinations |=
7521 MLME_IFACE_STA_SAP_P2P_SUPPORT;
7522 if (wlan_mlme_get_sta_p2p_tdls_host_conc_support())
7523 mlme_feature_set->iface_combinations |=
7524 MLME_IFACE_STA_P2P_TDLS_SUPPORT;
7525 if (wlan_mlme_get_sta_sap_tdls_host_conc_support())
7526 mlme_feature_set->iface_combinations |=
7527 MLME_IFACE_STA_SAP_TDLS_SUPPORT;
7528 if (wlan_mlme_get_sta_sap_p2p_tdls_host_conc_support())
7529 mlme_feature_set->iface_combinations |=
7530 MLME_IFACE_STA_SAP_P2P_TDLS_SUPPORT;
7531 if (wlan_mlme_get_sta_p2p_p2p_tdls_host_conc_support())
7532 mlme_feature_set->iface_combinations |=
7533 MLME_IFACE_STA_P2P_P2P_TDLS_SUPPORT;
7534 mlme_debug("iface combinations = %x",
7535 mlme_feature_set->iface_combinations);
7536 }
7537
wlan_mlme_get_feature_info(struct wlan_objmgr_psoc * psoc,struct wlan_mlme_features * mlme_feature_set)7538 void wlan_mlme_get_feature_info(struct wlan_objmgr_psoc *psoc,
7539 struct wlan_mlme_features *mlme_feature_set)
7540 {
7541 uint32_t roam_triggers;
7542 int sap_max_num_clients = 0;
7543 bool is_enable_idle_roam = false, is_bss_load_enabled = false;
7544
7545 wlan_mlme_get_latency_enable(psoc,
7546 &mlme_feature_set->enable_wifi_optimizer);
7547 wlan_mlme_get_sap_max_peers(psoc, &sap_max_num_clients);
7548 mlme_feature_set->sap_max_num_clients = sap_max_num_clients;
7549 mlme_feature_set->vendor_req_1_version =
7550 WMI_HOST_VENDOR1_REQ1_VERSION_4_00;
7551 roam_triggers = wlan_mlme_get_roaming_triggers(psoc);
7552
7553 wlan_mlme_get_bss_load_enabled(psoc, &is_bss_load_enabled);
7554 mlme_feature_set->roaming_high_cu_roam_trigger =
7555 (roam_triggers & BIT(ROAM_TRIGGER_REASON_BSS_LOAD)) &&
7556 is_bss_load_enabled;
7557
7558 mlme_feature_set->roaming_emergency_trigger =
7559 roam_triggers & BIT(ROAM_TRIGGER_REASON_FORCED);
7560 mlme_feature_set->roaming_btm_trihgger =
7561 roam_triggers & BIT(ROAM_TRIGGER_REASON_BTM);
7562
7563 wlan_mlme_get_enable_idle_roam(psoc, &is_enable_idle_roam);
7564 mlme_feature_set->roaming_idle_trigger =
7565 (roam_triggers & BIT(ROAM_TRIGGER_REASON_IDLE)) &&
7566 is_enable_idle_roam;
7567
7568 mlme_feature_set->roaming_wtc_trigger =
7569 roam_triggers & BIT(ROAM_TRIGGER_REASON_WTC_BTM);
7570 mlme_feature_set->roaming_btcoex_trigger =
7571 roam_triggers & BIT(ROAM_TRIGGER_REASON_BTC);
7572 mlme_feature_set->roaming_btw_wpa_wpa2 = true;
7573 mlme_feature_set->roaming_manage_chan_list_api = true;
7574
7575 wlan_mlme_get_adaptive11r_enabled(
7576 psoc,
7577 &mlme_feature_set->roaming_adaptive_11r);
7578 mlme_feature_set->roaming_ctrl_api_get_set = true;
7579 mlme_feature_set->roaming_ctrl_api_reassoc = true;
7580 mlme_feature_set->roaming_ctrl_get_cu = true;
7581
7582 mlme_feature_set->vendor_req_2_version =
7583 WMI_HOST_VENDOR1_REQ2_VERSION_3_50;
7584 wlan_mlme_set_iface_combinations(mlme_feature_set);
7585 wlan_mlme_get_vht_enable2x2(psoc, &mlme_feature_set->enable2x2);
7586 }
7587 #endif
7588
wlan_mlme_chan_stats_scan_event_cb(struct wlan_objmgr_vdev * vdev,struct scan_event * event,void * arg)7589 void wlan_mlme_chan_stats_scan_event_cb(struct wlan_objmgr_vdev *vdev,
7590 struct scan_event *event, void *arg)
7591 {
7592 bool success = false;
7593
7594 if (!util_is_scan_completed(event, &success))
7595 return;
7596
7597 mlme_send_scan_done_complete_cb(event->vdev_id);
7598 }
7599
7600 static QDF_STATUS
wlan_mlme_update_vdev_chwidth_with_notify(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_vdev * vdev,uint8_t vdev_id,wmi_host_channel_width ch_width)7601 wlan_mlme_update_vdev_chwidth_with_notify(struct wlan_objmgr_psoc *psoc,
7602 struct wlan_objmgr_vdev *vdev,
7603 uint8_t vdev_id,
7604 wmi_host_channel_width ch_width)
7605 {
7606 struct vdev_mlme_obj *vdev_mlme;
7607 struct vdev_set_params param = {0};
7608 QDF_STATUS status;
7609
7610 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
7611 if (!vdev_mlme)
7612 return QDF_STATUS_E_FAILURE;
7613
7614 param.param_id = wmi_vdev_param_chwidth_with_notify;
7615 param.vdev_id = vdev_id;
7616 param.param_value = ch_width;
7617 status = tgt_vdev_mgr_set_param_send(vdev_mlme, ¶m);
7618 policy_mgr_handle_ml_sta_link_on_traffic_type_change(psoc, vdev);
7619
7620 return status;
7621 }
7622
7623 #ifdef WLAN_FEATURE_11BE
7624 static
wlan_mlme_set_puncture(struct wlan_channel * des_chan,uint16_t puncture_bitmap)7625 void wlan_mlme_set_puncture(struct wlan_channel *des_chan,
7626 uint16_t puncture_bitmap)
7627 {
7628 des_chan->puncture_bitmap = puncture_bitmap;
7629 }
7630 #else
7631 static
wlan_mlme_set_puncture(struct wlan_channel * des_chan,uint16_t puncture_bitmap)7632 void wlan_mlme_set_puncture(struct wlan_channel *des_chan,
7633 uint16_t puncture_bitmap)
7634 {
7635 }
7636 #endif
7637
wlan_mlme_update_ch_width(struct wlan_objmgr_vdev * vdev,uint8_t vdev_id,enum phy_ch_width ch_width,uint16_t puncture_bitmap,qdf_freq_t sec_2g_freq)7638 static QDF_STATUS wlan_mlme_update_ch_width(struct wlan_objmgr_vdev *vdev,
7639 uint8_t vdev_id,
7640 enum phy_ch_width ch_width,
7641 uint16_t puncture_bitmap,
7642 qdf_freq_t sec_2g_freq)
7643 {
7644 struct wlan_channel *des_chan;
7645 struct wlan_channel *bss_chan;
7646 uint16_t curr_op_freq;
7647 struct ch_params ch_params = {0};
7648 struct wlan_objmgr_pdev *pdev;
7649 QDF_STATUS status;
7650
7651 des_chan = wlan_vdev_mlme_get_des_chan(vdev);
7652 if (!des_chan)
7653 return QDF_STATUS_E_FAILURE;
7654
7655 bss_chan = wlan_vdev_mlme_get_bss_chan(vdev);
7656 if (!bss_chan)
7657 return QDF_STATUS_E_FAILURE;
7658
7659 pdev = wlan_vdev_get_pdev(vdev);
7660 if (!pdev) {
7661 mlme_err("vdev %d: Pdev is NULL", vdev_id);
7662 return QDF_STATUS_E_INVAL;
7663 }
7664
7665 ch_params.ch_width = ch_width;
7666 curr_op_freq = des_chan->ch_freq;
7667
7668 wlan_reg_set_channel_params_for_pwrmode(pdev, curr_op_freq,
7669 sec_2g_freq, &ch_params,
7670 REG_CURRENT_PWR_MODE);
7671
7672 des_chan->ch_width = ch_width;
7673 des_chan->ch_freq_seg1 = ch_params.center_freq_seg0;
7674 des_chan->ch_freq_seg2 = ch_params.center_freq_seg1;
7675 des_chan->ch_cfreq1 = ch_params.mhz_freq_seg0;
7676 des_chan->ch_cfreq2 = ch_params.mhz_freq_seg1;
7677 wlan_mlme_set_puncture(des_chan, puncture_bitmap);
7678
7679 status = wlan_update_peer_phy_mode(des_chan, vdev);
7680 if (QDF_IS_STATUS_ERROR(status)) {
7681 mlme_err("Failed to update phymode");
7682 return QDF_STATUS_E_INVAL;
7683 }
7684
7685 qdf_mem_copy(bss_chan, des_chan, sizeof(struct wlan_channel));
7686
7687 mlme_legacy_debug("vdev id %d freq %d seg0 %d seg1 %d ch_width %d mhz seg0 %d mhz seg1 %d",
7688 vdev_id, curr_op_freq, ch_params.center_freq_seg0,
7689 ch_params.center_freq_seg1, ch_params.ch_width,
7690 ch_params.mhz_freq_seg0, ch_params.mhz_freq_seg1);
7691
7692 return QDF_STATUS_SUCCESS;
7693 }
7694
7695 static uint32_t
wlan_mlme_get_vht_rate_flags(enum phy_ch_width ch_width)7696 wlan_mlme_get_vht_rate_flags(enum phy_ch_width ch_width)
7697 {
7698 uint32_t rate_flags = 0;
7699
7700 if (ch_width == CH_WIDTH_80P80MHZ || ch_width == CH_WIDTH_160MHZ)
7701 rate_flags |= TX_RATE_VHT160 | TX_RATE_VHT80 | TX_RATE_VHT40 |
7702 TX_RATE_VHT20;
7703 if (ch_width == CH_WIDTH_80MHZ)
7704 rate_flags |= TX_RATE_VHT80 | TX_RATE_VHT40 | TX_RATE_VHT20;
7705 else if (ch_width)
7706 rate_flags |= TX_RATE_VHT40 | TX_RATE_VHT20;
7707 else
7708 rate_flags |= TX_RATE_VHT20;
7709 return rate_flags;
7710 }
7711
wlan_mlme_get_ht_rate_flags(enum phy_ch_width ch_width)7712 static uint32_t wlan_mlme_get_ht_rate_flags(enum phy_ch_width ch_width)
7713 {
7714 uint32_t rate_flags = 0;
7715
7716 if (ch_width)
7717 rate_flags |= TX_RATE_HT40 | TX_RATE_HT20;
7718 else
7719 rate_flags |= TX_RATE_HT20;
7720
7721 return rate_flags;
7722 }
7723
7724 #ifdef WLAN_FEATURE_11BE
7725 static uint32_t
wlan_mlme_get_eht_rate_flags(enum phy_ch_width ch_width)7726 wlan_mlme_get_eht_rate_flags(enum phy_ch_width ch_width)
7727 {
7728 uint32_t rate_flags = 0;
7729
7730 if (ch_width == CH_WIDTH_320MHZ)
7731 rate_flags |= TX_RATE_EHT320 | TX_RATE_EHT160 |
7732 TX_RATE_EHT80 | TX_RATE_EHT40 | TX_RATE_EHT20;
7733 else if (ch_width == CH_WIDTH_160MHZ || ch_width == CH_WIDTH_80P80MHZ)
7734 rate_flags |= TX_RATE_EHT160 | TX_RATE_EHT80 | TX_RATE_EHT40 |
7735 TX_RATE_EHT20;
7736 else if (ch_width == CH_WIDTH_80MHZ)
7737 rate_flags |= TX_RATE_EHT80 | TX_RATE_EHT40 | TX_RATE_EHT20;
7738 else if (ch_width)
7739 rate_flags |= TX_RATE_EHT40 | TX_RATE_EHT20;
7740 else
7741 rate_flags |= TX_RATE_EHT20;
7742
7743 return rate_flags;
7744 }
7745
7746 static QDF_STATUS
wlan_mlme_set_bss_rate_flags_eht(uint32_t * rate_flags,uint8_t eht_present,enum phy_ch_width ch_width)7747 wlan_mlme_set_bss_rate_flags_eht(uint32_t *rate_flags, uint8_t eht_present,
7748 enum phy_ch_width ch_width)
7749 {
7750 if (!eht_present)
7751 return QDF_STATUS_E_NOSUPPORT;
7752
7753 *rate_flags |= wlan_mlme_get_eht_rate_flags(ch_width);
7754
7755 return QDF_STATUS_SUCCESS;
7756 }
7757 #else
7758 static inline QDF_STATUS
wlan_mlme_set_bss_rate_flags_eht(uint32_t * rate_flags,uint8_t eht_present,enum phy_ch_width ch_width)7759 wlan_mlme_set_bss_rate_flags_eht(uint32_t *rate_flags, uint8_t eht_present,
7760 enum phy_ch_width ch_width)
7761 {
7762 return QDF_STATUS_E_NOSUPPORT;
7763 }
7764 #endif
7765
7766 #ifdef WLAN_FEATURE_11AX
wlan_mlme_get_he_rate_flags(enum phy_ch_width ch_width)7767 static uint32_t wlan_mlme_get_he_rate_flags(enum phy_ch_width ch_width)
7768 {
7769 uint32_t rate_flags = 0;
7770
7771 if (ch_width == CH_WIDTH_160MHZ ||
7772 ch_width == CH_WIDTH_80P80MHZ)
7773 rate_flags |= TX_RATE_HE160 | TX_RATE_HE80 | TX_RATE_HE40 |
7774 TX_RATE_HE20;
7775 else if (ch_width == CH_WIDTH_80MHZ)
7776 rate_flags |= TX_RATE_HE80 | TX_RATE_HE40 | TX_RATE_HE20;
7777 else if (ch_width)
7778 rate_flags |= TX_RATE_HE40 | TX_RATE_HE20;
7779 else
7780 rate_flags |= TX_RATE_HE20;
7781
7782 return rate_flags;
7783 }
7784
wlan_mlme_set_bss_rate_flags_he(uint32_t * rate_flags,uint8_t he_present,enum phy_ch_width ch_width)7785 static QDF_STATUS wlan_mlme_set_bss_rate_flags_he(uint32_t *rate_flags,
7786 uint8_t he_present,
7787 enum phy_ch_width ch_width)
7788 {
7789 if (!he_present)
7790 return QDF_STATUS_E_NOSUPPORT;
7791
7792 *rate_flags |= wlan_mlme_get_he_rate_flags(ch_width);
7793
7794 return QDF_STATUS_SUCCESS;
7795 }
7796
7797 #else
7798 static inline QDF_STATUS
wlan_mlme_set_bss_rate_flags_he(uint32_t * rate_flags,uint8_t he_present,enum phy_ch_width ch_width)7799 wlan_mlme_set_bss_rate_flags_he(uint32_t *rate_flags,
7800 uint8_t he_present,
7801 enum phy_ch_width ch_width)
7802 {
7803 return QDF_STATUS_E_NOSUPPORT;
7804 }
7805 #endif
7806
7807 static QDF_STATUS
wlan_mlme_cp_stats_set_rate_flags(struct wlan_objmgr_vdev * vdev,uint32_t flags)7808 wlan_mlme_cp_stats_set_rate_flags(struct wlan_objmgr_vdev *vdev,
7809 uint32_t flags)
7810 {
7811 struct vdev_mc_cp_stats *vdev_mc_stats;
7812 struct vdev_cp_stats *vdev_cp_stats_priv;
7813
7814 vdev_cp_stats_priv = wlan_cp_stats_get_vdev_stats_obj(vdev);
7815 if (!vdev_cp_stats_priv) {
7816 cp_stats_err("vdev cp stats object is null");
7817 return QDF_STATUS_E_NULL_VALUE;
7818 }
7819
7820 wlan_cp_stats_vdev_obj_lock(vdev_cp_stats_priv);
7821 vdev_mc_stats = vdev_cp_stats_priv->vdev_stats;
7822 vdev_mc_stats->tx_rate_flags = flags;
7823 wlan_cp_stats_vdev_obj_unlock(vdev_cp_stats_priv);
7824
7825 return QDF_STATUS_SUCCESS;
7826 }
7827
7828 QDF_STATUS
wlan_mlme_update_bss_rate_flags(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,enum phy_ch_width cw,uint8_t eht_present,uint8_t he_present,uint8_t vht_present,uint8_t ht_present)7829 wlan_mlme_update_bss_rate_flags(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
7830 enum phy_ch_width cw, uint8_t eht_present,
7831 uint8_t he_present, uint8_t vht_present,
7832 uint8_t ht_present)
7833 {
7834 uint32_t *rate_flags;
7835 struct vdev_mlme_obj *vdev_mlme;
7836 struct wlan_objmgr_vdev *vdev;
7837 QDF_STATUS status;
7838
7839 if (!eht_present && !he_present && !vht_present && !ht_present)
7840 return QDF_STATUS_E_INVAL;
7841
7842 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
7843 WLAN_HDD_ID_OBJ_MGR);
7844 if (!vdev) {
7845 mlme_debug("vdev: %d vdev not found", vdev_id);
7846 return QDF_STATUS_E_INVAL;
7847 }
7848
7849 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
7850 if (!vdev_mlme) {
7851 mlme_debug("vdev: %d mlme obj not found", vdev_id);
7852 wlan_objmgr_vdev_release_ref(vdev, WLAN_HDD_ID_OBJ_MGR);
7853 return QDF_STATUS_E_INVAL;
7854 }
7855
7856 rate_flags = &vdev_mlme->mgmt.rate_info.rate_flags;
7857 *rate_flags = 0;
7858
7859 status = wlan_mlme_set_bss_rate_flags_eht(rate_flags, eht_present, cw);
7860 if (QDF_IS_STATUS_ERROR(status)) {
7861 status = wlan_mlme_set_bss_rate_flags_he(rate_flags,
7862 he_present, cw);
7863 if (QDF_IS_STATUS_ERROR(status)) {
7864 if (vht_present)
7865 *rate_flags = wlan_mlme_get_vht_rate_flags(cw);
7866 else if (ht_present)
7867 *rate_flags |= wlan_mlme_get_ht_rate_flags(cw);
7868 }
7869 }
7870
7871 mlme_debug("vdev:%d, eht:%u, he:%u, vht:%u, ht:%u, flag:%x, cw:%d",
7872 vdev_id, eht_present, he_present, vht_present, ht_present,
7873 *rate_flags, cw);
7874
7875 status = wlan_mlme_cp_stats_set_rate_flags(vdev, *rate_flags);
7876
7877 wlan_objmgr_vdev_release_ref(vdev, WLAN_HDD_ID_OBJ_MGR);
7878 return status;
7879 }
7880
7881 QDF_STATUS
wlan_mlme_send_ch_width_update_with_notify(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_vdev * vdev,uint8_t vdev_id,enum phy_ch_width ch_width)7882 wlan_mlme_send_ch_width_update_with_notify(struct wlan_objmgr_psoc *psoc,
7883 struct wlan_objmgr_vdev *vdev,
7884 uint8_t vdev_id,
7885 enum phy_ch_width ch_width)
7886 {
7887 QDF_STATUS status;
7888 wmi_host_channel_width wmi_chan_width;
7889 enum phy_ch_width associated_ch_width, omn_ie_ch_width;
7890 struct wlan_channel *des_chan;
7891 struct mlme_legacy_priv *mlme_priv;
7892 qdf_freq_t sec_2g_freq = 0;
7893
7894 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
7895 if (!mlme_priv)
7896 return QDF_STATUS_E_INVAL;
7897
7898 des_chan = wlan_vdev_mlme_get_des_chan(vdev);
7899 if (!des_chan)
7900 return QDF_STATUS_E_INVAL;
7901
7902 omn_ie_ch_width =
7903 mlme_priv->connect_info.assoc_chan_info.omn_ie_ch_width;
7904 if (omn_ie_ch_width != CH_WIDTH_INVALID && ch_width > omn_ie_ch_width) {
7905 mlme_debug("vdev %d: Invalid new chwidth:%d, omn_ie_cw:%d",
7906 vdev_id, ch_width, omn_ie_ch_width);
7907 return QDF_STATUS_E_INVAL;
7908 }
7909
7910 associated_ch_width =
7911 mlme_priv->connect_info.assoc_chan_info.assoc_ch_width;
7912 if (associated_ch_width == CH_WIDTH_INVALID ||
7913 ch_width > associated_ch_width) {
7914 mlme_debug("vdev %d: Invalid new chwidth:%d, assoc ch_width:%d",
7915 vdev_id, ch_width, associated_ch_width);
7916 return QDF_STATUS_E_INVAL;
7917 }
7918
7919 if (wlan_reg_is_24ghz_ch_freq(des_chan->ch_freq)) {
7920 if (ch_width == CH_WIDTH_40MHZ &&
7921 mlme_priv->connect_info.assoc_chan_info.sec_2g_freq) {
7922 sec_2g_freq =
7923 mlme_priv->connect_info.assoc_chan_info.sec_2g_freq;
7924 } else if (ch_width != CH_WIDTH_20MHZ) {
7925 mlme_debug("vdev %d: CW:%d update not supported for freq:%d sec_2g_freq %d",
7926 vdev_id, ch_width, des_chan->ch_freq,
7927 mlme_priv->connect_info.assoc_chan_info.sec_2g_freq);
7928 return QDF_STATUS_E_NOSUPPORT;
7929 }
7930 }
7931
7932 /* update ch width to internal host structure */
7933 status = wlan_mlme_update_ch_width(vdev, vdev_id, ch_width, 0,
7934 sec_2g_freq);
7935 if (QDF_IS_STATUS_ERROR(status)) {
7936 mlme_err("vdev %d: Failed to update CW:%d to host, status:%d",
7937 vdev_id, ch_width, status);
7938 return status;
7939 }
7940
7941 wmi_chan_width = target_if_phy_ch_width_to_wmi_chan_width(ch_width);
7942
7943 /* update ch width to fw */
7944 status = wlan_mlme_update_vdev_chwidth_with_notify(psoc, vdev, vdev_id,
7945 wmi_chan_width);
7946 if (QDF_IS_STATUS_ERROR(status))
7947 mlme_err("vdev %d: Failed to update CW:%d to fw, status:%d",
7948 vdev_id, ch_width, status);
7949
7950 return status;
7951 }
7952
7953 enum phy_ch_width
wlan_mlme_convert_vht_op_bw_to_phy_ch_width(uint8_t channel_width,uint8_t chan_id,uint8_t ccfs0,uint8_t ccfs1)7954 wlan_mlme_convert_vht_op_bw_to_phy_ch_width(uint8_t channel_width,
7955 uint8_t chan_id,
7956 uint8_t ccfs0,
7957 uint8_t ccfs1)
7958 {
7959 /** channel_width in vht op from 802.11-2020
7960 * Set to 0 for 20 MHz or 40 MHz BSS bandwidth.
7961 * Set to 1 for 80 MHz, 160 MHz or 80+80 MHz BSS
7962 * bandwidth.
7963 * Set to 2 for 160 MHz BSS bandwidth (deprecated).
7964 * Set to 3 for noncontiguous 80+80 MHz BSS
7965 * bandwidth (deprecated).
7966 * Values in the range 4 to 255 are reserved
7967 *
7968 * 80+80 not supported by MCC platform, so downgrade to 80
7969 */
7970 enum phy_ch_width phy_bw = CH_WIDTH_20MHZ;
7971
7972 if (channel_width == WLAN_VHTOP_CHWIDTH_2040) {
7973 phy_bw = CH_WIDTH_20MHZ;
7974 if (abs(ccfs0 - chan_id) == 2)
7975 phy_bw = CH_WIDTH_40MHZ;
7976 } else if (channel_width == WLAN_VHTOP_CHWIDTH_80) {
7977 if (ccfs1 && (abs(ccfs1 - ccfs0) == 8))
7978 phy_bw = CH_WIDTH_160MHZ;
7979 else
7980 phy_bw = CH_WIDTH_80MHZ;
7981 } else if (channel_width == WLAN_VHTOP_CHWIDTH_160) {
7982 phy_bw = CH_WIDTH_160MHZ;
7983 } else if (channel_width == WLAN_VHTOP_CHWIDTH_80_80) {
7984 phy_bw = WLAN_VHTOP_CHWIDTH_80;
7985 }
7986
7987 return phy_bw;
7988 }
7989
7990 enum phy_ch_width
wlan_mlme_convert_he_6ghz_op_bw_to_phy_ch_width(uint8_t channel_width,uint8_t chan_id,uint8_t ccfs0,uint8_t ccfs1)7991 wlan_mlme_convert_he_6ghz_op_bw_to_phy_ch_width(uint8_t channel_width,
7992 uint8_t chan_id,
7993 uint8_t ccfs0,
7994 uint8_t ccfs1)
7995 {
7996 enum phy_ch_width phy_bw = CH_WIDTH_20MHZ;
7997
7998 if (channel_width == WLAN_HE_6GHZ_CHWIDTH_20) {
7999 phy_bw = CH_WIDTH_20MHZ;
8000 } else if (channel_width == WLAN_HE_6GHZ_CHWIDTH_40) {
8001 phy_bw = CH_WIDTH_40MHZ;
8002 } else if (channel_width == WLAN_HE_6GHZ_CHWIDTH_80) {
8003 phy_bw = CH_WIDTH_80MHZ;
8004 } else if (channel_width == WLAN_HE_6GHZ_CHWIDTH_160_80_80) {
8005 phy_bw = CH_WIDTH_160MHZ;
8006 /* 80+80 not supported */
8007 if (ccfs1 && abs(ccfs0 - ccfs1) > 8)
8008 phy_bw = CH_WIDTH_80MHZ;
8009 }
8010
8011 return phy_bw;
8012 }
8013
8014 void
wlan_mlme_set_edca_pifs_param(struct wlan_edca_pifs_param_ie * ep,enum host_edca_param_type type)8015 wlan_mlme_set_edca_pifs_param(struct wlan_edca_pifs_param_ie *ep,
8016 enum host_edca_param_type type)
8017 {
8018 ep->edca_param_type = type;
8019
8020 if (type == HOST_EDCA_PARAM_TYPE_AGGRESSIVE) {
8021 ep->edca_pifs_param.eparam.acvo_aifsn = CFG_EDCA_PARAM_AIFSN;
8022 ep->edca_pifs_param.eparam.acvo_acm = CFG_EDCA_PARAM_ACM;
8023 ep->edca_pifs_param.eparam.acvo_aci = CFG_EDCA_PARAM_ACI;
8024 ep->edca_pifs_param.eparam.acvo_cwmin = CFG_EDCA_PARAM_CWMIN;
8025 ep->edca_pifs_param.eparam.acvo_cwmax = CFG_EDCA_PARAM_CWMAX;
8026 ep->edca_pifs_param.eparam.acvo_txoplimit = CFG_EDCA_PARAM_TXOP;
8027 } else if (type == HOST_EDCA_PARAM_TYPE_PIFS) {
8028 ep->edca_pifs_param.pparam.sap_pifs_offset =
8029 CFG_PIFS_PARAM_SAP_OFFSET;
8030 ep->edca_pifs_param.pparam.leb_pifs_offset =
8031 CFG_PIFS_PARAM_LEB_OFFSET;
8032 ep->edca_pifs_param.pparam.reb_pifs_offset =
8033 CFG_PIFS_PARAM_REB_OFFSET;
8034 }
8035 }
8036
8037 QDF_STATUS
wlan_mlme_stats_get_periodic_display_time(struct wlan_objmgr_psoc * psoc,uint32_t * periodic_display_time)8038 wlan_mlme_stats_get_periodic_display_time(struct wlan_objmgr_psoc *psoc,
8039 uint32_t *periodic_display_time)
8040 {
8041 struct wlan_mlme_psoc_ext_obj *mlme_obj;
8042
8043 mlme_obj = mlme_get_psoc_ext_obj(psoc);
8044 if (!mlme_obj) {
8045 *periodic_display_time =
8046 cfg_default(CFG_PERIODIC_STATS_DISPLAY_TIME);
8047 return QDF_STATUS_E_INVAL;
8048 }
8049
8050 *periodic_display_time =
8051 mlme_obj->cfg.stats.stats_periodic_display_time;
8052
8053 return QDF_STATUS_SUCCESS;
8054 }
8055
8056 bool
wlan_mlme_is_bcn_prot_disabled_for_sap(struct wlan_objmgr_psoc * psoc)8057 wlan_mlme_is_bcn_prot_disabled_for_sap(struct wlan_objmgr_psoc *psoc)
8058 {
8059 struct wlan_mlme_psoc_ext_obj *mlme_obj;
8060
8061 mlme_obj = mlme_get_psoc_ext_obj(psoc);
8062 if (!mlme_obj)
8063 return cfg_default(CFG_DISABLE_SAP_BCN_PROT);
8064
8065 return mlme_obj->cfg.sap_cfg.disable_bcn_prot;
8066 }
8067
wlan_mlme_get_src_addr_from_frame(struct element_info * frame)8068 uint8_t *wlan_mlme_get_src_addr_from_frame(struct element_info *frame)
8069 {
8070 struct wlan_frame_hdr *hdr;
8071
8072 if (!frame || !frame->len || frame->len < WLAN_MAC_HDR_LEN_3A)
8073 return NULL;
8074
8075 hdr = (struct wlan_frame_hdr *)frame->ptr;
8076
8077 return hdr->i_addr2;
8078 }
8079
8080 bool
wlan_mlme_get_sap_ps_with_twt(struct wlan_objmgr_psoc * psoc)8081 wlan_mlme_get_sap_ps_with_twt(struct wlan_objmgr_psoc *psoc)
8082 {
8083 struct wlan_mlme_psoc_ext_obj *mlme_obj;
8084
8085 mlme_obj = mlme_get_psoc_ext_obj(psoc);
8086 if (!mlme_obj)
8087 return cfg_default(CFG_SAP_PS_WITH_TWT);
8088
8089 return mlme_obj->cfg.sap_cfg.sap_ps_with_twt_enable;
8090 }
8091
8092 /**
8093 * set_omi_ch_width() - set OMI ch_bw/eht_ch_bw_ext bit value from channel width
8094 * @ch_width: channel width
8095 * @omi_data: Pointer to omi_data object
8096 *
8097 * If the channel width is 20Mhz, 40Mhz, 80Mhz, 160Mhz and 80+80Mhz ch_bw set
8098 * to 0, 1, 2, 3 accordingly, if channel width is 320Mhz then eht_ch_bw_ext
8099 * set to 1
8100 *
8101 * Return: QDF_STATUS_SUCCESS on success or QDF_STATUS_E_INVAL on failure
8102 */
8103 static QDF_STATUS
set_omi_ch_width(enum phy_ch_width ch_width,struct omi_ctrl_tx * omi_data)8104 set_omi_ch_width(enum phy_ch_width ch_width, struct omi_ctrl_tx *omi_data)
8105 {
8106 switch (ch_width) {
8107 case CH_WIDTH_20MHZ:
8108 omi_data->ch_bw = 0;
8109 break;
8110 case CH_WIDTH_40MHZ:
8111 omi_data->ch_bw = 1;
8112 break;
8113 case CH_WIDTH_80MHZ:
8114 omi_data->ch_bw = 2;
8115 break;
8116 case CH_WIDTH_160MHZ:
8117 case CH_WIDTH_80P80MHZ:
8118 omi_data->ch_bw = 3;
8119 break;
8120 case CH_WIDTH_320MHZ:
8121 omi_data->eht_ch_bw_ext = 1;
8122 break;
8123 default:
8124 return QDF_STATUS_E_INVAL;
8125 }
8126
8127 return QDF_STATUS_SUCCESS;
8128 }
8129
8130 QDF_STATUS
wlan_mlme_set_ul_mu_config(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,uint8_t ulmu_disable)8131 wlan_mlme_set_ul_mu_config(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
8132 uint8_t ulmu_disable)
8133 {
8134 struct omi_ctrl_tx omi_data = {0};
8135 uint32_t param_val = 0;
8136 struct wlan_objmgr_pdev *pdev;
8137 struct wlan_objmgr_vdev *vdev;
8138 enum phy_ch_width ch_width;
8139 uint8_t rx_nss, tx_nsts;
8140 struct qdf_mac_addr macaddr = {0};
8141 enum wlan_phymode peer_phymode;
8142 qdf_freq_t op_chan_freq;
8143 qdf_freq_t freq_seg_0;
8144 QDF_STATUS status = QDF_STATUS_SUCCESS;
8145
8146 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
8147 WLAN_MLME_OBJMGR_ID);
8148 if (!vdev) {
8149 mlme_err("vdev %d: vdev is NULL", vdev_id);
8150 return QDF_STATUS_E_INVAL;
8151 }
8152
8153 pdev = wlan_vdev_get_pdev(vdev);
8154 if (!pdev) {
8155 mlme_err("pdev is NULL");
8156 status = QDF_STATUS_E_INVAL;
8157 goto err;
8158 }
8159
8160 if (!cm_is_vdevid_connected(pdev, vdev_id)) {
8161 mlme_err("STA is not connected, Session_id: %d", vdev_id);
8162 status = QDF_STATUS_E_INVAL;
8163 goto err;
8164 }
8165
8166 status = wlan_vdev_get_bss_peer_mac(vdev, &macaddr);
8167 if (QDF_STATUS_SUCCESS != status) {
8168 mlme_err("Failed to get bss peer mac, Err : %d", status);
8169 goto err;
8170 }
8171
8172 status = mlme_get_peer_phymode(psoc, macaddr.bytes, &peer_phymode);
8173 if (QDF_STATUS_SUCCESS != status) {
8174 mlme_err("Failed to get peer phymode, Err : %d", status);
8175 goto err;
8176 }
8177
8178 if (!(IS_WLAN_PHYMODE_HE(peer_phymode) ||
8179 IS_WLAN_PHYMODE_EHT(peer_phymode))) {
8180 mlme_err("Invalid mode");
8181 status = QDF_STATUS_E_INVAL;
8182 goto err;
8183 }
8184
8185 status = wlan_mlme_get_sta_rx_nss(psoc, vdev, &rx_nss);
8186 if (QDF_STATUS_SUCCESS != status) {
8187 mlme_err("Failed to get sta_rx_nss, Err : %d", status);
8188 goto err;
8189 }
8190
8191 status = wlan_mlme_get_sta_tx_nss(psoc, vdev, &tx_nsts);
8192 if (QDF_STATUS_SUCCESS != status) {
8193 mlme_err("Failed to get sta_tx_nss, Err : %d", status);
8194 goto err;
8195 }
8196
8197 status = wlan_get_op_chan_freq_info_vdev_id(pdev, vdev_id,
8198 &op_chan_freq,
8199 &freq_seg_0, &ch_width);
8200 if (QDF_STATUS_SUCCESS != status) {
8201 mlme_err("Failed to get bw, Err : %d", status);
8202 goto err;
8203 }
8204
8205 omi_data.omi_in_vht = 0x1;
8206 omi_data.omi_in_he = 0x1;
8207 omi_data.a_ctrl_id = 0x1;
8208
8209 status = set_omi_ch_width(ch_width, &omi_data);
8210 if (QDF_STATUS_SUCCESS != status) {
8211 mlme_err("Failed to set bw, Err : %d", status);
8212 goto err;
8213 }
8214
8215 omi_data.rx_nss = rx_nss - 1;
8216 omi_data.tx_nsts = tx_nsts - 1;
8217 omi_data.ul_mu_dis = ulmu_disable;
8218 omi_data.ul_mu_data_dis = 0;
8219
8220 qdf_mem_copy(¶m_val, &omi_data, sizeof(omi_data));
8221
8222 mlme_debug("OMI: BW %d TxNSTS %d RxNSS %d ULMU %d OMI_VHT %d OMI_HE %d, EHT OMI: BW %d RxNSS %d TxNSS %d, param val: %08X, bssid:" QDF_MAC_ADDR_FMT,
8223 omi_data.ch_bw, omi_data.tx_nsts, omi_data.rx_nss,
8224 omi_data.ul_mu_dis, omi_data.omi_in_vht, omi_data.omi_in_he,
8225 omi_data.eht_ch_bw_ext, omi_data.eht_rx_nss_ext,
8226 omi_data.eht_tx_nss_ext, param_val,
8227 QDF_MAC_ADDR_REF(macaddr.bytes));
8228
8229 status = wlan_util_vdev_peer_set_param_send(vdev, macaddr.bytes,
8230 WMI_PEER_PARAM_XMIT_OMI,
8231 param_val);
8232 if (QDF_STATUS_SUCCESS != status)
8233 mlme_err("set_peer_param_cmd returned %d", status);
8234
8235 err:
8236 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
8237 return status;
8238 }
8239
8240 uint32_t
wlan_mlme_assemble_rate_code(uint8_t preamble,uint8_t nss,uint8_t rate)8241 wlan_mlme_assemble_rate_code(uint8_t preamble, uint8_t nss, uint8_t rate)
8242 {
8243 uint32_t set_value;
8244
8245 if (wma_get_fw_wlan_feat_caps(DOT11AX))
8246 set_value = ASSEMBLE_RATECODE_V1(preamble, nss, rate);
8247 else
8248 set_value = (preamble << 6) | (nss << 4) | rate;
8249
8250 return set_value;
8251 }
8252
8253 QDF_STATUS
wlan_mlme_set_ap_oper_ch_width(struct wlan_objmgr_vdev * vdev,enum phy_ch_width ch_width)8254 wlan_mlme_set_ap_oper_ch_width(struct wlan_objmgr_vdev *vdev,
8255 enum phy_ch_width ch_width)
8256
8257 {
8258 struct mlme_legacy_priv *mlme_priv;
8259
8260 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
8261 if (!mlme_priv) {
8262 mlme_legacy_err("vdev %d legacy private object is NULL",
8263 wlan_vdev_get_id(vdev));
8264 return QDF_STATUS_E_FAILURE;
8265 }
8266
8267 mlme_priv->mlme_ap.oper_ch_width = ch_width;
8268 mlme_debug("SAP oper ch_width: %d, vdev %d",
8269 mlme_priv->mlme_ap.oper_ch_width, wlan_vdev_get_id(vdev));
8270
8271 return QDF_STATUS_SUCCESS;
8272 }
8273
8274 enum phy_ch_width
wlan_mlme_get_ap_oper_ch_width(struct wlan_objmgr_vdev * vdev)8275 wlan_mlme_get_ap_oper_ch_width(struct wlan_objmgr_vdev *vdev)
8276 {
8277 struct mlme_legacy_priv *mlme_priv;
8278
8279 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
8280 if (!mlme_priv) {
8281 mlme_legacy_err("vdev %d legacy private object is NULL",
8282 wlan_vdev_get_id(vdev));
8283 return CH_WIDTH_INVALID;
8284 }
8285
8286 return mlme_priv->mlme_ap.oper_ch_width;
8287 }
8288
8289 QDF_STATUS
wlan_mlme_send_csa_event_status_ind(struct wlan_objmgr_vdev * vdev,uint8_t csa_status)8290 wlan_mlme_send_csa_event_status_ind(struct wlan_objmgr_vdev *vdev,
8291 uint8_t csa_status)
8292 {
8293 return wlan_mlme_send_csa_event_status_ind_cmd(vdev, csa_status);
8294 }
8295
8296 #ifdef WLAN_FEATURE_11BE
8297 QDF_STATUS
wlan_mlme_get_bw_no_punct(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_vdev * vdev,struct wlan_channel * bss_chan,enum phy_ch_width * new_ch_width)8298 wlan_mlme_get_bw_no_punct(struct wlan_objmgr_psoc *psoc,
8299 struct wlan_objmgr_vdev *vdev,
8300 struct wlan_channel *bss_chan,
8301 enum phy_ch_width *new_ch_width)
8302 {
8303 uint16_t new_punct_bitmap = 0;
8304 enum phy_ch_width ch_width;
8305 QDF_STATUS status = QDF_STATUS_E_FAILURE;
8306 uint8_t country[REG_ALPHA2_LEN + 1];
8307
8308 if (!wlan_mlme_get_eht_disable_punct_in_us_lpi(psoc))
8309 return status;
8310
8311 wlan_reg_read_current_country(psoc, country);
8312
8313 if (!wlan_reg_is_6ghz_chan_freq(bss_chan->ch_freq) ||
8314 !bss_chan->puncture_bitmap ||
8315 qdf_mem_cmp(country, "US", REG_ALPHA2_LEN) ||
8316 mlme_get_best_6g_power_type(vdev) != REG_INDOOR_AP ||
8317 !IS_WLAN_PHYMODE_EHT(bss_chan->ch_phymode))
8318 goto err;
8319
8320 ch_width = bss_chan->ch_width;
8321
8322 while (ch_width != CH_WIDTH_INVALID) {
8323 status = wlan_reg_extract_puncture_by_bw(bss_chan->ch_width,
8324 bss_chan->puncture_bitmap,
8325 bss_chan->ch_freq,
8326 bss_chan->ch_cfreq2,
8327 ch_width,
8328 &new_punct_bitmap);
8329 if (QDF_IS_STATUS_SUCCESS(status) && new_punct_bitmap)
8330 ch_width = wlan_get_next_lower_bandwidth(ch_width);
8331 else
8332 break;
8333 }
8334
8335 if (ch_width == bss_chan->ch_width)
8336 return QDF_STATUS_E_FAILURE;
8337
8338 mlme_debug("freq %d ccfs2 %d punct 0x%x BW old %d, new %d",
8339 bss_chan->ch_freq, bss_chan->ch_cfreq2, bss_chan->puncture_bitmap,
8340 bss_chan->ch_width, ch_width);
8341
8342 *new_ch_width = ch_width;
8343 bss_chan->puncture_bitmap = 0;
8344 err:
8345 return status;
8346 }
8347
8348 QDF_STATUS
wlan_mlme_update_bw_no_punct(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id)8349 wlan_mlme_update_bw_no_punct(struct wlan_objmgr_psoc *psoc,
8350 uint8_t vdev_id)
8351 {
8352 struct wlan_objmgr_vdev *vdev;
8353 QDF_STATUS status = QDF_STATUS_E_FAILURE;
8354 enum phy_ch_width new_ch_width;
8355 struct wlan_objmgr_pdev *pdev;
8356
8357 if (!wlan_mlme_get_eht_disable_punct_in_us_lpi(psoc))
8358 return status;
8359
8360 pdev = wlan_objmgr_get_pdev_by_id(psoc, 0,
8361 WLAN_MLME_NB_ID);
8362 if (!pdev) {
8363 sme_err("pdev is NULL");
8364 return QDF_STATUS_E_FAILURE;
8365 }
8366 vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id,
8367 WLAN_MLME_NB_ID);
8368 if (!vdev) {
8369 mlme_err("VDEV not found for vdev id : %d", vdev_id);
8370 goto rel_pdev;
8371 }
8372
8373 status = wlan_mlme_get_bw_no_punct(psoc, vdev,
8374 wlan_vdev_mlme_get_des_chan(vdev),
8375 &new_ch_width);
8376 if (QDF_IS_STATUS_ERROR(status))
8377 goto rel_vdev;
8378
8379 status = wlan_mlme_send_ch_width_update_with_notify(psoc,
8380 vdev,
8381 vdev_id,
8382 new_ch_width);
8383 rel_vdev:
8384 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
8385 rel_pdev:
8386 wlan_objmgr_pdev_release_ref(pdev, WLAN_MLME_NB_ID);
8387
8388 return status;
8389 }
8390 #endif
8391
8392 QDF_STATUS
wlan_mlme_is_hs_20_btm_offload_disabled(struct wlan_objmgr_psoc * psoc,bool * val)8393 wlan_mlme_is_hs_20_btm_offload_disabled(struct wlan_objmgr_psoc *psoc,
8394 bool *val)
8395 {
8396 struct wlan_mlme_psoc_ext_obj *mlme_obj;
8397
8398 mlme_obj = mlme_get_psoc_ext_obj(psoc);
8399 if (!mlme_obj) {
8400 *val = cfg_default(CFG_HS_20_BTM_OFFLOAD_DISABLE);
8401 return QDF_STATUS_E_INVAL;
8402 }
8403
8404 *val = mlme_obj->cfg.lfr.hs20_btm_offload_disable;
8405
8406 return QDF_STATUS_SUCCESS;
8407 }
8408
wlan_mlme_set_keepalive_period(struct wlan_objmgr_vdev * vdev,uint16_t keep_alive_period)8409 void wlan_mlme_set_keepalive_period(struct wlan_objmgr_vdev *vdev,
8410 uint16_t keep_alive_period)
8411 {
8412 struct mlme_legacy_priv *mlme_priv;
8413
8414 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
8415 if (!mlme_priv) {
8416 mlme_err("vdev legacy private object is NULL");
8417 return;
8418 }
8419
8420 mlme_priv->keep_alive_period = keep_alive_period;
8421 }
8422
wlan_mlme_get_keepalive_period(struct wlan_objmgr_vdev * vdev)8423 uint16_t wlan_mlme_get_keepalive_period(struct wlan_objmgr_vdev *vdev)
8424 {
8425 struct mlme_legacy_priv *mlme_priv;
8426
8427 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
8428 if (!mlme_priv) {
8429 mlme_err("vdev legacy private object is NULL");
8430 return 0;
8431 }
8432
8433 return mlme_priv->keep_alive_period;
8434 }
8435