xref: /wlan-dirver/qca-wifi-host-cmn/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_tx_ops.c (revision 2f4b444fb7e689b83a4ab0e7b3b38f0bf4def8e0)
1 /*
2  * Copyright (c) 2019-2021 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 #ifdef WLAN_FEATURE_11BE
256 	case WLAN_MLME_CFG_EHT_OPS:
257 		wmi_id = wmi_vdev_param_set_ehtop;
258 		break;
259 #endif
260 	case WLAN_MLME_CFG_RTS_THRESHOLD:
261 		wmi_id = wmi_vdev_param_rts_threshold;
262 		break;
263 	case WLAN_MLME_CFG_FRAG_THRESHOLD:
264 		wmi_id = wmi_vdev_param_fragmentation_threshold;
265 		break;
266 	case WLAN_MLME_CFG_DROP_UNENCRY:
267 		wmi_id = wmi_vdev_param_drop_unencry;
268 		break;
269 	case WLAN_MLME_CFG_TX_POWER:
270 		wmi_id = wmi_vdev_param_tx_power;
271 		break;
272 	case WLAN_MLME_CFG_AMPDU:
273 		wmi_id = wmi_vdev_param_ampdu_subframe_size_per_ac;
274 		break;
275 	case WLAN_MLME_CFG_AMSDU:
276 		wmi_id = wmi_vdev_param_amsdu_subframe_size_per_ac;
277 		break;
278 	case WLAN_MLME_CFG_MIN_IDLE_INACTIVE_TIME:
279 		wmi_id =
280 			wmi_vdev_param_ap_keepalive_min_idle_inactive_time_secs;
281 		break;
282 	case WLAN_MLME_CFG_MAX_IDLE_INACTIVE_TIME:
283 		wmi_id =
284 			wmi_vdev_param_ap_keepalive_max_idle_inactive_time_secs;
285 		break;
286 	case WLAN_MLME_CFG_MAX_UNRESPONSIVE_INACTIVE_TIME:
287 		wmi_id =
288 			wmi_vdev_param_ap_keepalive_max_unresponsive_time_secs;
289 		break;
290 	case WLAN_MLME_CFG_UAPSD:
291 		wmi_id = WMI_HOST_STA_PS_PARAM_UAPSD;
292 		break;
293 	case WLAN_MLME_CFG_BCN_TX_RATE_CODE:
294 		wmi_id = wmi_vdev_param_beacon_rate;
295 		break;
296 	case WLAN_MLME_CFG_TX_MGMT_RATE_CODE:
297 		wmi_id = wmi_vdev_param_mgmt_rate;
298 		break;
299 	case WLAN_MLME_CFG_LISTEN_INTERVAL:
300 		wmi_id = wmi_vdev_param_listen_interval;
301 		break;
302 	case WLAN_MLME_CFG_ENABLE_MULTI_GROUP_KEY:
303 		wmi_id = wmi_vdev_param_enable_multi_group_key;
304 		break;
305 	case WLAN_MLME_CFG_MAX_GROUP_KEYS:
306 		wmi_id = wmi_vdev_param_max_group_keys;
307 		break;
308 	case WLAN_MLME_CFG_TX_ENCAP_TYPE:
309 		wmi_id = wmi_vdev_param_tx_encap_type;
310 		break;
311 	case WLAN_MLME_CFG_RX_DECAP_TYPE:
312 		wmi_id = wmi_vdev_param_rx_decap_type;
313 		break;
314 	case WLAN_MLME_CFG_ENABLE_DISABLE_RTT_RESPONDER_ROLE:
315 		wmi_id = wmi_vdev_param_enable_disable_rtt_responder_role;
316 		break;
317 	case WLAN_MLME_CFG_ENABLE_DISABLE_RTT_INITIATOR_ROLE:
318 		wmi_id = wmi_vdev_param_enable_disable_rtt_initiator_role;
319 		break;
320 	default:
321 		wmi_id = cfg_id;
322 		break;
323 	}
324 
325 	return wmi_id;
326 }
327 
328 static
329 QDF_STATUS target_if_vdev_set_tx_rx_decap_type(struct wlan_objmgr_vdev *vdev,
330 					       enum wlan_mlme_cfg_id param_id,
331 					       uint32_t value)
332 {
333 	ol_txrx_soc_handle soc_txrx_handle;
334 	struct wlan_objmgr_psoc *psoc;
335 	uint8_t vdev_id = wlan_vdev_get_id(vdev);
336 	cdp_config_param_type val = {0};
337 
338 	psoc = wlan_vdev_get_psoc(vdev);
339 	soc_txrx_handle = wlan_psoc_get_dp_handle(psoc);
340 
341 	if (!soc_txrx_handle)
342 		return QDF_STATUS_E_INVAL;
343 
344 	if (param_id ==  WLAN_MLME_CFG_TX_ENCAP_TYPE) {
345 		val.cdp_vdev_param_tx_encap = value;
346 		return cdp_txrx_set_vdev_param(soc_txrx_handle,
347 					       vdev_id, CDP_TX_ENCAP_TYPE,
348 					       val);
349 	} else if (param_id == WLAN_MLME_CFG_RX_DECAP_TYPE) {
350 		val.cdp_vdev_param_rx_decap = value;
351 		return cdp_txrx_set_vdev_param(soc_txrx_handle,
352 					       vdev_id, CDP_RX_DECAP_TYPE,
353 					       val);
354 	}
355 
356 	return QDF_STATUS_SUCCESS;
357 }
358 
359 static QDF_STATUS target_if_vdev_mgr_set_param_send(
360 					struct wlan_objmgr_vdev *vdev,
361 					struct vdev_set_params *param)
362 {
363 	QDF_STATUS status;
364 	struct wmi_unified *wmi_handle;
365 	int param_id;
366 
367 	if (!vdev || !param) {
368 		mlme_err("Invalid input");
369 		return QDF_STATUS_E_INVAL;
370 	}
371 
372 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
373 	if (!wmi_handle) {
374 		mlme_err("Failed to get WMI handle!");
375 		return QDF_STATUS_E_INVAL;
376 	}
377 	param_id = target_if_vdev_mlme_id_2_wmi(param->param_id);
378 	param->param_id = param_id;
379 	if (param->param_id == wmi_vdev_param_txbf)
380 		param->param_value = target_if_vdev_mlme_build_txbf_caps(vdev);
381 
382 	status = wmi_unified_vdev_set_param_send(wmi_handle, param);
383 
384 	return status;
385 }
386 
387 static QDF_STATUS target_if_vdev_mgr_create_send(
388 					struct wlan_objmgr_vdev *vdev,
389 					struct vdev_create_params *param)
390 {
391 	QDF_STATUS status;
392 	struct wmi_unified *wmi_handle;
393 	uint8_t vap_addr[QDF_MAC_ADDR_SIZE] = {0};
394 	struct wlan_lmac_if_mlme_tx_ops *txops;
395 	struct wlan_objmgr_psoc *psoc;
396 	uint8_t vdev_id;
397 
398 	if (!vdev || !param) {
399 		mlme_err("Invalid input");
400 		return QDF_STATUS_E_INVAL;
401 	}
402 
403 	psoc = wlan_vdev_get_psoc(vdev);
404 	if (!psoc) {
405 		mlme_err("Failed to get psoc for VDEV_%d",
406 			 wlan_vdev_get_id(vdev));
407 		return QDF_STATUS_E_INVAL;
408 	}
409 
410 	txops = wlan_mlme_get_lmac_tx_ops(psoc);
411 	if (!txops || !txops->psoc_vdev_rsp_timer_init) {
412 		mlme_err("Failed to get mlme txrx_ops for VDEV_%d PSOC_%d",
413 			 wlan_vdev_get_id(vdev), wlan_psoc_get_id(psoc));
414 		return QDF_STATUS_E_INVAL;
415 	}
416 
417 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
418 	if (!wmi_handle) {
419 		mlme_err("Failed to get WMI handle!");
420 		return QDF_STATUS_E_INVAL;
421 	}
422 
423 	WLAN_ADDR_COPY(vap_addr, wlan_vdev_mlme_get_macaddr(vdev));
424 	status = wmi_unified_vdev_create_send(wmi_handle, vap_addr,
425 					      param);
426 
427 	vdev_id = wlan_vdev_get_id(vdev);
428 	if (QDF_IS_STATUS_SUCCESS(status))
429 		status = txops->psoc_vdev_rsp_timer_init(psoc, vdev_id);
430 
431 	return status;
432 }
433 
434 static QDF_STATUS target_if_vdev_mgr_start_send(
435 					struct wlan_objmgr_vdev *vdev,
436 					struct vdev_start_params *param)
437 {
438 	QDF_STATUS status;
439 	struct wmi_unified *wmi_handle;
440 	struct wlan_objmgr_psoc *psoc;
441 	struct wlan_lmac_if_mlme_rx_ops *rx_ops;
442 	uint8_t vdev_id;
443 	struct vdev_response_timer *vdev_rsp;
444 
445 	if (!vdev || !param) {
446 		mlme_err("Invalid input");
447 		return QDF_STATUS_E_INVAL;
448 	}
449 
450 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
451 	if (!wmi_handle) {
452 		mlme_err("Failed to get WMI handle!");
453 		return QDF_STATUS_E_INVAL;
454 	}
455 
456 	vdev_id = wlan_vdev_get_id(vdev);
457 	psoc = wlan_vdev_get_psoc(vdev);
458 	rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
459 	if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) {
460 		mlme_err("VEV_%d: PSOC_%d No Rx Ops", vdev_id,
461 			 wlan_psoc_get_id(psoc));
462 		return QDF_STATUS_E_INVAL;
463 	}
464 
465 	vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
466 	if (!vdev_rsp) {
467 		mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", vdev_id,
468 			 wlan_psoc_get_id(psoc));
469 		return QDF_STATUS_E_INVAL;
470 	}
471 
472 	vdev_rsp->expire_time = START_RESPONSE_TIMER;
473 	target_if_wake_lock_timeout_acquire(psoc, START_WAKELOCK);
474 
475 	if (param->is_restart)
476 		target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp,
477 						   RESTART_RESPONSE_BIT);
478 	else
479 		target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp,
480 						   START_RESPONSE_BIT);
481 
482 	status = wmi_unified_vdev_start_send(wmi_handle, param);
483 	if (QDF_IS_STATUS_ERROR(status)) {
484 		vdev_rsp->timer_status = QDF_STATUS_E_CANCELED;
485 		vdev_rsp->expire_time = 0;
486 		target_if_wake_lock_timeout_release(psoc, START_WAKELOCK);
487 		if (param->is_restart)
488 			target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp,
489 							  RESTART_RESPONSE_BIT);
490 		else
491 			target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp,
492 							  START_RESPONSE_BIT);
493 	} else {
494 		target_if_vdev_start_link_handler(vdev,
495 						  param->is_restart);
496 	}
497 	return status;
498 }
499 
500 static QDF_STATUS target_if_vdev_mgr_delete_response_send(
501 				struct wlan_objmgr_vdev *vdev,
502 				struct wlan_lmac_if_mlme_rx_ops *rx_ops)
503 {
504 	QDF_STATUS status = QDF_STATUS_SUCCESS;
505 	struct wlan_objmgr_psoc *psoc = wlan_vdev_get_psoc(vdev);
506 	struct vdev_delete_response rsp = {0};
507 
508 	rsp.vdev_id = wlan_vdev_get_id(vdev);
509 	status = rx_ops->vdev_mgr_delete_response(psoc, &rsp);
510 	target_if_wake_lock_timeout_release(psoc, DELETE_WAKELOCK);
511 
512 	return status;
513 }
514 
515 static QDF_STATUS target_if_vdev_mgr_delete_send(
516 					struct wlan_objmgr_vdev *vdev,
517 					struct vdev_delete_params *param)
518 {
519 	QDF_STATUS status;
520 	struct wlan_objmgr_psoc *psoc;
521 	struct wmi_unified *wmi_handle;
522 	struct wlan_lmac_if_mlme_rx_ops *rx_ops;
523 	uint8_t vdev_id;
524 	struct vdev_response_timer *vdev_rsp;
525 
526 	if (!vdev || !param) {
527 		mlme_err("Invalid input");
528 		return QDF_STATUS_E_INVAL;
529 	}
530 
531 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
532 	if (!wmi_handle) {
533 		mlme_err("Failed to get WMI handle!");
534 		return QDF_STATUS_E_INVAL;
535 	}
536 
537 	vdev_id = wlan_vdev_get_id(vdev);
538 	psoc = wlan_vdev_get_psoc(vdev);
539 	rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
540 	if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) {
541 		mlme_err("VDEV_%d PSOC_%d No Rx Ops", vdev_id,
542 			 wlan_psoc_get_id(psoc));
543 		return QDF_STATUS_E_INVAL;
544 	}
545 
546 	vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
547 	if (!vdev_rsp) {
548 		mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", vdev_id,
549 			 wlan_psoc_get_id(psoc));
550 		return QDF_STATUS_E_INVAL;
551 	}
552 
553 	vdev_rsp->expire_time = DELETE_RESPONSE_TIMER;
554 	target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp,
555 					   DELETE_RESPONSE_BIT);
556 	target_if_wake_lock_timeout_acquire(psoc, DELETE_WAKELOCK);
557 
558 	status = wmi_unified_vdev_delete_send(wmi_handle, param->vdev_id);
559 	if (QDF_IS_STATUS_SUCCESS(status)) {
560 		/*
561 		 * Simulate delete response if target doesn't support
562 		 */
563 		if (!wmi_service_enabled(wmi_handle,
564 					 wmi_service_sync_delete_cmds) ||
565 		    wlan_psoc_nif_feat_cap_get(psoc,
566 					       WLAN_SOC_F_TESTMODE_ENABLE)) {
567 			target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp,
568 							  DELETE_RESPONSE_BIT);
569 			target_if_vdev_mgr_delete_response_send(vdev, rx_ops);
570 		}
571 	} else {
572 		vdev_rsp->expire_time = 0;
573 		vdev_rsp->timer_status = QDF_STATUS_E_CANCELED;
574 		target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp,
575 						  DELETE_RESPONSE_BIT);
576 		target_if_wake_lock_timeout_release(psoc, DELETE_WAKELOCK);
577 	}
578 	return status;
579 }
580 
581 static QDF_STATUS target_if_vdev_mgr_stop_send(
582 					struct wlan_objmgr_vdev *vdev,
583 					struct vdev_stop_params *param)
584 {
585 	QDF_STATUS status;
586 	struct wmi_unified *wmi_handle;
587 	struct wlan_lmac_if_mlme_rx_ops *rx_ops;
588 	struct wlan_objmgr_psoc *psoc;
589 	uint8_t vdev_id;
590 	struct vdev_response_timer *vdev_rsp;
591 
592 
593 	if (!vdev || !param) {
594 		mlme_err("Invalid input");
595 		return QDF_STATUS_E_INVAL;
596 	}
597 
598 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
599 	if (!wmi_handle) {
600 		mlme_err("Failed to get WMI handle!");
601 		return QDF_STATUS_E_INVAL;
602 	}
603 
604 	vdev_id = wlan_vdev_get_id(vdev);
605 	psoc = wlan_vdev_get_psoc(vdev);
606 	rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
607 	if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) {
608 		mlme_err("VDEV_%d PSOC_%d No Rx Ops", vdev_id,
609 			 wlan_psoc_get_id(psoc));
610 		return QDF_STATUS_E_INVAL;
611 	}
612 
613 	vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
614 	if (!vdev_rsp) {
615 		mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", vdev_id,
616 			 wlan_psoc_get_id(psoc));
617 		return QDF_STATUS_E_INVAL;
618 	}
619 
620 	vdev_rsp->expire_time = STOP_RESPONSE_TIMER;
621 	target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp, STOP_RESPONSE_BIT);
622 	/*
623 	 * START wakelock is acquired before sending the start command and
624 	 * released after sending up command to fw. This is to prevent the
625 	 * system to go into suspend state during the connection.
626 	 * In auth/assoc failure scenario UP command is not sent
627 	 * so release the START wakelock here.
628 	 */
629 	target_if_wake_lock_timeout_release(psoc, START_WAKELOCK);
630 	target_if_wake_lock_timeout_acquire(psoc, STOP_WAKELOCK);
631 
632 	status = wmi_unified_vdev_stop_send(wmi_handle, param->vdev_id);
633 	if (QDF_IS_STATUS_ERROR(status)) {
634 		vdev_rsp->expire_time = 0;
635 		vdev_rsp->timer_status = QDF_STATUS_E_CANCELED;
636 		target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp,
637 						  STOP_RESPONSE_BIT);
638 		target_if_wake_lock_timeout_release(psoc, STOP_WAKELOCK);
639 	} else {
640 		target_if_vdev_stop_link_handler(vdev);
641 	}
642 	return status;
643 }
644 
645 static QDF_STATUS target_if_vdev_mgr_down_send(
646 					struct wlan_objmgr_vdev *vdev,
647 					struct vdev_down_params *param)
648 {
649 	QDF_STATUS status;
650 	struct wmi_unified *wmi_handle;
651 	struct wlan_objmgr_psoc *psoc;
652 
653 	if (!vdev || !param) {
654 		mlme_err("Invalid input");
655 		return QDF_STATUS_E_INVAL;
656 	}
657 
658 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
659 	if (!wmi_handle) {
660 		mlme_err("Failed to get WMI handle!");
661 		return QDF_STATUS_E_INVAL;
662 	}
663 
664 	psoc = wlan_vdev_get_psoc(vdev);
665 	if (!psoc) {
666 		mlme_err("Failed to get PSOC Object");
667 		return QDF_STATUS_E_INVAL;
668 	}
669 
670 	status = wmi_unified_vdev_down_send(wmi_handle, param->vdev_id);
671 	target_if_wake_lock_timeout_release(psoc, STOP_WAKELOCK);
672 
673 	return status;
674 }
675 
676 static QDF_STATUS target_if_vdev_mgr_up_send(
677 					struct wlan_objmgr_vdev *vdev,
678 					struct vdev_up_params *param)
679 {
680 	QDF_STATUS status;
681 	struct wmi_unified *wmi_handle;
682 	uint8_t bssid[QDF_MAC_ADDR_SIZE];
683 	struct wlan_objmgr_psoc *psoc;
684 
685 	if (!vdev || !param) {
686 		mlme_err("Invalid input");
687 		return QDF_STATUS_E_INVAL;
688 	}
689 
690 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
691 	if (!wmi_handle) {
692 		mlme_err("Failed to get WMI handle!");
693 		return QDF_STATUS_E_INVAL;
694 	}
695 
696 	psoc = wlan_vdev_get_psoc(vdev);
697 	if (!psoc) {
698 		mlme_err("Failed to get PSOC Object");
699 		return QDF_STATUS_E_INVAL;
700 	}
701 	ucfg_wlan_vdev_mgr_get_param_bssid(vdev, bssid);
702 
703 	status = wmi_unified_vdev_up_send(wmi_handle, bssid, param);
704 	target_if_wake_lock_timeout_release(psoc, START_WAKELOCK);
705 
706 	return status;
707 }
708 
709 static QDF_STATUS target_if_vdev_mgr_beacon_tmpl_send(
710 					struct wlan_objmgr_vdev *vdev,
711 					struct beacon_tmpl_params *param)
712 {
713 	QDF_STATUS status;
714 	struct wmi_unified *wmi_handle;
715 
716 	if (!vdev || !param) {
717 		mlme_err("Invalid input");
718 		return QDF_STATUS_E_INVAL;
719 	}
720 
721 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
722 	if (!wmi_handle) {
723 		mlme_err("Failed to get WMI handle!");
724 		return QDF_STATUS_E_INVAL;
725 	}
726 
727 	status = wmi_unified_beacon_tmpl_send_cmd(wmi_handle, param);
728 	return status;
729 }
730 
731 static QDF_STATUS target_if_vdev_mgr_set_nac_rssi_send(
732 				struct wlan_objmgr_vdev *vdev,
733 				struct vdev_scan_nac_rssi_params *param)
734 {
735 	QDF_STATUS status;
736 	struct wmi_unified *wmi_handle;
737 
738 	if (!vdev || !param) {
739 		mlme_err("Invalid input");
740 		return QDF_STATUS_E_INVAL;
741 	}
742 
743 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
744 	if (!wmi_handle) {
745 		mlme_err("Failed to get WMI handle!");
746 		return QDF_STATUS_E_INVAL;
747 	}
748 
749 	status = wmi_unified_vdev_set_nac_rssi_send(wmi_handle, param);
750 
751 	return status;
752 }
753 
754 static QDF_STATUS target_if_vdev_mgr_set_neighbour_rx_cmd_send(
755 					struct wlan_objmgr_vdev *vdev,
756 					struct set_neighbour_rx_params *param,
757 					uint8_t *mac)
758 {
759 	QDF_STATUS status;
760 	struct wmi_unified *wmi_handle;
761 
762 	if (!vdev || !param) {
763 		mlme_err("Invalid input");
764 		return QDF_STATUS_E_INVAL;
765 	}
766 
767 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
768 	if (!wmi_handle) {
769 		mlme_err("Failed to get WMI handle!");
770 		return QDF_STATUS_E_INVAL;
771 	}
772 
773 	status = wmi_unified_vdev_set_neighbour_rx_cmd_send(wmi_handle,
774 							    mac, param);
775 
776 	return status;
777 }
778 
779 static QDF_STATUS target_if_vdev_mgr_sifs_trigger_send(
780 					struct wlan_objmgr_vdev *vdev,
781 					struct sifs_trigger_param *param)
782 {
783 	QDF_STATUS status;
784 	struct wmi_unified *wmi_handle;
785 
786 	if (!vdev || !param) {
787 		mlme_err("Invalid input");
788 		return QDF_STATUS_E_INVAL;
789 	}
790 
791 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
792 	if (!wmi_handle) {
793 		mlme_err("Failed to get WMI handle!");
794 		return QDF_STATUS_E_INVAL;
795 	}
796 
797 	status = wmi_unified_sifs_trigger_send(wmi_handle, param);
798 
799 	return status;
800 }
801 
802 static QDF_STATUS target_if_vdev_mgr_set_custom_aggr_size_cmd_send(
803 				struct wlan_objmgr_vdev *vdev,
804 				struct set_custom_aggr_size_params *param)
805 {
806 	QDF_STATUS status;
807 	struct wmi_unified *wmi_handle;
808 
809 	if (!vdev || !param) {
810 		mlme_err("Invalid input");
811 		return QDF_STATUS_E_INVAL;
812 	}
813 
814 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
815 	if (!wmi_handle) {
816 		mlme_err("Failed to get WMI handle!");
817 		return QDF_STATUS_E_INVAL;
818 	}
819 
820 	status = wmi_unified_vdev_set_custom_aggr_size_cmd_send(wmi_handle,
821 								param);
822 
823 	return status;
824 }
825 
826 static QDF_STATUS target_if_vdev_mgr_config_ratemask_cmd_send(
827 					struct wlan_objmgr_vdev *vdev,
828 					struct config_ratemask_params *param)
829 {
830 	QDF_STATUS status;
831 	struct wmi_unified *wmi_handle;
832 
833 	if (!vdev || !param) {
834 		mlme_err("Invalid input");
835 		return QDF_STATUS_E_INVAL;
836 	}
837 
838 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
839 	if (!wmi_handle) {
840 		mlme_err("Failed to get WMI handle!");
841 		return QDF_STATUS_E_INVAL;
842 	}
843 
844 	status = wmi_unified_vdev_config_ratemask_cmd_send(wmi_handle,
845 							   param);
846 	return status;
847 }
848 
849 static QDF_STATUS target_if_vdev_mgr_peer_flush_tids_send(
850 					struct wlan_objmgr_vdev *vdev,
851 					struct peer_flush_params *param)
852 {
853 	QDF_STATUS status;
854 	struct wmi_unified *wmi_handle;
855 
856 	if (!vdev || !param) {
857 		mlme_err("Invalid input");
858 		return QDF_STATUS_E_INVAL;
859 	}
860 
861 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
862 	if (!wmi_handle) {
863 		mlme_err("Failed to get WMI handle!");
864 		return QDF_STATUS_E_INVAL;
865 	}
866 
867 	status = wmi_unified_peer_flush_tids_send(wmi_handle, param->peer_mac,
868 						  param);
869 
870 	return status;
871 }
872 
873 static int32_t target_if_vdev_mgr_multi_vdev_restart_get_ref(
874 			struct wlan_objmgr_pdev *pdev,
875 			struct multiple_vdev_restart_params *param,
876 			struct wlan_objmgr_vdev **vdev_list,
877 			bool *vdev_timer_started)
878 {
879 	struct wlan_objmgr_psoc *psoc;
880 	struct wlan_objmgr_vdev *tvdev;
881 	struct wlan_lmac_if_mlme_rx_ops *rx_ops;
882 	int32_t vdev_idx = -1;
883 	int32_t last_vdev_idx = -1;
884 	struct vdev_response_timer *vdev_rsp;
885 
886 	psoc = wlan_pdev_get_psoc(pdev);
887 	rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
888 
889 	if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) {
890 		mlme_err("VDEV_%d: No Rx Ops", vdev_idx);
891 		return last_vdev_idx;
892 	}
893 
894 	for (vdev_idx = 0; vdev_idx < param->num_vdevs ; vdev_idx++) {
895 		vdev_list[vdev_idx] = wlan_objmgr_get_vdev_by_id_from_pdev(
896 						pdev,
897 						param->vdev_ids[vdev_idx],
898 						WLAN_VDEV_TARGET_IF_ID);
899 		tvdev = vdev_list[vdev_idx];
900 		if (!tvdev) {
901 			mlme_err("VDEV_%d is NULL", vdev_idx);
902 			return last_vdev_idx;
903 		}
904 
905 		vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(
906 						psoc,
907 						wlan_vdev_get_id(tvdev));
908 		if (!vdev_rsp) {
909 			wlan_objmgr_vdev_release_ref(tvdev,
910 						     WLAN_VDEV_TARGET_IF_ID);
911 			vdev_list[vdev_idx] = NULL;
912 			mlme_err("VDEV_%d PSOC_%d No vdev rsp timer",
913 				 vdev_idx, wlan_psoc_get_id(psoc));
914 			return last_vdev_idx;
915 		}
916 
917 		last_vdev_idx = vdev_idx;
918 		target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp,
919 						   RESTART_RESPONSE_BIT);
920 		vdev_timer_started[vdev_idx] = true;
921 	}
922 
923 	return last_vdev_idx;
924 }
925 
926 static void target_if_vdev_mgr_multi_vdev_restart_rel_ref(
927 				struct wlan_objmgr_pdev *pdev,
928 				struct wlan_objmgr_vdev **vdev_list,
929 				bool *vdev_timer_started,
930 				int32_t last_vdev_idx,
931 				QDF_STATUS status)
932 {
933 	struct wlan_objmgr_psoc *psoc;
934 	struct wlan_objmgr_vdev *tvdev;
935 	struct wlan_lmac_if_mlme_rx_ops *rx_ops;
936 	int32_t vdev_idx;
937 	struct vdev_response_timer *vdev_rsp;
938 
939 	psoc = wlan_pdev_get_psoc(pdev);
940 	rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
941 	if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) {
942 		mlme_err("VDEV_%d: No Rx Ops", last_vdev_idx);
943 		return;
944 	}
945 
946 	for (vdev_idx = 0; vdev_idx <= last_vdev_idx; vdev_idx++) {
947 		tvdev = vdev_list[vdev_idx];
948 		vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc,
949 								     vdev_idx);
950 		if (!vdev_rsp) {
951 			mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer",
952 				 vdev_idx, wlan_psoc_get_id(psoc));
953 			return;
954 		}
955 
956 		if (QDF_IS_STATUS_ERROR(status)) {
957 			if (vdev_timer_started[vdev_idx]) {
958 				target_if_vdev_mgr_rsp_timer_stop(
959 							psoc, vdev_rsp,
960 							RESTART_RESPONSE_BIT);
961 				vdev_timer_started[vdev_idx] = false;
962 			}
963 		}
964 		wlan_objmgr_vdev_release_ref(tvdev,
965 					     WLAN_VDEV_TARGET_IF_ID);
966 	}
967 }
968 
969 static QDF_STATUS target_if_vdev_mgr_multiple_vdev_restart_req_cmd(
970 				struct wlan_objmgr_pdev *pdev,
971 				struct multiple_vdev_restart_params *param)
972 {
973 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
974 	struct wmi_unified *wmi_handle;
975 	struct wlan_objmgr_psoc *psoc;
976 	struct wlan_objmgr_vdev *vdev_list[WLAN_UMAC_PDEV_MAX_VDEVS] = {NULL};
977 	bool vdev_timer_started[WLAN_UMAC_PDEV_MAX_VDEVS] = {false};
978 	int32_t last_vdev_idx = -1;
979 
980 	if (!pdev || !param) {
981 		mlme_err("Invalid input");
982 		return QDF_STATUS_E_INVAL;
983 	}
984 
985 	psoc = wlan_pdev_get_psoc(pdev);
986 	if (!psoc) {
987 		mlme_err("PSOC is NULL");
988 		return QDF_STATUS_E_INVAL;
989 	}
990 
991 	wmi_handle = get_wmi_unified_hdl_from_pdev(pdev);
992 	if (!wmi_handle) {
993 		mlme_err("PDEV WMI Handle is NULL!");
994 		return QDF_STATUS_E_INVAL;
995 	}
996 
997 	if (param->num_vdevs > WLAN_UMAC_PDEV_MAX_VDEVS) {
998 		mlme_err("param->num_vdevs: %u exceed the limit",
999 			 param->num_vdevs);
1000 		return QDF_STATUS_E_INVAL;
1001 	}
1002 
1003 	last_vdev_idx = target_if_vdev_mgr_multi_vdev_restart_get_ref(
1004 							pdev, param,
1005 							vdev_list,
1006 							vdev_timer_started);
1007 	if (last_vdev_idx < 0 || (last_vdev_idx != (param->num_vdevs - 1))) {
1008 		target_if_vdev_mgr_multi_vdev_restart_rel_ref(
1009 						pdev, vdev_list,
1010 						vdev_timer_started,
1011 						last_vdev_idx,
1012 						QDF_STATUS_E_FAILURE);
1013 		return QDF_STATUS_E_INVAL;
1014 	}
1015 
1016 	status = wmi_unified_send_multiple_vdev_restart_req_cmd(wmi_handle,
1017 								param);
1018 
1019 	target_if_vdev_mgr_multi_vdev_restart_rel_ref(
1020 						pdev, vdev_list,
1021 						vdev_timer_started,
1022 						last_vdev_idx, status);
1023 
1024 	return status;
1025 }
1026 
1027 static QDF_STATUS target_if_vdev_mgr_multiple_vdev_set_param_cmd(
1028 				struct wlan_objmgr_pdev *pdev,
1029 				struct multiple_vdev_set_param *param)
1030 {
1031 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
1032 	struct wmi_unified *wmi_handle;
1033 	struct wlan_objmgr_psoc *psoc;
1034 	int param_id;
1035 
1036 	if (!pdev || !param) {
1037 		mlme_err("Invalid input");
1038 		return QDF_STATUS_E_INVAL;
1039 	}
1040 
1041 	psoc = wlan_pdev_get_psoc(pdev);
1042 	if (!psoc) {
1043 		mlme_err("PSOC is NULL");
1044 		return QDF_STATUS_E_INVAL;
1045 	}
1046 
1047 	wmi_handle = get_wmi_unified_hdl_from_pdev(pdev);
1048 	if (!wmi_handle) {
1049 		mlme_err("PDEV WMI Handle is NULL!");
1050 		return QDF_STATUS_E_INVAL;
1051 	}
1052 
1053 	if (param->num_vdevs > WLAN_UMAC_PDEV_MAX_VDEVS) {
1054 		mlme_err("param->num_vdevs: %u exceed the limit",
1055 			 param->num_vdevs);
1056 		return QDF_STATUS_E_INVAL;
1057 	}
1058 
1059 	param_id = target_if_vdev_mlme_id_2_wmi(param->param_id);
1060 	param->param_id = param_id;
1061 
1062 	status = wmi_unified_send_multiple_vdev_set_param_cmd(wmi_handle,
1063 							      param);
1064 
1065 	return status;
1066 }
1067 
1068 static QDF_STATUS target_if_vdev_mgr_beacon_send(
1069 					struct wlan_objmgr_vdev *vdev,
1070 					struct beacon_params *param)
1071 {
1072 	QDF_STATUS status;
1073 	struct wmi_unified *wmi_handle;
1074 
1075 	if (!vdev || !param) {
1076 		mlme_err("Invalid input");
1077 		return QDF_STATUS_E_INVAL;
1078 	}
1079 
1080 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
1081 	if (!wmi_handle) {
1082 		mlme_err("Failed to get WMI handle!");
1083 		return QDF_STATUS_E_INVAL;
1084 	}
1085 
1086 	status = wmi_unified_beacon_send_cmd(wmi_handle, param);
1087 
1088 	return status;
1089 }
1090 
1091 static QDF_STATUS target_if_vdev_mgr_sta_ps_param_send(
1092 					struct wlan_objmgr_vdev *vdev,
1093 					struct sta_ps_params *param)
1094 {
1095 	QDF_STATUS status;
1096 	struct wmi_unified *wmi_handle;
1097 	int param_id;
1098 
1099 	if (!vdev || !param) {
1100 		mlme_err("Invalid input");
1101 		return QDF_STATUS_E_INVAL;
1102 	}
1103 
1104 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
1105 	if (!wmi_handle) {
1106 		mlme_err("Failed to get WMI handle!");
1107 		return QDF_STATUS_E_INVAL;
1108 	}
1109 
1110 	param_id = target_if_vdev_mlme_id_2_wmi(param->param_id);
1111 	param->param_id = param_id;
1112 
1113 	status = wmi_unified_sta_ps_cmd_send(wmi_handle, param);
1114 
1115 	return status;
1116 }
1117 
1118 static QDF_STATUS target_if_vdev_mgr_peer_delete_all_send(
1119 					struct wlan_objmgr_vdev *vdev,
1120 					struct peer_delete_all_params *param)
1121 {
1122 	QDF_STATUS status;
1123 	struct wmi_unified *wmi_handle;
1124 	struct wlan_lmac_if_mlme_rx_ops *rx_ops;
1125 	struct wlan_objmgr_psoc *psoc;
1126 	uint8_t vdev_id;
1127 	struct vdev_response_timer *vdev_rsp;
1128 
1129 	if (!vdev || !param) {
1130 		mlme_err("Invalid input");
1131 		return QDF_STATUS_E_INVAL;
1132 	}
1133 
1134 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
1135 	if (!wmi_handle) {
1136 		mlme_err("Failed to get WMI handle!");
1137 		return QDF_STATUS_E_INVAL;
1138 	}
1139 
1140 	vdev_id = wlan_vdev_get_id(vdev);
1141 	psoc = wlan_vdev_get_psoc(vdev);
1142 	rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
1143 
1144 	if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) {
1145 		mlme_err("VDEV_%d PSOC_%d No Rx Ops", vdev_id,
1146 			 wlan_psoc_get_id(psoc));
1147 		return QDF_STATUS_E_INVAL;
1148 	}
1149 
1150 	vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
1151 	if (!vdev_rsp) {
1152 		mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", vdev_id,
1153 			 wlan_psoc_get_id(psoc));
1154 		return QDF_STATUS_E_INVAL;
1155 	}
1156 
1157 	vdev_rsp->expire_time = PEER_DELETE_ALL_RESPONSE_TIMER;
1158 	target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp,
1159 					   PEER_DELETE_ALL_RESPONSE_BIT);
1160 
1161 	status = wmi_unified_peer_delete_all_send(wmi_handle, param);
1162 	if (QDF_IS_STATUS_ERROR(status)) {
1163 		vdev_rsp->expire_time = 0;
1164 		vdev_rsp->timer_status = QDF_STATUS_E_CANCELED;
1165 		target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp,
1166 						  PEER_DELETE_ALL_RESPONSE_BIT);
1167 	}
1168 	return status;
1169 }
1170 
1171 #if defined(WLAN_SUPPORT_FILS) || defined(CONFIG_BAND_6GHZ)
1172 static QDF_STATUS target_if_vdev_mgr_fils_enable_send(
1173 					struct wlan_objmgr_vdev *vdev,
1174 					struct config_fils_params *param)
1175 {
1176 	QDF_STATUS status;
1177 	struct wmi_unified *wmi_handle;
1178 
1179 	if (!vdev || !param) {
1180 		mlme_err("Invalid input");
1181 		return QDF_STATUS_E_INVAL;
1182 	}
1183 
1184 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
1185 	if (!wmi_handle) {
1186 		mlme_err("Failed to get WMI handle!");
1187 		return QDF_STATUS_E_INVAL;
1188 	}
1189 
1190 	status = wmi_unified_vdev_fils_enable_cmd_send(wmi_handle, param);
1191 
1192 	return status;
1193 }
1194 
1195 static void target_if_vdev_register_tx_fils(
1196 		struct wlan_lmac_if_mlme_tx_ops *mlme_tx_ops)
1197 {
1198 	mlme_tx_ops->vdev_fils_enable_send =
1199 		target_if_vdev_mgr_fils_enable_send;
1200 }
1201 #else
1202 static void target_if_vdev_register_tx_fils(
1203 		struct wlan_lmac_if_mlme_tx_ops *mlme_tx_ops)
1204 {
1205 }
1206 #endif
1207 
1208 QDF_STATUS
1209 target_if_vdev_mgr_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)
1210 {
1211 	struct wlan_lmac_if_mlme_tx_ops *mlme_tx_ops;
1212 
1213 	if (!tx_ops) {
1214 		mlme_err("Invalid input");
1215 		return QDF_STATUS_E_INVAL;
1216 	}
1217 
1218 	mlme_tx_ops = &tx_ops->mops;
1219 	if (!mlme_tx_ops) {
1220 		mlme_err("No Tx Ops");
1221 		return QDF_STATUS_E_FAILURE;
1222 	}
1223 
1224 	mlme_tx_ops->vdev_mlme_attach =
1225 			target_if_vdev_mgr_register_event_handler;
1226 	mlme_tx_ops->vdev_mlme_detach =
1227 			target_if_vdev_mgr_unregister_event_handler;
1228 	mlme_tx_ops->vdev_create_send = target_if_vdev_mgr_create_send;
1229 	mlme_tx_ops->vdev_start_send = target_if_vdev_mgr_start_send;
1230 	mlme_tx_ops->vdev_up_send = target_if_vdev_mgr_up_send;
1231 	mlme_tx_ops->vdev_delete_send = target_if_vdev_mgr_delete_send;
1232 	mlme_tx_ops->vdev_stop_send = target_if_vdev_mgr_stop_send;
1233 	mlme_tx_ops->vdev_down_send = target_if_vdev_mgr_down_send;
1234 	mlme_tx_ops->vdev_set_nac_rssi_send =
1235 			target_if_vdev_mgr_set_nac_rssi_send;
1236 	mlme_tx_ops->vdev_set_neighbour_rx_cmd_send =
1237 			target_if_vdev_mgr_set_neighbour_rx_cmd_send;
1238 	mlme_tx_ops->vdev_sifs_trigger_send =
1239 			target_if_vdev_mgr_sifs_trigger_send;
1240 	mlme_tx_ops->vdev_set_custom_aggr_size_cmd_send =
1241 			target_if_vdev_mgr_set_custom_aggr_size_cmd_send;
1242 	mlme_tx_ops->vdev_config_ratemask_cmd_send =
1243 			target_if_vdev_mgr_config_ratemask_cmd_send;
1244 	mlme_tx_ops->peer_flush_tids_send =
1245 			target_if_vdev_mgr_peer_flush_tids_send;
1246 	mlme_tx_ops->multiple_vdev_restart_req_cmd =
1247 			target_if_vdev_mgr_multiple_vdev_restart_req_cmd;
1248 	mlme_tx_ops->multiple_vdev_set_param_cmd =
1249 			target_if_vdev_mgr_multiple_vdev_set_param_cmd;
1250 	mlme_tx_ops->beacon_cmd_send = target_if_vdev_mgr_beacon_send;
1251 	mlme_tx_ops->beacon_tmpl_send = target_if_vdev_mgr_beacon_tmpl_send;
1252 	mlme_tx_ops->vdev_set_param_send =
1253 			target_if_vdev_mgr_set_param_send;
1254 	mlme_tx_ops->vdev_set_tx_rx_decap_type =
1255 			target_if_vdev_set_tx_rx_decap_type;
1256 	mlme_tx_ops->vdev_sta_ps_param_send =
1257 			target_if_vdev_mgr_sta_ps_param_send;
1258 	mlme_tx_ops->psoc_vdev_rsp_timer_mod =
1259 			target_if_vdev_mgr_rsp_timer_mod;
1260 	mlme_tx_ops->peer_delete_all_send =
1261 			target_if_vdev_mgr_peer_delete_all_send;
1262 	target_if_vdev_register_tx_fils(mlme_tx_ops);
1263 
1264 	mlme_tx_ops->psoc_vdev_rsp_timer_init =
1265 			target_if_psoc_vdev_rsp_timer_init;
1266 	mlme_tx_ops->psoc_vdev_rsp_timer_deinit =
1267 			target_if_psoc_vdev_rsp_timer_deinit;
1268 	mlme_tx_ops->psoc_vdev_rsp_timer_inuse =
1269 			target_if_psoc_vdev_rsp_timer_inuse;
1270 	mlme_tx_ops->psoc_wake_lock_init =
1271 			target_if_wake_lock_init;
1272 	mlme_tx_ops->psoc_wake_lock_deinit =
1273 			target_if_wake_lock_deinit;
1274 	mlme_tx_ops->vdev_mgr_rsp_timer_stop =
1275 			target_if_vdev_mgr_rsp_timer_stop;
1276 	return QDF_STATUS_SUCCESS;
1277 }
1278