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