xref: /wlan-dirver/qca-wifi-host-cmn/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_tgt_if_tx_api.c (revision bea437e2293c3d4fb1b5704fcf633aedac996962)
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_vdev *vdev_txrx_handle;
61 	enum wlan_op_mode cdp_txrx_opmode;
62 	enum wlan_op_subtype cdp_txrx_subtype;
63 	uint32_t vdev_id;
64 	uint8_t *vdev_addr;
65 
66 	if (!param) {
67 		mlme_err("Invalid input");
68 		return QDF_STATUS_E_INVAL;
69 	}
70 
71 	vdev = mlme_obj->vdev;
72 	vdev_id = wlan_vdev_get_id(vdev);
73 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
74 	if (!txops || !txops->vdev_create_send) {
75 		mlme_err("VDEV_%d No Tx Ops", vdev_id);
76 		return QDF_STATUS_E_INVAL;
77 	}
78 
79 	psoc = wlan_vdev_get_psoc(vdev);
80 	if (!psoc) {
81 		mlme_err("psoc object is NULL");
82 		return QDF_STATUS_E_INVAL;
83 	}
84 
85 	status = txops->vdev_create_send(vdev, param);
86 	if (QDF_IS_STATUS_ERROR(status)) {
87 		mlme_err("VDEV_%d PSOC_%d Tx Ops Error : %d", vdev_id,
88 			 wlan_psoc_get_id(psoc), status);
89 		return status;
90 	}
91 
92 	cdp_txrx_opmode = wlan_util_vdev_get_cdp_txrx_opmode(vdev);
93 	cdp_txrx_subtype = wlan_util_vdev_get_cdp_txrx_subtype(vdev);
94 	vdev_addr = wlan_vdev_mlme_get_macaddr(vdev);
95 	pdev = wlan_vdev_get_pdev(vdev);
96 	soc_txrx_handle = wlan_psoc_get_dp_handle(psoc);
97 	if (!soc_txrx_handle)
98 		return QDF_STATUS_E_FAILURE;
99 
100 	vdev_txrx_handle = cdp_vdev_attach(soc_txrx_handle,
101 					   wlan_objmgr_pdev_get_pdev_id(pdev),
102 					   vdev_addr, vdev_id,
103 					   cdp_txrx_opmode,
104 					   cdp_txrx_subtype);
105 	if (!vdev_txrx_handle) {
106 		wlan_vdev_set_dp_handle(vdev, NULL);
107 		return QDF_STATUS_E_FAILURE;
108 	} else {
109 		wlan_vdev_set_dp_handle(vdev, vdev_txrx_handle);
110 	}
111 
112 	return status;
113 }
114 
115 QDF_STATUS tgt_vdev_mgr_create_complete(struct vdev_mlme_obj *vdev_mlme)
116 {
117 	struct wlan_objmgr_vdev *vdev;
118 	struct vdev_set_params param = {0};
119 	struct wlan_lmac_if_mlme_tx_ops *txops;
120 	struct vdev_mlme_inactivity_params *inactivity;
121 	uint8_t vdev_id;
122 	QDF_STATUS status = QDF_STATUS_SUCCESS;
123 
124 	vdev = vdev_mlme->vdev;
125 	vdev_id = wlan_vdev_get_id(vdev);
126 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
127 	if (!txops || !txops->vdev_set_param_send) {
128 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
129 		return QDF_STATUS_E_INVAL;
130 	}
131 
132 	inactivity = &vdev_mlme->mgmt.inactivity_params;
133 
134 	param.vdev_id = vdev_id;
135 
136 	param.param_value =
137 		inactivity->keepalive_min_idle_inactive_time_secs;
138 	param.param_id = WLAN_MLME_CFG_MIN_IDLE_INACTIVE_TIME;
139 	status = txops->vdev_set_param_send(vdev, &param);
140 	if (QDF_IS_STATUS_ERROR(status))
141 		mlme_err("VDEV_%d: Failed to set min idle inactive time!",
142 			 vdev_id);
143 
144 	param.param_value =
145 		inactivity->keepalive_max_idle_inactive_time_secs;
146 	param.param_id = WLAN_MLME_CFG_MAX_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 max idle inactive time!",
150 			 vdev_id);
151 
152 	param.param_value =
153 		inactivity->keepalive_max_unresponsive_time_secs;
154 	param.param_id = WLAN_MLME_CFG_MAX_UNRESPONSIVE_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 unresponse inactive time!",
158 			 vdev_id);
159 
160 	return status;
161 }
162 
163 QDF_STATUS tgt_vdev_mgr_start_send(
164 				struct vdev_mlme_obj *mlme_obj,
165 				struct vdev_start_params *param)
166 {
167 	QDF_STATUS status;
168 	struct wlan_lmac_if_mlme_tx_ops *txops;
169 	struct wlan_objmgr_vdev *vdev;
170 	uint8_t vdev_id;
171 
172 	if (!param) {
173 		mlme_err("Invalid input");
174 		return QDF_STATUS_E_INVAL;
175 	}
176 
177 	vdev = mlme_obj->vdev;
178 	vdev_id = wlan_vdev_get_id(vdev);
179 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
180 	if (!txops || !txops->vdev_start_send) {
181 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
182 		return QDF_STATUS_E_INVAL;
183 	}
184 
185 	status = txops->vdev_start_send(vdev, param);
186 	if (QDF_IS_STATUS_ERROR(status))
187 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
188 
189 	return status;
190 }
191 
192 QDF_STATUS tgt_vdev_mgr_delete_send(
193 				struct vdev_mlme_obj *mlme_obj,
194 				struct vdev_delete_params *param)
195 {
196 	QDF_STATUS status;
197 	struct wlan_lmac_if_mlme_tx_ops *txops;
198 	struct wlan_objmgr_vdev *vdev;
199 	uint8_t vdev_id;
200 
201 	if (!param) {
202 		mlme_err("Invalid input");
203 		return QDF_STATUS_E_INVAL;
204 	}
205 
206 	vdev = mlme_obj->vdev;
207 	vdev_id = wlan_vdev_get_id(vdev);
208 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
209 	if (!txops || !txops->vdev_delete_send) {
210 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
211 		return QDF_STATUS_E_INVAL;
212 	}
213 
214 	status = txops->vdev_delete_send(vdev, param);
215 	if (QDF_IS_STATUS_ERROR(status))
216 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
217 
218 	return status;
219 }
220 
221 QDF_STATUS tgt_vdev_mgr_peer_flush_tids_send(
222 				struct vdev_mlme_obj *mlme_obj,
223 				struct peer_flush_params *param)
224 {
225 	QDF_STATUS status;
226 	struct wlan_lmac_if_mlme_tx_ops *txops;
227 	struct wlan_objmgr_vdev *vdev;
228 	uint8_t vdev_id;
229 
230 	if (!param) {
231 		mlme_err("Invalid input");
232 		return QDF_STATUS_E_INVAL;
233 	}
234 
235 	vdev = mlme_obj->vdev;
236 	vdev_id = wlan_vdev_get_id(vdev);
237 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
238 	if (!txops || !txops->peer_flush_tids_send) {
239 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
240 		return QDF_STATUS_E_INVAL;
241 	}
242 
243 	status = txops->peer_flush_tids_send(vdev, param);
244 	if (QDF_IS_STATUS_ERROR(status))
245 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
246 
247 	return QDF_STATUS_SUCCESS;
248 }
249 
250 QDF_STATUS tgt_vdev_mgr_stop_send(
251 				struct vdev_mlme_obj *mlme_obj,
252 				struct vdev_stop_params *param)
253 {
254 	QDF_STATUS status;
255 	struct wlan_lmac_if_mlme_tx_ops *txops;
256 	struct wlan_objmgr_vdev *vdev;
257 	uint8_t vdev_id;
258 
259 	if (!param) {
260 		mlme_err("Invalid input");
261 		return QDF_STATUS_E_INVAL;
262 	}
263 
264 	vdev = mlme_obj->vdev;
265 	vdev_id = wlan_vdev_get_id(vdev);
266 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
267 	if (!txops || !txops->vdev_stop_send) {
268 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
269 		return QDF_STATUS_E_INVAL;
270 	}
271 
272 	status = txops->vdev_stop_send(vdev, param);
273 	if (QDF_IS_STATUS_ERROR(status))
274 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
275 
276 	return status;
277 }
278 
279 QDF_STATUS tgt_vdev_mgr_beacon_stop(struct vdev_mlme_obj *mlme_obj)
280 {
281 	return QDF_STATUS_SUCCESS;
282 }
283 
284 QDF_STATUS tgt_vdev_mgr_beacon_free(struct vdev_mlme_obj *mlme_obj)
285 {
286 	return QDF_STATUS_SUCCESS;
287 }
288 
289 QDF_STATUS tgt_vdev_mgr_up_send(
290 				struct vdev_mlme_obj *mlme_obj,
291 				struct vdev_up_params *param)
292 {
293 	QDF_STATUS status;
294 	struct wlan_lmac_if_mlme_tx_ops *txops;
295 	ol_txrx_soc_handle soc_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 	if (!soc_txrx_handle || vdev_id == WLAN_INVALID_VDEV_ID)
317 		return QDF_STATUS_E_INVAL;
318 
319 	status = txops->vdev_up_send(vdev, param);
320 	if (QDF_IS_STATUS_ERROR(status))
321 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
322 
323 	return status;
324 }
325 
326 QDF_STATUS tgt_vdev_mgr_down_send(
327 				struct vdev_mlme_obj *mlme_obj,
328 				struct vdev_down_params *param)
329 {
330 	QDF_STATUS status;
331 	struct wlan_lmac_if_mlme_tx_ops *txops;
332 	struct wlan_objmgr_pdev *pdev;
333 	struct wlan_objmgr_vdev *vdev;
334 	enum QDF_OPMODE opmode;
335 	uint8_t vdev_id;
336 
337 	if (!param) {
338 		mlme_err("Invalid input");
339 		return QDF_STATUS_E_INVAL;
340 	}
341 
342 	vdev = mlme_obj->vdev;
343 	vdev_id = wlan_vdev_get_id(vdev);
344 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
345 	if (!txops || !txops->vdev_down_send) {
346 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
347 		return QDF_STATUS_E_INVAL;
348 	}
349 
350 	pdev = wlan_vdev_get_pdev(vdev);
351 	if (!pdev) {
352 		mlme_err("PDEV is NULL");
353 		return QDF_STATUS_E_INVAL;
354 	}
355 
356 	opmode = wlan_vdev_mlme_get_opmode(vdev);
357 	if (wlan_util_is_vdev_active(pdev, WLAN_VDEV_TARGET_IF_ID) ==
358 						QDF_STATUS_SUCCESS) {
359 
360 		if (opmode == QDF_SAP_MODE)
361 			utils_dfs_cancel_precac_timer(pdev);
362 	}
363 
364 	status = txops->vdev_down_send(vdev, param);
365 	if (QDF_IS_STATUS_ERROR(status))
366 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
367 
368 	return status;
369 }
370 
371 QDF_STATUS tgt_vdev_mgr_set_neighbour_rx_cmd_send(
372 				struct vdev_mlme_obj *mlme_obj,
373 				struct set_neighbour_rx_params *param)
374 {
375 	return QDF_STATUS_SUCCESS;
376 }
377 
378 QDF_STATUS tgt_vdev_mgr_nac_rssi_send(
379 				struct vdev_mlme_obj *mlme_obj,
380 				struct vdev_scan_nac_rssi_params *param)
381 {
382 	return QDF_STATUS_SUCCESS;
383 }
384 
385 QDF_STATUS tgt_vdev_mgr_sifs_trigger_send(
386 				struct vdev_mlme_obj *mlme_obj,
387 				struct sifs_trigger_param *param)
388 {
389 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
390 	struct wlan_lmac_if_mlme_tx_ops *txops;
391 	struct wlan_objmgr_vdev *vdev;
392 	uint8_t vdev_id;
393 
394 	if (!param) {
395 		mlme_err("Invalid input");
396 		return QDF_STATUS_E_INVAL;
397 	}
398 
399 	vdev = mlme_obj->vdev;
400 	vdev_id = wlan_vdev_get_id(vdev);
401 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
402 	if (!txops || !txops->vdev_sifs_trigger_send) {
403 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
404 		return QDF_STATUS_E_INVAL;
405 	}
406 
407 	status = txops->vdev_sifs_trigger_send(vdev, param);
408 	if (QDF_IS_STATUS_ERROR(status))
409 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
410 
411 	return status;
412 }
413 
414 QDF_STATUS tgt_vdev_mgr_set_custom_aggr_size_send(
415 				struct vdev_mlme_obj *mlme_obj,
416 				struct set_custom_aggr_size_params *param)
417 {
418 	QDF_STATUS status;
419 	struct wlan_lmac_if_mlme_tx_ops *txops;
420 	struct wlan_objmgr_vdev *vdev;
421 	uint8_t vdev_id;
422 
423 	if (!param) {
424 		mlme_err("Invalid input");
425 		return QDF_STATUS_E_INVAL;
426 	}
427 
428 	vdev = mlme_obj->vdev;
429 	vdev_id = wlan_vdev_get_id(vdev);
430 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
431 	if (!txops || !txops->vdev_set_custom_aggr_size_cmd_send) {
432 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
433 		return QDF_STATUS_E_INVAL;
434 	}
435 
436 	status = txops->vdev_set_custom_aggr_size_cmd_send(vdev, param);
437 	if (QDF_IS_STATUS_ERROR(status))
438 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
439 
440 	return status;
441 }
442 
443 QDF_STATUS tgt_vdev_mgr_config_ratemask_cmd_send(
444 				struct vdev_mlme_obj *mlme_obj,
445 				struct config_ratemask_params *param)
446 {
447 	QDF_STATUS status;
448 	struct wlan_lmac_if_mlme_tx_ops *txops;
449 	struct wlan_objmgr_vdev *vdev;
450 	uint8_t vdev_id;
451 
452 	vdev = mlme_obj->vdev;
453 	vdev_id = wlan_vdev_get_id(vdev);
454 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
455 	if (!txops || !txops->vdev_config_ratemask_cmd_send) {
456 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
457 		return QDF_STATUS_E_INVAL;
458 	}
459 
460 	status = txops->vdev_config_ratemask_cmd_send(vdev, param);
461 	if (QDF_IS_STATUS_ERROR(status))
462 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
463 
464 	return status;
465 }
466 
467 QDF_STATUS tgt_vdev_mgr_beacon_cmd_send(
468 				struct vdev_mlme_obj *mlme_obj,
469 				struct beacon_params *param)
470 {
471 	return QDF_STATUS_SUCCESS;
472 }
473 
474 QDF_STATUS tgt_vdev_mgr_beacon_tmpl_send(
475 				struct vdev_mlme_obj *mlme_obj,
476 				struct beacon_tmpl_params *param)
477 {
478 	return QDF_STATUS_SUCCESS;
479 }
480 
481 #if defined(WLAN_SUPPORT_FILS) || defined(CONFIG_BAND_6GHZ)
482 QDF_STATUS tgt_vdev_mgr_fils_enable_send(
483 				struct vdev_mlme_obj *mlme_obj,
484 				struct config_fils_params *param)
485 {
486 	QDF_STATUS status;
487 	struct wlan_lmac_if_mlme_tx_ops *txops;
488 	struct wlan_objmgr_vdev *vdev;
489 	uint8_t vdev_id;
490 
491 	vdev = mlme_obj->vdev;
492 	vdev_id = wlan_vdev_get_id(vdev);
493 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
494 	if (!txops || !txops->vdev_fils_enable_send) {
495 		mlme_err("VDEV_%d: No Tx Ops fils Enable", vdev_id);
496 		return QDF_STATUS_E_INVAL;
497 	}
498 
499 	status = txops->vdev_fils_enable_send(vdev, param);
500 	if (QDF_IS_STATUS_ERROR(status))
501 		mlme_err("VDEV_%d: Tx Ops fils Enable Error : %d",
502 			 vdev_id, status);
503 
504 	return status;
505 }
506 #endif
507 
508 QDF_STATUS tgt_vdev_mgr_multiple_vdev_restart_send(
509 				struct wlan_objmgr_pdev *pdev,
510 				struct multiple_vdev_restart_params *param)
511 {
512 	QDF_STATUS status = QDF_STATUS_SUCCESS;
513 	struct wlan_lmac_if_mlme_tx_ops *txops;
514 	struct wlan_objmgr_vdev *vdev;
515 
516 	if (!param) {
517 		mlme_err("Invalid input");
518 		return QDF_STATUS_E_INVAL;
519 	}
520 
521 	vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev,
522 						    param->vdev_ids[0],
523 						    WLAN_VDEV_TARGET_IF_ID);
524 	if (vdev) {
525 		txops = wlan_vdev_mlme_get_lmac_txops(vdev);
526 		if (!txops || !txops->multiple_vdev_restart_req_cmd) {
527 			mlme_err("VDEV_%d: No Tx Ops", wlan_vdev_get_id(vdev));
528 			wlan_objmgr_vdev_release_ref(vdev,
529 						     WLAN_VDEV_TARGET_IF_ID);
530 			return QDF_STATUS_E_INVAL;
531 		}
532 
533 		status = txops->multiple_vdev_restart_req_cmd(pdev, param);
534 		if (QDF_IS_STATUS_ERROR(status))
535 			mlme_err("Tx Ops Error: %d", status);
536 
537 		wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
538 	}
539 
540 	return status;
541 }
542 
543 QDF_STATUS tgt_vdev_mgr_set_tx_rx_decap_type(struct vdev_mlme_obj *mlme_obj,
544 					     enum wlan_mlme_cfg_id param_id,
545 					     uint32_t value)
546 {
547 	QDF_STATUS status;
548 	struct wlan_lmac_if_mlme_tx_ops *txops;
549 	struct wlan_objmgr_vdev *vdev;
550 	uint8_t vdev_id;
551 
552 	if (!mlme_obj) {
553 		mlme_err("Invalid input");
554 		return QDF_STATUS_E_INVAL;
555 	}
556 
557 	vdev = mlme_obj->vdev;
558 	vdev_id = wlan_vdev_get_id(vdev);
559 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
560 	if (!txops || !txops->vdev_set_tx_rx_decap_type) {
561 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
562 		return QDF_STATUS_E_INVAL;
563 	}
564 
565 	status = txops->vdev_set_tx_rx_decap_type(vdev, param_id, value);
566 	if (QDF_IS_STATUS_ERROR(status))
567 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
568 
569 	return status;
570 }
571 
572 QDF_STATUS tgt_vdev_mgr_set_param_send(
573 				struct vdev_mlme_obj *mlme_obj,
574 				struct vdev_set_params *param)
575 {
576 	QDF_STATUS status;
577 	struct wlan_lmac_if_mlme_tx_ops *txops;
578 	struct wlan_objmgr_vdev *vdev;
579 	uint8_t vdev_id;
580 
581 	if (!param) {
582 		mlme_err("Invalid input");
583 		return QDF_STATUS_E_INVAL;
584 	}
585 
586 	vdev = mlme_obj->vdev;
587 	vdev_id = wlan_vdev_get_id(vdev);
588 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
589 	if (!txops || !txops->vdev_set_param_send) {
590 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
591 		return QDF_STATUS_E_INVAL;
592 	}
593 
594 	status = txops->vdev_set_param_send(vdev, param);
595 	if (QDF_IS_STATUS_ERROR(status))
596 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
597 
598 	return status;
599 }
600 
601 QDF_STATUS tgt_vdev_mgr_sta_ps_param_send(
602 				struct vdev_mlme_obj *mlme_obj,
603 				struct sta_ps_params *param)
604 {
605 	QDF_STATUS status;
606 	struct wlan_lmac_if_mlme_tx_ops *txops;
607 	struct wlan_objmgr_vdev *vdev;
608 	uint8_t vdev_id;
609 
610 	if (!param) {
611 		mlme_err("Invalid input");
612 		return QDF_STATUS_E_INVAL;
613 	}
614 
615 	vdev = mlme_obj->vdev;
616 	vdev_id = wlan_vdev_get_id(vdev);
617 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
618 	if (!txops || !txops->vdev_sta_ps_param_send) {
619 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
620 		return QDF_STATUS_E_INVAL;
621 	}
622 
623 	status = txops->vdev_sta_ps_param_send(vdev, param);
624 	if (QDF_IS_STATUS_ERROR(status))
625 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
626 
627 	return status;
628 }
629 
630 QDF_STATUS tgt_vdev_mgr_peer_delete_all_send(
631 				struct vdev_mlme_obj *mlme_obj,
632 				struct peer_delete_all_params *param)
633 {
634 	QDF_STATUS status;
635 	struct wlan_lmac_if_mlme_tx_ops *txops;
636 	struct wlan_objmgr_vdev *vdev;
637 	uint8_t vdev_id;
638 
639 	if (!param) {
640 		mlme_err("Invalid input");
641 		return QDF_STATUS_E_INVAL;
642 	}
643 
644 	vdev = mlme_obj->vdev;
645 	vdev_id = wlan_vdev_get_id(vdev);
646 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
647 	if (!txops || !txops->peer_delete_all_send) {
648 		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
649 		return QDF_STATUS_E_INVAL;
650 	}
651 
652 	status = txops->peer_delete_all_send(vdev, param);
653 	if (QDF_IS_STATUS_ERROR(status))
654 		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
655 
656 	return QDF_STATUS_SUCCESS;
657 }
658