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