xref: /wlan-dirver/qca-wifi-host-cmn/umac/mlme/vdev_mgr/core/src/vdev_mgr_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: vdev_mgr_ops.c
22  *
23  * This file provide API definitions for filling data structures
24  * and sending vdev mgmt commands to target_if/mlme
25  */
26 #include "vdev_mgr_ops.h"
27 #include <wlan_objmgr_vdev_obj.h>
28 #include <wlan_vdev_mlme_api.h>
29 #include <wlan_mlme_dbg.h>
30 #include <wlan_vdev_mgr_tgt_if_tx_api.h>
31 #include <target_if.h>
32 #include <init_deinit_lmac.h>
33 #include <wlan_lmac_if_api.h>
34 #include <wlan_reg_services_api.h>
35 #include <wlan_dfs_tgt_api.h>
36 #include <wlan_dfs_utils_api.h>
37 #include <wlan_vdev_mgr_ucfg_api.h>
38 #include <qdf_module.h>
39 #include <cdp_txrx_ctrl.h>
40 #ifdef WLAN_FEATURE_11BE_MLO
41 #include <wlan_mlo_mgr_ap.h>
42 #endif
43 #include <wlan_vdev_mgr_utils_api.h>
44 
45 #ifdef QCA_VDEV_STATS_HW_OFFLOAD_SUPPORT
46 /**
47  * vdev_mgr_alloc_vdev_stats_id() - Allocate vdev stats id for vdev
48  * @vdev - pointer to vdev
49  * @param - pointer to vdev create params
50  *
51  * Return: none
52  */
53 static void vdev_mgr_alloc_vdev_stats_id(struct wlan_objmgr_vdev *vdev,
54 					 struct vdev_create_params *param)
55 {
56 	struct wlan_objmgr_psoc *psoc;
57 	uint8_t vdev_stats_id = CDP_INVALID_VDEV_STATS_ID;
58 
59 	if ((param->type == WLAN_VDEV_MLME_TYPE_MONITOR) ||
60 	    (param->subtype == WLAN_VDEV_MLME_SUBTYPE_SMART_MONITOR) ||
61 	    (param->special_vdev_mode)) {
62 		param->vdev_stats_id = CDP_INVALID_VDEV_STATS_ID;
63 		return;
64 	}
65 	psoc = wlan_vdev_get_psoc(vdev);
66 	if (!psoc || !wlan_psoc_get_dp_handle(psoc)) {
67 		mlme_err("PSOC or PSOC DP Handle is NULL");
68 		param->vdev_stats_id = CDP_INVALID_VDEV_STATS_ID;
69 		return;
70 	}
71 
72 	/* Get vdev_stats_id from dp_soc via cdp call */
73 	cdp_vdev_alloc_vdev_stats_id(wlan_psoc_get_dp_handle(psoc),
74 				     &vdev_stats_id);
75 
76 	param->vdev_stats_id = vdev_stats_id;
77 }
78 
79 /**
80  * vdev_mgr_reset_vdev_stats_id() -Reset vdev stats id
81  * @vdev - pointer to vdev
82  * @vdev_stats_id - Value of vdev_stats_id
83  *
84  * Return: none
85  */
86 static void vdev_mgr_reset_vdev_stats_id(struct wlan_objmgr_vdev *vdev,
87 					 uint8_t vdev_stats_id)
88 {
89 	struct wlan_objmgr_psoc *psoc;
90 
91 	if (vdev_stats_id == CDP_INVALID_VDEV_STATS_ID)
92 		return;
93 
94 	psoc = wlan_vdev_get_psoc(vdev);
95 	if (!psoc || !wlan_psoc_get_dp_handle(psoc)) {
96 		mlme_err("PSOC or PSOC DP Handle is NULL");
97 		return;
98 	}
99 
100 	cdp_vdev_reset_vdev_stats_id(wlan_psoc_get_dp_handle(psoc),
101 				     vdev_stats_id);
102 }
103 #else
104 static void vdev_mgr_alloc_vdev_stats_id(struct wlan_objmgr_vdev *vdev,
105 					 struct vdev_create_params *param)
106 {
107 	/* Assign Invalid vdev_stats_id */
108 	param->vdev_stats_id = CDP_INVALID_VDEV_STATS_ID;
109 }
110 
111 static void vdev_mgr_reset_vdev_stats_id(struct wlan_objmgr_vdev *vdev,
112 					 uint8_t vdev_stats_id)
113 {}
114 #endif /* QCA_VDEV_STATS_HW_OFFLOAD_SUPPORT */
115 
116 #ifdef WLAN_FEATURE_11BE_MLO
117 static inline void
118 vdev_mgr_param_mld_mac_addr_copy(struct wlan_objmgr_vdev *vdev,
119 				 struct vdev_create_params *param)
120 {
121 	WLAN_ADDR_COPY(param->mlo_mac, wlan_vdev_mlme_get_mldaddr(vdev));
122 }
123 #else /* WLAN_FEATURE_11BE_MLO */
124 static inline void
125 vdev_mgr_param_mld_mac_addr_copy(struct wlan_objmgr_vdev *vdev,
126 				 struct vdev_create_params *param)
127 {
128 }
129 #endif /* WLAN_FEATURE_11BE_MLO */
130 
131 static QDF_STATUS vdev_mgr_create_param_update(
132 					struct vdev_mlme_obj *mlme_obj,
133 					struct vdev_create_params *param)
134 {
135 	struct wlan_objmgr_pdev *pdev;
136 	struct wlan_objmgr_vdev *vdev;
137 	struct vdev_mlme_mbss_11ax *mbss;
138 
139 	vdev = mlme_obj->vdev;
140 	if (!vdev) {
141 		mlme_err("VDEV is NULL");
142 		return QDF_STATUS_E_INVAL;
143 	}
144 
145 	pdev = wlan_vdev_get_pdev(vdev);
146 	if (!pdev) {
147 		mlme_err("PDEV is NULL");
148 		return QDF_STATUS_E_INVAL;
149 	}
150 
151 	mbss = &mlme_obj->mgmt.mbss_11ax;
152 	param->pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
153 	param->vdev_id = wlan_vdev_get_id(vdev);
154 	param->nss_2g = mlme_obj->proto.generic.nss_2g;
155 	param->nss_5g = mlme_obj->proto.generic.nss_5g;
156 	param->type = mlme_obj->mgmt.generic.type;
157 	param->subtype = mlme_obj->mgmt.generic.subtype;
158 	param->mbssid_flags = mbss->mbssid_flags;
159 	param->vdevid_trans = mbss->vdevid_trans;
160 	param->special_vdev_mode = mlme_obj->mgmt.generic.special_vdev_mode;
161 
162 	vdev_mgr_alloc_vdev_stats_id(vdev, param);
163 	param->vdev_stats_id_valid =
164 	((param->vdev_stats_id != CDP_INVALID_VDEV_STATS_ID) ? true : false);
165 	vdev_mgr_param_mld_mac_addr_copy(vdev, param);
166 
167 	return QDF_STATUS_SUCCESS;
168 }
169 
170 QDF_STATUS vdev_mgr_create_send(struct vdev_mlme_obj *mlme_obj)
171 {
172 	QDF_STATUS status;
173 	struct vdev_create_params param = {0};
174 
175 	if (!mlme_obj) {
176 		mlme_err("VDEV_MLME is NULL");
177 		return QDF_STATUS_E_INVAL;
178 	}
179 
180 	status = vdev_mgr_create_param_update(mlme_obj, &param);
181 	if (QDF_IS_STATUS_ERROR(status)) {
182 		mlme_err("Param Update Error: %d", status);
183 		return status;
184 	}
185 
186 	status = tgt_vdev_mgr_create_send(mlme_obj, &param);
187 	if (QDF_IS_STATUS_ERROR(status)) {
188 		/* Reset the vdev_stats_id */
189 		vdev_mgr_reset_vdev_stats_id(mlme_obj->vdev,
190 					     param.vdev_stats_id);
191 	}
192 	return status;
193 }
194 
195 #ifdef MOBILE_DFS_SUPPORT
196 static bool vdev_mgr_is_opmode_sap_or_p2p_go(enum QDF_OPMODE op_mode)
197 {
198 	return (op_mode == QDF_SAP_MODE || op_mode == QDF_P2P_GO_MODE);
199 }
200 
201 static bool vdev_mgr_is_49G_5G_chan_freq(uint16_t chan_freq)
202 {
203 	return WLAN_REG_IS_5GHZ_CH_FREQ(chan_freq) ||
204 		WLAN_REG_IS_49GHZ_FREQ(chan_freq);
205 }
206 #else
207 static inline bool vdev_mgr_is_opmode_sap_or_p2p_go(enum QDF_OPMODE op_mode)
208 {
209 	return true;
210 }
211 
212 static inline bool vdev_mgr_is_49G_5G_chan_freq(uint16_t chan_freq)
213 {
214 	return true;
215 }
216 #endif
217 
218 #ifdef WLAN_FEATURE_11BE
219 static void
220 vdev_mgr_start_param_update_11be(struct vdev_mlme_obj *mlme_obj,
221 				 struct vdev_start_params *param,
222 				 struct wlan_channel *des_chan)
223 {
224 	param->eht_ops = mlme_obj->proto.eht_ops_info.eht_ops;
225 	param->channel.puncture_bitmap = des_chan->puncture_bitmap;
226 }
227 
228 static inline void
229 vdev_mgr_set_cur_chan_punc_bitmap(struct wlan_channel *des_chan,
230 				  uint16_t *puncture_bitmap)
231 {
232 	*puncture_bitmap = des_chan->puncture_bitmap;
233 }
234 #else
235 static void
236 vdev_mgr_start_param_update_11be(struct vdev_mlme_obj *mlme_obj,
237 				 struct vdev_start_params *param,
238 				 struct wlan_channel *des_chan)
239 {
240 }
241 
242 static inline void
243 vdev_mgr_set_cur_chan_punc_bitmap(struct wlan_channel *des_chan,
244 				  uint16_t *puncture_bitmap)
245 {
246 	*puncture_bitmap = 0;
247 }
248 #endif
249 
250 #ifdef WLAN_FEATURE_11BE_MLO
251 #ifdef WLAN_MCAST_MLO
252 static inline void
253 vdev_mgr_start_param_update_mlo_mcast(struct wlan_objmgr_vdev *vdev,
254 				      struct vdev_start_params *param)
255 {
256 	if (wlan_vdev_mlme_is_mlo_mcast_vdev(vdev))
257 		param->mlo_flags.mlo_mcast_vdev = 1;
258 }
259 #else
260 #define vdev_mgr_start_param_update_mlo_mcast(vdev, param)
261 #endif
262 
263 static void
264 vdev_mgr_start_param_update_mlo_partner(struct wlan_objmgr_vdev *vdev,
265 					struct vdev_start_params *param)
266 {
267 	struct wlan_objmgr_pdev *pdev;
268 	struct mlo_vdev_start_partner_links *mlo_ptr = &param->mlo_partner;
269 	struct wlan_objmgr_vdev *vdev_list[WLAN_UMAC_MLO_MAX_VDEVS] = {NULL};
270 	uint16_t num_links = 0;
271 	uint8_t i = 0, p_idx = 0;
272 
273 	mlo_ap_get_vdev_list(vdev, &num_links, vdev_list);
274 	if (!num_links) {
275 		mlme_err("No VDEVs under AP-MLD");
276 		return;
277 	}
278 
279 	if (num_links > QDF_ARRAY_SIZE(vdev_list)) {
280 		mlme_err("Invalid number of VDEVs under AP-MLD num_links:%u",
281 			 num_links);
282 		for (i = 0; i < QDF_ARRAY_SIZE(vdev_list); i++)
283 			mlo_release_vdev_ref(vdev_list[i]);
284 		return;
285 	}
286 
287 	for (i = 0; i < num_links; i++) {
288 		if (vdev_list[i] == vdev) {
289 			mlo_release_vdev_ref(vdev_list[i]);
290 			continue;
291 		}
292 
293 		pdev = wlan_vdev_get_pdev(vdev_list[i]);
294 		mlo_ptr->partner_info[p_idx].vdev_id =
295 			wlan_vdev_get_id(vdev_list[i]);
296 		mlo_ptr->partner_info[p_idx].hw_mld_link_id =
297 			wlan_mlo_get_pdev_hw_link_id(pdev);
298 		qdf_mem_copy(mlo_ptr->partner_info[p_idx].mac_addr,
299 			     wlan_vdev_mlme_get_macaddr(vdev_list[i]),
300 			     QDF_MAC_ADDR_SIZE);
301 		mlo_release_vdev_ref(vdev_list[i]);
302 		p_idx++;
303 	}
304 	mlo_ptr->num_links = p_idx;
305 }
306 
307 static void
308 vdev_mgr_start_param_update_mlo(struct vdev_mlme_obj *mlme_obj,
309 				struct vdev_start_params *param)
310 {
311 	struct wlan_objmgr_vdev *vdev;
312 
313 	vdev = mlme_obj->vdev;
314 	if (!vdev) {
315 		mlme_err("VDEV is NULL");
316 		return;
317 	}
318 
319 	if (!wlan_vdev_mlme_is_mlo_vdev(vdev))
320 		return;
321 
322 	param->mlo_flags.mlo_enabled = 1;
323 
324 	if (wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE &&
325 	    !wlan_vdev_mlme_is_mlo_link_vdev(vdev))
326 		param->mlo_flags.mlo_assoc_link = 1;
327 
328 	if ((wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE) &&
329 	    wlan_vdev_mlme_cap_get(vdev, WLAN_VDEV_C_EMLSR_CAP)) {
330 		param->mlo_flags.emlsr_support  = 1;
331 		mlme_debug("eMLSR support=%d", param->mlo_flags.emlsr_support);
332 	}
333 
334 	if (wlan_vdev_mlme_get_opmode(vdev) == QDF_SAP_MODE) {
335 		vdev_mgr_start_param_update_mlo_mcast(vdev, param);
336 		vdev_mgr_start_param_update_mlo_partner(vdev, param);
337 	}
338 }
339 #else
340 static void
341 vdev_mgr_start_param_update_mlo(struct vdev_mlme_obj *mlme_obj,
342 				struct vdev_start_params *param)
343 {
344 }
345 #endif
346 
347 #ifdef MOBILE_DFS_SUPPORT
348 static void
349 vdev_mgr_start_param_update_cac_ms(struct wlan_objmgr_vdev *vdev,
350 				   struct vdev_start_params *param)
351 {
352 	param->cac_duration_ms =
353 			wlan_util_vdev_mgr_get_cac_timeout_for_vdev(vdev);
354 }
355 #else
356 static void
357 vdev_mgr_start_param_update_cac_ms(struct wlan_objmgr_vdev *vdev,
358 				   struct vdev_start_params *param)
359 {
360 }
361 #endif
362 
363 static QDF_STATUS vdev_mgr_start_param_update(
364 					struct vdev_mlme_obj *mlme_obj,
365 					struct vdev_start_params *param)
366 {
367 	struct wlan_channel *des_chan;
368 	uint32_t dfs_reg;
369 	bool is_stadfs_en = false;
370 	struct wlan_objmgr_vdev *vdev;
371 	struct wlan_objmgr_pdev *pdev;
372 	enum QDF_OPMODE op_mode;
373 	bool is_dfs_chan_updated = false;
374 	struct vdev_mlme_mbss_11ax *mbss;
375 	uint16_t puncture_bitmap;
376 
377 	vdev = mlme_obj->vdev;
378 	if (!vdev) {
379 		mlme_err("VDEV is NULL");
380 		return QDF_STATUS_E_INVAL;
381 	}
382 
383 	pdev = wlan_vdev_get_pdev(vdev);
384 	if (!pdev) {
385 		mlme_err("PDEV is NULL");
386 		return QDF_STATUS_E_INVAL;
387 	}
388 
389 	if (wlan_objmgr_pdev_try_get_ref(pdev, WLAN_MLME_SB_ID) !=
390 							QDF_STATUS_SUCCESS) {
391 		mlme_err("Failed to get pdev reference");
392 		return QDF_STATUS_E_FAILURE;
393 	}
394 
395 	des_chan = wlan_vdev_mlme_get_des_chan(vdev);
396 	param->vdev_id = wlan_vdev_get_id(vdev);
397 
398 	op_mode = wlan_vdev_mlme_get_opmode(vdev);
399 	if (vdev_mgr_is_opmode_sap_or_p2p_go(op_mode) &&
400 	    vdev_mgr_is_49G_5G_chan_freq(des_chan->ch_freq)) {
401 		vdev_mgr_set_cur_chan_punc_bitmap(des_chan, &puncture_bitmap);
402 		tgt_dfs_set_current_channel_for_freq(pdev, des_chan->ch_freq,
403 						     des_chan->ch_flags,
404 						     des_chan->ch_flagext,
405 						     des_chan->ch_ieee,
406 						     des_chan->ch_freq_seg1,
407 						     des_chan->ch_freq_seg2,
408 						     des_chan->ch_cfreq1,
409 						     des_chan->ch_cfreq2,
410 						     puncture_bitmap,
411 						     &is_dfs_chan_updated);
412 		if (des_chan->ch_cfreq2)
413 			param->channel.dfs_set_cfreq2 =
414 				utils_is_dfs_cfreq2_ch(pdev);
415 	}
416 
417 	/* The Agile state machine should be stopped only once for the channel
418 	 * change. If  the same channel is being sent to the FW then do
419 	 * not send unnecessary STOP to the state machine.
420 	 */
421 	if (is_dfs_chan_updated)
422 		utils_dfs_agile_sm_deliver_evt(pdev,
423 					       DFS_AGILE_SM_EV_AGILE_STOP);
424 
425 	is_stadfs_en = tgt_dfs_is_stadfs_enabled(pdev);
426 	param->channel.is_stadfs_en = is_stadfs_en;
427 	param->beacon_interval = mlme_obj->proto.generic.beacon_interval;
428 	param->dtim_period = mlme_obj->proto.generic.dtim_period;
429 	param->disable_hw_ack = mlme_obj->mgmt.generic.disable_hw_ack;
430 	param->preferred_rx_streams =
431 		mlme_obj->mgmt.chainmask_info.num_rx_chain;
432 	param->preferred_tx_streams =
433 		mlme_obj->mgmt.chainmask_info.num_tx_chain;
434 
435 	wlan_reg_get_dfs_region(pdev, &dfs_reg);
436 	param->regdomain = dfs_reg;
437 	param->he_ops = mlme_obj->proto.he_ops_info.he_ops;
438 
439 	vdev_mgr_start_param_update_11be(mlme_obj, param, des_chan);
440 	vdev_mgr_start_param_update_mlo(mlme_obj, param);
441 
442 	param->channel.chan_id = des_chan->ch_ieee;
443 	param->channel.pwr = mlme_obj->mgmt.generic.tx_power;
444 	param->channel.mhz = des_chan->ch_freq;
445 	param->channel.half_rate = mlme_obj->mgmt.rate_info.half_rate;
446 	param->channel.quarter_rate = mlme_obj->mgmt.rate_info.quarter_rate;
447 
448 	if (vdev_mgr_is_opmode_sap_or_p2p_go(op_mode))
449 		param->channel.dfs_set = wlan_reg_is_dfs_for_freq(
450 							pdev,
451 							des_chan->ch_freq);
452 
453 	param->channel.is_chan_passive =
454 		utils_is_dfs_chan_for_freq(pdev, param->channel.mhz);
455 	param->channel.allow_ht = mlme_obj->proto.ht_info.allow_ht;
456 	param->channel.allow_vht = mlme_obj->proto.vht_info.allow_vht;
457 	param->channel.phy_mode = mlme_obj->mgmt.generic.phy_mode;
458 	param->channel.cfreq1 = des_chan->ch_cfreq1;
459 	param->channel.cfreq2 = des_chan->ch_cfreq2;
460 	param->channel.maxpower = mlme_obj->mgmt.generic.maxpower;
461 	param->channel.minpower = mlme_obj->mgmt.generic.minpower;
462 	param->channel.maxregpower = mlme_obj->mgmt.generic.maxregpower;
463 	param->channel.antennamax = mlme_obj->mgmt.generic.antennamax;
464 	param->channel.reg_class_id = mlme_obj->mgmt.generic.reg_class_id;
465 	param->bcn_tx_rate_code = vdev_mgr_fetch_ratecode(mlme_obj);
466 	param->ldpc_rx_enabled = mlme_obj->proto.generic.ldpc;
467 
468 	mbss = &mlme_obj->mgmt.mbss_11ax;
469 	param->mbssid_flags = mbss->mbssid_flags;
470 	param->mbssid_multi_group_flag = mbss->is_multi_mbssid;
471 	param->mbssid_multi_group_id   = mbss->grp_id;
472 	param->vdevid_trans = mbss->vdevid_trans;
473 
474 	if (mlme_obj->mgmt.generic.type == WLAN_VDEV_MLME_TYPE_AP) {
475 		param->hidden_ssid = mlme_obj->mgmt.ap.hidden_ssid;
476 		vdev_mgr_start_param_update_cac_ms(vdev, param);
477 	}
478 	wlan_vdev_mlme_get_ssid(vdev, param->ssid.ssid, &param->ssid.length);
479 
480 	wlan_objmgr_pdev_release_ref(pdev, WLAN_MLME_SB_ID);
481 	return QDF_STATUS_SUCCESS;
482 }
483 
484 QDF_STATUS vdev_mgr_start_send(
485 			struct vdev_mlme_obj *mlme_obj,
486 			bool restart)
487 {
488 	QDF_STATUS status;
489 	struct vdev_start_params param = {0};
490 
491 	if (!mlme_obj) {
492 		mlme_err("VDEV_MLME is NULL");
493 		return QDF_STATUS_E_INVAL;
494 	}
495 
496 	status = vdev_mgr_start_param_update(mlme_obj, &param);
497 	if (QDF_IS_STATUS_ERROR(status)) {
498 		mlme_err("Param Update Error: %d", status);
499 		return status;
500 	}
501 
502 	param.is_restart = restart;
503 	status = tgt_vdev_mgr_start_send(mlme_obj, &param);
504 
505 	return status;
506 }
507 
508 static QDF_STATUS vdev_mgr_delete_param_update(
509 					struct vdev_mlme_obj *mlme_obj,
510 					struct vdev_delete_params *param)
511 {
512 	struct wlan_objmgr_vdev *vdev;
513 
514 	vdev = mlme_obj->vdev;
515 	if (!vdev) {
516 		mlme_err("VDEV is NULL");
517 		return QDF_STATUS_E_INVAL;
518 	}
519 
520 	param->vdev_id = wlan_vdev_get_id(vdev);
521 	return QDF_STATUS_SUCCESS;
522 }
523 
524 QDF_STATUS vdev_mgr_delete_send(struct vdev_mlme_obj *mlme_obj)
525 {
526 	QDF_STATUS status;
527 	struct vdev_delete_params param;
528 
529 	if (!mlme_obj) {
530 		mlme_err("VDEV_MLME is NULL");
531 		return QDF_STATUS_E_INVAL;
532 	}
533 
534 	status = vdev_mgr_delete_param_update(mlme_obj, &param);
535 	if (QDF_IS_STATUS_ERROR(status)) {
536 		mlme_err("Param Update Error: %d", status);
537 		return status;
538 	}
539 
540 	status = tgt_vdev_mgr_delete_send(mlme_obj, &param);
541 
542 	return status;
543 }
544 
545 static QDF_STATUS vdev_mgr_stop_param_update(
546 				struct vdev_mlme_obj *mlme_obj,
547 				struct vdev_stop_params *param)
548 {
549 	struct wlan_objmgr_vdev *vdev;
550 
551 	vdev = mlme_obj->vdev;
552 	if (!vdev) {
553 		mlme_err("VDEV is NULL");
554 		return QDF_STATUS_E_INVAL;
555 	}
556 
557 	param->vdev_id = wlan_vdev_get_id(vdev);
558 
559 	return QDF_STATUS_SUCCESS;
560 }
561 
562 QDF_STATUS vdev_mgr_stop_send(struct vdev_mlme_obj *mlme_obj)
563 {
564 	QDF_STATUS status;
565 	struct vdev_stop_params param = {0};
566 
567 	if (!mlme_obj) {
568 		mlme_err("VDEV_MLME is NULL");
569 		return QDF_STATUS_E_INVAL;
570 	}
571 
572 	status = vdev_mgr_stop_param_update(mlme_obj, &param);
573 	if (QDF_IS_STATUS_ERROR(status)) {
574 		mlme_err("Param Update Error: %d", status);
575 		return status;
576 	}
577 
578 	status = tgt_vdev_mgr_stop_send(mlme_obj, &param);
579 
580 	return status;
581 }
582 
583 static QDF_STATUS vdev_mgr_bcn_tmpl_param_update(
584 				struct vdev_mlme_obj *mlme_obj,
585 				struct beacon_tmpl_params *param)
586 {
587 	return QDF_STATUS_SUCCESS;
588 }
589 
590 static QDF_STATUS vdev_mgr_sta_ps_param_update(
591 				struct vdev_mlme_obj *mlme_obj,
592 				struct sta_ps_params *param)
593 {
594 	struct wlan_objmgr_vdev *vdev;
595 
596 	vdev = mlme_obj->vdev;
597 	param->vdev_id = wlan_vdev_get_id(vdev);
598 	param->param_id = WLAN_MLME_CFG_UAPSD;
599 	param->value = mlme_obj->proto.sta.uapsd_cfg;
600 	return QDF_STATUS_SUCCESS;
601 }
602 
603 static QDF_STATUS vdev_mgr_up_param_update(
604 				struct vdev_mlme_obj *mlme_obj,
605 				struct vdev_up_params *param)
606 {
607 	struct vdev_mlme_mbss_11ax *mbss;
608 	struct wlan_objmgr_vdev *vdev;
609 
610 	vdev = mlme_obj->vdev;
611 	param->vdev_id = wlan_vdev_get_id(vdev);
612 	param->assoc_id = mlme_obj->proto.sta.assoc_id;
613 	mbss = &mlme_obj->mgmt.mbss_11ax;
614 	param->profile_idx = mbss->profile_idx;
615 	param->profile_num = mbss->profile_num;
616 	qdf_mem_copy(param->trans_bssid, mbss->trans_bssid, QDF_MAC_ADDR_SIZE);
617 
618 	return QDF_STATUS_SUCCESS;
619 }
620 
621 QDF_STATUS vdev_mgr_up_send(struct vdev_mlme_obj *mlme_obj)
622 {
623 	QDF_STATUS status;
624 	struct vdev_up_params param = {0};
625 	struct sta_ps_params ps_param = {0};
626 	struct beacon_tmpl_params bcn_tmpl_param = {0};
627 	enum QDF_OPMODE opmode;
628 	struct wlan_objmgr_vdev *vdev;
629 	struct config_fils_params fils_param = {0};
630 	uint8_t is_6g_sap_fd_enabled;
631 	bool is_non_tx_vdev;
632 
633 	if (!mlme_obj) {
634 		mlme_err("VDEV_MLME is NULL");
635 		return QDF_STATUS_E_INVAL;
636 	}
637 
638 	vdev = mlme_obj->vdev;
639 	if (!vdev) {
640 		mlme_err("VDEV is NULL");
641 		return QDF_STATUS_E_INVAL;
642 	}
643 
644 	vdev_mgr_up_param_update(mlme_obj, &param);
645 	vdev_mgr_bcn_tmpl_param_update(mlme_obj, &bcn_tmpl_param);
646 
647 	opmode = wlan_vdev_mlme_get_opmode(vdev);
648 	if (opmode == QDF_STA_MODE) {
649 		vdev_mgr_sta_ps_param_update(mlme_obj, &ps_param);
650 		status = tgt_vdev_mgr_sta_ps_param_send(mlme_obj, &ps_param);
651 
652 	}
653 
654 	status = tgt_vdev_mgr_beacon_tmpl_send(mlme_obj, &bcn_tmpl_param);
655 	if (QDF_IS_STATUS_ERROR(status))
656 		return status;
657 
658 	status = tgt_vdev_mgr_up_send(mlme_obj, &param);
659 	if (QDF_IS_STATUS_ERROR(status))
660 		return status;
661 
662 	/* Reset the max channel switch time and last beacon sent time as the
663 	 * VDEV UP command sent to FW.
664 	 */
665 	mlme_obj->mgmt.ap.max_chan_switch_time = 0;
666 	mlme_obj->mgmt.ap.last_bcn_ts_ms = 0;
667 
668 	is_6g_sap_fd_enabled = wlan_vdev_mlme_feat_ext_cap_get(vdev,
669 					WLAN_VDEV_FEXT_FILS_DISC_6G_SAP);
670 	mlme_debug("SAP FD enabled %d", is_6g_sap_fd_enabled);
671 
672 	/*
673 	 * In case of a non-tx vdev, 'profile_num' must be greater
674 	 * than 0 indicating one or more non-tx vdev and 'profile_idx'
675 	 * must be in the range [1, 2^n] where n is the max bssid
676 	 * indicator
677 	 */
678 	is_non_tx_vdev = param.profile_num && param.profile_idx;
679 
680 	if (opmode == QDF_SAP_MODE && mlme_obj->vdev->vdev_mlme.des_chan &&
681 	    WLAN_REG_IS_6GHZ_CHAN_FREQ(
682 			mlme_obj->vdev->vdev_mlme.des_chan->ch_freq) &&
683 		!is_non_tx_vdev) {
684 		fils_param.vdev_id = wlan_vdev_get_id(mlme_obj->vdev);
685 		if (is_6g_sap_fd_enabled) {
686 			fils_param.fd_period = DEFAULT_FILS_DISCOVERY_PERIOD;
687 		} else {
688 			fils_param.send_prb_rsp_frame = true;
689 			fils_param.fd_period = DEFAULT_PROBE_RESP_PERIOD;
690 		}
691 		status = tgt_vdev_mgr_fils_enable_send(mlme_obj,
692 						       &fils_param);
693 	}
694 
695 	return status;
696 }
697 
698 static QDF_STATUS vdev_mgr_down_param_update(
699 					struct vdev_mlme_obj *mlme_obj,
700 					struct vdev_down_params *param)
701 {
702 	struct wlan_objmgr_vdev *vdev;
703 
704 	vdev = mlme_obj->vdev;
705 	if (!vdev) {
706 		mlme_err("VDEV is NULL");
707 		return QDF_STATUS_E_INVAL;
708 	}
709 
710 	param->vdev_id = wlan_vdev_get_id(vdev);
711 
712 	return QDF_STATUS_SUCCESS;
713 }
714 
715 QDF_STATUS vdev_mgr_down_send(struct vdev_mlme_obj *mlme_obj)
716 {
717 	QDF_STATUS status;
718 	struct vdev_down_params param = {0};
719 
720 	if (!mlme_obj) {
721 		mlme_err("VDEV_MLME is NULL");
722 		return QDF_STATUS_E_INVAL;
723 	}
724 
725 	status = vdev_mgr_down_param_update(mlme_obj, &param);
726 	if (QDF_IS_STATUS_ERROR(status)) {
727 		mlme_err("Param Update Error: %d", status);
728 		return status;
729 	}
730 
731 	status = tgt_vdev_mgr_down_send(mlme_obj, &param);
732 
733 	return status;
734 }
735 
736 static QDF_STATUS vdev_mgr_peer_flush_tids_param_update(
737 					struct vdev_mlme_obj *mlme_obj,
738 					struct peer_flush_params *param,
739 					uint8_t *mac,
740 					uint32_t peer_tid_bitmap)
741 {
742 	struct wlan_objmgr_vdev *vdev;
743 
744 	vdev = mlme_obj->vdev;
745 	if (!vdev) {
746 		mlme_err("VDEV is NULL");
747 		return QDF_STATUS_E_INVAL;
748 	}
749 
750 	param->vdev_id = wlan_vdev_get_id(vdev);
751 	param->peer_tid_bitmap = peer_tid_bitmap;
752 	qdf_mem_copy(param->peer_mac, mac, QDF_MAC_ADDR_SIZE);
753 	return QDF_STATUS_SUCCESS;
754 }
755 
756 QDF_STATUS vdev_mgr_peer_flush_tids_send(struct vdev_mlme_obj *mlme_obj,
757 					 uint8_t *mac,
758 					 uint32_t peer_tid_bitmap)
759 {
760 	QDF_STATUS status;
761 	struct peer_flush_params param = {0};
762 
763 	if (!mlme_obj || !mac) {
764 		mlme_err("Invalid input");
765 		return QDF_STATUS_E_INVAL;
766 	}
767 
768 	status = vdev_mgr_peer_flush_tids_param_update(mlme_obj, &param,
769 						       mac, peer_tid_bitmap);
770 	if (QDF_IS_STATUS_ERROR(status)) {
771 		mlme_err("Param Update Error: %d", status);
772 		return status;
773 	}
774 
775 	status = tgt_vdev_mgr_peer_flush_tids_send(mlme_obj, &param);
776 
777 	return status;
778 }
779 
780 static QDF_STATUS vdev_mgr_multiple_restart_param_update(
781 				struct wlan_objmgr_pdev *pdev,
782 				struct mlme_channel_param *chan,
783 				uint32_t disable_hw_ack,
784 				uint32_t *vdev_ids,
785 				uint32_t num_vdevs,
786 				struct vdev_mlme_mvr_param *mvr_param,
787 				struct multiple_vdev_restart_params *param)
788 {
789 	param->pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
790 	param->requestor_id = MULTIPLE_VDEV_RESTART_REQ_ID;
791 	param->disable_hw_ack = disable_hw_ack;
792 	param->cac_duration_ms = WLAN_DFS_WAIT_MS;
793 	param->num_vdevs = num_vdevs;
794 
795 	qdf_mem_copy(param->vdev_ids, vdev_ids,
796 		     sizeof(uint32_t) * (param->num_vdevs));
797 	qdf_mem_copy(&param->ch_param, chan,
798 		     sizeof(struct mlme_channel_param));
799 	qdf_mem_copy(param->mvr_param, mvr_param,
800 		     sizeof(*mvr_param) * (param->num_vdevs));
801 
802 	return QDF_STATUS_SUCCESS;
803 }
804 
805 QDF_STATUS vdev_mgr_multiple_restart_send(struct wlan_objmgr_pdev *pdev,
806 					  struct mlme_channel_param *chan,
807 					  uint32_t disable_hw_ack,
808 					  uint32_t *vdev_ids,
809 					  uint32_t num_vdevs,
810 					  struct vdev_mlme_mvr_param *mvr_param)
811 {
812 	struct multiple_vdev_restart_params param = {0};
813 
814 	vdev_mgr_multiple_restart_param_update(pdev, chan,
815 					       disable_hw_ack,
816 					       vdev_ids, num_vdevs,
817 					       mvr_param, &param);
818 
819 	return tgt_vdev_mgr_multiple_vdev_restart_send(pdev, &param);
820 }
821 
822 qdf_export_symbol(vdev_mgr_multiple_restart_send);
823 
824 static QDF_STATUS vdev_mgr_set_custom_aggr_size_param_update(
825 				struct vdev_mlme_obj *mlme_obj,
826 				struct set_custom_aggr_size_params *param,
827 				bool is_amsdu)
828 {
829 	struct wlan_objmgr_vdev *vdev;
830 
831 	vdev = mlme_obj->vdev;
832 	if (!vdev) {
833 		mlme_err("VDEV is NULL");
834 		return QDF_STATUS_E_INVAL;
835 	}
836 
837 	param->aggr_type = is_amsdu ? WLAN_MLME_CUSTOM_AGGR_TYPE_AMSDU
838 				    : WLAN_MLME_CUSTOM_AGGR_TYPE_AMPDU;
839 	/*
840 	 * We are only setting TX params, therefore
841 	 * we are disabling rx_aggr_size
842 	 */
843 	param->rx_aggr_size_disable = true;
844 	param->tx_aggr_size = is_amsdu ? mlme_obj->mgmt.generic.amsdu
845 				       : mlme_obj->mgmt.generic.ampdu;
846 	param->vdev_id = wlan_vdev_get_id(vdev);
847 
848 	return QDF_STATUS_SUCCESS;
849 }
850 
851 QDF_STATUS vdev_mgr_set_custom_aggr_size_send(
852 				struct vdev_mlme_obj *vdev_mlme,
853 				bool is_amsdu)
854 {
855 	QDF_STATUS status;
856 	struct set_custom_aggr_size_params param = {0};
857 
858 	status = vdev_mgr_set_custom_aggr_size_param_update(vdev_mlme,
859 							    &param, is_amsdu);
860 	if (QDF_IS_STATUS_ERROR(status)) {
861 		mlme_err("Param Update Error: %d", status);
862 		return status;
863 	}
864 
865 	return tgt_vdev_mgr_set_custom_aggr_size_send(vdev_mlme, &param);
866 }
867 
868 static QDF_STATUS vdev_mgr_peer_delete_all_param_update(
869 				struct vdev_mlme_obj *mlme_obj,
870 				struct peer_delete_all_params *param)
871 {
872 	struct wlan_objmgr_vdev *vdev;
873 
874 	vdev = mlme_obj->vdev;
875 	if (!vdev) {
876 		mlme_err("VDEV is NULL");
877 		return QDF_STATUS_E_INVAL;
878 	}
879 
880 	param->vdev_id = wlan_vdev_get_id(vdev);
881 	return QDF_STATUS_SUCCESS;
882 }
883 
884 QDF_STATUS vdev_mgr_peer_delete_all_send(struct vdev_mlme_obj *mlme_obj)
885 {
886 	QDF_STATUS status;
887 	struct peer_delete_all_params param = {0};
888 
889 	if (!mlme_obj) {
890 		mlme_err("Invalid input");
891 		return QDF_STATUS_E_INVAL;
892 	}
893 
894 	status = vdev_mgr_peer_delete_all_param_update(mlme_obj, &param);
895 	if (QDF_IS_STATUS_ERROR(status)) {
896 		mlme_err("Param Update Error: %d", status);
897 		return status;
898 	}
899 
900 	status = tgt_vdev_mgr_peer_delete_all_send(mlme_obj, &param);
901 
902 	return status;
903 }
904 
905 #ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE
906 QDF_STATUS vdev_mgr_send_set_mac_addr(struct qdf_mac_addr mac_addr,
907 				      struct qdf_mac_addr mld_addr,
908 				      struct wlan_objmgr_vdev *vdev)
909 {
910 	return tgt_vdev_mgr_send_set_mac_addr(mac_addr, mld_addr, vdev);
911 }
912 
913 QDF_STATUS vdev_mgr_cdp_vdev_attach(struct vdev_mlme_obj *mlme_obj)
914 {
915 	return tgt_vdev_mgr_cdp_vdev_attach(mlme_obj);
916 }
917 
918 QDF_STATUS vdev_mgr_cdp_vdev_detach(struct vdev_mlme_obj *mlme_obj)
919 {
920 	return tgt_vdev_mgr_cdp_vdev_detach(mlme_obj);
921 }
922 #endif
923