xref: /wlan-dirver/qca-wifi-host-cmn/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_tgt_if_tx_api.c (revision 5ee6661e575b5422cbb88a7703b46f397b551bd9)
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_tgt_if_tx_api.c
22  *
23  * This file provides definitions for mlme tgt_if APIs, which will
24  * further call target_if/mlme component using LMAC MLME txops
25  */
26 #include <wlan_vdev_mgr_tgt_if_tx_api.h>
27 #include <target_if_vdev_mgr_tx_ops.h>
28 #include "include/wlan_vdev_mlme.h"
29 #include <wlan_mlme_dbg.h>
30 #include <cdp_txrx_cmn_struct.h>
31 #include <cdp_txrx_cmn.h>
32 #include <wlan_lmac_if_api.h>
33 #include <wlan_utility.h>
34 #include <cdp_txrx_ctrl.h>
35 #include <wlan_vdev_mlme_api.h>
36 #include <wlan_dfs_utils_api.h>
37 #include <wlan_vdev_mgr_utils_api.h>
38 #include <wlan_vdev_mgr_ucfg_api.h>
39 #include <wlan_vdev_mlme_main.h>
40 
41 static inline struct wlan_lmac_if_mlme_tx_ops
42 *wlan_vdev_mlme_get_lmac_txops(struct wlan_objmgr_vdev *vdev)
43 {
44 	struct wlan_objmgr_psoc *psoc;
45 
46 	psoc = wlan_vdev_get_psoc(vdev);
47 
48 	return target_if_vdev_mgr_get_tx_ops(psoc);
49 }
50 
51 #ifdef WLAN_FEATURE_11BE_MLO
52 static inline void
53 wlan_vdev_mgr_fill_mlo_params(struct cdp_vdev_info *vdev_info,
54 			      struct vdev_create_params *param)
55 {
56 	vdev_info->mld_mac_addr = param->mlo_mac;
57 }
58 #else
59 static inline void
60 wlan_vdev_mgr_fill_mlo_params(struct cdp_vdev_info *vdev_info,
61 			      struct vdev_create_params *param)
62 {
63 }
64 #endif
65 
66 QDF_STATUS tgt_vdev_mgr_create_send(
67 				struct vdev_mlme_obj *mlme_obj,
68 				struct vdev_create_params *param)
69 {
70 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
71 	struct wlan_lmac_if_mlme_tx_ops *txops;
72 	struct wlan_objmgr_psoc *psoc;
73 	struct wlan_objmgr_pdev *pdev;
74 	struct wlan_objmgr_vdev *vdev;
75 	ol_txrx_soc_handle soc_txrx_handle;
76 	uint32_t vdev_id;
77 	struct cdp_vdev_info vdev_info = { 0 };
78 
79 	if (!param) {
80 		mlme_err("Invalid input");
81 		return QDF_STATUS_E_INVAL;
82 	}
83 
84 	vdev = mlme_obj->vdev;
85 	vdev_id = wlan_vdev_get_id(vdev);
86 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
87 	if (!txops || !txops->vdev_create_send) {
88 		mlme_err("VDEV_%d No Tx Ops", vdev_id);
89 		return QDF_STATUS_E_INVAL;
90 	}
91 
92 	psoc = wlan_vdev_get_psoc(vdev);
93 	if (!psoc) {
94 		mlme_err("psoc object is NULL");
95 		return QDF_STATUS_E_INVAL;
96 	}
97 
98 	status = txops->vdev_create_send(vdev, param);
99 	if (QDF_IS_STATUS_ERROR(status)) {
100 		mlme_err("VDEV_%d PSOC_%d Tx Ops Error : %d", vdev_id,
101 			 wlan_psoc_get_id(psoc), status);
102 		return status;
103 	}
104 
105 	vdev_info.vdev_mac_addr = wlan_vdev_mlme_get_macaddr(vdev);
106 	vdev_info.vdev_id = vdev_id;
107 	vdev_info.vdev_stats_id = param->vdev_stats_id;
108 	vdev_info.op_mode = wlan_util_vdev_get_cdp_txrx_opmode(vdev);
109 	vdev_info.subtype = wlan_util_vdev_get_cdp_txrx_subtype(vdev);
110 	wlan_vdev_mgr_fill_mlo_params(&vdev_info, param);
111 	pdev = wlan_vdev_get_pdev(vdev);
112 
113 	soc_txrx_handle = wlan_psoc_get_dp_handle(psoc);
114 	if (!soc_txrx_handle)
115 		return QDF_STATUS_E_FAILURE;
116 
117 
118 	return cdp_vdev_attach(soc_txrx_handle,
119 			       wlan_objmgr_pdev_get_pdev_id(pdev),
120 			       &vdev_info);
121 }
122 
123 QDF_STATUS tgt_vdev_mgr_create_complete(struct vdev_mlme_obj *vdev_mlme)
124 {
125 	struct wlan_objmgr_vdev *vdev;
126 	struct vdev_set_params param = {0};
127 	struct wlan_lmac_if_mlme_tx_ops *txops;
128 	struct vdev_mlme_inactivity_params *inactivity;
129 	uint8_t vdev_id;
130 	QDF_STATUS status = QDF_STATUS_SUCCESS;
131 
132 	vdev = vdev_mlme->vdev;
133 	vdev_id = wlan_vdev_get_id(vdev);
134 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
135 	if (!txops || !txops->vdev_set_param_send) {
136 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
137 		return QDF_STATUS_E_INVAL;
138 	}
139 
140 	inactivity = &vdev_mlme->mgmt.inactivity_params;
141 
142 	param.vdev_id = vdev_id;
143 
144 	param.param_value =
145 		inactivity->keepalive_min_idle_inactive_time_secs;
146 	param.param_id = WLAN_MLME_CFG_MIN_IDLE_INACTIVE_TIME;
147 	status = txops->vdev_set_param_send(vdev, &param);
148 	if (QDF_IS_STATUS_ERROR(status))
149 		mlme_err("VDEV_%d: Failed to set min idle inactive time!",
150 			 vdev_id);
151 
152 	param.param_value =
153 		inactivity->keepalive_max_idle_inactive_time_secs;
154 	param.param_id = WLAN_MLME_CFG_MAX_IDLE_INACTIVE_TIME;
155 	status = txops->vdev_set_param_send(vdev, &param);
156 	if (QDF_IS_STATUS_ERROR(status))
157 		mlme_err("VDEV_%d: Failed to set max idle inactive time!",
158 			 vdev_id);
159 
160 	param.param_value =
161 		inactivity->keepalive_max_unresponsive_time_secs;
162 	param.param_id = WLAN_MLME_CFG_MAX_UNRESPONSIVE_INACTIVE_TIME;
163 	status = txops->vdev_set_param_send(vdev, &param);
164 	if (QDF_IS_STATUS_ERROR(status))
165 		mlme_err("VDEV_%d: Failed to set max unresponse inactive time!",
166 			 vdev_id);
167 
168 	return status;
169 }
170 
171 QDF_STATUS tgt_vdev_mgr_start_send(
172 				struct vdev_mlme_obj *mlme_obj,
173 				struct vdev_start_params *param)
174 {
175 	QDF_STATUS status;
176 	struct wlan_lmac_if_mlme_tx_ops *txops;
177 	struct wlan_objmgr_vdev *vdev;
178 	uint8_t vdev_id;
179 
180 	if (!param) {
181 		mlme_err("Invalid input");
182 		return QDF_STATUS_E_INVAL;
183 	}
184 
185 	vdev = mlme_obj->vdev;
186 	vdev_id = wlan_vdev_get_id(vdev);
187 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
188 	if (!txops || !txops->vdev_start_send) {
189 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
190 		return QDF_STATUS_E_INVAL;
191 	}
192 
193 	status = txops->vdev_start_send(vdev, param);
194 	if (QDF_IS_STATUS_ERROR(status))
195 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
196 
197 	return status;
198 }
199 
200 QDF_STATUS tgt_vdev_mgr_delete_send(
201 				struct vdev_mlme_obj *mlme_obj,
202 				struct vdev_delete_params *param)
203 {
204 	QDF_STATUS status;
205 	struct wlan_lmac_if_mlme_tx_ops *txops;
206 	struct wlan_objmgr_vdev *vdev;
207 	struct wlan_objmgr_psoc *psoc;
208 	ol_txrx_soc_handle soc_txrx_handle;
209 	uint8_t vdev_id;
210 
211 	if (!param) {
212 		mlme_err("Invalid input");
213 		return QDF_STATUS_E_INVAL;
214 	}
215 
216 	vdev = mlme_obj->vdev;
217 	vdev_id = wlan_vdev_get_id(vdev);
218 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
219 	if (!txops || !txops->vdev_delete_send) {
220 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
221 		return QDF_STATUS_E_INVAL;
222 	}
223 
224 	psoc = wlan_vdev_get_psoc(vdev);
225 	soc_txrx_handle = wlan_psoc_get_dp_handle(psoc);
226 	if (soc_txrx_handle)
227 		cdp_vdev_detach(soc_txrx_handle, wlan_vdev_get_id(vdev),
228 				NULL, NULL);
229 
230 	status = txops->vdev_delete_send(vdev, param);
231 	if (QDF_IS_STATUS_ERROR(status))
232 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
233 
234 	return status;
235 }
236 
237 QDF_STATUS tgt_vdev_mgr_peer_flush_tids_send(
238 				struct vdev_mlme_obj *mlme_obj,
239 				struct peer_flush_params *param)
240 {
241 	QDF_STATUS status;
242 	struct wlan_lmac_if_mlme_tx_ops *txops;
243 	struct wlan_objmgr_vdev *vdev;
244 	uint8_t vdev_id;
245 
246 	if (!param) {
247 		mlme_err("Invalid input");
248 		return QDF_STATUS_E_INVAL;
249 	}
250 
251 	vdev = mlme_obj->vdev;
252 	vdev_id = wlan_vdev_get_id(vdev);
253 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
254 	if (!txops || !txops->peer_flush_tids_send) {
255 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
256 		return QDF_STATUS_E_INVAL;
257 	}
258 
259 	status = txops->peer_flush_tids_send(vdev, param);
260 	if (QDF_IS_STATUS_ERROR(status))
261 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
262 
263 	return QDF_STATUS_SUCCESS;
264 }
265 
266 QDF_STATUS tgt_vdev_mgr_stop_send(
267 				struct vdev_mlme_obj *mlme_obj,
268 				struct vdev_stop_params *param)
269 {
270 	QDF_STATUS status;
271 	struct wlan_lmac_if_mlme_tx_ops *txops;
272 	struct wlan_objmgr_vdev *vdev;
273 	uint8_t vdev_id;
274 
275 	if (!param) {
276 		mlme_err("Invalid input");
277 		return QDF_STATUS_E_INVAL;
278 	}
279 
280 	vdev = mlme_obj->vdev;
281 	vdev_id = wlan_vdev_get_id(vdev);
282 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
283 	if (!txops || !txops->vdev_stop_send) {
284 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
285 		return QDF_STATUS_E_INVAL;
286 	}
287 
288 	status = txops->vdev_stop_send(vdev, param);
289 	if (QDF_IS_STATUS_ERROR(status))
290 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
291 
292 	return status;
293 }
294 
295 QDF_STATUS tgt_vdev_mgr_beacon_stop(struct vdev_mlme_obj *mlme_obj)
296 {
297 	return QDF_STATUS_SUCCESS;
298 }
299 
300 QDF_STATUS tgt_vdev_mgr_beacon_free(struct vdev_mlme_obj *mlme_obj)
301 {
302 	return QDF_STATUS_SUCCESS;
303 }
304 
305 QDF_STATUS tgt_vdev_mgr_up_send(
306 				struct vdev_mlme_obj *mlme_obj,
307 				struct vdev_up_params *param)
308 {
309 	QDF_STATUS status;
310 	struct wlan_lmac_if_mlme_tx_ops *txops;
311 	ol_txrx_soc_handle soc_txrx_handle;
312 	struct wlan_objmgr_psoc *psoc;
313 	struct wlan_objmgr_vdev *vdev;
314 	uint8_t vdev_id;
315 
316 	if (!param) {
317 		mlme_err("Invalid input");
318 		return QDF_STATUS_E_INVAL;
319 	}
320 
321 	vdev = mlme_obj->vdev;
322 	vdev_id = wlan_vdev_get_id(vdev);
323 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
324 	if (!txops || !txops->vdev_up_send) {
325 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
326 		return QDF_STATUS_E_INVAL;
327 	}
328 
329 	/* cdp set rx and tx decap type */
330 	psoc = wlan_vdev_get_psoc(vdev);
331 	soc_txrx_handle = wlan_psoc_get_dp_handle(psoc);
332 	if (!soc_txrx_handle || vdev_id == WLAN_INVALID_VDEV_ID)
333 		return QDF_STATUS_E_INVAL;
334 
335 	status = txops->vdev_up_send(vdev, param);
336 	if (QDF_IS_STATUS_ERROR(status))
337 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
338 
339 	return status;
340 }
341 
342 QDF_STATUS tgt_vdev_mgr_down_send(
343 				struct vdev_mlme_obj *mlme_obj,
344 				struct vdev_down_params *param)
345 {
346 	QDF_STATUS status;
347 	struct wlan_lmac_if_mlme_tx_ops *txops;
348 	struct wlan_objmgr_pdev *pdev;
349 	struct wlan_objmgr_vdev *vdev;
350 	enum QDF_OPMODE opmode;
351 	uint8_t vdev_id;
352 
353 	if (!param) {
354 		mlme_err("Invalid input");
355 		return QDF_STATUS_E_INVAL;
356 	}
357 
358 	vdev = mlme_obj->vdev;
359 	vdev_id = wlan_vdev_get_id(vdev);
360 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
361 	if (!txops || !txops->vdev_down_send) {
362 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
363 		return QDF_STATUS_E_INVAL;
364 	}
365 
366 	pdev = wlan_vdev_get_pdev(vdev);
367 	if (!pdev) {
368 		mlme_err("PDEV is NULL");
369 		return QDF_STATUS_E_INVAL;
370 	}
371 
372 	opmode = wlan_vdev_mlme_get_opmode(vdev);
373 	if (wlan_util_is_vdev_active(pdev, WLAN_VDEV_TARGET_IF_ID) ==
374 						QDF_STATUS_SUCCESS) {
375 
376 		if (opmode == QDF_SAP_MODE)
377 			utils_dfs_cancel_precac_timer(pdev);
378 	}
379 
380 	status = txops->vdev_down_send(vdev, param);
381 	if (QDF_IS_STATUS_ERROR(status))
382 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
383 
384 	return status;
385 }
386 
387 QDF_STATUS tgt_vdev_mgr_set_neighbour_rx_cmd_send(
388 				struct vdev_mlme_obj *mlme_obj,
389 				struct set_neighbour_rx_params *param)
390 {
391 	return QDF_STATUS_SUCCESS;
392 }
393 
394 QDF_STATUS tgt_vdev_mgr_nac_rssi_send(
395 				struct vdev_mlme_obj *mlme_obj,
396 				struct vdev_scan_nac_rssi_params *param)
397 {
398 	return QDF_STATUS_SUCCESS;
399 }
400 
401 QDF_STATUS tgt_vdev_mgr_sifs_trigger_send(
402 				struct vdev_mlme_obj *mlme_obj,
403 				struct sifs_trigger_param *param)
404 {
405 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
406 	struct wlan_lmac_if_mlme_tx_ops *txops;
407 	struct wlan_objmgr_vdev *vdev;
408 	uint8_t vdev_id;
409 
410 	if (!param) {
411 		mlme_err("Invalid input");
412 		return QDF_STATUS_E_INVAL;
413 	}
414 
415 	vdev = mlme_obj->vdev;
416 	vdev_id = wlan_vdev_get_id(vdev);
417 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
418 	if (!txops || !txops->vdev_sifs_trigger_send) {
419 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
420 		return QDF_STATUS_E_INVAL;
421 	}
422 
423 	status = txops->vdev_sifs_trigger_send(vdev, param);
424 	if (QDF_IS_STATUS_ERROR(status))
425 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
426 
427 	return status;
428 }
429 
430 QDF_STATUS tgt_vdev_mgr_set_custom_aggr_size_send(
431 				struct vdev_mlme_obj *mlme_obj,
432 				struct set_custom_aggr_size_params *param)
433 {
434 	QDF_STATUS status;
435 	struct wlan_lmac_if_mlme_tx_ops *txops;
436 	struct wlan_objmgr_vdev *vdev;
437 	uint8_t vdev_id;
438 
439 	if (!param) {
440 		mlme_err("Invalid input");
441 		return QDF_STATUS_E_INVAL;
442 	}
443 
444 	vdev = mlme_obj->vdev;
445 	vdev_id = wlan_vdev_get_id(vdev);
446 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
447 	if (!txops || !txops->vdev_set_custom_aggr_size_cmd_send) {
448 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
449 		return QDF_STATUS_E_INVAL;
450 	}
451 
452 	status = txops->vdev_set_custom_aggr_size_cmd_send(vdev, param);
453 	if (QDF_IS_STATUS_ERROR(status))
454 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
455 
456 	return status;
457 }
458 
459 QDF_STATUS tgt_vdev_mgr_config_ratemask_cmd_send(
460 				struct vdev_mlme_obj *mlme_obj,
461 				struct config_ratemask_params *param)
462 {
463 	QDF_STATUS status;
464 	struct wlan_lmac_if_mlme_tx_ops *txops;
465 	struct wlan_objmgr_vdev *vdev;
466 	uint8_t vdev_id;
467 
468 	vdev = mlme_obj->vdev;
469 	vdev_id = wlan_vdev_get_id(vdev);
470 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
471 	if (!txops || !txops->vdev_config_ratemask_cmd_send) {
472 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
473 		return QDF_STATUS_E_INVAL;
474 	}
475 
476 	status = txops->vdev_config_ratemask_cmd_send(vdev, param);
477 	if (QDF_IS_STATUS_ERROR(status))
478 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
479 
480 	return status;
481 }
482 
483 QDF_STATUS tgt_vdev_mgr_beacon_cmd_send(
484 				struct vdev_mlme_obj *mlme_obj,
485 				struct beacon_params *param)
486 {
487 	return QDF_STATUS_SUCCESS;
488 }
489 
490 QDF_STATUS tgt_vdev_mgr_beacon_tmpl_send(
491 				struct vdev_mlme_obj *mlme_obj,
492 				struct beacon_tmpl_params *param)
493 {
494 	return QDF_STATUS_SUCCESS;
495 }
496 
497 #if defined(WLAN_SUPPORT_FILS) || defined(CONFIG_BAND_6GHZ)
498 QDF_STATUS tgt_vdev_mgr_fils_enable_send(
499 				struct vdev_mlme_obj *mlme_obj,
500 				struct config_fils_params *param)
501 {
502 	QDF_STATUS status;
503 	struct wlan_lmac_if_mlme_tx_ops *txops;
504 	struct wlan_objmgr_vdev *vdev;
505 	uint8_t vdev_id;
506 
507 	vdev = mlme_obj->vdev;
508 	vdev_id = wlan_vdev_get_id(vdev);
509 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
510 	if (!txops || !txops->vdev_fils_enable_send) {
511 		mlme_err("VDEV_%d: No Tx Ops fils Enable", vdev_id);
512 		return QDF_STATUS_E_INVAL;
513 	}
514 
515 	status = txops->vdev_fils_enable_send(vdev, param);
516 	if (QDF_IS_STATUS_ERROR(status))
517 		mlme_err("VDEV_%d: Tx Ops fils Enable Error : %d",
518 			 vdev_id, status);
519 
520 	return status;
521 }
522 #endif
523 
524 QDF_STATUS tgt_vdev_mgr_multiple_vdev_restart_send(
525 				struct wlan_objmgr_pdev *pdev,
526 				struct multiple_vdev_restart_params *param)
527 {
528 	QDF_STATUS status = QDF_STATUS_SUCCESS;
529 	struct wlan_lmac_if_mlme_tx_ops *txops;
530 	struct wlan_objmgr_vdev *vdev;
531 
532 	if (!param) {
533 		mlme_err("Invalid input");
534 		return QDF_STATUS_E_INVAL;
535 	}
536 
537 	vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev,
538 						    param->vdev_ids[0],
539 						    WLAN_VDEV_TARGET_IF_ID);
540 	if (vdev) {
541 		txops = wlan_vdev_mlme_get_lmac_txops(vdev);
542 		if (!txops || !txops->multiple_vdev_restart_req_cmd) {
543 			mlme_err("VDEV_%d: No Tx Ops", wlan_vdev_get_id(vdev));
544 			wlan_objmgr_vdev_release_ref(vdev,
545 						     WLAN_VDEV_TARGET_IF_ID);
546 			return QDF_STATUS_E_INVAL;
547 		}
548 
549 		status = txops->multiple_vdev_restart_req_cmd(pdev, param);
550 		if (QDF_IS_STATUS_ERROR(status))
551 			mlme_err("Tx Ops Error: %d", status);
552 
553 		wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
554 	}
555 
556 	return status;
557 }
558 
559 QDF_STATUS tgt_vdev_mgr_multiple_vdev_set_param(
560 				struct wlan_objmgr_pdev *pdev,
561 				struct multiple_vdev_set_param *param)
562 {
563 	QDF_STATUS status = QDF_STATUS_SUCCESS;
564 	struct wlan_lmac_if_mlme_tx_ops *txops;
565 	struct wlan_objmgr_vdev *vdev;
566 
567 	if (!param) {
568 		mlme_err("Invalid input");
569 		return QDF_STATUS_E_INVAL;
570 	}
571 
572 	vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev,
573 						    param->vdev_ids[0],
574 						    WLAN_VDEV_TARGET_IF_ID);
575 	if (vdev) {
576 		txops = wlan_vdev_mlme_get_lmac_txops(vdev);
577 		if (!txops || !txops->multiple_vdev_set_param_cmd) {
578 			mlme_err("VDEV_%d: No Tx Ops", wlan_vdev_get_id(vdev));
579 			wlan_objmgr_vdev_release_ref(vdev,
580 						     WLAN_VDEV_TARGET_IF_ID);
581 			return QDF_STATUS_E_INVAL;
582 		}
583 
584 		status = txops->multiple_vdev_set_param_cmd(pdev, param);
585 		if (QDF_IS_STATUS_ERROR(status))
586 			mlme_err("Tx Ops Error: %d", status);
587 
588 		wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
589 	}
590 
591 	return status;
592 }
593 
594 QDF_STATUS tgt_vdev_mgr_set_tx_rx_decap_type(struct vdev_mlme_obj *mlme_obj,
595 					     enum wlan_mlme_cfg_id param_id,
596 					     uint32_t value)
597 {
598 	QDF_STATUS status;
599 	struct wlan_lmac_if_mlme_tx_ops *txops;
600 	struct wlan_objmgr_vdev *vdev;
601 	uint8_t vdev_id;
602 
603 	if (!mlme_obj) {
604 		mlme_err("Invalid input");
605 		return QDF_STATUS_E_INVAL;
606 	}
607 
608 	vdev = mlme_obj->vdev;
609 	vdev_id = wlan_vdev_get_id(vdev);
610 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
611 	if (!txops || !txops->vdev_set_tx_rx_decap_type) {
612 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
613 		return QDF_STATUS_E_INVAL;
614 	}
615 
616 	status = txops->vdev_set_tx_rx_decap_type(vdev, param_id, value);
617 	if (QDF_IS_STATUS_ERROR(status))
618 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
619 
620 	return status;
621 }
622 
623 QDF_STATUS tgt_vdev_mgr_set_param_send(
624 				struct vdev_mlme_obj *mlme_obj,
625 				struct vdev_set_params *param)
626 {
627 	QDF_STATUS status;
628 	struct wlan_lmac_if_mlme_tx_ops *txops;
629 	struct wlan_objmgr_vdev *vdev;
630 	uint8_t vdev_id;
631 
632 	if (!param) {
633 		mlme_err("Invalid input");
634 		return QDF_STATUS_E_INVAL;
635 	}
636 
637 	vdev = mlme_obj->vdev;
638 	vdev_id = wlan_vdev_get_id(vdev);
639 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
640 	if (!txops || !txops->vdev_set_param_send) {
641 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
642 		return QDF_STATUS_E_INVAL;
643 	}
644 
645 	status = txops->vdev_set_param_send(vdev, param);
646 	if (QDF_IS_STATUS_ERROR(status))
647 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
648 
649 	return status;
650 }
651 
652 QDF_STATUS tgt_vdev_mgr_sta_ps_param_send(
653 				struct vdev_mlme_obj *mlme_obj,
654 				struct sta_ps_params *param)
655 {
656 	QDF_STATUS status;
657 	struct wlan_lmac_if_mlme_tx_ops *txops;
658 	struct wlan_objmgr_vdev *vdev;
659 	uint8_t vdev_id;
660 
661 	if (!param) {
662 		mlme_err("Invalid input");
663 		return QDF_STATUS_E_INVAL;
664 	}
665 
666 	vdev = mlme_obj->vdev;
667 	vdev_id = wlan_vdev_get_id(vdev);
668 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
669 	if (!txops || !txops->vdev_sta_ps_param_send) {
670 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
671 		return QDF_STATUS_E_INVAL;
672 	}
673 
674 	status = txops->vdev_sta_ps_param_send(vdev, param);
675 	if (QDF_IS_STATUS_ERROR(status))
676 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
677 
678 	return status;
679 }
680 
681 QDF_STATUS tgt_vdev_mgr_peer_delete_all_send(
682 				struct vdev_mlme_obj *mlme_obj,
683 				struct peer_delete_all_params *param)
684 {
685 	QDF_STATUS status;
686 	struct wlan_lmac_if_mlme_tx_ops *txops;
687 	struct wlan_objmgr_vdev *vdev;
688 	uint8_t vdev_id;
689 
690 	if (!param) {
691 		mlme_err("Invalid input");
692 		return QDF_STATUS_E_INVAL;
693 	}
694 
695 	vdev = mlme_obj->vdev;
696 	vdev_id = wlan_vdev_get_id(vdev);
697 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
698 	if (!txops || !txops->peer_delete_all_send) {
699 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
700 		return QDF_STATUS_E_INVAL;
701 	}
702 
703 	status = txops->peer_delete_all_send(vdev, param);
704 	if (QDF_IS_STATUS_ERROR(status))
705 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
706 
707 	return status;
708 }
709 
710 #ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE
711 #ifdef WLAN_FEATURE_11BE_MLO
712 static inline void
713 tgt_vdev_mgr_fill_mlo_params(struct cdp_vdev_info *vdev_info,
714 			     struct wlan_objmgr_vdev *vdev)
715 {
716 	vdev_info->mld_mac_addr = wlan_vdev_mlme_get_mldaddr(vdev);
717 }
718 #else
719 static inline void
720 tgt_vdev_mgr_fill_mlo_params(struct cdp_vdev_info *vdev_info,
721 			     struct wlan_objmgr_vdev *vdev)
722 {
723 }
724 #endif
725 
726 QDF_STATUS tgt_vdev_mgr_cdp_vdev_attach(struct vdev_mlme_obj *mlme_obj)
727 {
728 	struct wlan_objmgr_psoc *psoc;
729 	struct wlan_objmgr_pdev *pdev;
730 	struct wlan_objmgr_vdev *vdev;
731 	ol_txrx_soc_handle soc_txrx_handle;
732 	struct cdp_vdev_info vdev_info = { 0 };
733 
734 	vdev = mlme_obj->vdev;
735 
736 	psoc = wlan_vdev_get_psoc(vdev);
737 	if (!psoc) {
738 		mlme_err("psoc object is NULL");
739 		return QDF_STATUS_E_INVAL;
740 	}
741 
742 	pdev = wlan_vdev_get_pdev(vdev);
743 	soc_txrx_handle = wlan_psoc_get_dp_handle(psoc);
744 	if (!soc_txrx_handle)
745 		return QDF_STATUS_E_FAILURE;
746 
747 	vdev_info.vdev_mac_addr = wlan_vdev_mlme_get_macaddr(vdev);
748 	vdev_info.vdev_id = wlan_vdev_get_id(vdev);
749 	vdev_info.op_mode = wlan_util_vdev_get_cdp_txrx_opmode(vdev);
750 	vdev_info.subtype = wlan_util_vdev_get_cdp_txrx_subtype(vdev);
751 	tgt_vdev_mgr_fill_mlo_params(&vdev_info, vdev);
752 	return cdp_vdev_attach(soc_txrx_handle,
753 			       wlan_objmgr_pdev_get_pdev_id(pdev),
754 			       &vdev_info);
755 }
756 
757 QDF_STATUS tgt_vdev_mgr_cdp_vdev_detach(struct vdev_mlme_obj *mlme_obj)
758 {
759 	struct wlan_objmgr_vdev *vdev;
760 	struct wlan_objmgr_psoc *psoc;
761 	ol_txrx_soc_handle soc_txrx_handle;
762 
763 	vdev = mlme_obj->vdev;
764 	psoc = wlan_vdev_get_psoc(vdev);
765 	soc_txrx_handle = wlan_psoc_get_dp_handle(psoc);
766 	if (soc_txrx_handle)
767 		return cdp_vdev_detach(soc_txrx_handle, wlan_vdev_get_id(vdev),
768 				       NULL, NULL);
769 
770 	return QDF_STATUS_E_INVAL;
771 }
772 
773 QDF_STATUS tgt_vdev_mgr_send_set_mac_addr(struct qdf_mac_addr mac_addr,
774 					  struct qdf_mac_addr mld_addr,
775 					  struct wlan_objmgr_vdev *vdev)
776 {
777 	struct wlan_lmac_if_mlme_tx_ops *txops;
778 	uint8_t vdev_id;
779 	QDF_STATUS status;
780 
781 	vdev_id = wlan_vdev_get_id(vdev);
782 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
783 	if (!txops || !txops->vdev_send_set_mac_addr) {
784 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
785 		return QDF_STATUS_E_INVAL;
786 	}
787 
788 	status = txops->vdev_send_set_mac_addr(mac_addr, mld_addr, vdev);
789 	if (QDF_IS_STATUS_ERROR(status))
790 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
791 
792 	return status;
793 }
794 #endif
795 
796 QDF_STATUS tgt_vdev_peer_set_param_send(struct wlan_objmgr_vdev *vdev,
797 					uint8_t *peer_mac_addr,
798 					uint32_t param_id,
799 					uint32_t param_value)
800 {
801 	struct wlan_lmac_if_mlme_tx_ops *txops;
802 	uint8_t vdev_id;
803 	QDF_STATUS status;
804 
805 	vdev_id = wlan_vdev_get_id(vdev);
806 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
807 	if (!txops || !txops->vdev_peer_set_param_send) {
808 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
809 		return QDF_STATUS_E_INVAL;
810 	}
811 
812 	status = txops->vdev_peer_set_param_send(vdev, peer_mac_addr,
813 						 param_id, param_value);
814 	if (QDF_IS_STATUS_ERROR(status))
815 		mlme_err("VDEV_%d: peer " QDF_MAC_ADDR_FMT " param_id %d param_value %d Error %d",
816 			 vdev_id, QDF_MAC_ADDR_REF(peer_mac_addr), param_id,
817 			 param_value, status);
818 
819 	return status;
820 }
821