xref: /wlan-dirver/qca-wifi-host-cmn/umac/mlme/vdev_mgr/core/src/vdev_mgr_ops.c (revision 97f44cd39e4ff816eaa1710279d28cf6b9e65ad9)
1 /*
2  * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for
5  * any purpose with or without fee is hereby granted, provided that the
6  * above copyright notice and this permission notice appear in all
7  * copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16  * PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 /**
20  * DOC: vdev_mgr_ops.c
21  *
22  * This file provide API definitions for filling data structures
23  * and sending vdev mgmt commands to target_if/mlme
24  */
25 #include "vdev_mgr_ops.h"
26 #include <wlan_objmgr_vdev_obj.h>
27 #include <wlan_vdev_mlme_api.h>
28 #include <wlan_mlme_dbg.h>
29 #include <wlan_vdev_mgr_tgt_if_tx_api.h>
30 #include <target_if.h>
31 #include <init_deinit_lmac.h>
32 #include <wlan_lmac_if_api.h>
33 #include <wlan_reg_services_api.h>
34 #include <wlan_dfs_tgt_api.h>
35 #include <wlan_dfs_utils_api.h>
36 #include <wlan_vdev_mgr_ucfg_api.h>
37 #include <qdf_module.h>
38 
39 static QDF_STATUS vdev_mgr_create_param_update(
40 					struct vdev_mlme_obj *mlme_obj,
41 					struct vdev_create_params *param)
42 {
43 	struct wlan_objmgr_pdev *pdev;
44 	struct wlan_objmgr_vdev *vdev;
45 	struct vdev_mlme_mbss_11ax *mbss;
46 
47 	vdev = mlme_obj->vdev;
48 	if (!vdev) {
49 		mlme_err("VDEV is NULL");
50 		return QDF_STATUS_E_INVAL;
51 	}
52 
53 	pdev = wlan_vdev_get_pdev(vdev);
54 	if (!pdev) {
55 		mlme_err("PDEV is NULL");
56 		return QDF_STATUS_E_INVAL;
57 	}
58 
59 	mbss = &mlme_obj->mgmt.mbss_11ax;
60 	param->pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
61 	param->vdev_id = wlan_vdev_get_id(vdev);
62 	param->nss_2g = mlme_obj->proto.generic.nss_2g;
63 	param->nss_5g = mlme_obj->proto.generic.nss_5g;
64 	param->type = mlme_obj->mgmt.generic.type;
65 	param->subtype = mlme_obj->mgmt.generic.subtype;
66 	param->mbssid_flags = mbss->mbssid_flags;
67 	param->vdevid_trans = mbss->vdevid_trans;
68 	param->special_vdev_mode = mlme_obj->mgmt.generic.special_vdev_mode;
69 
70 	return QDF_STATUS_SUCCESS;
71 }
72 
73 QDF_STATUS vdev_mgr_create_send(struct vdev_mlme_obj *mlme_obj)
74 {
75 	QDF_STATUS status;
76 	struct vdev_create_params param = {0};
77 
78 	if (!mlme_obj) {
79 		mlme_err("VDEV_MLME is NULL");
80 		return QDF_STATUS_E_INVAL;
81 	}
82 
83 	status = vdev_mgr_create_param_update(mlme_obj, &param);
84 	if (QDF_IS_STATUS_ERROR(status)) {
85 		mlme_err("Param Update Error: %d", status);
86 		return status;
87 	}
88 
89 	status = tgt_vdev_mgr_create_send(mlme_obj, &param);
90 
91 	return status;
92 }
93 
94 #ifdef QCA_MCL_DFS_SUPPORT
95 static bool vdev_mgr_is_opmode_sap_or_p2p_go(enum QDF_OPMODE op_mode)
96 {
97 	return (op_mode == QDF_SAP_MODE || op_mode == QDF_P2P_GO_MODE);
98 }
99 
100 static bool vdev_mgr_is_49G_5G_6G_chan_freq(uint16_t chan_freq)
101 {
102 	return WLAN_REG_IS_5GHZ_CH_FREQ(chan_freq) ||
103 		WLAN_REG_IS_49GHZ_FREQ(chan_freq) ||
104 		WLAN_REG_IS_6GHZ_CHAN_FREQ(chan_freq);
105 }
106 #else
107 static inline bool vdev_mgr_is_opmode_sap_or_p2p_go(enum QDF_OPMODE op_mode)
108 {
109 	return true;
110 }
111 
112 static inline bool vdev_mgr_is_49G_5G_6G_chan_freq(uint16_t chan_freq)
113 {
114 	return true;
115 }
116 #endif
117 
118 static QDF_STATUS vdev_mgr_start_param_update(
119 					struct vdev_mlme_obj *mlme_obj,
120 					struct vdev_start_params *param)
121 {
122 	struct wlan_channel *des_chan;
123 	uint32_t dfs_reg;
124 	bool set_agile = false, dfs_set_cfreq2 = false;
125 	struct wlan_objmgr_vdev *vdev;
126 	struct wlan_objmgr_pdev *pdev;
127 	enum QDF_OPMODE op_mode;
128 	bool is_dfs_chan_updated = false;
129 	struct vdev_mlme_mbss_11ax *mbss;
130 
131 	vdev = mlme_obj->vdev;
132 	if (!vdev) {
133 		mlme_err("VDEV is NULL");
134 		return QDF_STATUS_E_INVAL;
135 	}
136 
137 	pdev = wlan_vdev_get_pdev(vdev);
138 	if (!pdev) {
139 		mlme_err("PDEV is NULL");
140 		return QDF_STATUS_E_INVAL;
141 	}
142 
143 	if (wlan_objmgr_pdev_try_get_ref(pdev, WLAN_MLME_SB_ID) !=
144 							QDF_STATUS_SUCCESS) {
145 		mlme_err("Failed to get pdev reference");
146 		return QDF_STATUS_E_FAILURE;
147 	}
148 
149 	des_chan = wlan_vdev_mlme_get_des_chan(vdev);
150 	param->vdev_id = wlan_vdev_get_id(vdev);
151 
152 	op_mode = wlan_vdev_mlme_get_opmode(vdev);
153 	if (vdev_mgr_is_opmode_sap_or_p2p_go(op_mode) &&
154 	    vdev_mgr_is_49G_5G_6G_chan_freq(des_chan->ch_freq)) {
155 		tgt_dfs_set_current_channel_for_freq(pdev, des_chan->ch_freq,
156 						     des_chan->ch_flags,
157 						     des_chan->ch_flagext,
158 						     des_chan->ch_ieee,
159 						     des_chan->ch_freq_seg1,
160 						     des_chan->ch_freq_seg2,
161 						     des_chan->ch_cfreq1,
162 						     des_chan->ch_cfreq2,
163 						     &is_dfs_chan_updated);
164 		if (des_chan->ch_cfreq2)
165 			param->channel.dfs_set_cfreq2 =
166 				utils_is_dfs_cfreq2_ch(pdev);
167 	}
168 
169 	/* The Agile state machine should be stopped only once for the channel
170 	 * change. If  the same channel is being sent to the FW then do
171 	 * not send unnecessary STOP to the state machine.
172 	 */
173 	if (is_dfs_chan_updated)
174 		utils_dfs_agile_sm_deliver_evt(pdev,
175 					       DFS_AGILE_SM_EV_AGILE_STOP);
176 
177 	param->beacon_interval = mlme_obj->proto.generic.beacon_interval;
178 	param->dtim_period = mlme_obj->proto.generic.dtim_period;
179 	param->disable_hw_ack = mlme_obj->mgmt.generic.disable_hw_ack;
180 	param->preferred_rx_streams =
181 		mlme_obj->mgmt.chainmask_info.num_rx_chain;
182 	param->preferred_tx_streams =
183 		mlme_obj->mgmt.chainmask_info.num_tx_chain;
184 
185 	wlan_reg_get_dfs_region(pdev, &dfs_reg);
186 	param->regdomain = dfs_reg;
187 	param->he_ops = mlme_obj->proto.he_ops_info.he_ops;
188 
189 	param->channel.chan_id = des_chan->ch_ieee;
190 	param->channel.pwr = mlme_obj->mgmt.generic.tx_power;
191 	param->channel.mhz = des_chan->ch_freq;
192 	param->channel.half_rate = mlme_obj->mgmt.rate_info.half_rate;
193 	param->channel.quarter_rate = mlme_obj->mgmt.rate_info.quarter_rate;
194 	param->channel.dfs_set = wlan_reg_is_dfs_for_freq(pdev,
195 							  des_chan->ch_freq);
196 	param->channel.is_chan_passive =
197 		utils_is_dfs_chan_for_freq(pdev, param->channel.mhz);
198 	param->channel.allow_ht = mlme_obj->proto.ht_info.allow_ht;
199 	param->channel.allow_vht = mlme_obj->proto.vht_info.allow_vht;
200 	param->channel.phy_mode = mlme_obj->mgmt.generic.phy_mode;
201 	param->channel.cfreq1 = des_chan->ch_cfreq1;
202 	param->channel.cfreq2 = des_chan->ch_cfreq2;
203 	param->channel.maxpower = mlme_obj->mgmt.generic.maxpower;
204 	param->channel.minpower = mlme_obj->mgmt.generic.minpower;
205 	param->channel.maxregpower = mlme_obj->mgmt.generic.maxregpower;
206 	param->channel.antennamax = mlme_obj->mgmt.generic.antennamax;
207 	param->channel.reg_class_id = mlme_obj->mgmt.generic.reg_class_id;
208 	param->bcn_tx_rate_code = vdev_mgr_fetch_ratecode(mlme_obj);
209 	param->ldpc_rx_enabled = mlme_obj->proto.generic.ldpc;
210 
211 	mbss = &mlme_obj->mgmt.mbss_11ax;
212 	param->mbssid_flags = mbss->mbssid_flags;
213 	param->vdevid_trans = mbss->vdevid_trans;
214 
215 	if (mlme_obj->mgmt.generic.type == WLAN_VDEV_MLME_TYPE_AP) {
216 		param->hidden_ssid = mlme_obj->mgmt.ap.hidden_ssid;
217 		param->cac_duration_ms = mlme_obj->mgmt.ap.cac_duration_ms;
218 	}
219 	wlan_vdev_mlme_get_ssid(vdev, param->ssid.ssid, &param->ssid.length);
220 
221 	if (des_chan->ch_phymode == WLAN_PHYMODE_11AC_VHT80 ||
222 	    des_chan->ch_phymode == WLAN_PHYMODE_11AXA_HE80) {
223 		tgt_dfs_find_vht80_precac_chan_freq(pdev,
224 						    des_chan->ch_phymode,
225 						    des_chan->ch_freq_seg1,
226 						    &param->channel.cfreq1,
227 						    &param->channel.cfreq2,
228 						    &param->channel.phy_mode,
229 						    &dfs_set_cfreq2,
230 						    &set_agile);
231 		param->channel.dfs_set_cfreq2 = dfs_set_cfreq2;
232 		param->channel.set_agile = set_agile;
233 	}
234 
235 	wlan_objmgr_pdev_release_ref(pdev, WLAN_MLME_SB_ID);
236 	return QDF_STATUS_SUCCESS;
237 }
238 
239 QDF_STATUS vdev_mgr_start_send(
240 			struct vdev_mlme_obj *mlme_obj,
241 			bool restart)
242 {
243 	QDF_STATUS status;
244 	struct vdev_start_params param = {0};
245 
246 	if (!mlme_obj) {
247 		mlme_err("VDEV_MLME is NULL");
248 		return QDF_STATUS_E_INVAL;
249 	}
250 
251 	status = vdev_mgr_start_param_update(mlme_obj, &param);
252 	if (QDF_IS_STATUS_ERROR(status)) {
253 		mlme_err("Param Update Error: %d", status);
254 		return status;
255 	}
256 
257 	param.is_restart = restart;
258 	status = tgt_vdev_mgr_start_send(mlme_obj, &param);
259 
260 	return status;
261 }
262 
263 static QDF_STATUS vdev_mgr_delete_param_update(
264 					struct vdev_mlme_obj *mlme_obj,
265 					struct vdev_delete_params *param)
266 {
267 	struct wlan_objmgr_vdev *vdev;
268 
269 	vdev = mlme_obj->vdev;
270 	if (!vdev) {
271 		mlme_err("VDEV is NULL");
272 		return QDF_STATUS_E_INVAL;
273 	}
274 
275 	param->vdev_id = wlan_vdev_get_id(vdev);
276 	return QDF_STATUS_SUCCESS;
277 }
278 
279 QDF_STATUS vdev_mgr_delete_send(struct vdev_mlme_obj *mlme_obj)
280 {
281 	QDF_STATUS status;
282 	struct vdev_delete_params param;
283 
284 	if (!mlme_obj) {
285 		mlme_err("VDEV_MLME is NULL");
286 		return QDF_STATUS_E_INVAL;
287 	}
288 
289 	status = vdev_mgr_delete_param_update(mlme_obj, &param);
290 	if (QDF_IS_STATUS_ERROR(status)) {
291 		mlme_err("Param Update Error: %d", status);
292 		return status;
293 	}
294 
295 	status = tgt_vdev_mgr_delete_send(mlme_obj, &param);
296 
297 	return status;
298 }
299 
300 static QDF_STATUS vdev_mgr_stop_param_update(
301 				struct vdev_mlme_obj *mlme_obj,
302 				struct vdev_stop_params *param)
303 {
304 	struct wlan_objmgr_vdev *vdev;
305 
306 	vdev = mlme_obj->vdev;
307 	if (!vdev) {
308 		mlme_err("VDEV is NULL");
309 		return QDF_STATUS_E_INVAL;
310 	}
311 
312 	param->vdev_id = wlan_vdev_get_id(vdev);
313 
314 	return QDF_STATUS_SUCCESS;
315 }
316 
317 QDF_STATUS vdev_mgr_stop_send(struct vdev_mlme_obj *mlme_obj)
318 {
319 	QDF_STATUS status;
320 	struct vdev_stop_params param = {0};
321 
322 	if (!mlme_obj) {
323 		mlme_err("VDEV_MLME is NULL");
324 		return QDF_STATUS_E_INVAL;
325 	}
326 
327 	status = vdev_mgr_stop_param_update(mlme_obj, &param);
328 	if (QDF_IS_STATUS_ERROR(status)) {
329 		mlme_err("Param Update Error: %d", status);
330 		return status;
331 	}
332 
333 	status = tgt_vdev_mgr_stop_send(mlme_obj, &param);
334 
335 	return status;
336 }
337 
338 static QDF_STATUS vdev_mgr_bcn_tmpl_param_update(
339 				struct vdev_mlme_obj *mlme_obj,
340 				struct beacon_tmpl_params *param)
341 {
342 	return QDF_STATUS_SUCCESS;
343 }
344 
345 static QDF_STATUS vdev_mgr_sta_ps_param_update(
346 				struct vdev_mlme_obj *mlme_obj,
347 				struct sta_ps_params *param)
348 {
349 	struct wlan_objmgr_vdev *vdev;
350 
351 	vdev = mlme_obj->vdev;
352 	param->vdev_id = wlan_vdev_get_id(vdev);
353 	param->param_id = WLAN_MLME_CFG_UAPSD;
354 	param->value = mlme_obj->proto.sta.uapsd_cfg;
355 	return QDF_STATUS_SUCCESS;
356 }
357 
358 static QDF_STATUS vdev_mgr_up_param_update(
359 				struct vdev_mlme_obj *mlme_obj,
360 				struct vdev_up_params *param)
361 {
362 	struct vdev_mlme_mbss_11ax *mbss;
363 	struct wlan_objmgr_vdev *vdev;
364 
365 	vdev = mlme_obj->vdev;
366 	param->vdev_id = wlan_vdev_get_id(vdev);
367 	param->assoc_id = mlme_obj->proto.sta.assoc_id;
368 	mbss = &mlme_obj->mgmt.mbss_11ax;
369 	if (mbss->profile_idx) {
370 		param->profile_idx = mbss->profile_idx;
371 		param->profile_num = mbss->profile_num;
372 		qdf_mem_copy(param->trans_bssid, mbss->trans_bssid,
373 			     QDF_MAC_ADDR_SIZE);
374 	}
375 
376 	return QDF_STATUS_SUCCESS;
377 }
378 
379 QDF_STATUS vdev_mgr_up_send(struct vdev_mlme_obj *mlme_obj)
380 {
381 	QDF_STATUS status;
382 	struct vdev_up_params param = {0};
383 	struct sta_ps_params ps_param = {0};
384 	struct beacon_tmpl_params bcn_tmpl_param = {0};
385 	enum QDF_OPMODE opmode;
386 	struct wlan_objmgr_vdev *vdev;
387 	struct config_fils_params fils_param = {0};
388 	uint8_t is_6g_sap_fd_enabled;
389 	bool is_non_tx_vdev;
390 
391 	if (!mlme_obj) {
392 		mlme_err("VDEV_MLME is NULL");
393 		return QDF_STATUS_E_INVAL;
394 	}
395 
396 	vdev = mlme_obj->vdev;
397 	if (!vdev) {
398 		mlme_err("VDEV is NULL");
399 		return QDF_STATUS_E_INVAL;
400 	}
401 
402 	vdev_mgr_up_param_update(mlme_obj, &param);
403 	vdev_mgr_bcn_tmpl_param_update(mlme_obj, &bcn_tmpl_param);
404 
405 	opmode = wlan_vdev_mlme_get_opmode(vdev);
406 	if (opmode == QDF_STA_MODE) {
407 		vdev_mgr_sta_ps_param_update(mlme_obj, &ps_param);
408 		status = tgt_vdev_mgr_sta_ps_param_send(mlme_obj, &ps_param);
409 
410 	}
411 
412 	status = tgt_vdev_mgr_beacon_tmpl_send(mlme_obj, &bcn_tmpl_param);
413 	if (QDF_IS_STATUS_ERROR(status))
414 		return status;
415 
416 	status = tgt_vdev_mgr_up_send(mlme_obj, &param);
417 	if (QDF_IS_STATUS_ERROR(status))
418 		return status;
419 
420 	is_6g_sap_fd_enabled = wlan_vdev_mlme_feat_ext_cap_get(vdev,
421 					WLAN_VDEV_FEXT_FILS_DISC_6G_SAP);
422 	mlme_debug("SAP FD enabled %d", is_6g_sap_fd_enabled);
423 
424 	/*
425 	 * In case of a non-tx vdev, 'profile_num' must be greater
426 	 * than 0 indicating one or more non-tx vdev and 'profile_idx'
427 	 * must be in the range [1, 2^n] where n is the max bssid
428 	 * indicator
429 	 */
430 	is_non_tx_vdev = param.profile_num && param.profile_idx;
431 
432 	if (opmode == QDF_SAP_MODE && mlme_obj->vdev->vdev_mlme.des_chan &&
433 	    WLAN_REG_IS_6GHZ_CHAN_FREQ(
434 			mlme_obj->vdev->vdev_mlme.des_chan->ch_freq) &&
435 		!is_non_tx_vdev) {
436 		fils_param.vdev_id = wlan_vdev_get_id(mlme_obj->vdev);
437 		if (is_6g_sap_fd_enabled) {
438 			fils_param.fd_period = DEFAULT_FILS_DISCOVERY_PERIOD;
439 		} else {
440 			fils_param.send_prb_rsp_frame = true;
441 			fils_param.fd_period = DEFAULT_PROBE_RESP_PERIOD;
442 		}
443 		status = tgt_vdev_mgr_fils_enable_send(mlme_obj,
444 						       &fils_param);
445 	}
446 
447 	return status;
448 }
449 
450 static QDF_STATUS vdev_mgr_down_param_update(
451 					struct vdev_mlme_obj *mlme_obj,
452 					struct vdev_down_params *param)
453 {
454 	struct wlan_objmgr_vdev *vdev;
455 
456 	vdev = mlme_obj->vdev;
457 	if (!vdev) {
458 		mlme_err("VDEV is NULL");
459 		return QDF_STATUS_E_INVAL;
460 	}
461 
462 	param->vdev_id = wlan_vdev_get_id(vdev);
463 
464 	return QDF_STATUS_SUCCESS;
465 }
466 
467 QDF_STATUS vdev_mgr_down_send(struct vdev_mlme_obj *mlme_obj)
468 {
469 	QDF_STATUS status;
470 	struct vdev_down_params param = {0};
471 
472 	if (!mlme_obj) {
473 		mlme_err("VDEV_MLME is NULL");
474 		return QDF_STATUS_E_INVAL;
475 	}
476 
477 	status = vdev_mgr_down_param_update(mlme_obj, &param);
478 	if (QDF_IS_STATUS_ERROR(status)) {
479 		mlme_err("Param Update Error: %d", status);
480 		return status;
481 	}
482 
483 	status = tgt_vdev_mgr_down_send(mlme_obj, &param);
484 
485 	return status;
486 }
487 
488 static QDF_STATUS vdev_mgr_peer_flush_tids_param_update(
489 					struct vdev_mlme_obj *mlme_obj,
490 					struct peer_flush_params *param,
491 					uint8_t *mac,
492 					uint32_t peer_tid_bitmap)
493 {
494 	struct wlan_objmgr_vdev *vdev;
495 
496 	vdev = mlme_obj->vdev;
497 	if (!vdev) {
498 		mlme_err("VDEV is NULL");
499 		return QDF_STATUS_E_INVAL;
500 	}
501 
502 	param->vdev_id = wlan_vdev_get_id(vdev);
503 	param->peer_tid_bitmap = peer_tid_bitmap;
504 	qdf_mem_copy(param->peer_mac, mac, QDF_MAC_ADDR_SIZE);
505 	return QDF_STATUS_SUCCESS;
506 }
507 
508 QDF_STATUS vdev_mgr_peer_flush_tids_send(struct vdev_mlme_obj *mlme_obj,
509 					 uint8_t *mac,
510 					 uint32_t peer_tid_bitmap)
511 {
512 	QDF_STATUS status;
513 	struct peer_flush_params param = {0};
514 
515 	if (!mlme_obj || !mac) {
516 		mlme_err("Invalid input");
517 		return QDF_STATUS_E_INVAL;
518 	}
519 
520 	status = vdev_mgr_peer_flush_tids_param_update(mlme_obj, &param,
521 						       mac, peer_tid_bitmap);
522 	if (QDF_IS_STATUS_ERROR(status)) {
523 		mlme_err("Param Update Error: %d", status);
524 		return status;
525 	}
526 
527 	status = tgt_vdev_mgr_peer_flush_tids_send(mlme_obj, &param);
528 
529 	return status;
530 }
531 
532 static QDF_STATUS vdev_mgr_multiple_restart_param_update(
533 				struct wlan_objmgr_pdev *pdev,
534 				struct mlme_channel_param *chan,
535 				uint32_t disable_hw_ack,
536 				uint32_t *vdev_ids,
537 				uint32_t num_vdevs,
538 				struct vdev_mlme_mvr_param *mvr_param,
539 				struct multiple_vdev_restart_params *param)
540 {
541 	param->pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
542 	param->requestor_id = MULTIPLE_VDEV_RESTART_REQ_ID;
543 	param->disable_hw_ack = disable_hw_ack;
544 	param->cac_duration_ms = WLAN_DFS_WAIT_MS;
545 	param->num_vdevs = num_vdevs;
546 
547 	qdf_mem_copy(param->vdev_ids, vdev_ids,
548 		     sizeof(uint32_t) * (param->num_vdevs));
549 	qdf_mem_copy(&param->ch_param, chan,
550 		     sizeof(struct mlme_channel_param));
551 	qdf_mem_copy(param->mvr_param, mvr_param,
552 		     sizeof(*mvr_param) * (param->num_vdevs));
553 
554 	return QDF_STATUS_SUCCESS;
555 }
556 
557 QDF_STATUS vdev_mgr_multiple_restart_send(struct wlan_objmgr_pdev *pdev,
558 					  struct mlme_channel_param *chan,
559 					  uint32_t disable_hw_ack,
560 					  uint32_t *vdev_ids,
561 					  uint32_t num_vdevs,
562 					  struct vdev_mlme_mvr_param *mvr_param)
563 {
564 	struct multiple_vdev_restart_params param = {0};
565 
566 	vdev_mgr_multiple_restart_param_update(pdev, chan,
567 					       disable_hw_ack,
568 					       vdev_ids, num_vdevs,
569 					       mvr_param, &param);
570 
571 	return tgt_vdev_mgr_multiple_vdev_restart_send(pdev, &param);
572 }
573 
574 qdf_export_symbol(vdev_mgr_multiple_restart_send);
575 
576 static QDF_STATUS vdev_mgr_set_custom_aggr_size_param_update(
577 				struct vdev_mlme_obj *mlme_obj,
578 				struct set_custom_aggr_size_params *param,
579 				bool is_amsdu)
580 {
581 	struct wlan_objmgr_vdev *vdev;
582 
583 	vdev = mlme_obj->vdev;
584 	if (!vdev) {
585 		mlme_err("VDEV is NULL");
586 		return QDF_STATUS_E_INVAL;
587 	}
588 
589 	param->aggr_type = is_amsdu ? WLAN_MLME_CUSTOM_AGGR_TYPE_AMSDU
590 				    : WLAN_MLME_CUSTOM_AGGR_TYPE_AMPDU;
591 	/*
592 	 * We are only setting TX params, therefore
593 	 * we are disabling rx_aggr_size
594 	 */
595 	param->rx_aggr_size_disable = true;
596 	param->tx_aggr_size = is_amsdu ? mlme_obj->mgmt.generic.amsdu
597 				       : mlme_obj->mgmt.generic.ampdu;
598 	param->vdev_id = wlan_vdev_get_id(vdev);
599 
600 	return QDF_STATUS_SUCCESS;
601 }
602 
603 QDF_STATUS vdev_mgr_set_custom_aggr_size_send(
604 				struct vdev_mlme_obj *vdev_mlme,
605 				bool is_amsdu)
606 {
607 	QDF_STATUS status;
608 	struct set_custom_aggr_size_params param = {0};
609 
610 	status = vdev_mgr_set_custom_aggr_size_param_update(vdev_mlme,
611 							    &param, is_amsdu);
612 	if (QDF_IS_STATUS_ERROR(status)) {
613 		mlme_err("Param Update Error: %d", status);
614 		return status;
615 	}
616 
617 	return tgt_vdev_mgr_set_custom_aggr_size_send(vdev_mlme, &param);
618 }
619 
620 static QDF_STATUS vdev_mgr_peer_delete_all_param_update(
621 				struct vdev_mlme_obj *mlme_obj,
622 				struct peer_delete_all_params *param)
623 {
624 	struct wlan_objmgr_vdev *vdev;
625 
626 	vdev = mlme_obj->vdev;
627 	if (!vdev) {
628 		mlme_err("VDEV is NULL");
629 		return QDF_STATUS_E_INVAL;
630 	}
631 
632 	param->vdev_id = wlan_vdev_get_id(vdev);
633 	return QDF_STATUS_SUCCESS;
634 }
635 
636 QDF_STATUS vdev_mgr_peer_delete_all_send(struct vdev_mlme_obj *mlme_obj)
637 {
638 	QDF_STATUS status;
639 	struct peer_delete_all_params param = {0};
640 
641 	if (!mlme_obj) {
642 		mlme_err("Invalid input");
643 		return QDF_STATUS_E_INVAL;
644 	}
645 
646 	status = vdev_mgr_peer_delete_all_param_update(mlme_obj, &param);
647 	if (QDF_IS_STATUS_ERROR(status)) {
648 		mlme_err("Param Update Error: %d", status);
649 		return status;
650 	}
651 
652 	status = tgt_vdev_mgr_peer_delete_all_send(mlme_obj, &param);
653 
654 	return status;
655 }
656 
657