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