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