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