xref: /wlan-dirver/qca-wifi-host-cmn/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_tgt_if_tx_api.c (revision 11f5a63a6cbdda84849a730de22f0a71e635d58c)
1 /*
2  * Copyright (c) 2019 The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for
5  * any purpose with or without fee is hereby granted, provided that the
6  * above copyright notice and this permission notice appear in all
7  * copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16  * PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 /**
20  * DOC: wlan_vdev_mgr_tgt_if_tx_api.c
21  *
22  * This file provides definitions for mlme tgt_if APIs, which will
23  * further call target_if/mlme component using LMAC MLME txops
24  */
25 #include <wlan_vdev_mgr_tgt_if_tx_api.h>
26 #include <target_if_vdev_mgr_tx_ops.h>
27 #include "include/wlan_vdev_mlme.h"
28 #include <wlan_mlme_dbg.h>
29 #include <cdp_txrx_cmn_struct.h>
30 #include <cdp_txrx_cmn.h>
31 #include <wlan_lmac_if_api.h>
32 #include <wlan_utility.h>
33 #include <cdp_txrx_ctrl.h>
34 #include <wlan_vdev_mlme_api.h>
35 #include <wlan_dfs_utils_api.h>
36 #include <wlan_vdev_mgr_utils_api.h>
37 #include <wlan_vdev_mgr_ucfg_api.h>
38 #include <wlan_vdev_mlme_main.h>
39 
40 static inline struct wlan_lmac_if_mlme_tx_ops
41 *wlan_vdev_mlme_get_lmac_txops(struct wlan_objmgr_vdev *vdev)
42 {
43 	struct wlan_objmgr_psoc *psoc;
44 
45 	psoc = wlan_vdev_get_psoc(vdev);
46 
47 	return target_if_vdev_mgr_get_tx_ops(psoc);
48 }
49 
50 QDF_STATUS tgt_vdev_mgr_create_send(
51 				struct vdev_mlme_obj *mlme_obj,
52 				struct vdev_create_params *param)
53 {
54 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
55 	struct wlan_lmac_if_mlme_tx_ops *txops;
56 	struct wlan_objmgr_psoc *psoc;
57 	struct wlan_objmgr_pdev *pdev;
58 	struct wlan_objmgr_vdev *vdev;
59 	ol_txrx_soc_handle soc_txrx_handle;
60 	struct cdp_pdev *pdev_txrx_handle;
61 	struct cdp_vdev *vdev_txrx_handle;
62 	enum wlan_op_mode cdp_txrx_opmode;
63 	enum wlan_op_subtype cdp_txrx_subtype;
64 	uint32_t vdev_id;
65 	uint8_t *vdev_addr;
66 	struct vdev_response_timer *vdev_rsp;
67 
68 	if (!param) {
69 		mlme_err("Invalid input");
70 		return QDF_STATUS_E_INVAL;
71 	}
72 
73 	vdev = mlme_obj->vdev;
74 	vdev_id = wlan_vdev_get_id(vdev);
75 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
76 	if (!txops || !txops->vdev_create_send ||
77 	    !txops->vdev_mgr_rsp_timer_init) {
78 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
79 		return QDF_STATUS_E_INVAL;
80 	}
81 
82 	status = txops->vdev_create_send(vdev, param);
83 	if (QDF_IS_STATUS_SUCCESS(status)) {
84 		vdev_rsp = &mlme_obj->vdev_rt;
85 		txops->vdev_mgr_rsp_timer_init(vdev, &vdev_rsp->rsp_timer);
86 	} else {
87 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
88 		return status;
89 	}
90 
91 	cdp_txrx_opmode = wlan_util_vdev_get_cdp_txrx_opmode(vdev);
92 	cdp_txrx_subtype = wlan_util_vdev_get_cdp_txrx_subtype(vdev);
93 	vdev_addr = wlan_vdev_mlme_get_macaddr(vdev);
94 	psoc = wlan_vdev_get_psoc(vdev);
95 	pdev = wlan_vdev_get_pdev(vdev);
96 	soc_txrx_handle = wlan_psoc_get_dp_handle(psoc);
97 	pdev_txrx_handle = wlan_pdev_get_dp_handle(pdev);
98 	if (!soc_txrx_handle || !pdev_txrx_handle)
99 		return QDF_STATUS_E_FAILURE;
100 
101 	vdev_txrx_handle = cdp_vdev_attach(soc_txrx_handle,
102 					   pdev_txrx_handle,
103 					   vdev_addr, vdev_id,
104 					   cdp_txrx_opmode,
105 					   cdp_txrx_subtype);
106 	if (!vdev_txrx_handle)
107 		return QDF_STATUS_E_FAILURE;
108 
109 	wlan_vdev_set_dp_handle(vdev, vdev_txrx_handle);
110 
111 	return status;
112 }
113 
114 QDF_STATUS tgt_vdev_mgr_create_complete(struct vdev_mlme_obj *vdev_mlme)
115 {
116 	struct wlan_objmgr_vdev *vdev;
117 	struct vdev_set_params param = {0};
118 	struct wlan_lmac_if_mlme_tx_ops *txops;
119 	struct vdev_mlme_inactivity_params *inactivity;
120 	uint8_t vdev_id;
121 	QDF_STATUS status = QDF_STATUS_SUCCESS;
122 
123 	vdev = vdev_mlme->vdev;
124 	vdev_id = wlan_vdev_get_id(vdev);
125 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
126 	if (!txops || !txops->vdev_set_param_send) {
127 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
128 		return QDF_STATUS_E_INVAL;
129 	}
130 
131 	inactivity = &vdev_mlme->mgmt.inactivity_params;
132 
133 	param.vdev_id = vdev_id;
134 
135 	param.param_value =
136 		inactivity->keepalive_min_idle_inactive_time_secs;
137 	param.param_id = WLAN_MLME_CFG_MIN_IDLE_INACTIVE_TIME;
138 	status = txops->vdev_set_param_send(vdev, &param);
139 	if (QDF_IS_STATUS_ERROR(status))
140 		mlme_err("VDEV_%d: Failed to set min idle inactive time!",
141 			 vdev_id);
142 
143 	param.param_value =
144 		inactivity->keepalive_max_idle_inactive_time_secs;
145 	param.param_id = WLAN_MLME_CFG_MAX_IDLE_INACTIVE_TIME;
146 	status = txops->vdev_set_param_send(vdev, &param);
147 	if (QDF_IS_STATUS_ERROR(status))
148 		mlme_err("VDEV_%d: Failed to set max idle inactive time!",
149 			 vdev_id);
150 
151 	param.param_value =
152 		inactivity->keepalive_max_unresponsive_time_secs;
153 	param.param_id = WLAN_MLME_CFG_MAX_UNRESPONSIVE_INACTIVE_TIME;
154 	status = txops->vdev_set_param_send(vdev, &param);
155 	if (QDF_IS_STATUS_ERROR(status))
156 		mlme_err("VDEV_%d: Failed to set max unresponse inactive time!",
157 			 vdev_id);
158 
159 	return status;
160 }
161 
162 QDF_STATUS tgt_vdev_mgr_start_send(
163 				struct vdev_mlme_obj *mlme_obj,
164 				struct vdev_start_params *param)
165 {
166 	QDF_STATUS status;
167 	struct wlan_lmac_if_mlme_tx_ops *txops;
168 	struct wlan_objmgr_vdev *vdev;
169 	uint8_t vdev_id;
170 
171 	if (!param) {
172 		mlme_err("Invalid input");
173 		return QDF_STATUS_E_INVAL;
174 	}
175 
176 	vdev = mlme_obj->vdev;
177 	vdev_id = wlan_vdev_get_id(vdev);
178 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
179 	if (!txops || !txops->vdev_start_send) {
180 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
181 		return QDF_STATUS_E_INVAL;
182 	}
183 
184 	status = txops->vdev_start_send(vdev, param);
185 	if (QDF_IS_STATUS_ERROR(status))
186 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
187 
188 	return status;
189 }
190 
191 QDF_STATUS tgt_vdev_mgr_delete_send(
192 				struct vdev_mlme_obj *mlme_obj,
193 				struct vdev_delete_params *param)
194 {
195 	QDF_STATUS status;
196 	struct wlan_lmac_if_mlme_tx_ops *txops;
197 	struct wlan_objmgr_vdev *vdev;
198 	uint8_t vdev_id;
199 
200 	if (!param) {
201 		mlme_err("Invalid input");
202 		return QDF_STATUS_E_INVAL;
203 	}
204 
205 	vdev = mlme_obj->vdev;
206 	vdev_id = wlan_vdev_get_id(vdev);
207 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
208 	if (!txops || !txops->vdev_delete_send) {
209 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
210 		return QDF_STATUS_E_INVAL;
211 	}
212 
213 	status = txops->vdev_delete_send(vdev, param);
214 	if (QDF_IS_STATUS_ERROR(status))
215 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
216 
217 	return status;
218 }
219 
220 QDF_STATUS tgt_vdev_mgr_peer_flush_tids_send(
221 				struct vdev_mlme_obj *mlme_obj,
222 				struct peer_flush_params *param)
223 {
224 	QDF_STATUS status;
225 	struct wlan_lmac_if_mlme_tx_ops *txops;
226 	struct wlan_objmgr_vdev *vdev;
227 	uint8_t vdev_id;
228 
229 	if (!param) {
230 		mlme_err("Invalid input");
231 		return QDF_STATUS_E_INVAL;
232 	}
233 
234 	vdev = mlme_obj->vdev;
235 	vdev_id = wlan_vdev_get_id(vdev);
236 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
237 	if (!txops || !txops->peer_flush_tids_send) {
238 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
239 		return QDF_STATUS_E_INVAL;
240 	}
241 
242 	status = txops->peer_flush_tids_send(vdev, param);
243 	if (QDF_IS_STATUS_ERROR(status))
244 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
245 
246 	return QDF_STATUS_SUCCESS;
247 }
248 
249 QDF_STATUS tgt_vdev_mgr_stop_send(
250 				struct vdev_mlme_obj *mlme_obj,
251 				struct vdev_stop_params *param)
252 {
253 	QDF_STATUS status;
254 	struct wlan_lmac_if_mlme_tx_ops *txops;
255 	struct wlan_objmgr_vdev *vdev;
256 	uint8_t vdev_id;
257 
258 	if (!param) {
259 		mlme_err("Invalid input");
260 		return QDF_STATUS_E_INVAL;
261 	}
262 
263 	vdev = mlme_obj->vdev;
264 	vdev_id = wlan_vdev_get_id(vdev);
265 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
266 	if (!txops || !txops->vdev_stop_send) {
267 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
268 		return QDF_STATUS_E_INVAL;
269 	}
270 
271 	status = txops->vdev_stop_send(vdev, param);
272 	if (QDF_IS_STATUS_ERROR(status))
273 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
274 
275 	return status;
276 }
277 
278 QDF_STATUS tgt_vdev_mgr_beacon_stop(struct vdev_mlme_obj *mlme_obj)
279 {
280 	return QDF_STATUS_SUCCESS;
281 }
282 
283 QDF_STATUS tgt_vdev_mgr_beacon_free(struct vdev_mlme_obj *mlme_obj)
284 {
285 	return QDF_STATUS_SUCCESS;
286 }
287 
288 QDF_STATUS tgt_vdev_mgr_up_send(
289 				struct vdev_mlme_obj *mlme_obj,
290 				struct vdev_up_params *param)
291 {
292 	QDF_STATUS status;
293 	struct wlan_lmac_if_mlme_tx_ops *txops;
294 	ol_txrx_soc_handle soc_txrx_handle;
295 	struct cdp_vdev *vdev_txrx_handle;
296 	struct wlan_objmgr_psoc *psoc;
297 	struct wlan_objmgr_vdev *vdev;
298 	uint8_t vdev_id;
299 
300 	if (!param) {
301 		mlme_err("Invalid input");
302 		return QDF_STATUS_E_INVAL;
303 	}
304 
305 	vdev = mlme_obj->vdev;
306 	vdev_id = wlan_vdev_get_id(vdev);
307 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
308 	if (!txops || !txops->vdev_up_send) {
309 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
310 		return QDF_STATUS_E_INVAL;
311 	}
312 
313 	/* cdp set rx and tx decap type */
314 	psoc = wlan_vdev_get_psoc(vdev);
315 	soc_txrx_handle = wlan_psoc_get_dp_handle(psoc);
316 	vdev_txrx_handle = wlan_vdev_get_dp_handle(vdev);
317 	if (!soc_txrx_handle || !vdev_txrx_handle)
318 		return QDF_STATUS_E_INVAL;
319 
320 	status = txops->vdev_up_send(vdev, param);
321 	if (QDF_IS_STATUS_ERROR(status))
322 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
323 
324 	return status;
325 }
326 
327 QDF_STATUS tgt_vdev_mgr_down_send(
328 				struct vdev_mlme_obj *mlme_obj,
329 				struct vdev_down_params *param)
330 {
331 	QDF_STATUS status;
332 	struct wlan_lmac_if_mlme_tx_ops *txops;
333 	struct wlan_objmgr_pdev *pdev;
334 	struct wlan_objmgr_vdev *vdev;
335 	enum QDF_OPMODE opmode;
336 	uint8_t vdev_id;
337 
338 	if (!param) {
339 		mlme_err("Invalid input");
340 		return QDF_STATUS_E_INVAL;
341 	}
342 
343 	vdev = mlme_obj->vdev;
344 	vdev_id = wlan_vdev_get_id(vdev);
345 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
346 	if (!txops || !txops->vdev_down_send) {
347 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
348 		return QDF_STATUS_E_INVAL;
349 	}
350 
351 	pdev = wlan_vdev_get_pdev(vdev);
352 	if (!pdev) {
353 		mlme_err("PDEV is NULL");
354 		return QDF_STATUS_E_INVAL;
355 	}
356 
357 	opmode = wlan_vdev_mlme_get_opmode(vdev);
358 	if (wlan_util_is_vdev_active(pdev, WLAN_VDEV_TARGET_IF_ID) ==
359 						QDF_STATUS_SUCCESS) {
360 
361 		if (opmode == QDF_SAP_MODE)
362 			utils_dfs_cancel_precac_timer(pdev);
363 	}
364 
365 	status = txops->vdev_down_send(vdev, param);
366 	if (QDF_IS_STATUS_ERROR(status))
367 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
368 
369 	return status;
370 }
371 
372 QDF_STATUS tgt_vdev_mgr_set_neighbour_rx_cmd_send(
373 				struct vdev_mlme_obj *mlme_obj,
374 				struct set_neighbour_rx_params *param)
375 {
376 	return QDF_STATUS_SUCCESS;
377 }
378 
379 QDF_STATUS tgt_vdev_mgr_nac_rssi_send(
380 				struct vdev_mlme_obj *mlme_obj,
381 				struct vdev_scan_nac_rssi_params *param)
382 {
383 	return QDF_STATUS_SUCCESS;
384 }
385 
386 QDF_STATUS tgt_vdev_mgr_sifs_trigger_send(
387 				struct vdev_mlme_obj *mlme_obj,
388 				struct sifs_trigger_param *param)
389 {
390 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
391 	struct wlan_lmac_if_mlme_tx_ops *txops;
392 	struct wlan_objmgr_vdev *vdev;
393 	uint8_t vdev_id;
394 
395 	if (!param) {
396 		mlme_err("Invalid input");
397 		return QDF_STATUS_E_INVAL;
398 	}
399 
400 	vdev = mlme_obj->vdev;
401 	vdev_id = wlan_vdev_get_id(vdev);
402 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
403 	if (!txops || !txops->vdev_sifs_trigger_send) {
404 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
405 		return QDF_STATUS_E_INVAL;
406 	}
407 
408 	status = txops->vdev_sifs_trigger_send(vdev, param);
409 	if (QDF_IS_STATUS_ERROR(status))
410 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
411 
412 	return status;
413 }
414 
415 QDF_STATUS tgt_vdev_mgr_set_custom_aggr_size_send(
416 				struct vdev_mlme_obj *mlme_obj,
417 				struct set_custom_aggr_size_params *param)
418 {
419 	QDF_STATUS status;
420 	struct wlan_lmac_if_mlme_tx_ops *txops;
421 	struct wlan_objmgr_vdev *vdev;
422 	uint8_t vdev_id;
423 
424 	if (!param) {
425 		mlme_err("Invalid input");
426 		return QDF_STATUS_E_INVAL;
427 	}
428 
429 	vdev = mlme_obj->vdev;
430 	vdev_id = wlan_vdev_get_id(vdev);
431 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
432 	if (!txops || !txops->vdev_set_custom_aggr_size_cmd_send) {
433 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
434 		return QDF_STATUS_E_INVAL;
435 	}
436 
437 	status = txops->vdev_set_custom_aggr_size_cmd_send(vdev, param);
438 	if (QDF_IS_STATUS_ERROR(status))
439 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
440 
441 	return status;
442 }
443 
444 QDF_STATUS tgt_vdev_mgr_config_ratemask_cmd_send(
445 				struct vdev_mlme_obj *mlme_obj,
446 				struct config_ratemask_params *param)
447 {
448 	QDF_STATUS status;
449 	struct wlan_lmac_if_mlme_tx_ops *txops;
450 	struct wlan_objmgr_vdev *vdev;
451 	uint8_t vdev_id;
452 
453 	vdev = mlme_obj->vdev;
454 	vdev_id = wlan_vdev_get_id(vdev);
455 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
456 	if (!txops || !txops->vdev_config_ratemask_cmd_send) {
457 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
458 		return QDF_STATUS_E_INVAL;
459 	}
460 
461 	status = txops->vdev_config_ratemask_cmd_send(vdev, param);
462 	if (QDF_IS_STATUS_ERROR(status))
463 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
464 
465 	return status;
466 }
467 
468 QDF_STATUS tgt_vdev_mgr_beacon_cmd_send(
469 				struct vdev_mlme_obj *mlme_obj,
470 				struct beacon_params *param)
471 {
472 	return QDF_STATUS_SUCCESS;
473 }
474 
475 QDF_STATUS tgt_vdev_mgr_beacon_tmpl_send(
476 				struct vdev_mlme_obj *mlme_obj,
477 				struct beacon_tmpl_params *param)
478 {
479 	return QDF_STATUS_SUCCESS;
480 }
481 
482 QDF_STATUS tgt_vdev_mgr_multiple_vdev_restart_send(
483 				struct wlan_objmgr_pdev *pdev,
484 				struct multiple_vdev_restart_params *param)
485 {
486 	QDF_STATUS status = QDF_STATUS_SUCCESS;
487 	struct wlan_lmac_if_mlme_tx_ops *txops;
488 	struct wlan_objmgr_vdev *vdev;
489 
490 	if (!param) {
491 		mlme_err("Invalid input");
492 		return QDF_STATUS_E_INVAL;
493 	}
494 
495 	vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev,
496 						    param->vdev_ids[0],
497 						    WLAN_VDEV_TARGET_IF_ID);
498 	if (vdev) {
499 		txops = wlan_vdev_mlme_get_lmac_txops(vdev);
500 		if (!txops || !txops->multiple_vdev_restart_req_cmd) {
501 			mlme_err("VDEV_%d: No Tx Ops", wlan_vdev_get_id(vdev));
502 			wlan_objmgr_vdev_release_ref(vdev,
503 						     WLAN_VDEV_TARGET_IF_ID);
504 			return QDF_STATUS_E_INVAL;
505 		}
506 
507 		status = txops->multiple_vdev_restart_req_cmd(pdev, param);
508 		if (QDF_IS_STATUS_ERROR(status))
509 			mlme_err("Tx Ops Error: %d", status);
510 
511 		wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
512 	}
513 
514 	return status;
515 }
516 
517 QDF_STATUS tgt_vdev_mgr_set_tx_rx_decap_type(struct vdev_mlme_obj *mlme_obj,
518 					     enum wlan_mlme_cfg_id param_id,
519 					     uint32_t value)
520 {
521 	QDF_STATUS status;
522 	struct wlan_lmac_if_mlme_tx_ops *txops;
523 	struct wlan_objmgr_vdev *vdev;
524 	uint8_t vdev_id;
525 
526 	if (!mlme_obj) {
527 		mlme_err("Invalid input");
528 		return QDF_STATUS_E_INVAL;
529 	}
530 
531 	vdev = mlme_obj->vdev;
532 	vdev_id = wlan_vdev_get_id(vdev);
533 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
534 	if (!txops || !txops->vdev_set_tx_rx_decap_type) {
535 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
536 		return QDF_STATUS_E_INVAL;
537 	}
538 
539 	status = txops->vdev_set_tx_rx_decap_type(vdev, param_id, value);
540 	if (QDF_IS_STATUS_ERROR(status))
541 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
542 
543 	return status;
544 }
545 
546 QDF_STATUS tgt_vdev_mgr_set_param_send(
547 				struct vdev_mlme_obj *mlme_obj,
548 				struct vdev_set_params *param)
549 {
550 	QDF_STATUS status;
551 	struct wlan_lmac_if_mlme_tx_ops *txops;
552 	struct wlan_objmgr_vdev *vdev;
553 	uint8_t vdev_id;
554 
555 	if (!param) {
556 		mlme_err("Invalid input");
557 		return QDF_STATUS_E_INVAL;
558 	}
559 
560 	vdev = mlme_obj->vdev;
561 	vdev_id = wlan_vdev_get_id(vdev);
562 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
563 	if (!txops || !txops->vdev_set_param_send) {
564 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
565 		return QDF_STATUS_E_INVAL;
566 	}
567 
568 	status = txops->vdev_set_param_send(vdev, param);
569 	if (QDF_IS_STATUS_ERROR(status))
570 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
571 
572 	return status;
573 }
574 
575 QDF_STATUS tgt_vdev_mgr_sta_ps_param_send(
576 				struct vdev_mlme_obj *mlme_obj,
577 				struct sta_ps_params *param)
578 {
579 	QDF_STATUS status;
580 	struct wlan_lmac_if_mlme_tx_ops *txops;
581 	struct wlan_objmgr_vdev *vdev;
582 	uint8_t vdev_id;
583 
584 	if (!param) {
585 		mlme_err("Invalid input");
586 		return QDF_STATUS_E_INVAL;
587 	}
588 
589 	vdev = mlme_obj->vdev;
590 	vdev_id = wlan_vdev_get_id(vdev);
591 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
592 	if (!txops || !txops->vdev_sta_ps_param_send) {
593 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
594 		return QDF_STATUS_E_INVAL;
595 	}
596 
597 	status = txops->vdev_sta_ps_param_send(vdev, param);
598 	if (QDF_IS_STATUS_ERROR(status))
599 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
600 
601 	return status;
602 }
603 
604 QDF_STATUS tgt_vdev_mgr_peer_delete_all_send(
605 				struct vdev_mlme_obj *mlme_obj,
606 				struct peer_delete_all_params *param)
607 {
608 	QDF_STATUS status;
609 	struct wlan_lmac_if_mlme_tx_ops *txops;
610 	struct wlan_objmgr_vdev *vdev;
611 	uint8_t vdev_id;
612 
613 	if (!param) {
614 		mlme_err("Invalid input");
615 		return QDF_STATUS_E_INVAL;
616 	}
617 
618 	vdev = mlme_obj->vdev;
619 	vdev_id = wlan_vdev_get_id(vdev);
620 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
621 	if (!txops || !txops->peer_delete_all_send) {
622 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
623 		return QDF_STATUS_E_INVAL;
624 	}
625 
626 	status = txops->peer_delete_all_send(vdev, param);
627 	if (QDF_IS_STATUS_ERROR(status))
628 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
629 
630 	return QDF_STATUS_SUCCESS;
631 }
632