xref: /wlan-dirver/qca-wifi-host-cmn/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_tx_ops.c (revision f28396d060cff5c6519f883cb28ae0116ce479f1)
1 /*
2  * Copyright (c) 2019-2020 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: target_if_vdev_mgr_tx_ops.c
21  *
22  * This file provide definition for APIs registered through lmac Tx Ops
23  */
24 #include <wlan_objmgr_pdev_obj.h>
25 #include <wlan_objmgr_vdev_obj.h>
26 #include <wmi_unified_api.h>
27 #include <wmi_unified_param.h>
28 #include <init_deinit_lmac.h>
29 #include <target_if_vdev_mgr_tx_ops.h>
30 #include <target_if_vdev_mgr_rx_ops.h>
31 #include <target_if.h>
32 #include <target_type.h>
33 #include <wlan_mlme_dbg.h>
34 #include <wlan_vdev_mgr_tgt_if_tx_defs.h>
35 #include <wlan_vdev_mgr_utils_api.h>
36 #include <wlan_cmn.h>
37 #include <wmi_unified_vdev_api.h>
38 #include <cdp_txrx_ctrl.h>
39 #include <target_if_psoc_timer_tx_ops.h>
40 #include <target_if_psoc_wake_lock.h>
41 
42 static QDF_STATUS target_if_vdev_mgr_register_event_handler(
43 					struct wlan_objmgr_psoc *psoc)
44 {
45 	return target_if_vdev_mgr_wmi_event_register(psoc);
46 }
47 
48 static QDF_STATUS target_if_vdev_mgr_unregister_event_handler(
49 					struct wlan_objmgr_psoc *psoc)
50 {
51 	return target_if_vdev_mgr_wmi_event_unregister(psoc);
52 }
53 
54 QDF_STATUS
55 target_if_vdev_mgr_rsp_timer_stop(struct wlan_objmgr_psoc *psoc,
56 				  struct vdev_response_timer *vdev_rsp,
57 				  enum wlan_vdev_mgr_tgt_if_rsp_bit clear_bit)
58 {
59 	struct wlan_lmac_if_mlme_tx_ops *txops;
60 
61 	txops = target_if_vdev_mgr_get_tx_ops(psoc);
62 	if (!txops || !txops->psoc_vdev_rsp_timer_deinit) {
63 		mlme_err("Failed to get mlme txrx_ops VDEV_%d PSOC_%d",
64 			 vdev_rsp->vdev_id, wlan_psoc_get_id(psoc));
65 		return QDF_STATUS_E_FAILURE;
66 	}
67 
68 	if (qdf_atomic_test_and_clear_bit(clear_bit, &vdev_rsp->rsp_status)) {
69 		/*
70 		 * This is triggered from timer expiry case only for
71 		 * which timer stop is not required
72 		 */
73 		if (vdev_rsp->timer_status != QDF_STATUS_E_TIMEOUT)
74 			qdf_timer_stop(&vdev_rsp->rsp_timer);
75 
76 		vdev_rsp->timer_status = QDF_STATUS_SUCCESS;
77 		if (clear_bit == DELETE_RESPONSE_BIT)
78 			txops->psoc_vdev_rsp_timer_deinit(psoc,
79 							  vdev_rsp->vdev_id);
80 
81 		/*
82 		 * Releasing reference taken at the time of
83 		 * starting response timer
84 		 */
85 		wlan_objmgr_psoc_release_ref(psoc, WLAN_PSOC_TARGET_IF_ID);
86 		return QDF_STATUS_SUCCESS;
87 	}
88 	return QDF_STATUS_E_FAILURE;
89 }
90 
91 static QDF_STATUS target_if_vdev_mgr_rsp_timer_start(
92 				struct wlan_objmgr_psoc *psoc,
93 				struct vdev_response_timer *vdev_rsp,
94 				enum wlan_vdev_mgr_tgt_if_rsp_bit set_bit)
95 {
96 	uint8_t rsp_pos;
97 	uint8_t vdev_id;
98 
99 	/* it is expected to be only one command with FW at a time */
100 	for (rsp_pos = START_RESPONSE_BIT; rsp_pos <= RESPONSE_BIT_MAX;
101 	     rsp_pos++) {
102 		if (rsp_pos != set_bit) {
103 			if (qdf_atomic_test_bit(rsp_pos,
104 						&vdev_rsp->rsp_status)) {
105 				vdev_id = vdev_rsp->vdev_id;
106 				mlme_err("PSOC_%d VDEV_%d: %s requested, waiting for %s response",
107 					 wlan_psoc_get_id(psoc),
108 					 vdev_id,
109 					 string_from_rsp_bit(set_bit),
110 					 string_from_rsp_bit(rsp_pos));
111 				target_if_vdev_mgr_assert_mgmt(psoc,
112 							       vdev_id);
113 				target_if_vdev_mgr_rsp_timer_stop(psoc,
114 								  vdev_rsp,
115 								  rsp_pos);
116 			}
117 		}
118 	}
119 
120 	if (qdf_atomic_test_and_set_bit(set_bit, &vdev_rsp->rsp_status)) {
121 		mlme_err("PSOC_%d VDEV_%d: %s requested, waiting for %s response",
122 			 wlan_psoc_get_id(psoc),
123 			 vdev_rsp->vdev_id, string_from_rsp_bit(set_bit),
124 			 string_from_rsp_bit(set_bit));
125 		target_if_vdev_mgr_assert_mgmt(psoc, vdev_rsp->vdev_id);
126 		target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, set_bit);
127 
128 		qdf_atomic_set_bit(set_bit, &vdev_rsp->rsp_status);
129 	}
130 
131 	/* reference taken for timer start, will be released with stop */
132 	wlan_objmgr_psoc_get_ref(psoc, WLAN_PSOC_TARGET_IF_ID);
133 	qdf_timer_start(&vdev_rsp->rsp_timer, vdev_rsp->expire_time);
134 
135 	return QDF_STATUS_SUCCESS;
136 }
137 
138 
139 struct wmi_unified
140 *target_if_vdev_mgr_wmi_handle_get(struct wlan_objmgr_vdev *vdev)
141 {
142 	struct wlan_objmgr_pdev *pdev;
143 	struct wmi_unified *wmi_handle;
144 
145 	pdev = wlan_vdev_get_pdev(vdev);
146 	if (!pdev) {
147 		mlme_err("PDEV is NULL");
148 		return NULL;
149 	}
150 
151 	wmi_handle = get_wmi_unified_hdl_from_pdev(pdev);
152 	if (!wmi_handle) {
153 		mlme_err("wmi_handle is null");
154 		return NULL;
155 	}
156 
157 	return wmi_handle;
158 }
159 
160 static inline uint32_t
161 target_if_vdev_mlme_build_txbf_caps(struct wlan_objmgr_vdev *vdev)
162 {
163 	uint32_t txbf_cap;
164 	uint32_t subfer;
165 	uint32_t mubfer;
166 	uint32_t subfee;
167 	uint32_t mubfee;
168 	uint32_t implicit_bf;
169 	uint32_t sounding_dimension;
170 	uint32_t bfee_sts_cap;
171 
172 	txbf_cap = 0;
173 	/*
174 	 * ensure to set these after mlme component is attached to objmgr
175 	 */
176 	wlan_util_vdev_get_param(vdev, WLAN_MLME_CFG_SUBFEE, &subfee);
177 	wlan_util_vdev_get_param(vdev, WLAN_MLME_CFG_MUBFEE, &mubfee);
178 	wlan_util_vdev_get_param(vdev, WLAN_MLME_CFG_SUBFER, &subfer);
179 	wlan_util_vdev_get_param(vdev, WLAN_MLME_CFG_MUBFER, &mubfer);
180 	wlan_util_vdev_get_param(vdev, WLAN_MLME_CFG_BFEE_STS_CAP,
181 			&bfee_sts_cap);
182 	wlan_util_vdev_get_param(vdev, WLAN_MLME_CFG_IMLICIT_BF,
183 			&implicit_bf);
184 	wlan_util_vdev_get_param(vdev, WLAN_MLME_CFG_SOUNDING_DIM,
185 			&sounding_dimension);
186 
187 	WMI_HOST_TXBF_CONF_SU_TX_BFEE_SET(txbf_cap, subfee);
188 	WMI_HOST_TXBF_CONF_MU_TX_BFEE_SET(txbf_cap, mubfee);
189 	WMI_HOST_TXBF_CONF_SU_TX_BFER_SET(txbf_cap, subfer);
190 	WMI_HOST_TXBF_CONF_MU_TX_BFER_SET(txbf_cap, mubfer);
191 	WMI_HOST_TXBF_CONF_STS_CAP_SET(txbf_cap, bfee_sts_cap);
192 	WMI_HOST_TXBF_CONF_IMPLICIT_BF_SET(txbf_cap, implicit_bf);
193 	WMI_HOST_TXBF_CONF_BF_SND_DIM_SET(txbf_cap, sounding_dimension);
194 
195 	mlme_debug("VHT su bfee:%d mu bfee:%d su bfer:%d "
196 		   "mu bfer:%d impl bf:%d sounding dim:%d",
197 		   WMI_HOST_TXBF_CONF_SU_TX_BFEE_GET(txbf_cap),
198 		   WMI_HOST_TXBF_CONF_MU_TX_BFEE_GET(txbf_cap),
199 		   WMI_HOST_TXBF_CONF_SU_TX_BFER_GET(txbf_cap),
200 		   WMI_HOST_TXBF_CONF_MU_TX_BFER_GET(txbf_cap),
201 		   WMI_HOST_TXBF_CONF_IMPLICIT_BF_GET(txbf_cap),
202 		   WMI_HOST_TXBF_CONF_BF_SND_DIM_GET(txbf_cap));
203 
204 	return txbf_cap;
205 }
206 
207 static inline uint32_t
208 target_if_vdev_mlme_id_2_wmi(uint32_t cfg_id)
209 {
210 	int wmi_id;
211 
212 	switch (cfg_id) {
213 	case WLAN_MLME_CFG_DTIM_PERIOD:
214 		wmi_id = wmi_vdev_param_dtim_period;
215 		break;
216 	case WLAN_MLME_CFG_SLOT_TIME:
217 		wmi_id = wmi_vdev_param_slot_time;
218 		break;
219 	case WLAN_MLME_CFG_PROTECTION_MODE:
220 		wmi_id = wmi_vdev_param_protection_mode;
221 		break;
222 	case WLAN_MLME_CFG_BEACON_INTERVAL:
223 		wmi_id = wmi_vdev_param_beacon_interval;
224 		break;
225 	case WLAN_MLME_CFG_LDPC:
226 		wmi_id = wmi_vdev_param_ldpc;
227 		break;
228 	case WLAN_MLME_CFG_NSS:
229 		wmi_id = wmi_vdev_param_nss;
230 		break;
231 	case WLAN_MLME_CFG_SUBFER:
232 	case WLAN_MLME_CFG_MUBFER:
233 	case WLAN_MLME_CFG_SUBFEE:
234 	case WLAN_MLME_CFG_MUBFEE:
235 	case WLAN_MLME_CFG_IMLICIT_BF:
236 	case WLAN_MLME_CFG_SOUNDING_DIM:
237 	case WLAN_MLME_CFG_TXBF_CAPS:
238 		wmi_id = wmi_vdev_param_txbf;
239 		break;
240 	case WLAN_MLME_CFG_HE_OPS:
241 		wmi_id = wmi_vdev_param_set_heop;
242 		break;
243 	case WLAN_MLME_CFG_RTS_THRESHOLD:
244 		wmi_id = wmi_vdev_param_rts_threshold;
245 		break;
246 	case WLAN_MLME_CFG_FRAG_THRESHOLD:
247 		wmi_id = wmi_vdev_param_fragmentation_threshold;
248 		break;
249 	case WLAN_MLME_CFG_DROP_UNENCRY:
250 		wmi_id = wmi_vdev_param_drop_unencry;
251 		break;
252 	case WLAN_MLME_CFG_TX_POWER:
253 		wmi_id = wmi_vdev_param_tx_power;
254 		break;
255 	case WLAN_MLME_CFG_AMPDU:
256 		wmi_id = wmi_vdev_param_ampdu_subframe_size_per_ac;
257 		break;
258 	case WLAN_MLME_CFG_AMSDU:
259 		wmi_id = wmi_vdev_param_amsdu_subframe_size_per_ac;
260 		break;
261 	case WLAN_MLME_CFG_MIN_IDLE_INACTIVE_TIME:
262 		wmi_id =
263 			wmi_vdev_param_ap_keepalive_min_idle_inactive_time_secs;
264 		break;
265 	case WLAN_MLME_CFG_MAX_IDLE_INACTIVE_TIME:
266 		wmi_id =
267 			wmi_vdev_param_ap_keepalive_max_idle_inactive_time_secs;
268 		break;
269 	case WLAN_MLME_CFG_MAX_UNRESPONSIVE_INACTIVE_TIME:
270 		wmi_id =
271 			wmi_vdev_param_ap_keepalive_max_unresponsive_time_secs;
272 		break;
273 	case WLAN_MLME_CFG_UAPSD:
274 		wmi_id = WMI_HOST_STA_PS_PARAM_UAPSD;
275 		break;
276 	case WLAN_MLME_CFG_BCN_TX_RATE_CODE:
277 		wmi_id = wmi_vdev_param_beacon_rate;
278 		break;
279 	case WLAN_MLME_CFG_TX_MGMT_RATE_CODE:
280 		wmi_id = wmi_vdev_param_mgmt_rate;
281 		break;
282 	case WLAN_MLME_CFG_LISTEN_INTERVAL:
283 		wmi_id = wmi_vdev_param_listen_interval;
284 		break;
285 	case WLAN_MLME_CFG_ENABLE_MULTI_GROUP_KEY:
286 		wmi_id = wmi_vdev_param_enable_multi_group_key;
287 		break;
288 	case WLAN_MLME_CFG_MAX_GROUP_KEYS:
289 		wmi_id = wmi_vdev_param_max_group_keys;
290 		break;
291 	case WLAN_MLME_CFG_TX_ENCAP_TYPE:
292 		wmi_id = wmi_vdev_param_tx_encap_type;
293 		break;
294 	case WLAN_MLME_CFG_RX_DECAP_TYPE:
295 		wmi_id = wmi_vdev_param_rx_decap_type;
296 		break;
297 	default:
298 		wmi_id = cfg_id;
299 		break;
300 	}
301 
302 	return wmi_id;
303 }
304 
305 static
306 QDF_STATUS target_if_vdev_set_tx_rx_decap_type(struct wlan_objmgr_vdev *vdev,
307 					       enum wlan_mlme_cfg_id param_id,
308 					       uint32_t value)
309 {
310 	ol_txrx_soc_handle soc_txrx_handle;
311 	struct wlan_objmgr_psoc *psoc;
312 	uint8_t vdev_id = wlan_vdev_get_id(vdev);
313 	cdp_config_param_type val = {0};
314 
315 	psoc = wlan_vdev_get_psoc(vdev);
316 	soc_txrx_handle = wlan_psoc_get_dp_handle(psoc);
317 
318 	if (!soc_txrx_handle)
319 		return QDF_STATUS_E_INVAL;
320 
321 	if (param_id ==  WLAN_MLME_CFG_TX_ENCAP_TYPE) {
322 		val.cdp_vdev_param_tx_encap = value;
323 		return cdp_txrx_set_vdev_param(soc_txrx_handle,
324 					       vdev_id, CDP_TX_ENCAP_TYPE,
325 					       val);
326 	} else if (param_id == WLAN_MLME_CFG_RX_DECAP_TYPE) {
327 		val.cdp_vdev_param_rx_decap = value;
328 		return cdp_txrx_set_vdev_param(soc_txrx_handle,
329 					       vdev_id, CDP_RX_DECAP_TYPE,
330 					       val);
331 	}
332 
333 	return QDF_STATUS_SUCCESS;
334 }
335 
336 static QDF_STATUS target_if_vdev_mgr_set_param_send(
337 					struct wlan_objmgr_vdev *vdev,
338 					struct vdev_set_params *param)
339 {
340 	QDF_STATUS status;
341 	struct wmi_unified *wmi_handle;
342 	int param_id;
343 
344 	if (!vdev || !param) {
345 		mlme_err("Invalid input");
346 		return QDF_STATUS_E_INVAL;
347 	}
348 
349 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
350 	if (!wmi_handle) {
351 		mlme_err("Failed to get WMI handle!");
352 		return QDF_STATUS_E_INVAL;
353 	}
354 	param_id = target_if_vdev_mlme_id_2_wmi(param->param_id);
355 	param->param_id = param_id;
356 	if (param->param_id == wmi_vdev_param_txbf)
357 		param->param_value = target_if_vdev_mlme_build_txbf_caps(vdev);
358 
359 	status = wmi_unified_vdev_set_param_send(wmi_handle, param);
360 
361 	return status;
362 }
363 
364 static QDF_STATUS target_if_vdev_mgr_create_send(
365 					struct wlan_objmgr_vdev *vdev,
366 					struct vdev_create_params *param)
367 {
368 	QDF_STATUS status;
369 	struct wmi_unified *wmi_handle;
370 	uint8_t vap_addr[QDF_MAC_ADDR_SIZE] = {0};
371 	struct wlan_lmac_if_mlme_tx_ops *txops;
372 	struct wlan_objmgr_psoc *psoc;
373 	uint8_t vdev_id;
374 
375 	if (!vdev || !param) {
376 		mlme_err("Invalid input");
377 		return QDF_STATUS_E_INVAL;
378 	}
379 
380 	psoc = wlan_vdev_get_psoc(vdev);
381 	if (!psoc) {
382 		mlme_err("Failed to get psoc for VDEV_%d",
383 			 wlan_vdev_get_id(vdev));
384 		return QDF_STATUS_E_INVAL;
385 	}
386 
387 	txops = wlan_mlme_get_lmac_tx_ops(psoc);
388 	if (!txops || !txops->psoc_vdev_rsp_timer_init) {
389 		mlme_err("Failed to get mlme txrx_ops for VDEV_%d PSOC_%d",
390 			 wlan_vdev_get_id(vdev), wlan_psoc_get_id(psoc));
391 		return QDF_STATUS_E_INVAL;
392 	}
393 
394 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
395 	if (!wmi_handle) {
396 		mlme_err("Failed to get WMI handle!");
397 		return QDF_STATUS_E_INVAL;
398 	}
399 
400 	WLAN_ADDR_COPY(vap_addr, wlan_vdev_mlme_get_macaddr(vdev));
401 	status = wmi_unified_vdev_create_send(wmi_handle, vap_addr,
402 					      param);
403 
404 	vdev_id = wlan_vdev_get_id(vdev);
405 	if (QDF_IS_STATUS_SUCCESS(status))
406 		status = txops->psoc_vdev_rsp_timer_init(psoc, vdev_id);
407 
408 	return status;
409 }
410 
411 static QDF_STATUS target_if_vdev_mgr_start_send(
412 					struct wlan_objmgr_vdev *vdev,
413 					struct vdev_start_params *param)
414 {
415 	QDF_STATUS status;
416 	struct wmi_unified *wmi_handle;
417 	struct wlan_objmgr_psoc *psoc;
418 	struct wlan_lmac_if_mlme_rx_ops *rx_ops;
419 	uint8_t vdev_id;
420 	struct vdev_response_timer *vdev_rsp;
421 
422 	if (!vdev || !param) {
423 		mlme_err("Invalid input");
424 		return QDF_STATUS_E_INVAL;
425 	}
426 
427 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
428 	if (!wmi_handle) {
429 		mlme_err("Failed to get WMI handle!");
430 		return QDF_STATUS_E_INVAL;
431 	}
432 
433 	vdev_id = wlan_vdev_get_id(vdev);
434 	psoc = wlan_vdev_get_psoc(vdev);
435 	rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
436 	if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) {
437 		mlme_err("VEV_%d: PSOC_%d No Rx Ops", vdev_id,
438 			 wlan_psoc_get_id(psoc));
439 		return QDF_STATUS_E_INVAL;
440 	}
441 
442 	vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
443 	if (!vdev_rsp) {
444 		mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", vdev_id,
445 			 wlan_psoc_get_id(psoc));
446 		return QDF_STATUS_E_INVAL;
447 	}
448 
449 	vdev_rsp->expire_time = START_RESPONSE_TIMER;
450 	target_if_wake_lock_timeout_acquire(psoc, START_WAKELOCK);
451 
452 	if (param->is_restart)
453 		target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp,
454 						   RESTART_RESPONSE_BIT);
455 	else
456 		target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp,
457 						   START_RESPONSE_BIT);
458 
459 	status = wmi_unified_vdev_start_send(wmi_handle, param);
460 	if (QDF_IS_STATUS_ERROR(status)) {
461 		vdev_rsp->timer_status = QDF_STATUS_E_CANCELED;
462 		vdev_rsp->expire_time = 0;
463 		target_if_wake_lock_timeout_release(psoc, START_WAKELOCK);
464 		if (param->is_restart)
465 			target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp,
466 							  RESTART_RESPONSE_BIT);
467 		else
468 			target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp,
469 							  START_RESPONSE_BIT);
470 	}
471 	return status;
472 }
473 
474 static QDF_STATUS target_if_vdev_mgr_delete_response_send(
475 				struct wlan_objmgr_vdev *vdev,
476 				struct wlan_lmac_if_mlme_rx_ops *rx_ops)
477 {
478 	QDF_STATUS status = QDF_STATUS_SUCCESS;
479 	struct wlan_objmgr_psoc *psoc = wlan_vdev_get_psoc(vdev);
480 	struct vdev_delete_response rsp = {0};
481 
482 	rsp.vdev_id = wlan_vdev_get_id(vdev);
483 	status = rx_ops->vdev_mgr_delete_response(psoc, &rsp);
484 	target_if_wake_lock_timeout_release(psoc, DELETE_WAKELOCK);
485 
486 	return status;
487 }
488 
489 static QDF_STATUS target_if_vdev_mgr_delete_send(
490 					struct wlan_objmgr_vdev *vdev,
491 					struct vdev_delete_params *param)
492 {
493 	QDF_STATUS status;
494 	struct wlan_objmgr_psoc *psoc;
495 	struct wmi_unified *wmi_handle;
496 	struct wlan_lmac_if_mlme_rx_ops *rx_ops;
497 	uint8_t vdev_id;
498 	struct vdev_response_timer *vdev_rsp;
499 
500 	if (!vdev || !param) {
501 		mlme_err("Invalid input");
502 		return QDF_STATUS_E_INVAL;
503 	}
504 
505 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
506 	if (!wmi_handle) {
507 		mlme_err("Failed to get WMI handle!");
508 		return QDF_STATUS_E_INVAL;
509 	}
510 
511 	vdev_id = wlan_vdev_get_id(vdev);
512 	psoc = wlan_vdev_get_psoc(vdev);
513 	rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
514 	if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) {
515 		mlme_err("VDEV_%d PSOC_%d No Rx Ops", vdev_id,
516 			 wlan_psoc_get_id(psoc));
517 		return QDF_STATUS_E_INVAL;
518 	}
519 
520 	vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
521 	if (!vdev_rsp) {
522 		mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", vdev_id,
523 			 wlan_psoc_get_id(psoc));
524 		return QDF_STATUS_E_INVAL;
525 	}
526 
527 	vdev_rsp->expire_time = DELETE_RESPONSE_TIMER;
528 	target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp,
529 					   DELETE_RESPONSE_BIT);
530 	target_if_wake_lock_timeout_acquire(psoc, DELETE_WAKELOCK);
531 
532 	status = wmi_unified_vdev_delete_send(wmi_handle, param->vdev_id);
533 	if (QDF_IS_STATUS_SUCCESS(status)) {
534 		/*
535 		 * Simulate delete response if target doesn't support
536 		 */
537 		if (!wmi_service_enabled(wmi_handle,
538 					 wmi_service_sync_delete_cmds) ||
539 		    wlan_psoc_nif_feat_cap_get(psoc,
540 					       WLAN_SOC_F_TESTMODE_ENABLE)) {
541 			target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp,
542 							  DELETE_RESPONSE_BIT);
543 			target_if_vdev_mgr_delete_response_send(vdev, rx_ops);
544 		}
545 	} else {
546 		vdev_rsp->expire_time = 0;
547 		vdev_rsp->timer_status = QDF_STATUS_E_CANCELED;
548 		target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp,
549 						  DELETE_RESPONSE_BIT);
550 		target_if_wake_lock_timeout_release(psoc, DELETE_WAKELOCK);
551 	}
552 	return status;
553 }
554 
555 static QDF_STATUS target_if_vdev_mgr_stop_send(
556 					struct wlan_objmgr_vdev *vdev,
557 					struct vdev_stop_params *param)
558 {
559 	QDF_STATUS status;
560 	struct wmi_unified *wmi_handle;
561 	struct wlan_lmac_if_mlme_rx_ops *rx_ops;
562 	struct wlan_objmgr_psoc *psoc;
563 	uint8_t vdev_id;
564 	struct vdev_response_timer *vdev_rsp;
565 
566 
567 	if (!vdev || !param) {
568 		mlme_err("Invalid input");
569 		return QDF_STATUS_E_INVAL;
570 	}
571 
572 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
573 	if (!wmi_handle) {
574 		mlme_err("Failed to get WMI handle!");
575 		return QDF_STATUS_E_INVAL;
576 	}
577 
578 	vdev_id = wlan_vdev_get_id(vdev);
579 	psoc = wlan_vdev_get_psoc(vdev);
580 	rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
581 	if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) {
582 		mlme_err("VDEV_%d PSOC_%d No Rx Ops", vdev_id,
583 			 wlan_psoc_get_id(psoc));
584 		return QDF_STATUS_E_INVAL;
585 	}
586 
587 	vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
588 	if (!vdev_rsp) {
589 		mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", vdev_id,
590 			 wlan_psoc_get_id(psoc));
591 		return QDF_STATUS_E_INVAL;
592 	}
593 
594 	vdev_rsp->expire_time = STOP_RESPONSE_TIMER;
595 	target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp, STOP_RESPONSE_BIT);
596 	target_if_wake_lock_timeout_acquire(psoc, STOP_WAKELOCK);
597 
598 	status = wmi_unified_vdev_stop_send(wmi_handle, param->vdev_id);
599 	if (QDF_IS_STATUS_ERROR(status)) {
600 		vdev_rsp->expire_time = 0;
601 		vdev_rsp->timer_status = QDF_STATUS_E_CANCELED;
602 		target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp,
603 						  STOP_RESPONSE_BIT);
604 		target_if_wake_lock_timeout_release(psoc, STOP_WAKELOCK);
605 	}
606 	return status;
607 }
608 
609 static QDF_STATUS target_if_vdev_mgr_down_send(
610 					struct wlan_objmgr_vdev *vdev,
611 					struct vdev_down_params *param)
612 {
613 	QDF_STATUS status;
614 	struct wmi_unified *wmi_handle;
615 	struct wlan_objmgr_psoc *psoc;
616 
617 	if (!vdev || !param) {
618 		mlme_err("Invalid input");
619 		return QDF_STATUS_E_INVAL;
620 	}
621 
622 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
623 	if (!wmi_handle) {
624 		mlme_err("Failed to get WMI handle!");
625 		return QDF_STATUS_E_INVAL;
626 	}
627 
628 	psoc = wlan_vdev_get_psoc(vdev);
629 	if (!psoc) {
630 		mlme_err("Failed to get PSOC Object");
631 		return QDF_STATUS_E_INVAL;
632 	}
633 
634 	status = wmi_unified_vdev_down_send(wmi_handle, param->vdev_id);
635 	target_if_wake_lock_timeout_release(psoc, START_WAKELOCK);
636 
637 	return status;
638 }
639 
640 static QDF_STATUS target_if_vdev_mgr_up_send(
641 					struct wlan_objmgr_vdev *vdev,
642 					struct vdev_up_params *param)
643 {
644 	QDF_STATUS status;
645 	struct wmi_unified *wmi_handle;
646 	uint8_t bssid[QDF_MAC_ADDR_SIZE];
647 	struct wlan_objmgr_psoc *psoc;
648 
649 	if (!vdev || !param) {
650 		mlme_err("Invalid input");
651 		return QDF_STATUS_E_INVAL;
652 	}
653 
654 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
655 	if (!wmi_handle) {
656 		mlme_err("Failed to get WMI handle!");
657 		return QDF_STATUS_E_INVAL;
658 	}
659 
660 	psoc = wlan_vdev_get_psoc(vdev);
661 	if (!psoc) {
662 		mlme_err("Failed to get PSOC Object");
663 		return QDF_STATUS_E_INVAL;
664 	}
665 	ucfg_wlan_vdev_mgr_get_param_bssid(vdev, bssid);
666 
667 	status = wmi_unified_vdev_up_send(wmi_handle, bssid, param);
668 	target_if_wake_lock_timeout_release(psoc, START_WAKELOCK);
669 
670 	return status;
671 }
672 
673 static QDF_STATUS target_if_vdev_mgr_beacon_tmpl_send(
674 					struct wlan_objmgr_vdev *vdev,
675 					struct beacon_tmpl_params *param)
676 {
677 	QDF_STATUS status;
678 	struct wmi_unified *wmi_handle;
679 
680 	if (!vdev || !param) {
681 		mlme_err("Invalid input");
682 		return QDF_STATUS_E_INVAL;
683 	}
684 
685 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
686 	if (!wmi_handle) {
687 		mlme_err("Failed to get WMI handle!");
688 		return QDF_STATUS_E_INVAL;
689 	}
690 
691 	status = wmi_unified_beacon_tmpl_send_cmd(wmi_handle, param);
692 	return status;
693 }
694 
695 static QDF_STATUS target_if_vdev_mgr_set_nac_rssi_send(
696 				struct wlan_objmgr_vdev *vdev,
697 				struct vdev_scan_nac_rssi_params *param)
698 {
699 	QDF_STATUS status;
700 	struct wmi_unified *wmi_handle;
701 
702 	if (!vdev || !param) {
703 		mlme_err("Invalid input");
704 		return QDF_STATUS_E_INVAL;
705 	}
706 
707 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
708 	if (!wmi_handle) {
709 		mlme_err("Failed to get WMI handle!");
710 		return QDF_STATUS_E_INVAL;
711 	}
712 
713 	status = wmi_unified_vdev_set_nac_rssi_send(wmi_handle, param);
714 
715 	return status;
716 }
717 
718 static QDF_STATUS target_if_vdev_mgr_set_neighbour_rx_cmd_send(
719 					struct wlan_objmgr_vdev *vdev,
720 					struct set_neighbour_rx_params *param,
721 					uint8_t *mac)
722 {
723 	QDF_STATUS status;
724 	struct wmi_unified *wmi_handle;
725 
726 	if (!vdev || !param) {
727 		mlme_err("Invalid input");
728 		return QDF_STATUS_E_INVAL;
729 	}
730 
731 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
732 	if (!wmi_handle) {
733 		mlme_err("Failed to get WMI handle!");
734 		return QDF_STATUS_E_INVAL;
735 	}
736 
737 	status = wmi_unified_vdev_set_neighbour_rx_cmd_send(wmi_handle,
738 							    mac, param);
739 
740 	return status;
741 }
742 
743 static QDF_STATUS target_if_vdev_mgr_sifs_trigger_send(
744 					struct wlan_objmgr_vdev *vdev,
745 					struct sifs_trigger_param *param)
746 {
747 	QDF_STATUS status;
748 	struct wmi_unified *wmi_handle;
749 
750 	if (!vdev || !param) {
751 		mlme_err("Invalid input");
752 		return QDF_STATUS_E_INVAL;
753 	}
754 
755 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
756 	if (!wmi_handle) {
757 		mlme_err("Failed to get WMI handle!");
758 		return QDF_STATUS_E_INVAL;
759 	}
760 
761 	status = wmi_unified_sifs_trigger_send(wmi_handle, param);
762 
763 	return status;
764 }
765 
766 static QDF_STATUS target_if_vdev_mgr_set_custom_aggr_size_cmd_send(
767 				struct wlan_objmgr_vdev *vdev,
768 				struct set_custom_aggr_size_params *param)
769 {
770 	QDF_STATUS status;
771 	struct wmi_unified *wmi_handle;
772 
773 	if (!vdev || !param) {
774 		mlme_err("Invalid input");
775 		return QDF_STATUS_E_INVAL;
776 	}
777 
778 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
779 	if (!wmi_handle) {
780 		mlme_err("Failed to get WMI handle!");
781 		return QDF_STATUS_E_INVAL;
782 	}
783 
784 	status = wmi_unified_vdev_set_custom_aggr_size_cmd_send(wmi_handle,
785 								param);
786 
787 	return status;
788 }
789 
790 static QDF_STATUS target_if_vdev_mgr_config_ratemask_cmd_send(
791 					struct wlan_objmgr_vdev *vdev,
792 					struct config_ratemask_params *param)
793 {
794 	QDF_STATUS status;
795 	struct wmi_unified *wmi_handle;
796 
797 	if (!vdev || !param) {
798 		mlme_err("Invalid input");
799 		return QDF_STATUS_E_INVAL;
800 	}
801 
802 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
803 	if (!wmi_handle) {
804 		mlme_err("Failed to get WMI handle!");
805 		return QDF_STATUS_E_INVAL;
806 	}
807 
808 	status = wmi_unified_vdev_config_ratemask_cmd_send(wmi_handle,
809 							   param);
810 	return status;
811 }
812 
813 static QDF_STATUS target_if_vdev_mgr_peer_flush_tids_send(
814 					struct wlan_objmgr_vdev *vdev,
815 					struct peer_flush_params *param)
816 {
817 	QDF_STATUS status;
818 	struct wmi_unified *wmi_handle;
819 
820 	if (!vdev || !param) {
821 		mlme_err("Invalid input");
822 		return QDF_STATUS_E_INVAL;
823 	}
824 
825 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
826 	if (!wmi_handle) {
827 		mlme_err("Failed to get WMI handle!");
828 		return QDF_STATUS_E_INVAL;
829 	}
830 
831 	status = wmi_unified_peer_flush_tids_send(wmi_handle, param->peer_mac,
832 						  param);
833 
834 	return status;
835 }
836 
837 static int32_t target_if_vdev_mgr_multi_vdev_restart_get_ref(
838 			struct wlan_objmgr_pdev *pdev,
839 			struct multiple_vdev_restart_params *param,
840 			struct wlan_objmgr_vdev **vdev_list,
841 			bool *vdev_timer_started)
842 {
843 	struct wlan_objmgr_psoc *psoc;
844 	struct wlan_objmgr_vdev *tvdev;
845 	struct wlan_lmac_if_mlme_rx_ops *rx_ops;
846 	int32_t vdev_idx = -1;
847 	int32_t last_vdev_idx = -1;
848 	struct vdev_response_timer *vdev_rsp;
849 
850 	psoc = wlan_pdev_get_psoc(pdev);
851 	rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
852 
853 	if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) {
854 		mlme_err("VDEV_%d: No Rx Ops", vdev_idx);
855 		return last_vdev_idx;
856 	}
857 
858 	for (vdev_idx = 0; vdev_idx < param->num_vdevs ; vdev_idx++) {
859 		vdev_list[vdev_idx] = wlan_objmgr_get_vdev_by_id_from_pdev(
860 						pdev,
861 						param->vdev_ids[vdev_idx],
862 						WLAN_VDEV_TARGET_IF_ID);
863 		tvdev = vdev_list[vdev_idx];
864 		if (!tvdev) {
865 			mlme_err("VDEV_%d is NULL", vdev_idx);
866 			return last_vdev_idx;
867 		}
868 
869 		vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(
870 						psoc,
871 						wlan_vdev_get_id(tvdev));
872 		if (!vdev_rsp) {
873 			mlme_err("VDEV_%d PSOC_%d No vdev rsp timer",
874 				 vdev_idx, wlan_psoc_get_id(psoc));
875 			return last_vdev_idx;
876 		}
877 
878 		last_vdev_idx = vdev_idx;
879 		target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp,
880 						   RESTART_RESPONSE_BIT);
881 		vdev_timer_started[vdev_idx] = true;
882 	}
883 
884 	return last_vdev_idx;
885 }
886 
887 static void target_if_vdev_mgr_multi_vdev_restart_rel_ref(
888 				struct wlan_objmgr_pdev *pdev,
889 				struct wlan_objmgr_vdev **vdev_list,
890 				bool *vdev_timer_started,
891 				int32_t last_vdev_idx,
892 				QDF_STATUS status)
893 {
894 	struct wlan_objmgr_psoc *psoc;
895 	struct wlan_objmgr_vdev *tvdev;
896 	struct wlan_lmac_if_mlme_rx_ops *rx_ops;
897 	uint32_t vdev_idx;
898 	struct vdev_response_timer *vdev_rsp;
899 
900 	psoc = wlan_pdev_get_psoc(pdev);
901 	rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
902 	if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) {
903 		mlme_err("VDEV_%d: No Rx Ops", last_vdev_idx);
904 		return;
905 	}
906 
907 	for (vdev_idx = 0; vdev_idx <= last_vdev_idx; vdev_idx++) {
908 		tvdev = vdev_list[vdev_idx];
909 		vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc,
910 								     vdev_idx);
911 		if (!vdev_rsp) {
912 			mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer",
913 				 vdev_idx, wlan_psoc_get_id(psoc));
914 			return;
915 		}
916 
917 		if (QDF_IS_STATUS_ERROR(status)) {
918 			if (vdev_timer_started[vdev_idx]) {
919 				target_if_vdev_mgr_rsp_timer_stop(
920 							psoc, vdev_rsp,
921 							RESTART_RESPONSE_BIT);
922 				vdev_timer_started[vdev_idx] = false;
923 			}
924 		}
925 		wlan_objmgr_vdev_release_ref(tvdev,
926 					     WLAN_VDEV_TARGET_IF_ID);
927 	}
928 }
929 
930 static QDF_STATUS target_if_vdev_mgr_multiple_vdev_restart_req_cmd(
931 				struct wlan_objmgr_pdev *pdev,
932 				struct multiple_vdev_restart_params *param)
933 {
934 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
935 	struct wmi_unified *wmi_handle;
936 	struct wlan_objmgr_psoc *psoc;
937 	struct wlan_objmgr_vdev *vdev_list[WLAN_UMAC_PDEV_MAX_VDEVS] = {NULL};
938 	bool vdev_timer_started[WLAN_UMAC_PDEV_MAX_VDEVS] = {false};
939 	int32_t last_vdev_idx = -1;
940 
941 	if (!pdev || !param) {
942 		mlme_err("Invalid input");
943 		return QDF_STATUS_E_INVAL;
944 	}
945 
946 	psoc = wlan_pdev_get_psoc(pdev);
947 	if (!psoc) {
948 		mlme_err("PSOC is NULL");
949 		return QDF_STATUS_E_INVAL;
950 	}
951 
952 	wmi_handle = get_wmi_unified_hdl_from_pdev(pdev);
953 	if (!wmi_handle) {
954 		mlme_err("PDEV WMI Handle is NULL!");
955 		return QDF_STATUS_E_INVAL;
956 	}
957 
958 	last_vdev_idx = target_if_vdev_mgr_multi_vdev_restart_get_ref(
959 							pdev, param,
960 							vdev_list,
961 							vdev_timer_started);
962 	if (last_vdev_idx < 0 || (last_vdev_idx != (param->num_vdevs - 1))) {
963 		target_if_vdev_mgr_multi_vdev_restart_rel_ref(
964 						pdev, vdev_list,
965 						vdev_timer_started,
966 						last_vdev_idx,
967 						QDF_STATUS_E_FAILURE);
968 		return QDF_STATUS_E_INVAL;
969 	}
970 
971 	status = wmi_unified_send_multiple_vdev_restart_req_cmd(wmi_handle,
972 								param);
973 
974 	target_if_vdev_mgr_multi_vdev_restart_rel_ref(
975 						pdev, vdev_list,
976 						vdev_timer_started,
977 						last_vdev_idx, status);
978 
979 	return status;
980 }
981 
982 static QDF_STATUS target_if_vdev_mgr_beacon_send(
983 					struct wlan_objmgr_vdev *vdev,
984 					struct beacon_params *param)
985 {
986 	QDF_STATUS status;
987 	struct wmi_unified *wmi_handle;
988 
989 	if (!vdev || !param) {
990 		mlme_err("Invalid input");
991 		return QDF_STATUS_E_INVAL;
992 	}
993 
994 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
995 	if (!wmi_handle) {
996 		mlme_err("Failed to get WMI handle!");
997 		return QDF_STATUS_E_INVAL;
998 	}
999 
1000 	status = wmi_unified_beacon_send_cmd(wmi_handle, param);
1001 
1002 	return status;
1003 }
1004 
1005 static QDF_STATUS target_if_vdev_mgr_sta_ps_param_send(
1006 					struct wlan_objmgr_vdev *vdev,
1007 					struct sta_ps_params *param)
1008 {
1009 	QDF_STATUS status;
1010 	struct wmi_unified *wmi_handle;
1011 	int param_id;
1012 
1013 	if (!vdev || !param) {
1014 		mlme_err("Invalid input");
1015 		return QDF_STATUS_E_INVAL;
1016 	}
1017 
1018 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
1019 	if (!wmi_handle) {
1020 		mlme_err("Failed to get WMI handle!");
1021 		return QDF_STATUS_E_INVAL;
1022 	}
1023 
1024 	param_id = target_if_vdev_mlme_id_2_wmi(param->param_id);
1025 	param->param_id = param_id;
1026 
1027 	status = wmi_unified_sta_ps_cmd_send(wmi_handle, param);
1028 
1029 	return status;
1030 }
1031 
1032 static QDF_STATUS target_if_vdev_mgr_peer_delete_all_send(
1033 					struct wlan_objmgr_vdev *vdev,
1034 					struct peer_delete_all_params *param)
1035 {
1036 	QDF_STATUS status;
1037 	struct wmi_unified *wmi_handle;
1038 	struct wlan_lmac_if_mlme_rx_ops *rx_ops;
1039 	struct wlan_objmgr_psoc *psoc;
1040 	uint8_t vdev_id;
1041 	struct vdev_response_timer *vdev_rsp;
1042 
1043 	if (!vdev || !param) {
1044 		mlme_err("Invalid input");
1045 		return QDF_STATUS_E_INVAL;
1046 	}
1047 
1048 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
1049 	if (!wmi_handle) {
1050 		mlme_err("Failed to get WMI handle!");
1051 		return QDF_STATUS_E_INVAL;
1052 	}
1053 
1054 	vdev_id = wlan_vdev_get_id(vdev);
1055 	psoc = wlan_vdev_get_psoc(vdev);
1056 	rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
1057 
1058 	if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) {
1059 		mlme_err("VDEV_%d PSOC_%d No Rx Ops", vdev_id,
1060 			 wlan_psoc_get_id(psoc));
1061 		return QDF_STATUS_E_INVAL;
1062 	}
1063 
1064 	vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
1065 	if (!vdev_rsp) {
1066 		mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", vdev_id,
1067 			 wlan_psoc_get_id(psoc));
1068 		return QDF_STATUS_E_INVAL;
1069 	}
1070 
1071 	vdev_rsp->expire_time = PEER_DELETE_ALL_RESPONSE_TIMER;
1072 	target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp,
1073 					   PEER_DELETE_ALL_RESPONSE_BIT);
1074 
1075 	status = wmi_unified_peer_delete_all_send(wmi_handle, param);
1076 	if (QDF_IS_STATUS_ERROR(status)) {
1077 		vdev_rsp->expire_time = 0;
1078 		vdev_rsp->timer_status = QDF_STATUS_E_CANCELED;
1079 		target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp,
1080 						  PEER_DELETE_ALL_RESPONSE_BIT);
1081 	}
1082 	return status;
1083 }
1084 
1085 #if defined(WLAN_SUPPORT_FILS) || defined(CONFIG_BAND_6GHZ)
1086 static QDF_STATUS target_if_vdev_mgr_fils_enable_send(
1087 					struct wlan_objmgr_vdev *vdev,
1088 					struct config_fils_params *param)
1089 {
1090 	QDF_STATUS status;
1091 	struct wmi_unified *wmi_handle;
1092 
1093 	if (!vdev || !param) {
1094 		mlme_err("Invalid input");
1095 		return QDF_STATUS_E_INVAL;
1096 	}
1097 
1098 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
1099 	if (!wmi_handle) {
1100 		mlme_err("Failed to get WMI handle!");
1101 		return QDF_STATUS_E_INVAL;
1102 	}
1103 
1104 	status = wmi_unified_vdev_fils_enable_cmd_send(wmi_handle, param);
1105 
1106 	return status;
1107 }
1108 
1109 static void target_if_vdev_register_tx_fils(
1110 		struct wlan_lmac_if_mlme_tx_ops *mlme_tx_ops)
1111 {
1112 	mlme_tx_ops->vdev_fils_enable_send =
1113 		target_if_vdev_mgr_fils_enable_send;
1114 }
1115 #else
1116 static void target_if_vdev_register_tx_fils(
1117 		struct wlan_lmac_if_mlme_tx_ops *mlme_tx_ops)
1118 {
1119 }
1120 #endif
1121 
1122 QDF_STATUS
1123 target_if_vdev_mgr_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)
1124 {
1125 	struct wlan_lmac_if_mlme_tx_ops *mlme_tx_ops;
1126 
1127 	if (!tx_ops) {
1128 		mlme_err("Invalid input");
1129 		return QDF_STATUS_E_INVAL;
1130 	}
1131 
1132 	mlme_tx_ops = &tx_ops->mops;
1133 	if (!mlme_tx_ops) {
1134 		mlme_err("No Tx Ops");
1135 		return QDF_STATUS_E_FAILURE;
1136 	}
1137 
1138 	mlme_tx_ops->vdev_mlme_attach =
1139 			target_if_vdev_mgr_register_event_handler;
1140 	mlme_tx_ops->vdev_mlme_detach =
1141 			target_if_vdev_mgr_unregister_event_handler;
1142 	mlme_tx_ops->vdev_create_send = target_if_vdev_mgr_create_send;
1143 	mlme_tx_ops->vdev_start_send = target_if_vdev_mgr_start_send;
1144 	mlme_tx_ops->vdev_up_send = target_if_vdev_mgr_up_send;
1145 	mlme_tx_ops->vdev_delete_send = target_if_vdev_mgr_delete_send;
1146 	mlme_tx_ops->vdev_stop_send = target_if_vdev_mgr_stop_send;
1147 	mlme_tx_ops->vdev_down_send = target_if_vdev_mgr_down_send;
1148 	mlme_tx_ops->vdev_set_nac_rssi_send =
1149 			target_if_vdev_mgr_set_nac_rssi_send;
1150 	mlme_tx_ops->vdev_set_neighbour_rx_cmd_send =
1151 			target_if_vdev_mgr_set_neighbour_rx_cmd_send;
1152 	mlme_tx_ops->vdev_sifs_trigger_send =
1153 			target_if_vdev_mgr_sifs_trigger_send;
1154 	mlme_tx_ops->vdev_set_custom_aggr_size_cmd_send =
1155 			target_if_vdev_mgr_set_custom_aggr_size_cmd_send;
1156 	mlme_tx_ops->vdev_config_ratemask_cmd_send =
1157 			target_if_vdev_mgr_config_ratemask_cmd_send;
1158 	mlme_tx_ops->peer_flush_tids_send =
1159 			target_if_vdev_mgr_peer_flush_tids_send;
1160 	mlme_tx_ops->multiple_vdev_restart_req_cmd =
1161 			target_if_vdev_mgr_multiple_vdev_restart_req_cmd;
1162 	mlme_tx_ops->beacon_cmd_send = target_if_vdev_mgr_beacon_send;
1163 	mlme_tx_ops->beacon_tmpl_send = target_if_vdev_mgr_beacon_tmpl_send;
1164 	mlme_tx_ops->vdev_set_param_send =
1165 			target_if_vdev_mgr_set_param_send;
1166 	mlme_tx_ops->vdev_set_tx_rx_decap_type =
1167 			target_if_vdev_set_tx_rx_decap_type;
1168 	mlme_tx_ops->vdev_sta_ps_param_send =
1169 			target_if_vdev_mgr_sta_ps_param_send;
1170 	mlme_tx_ops->psoc_vdev_rsp_timer_mod =
1171 			target_if_vdev_mgr_rsp_timer_mod;
1172 	mlme_tx_ops->peer_delete_all_send =
1173 			target_if_vdev_mgr_peer_delete_all_send;
1174 	target_if_vdev_register_tx_fils(mlme_tx_ops);
1175 
1176 	mlme_tx_ops->psoc_vdev_rsp_timer_init =
1177 			target_if_psoc_vdev_rsp_timer_init;
1178 	mlme_tx_ops->psoc_vdev_rsp_timer_deinit =
1179 			target_if_psoc_vdev_rsp_timer_deinit;
1180 	mlme_tx_ops->psoc_vdev_rsp_timer_inuse =
1181 			target_if_psoc_vdev_rsp_timer_inuse;
1182 	mlme_tx_ops->psoc_wake_lock_init =
1183 			target_if_wake_lock_init;
1184 	mlme_tx_ops->psoc_wake_lock_deinit =
1185 			target_if_wake_lock_deinit;
1186 	mlme_tx_ops->vdev_mgr_rsp_timer_stop =
1187 			target_if_vdev_mgr_rsp_timer_stop;
1188 	return QDF_STATUS_SUCCESS;
1189 }
1190