xref: /wlan-dirver/qca-wifi-host-cmn/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_utils_api.c (revision edf9fd0441a5a3b63c14b7bb754f301dd8d5e57c)
1 /*
2  * Copyright (c) 2019-2021, The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 /**
21  * DOC: wlan_vdev_mgr_utils_api.c
22  *
23  * This file provide definition for APIs to enable Tx Ops and Rx Ops registered
24  * through LMAC
25  */
26 #include <wlan_vdev_mgr_utils_api.h>
27 #include <wlan_vdev_mgr_tgt_if_tx_api.h>
28 #include <cdp_txrx_cmn_struct.h>
29 #include <wlan_mlme_dbg.h>
30 #include <qdf_module.h>
31 #include <wlan_vdev_mgr_tgt_if_tx_api.h>
32 #include <wlan_dfs_mlme_api.h>
33 #ifndef MOBILE_DFS_SUPPORT
34 #include <wlan_dfs_utils_api.h>
35 #endif /* MOBILE_DFS_SUPPORT */
36 #ifdef WLAN_FEATURE_11BE_MLO
37 #include <wlan_utility.h>
38 #include <wlan_mlo_mgr_sta.h>
39 #endif
40 
41 static QDF_STATUS vdev_mgr_config_ratemask_update(
42 				struct vdev_mlme_obj *mlme_obj,
43 				struct config_ratemask_params *param)
44 {
45 	struct wlan_objmgr_vdev *vdev;
46 
47 	vdev = mlme_obj->vdev;
48 	param->vdev_id = wlan_vdev_get_id(vdev);
49 	param->type = mlme_obj->mgmt.rate_info.type;
50 	param->lower32 = mlme_obj->mgmt.rate_info.lower32;
51 	param->higher32 = mlme_obj->mgmt.rate_info.higher32;
52 	param->lower32_2 = mlme_obj->mgmt.rate_info.lower32_2;
53 
54 	return QDF_STATUS_SUCCESS;
55 }
56 
57 enum wlan_op_subtype
58 wlan_util_vdev_get_cdp_txrx_subtype(struct wlan_objmgr_vdev *vdev)
59 {
60 	enum QDF_OPMODE qdf_opmode;
61 	enum wlan_op_subtype cdp_txrx_subtype;
62 
63 	qdf_opmode = wlan_vdev_mlme_get_opmode(vdev);
64 	switch (qdf_opmode) {
65 	case QDF_P2P_DEVICE_MODE:
66 		cdp_txrx_subtype = wlan_op_subtype_p2p_device;
67 		break;
68 	case QDF_P2P_CLIENT_MODE:
69 		cdp_txrx_subtype = wlan_op_subtype_p2p_cli;
70 		break;
71 	case QDF_P2P_GO_MODE:
72 		cdp_txrx_subtype = wlan_op_subtype_p2p_go;
73 		break;
74 	default:
75 		cdp_txrx_subtype = wlan_op_subtype_none;
76 	};
77 
78 	return cdp_txrx_subtype;
79 }
80 
81 enum wlan_op_mode
82 wlan_util_vdev_get_cdp_txrx_opmode(struct wlan_objmgr_vdev *vdev)
83 {
84 	enum QDF_OPMODE qdf_opmode;
85 	enum wlan_op_mode cdp_txrx_opmode;
86 
87 	qdf_opmode = wlan_vdev_mlme_get_opmode(vdev);
88 	switch (qdf_opmode) {
89 	case QDF_STA_MODE:
90 		cdp_txrx_opmode = wlan_op_mode_sta;
91 		break;
92 	case QDF_SAP_MODE:
93 		cdp_txrx_opmode = wlan_op_mode_ap;
94 		break;
95 	case QDF_MONITOR_MODE:
96 		cdp_txrx_opmode = wlan_op_mode_monitor;
97 		break;
98 	case QDF_P2P_DEVICE_MODE:
99 		cdp_txrx_opmode = wlan_op_mode_ap;
100 		break;
101 	case QDF_P2P_CLIENT_MODE:
102 		cdp_txrx_opmode = wlan_op_mode_sta;
103 		break;
104 	case QDF_P2P_GO_MODE:
105 		cdp_txrx_opmode = wlan_op_mode_ap;
106 		break;
107 	case QDF_OCB_MODE:
108 		cdp_txrx_opmode = wlan_op_mode_ocb;
109 		break;
110 	case QDF_IBSS_MODE:
111 		cdp_txrx_opmode = wlan_op_mode_ibss;
112 		break;
113 	case QDF_NDI_MODE:
114 		cdp_txrx_opmode = wlan_op_mode_ndi;
115 		break;
116 	default:
117 		cdp_txrx_opmode = wlan_op_mode_unknown;
118 	};
119 
120 	return cdp_txrx_opmode;
121 }
122 
123 QDF_STATUS
124 wlan_util_vdev_mlme_set_ratemask_config(struct vdev_mlme_obj *vdev_mlme)
125 {
126 	struct config_ratemask_params rm_param = {0};
127 
128 	if (!vdev_mlme) {
129 		mlme_err("VDEV MLME is NULL");
130 		return QDF_STATUS_E_FAILURE;
131 	}
132 
133 	vdev_mgr_config_ratemask_update(vdev_mlme, &rm_param);
134 
135 	return tgt_vdev_mgr_config_ratemask_cmd_send(vdev_mlme, &rm_param);
136 }
137 
138 qdf_export_symbol(wlan_util_vdev_mlme_set_ratemask_config);
139 
140 static QDF_STATUS
141 tgt_vdev_mgr_vdev_set_param_wrapper(struct vdev_mlme_obj *vdev_mlme,
142 				    enum wlan_mlme_cfg_id param_id,
143 				    struct wlan_vdev_mgr_cfg mlme_cfg)
144 {
145 	uint8_t id, count = 0;
146 	bool is_mbss_enabled, is_cmn_param = 0;
147 	unsigned long vdev_bmap = 0;
148 	struct wlan_objmgr_pdev *pdev;
149 	struct vdev_mlme_mbss_11ax *mbss;
150 	struct vdev_set_params param1 = {0};
151 	struct multiple_vdev_set_param param2 = {0};
152 	QDF_STATUS status = QDF_STATUS_SUCCESS;
153 
154 	mbss = &vdev_mlme->mgmt.mbss_11ax;
155 	is_mbss_enabled = (mbss->mbssid_flags
156 				& WLAN_VDEV_MLME_FLAGS_NON_MBSSID_AP) ? 0 : 1;
157 
158 	if (is_mbss_enabled) {
159 		vdev_bmap = mbss->vdev_bmap;
160 		is_cmn_param = mbss->is_cmn_param;
161 	}
162 
163 	/* 1. if non tx vap and cmn param, dont send any WMI
164 	 * 2. if tx vap and cmn param, send multi vdev set WMI
165 	 * 3. if non tx vap and non cmn param, send vdev set WMI
166 	 * 4. if tx vap and non cmn param, send vdev set WMI
167 	 * 5. if non mbss vap, send vdev set WMI
168 	 */
169 	if (!is_mbss_enabled || !is_cmn_param) {
170 		param1.param_id = param_id;
171 		param1.vdev_id = wlan_vdev_get_id(vdev_mlme->vdev);
172 		param1.param_value = mlme_cfg.value;
173 		return tgt_vdev_mgr_set_param_send(vdev_mlme, &param1);
174 	}
175 
176 	if (is_cmn_param && vdev_bmap) {
177 		pdev = wlan_vdev_get_pdev(vdev_mlme->vdev);
178 		param2.pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
179 		param2.param_id = param_id;
180 		param2.param_value = mlme_cfg.value;
181 
182 		for (id = 0; id < WLAN_UMAC_PDEV_MAX_VDEVS; id++) {
183 			if (qdf_test_bit(id, &vdev_bmap)) {
184 				param2.vdev_ids[count] = id;
185 				count++;
186 			}
187 		}
188 		param2.num_vdevs = count;
189 		status = tgt_vdev_mgr_multiple_vdev_set_param(pdev, &param2);
190 		mbss->vdev_bmap = 0;
191 	}
192 
193 	/* Reset the is_cmn_param for this vap */
194 	mbss->is_cmn_param = 0;
195 
196 	return status;
197 }
198 
199 QDF_STATUS
200 wlan_util_vdev_mlme_set_param(struct vdev_mlme_obj *vdev_mlme,
201 			      enum wlan_mlme_cfg_id param_id,
202 			      struct wlan_vdev_mgr_cfg mlme_cfg)
203 {
204 	struct wlan_objmgr_vdev *vdev;
205 	struct vdev_mlme_proto *mlme_proto;
206 	struct vdev_mlme_mgmt *mlme_mgmt;
207 	struct vdev_mlme_inactivity_params *inactivity_params;
208 	bool is_wmi_cmd = false;
209 	int ret = QDF_STATUS_SUCCESS;
210 
211 	if (!vdev_mlme) {
212 		mlme_err("VDEV MLME is NULL");
213 		return QDF_STATUS_E_FAILURE;
214 	}
215 	vdev = vdev_mlme->vdev;
216 	mlme_proto = &vdev_mlme->proto;
217 	mlme_mgmt = &vdev_mlme->mgmt;
218 	inactivity_params = &mlme_mgmt->inactivity_params;
219 
220 	switch (param_id) {
221 	case WLAN_MLME_CFG_DTIM_PERIOD:
222 		mlme_proto->generic.dtim_period = mlme_cfg.value;
223 		is_wmi_cmd = true;
224 		break;
225 	case WLAN_MLME_CFG_SLOT_TIME:
226 		mlme_proto->generic.slot_time = mlme_cfg.value;
227 		is_wmi_cmd = true;
228 		break;
229 	case WLAN_MLME_CFG_PROTECTION_MODE:
230 		mlme_proto->generic.protection_mode = mlme_cfg.value;
231 		is_wmi_cmd = true;
232 		break;
233 	case WLAN_MLME_CFG_BEACON_INTERVAL:
234 		mlme_proto->generic.beacon_interval = mlme_cfg.value;
235 		is_wmi_cmd = true;
236 		break;
237 	case WLAN_MLME_CFG_LDPC:
238 		mlme_proto->generic.ldpc = mlme_cfg.value;
239 		is_wmi_cmd = true;
240 		break;
241 	case WLAN_MLME_CFG_NSS:
242 		mlme_proto->generic.nss = mlme_cfg.value;
243 		is_wmi_cmd = true;
244 		break;
245 	case WLAN_MLME_CFG_TSF_ADJUST:
246 		mlme_proto->generic.tsfadjust = mlme_cfg.tsf;
247 		break;
248 	case WLAN_MLME_CFG_ASSOC_ID:
249 		mlme_proto->sta.assoc_id = mlme_cfg.value;
250 		break;
251 	case WLAN_MLME_CFG_VHT_CAPS:
252 		mlme_proto->vht_info.caps = mlme_cfg.value;
253 		break;
254 	case WLAN_MLME_CFG_SUBFER:
255 		mlme_proto->vht_info.subfer = mlme_cfg.value;
256 		break;
257 	case WLAN_MLME_CFG_MUBFER:
258 		mlme_proto->vht_info.mubfer = mlme_cfg.value;
259 		break;
260 	case WLAN_MLME_CFG_SUBFEE:
261 		mlme_proto->vht_info.subfee = mlme_cfg.value;
262 		break;
263 	case WLAN_MLME_CFG_MUBFEE:
264 		mlme_proto->vht_info.mubfee = mlme_cfg.value;
265 		break;
266 	case WLAN_MLME_CFG_IMLICIT_BF:
267 		mlme_proto->vht_info.implicit_bf = mlme_cfg.value;
268 		break;
269 	case WLAN_MLME_CFG_SOUNDING_DIM:
270 		mlme_proto->vht_info.sounding_dimension = mlme_cfg.value;
271 		break;
272 	case WLAN_MLME_CFG_BFEE_STS_CAP:
273 		mlme_proto->vht_info.bfee_sts_cap = mlme_cfg.value;
274 		break;
275 	case WLAN_MLME_CFG_TXBF_CAPS:
276 		is_wmi_cmd = true;
277 		break;
278 	case WLAN_MLME_CFG_HT_CAPS:
279 		mlme_proto->ht_info.ht_caps = mlme_cfg.value;
280 		break;
281 	case WLAN_MLME_CFG_HE_OPS:
282 		mlme_proto->he_ops_info.he_ops = mlme_cfg.value;
283 		is_wmi_cmd = true;
284 		break;
285 #ifdef WLAN_FEATURE_11BE
286 	case WLAN_MLME_CFG_EHT_OPS:
287 		mlme_proto->eht_ops_info.eht_ops = mlme_cfg.value;
288 		is_wmi_cmd = true;
289 		break;
290 #endif
291 	case WLAN_MLME_CFG_RTS_THRESHOLD:
292 		mlme_mgmt->generic.rts_threshold = mlme_cfg.value;
293 		is_wmi_cmd = true;
294 		break;
295 	case WLAN_MLME_CFG_FRAG_THRESHOLD:
296 		mlme_mgmt->generic.frag_threshold = mlme_cfg.value;
297 		is_wmi_cmd = true;
298 		break;
299 	case WLAN_MLME_CFG_PROBE_DELAY:
300 		mlme_mgmt->generic.probe_delay = mlme_cfg.value;
301 		break;
302 	case WLAN_MLME_CFG_REPEAT_PROBE_TIME:
303 		mlme_mgmt->generic.repeat_probe_time = mlme_cfg.value;
304 		break;
305 	case WLAN_MLME_CFG_DROP_UNENCRY:
306 		mlme_mgmt->generic.drop_unencry = mlme_cfg.value;
307 		is_wmi_cmd = true;
308 		break;
309 	case WLAN_MLME_CFG_TX_PWR_LIMIT:
310 		mlme_mgmt->generic.tx_pwrlimit = mlme_cfg.value;
311 		break;
312 	case WLAN_MLME_CFG_TX_POWER:
313 		mlme_mgmt->generic.tx_power = mlme_cfg.value;
314 		is_wmi_cmd = true;
315 		break;
316 	case WLAN_MLME_CFG_AMPDU:
317 		mlme_mgmt->generic.ampdu = mlme_cfg.value;
318 		mlme_cfg.value = (mlme_cfg.value << 8) + 0xFF;
319 		is_wmi_cmd = true;
320 		break;
321 	case WLAN_MLME_CFG_AMPDU_SIZE:
322 		mlme_mgmt->generic.ampdu = mlme_cfg.value;
323 		break;
324 	case WLAN_MLME_CFG_AMSDU:
325 		mlme_mgmt->generic.amsdu = mlme_cfg.value;
326 		mlme_cfg.value = (mlme_cfg.value << 8) + 0xFF;
327 		is_wmi_cmd = true;
328 		break;
329 	case WLAN_MLME_CFG_AMSDU_SIZE:
330 		mlme_mgmt->generic.amsdu = mlme_cfg.value;
331 		break;
332 	case WLAN_MLME_CFG_BMISS_FIRST_BCNT:
333 		inactivity_params->bmiss_first_bcnt = mlme_cfg.value;
334 		break;
335 	case WLAN_MLME_CFG_BMISS_FINAL_BCNT:
336 		inactivity_params->bmiss_final_bcnt = mlme_cfg.value;
337 		break;
338 	case WLAN_MLME_CFG_MIN_IDLE_INACTIVE_TIME:
339 		inactivity_params->keepalive_min_idle_inactive_time_secs =
340 							mlme_cfg.value;
341 		is_wmi_cmd = true;
342 		break;
343 	case WLAN_MLME_CFG_MAX_IDLE_INACTIVE_TIME:
344 		inactivity_params->keepalive_max_idle_inactive_time_secs =
345 							mlme_cfg.value;
346 		is_wmi_cmd = true;
347 		break;
348 	case WLAN_MLME_CFG_MAX_UNRESPONSIVE_INACTIVE_TIME:
349 		inactivity_params->keepalive_max_unresponsive_time_secs =
350 							mlme_cfg.value;
351 		is_wmi_cmd = true;
352 		break;
353 	case WLAN_MLME_CFG_RATE_FLAGS:
354 		mlme_mgmt->rate_info.rate_flags = mlme_cfg.value;
355 		break;
356 	case WLAN_MLME_CFG_PER_BAND_TX_MGMT_RATE:
357 		mlme_mgmt->rate_info.per_band_tx_mgmt_rate = mlme_cfg.value;
358 		break;
359 	case WLAN_MLME_CFG_MAX_RATE:
360 		mlme_mgmt->rate_info.max_rate = mlme_cfg.value;
361 		break;
362 	case WLAN_MLME_CFG_TX_MGMT_RATE:
363 		mlme_mgmt->rate_info.tx_mgmt_rate = mlme_cfg.value;
364 		break;
365 	case WLAN_MLME_CFG_TX_RTSCTS_RATE:
366 		mlme_mgmt->rate_info.rtscts_tx_rate = mlme_cfg.value;
367 		break;
368 	case WLAN_MLME_CFG_TX_CHAINMASK:
369 		mlme_mgmt->chainmask_info.tx_chainmask = mlme_cfg.value;
370 		break;
371 	case WLAN_MLME_CFG_RX_CHAINMASK:
372 		mlme_mgmt->chainmask_info.rx_chainmask = mlme_cfg.value;
373 		break;
374 	case WLAN_MLME_CFG_PKT_POWERSAVE:
375 		mlme_mgmt->powersave_info.packet_powersave = mlme_cfg.value;
376 		break;
377 	case WLAN_MLME_CFG_MAX_LI_OF_MODDTIM:
378 		mlme_mgmt->powersave_info.max_li_of_moddtim = mlme_cfg.value;
379 		break;
380 	case WLAN_MLME_CFG_DYNDTIM_CNT:
381 		mlme_mgmt->powersave_info.dyndtim_cnt = mlme_cfg.value;
382 		break;
383 	case WLAN_MLME_CFG_LISTEN_INTERVAL:
384 		mlme_mgmt->powersave_info.listen_interval = mlme_cfg.value;
385 		is_wmi_cmd = true;
386 		break;
387 	case WLAN_MLME_CFG_MODDTIM_CNT:
388 		mlme_mgmt->powersave_info.moddtim_cnt = mlme_cfg.value;
389 		break;
390 	case WLAN_MLME_CFG_PROFILE_IDX:
391 		mlme_mgmt->mbss_11ax.profile_idx = mlme_cfg.value;
392 		break;
393 	case WLAN_MLME_CFG_PROFILE_NUM:
394 		mlme_mgmt->mbss_11ax.profile_num = mlme_cfg.value;
395 		break;
396 	case WLAN_MLME_CFG_MBSSID_FLAGS:
397 		mlme_mgmt->mbss_11ax.mbssid_flags = mlme_cfg.value;
398 		break;
399 	case WLAN_MLME_CFG_VDEVID_TRANS:
400 		mlme_mgmt->mbss_11ax.vdevid_trans = mlme_cfg.value;
401 		break;
402 	case WLAN_MLME_CFG_SSID:
403 		if (mlme_cfg.ssid_cfg.length <= WLAN_SSID_MAX_LEN) {
404 			qdf_mem_copy(mlme_mgmt->generic.ssid,
405 				     mlme_cfg.ssid_cfg.ssid,
406 				     mlme_cfg.ssid_cfg.length);
407 			mlme_mgmt->generic.ssid_len =
408 						mlme_cfg.ssid_cfg.length;
409 		} else {
410 			mlme_mgmt->generic.ssid_len = 0;
411 		}
412 
413 		break;
414 	case WLAN_MLME_CFG_TRANS_BSSID:
415 		qdf_mem_copy(mlme_mgmt->mbss_11ax.trans_bssid,
416 			     mlme_cfg.trans_bssid, QDF_MAC_ADDR_SIZE);
417 		break;
418 	case WLAN_MLME_CFG_TYPE:
419 		mlme_mgmt->generic.type = mlme_cfg.value;
420 		break;
421 	case WLAN_MLME_CFG_SUBTYPE:
422 		mlme_mgmt->generic.subtype = mlme_cfg.value;
423 		break;
424 	case WLAN_MLME_CFG_UAPSD:
425 		mlme_proto->sta.uapsd_cfg = mlme_cfg.value;
426 		break;
427 	case WLAN_MLME_CFG_TX_ENCAP_TYPE:
428 		is_wmi_cmd = true;
429 		mlme_mgmt->generic.tx_encap_type = mlme_cfg.value;
430 		tgt_vdev_mgr_set_tx_rx_decap_type(vdev_mlme,
431 						  WLAN_MLME_CFG_TX_ENCAP_TYPE,
432 						  mlme_cfg.value);
433 		break;
434 	case WLAN_MLME_CFG_RX_DECAP_TYPE:
435 		is_wmi_cmd = true;
436 		mlme_mgmt->generic.rx_decap_type = mlme_cfg.value;
437 		tgt_vdev_mgr_set_tx_rx_decap_type(vdev_mlme,
438 						  WLAN_MLME_CFG_RX_DECAP_TYPE,
439 						  mlme_cfg.value);
440 		break;
441 	case WLAN_MLME_CFG_RATEMASK_TYPE:
442 		mlme_mgmt->rate_info.type = mlme_cfg.value;
443 		break;
444 	case WLAN_MLME_CFG_RATEMASK_LOWER32:
445 		mlme_mgmt->rate_info.lower32 = mlme_cfg.value;
446 		break;
447 	case WLAN_MLME_CFG_RATEMASK_HIGHER32:
448 		mlme_mgmt->rate_info.higher32 = mlme_cfg.value;
449 		break;
450 	case WLAN_MLME_CFG_RATEMASK_LOWER32_2:
451 		mlme_mgmt->rate_info.lower32_2 = mlme_cfg.value;
452 		break;
453 	case WLAN_MLME_CFG_BCN_TX_RATE:
454 		mlme_mgmt->rate_info.bcn_tx_rate = mlme_cfg.value;
455 		break;
456 	case WLAN_MLME_CFG_BCN_TX_RATE_CODE:
457 		is_wmi_cmd = true;
458 		break;
459 	case WLAN_MLME_CFG_TX_MGMT_RATE_CODE:
460 		is_wmi_cmd = true;
461 		break;
462 	case WLAN_MLME_CFG_ENABLE_MULTI_GROUP_KEY:
463 		is_wmi_cmd = true;
464 		break;
465 	case WLAN_MLME_CFG_MAX_GROUP_KEYS:
466 		is_wmi_cmd = true;
467 		break;
468 	case WLAN_MLME_CFG_TX_STREAMS:
469 		mlme_mgmt->chainmask_info.num_tx_chain = mlme_cfg.value;
470 		break;
471 	case WLAN_MLME_CFG_RX_STREAMS:
472 		mlme_mgmt->chainmask_info.num_rx_chain = mlme_cfg.value;
473 		break;
474 	case WLAN_MLME_CFG_ENABLE_DISABLE_RTT_RESPONDER_ROLE:
475 		is_wmi_cmd = true;
476 		break;
477 	case WLAN_MLME_CFG_ENABLE_DISABLE_RTT_INITIATOR_ROLE:
478 		is_wmi_cmd = true;
479 		break;
480 	default:
481 		break;
482 	}
483 
484 	if (is_wmi_cmd)
485 		ret = tgt_vdev_mgr_vdev_set_param_wrapper(vdev_mlme, param_id,
486 							  mlme_cfg);
487 
488 	return ret;
489 }
490 
491 qdf_export_symbol(wlan_util_vdev_mlme_set_param);
492 
493 void wlan_util_vdev_mlme_get_param(struct vdev_mlme_obj *vdev_mlme,
494 				   enum wlan_mlme_cfg_id param_id,
495 				   uint32_t *value)
496 {
497 	struct vdev_mlme_proto *mlme_proto;
498 	struct vdev_mlme_mgmt *mlme_mgmt;
499 	struct vdev_mlme_inactivity_params *inactivity_params;
500 
501 	if (!vdev_mlme) {
502 		mlme_err("VDEV MLME is NULL");
503 		return;
504 	}
505 	mlme_proto = &vdev_mlme->proto;
506 	mlme_mgmt = &vdev_mlme->mgmt;
507 	inactivity_params = &mlme_mgmt->inactivity_params;
508 
509 	switch (param_id) {
510 	case WLAN_MLME_CFG_DTIM_PERIOD:
511 		*value = mlme_proto->generic.dtim_period;
512 		break;
513 	case WLAN_MLME_CFG_SLOT_TIME:
514 		*value = mlme_proto->generic.slot_time;
515 		break;
516 	case WLAN_MLME_CFG_PROTECTION_MODE:
517 		*value = mlme_proto->generic.protection_mode;
518 		break;
519 	case WLAN_MLME_CFG_BEACON_INTERVAL:
520 		*value = mlme_proto->generic.beacon_interval;
521 		break;
522 	case WLAN_MLME_CFG_LDPC:
523 		*value = mlme_proto->generic.ldpc;
524 		break;
525 	case WLAN_MLME_CFG_NSS:
526 		*value = mlme_proto->generic.nss;
527 		break;
528 	case WLAN_MLME_CFG_ASSOC_ID:
529 		*value = mlme_proto->sta.assoc_id;
530 		break;
531 	case WLAN_MLME_CFG_VHT_CAPS:
532 		*value = mlme_proto->vht_info.caps;
533 		break;
534 	case WLAN_MLME_CFG_SUBFER:
535 		*value = mlme_proto->vht_info.subfer;
536 		break;
537 	case WLAN_MLME_CFG_MUBFER:
538 		*value = mlme_proto->vht_info.mubfer;
539 		break;
540 	case WLAN_MLME_CFG_SUBFEE:
541 		*value = mlme_proto->vht_info.subfee;
542 		break;
543 	case WLAN_MLME_CFG_MUBFEE:
544 		*value = mlme_proto->vht_info.mubfee;
545 		break;
546 	case WLAN_MLME_CFG_IMLICIT_BF:
547 		*value = mlme_proto->vht_info.implicit_bf;
548 		break;
549 	case WLAN_MLME_CFG_SOUNDING_DIM:
550 		*value = mlme_proto->vht_info.sounding_dimension;
551 		break;
552 	case WLAN_MLME_CFG_BFEE_STS_CAP:
553 		*value = mlme_proto->vht_info.bfee_sts_cap;
554 		break;
555 	case WLAN_MLME_CFG_HT_CAPS:
556 		*value = mlme_proto->ht_info.ht_caps;
557 		break;
558 	case WLAN_MLME_CFG_HE_OPS:
559 		*value = mlme_proto->he_ops_info.he_ops;
560 		break;
561 #ifdef WLAN_FEATURE_11BE
562 	case WLAN_MLME_CFG_EHT_OPS:
563 		*value = mlme_proto->eht_ops_info.eht_ops;
564 		break;
565 #endif
566 	case WLAN_MLME_CFG_RTS_THRESHOLD:
567 		*value = mlme_mgmt->generic.rts_threshold;
568 		break;
569 	case WLAN_MLME_CFG_FRAG_THRESHOLD:
570 		*value = mlme_mgmt->generic.frag_threshold;
571 		break;
572 	case WLAN_MLME_CFG_PROBE_DELAY:
573 		*value = mlme_mgmt->generic.probe_delay;
574 		break;
575 	case WLAN_MLME_CFG_REPEAT_PROBE_TIME:
576 		*value = mlme_mgmt->generic.repeat_probe_time;
577 		break;
578 	case WLAN_MLME_CFG_DROP_UNENCRY:
579 		*value = mlme_mgmt->generic.drop_unencry;
580 		break;
581 	case WLAN_MLME_CFG_TX_PWR_LIMIT:
582 		*value = mlme_mgmt->generic.tx_pwrlimit;
583 		break;
584 	case WLAN_MLME_CFG_TX_POWER:
585 		*value = mlme_mgmt->generic.tx_power;
586 		break;
587 	case WLAN_MLME_CFG_AMPDU:
588 		*value = mlme_mgmt->generic.ampdu;
589 		break;
590 	case WLAN_MLME_CFG_AMSDU:
591 		*value = mlme_mgmt->generic.amsdu;
592 		break;
593 	case WLAN_MLME_CFG_SSID_LEN:
594 		*value = mlme_mgmt->generic.ssid_len;
595 		break;
596 	case WLAN_MLME_CFG_BMISS_FIRST_BCNT:
597 		*value = inactivity_params->bmiss_first_bcnt;
598 		break;
599 	case WLAN_MLME_CFG_BMISS_FINAL_BCNT:
600 		*value = inactivity_params->bmiss_final_bcnt;
601 		break;
602 	case WLAN_MLME_CFG_MIN_IDLE_INACTIVE_TIME:
603 		*value =
604 		      inactivity_params->keepalive_min_idle_inactive_time_secs;
605 		break;
606 	case WLAN_MLME_CFG_MAX_IDLE_INACTIVE_TIME:
607 		*value =
608 		      inactivity_params->keepalive_max_idle_inactive_time_secs;
609 		break;
610 	case WLAN_MLME_CFG_MAX_UNRESPONSIVE_INACTIVE_TIME:
611 		*value =
612 		      inactivity_params->keepalive_max_unresponsive_time_secs;
613 		break;
614 	case WLAN_MLME_CFG_RATE_FLAGS:
615 		*value = mlme_mgmt->rate_info.rate_flags;
616 		break;
617 	case WLAN_MLME_CFG_PER_BAND_TX_MGMT_RATE:
618 		*value = mlme_mgmt->rate_info.per_band_tx_mgmt_rate;
619 		break;
620 	case WLAN_MLME_CFG_MAX_RATE:
621 		*value = mlme_mgmt->rate_info.max_rate;
622 		break;
623 	case WLAN_MLME_CFG_TX_MGMT_RATE:
624 		*value = mlme_mgmt->rate_info.tx_mgmt_rate;
625 		break;
626 	case WLAN_MLME_CFG_TX_RTSCTS_RATE:
627 		*value = mlme_mgmt->rate_info.rtscts_tx_rate;
628 		break;
629 	case WLAN_MLME_CFG_TX_CHAINMASK:
630 		*value = mlme_mgmt->chainmask_info.tx_chainmask;
631 		break;
632 	case WLAN_MLME_CFG_RX_CHAINMASK:
633 		*value = mlme_mgmt->chainmask_info.rx_chainmask;
634 		break;
635 	case WLAN_MLME_CFG_PKT_POWERSAVE:
636 		*value = mlme_mgmt->powersave_info.packet_powersave;
637 		break;
638 	case WLAN_MLME_CFG_MAX_LI_OF_MODDTIM:
639 		*value = mlme_mgmt->powersave_info.max_li_of_moddtim;
640 		break;
641 	case WLAN_MLME_CFG_DYNDTIM_CNT:
642 		*value = mlme_mgmt->powersave_info.dyndtim_cnt;
643 		break;
644 	case WLAN_MLME_CFG_LISTEN_INTERVAL:
645 		*value = mlme_mgmt->powersave_info.listen_interval;
646 		break;
647 	case WLAN_MLME_CFG_MODDTIM_CNT:
648 		*value = mlme_mgmt->powersave_info.moddtim_cnt;
649 		break;
650 	case WLAN_MLME_CFG_PROFILE_IDX:
651 		*value = mlme_mgmt->mbss_11ax.profile_idx;
652 		break;
653 	case WLAN_MLME_CFG_PROFILE_NUM:
654 		*value = mlme_mgmt->mbss_11ax.profile_num;
655 		break;
656 	case WLAN_MLME_CFG_MBSSID_FLAGS:
657 		*value = mlme_mgmt->mbss_11ax.mbssid_flags;
658 		break;
659 	case WLAN_MLME_CFG_VDEVID_TRANS:
660 		*value = mlme_mgmt->mbss_11ax.vdevid_trans;
661 		break;
662 	case WLAN_MLME_CFG_BCN_TX_RATE:
663 		*value = mlme_mgmt->rate_info.bcn_tx_rate;
664 		break;
665 	case WLAN_MLME_CFG_TX_STREAMS:
666 		*value = mlme_mgmt->chainmask_info.num_tx_chain;
667 		break;
668 	case WLAN_MLME_CFG_RX_STREAMS:
669 		*value = mlme_mgmt->chainmask_info.num_rx_chain;
670 		break;
671 	default:
672 		break;
673 	}
674 }
675 
676 qdf_export_symbol(wlan_util_vdev_mlme_get_param);
677 
678 void wlan_util_vdev_get_param(struct wlan_objmgr_vdev *vdev,
679 			      enum wlan_mlme_cfg_id param_id,
680 			      uint32_t *value)
681 {
682 	ucfg_wlan_vdev_mgr_get_param(vdev, param_id, value);
683 }
684 
685 qdf_export_symbol(wlan_util_vdev_get_param);
686 
687 #ifndef MOBILE_DFS_SUPPORT
688 int wlan_util_vdev_mgr_get_cac_timeout_for_vdev(struct wlan_objmgr_vdev *vdev)
689 {
690 	struct wlan_channel *des_chan = NULL;
691 	struct wlan_channel *bss_chan = NULL;
692 	bool continue_current_cac = 0;
693 	int dfs_cac_timeout = 0;
694 
695 	des_chan = wlan_vdev_mlme_get_des_chan(vdev);
696 	if (!des_chan)
697 		return 0;
698 
699 	bss_chan = wlan_vdev_mlme_get_bss_chan(vdev);
700 	if (!bss_chan)
701 		return 0;
702 
703 	if (!utils_dfs_is_cac_required(wlan_vdev_get_pdev(vdev), des_chan,
704 				       bss_chan, &continue_current_cac))
705 		return 0;
706 
707 	dfs_cac_timeout = dfs_mlme_get_cac_timeout_for_freq(
708 				wlan_vdev_get_pdev(vdev), des_chan->ch_freq,
709 				des_chan->ch_cfreq2, des_chan->ch_flags);
710 	/* Seconds to milliseconds */
711 	return SECONDS_TO_MS(dfs_cac_timeout);
712 }
713 #else
714 int wlan_util_vdev_mgr_get_cac_timeout_for_vdev(struct wlan_objmgr_vdev *vdev)
715 {
716 	struct vdev_mlme_obj *vdev_mlme;
717 
718 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
719 	if (!vdev_mlme) {
720 		mlme_err("vdev_mlme is null");
721 		return 0;
722 	}
723 
724 	return vdev_mlme->mgmt.ap.cac_duration_ms;
725 }
726 
727 void wlan_util_vdev_mgr_set_cac_timeout_for_vdev(struct wlan_objmgr_vdev *vdev,
728 						 uint32_t new_chan_cac_ms)
729 {
730 	struct vdev_mlme_obj *vdev_mlme;
731 
732 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
733 	if (!vdev_mlme) {
734 		mlme_err("vdev_mlme is null");
735 		return;
736 	}
737 
738 	vdev_mlme->mgmt.ap.cac_duration_ms = new_chan_cac_ms;
739 }
740 #endif /* MOBILE_DFS_SUPPORT */
741 
742 QDF_STATUS wlan_util_vdev_mgr_get_csa_channel_switch_time(
743 		struct wlan_objmgr_vdev *vdev,
744 		uint32_t *chan_switch_time)
745 {
746 	struct vdev_mlme_obj *vdev_mlme = NULL;
747 
748 	*chan_switch_time = 0;
749 
750 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
751 	if (!vdev_mlme) {
752 		mlme_err("vdev_mlme is null");
753 		return QDF_STATUS_E_FAILURE;
754 	}
755 
756 	/* Time between CSA count 1 and CSA count 0 is one beacon interval. */
757 	*chan_switch_time = vdev_mlme->proto.generic.beacon_interval;
758 
759 	/* Vdev restart time */
760 	*chan_switch_time += SECONDS_TO_MS(VDEV_RESTART_TIME);
761 
762 	/* Add one beacon interval time required to send beacon on the
763 	 * new channel after switching to the new channel.
764 	 */
765 	*chan_switch_time += vdev_mlme->proto.generic.beacon_interval;
766 
767 	return QDF_STATUS_SUCCESS;
768 }
769 
770 QDF_STATUS wlan_util_vdev_mgr_compute_max_channel_switch_time(
771 		struct wlan_objmgr_vdev *vdev, uint32_t *max_chan_switch_time)
772 {
773 	QDF_STATUS status;
774 
775 	status = wlan_util_vdev_mgr_get_csa_channel_switch_time(
776 			vdev, max_chan_switch_time);
777 	if (QDF_IS_STATUS_ERROR(status)) {
778 		mlme_err("Failed to get the CSA channel switch time");
779 		return status;
780 	}
781 
782 	/* Plus the CAC time */
783 	*max_chan_switch_time +=
784 			wlan_util_vdev_mgr_get_cac_timeout_for_vdev(vdev);
785 
786 	return QDF_STATUS_SUCCESS;
787 }
788 
789 uint32_t
790 wlan_utils_get_vdev_remaining_channel_switch_time(struct wlan_objmgr_vdev *vdev)
791 {
792 	struct vdev_mlme_obj *vdev_mlme = NULL;
793 	int32_t remaining_chan_switch_time;
794 
795 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
796 	if (!vdev_mlme)
797 		return 0;
798 
799 	if (!vdev_mlme->mgmt.ap.last_bcn_ts_ms)
800 		return 0;
801 
802 	/* Remaining channel switch time is equal to the time when last beacon
803 	 * sent on the CSA triggered vap plus max channel switch time minus
804 	 * current time.
805 	 */
806 	remaining_chan_switch_time =
807 	    ((vdev_mlme->mgmt.ap.last_bcn_ts_ms +
808 	      vdev_mlme->mgmt.ap.max_chan_switch_time) -
809 	     qdf_mc_timer_get_system_time());
810 
811 	return (remaining_chan_switch_time > 0) ?
812 		remaining_chan_switch_time : 0;
813 }
814 
815 #ifdef WLAN_FEATURE_11BE_MLO
816 QDF_STATUS wlan_util_vdev_mgr_quiet_offload(
817 				struct wlan_objmgr_psoc *psoc,
818 				struct vdev_sta_quiet_event *quiet_event)
819 {
820 	uint8_t vdev_id;
821 	bool connected;
822 	struct wlan_objmgr_vdev *vdev;
823 
824 	if (qdf_is_macaddr_zero(&quiet_event->mld_mac) &&
825 	    qdf_is_macaddr_zero(&quiet_event->link_mac)) {
826 		mlme_err("mld_mac and link mac are invalid");
827 		return QDF_STATUS_E_INVAL;
828 	}
829 
830 	if (!qdf_is_macaddr_zero(&quiet_event->mld_mac)) {
831 		connected = wlan_get_connected_vdev_by_mld_addr(
832 				psoc, quiet_event->mld_mac.bytes, &vdev_id);
833 		if (!connected) {
834 			mlme_err("Can't find vdev with mld " QDF_MAC_ADDR_FMT,
835 				 QDF_MAC_ADDR_REF(quiet_event->mld_mac.bytes));
836 			return QDF_STATUS_E_INVAL;
837 		}
838 		vdev = wlan_objmgr_get_vdev_by_id_from_psoc(
839 				psoc, vdev_id, WLAN_MLME_OBJMGR_ID);
840 		if (!vdev) {
841 			mlme_err("Null vdev");
842 			return QDF_STATUS_E_INVAL;
843 		}
844 		if (wlan_vdev_mlme_is_mlo_vdev(vdev))
845 			mlo_sta_save_quiet_status(vdev->mlo_dev_ctx,
846 						  quiet_event->link_id,
847 						  quiet_event->quiet_status);
848 		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
849 	} else if (!qdf_is_macaddr_zero(&quiet_event->link_mac)) {
850 		connected = wlan_get_connected_vdev_from_psoc_by_bssid(
851 				psoc, quiet_event->link_mac.bytes, &vdev_id);
852 		if (!connected) {
853 			mlme_err("Can't find vdev with BSSID" QDF_MAC_ADDR_FMT,
854 				 QDF_MAC_ADDR_REF(quiet_event->link_mac.bytes));
855 			return QDF_STATUS_E_INVAL;
856 		}
857 		vdev = wlan_objmgr_get_vdev_by_id_from_psoc(
858 				psoc, vdev_id, WLAN_MLME_OBJMGR_ID);
859 		if (!vdev) {
860 			mlme_err("Null vdev");
861 			return QDF_STATUS_E_INVAL;
862 		}
863 		if (wlan_vdev_mlme_is_mlo_vdev(vdev))
864 			mlo_sta_save_quiet_status(vdev->mlo_dev_ctx,
865 						  wlan_vdev_get_link_id(vdev),
866 						  quiet_event->quiet_status);
867 		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
868 	}
869 
870 	return QDF_STATUS_SUCCESS;
871 }
872 #endif /* WLAN_FEATURE_11BE_MLO */
873