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