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