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