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