1 /*
2  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2024 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  * DOC: define internal APIs related to the mlme component, legacy APIs are
21  *	called for the time being, but will be cleaned up after convergence
22  */
23 #include "wlan_mlme_main.h"
24 #include "wlan_mlme_vdev_mgr_interface.h"
25 #include "lim_utils.h"
26 #include "wma_api.h"
27 #include "wma.h"
28 #include "lim_types.h"
29 #include <include/wlan_mlme_cmn.h>
30 #include <../../core/src/vdev_mgr_ops.h>
31 #include "wlan_psoc_mlme_api.h"
32 #include "target_if_cm_roam_offload.h"
33 #include "wlan_crypto_global_api.h"
34 #include "target_if_wfa_testcmd.h"
35 #include <../../core/src/wlan_cm_vdev_api.h>
36 #include "csr_api.h"
37 #include <cm_utf.h>
38 #include "target_if_cm_roam_event.h"
39 #include "wlan_cm_roam_api.h"
40 #include "wifi_pos_api.h"
41 #ifdef WLAN_FEATURE_11BE_MLO
42 #include <wlan_mlo_mgr_public_structs.h>
43 #include <wlan_mlo_mgr_cmn.h>
44 #include <lim_mlo.h>
45 #include "wlan_mlo_mgr_sta.h"
46 #endif
47 #include <wlan_lmac_if_def.h>
48 #include "target_if_mlme.h"
49 #include "wlan_mlo_mgr_sta.h"
50 #include "wlan_cp_stats_mc_tgt_api.h"
51 #include "wlan_objmgr_pdev_obj.h"
52 
53 static struct vdev_mlme_ops sta_mlme_ops;
54 static struct vdev_mlme_ops ap_mlme_ops;
55 static struct vdev_mlme_ops mon_mlme_ops;
56 static struct mlme_ext_ops ext_ops;
57 #ifdef WLAN_FEATURE_11BE_MLO
58 static struct mlo_mlme_ext_ops mlo_ext_ops;
59 #endif
60 
mlme_is_vdev_in_beaconning_mode(enum QDF_OPMODE vdev_opmode)61 bool mlme_is_vdev_in_beaconning_mode(enum QDF_OPMODE vdev_opmode)
62 {
63 	switch (vdev_opmode) {
64 	case QDF_SAP_MODE:
65 	case QDF_P2P_GO_MODE:
66 	case QDF_IBSS_MODE:
67 	case QDF_NDI_MODE:
68 		return true;
69 	default:
70 		return false;
71 	}
72 }
73 
74 /**
75  * mlme_get_global_ops() - Register ext global ops
76  *
77  * Return: ext_ops global ops
78  */
mlme_get_global_ops(void)79 static struct mlme_ext_ops *mlme_get_global_ops(void)
80 {
81 	return &ext_ops;
82 }
83 
mlme_register_mlme_ext_ops(void)84 QDF_STATUS mlme_register_mlme_ext_ops(void)
85 {
86 	mlme_set_ops_register_cb(mlme_get_global_ops);
87 
88 	/* Overwrite with UTF cb if UTF enabled */
89 	cm_utf_set_mlme_ops(mlme_get_global_ops());
90 	return QDF_STATUS_SUCCESS;
91 }
92 
93 #ifdef WLAN_FEATURE_11BE_MLO
mlme_register_mlo_ext_ops(void)94 QDF_STATUS mlme_register_mlo_ext_ops(void)
95 {
96 	QDF_STATUS status;
97 	struct mlo_mgr_context *mlo_ctx = wlan_objmgr_get_mlo_ctx();
98 
99 	if (!mlo_ctx)
100 		return QDF_STATUS_E_FAILURE;
101 
102 	mlo_reg_mlme_ext_cb(mlo_ctx, &mlo_ext_ops);
103 
104 	status = mlo_mgr_register_link_switch_notifier(WLAN_UMAC_COMP_MLME,
105 						       wlan_cm_link_switch_notif_cb);
106 	if (status == QDF_STATUS_E_NOSUPPORT) {
107 		status = QDF_STATUS_SUCCESS;
108 		mlme_debug("Link switch not supported");
109 	} else if (QDF_IS_STATUS_ERROR(status)) {
110 		mlme_err("Failed to register link switch notifier for mlme!");
111 	}
112 
113 	return status;
114 }
115 
mlme_unregister_mlo_ext_ops(void)116 QDF_STATUS mlme_unregister_mlo_ext_ops(void)
117 {
118 	struct mlo_mgr_context *mlo_ctx = wlan_objmgr_get_mlo_ctx();
119 
120 	if (mlo_ctx)
121 		mlo_unreg_mlme_ext_cb(mlo_ctx);
122 
123 	return QDF_STATUS_SUCCESS;
124 }
125 #else
mlme_register_mlo_ext_ops(void)126 QDF_STATUS mlme_register_mlo_ext_ops(void)
127 {
128 	return QDF_STATUS_SUCCESS;
129 }
130 
mlme_unregister_mlo_ext_ops(void)131 QDF_STATUS mlme_unregister_mlo_ext_ops(void)
132 {
133 	return QDF_STATUS_SUCCESS;
134 }
135 #endif
136 /**
137  * mlme_register_vdev_mgr_ops() - Register vdev mgr ops
138  * @vdev_mlme: vdev mlme object
139  *
140  * This function is called to register vdev manager operations
141  *
142  * Return: QDF_STATUS
143  */
mlme_register_vdev_mgr_ops(struct vdev_mlme_obj * vdev_mlme)144 QDF_STATUS mlme_register_vdev_mgr_ops(struct vdev_mlme_obj *vdev_mlme)
145 {
146 	struct wlan_objmgr_vdev *vdev;
147 
148 	vdev = vdev_mlme->vdev;
149 
150 	if (mlme_is_vdev_in_beaconning_mode(vdev->vdev_mlme.vdev_opmode))
151 		vdev_mlme->ops = &ap_mlme_ops;
152 	else if (vdev->vdev_mlme.vdev_opmode == QDF_MONITOR_MODE)
153 		vdev_mlme->ops = &mon_mlme_ops;
154 	else
155 		vdev_mlme->ops = &sta_mlme_ops;
156 
157 	return QDF_STATUS_SUCCESS;
158 }
159 
160 /**
161  * mlme_unregister_vdev_mgr_ops() - Unregister vdev mgr ops
162  * @vdev_mlme: vdev mlme object
163  *
164  * This function is called to unregister vdev manager operations
165  *
166  * Return: QDF_STATUS
167  */
mlme_unregister_vdev_mgr_ops(struct vdev_mlme_obj * vdev_mlme)168 QDF_STATUS mlme_unregister_vdev_mgr_ops(struct vdev_mlme_obj *vdev_mlme)
169 {
170 	return QDF_STATUS_SUCCESS;
171 }
172 
173 /**
174  * sta_mlme_vdev_start_send() - MLME vdev start callback
175  * @vdev_mlme: vdev mlme object
176  * @event_data_len: event data length
177  * @event_data: event data
178  *
179  * This function is called to initiate actions of VDEV.start
180  *
181  * Return: QDF_STATUS
182  */
sta_mlme_vdev_start_send(struct vdev_mlme_obj * vdev_mlme,uint16_t event_data_len,void * event_data)183 static QDF_STATUS sta_mlme_vdev_start_send(struct vdev_mlme_obj *vdev_mlme,
184 					   uint16_t event_data_len,
185 					   void *event_data)
186 {
187 	mlme_legacy_debug("vdev id = %d ",
188 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
189 	return lim_sta_mlme_vdev_start_send(vdev_mlme, event_data_len,
190 					    event_data);
191 }
192 
193 /**
194  * sta_mlme_start_continue() - vdev start rsp callback
195  * @vdev_mlme: vdev mlme object
196  * @data_len: event data length
197  * @data: event data
198  *
199  * This function is called to handle the VDEV START/RESTART callback
200  *
201  * Return: QDF_STATUS
202  */
sta_mlme_start_continue(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)203 static QDF_STATUS sta_mlme_start_continue(struct vdev_mlme_obj *vdev_mlme,
204 					  uint16_t data_len, void *data)
205 {
206 	mlme_legacy_debug("vdev id = %d ",
207 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
208 	return wma_sta_mlme_vdev_start_continue(vdev_mlme, data_len, data);
209 }
210 
211 /**
212  * sta_mlme_vdev_restart_send() - MLME vdev restart send
213  * @vdev_mlme: vdev mlme object
214  * @event_data_len: event data length
215  * @event_data: event data
216  *
217  * This function is called to initiate actions of VDEV.start
218  *
219  * Return: QDF_STATUS
220  */
sta_mlme_vdev_restart_send(struct vdev_mlme_obj * vdev_mlme,uint16_t event_data_len,void * event_data)221 static QDF_STATUS sta_mlme_vdev_restart_send(struct vdev_mlme_obj *vdev_mlme,
222 					     uint16_t event_data_len,
223 					     void *event_data)
224 {
225 	mlme_legacy_debug("vdev id = %d ",
226 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
227 	return lim_sta_mlme_vdev_restart_send(vdev_mlme, event_data_len,
228 					    event_data);
229 }
230 
231 /**
232  * sta_mlme_vdev_start_req_failed() - MLME start fail callback
233  * @vdev_mlme: vdev mlme object
234  * @data_len: event data length
235  * @data: event data
236  *
237  * This function is called to send the vdev stop to firmware
238  *
239  * Return: QDF_STATUS
240  */
sta_mlme_vdev_start_req_failed(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)241 static QDF_STATUS sta_mlme_vdev_start_req_failed(struct vdev_mlme_obj *vdev_mlme,
242 						 uint16_t data_len,
243 						 void *data)
244 {
245 	mlme_legacy_debug("vdev id = %d ",
246 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
247 	return lim_sta_mlme_vdev_req_fail(vdev_mlme, data_len, data);
248 }
249 
250 /**
251  * sta_mlme_vdev_start_connection() - MLME vdev start callback
252  * @vdev_mlme: vdev mlme object
253  * @event_data_len: event data length
254  * @event_data: event data
255  *
256  * This function is called to initiate actions of STA connection
257  *
258  * Return: QDF_STATUS
259  */
sta_mlme_vdev_start_connection(struct vdev_mlme_obj * vdev_mlme,uint16_t event_data_len,void * event_data)260 static QDF_STATUS sta_mlme_vdev_start_connection(struct vdev_mlme_obj *vdev_mlme,
261 						 uint16_t event_data_len,
262 						 void *event_data)
263 {
264 	mlme_legacy_debug("vdev id = %d ",
265 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
266 	return QDF_STATUS_SUCCESS;
267 }
268 
269 #if defined WLAN_FEATURE_SR
mlme_sr_is_enable(struct wlan_objmgr_vdev * vdev)270 int mlme_sr_is_enable(struct wlan_objmgr_vdev *vdev)
271 {
272 	uint8_t sr_ctrl;
273 
274 	sr_ctrl = wlan_vdev_mlme_get_sr_ctrl(vdev);
275 	return (!sr_ctrl || !(sr_ctrl & NON_SRG_PD_SR_DISALLOWED) ||
276 		(sr_ctrl & SRG_INFO_PRESENT));
277 }
278 
279 /**
280  * mlme_sr_handle_conc(): Handle concurrency scenario i.e Single MAC
281  * concurrency is not supoprted for SR, Disable SR if it is enable on other
282  * VDEV and enable it back once the once the concurrent vdev is down.
283  *
284  * @vdev: object manager vdev
285  * @conc_vdev: cuncurrent vdev object
286  * @en_sr_curr_vdev: indicates spatial reuse enable/disable
287  *
288  */
289 static void
mlme_sr_handle_conc(struct wlan_objmgr_vdev * vdev,struct wlan_objmgr_vdev * conc_vdev,bool en_sr_curr_vdev)290 mlme_sr_handle_conc(struct wlan_objmgr_vdev *vdev,
291 		    struct wlan_objmgr_vdev *conc_vdev, bool en_sr_curr_vdev)
292 {
293 	uint32_t val = 0;
294 	struct wlan_objmgr_pdev *pdev;
295 	struct wlan_objmgr_psoc *psoc;
296 	struct wlan_lmac_if_tx_ops *tx_ops;
297 	struct wlan_lmac_if_spatial_reuse_tx_ops *sr_tx_ops;
298 	uint8_t conc_vdev_id = wlan_vdev_get_id(conc_vdev);
299 
300 	pdev = wlan_vdev_get_pdev(vdev);
301 	if (!pdev) {
302 		mlme_err("pdev is NULL");
303 		return;
304 	}
305 
306 	psoc = wlan_vdev_get_psoc(vdev);
307 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
308 	if (!tx_ops) {
309 		mlme_err("tx_ops is NULL");
310 		return;
311 	}
312 
313 	sr_tx_ops = &tx_ops->spatial_reuse_tx_ops;
314 	if (en_sr_curr_vdev) {
315 		wlan_vdev_mlme_set_sr_disable_due_conc(vdev, true);
316 		wlan_vdev_mlme_set_sr_disable_due_conc(conc_vdev, true);
317 
318 		if (!wlan_vdev_mlme_get_he_spr_enabled(conc_vdev))
319 			return;
320 
321 		if (mlme_sr_is_enable(conc_vdev)) {
322 			if (sr_tx_ops->target_if_sr_update)
323 				sr_tx_ops->target_if_sr_update
324 						(pdev, conc_vdev_id, val);
325 
326 			wlan_spatial_reuse_osif_event(conc_vdev,
327 						      SR_OPERATION_SUSPEND,
328 						   SR_REASON_CODE_CONCURRENCY);
329 		}
330 	} else if (wlan_vdev_mlme_is_sr_disable_due_conc(conc_vdev)) {
331 		wlan_vdev_mlme_set_sr_disable_due_conc(conc_vdev, false);
332 
333 		if (!wlan_vdev_mlme_get_he_spr_enabled(conc_vdev))
334 			return;
335 
336 		if (mlme_sr_is_enable(conc_vdev)) {
337 			wlan_mlme_update_sr_data(conc_vdev, &val, 0, 0, true);
338 
339 			if (sr_tx_ops->target_if_sr_update)
340 				sr_tx_ops->target_if_sr_update
341 						(pdev, conc_vdev_id, val);
342 
343 			wlan_spatial_reuse_osif_event(conc_vdev,
344 						      SR_OPERATION_RESUME,
345 						      SR_REASON_CODE_CONCURRENCY);
346 		} else {
347 			mlme_debug("SR Disabled in SR Control");
348 		}
349 	}
350 }
351 
mlme_sr_update(struct wlan_objmgr_vdev * vdev,bool enable)352 void mlme_sr_update(struct wlan_objmgr_vdev *vdev, bool enable)
353 {
354 	struct wlan_objmgr_vdev *conc_vdev;
355 	struct wlan_objmgr_psoc *psoc;
356 	struct wlan_objmgr_pdev *pdev;
357 	struct wlan_lmac_if_tx_ops *tx_ops;
358 	uint32_t conc_vdev_id;
359 	uint32_t val = 0;
360 	uint8_t vdev_id;
361 	uint8_t mac_id;
362 
363 	if (!vdev) {
364 		mlme_err("vdev is NULL");
365 		return;
366 	}
367 	vdev_id = wlan_vdev_get_id(vdev);
368 
369 	pdev = wlan_vdev_get_pdev(vdev);
370 	if (!pdev) {
371 		mlme_err("pdev is NULL");
372 		return;
373 	}
374 
375 	psoc = wlan_vdev_get_psoc(vdev);
376 	if (!psoc) {
377 		mlme_err("psoc is NULL");
378 		return;
379 	}
380 
381 	policy_mgr_get_mac_id_by_session_id(psoc, vdev_id, &mac_id);
382 	conc_vdev_id = policy_mgr_get_conc_vdev_on_same_mac(psoc, vdev_id,
383 							    mac_id);
384 	if (conc_vdev_id != WLAN_INVALID_VDEV_ID &&
385 	    !policy_mgr_sr_same_mac_conc_enabled(psoc)) {
386 		/*
387 		 * Single MAC concurrency is not supoprted for SR,
388 		 * Disable SR if it is enable on other VDEV and enable
389 		 * it back once the once the concurrent vdev is down.
390 		 */
391 		mlme_debug("SR with concurrency is not allowed");
392 		conc_vdev =
393 		wlan_objmgr_get_vdev_by_id_from_psoc(psoc, conc_vdev_id,
394 						     WLAN_MLME_SB_ID);
395 		if (!conc_vdev) {
396 			mlme_err("Can't get vdev by vdev_id:%d", conc_vdev_id);
397 		} else {
398 			mlme_sr_handle_conc(vdev, conc_vdev, enable);
399 			wlan_objmgr_vdev_release_ref(conc_vdev,
400 						     WLAN_MLME_SB_ID);
401 			goto err;
402 		}
403 	}
404 
405 	if (!wlan_vdev_mlme_get_he_spr_enabled(vdev)) {
406 		mlme_err("Spatial Reuse disabled for vdev_id: %d", vdev_id);
407 		goto err;
408 	}
409 
410 	if (mlme_sr_is_enable(vdev)) {
411 		if (enable) {
412 			wlan_mlme_update_sr_data(vdev, &val, 0, 0, true);
413 		} else {
414 			/* VDEV down, disable SR */
415 			wlan_vdev_mlme_set_he_spr_enabled(vdev, false);
416 			wlan_vdev_mlme_set_sr_ctrl(vdev, 0);
417 			wlan_vdev_mlme_set_non_srg_pd_offset(vdev, 0);
418 		}
419 
420 		mlme_debug("SR param val: %x, Enable: %x", val, enable);
421 
422 		tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
423 		if (tx_ops && tx_ops->spatial_reuse_tx_ops.target_if_sr_update)
424 			tx_ops->spatial_reuse_tx_ops.target_if_sr_update
425 							(pdev, vdev_id, val);
426 	} else {
427 		mlme_debug("Spatial reuse is disabled in SR control");
428 	}
429 err:
430 	return;
431 }
432 #endif
433 
434 /**
435  * sta_mlme_vdev_up_send() - MLME vdev UP callback
436  * @vdev_mlme: vdev mlme object
437  * @event_data_len: event data length
438  * @event_data: event data
439  *
440  * This function is called to send the vdev up command
441  *
442  * Return: QDF_STATUS
443  */
sta_mlme_vdev_up_send(struct vdev_mlme_obj * vdev_mlme,uint16_t event_data_len,void * event_data)444 static QDF_STATUS sta_mlme_vdev_up_send(struct vdev_mlme_obj *vdev_mlme,
445 					uint16_t event_data_len,
446 					void *event_data)
447 {
448 	QDF_STATUS status;
449 
450 	mlme_legacy_debug("vdev id = %d ",
451 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
452 	status = wma_sta_vdev_up_send(vdev_mlme, event_data_len, event_data);
453 
454 	if (QDF_IS_STATUS_SUCCESS(status))
455 		mlme_sr_update(vdev_mlme->vdev, true);
456 
457 	return status;
458 }
459 
460 /**
461  * sta_mlme_vdev_notify_up_complete() - MLME vdev UP complete callback
462  * @vdev_mlme: vdev mlme object
463  * @event_data_len: event data length
464  * @event_data: event data
465  *
466  * This function is called to VDEV MLME on moving
467  *  to UP state
468  *
469  * Return: QDF_STATUS
470  */
sta_mlme_vdev_notify_up_complete(struct vdev_mlme_obj * vdev_mlme,uint16_t event_data_len,void * event_data)471 static QDF_STATUS sta_mlme_vdev_notify_up_complete(struct vdev_mlme_obj *vdev_mlme,
472 						   uint16_t event_data_len,
473 						   void *event_data)
474 {
475 	mlme_legacy_debug("vdev id = %d ",
476 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
477 	return QDF_STATUS_SUCCESS;
478 }
479 
480 /**
481  * sta_mlme_vdev_notify_roam_start() - MLME vdev Roam start callback
482  * @vdev_mlme: vdev mlme object
483  * @event_data_len: event data length
484  * @event_data: event data
485  *
486  * This function is called to VDEV MLME on roaming
487  *  to UP state
488  *
489  * Return: QDF_STATUS
490  */
491 static
sta_mlme_vdev_notify_roam_start(struct vdev_mlme_obj * vdev_mlme,uint16_t event_data_len,void * event_data)492 QDF_STATUS sta_mlme_vdev_notify_roam_start(struct vdev_mlme_obj *vdev_mlme,
493 					   uint16_t event_data_len,
494 					   void *event_data)
495 {
496 	mlme_legacy_debug("vdev id = %d ",
497 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
498 	return wlan_cm_sta_mlme_vdev_roam_notify(vdev_mlme, event_data_len,
499 						 event_data);
500 }
501 
502 /**
503  * sta_mlme_vdev_disconnect_bss() - MLME vdev disconnect bss callback
504  * @vdev_mlme: vdev mlme object
505  * @event_data_len: event data length
506  * @event_data: event data
507  * @is_disconnect_legacy_only: flag to indicate legacy disconnect
508  *
509  * This function is called to disconnect BSS/send deauth to AP
510  *
511  * Return: QDF_STATUS
512  */
sta_mlme_vdev_disconnect_bss(struct vdev_mlme_obj * vdev_mlme,uint16_t event_data_len,void * event_data,bool is_disconnect_legacy_only)513 static QDF_STATUS sta_mlme_vdev_disconnect_bss(struct vdev_mlme_obj *vdev_mlme,
514 					       uint16_t event_data_len,
515 					       void *event_data,
516 					       bool is_disconnect_legacy_only)
517 {
518 	mlme_legacy_debug("vdev id = %d ",
519 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
520 	return lim_sta_mlme_vdev_disconnect_bss(vdev_mlme, event_data_len,
521 						event_data);
522 }
523 
524 /**
525  * sta_mlme_vdev_stop_send() - MLME vdev stop send callback
526  * @vdev_mlme: vdev mlme object
527  * @data_len: event data length
528  * @data: event data
529  *
530  * This function is called to send the vdev stop to firmware
531  *
532  * Return: QDF_STATUS
533  */
sta_mlme_vdev_stop_send(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)534 static QDF_STATUS sta_mlme_vdev_stop_send(struct vdev_mlme_obj *vdev_mlme,
535 					  uint16_t data_len,
536 					  void *data)
537 {
538 	mlme_legacy_debug("vdev id = %d ",
539 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
540 	return lim_sta_mlme_vdev_stop_send(vdev_mlme, data_len, data);
541 }
542 
543 /**
544  * sta_mlme_vdev_sta_disconnect_start() - MLME vdev disconnect send callback
545  * @vdev_mlme: vdev mlme object
546  * @data_len: event data length
547  * @data: event data
548  *
549  * This function is called to trigger the vdev stop to firmware when
550  * reassoc failure
551  *
552  * Return: QDF_STATUS
553  */
554 static QDF_STATUS
sta_mlme_vdev_sta_disconnect_start(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)555 sta_mlme_vdev_sta_disconnect_start(struct vdev_mlme_obj *vdev_mlme,
556 				   uint16_t data_len, void *data)
557 {
558 	mlme_legacy_debug("vdev id = %d ",
559 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
560 	return lim_sta_mlme_vdev_sta_disconnect_start(vdev_mlme, data_len,
561 						      data);
562 }
563 
564 /**
565  * vdevmgr_mlme_stop_continue() - MLME vdev stop send callback
566  * @vdev_mlme: vdev mlme object
567  * @data_len: event data length
568  * @data: event data
569  *
570  * This function is called to initiate operations on
571  * LMAC/FW stop response such as remove peer.
572  *
573  * Return: QDF_STATUS
574  */
vdevmgr_mlme_stop_continue(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)575 static QDF_STATUS vdevmgr_mlme_stop_continue(struct vdev_mlme_obj *vdev_mlme,
576 					     uint16_t data_len,
577 					     void *data)
578 {
579 	mlme_legacy_debug("vdev id = %d ",
580 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
581 	return wma_mlme_vdev_stop_continue(vdev_mlme, data_len, data);
582 }
583 
584 /**
585  * ap_mlme_vdev_start_send () - send vdev start req
586  * @vdev_mlme: vdev mlme object
587  * @data_len: event data length
588  * @data: event data
589  *
590  * This function is called to initiate actions of VDEV start ie start bss
591  *
592  * Return: QDF_STATUS
593  */
ap_mlme_vdev_start_send(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)594 static QDF_STATUS ap_mlme_vdev_start_send(struct vdev_mlme_obj *vdev_mlme,
595 					  uint16_t data_len, void *data)
596 {
597 	mlme_legacy_debug("vdev id = %d ",
598 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
599 	return lim_ap_mlme_vdev_start_send(vdev_mlme, data_len, data);
600 }
601 
602 /**
603  * ap_mlme_start_continue () - vdev start rsp callback
604  * @vdev_mlme: vdev mlme object
605  * @data_len: event data length
606  * @data: event data
607  *
608  * This function is called to handle the VDEV START/RESTART callback
609  *
610  * Return: QDF_STATUS
611  */
ap_mlme_start_continue(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)612 static QDF_STATUS ap_mlme_start_continue(struct vdev_mlme_obj *vdev_mlme,
613 					 uint16_t data_len, void *data)
614 {
615 	mlme_legacy_debug("vdev id = %d ",
616 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
617 	mlme_set_notify_co_located_ap_update_rnr(vdev_mlme->vdev, true);
618 
619 	return wma_ap_mlme_vdev_start_continue(vdev_mlme, data_len, data);
620 }
621 
622 /**
623  * ap_mlme_vdev_update_beacon() - callback to initiate beacon update
624  * @vdev_mlme: vdev mlme object
625  * @op: beacon operation
626  * @data_len: event data length
627  * @data: event data
628  *
629  * This function is called to update beacon
630  *
631  * Return: QDF_STATUS
632  */
ap_mlme_vdev_update_beacon(struct vdev_mlme_obj * vdev_mlme,enum beacon_update_op op,uint16_t data_len,void * data)633 static QDF_STATUS ap_mlme_vdev_update_beacon(struct vdev_mlme_obj *vdev_mlme,
634 					     enum beacon_update_op op,
635 					     uint16_t data_len, void *data)
636 {
637 	mlme_legacy_debug("vdev id = %d ",
638 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
639 	return lim_ap_mlme_vdev_update_beacon(vdev_mlme, op, data_len, data);
640 }
641 
642 /**
643  * ap_mlme_vdev_up_send() - callback to send vdev up
644  * @vdev_mlme: vdev mlme object
645  * @data_len: event data length
646  * @data: event data
647  *
648  * This function is called to send vdev up req
649  *
650  * Return: QDF_STATUS
651  */
ap_mlme_vdev_up_send(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)652 static QDF_STATUS ap_mlme_vdev_up_send(struct vdev_mlme_obj *vdev_mlme,
653 				       uint16_t data_len, void *data)
654 {
655 	mlme_legacy_debug("vdev id = %d ",
656 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
657 	return lim_ap_mlme_vdev_up_send(vdev_mlme, data_len, data);
658 }
659 
660 #ifdef WLAN_FEATURE_11BE_MLO
wlan_handle_emlsr_sta_concurrency(struct wlan_objmgr_psoc * psoc,bool conc_con_coming_up,bool emlsr_sta_coming_up)661 void wlan_handle_emlsr_sta_concurrency(struct wlan_objmgr_psoc *psoc,
662 				       bool conc_con_coming_up,
663 				       bool emlsr_sta_coming_up)
664 {
665 	policy_mgr_handle_emlsr_sta_concurrency(psoc, conc_con_coming_up,
666 						emlsr_sta_coming_up);
667 }
668 #endif
669 
670 /**
671  * ap_mlme_vdev_notify_up_complete() - callback to notify up completion
672  * @vdev_mlme: vdev mlme object
673  * @data_len: event data length
674  * @data: event data
675  *
676  * This function is called to indicate up is completed
677  *
678  * Return: QDF_STATUS
679  */
680 static QDF_STATUS
ap_mlme_vdev_notify_up_complete(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)681 ap_mlme_vdev_notify_up_complete(struct vdev_mlme_obj *vdev_mlme,
682 				uint16_t data_len, void *data)
683 {
684 	if (!vdev_mlme) {
685 		mlme_legacy_err("data is NULL");
686 		return QDF_STATUS_E_INVAL;
687 	}
688 
689 	pe_debug("Vdev %d is up", wlan_vdev_get_id(vdev_mlme->vdev));
690 
691 	return QDF_STATUS_SUCCESS;
692 }
693 
694 /**
695  * ap_mlme_vdev_disconnect_peers() - callback to disconnect all connected peers
696  * @vdev_mlme: vdev mlme object
697  * @data_len: event data length
698  * @data: event data
699  * @is_disconnect_legacy_only: flag to indicate is disconnect legacy
700  *
701  * This function is called to disconnect all connected peers
702  *
703  * Return: QDF_STATUS
704  */
ap_mlme_vdev_disconnect_peers(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data,bool is_disconnect_legacy_only)705 static QDF_STATUS ap_mlme_vdev_disconnect_peers(struct vdev_mlme_obj *vdev_mlme,
706 						uint16_t data_len, void *data,
707 						bool is_disconnect_legacy_only)
708 {
709 	mlme_legacy_debug("vdev id = %d ",
710 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
711 	return lim_ap_mlme_vdev_disconnect_peers(vdev_mlme, data_len, data);
712 }
713 
714 /**
715  * ap_mlme_vdev_stop_send() - callback to send stop vdev request
716  * @vdev_mlme: vdev mlme object
717  * @data_len: event data length
718  * @data: event data
719  *
720  * This function is called to send stop vdev request
721  *
722  * Return: QDF_STATUS
723  */
ap_mlme_vdev_stop_send(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)724 static QDF_STATUS ap_mlme_vdev_stop_send(struct vdev_mlme_obj *vdev_mlme,
725 					 uint16_t data_len, void *data)
726 {
727 	mlme_legacy_debug("vdev id = %d ",
728 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
729 	return lim_ap_mlme_vdev_stop_send(vdev_mlme, data_len, data);
730 }
731 
732 /**
733  * ap_mlme_vdev_is_newchan_no_cac - VDEV SM CSA complete notification
734  * @vdev_mlme:  VDEV MLME comp object
735  *
736  * On CSA complete, checks whether Channel does not needs CAC period, if
737  * it doesn't need cac return SUCCESS else FAILURE
738  *
739  * Return: SUCCESS if new channel doesn't need cac
740  *         else FAILURE
741  */
742 static QDF_STATUS
ap_mlme_vdev_is_newchan_no_cac(struct vdev_mlme_obj * vdev_mlme)743 ap_mlme_vdev_is_newchan_no_cac(struct vdev_mlme_obj *vdev_mlme)
744 {
745 	bool cac_required;
746 
747 	cac_required = mlme_get_cac_required(vdev_mlme->vdev);
748 	mlme_legacy_debug("vdev id = %d cac_required %d",
749 			  vdev_mlme->vdev->vdev_objmgr.vdev_id, cac_required);
750 
751 	if (!cac_required)
752 		return QDF_STATUS_SUCCESS;
753 
754 	mlme_set_cac_required(vdev_mlme->vdev, false);
755 
756 	return QDF_STATUS_E_FAILURE;
757 }
758 
759 /**
760  * vdevmgr_mlme_vdev_down_send() - callback to send vdev down req
761  * @vdev_mlme: vdev mlme object
762  * @data_len: event data length
763  * @data: event data
764  *
765  * This function is called to send vdev down req
766  *
767  * Return: QDF_STATUS
768  */
vdevmgr_mlme_vdev_down_send(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)769 static QDF_STATUS vdevmgr_mlme_vdev_down_send(struct vdev_mlme_obj *vdev_mlme,
770 					      uint16_t data_len, void *data)
771 {
772 	QDF_STATUS status;
773 	uint8_t vdev_id;
774 
775 	vdev_id = wlan_vdev_get_id(vdev_mlme->vdev);
776 
777 	mlme_legacy_debug("vdev id = %d ", vdev_id);
778 	status = wma_ap_mlme_vdev_down_send(vdev_mlme, data_len, data);
779 	if (QDF_IS_STATUS_SUCCESS(status))
780 		mlme_sr_update(vdev_mlme->vdev, false);
781 
782 	return status;
783 }
784 
785 /**
786  * vdevmgr_notify_down_complete() - callback to indicate vdev down is completed
787  * @vdev_mlme: vdev mlme object
788  * @data_len: event data length
789  * @data: event data
790  *
791  * This function is called to indicate vdev down is completed
792  *
793  * Return: QDF_STATUS
794  */
vdevmgr_notify_down_complete(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)795 static QDF_STATUS vdevmgr_notify_down_complete(struct vdev_mlme_obj *vdev_mlme,
796 					       uint16_t data_len, void *data)
797 {
798 	mlme_legacy_debug("vdev id = %d ",
799 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
800 
801 	return wma_mlme_vdev_notify_down_complete(vdev_mlme, data_len, data);
802 }
803 
804 /**
805  * ap_mlme_vdev_start_req_failed () - vdev start req fail callback
806  * @vdev_mlme: vdev mlme object
807  * @data_len: event data length
808  * @data: event data
809  *
810  * This function is called to handle vdev start req/rsp failure
811  *
812  * Return: QDF_STATUS
813  */
ap_mlme_vdev_start_req_failed(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)814 static QDF_STATUS ap_mlme_vdev_start_req_failed(struct vdev_mlme_obj *vdev_mlme,
815 						uint16_t data_len, void *data)
816 {
817 	mlme_legacy_debug("vdev id = %d ",
818 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
819 	return lim_ap_mlme_vdev_start_req_failed(vdev_mlme, data_len, data);
820 }
821 
822 /**
823  * ap_mlme_vdev_restart_send() - a callback to send vdev restart
824  * @vdev_mlme: vdev mlme object
825  * @data_len: event data length
826  * @data: event data
827  *
828  * This function is called to initiate and send vdev restart req
829  *
830  * Return: QDF_STATUS
831  */
ap_mlme_vdev_restart_send(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)832 static QDF_STATUS ap_mlme_vdev_restart_send(struct vdev_mlme_obj *vdev_mlme,
833 					    uint16_t data_len, void *data)
834 {
835 	mlme_legacy_debug("vdev id = %d ",
836 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
837 	return lim_ap_mlme_vdev_restart_send(vdev_mlme, data_len, data);
838 }
839 
840 /**
841  * ap_mlme_vdev_stop_start_send() - handle vdev stop during start req
842  * @vdev_mlme: vdev mlme object
843  * @type: restart req or start req
844  * @data_len: event data length
845  * @data: event data
846  *
847  * This function is called to handle vdev stop during start req
848  *
849  * Return: QDF_STATUS
850  */
ap_mlme_vdev_stop_start_send(struct vdev_mlme_obj * vdev_mlme,enum vdev_cmd_type type,uint16_t data_len,void * data)851 static QDF_STATUS ap_mlme_vdev_stop_start_send(struct vdev_mlme_obj *vdev_mlme,
852 					       enum vdev_cmd_type type,
853 					       uint16_t data_len, void *data)
854 {
855 	mlme_legacy_debug("vdev id = %d ",
856 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
857 	return wma_ap_mlme_vdev_stop_start_send(vdev_mlme, type,
858 						data_len, data);
859 }
860 
mlme_set_chan_switch_in_progress(struct wlan_objmgr_vdev * vdev,bool val)861 QDF_STATUS mlme_set_chan_switch_in_progress(struct wlan_objmgr_vdev *vdev,
862 					       bool val)
863 {
864 	struct mlme_legacy_priv *mlme_priv;
865 
866 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
867 	if (!mlme_priv) {
868 		mlme_legacy_err("vdev legacy private object is NULL");
869 		return QDF_STATUS_E_FAILURE;
870 	}
871 
872 	mlme_priv->chan_switch_in_progress = val;
873 	mlo_set_chan_switch_in_progress(vdev, val);
874 
875 	mlme_legacy_info("Set chan_switch_in_progress: %d vdev %d",
876 			 val, wlan_vdev_get_id(vdev));
877 
878 	return QDF_STATUS_SUCCESS;
879 }
880 
881 #ifdef WLAN_FEATURE_MSCS
mlme_set_is_mscs_req_sent(struct wlan_objmgr_vdev * vdev,bool val)882 QDF_STATUS mlme_set_is_mscs_req_sent(struct wlan_objmgr_vdev *vdev, bool val)
883 {
884 	struct mlme_legacy_priv *mlme_priv;
885 
886 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
887 	if (!mlme_priv) {
888 		mlme_legacy_err("vdev legacy private object is NULL");
889 		return QDF_STATUS_E_FAILURE;
890 	}
891 
892 	mlme_priv->mscs_req_info.is_mscs_req_sent = val;
893 
894 	return QDF_STATUS_SUCCESS;
895 }
896 
mlme_get_is_mscs_req_sent(struct wlan_objmgr_vdev * vdev)897 bool mlme_get_is_mscs_req_sent(struct wlan_objmgr_vdev *vdev)
898 {
899 	struct mlme_legacy_priv *mlme_priv;
900 
901 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
902 	if (!mlme_priv) {
903 		mlme_legacy_err("vdev legacy private object is NULL");
904 		return false;
905 	}
906 
907 	return mlme_priv->mscs_req_info.is_mscs_req_sent;
908 }
909 #endif
910 
mlme_is_chan_switch_in_progress(struct wlan_objmgr_vdev * vdev)911 bool mlme_is_chan_switch_in_progress(struct wlan_objmgr_vdev *vdev)
912 {
913 	struct mlme_legacy_priv *mlme_priv;
914 
915 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
916 	if (!mlme_priv) {
917 		mlme_legacy_err("vdev legacy private object is NULL");
918 		return false;
919 	}
920 
921 	return mlme_priv->chan_switch_in_progress;
922 }
923 
924 QDF_STATUS
ap_mlme_set_hidden_ssid_restart_in_progress(struct wlan_objmgr_vdev * vdev,bool val)925 ap_mlme_set_hidden_ssid_restart_in_progress(struct wlan_objmgr_vdev *vdev,
926 					    bool val)
927 {
928 	struct mlme_legacy_priv *mlme_priv;
929 
930 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
931 	if (!mlme_priv) {
932 		mlme_legacy_err("vdev legacy private object is NULL");
933 		return QDF_STATUS_E_FAILURE;
934 	}
935 
936 	mlme_priv->hidden_ssid_restart_in_progress = val;
937 
938 	return QDF_STATUS_SUCCESS;
939 }
940 
ap_mlme_is_hidden_ssid_restart_in_progress(struct wlan_objmgr_vdev * vdev)941 bool ap_mlme_is_hidden_ssid_restart_in_progress(struct wlan_objmgr_vdev *vdev)
942 {
943 	struct mlme_legacy_priv *mlme_priv;
944 
945 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
946 	if (!mlme_priv) {
947 		mlme_legacy_err("vdev legacy private object is NULL");
948 		return false;
949 	}
950 
951 	return mlme_priv->hidden_ssid_restart_in_progress;
952 }
953 
mlme_set_bigtk_support(struct wlan_objmgr_vdev * vdev,bool val)954 QDF_STATUS mlme_set_bigtk_support(struct wlan_objmgr_vdev *vdev, bool val)
955 {
956 	struct mlme_legacy_priv *mlme_priv;
957 
958 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
959 	if (!mlme_priv) {
960 		mlme_legacy_err("vdev legacy private object is NULL");
961 		return QDF_STATUS_E_FAILURE;
962 	}
963 
964 	mlme_priv->bigtk_vdev_support = val;
965 
966 	return QDF_STATUS_SUCCESS;
967 }
968 
mlme_get_bigtk_support(struct wlan_objmgr_vdev * vdev)969 bool mlme_get_bigtk_support(struct wlan_objmgr_vdev *vdev)
970 {
971 	struct mlme_legacy_priv *mlme_priv;
972 
973 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
974 	if (!mlme_priv) {
975 		mlme_legacy_err("vdev legacy private object is NULL");
976 		return false;
977 	}
978 
979 	return mlme_priv->bigtk_vdev_support;
980 }
981 
982 #ifdef FEATURE_WLAN_TDLS
983 QDF_STATUS
mlme_set_tdls_chan_switch_prohibited(struct wlan_objmgr_vdev * vdev,bool val)984 mlme_set_tdls_chan_switch_prohibited(struct wlan_objmgr_vdev *vdev, bool val)
985 {
986 	struct mlme_legacy_priv *mlme_priv;
987 
988 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
989 	if (!mlme_priv) {
990 		mlme_legacy_err("vdev legacy private object is NULL");
991 		return QDF_STATUS_E_FAILURE;
992 	}
993 
994 	mlme_priv->connect_info.tdls_chan_swit_prohibited = val;
995 
996 	return QDF_STATUS_SUCCESS;
997 }
998 
mlme_get_tdls_chan_switch_prohibited(struct wlan_objmgr_vdev * vdev)999 bool mlme_get_tdls_chan_switch_prohibited(struct wlan_objmgr_vdev *vdev)
1000 {
1001 	struct mlme_legacy_priv *mlme_priv;
1002 
1003 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
1004 	if (!mlme_priv) {
1005 		mlme_legacy_err("vdev legacy private object is NULL");
1006 		return false;
1007 	}
1008 
1009 	return mlme_priv->connect_info.tdls_chan_swit_prohibited;
1010 }
1011 
1012 QDF_STATUS
mlme_set_tdls_prohibited(struct wlan_objmgr_vdev * vdev,bool val)1013 mlme_set_tdls_prohibited(struct wlan_objmgr_vdev *vdev, bool val)
1014 {
1015 	struct mlme_legacy_priv *mlme_priv;
1016 
1017 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
1018 	if (!mlme_priv) {
1019 		mlme_legacy_err("vdev legacy private object is NULL");
1020 		return QDF_STATUS_E_FAILURE;
1021 	}
1022 
1023 	mlme_priv->connect_info.tdls_prohibited = val;
1024 
1025 	return QDF_STATUS_SUCCESS;
1026 }
1027 
mlme_get_tdls_prohibited(struct wlan_objmgr_vdev * vdev)1028 bool mlme_get_tdls_prohibited(struct wlan_objmgr_vdev *vdev)
1029 {
1030 	struct mlme_legacy_priv *mlme_priv;
1031 
1032 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
1033 	if (!mlme_priv) {
1034 		mlme_legacy_err("vdev legacy private object is NULL");
1035 		return false;
1036 	}
1037 
1038 	return mlme_priv->connect_info.tdls_prohibited;
1039 }
1040 #endif
1041 
1042 QDF_STATUS
mlme_set_roam_reason_better_ap(struct wlan_objmgr_vdev * vdev,bool val)1043 mlme_set_roam_reason_better_ap(struct wlan_objmgr_vdev *vdev, bool val)
1044 {
1045 	struct mlme_legacy_priv *mlme_priv;
1046 
1047 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
1048 	if (!mlme_priv) {
1049 		mlme_legacy_err("vdev legacy private object is NULL");
1050 		return QDF_STATUS_E_FAILURE;
1051 	}
1052 
1053 	mlme_priv->roam_reason_better_ap = val;
1054 
1055 	return QDF_STATUS_SUCCESS;
1056 }
1057 
mlme_get_roam_reason_better_ap(struct wlan_objmgr_vdev * vdev)1058 bool mlme_get_roam_reason_better_ap(struct wlan_objmgr_vdev *vdev)
1059 {
1060 	struct mlme_legacy_priv *mlme_priv;
1061 
1062 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
1063 	if (!mlme_priv) {
1064 		mlme_legacy_err("vdev legacy private object is NULL");
1065 		return false;
1066 	}
1067 
1068 	return mlme_priv->roam_reason_better_ap;
1069 }
1070 
1071 QDF_STATUS
mlme_set_hb_ap_rssi(struct wlan_objmgr_vdev * vdev,uint32_t val)1072 mlme_set_hb_ap_rssi(struct wlan_objmgr_vdev *vdev, uint32_t val)
1073 {
1074 	struct mlme_legacy_priv *mlme_priv;
1075 
1076 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
1077 	if (!mlme_priv) {
1078 		mlme_legacy_err("vdev legacy private object is NULL");
1079 		return QDF_STATUS_E_FAILURE;
1080 	}
1081 
1082 	mlme_priv->hb_failure_rssi = val;
1083 
1084 	return QDF_STATUS_SUCCESS;
1085 }
1086 
mlme_get_hb_ap_rssi(struct wlan_objmgr_vdev * vdev)1087 uint32_t mlme_get_hb_ap_rssi(struct wlan_objmgr_vdev *vdev)
1088 {
1089 	struct mlme_legacy_priv *mlme_priv;
1090 
1091 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
1092 	if (!mlme_priv) {
1093 		mlme_legacy_err("vdev legacy private object is NULL");
1094 		return 0;
1095 	}
1096 
1097 	return mlme_priv->hb_failure_rssi;
1098 }
1099 
1100 
mlme_set_connection_fail(struct wlan_objmgr_vdev * vdev,bool val)1101 QDF_STATUS mlme_set_connection_fail(struct wlan_objmgr_vdev *vdev, bool val)
1102 {
1103 	struct mlme_legacy_priv *mlme_priv;
1104 
1105 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
1106 	if (!mlme_priv) {
1107 		mlme_legacy_err("vdev legacy private object is NULL");
1108 		return QDF_STATUS_E_FAILURE;
1109 	}
1110 
1111 	mlme_priv->connection_fail = val;
1112 
1113 	return QDF_STATUS_SUCCESS;
1114 }
1115 
mlme_is_connection_fail(struct wlan_objmgr_vdev * vdev)1116 bool mlme_is_connection_fail(struct wlan_objmgr_vdev *vdev)
1117 {
1118 	struct mlme_legacy_priv *mlme_priv;
1119 
1120 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
1121 	if (!mlme_priv) {
1122 		mlme_legacy_err("vdev legacy private object is NULL");
1123 		return false;
1124 	}
1125 
1126 	return mlme_priv->connection_fail;
1127 }
1128 
1129 #ifdef FEATURE_WLAN_WAPI
mlme_is_sta_vdev_wapi(struct wlan_objmgr_pdev * pdev,void * object,void * arg)1130 static void mlme_is_sta_vdev_wapi(struct wlan_objmgr_pdev *pdev,
1131 			   void *object, void *arg)
1132 {
1133 	struct wlan_objmgr_vdev *vdev = (struct wlan_objmgr_vdev *)object;
1134 	int32_t keymgmt;
1135 	bool *is_wapi_sta_exist = (bool *)arg;
1136 	QDF_STATUS status;
1137 
1138 	if (*is_wapi_sta_exist)
1139 		return;
1140 	if (wlan_vdev_mlme_get_opmode(vdev) != QDF_STA_MODE)
1141 		return;
1142 
1143 	status = wlan_vdev_is_up(vdev);
1144 	if (QDF_IS_STATUS_ERROR(status))
1145 		return;
1146 
1147 	keymgmt = wlan_crypto_get_param(vdev, WLAN_CRYPTO_PARAM_KEY_MGMT);
1148 	if (keymgmt < 0)
1149 		return;
1150 
1151 	if (keymgmt & ((1 << WLAN_CRYPTO_KEY_MGMT_WAPI_PSK) |
1152 		       (1 << WLAN_CRYPTO_KEY_MGMT_WAPI_CERT))) {
1153 		*is_wapi_sta_exist = true;
1154 		mlme_debug("wapi exist for Vdev: %d",
1155 			   wlan_vdev_get_id(vdev));
1156 	}
1157 }
1158 
mlme_is_wapi_sta_active(struct wlan_objmgr_pdev * pdev)1159 bool mlme_is_wapi_sta_active(struct wlan_objmgr_pdev *pdev)
1160 {
1161 	bool is_wapi_sta_exist = false;
1162 
1163 	wlan_objmgr_pdev_iterate_obj_list(pdev,
1164 					  WLAN_VDEV_OP,
1165 					  mlme_is_sta_vdev_wapi,
1166 					  &is_wapi_sta_exist, 0,
1167 					  WLAN_MLME_OBJMGR_ID);
1168 
1169 	return is_wapi_sta_exist;
1170 }
1171 #endif
1172 
mlme_set_assoc_type(struct wlan_objmgr_vdev * vdev,enum vdev_assoc_type assoc_type)1173 QDF_STATUS mlme_set_assoc_type(struct wlan_objmgr_vdev *vdev,
1174 			       enum vdev_assoc_type assoc_type)
1175 {
1176 	struct mlme_legacy_priv *mlme_priv;
1177 
1178 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
1179 	if (!mlme_priv) {
1180 		mlme_legacy_err("vdev legacy private object is NULL");
1181 		return QDF_STATUS_E_FAILURE;
1182 	}
1183 
1184 	mlme_priv->assoc_type = assoc_type;
1185 
1186 	return QDF_STATUS_SUCCESS;
1187 }
1188 
mlme_get_vdev_stop_type(struct wlan_objmgr_vdev * vdev,uint32_t * vdev_stop_type)1189 QDF_STATUS mlme_get_vdev_stop_type(struct wlan_objmgr_vdev *vdev,
1190 				   uint32_t *vdev_stop_type)
1191 {
1192 	struct mlme_legacy_priv *mlme_priv;
1193 
1194 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
1195 	if (!mlme_priv) {
1196 		mlme_legacy_err("vdev legacy private object is NULL");
1197 		return QDF_STATUS_E_FAILURE;
1198 	}
1199 
1200 	*vdev_stop_type = mlme_priv->vdev_stop_type;
1201 
1202 	return QDF_STATUS_SUCCESS;
1203 }
1204 
mlme_set_vdev_stop_type(struct wlan_objmgr_vdev * vdev,uint32_t vdev_stop_type)1205 QDF_STATUS mlme_set_vdev_stop_type(struct wlan_objmgr_vdev *vdev,
1206 				   uint32_t vdev_stop_type)
1207 {
1208 	struct mlme_legacy_priv *mlme_priv;
1209 
1210 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
1211 	if (!mlme_priv) {
1212 		mlme_legacy_err("vdev legacy private object is NULL");
1213 		return QDF_STATUS_E_FAILURE;
1214 	}
1215 
1216 	mlme_priv->vdev_stop_type = vdev_stop_type;
1217 
1218 	return QDF_STATUS_SUCCESS;
1219 }
1220 
mlme_set_notify_co_located_ap_update_rnr(struct wlan_objmgr_vdev * vdev,bool upt_rnr)1221 void mlme_set_notify_co_located_ap_update_rnr(struct wlan_objmgr_vdev *vdev,
1222 					      bool upt_rnr)
1223 {
1224 	struct mlme_legacy_priv *mlme_priv;
1225 
1226 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
1227 	if (!mlme_priv) {
1228 		mlme_legacy_err("vdev legacy private object is NULL");
1229 		return;
1230 	}
1231 
1232 	mlme_priv->notify_co_located_ap_upt_rnr = upt_rnr;
1233 }
1234 
mlme_is_notify_co_located_ap_update_rnr(struct wlan_objmgr_vdev * vdev)1235 bool mlme_is_notify_co_located_ap_update_rnr(struct wlan_objmgr_vdev *vdev)
1236 {
1237 	struct mlme_legacy_priv *mlme_priv;
1238 
1239 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
1240 	if (!mlme_priv) {
1241 		mlme_legacy_err("vdev legacy private object is NULL");
1242 		return false;
1243 	}
1244 
1245 	return mlme_priv->notify_co_located_ap_upt_rnr;
1246 }
1247 
wlan_is_vdev_traffic_ll_ht(struct wlan_objmgr_vdev * vdev)1248 bool wlan_is_vdev_traffic_ll_ht(struct wlan_objmgr_vdev *vdev)
1249 {
1250 	struct mlme_legacy_priv *mlme_priv;
1251 
1252 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
1253 	if (!mlme_priv) {
1254 		mlme_legacy_err("vdev legacy private object is NULL");
1255 		return false;
1256 	}
1257 
1258 	if (mlme_priv->vdev_traffic_type & PM_VDEV_TRAFFIC_LOW_LATENCY ||
1259 	    mlme_priv->vdev_traffic_type & PM_VDEV_TRAFFIC_HIGH_TPUT)
1260 		return true;
1261 
1262 	return false;
1263 }
1264 
mlme_get_vdev_wifi_std(struct wlan_objmgr_vdev * vdev)1265 WMI_HOST_WIFI_STANDARD mlme_get_vdev_wifi_std(struct wlan_objmgr_vdev *vdev)
1266 {
1267 	struct mlme_legacy_priv *mlme_priv;
1268 
1269 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
1270 	if (!mlme_priv) {
1271 		mlme_legacy_err("vdev legacy private object is NULL");
1272 		return WMI_HOST_WIFI_STANDARD_7;
1273 	}
1274 
1275 	if (!mlme_priv->is_user_std_set)
1276 		return WMI_HOST_WIFI_STANDARD_7;
1277 
1278 	return mlme_priv->wifi_std;
1279 }
1280 
mlme_get_assoc_type(struct wlan_objmgr_vdev * vdev)1281 enum vdev_assoc_type  mlme_get_assoc_type(struct wlan_objmgr_vdev *vdev)
1282 {
1283 	struct mlme_legacy_priv *mlme_priv;
1284 
1285 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
1286 	if (!mlme_priv) {
1287 		mlme_legacy_err("vdev legacy private object is NULL");
1288 		return false;
1289 	}
1290 
1291 	return mlme_priv->assoc_type;
1292 }
1293 
1294 QDF_STATUS
mlme_set_vdev_start_failed(struct wlan_objmgr_vdev * vdev,bool val)1295 mlme_set_vdev_start_failed(struct wlan_objmgr_vdev *vdev, bool val)
1296 {
1297 	struct mlme_legacy_priv *mlme_priv;
1298 
1299 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
1300 	if (!mlme_priv) {
1301 		mlme_legacy_err("vdev legacy private object is NULL");
1302 		return QDF_STATUS_E_FAILURE;
1303 	}
1304 
1305 	mlme_priv->vdev_start_failed = val;
1306 
1307 	return QDF_STATUS_SUCCESS;
1308 }
1309 
mlme_get_vdev_start_failed(struct wlan_objmgr_vdev * vdev)1310 bool mlme_get_vdev_start_failed(struct wlan_objmgr_vdev *vdev)
1311 {
1312 	struct mlme_legacy_priv *mlme_priv;
1313 
1314 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
1315 	if (!mlme_priv) {
1316 		mlme_legacy_err("vdev legacy private object is NULL");
1317 		return false;
1318 	}
1319 
1320 	return mlme_priv->vdev_start_failed;
1321 }
1322 
mlme_set_cac_required(struct wlan_objmgr_vdev * vdev,bool val)1323 QDF_STATUS mlme_set_cac_required(struct wlan_objmgr_vdev *vdev, bool val)
1324 {
1325 	struct mlme_legacy_priv *mlme_priv;
1326 
1327 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
1328 	if (!mlme_priv) {
1329 		mlme_legacy_err("vdev legacy private object is NULL");
1330 		return QDF_STATUS_E_FAILURE;
1331 	}
1332 
1333 	mlme_priv->cac_required_for_new_channel = val;
1334 
1335 	return QDF_STATUS_SUCCESS;
1336 }
1337 
mlme_get_cac_required(struct wlan_objmgr_vdev * vdev)1338 bool mlme_get_cac_required(struct wlan_objmgr_vdev *vdev)
1339 {
1340 	struct mlme_legacy_priv *mlme_priv;
1341 
1342 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
1343 	if (!mlme_priv) {
1344 		mlme_legacy_err("vdev legacy private object is NULL");
1345 		return false;
1346 	}
1347 
1348 	return mlme_priv->cac_required_for_new_channel;
1349 }
1350 
mlme_set_mbssid_info(struct wlan_objmgr_vdev * vdev,struct scan_mbssid_info * mbssid_info,qdf_freq_t freq)1351 QDF_STATUS mlme_set_mbssid_info(struct wlan_objmgr_vdev *vdev,
1352 				struct scan_mbssid_info *mbssid_info,
1353 				qdf_freq_t freq)
1354 {
1355 	struct vdev_mlme_obj *vdev_mlme;
1356 	struct vdev_mlme_mbss_11ax *mbss_11ax;
1357 	struct qdf_mac_addr bssid;
1358 	struct qdf_mac_addr bcast_addr = QDF_MAC_ADDR_BCAST_INIT;
1359 
1360 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1361 	if (!vdev_mlme) {
1362 		mlme_legacy_err("vdev component object is NULL");
1363 		return QDF_STATUS_E_FAILURE;
1364 	}
1365 
1366 	mbss_11ax = &vdev_mlme->mgmt.mbss_11ax;
1367 	mbss_11ax->profile_idx = mbssid_info->profile_num;
1368 	mbss_11ax->profile_num = mbssid_info->profile_count;
1369 	qdf_mem_copy(mbss_11ax->trans_bssid,
1370 		     mbssid_info->trans_bssid, QDF_MAC_ADDR_SIZE);
1371 	qdf_mem_copy(mbss_11ax->non_trans_bssid,
1372 		     mbssid_info->non_trans_bssid, QDF_MAC_ADDR_SIZE);
1373 
1374 	qdf_mem_copy(&bssid.bytes, vdev_mlme->mgmt.generic.bssid,
1375 		     QDF_MAC_ADDR_SIZE);
1376 
1377 	/*
1378 	 * Consider the case of 5 GHz + non-tx 6 GHz MLO candidate.
1379 	 * The scan entry might be generated from a ML-probe, which doesn't have
1380 	 * the MBSSID info for the non-tx partner link. In this case, host has
1381 	 * to identify if this link is MBSS or not. This is essential to receive
1382 	 * traffic over this link.
1383 	 *
1384 	 * The below logic looks into the rnr db for the 6 GHz bssid and
1385 	 * determines if the bssid is non-tx profile from the bss parameter
1386 	 * saved by its neighbor. If this is a non-tx bssid, but trans_bssid
1387 	 * info is not available from the scan entry, then set transmitted bssid
1388 	 * to bcast address. Upon sending this bcast tx bssid to firmware, the
1389 	 * firmware would auto-detect the tx bssid from the upcoming beacons
1390 	 * and tunes the interface to proper bssid.
1391 	 *
1392 	 * Note: Always send bcast mac in trans_bssid if the host is unable
1393 	 * to determine if a given BSS is part of an MBSS.
1394 	 */
1395 	if (freq != INVALID_CHANNEL_NUM && !mbss_11ax->profile_idx &&
1396 	    qdf_is_macaddr_zero((struct qdf_mac_addr *)&mbss_11ax->trans_bssid) &&
1397 	    util_is_bssid_non_tx(wlan_vdev_get_psoc(vdev), &bssid, freq))
1398 		qdf_mem_copy(mbss_11ax->trans_bssid,
1399 			     bcast_addr.bytes, QDF_MAC_ADDR_SIZE);
1400 
1401 	return QDF_STATUS_SUCCESS;
1402 }
1403 
mlme_get_mbssid_info(struct wlan_objmgr_vdev * vdev,struct vdev_mlme_mbss_11ax * mbss_11ax)1404 void mlme_get_mbssid_info(struct wlan_objmgr_vdev *vdev,
1405 			  struct vdev_mlme_mbss_11ax *mbss_11ax)
1406 {
1407 	struct vdev_mlme_obj *vdev_mlme;
1408 
1409 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1410 	if (!vdev_mlme) {
1411 		mlme_legacy_err("vdev component object is NULL");
1412 		return;
1413 	}
1414 
1415 	mbss_11ax = &vdev_mlme->mgmt.mbss_11ax;
1416 }
1417 
mlme_set_tx_power(struct wlan_objmgr_vdev * vdev,int8_t tx_power)1418 QDF_STATUS mlme_set_tx_power(struct wlan_objmgr_vdev *vdev,
1419 			     int8_t tx_power)
1420 {
1421 	struct vdev_mlme_obj *vdev_mlme;
1422 
1423 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1424 
1425 	if (!vdev_mlme) {
1426 		mlme_legacy_err("vdev component object is NULL");
1427 		return QDF_STATUS_E_FAILURE;
1428 	}
1429 
1430 	vdev_mlme->mgmt.generic.tx_power = tx_power;
1431 
1432 	return QDF_STATUS_SUCCESS;
1433 }
1434 
mlme_get_tx_power(struct wlan_objmgr_vdev * vdev)1435 int8_t mlme_get_tx_power(struct wlan_objmgr_vdev *vdev)
1436 {
1437 	struct vdev_mlme_obj *vdev_mlme;
1438 
1439 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1440 	if (!vdev_mlme) {
1441 		mlme_legacy_err("vdev component object is NULL");
1442 		return QDF_STATUS_E_INVAL;
1443 	}
1444 
1445 	return vdev_mlme->mgmt.generic.tx_power;
1446 }
1447 
mlme_set_max_reg_power(struct wlan_objmgr_vdev * vdev,int8_t max_reg_power)1448 QDF_STATUS mlme_set_max_reg_power(struct wlan_objmgr_vdev *vdev,
1449 				 int8_t max_reg_power)
1450 {
1451 	struct vdev_mlme_obj *vdev_mlme;
1452 
1453 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1454 
1455 	if (!vdev_mlme) {
1456 		mlme_legacy_err("vdev component object is NULL");
1457 		return QDF_STATUS_E_FAILURE;
1458 	}
1459 
1460 	vdev_mlme->mgmt.generic.maxregpower = max_reg_power;
1461 
1462 	return QDF_STATUS_SUCCESS;
1463 }
1464 
mlme_get_max_reg_power(struct wlan_objmgr_vdev * vdev)1465 int8_t mlme_get_max_reg_power(struct wlan_objmgr_vdev *vdev)
1466 {
1467 	struct vdev_mlme_obj *vdev_mlme;
1468 
1469 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1470 	if (!vdev_mlme) {
1471 		mlme_legacy_err("vdev component object is NULL");
1472 		return QDF_STATUS_E_INVAL;
1473 	}
1474 
1475 	return vdev_mlme->mgmt.generic.maxregpower;
1476 }
1477 
1478 #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_FEATURE_ROAM_OFFLOAD)
1479 QDF_STATUS
mlme_set_single_link_mlo_roaming(struct wlan_objmgr_vdev * vdev,bool val)1480 mlme_set_single_link_mlo_roaming(struct wlan_objmgr_vdev *vdev, bool val)
1481 {
1482 	struct mlme_legacy_priv *mlme_priv;
1483 
1484 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
1485 	if (!mlme_priv) {
1486 		mlme_legacy_err("vdev legacy private object is NULL");
1487 		return QDF_STATUS_E_FAILURE;
1488 	}
1489 
1490 	mlme_priv->is_single_link_mlo_roam = val;
1491 
1492 	return QDF_STATUS_SUCCESS;
1493 }
1494 
mlme_get_single_link_mlo_roaming(struct wlan_objmgr_vdev * vdev)1495 bool mlme_get_single_link_mlo_roaming(struct wlan_objmgr_vdev *vdev)
1496 {
1497 	struct mlme_legacy_priv *mlme_priv;
1498 
1499 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
1500 	if (!mlme_priv) {
1501 		mlme_legacy_err("vdev legacy private object is NULL");
1502 		return false;
1503 	}
1504 
1505 	return mlme_priv->is_single_link_mlo_roam;
1506 }
1507 #endif
1508 
1509 /**
1510  * mlme_get_vdev_types() - get vdev type and subtype from its operation mode
1511  * @mode: operation mode of vdev
1512  * @type: type of vdev
1513  * @sub_type: sub_type of vdev
1514  *
1515  * This API is called to get vdev type and subtype from its operation mode.
1516  * Vdev operation modes are defined in enum QDF_OPMODE.
1517  *
1518  * Type of vdev are WLAN_VDEV_MLME_TYPE_AP, WLAN_VDEV_MLME_TYPE_STA,
1519  * WLAN_VDEV_MLME_TYPE_IBSS, ,WLAN_VDEV_MLME_TYPE_MONITOR,
1520  * WLAN_VDEV_MLME_TYPE_NAN, WLAN_VDEV_MLME_TYPE_OCB, WLAN_VDEV_MLME_TYPE_NDI
1521  *
1522  * Sub_types of vdev are WLAN_VDEV_MLME_SUBTYPE_P2P_DEVICE,
1523  * WLAN_VDEV_MLME_SUBTYPE_P2P_CLIENT, WLAN_VDEV_MLME_SUBTYPE_P2P_GO,
1524  * WLAN_VDEV_MLME_SUBTYPE_PROXY_STA, WLAN_VDEV_MLME_SUBTYPE_MESH
1525  * Return: QDF_STATUS
1526  */
1527 
mlme_get_vdev_types(enum QDF_OPMODE mode,uint8_t * type,uint8_t * sub_type)1528 static QDF_STATUS mlme_get_vdev_types(enum QDF_OPMODE mode, uint8_t *type,
1529 				      uint8_t *sub_type)
1530 {
1531 	QDF_STATUS status = QDF_STATUS_SUCCESS;
1532 	*type = 0;
1533 	*sub_type = 0;
1534 
1535 	switch (mode) {
1536 	case QDF_STA_MODE:
1537 		*type = WLAN_VDEV_MLME_TYPE_STA;
1538 		break;
1539 	case QDF_SAP_MODE:
1540 		*type = WLAN_VDEV_MLME_TYPE_AP;
1541 		break;
1542 	case QDF_P2P_DEVICE_MODE:
1543 		*type = WLAN_VDEV_MLME_TYPE_AP;
1544 		*sub_type = WLAN_VDEV_MLME_SUBTYPE_P2P_DEVICE;
1545 		break;
1546 	case QDF_P2P_CLIENT_MODE:
1547 		*type = WLAN_VDEV_MLME_TYPE_STA;
1548 		*sub_type = WLAN_VDEV_MLME_SUBTYPE_P2P_CLIENT;
1549 		break;
1550 	case QDF_P2P_GO_MODE:
1551 		*type = WLAN_VDEV_MLME_TYPE_AP;
1552 		*sub_type = WLAN_VDEV_MLME_SUBTYPE_P2P_GO;
1553 		break;
1554 	case QDF_OCB_MODE:
1555 		*type = WLAN_VDEV_MLME_TYPE_OCB;
1556 		break;
1557 	case QDF_IBSS_MODE:
1558 		*type = WLAN_VDEV_MLME_TYPE_IBSS;
1559 		break;
1560 	case QDF_MONITOR_MODE:
1561 		*type = WMI_HOST_VDEV_TYPE_MONITOR;
1562 		break;
1563 	case QDF_NDI_MODE:
1564 		*type = WLAN_VDEV_MLME_TYPE_NDI;
1565 		break;
1566 	case QDF_NAN_DISC_MODE:
1567 		*type = WLAN_VDEV_MLME_TYPE_NAN;
1568 		break;
1569 	default:
1570 		mlme_err("Invalid device mode %d", mode);
1571 		status = QDF_STATUS_E_INVAL;
1572 		break;
1573 	}
1574 	return status;
1575 }
1576 
1577 #ifdef WLAN_FEATURE_FILS_SK
mlme_free_fils_info(struct mlme_connect_info * connect_info)1578 static inline void mlme_free_fils_info(struct mlme_connect_info *connect_info)
1579 {
1580 	qdf_mem_free(connect_info->fils_con_info);
1581 	qdf_mem_free(connect_info->hlp_ie);
1582 	connect_info->hlp_ie = NULL;
1583 	connect_info->hlp_ie_len = 0;
1584 	connect_info->fils_con_info = NULL;
1585 }
1586 #else
mlme_free_fils_info(struct mlme_connect_info * connect_info)1587 static inline void mlme_free_fils_info(struct mlme_connect_info *connect_info)
1588 {}
1589 #endif
1590 
1591 static
mlme_init_wait_for_key_timer(struct wlan_objmgr_vdev * vdev,struct wait_for_key_timer * wait_key_timer)1592 void mlme_init_wait_for_key_timer(struct wlan_objmgr_vdev *vdev,
1593 				  struct wait_for_key_timer *wait_key_timer)
1594 {
1595 	QDF_STATUS status;
1596 
1597 	if (!vdev || !wait_key_timer) {
1598 		mlme_err("vdev or wait for key is NULL");
1599 		return;
1600 	}
1601 
1602 	wait_key_timer->vdev = vdev;
1603 	status = qdf_mc_timer_init(&wait_key_timer->timer, QDF_TIMER_TYPE_SW,
1604 				   cm_wait_for_key_time_out_handler,
1605 				   wait_key_timer);
1606 	if (QDF_IS_STATUS_ERROR(status))
1607 		mlme_err("cannot allocate memory for WaitForKey time out timer");
1608 }
1609 
1610 static
mlme_deinit_wait_for_key_timer(struct wait_for_key_timer * wait_key_timer)1611 void mlme_deinit_wait_for_key_timer(struct wait_for_key_timer *wait_key_timer)
1612 {
1613 	qdf_mc_timer_stop(&wait_key_timer->timer);
1614 	qdf_mc_timer_destroy(&wait_key_timer->timer);
1615 }
1616 
mlme_ext_handler_destroy(struct vdev_mlme_obj * vdev_mlme)1617 static void mlme_ext_handler_destroy(struct vdev_mlme_obj *vdev_mlme)
1618 {
1619 	if (!vdev_mlme || !vdev_mlme->ext_vdev_ptr)
1620 		return;
1621 	qdf_runtime_lock_deinit(
1622 		&vdev_mlme->ext_vdev_ptr->bss_color_change_runtime_lock);
1623 	qdf_wake_lock_destroy(
1624 		&vdev_mlme->ext_vdev_ptr->bss_color_change_wakelock);
1625 	qdf_runtime_lock_deinit(
1626 		&vdev_mlme->ext_vdev_ptr->disconnect_runtime_lock);
1627 	mlme_free_self_disconnect_ies(vdev_mlme->vdev);
1628 	mlme_free_peer_disconnect_ies(vdev_mlme->vdev);
1629 	mlme_free_sae_auth_retry(vdev_mlme->vdev);
1630 	mlme_deinit_wait_for_key_timer(&vdev_mlme->ext_vdev_ptr->wait_key_timer);
1631 	mlme_free_fils_info(&vdev_mlme->ext_vdev_ptr->connect_info);
1632 	mlme_cm_free_roam_stats_info(vdev_mlme->ext_vdev_ptr);
1633 	qdf_mem_free(vdev_mlme->ext_vdev_ptr);
1634 	vdev_mlme->ext_vdev_ptr = NULL;
1635 }
1636 
1637 static QDF_STATUS
mlme_wma_vdev_detach_post_cb(struct scheduler_msg * msg)1638 mlme_wma_vdev_detach_post_cb(struct scheduler_msg *msg)
1639 {
1640 	struct vdev_delete_response rsp = {0};
1641 
1642 	if (!msg) {
1643 		mlme_err("Msg is NULL");
1644 		return QDF_STATUS_E_INVAL;
1645 	}
1646 
1647 	rsp.vdev_id = msg->bodyval;
1648 	wma_vdev_detach_callback(&rsp);
1649 
1650 	return QDF_STATUS_SUCCESS;
1651 }
1652 
mlme_wma_vdev_detach_handler(uint8_t vdev_id)1653 static void mlme_wma_vdev_detach_handler(uint8_t vdev_id)
1654 {
1655 	struct scheduler_msg msg = {0};
1656 
1657 	msg.bodyptr = NULL;
1658 	msg.bodyval = vdev_id;
1659 	msg.callback = mlme_wma_vdev_detach_post_cb;
1660 
1661 	if (scheduler_post_message(QDF_MODULE_ID_MLME,
1662 				   QDF_MODULE_ID_TARGET_IF,
1663 				   QDF_MODULE_ID_TARGET_IF, &msg) ==
1664 				   QDF_STATUS_SUCCESS)
1665 		return;
1666 
1667 	mlme_err("Failed to post wma vdev detach");
1668 }
1669 
1670 /**
1671  * vdevmgr_mlme_ext_hdl_destroy () - Destroy mlme legacy priv object
1672  * @vdev_mlme: vdev mlme object
1673  *
1674  * Return: QDF_STATUS
1675  */
1676 static
vdevmgr_mlme_ext_hdl_destroy(struct vdev_mlme_obj * vdev_mlme)1677 QDF_STATUS vdevmgr_mlme_ext_hdl_destroy(struct vdev_mlme_obj *vdev_mlme)
1678 {
1679 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
1680 	uint8_t vdev_id;
1681 
1682 	vdev_id = vdev_mlme->vdev->vdev_objmgr.vdev_id;
1683 	mlme_legacy_debug("Sending vdev delete to firmware for vdev id = %d ",
1684 			  vdev_id);
1685 
1686 	if (!vdev_mlme->ext_vdev_ptr)
1687 		return status;
1688 
1689 	status = vdev_mgr_delete_send(vdev_mlme);
1690 	if (QDF_IS_STATUS_ERROR(status)) {
1691 		mlme_err("Failed to send vdev delete to firmware");
1692 		mlme_wma_vdev_detach_handler(vdev_id);
1693 	}
1694 
1695 	mlme_ext_handler_destroy(vdev_mlme);
1696 
1697 	return QDF_STATUS_SUCCESS;
1698 }
1699 
1700 /**
1701  * vdevmgr_mlme_ext_hdl_create () - Create mlme legacy priv object
1702  * @vdev_mlme: vdev mlme object
1703  *
1704  * Return: QDF_STATUS
1705  */
1706 static
vdevmgr_mlme_ext_hdl_create(struct vdev_mlme_obj * vdev_mlme)1707 QDF_STATUS vdevmgr_mlme_ext_hdl_create(struct vdev_mlme_obj *vdev_mlme)
1708 {
1709 	QDF_STATUS status;
1710 
1711 	mlme_legacy_debug("vdev id = %d ",
1712 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
1713 	vdev_mlme->ext_vdev_ptr =
1714 		qdf_mem_malloc(sizeof(struct mlme_legacy_priv));
1715 	if (!vdev_mlme->ext_vdev_ptr)
1716 		return QDF_STATUS_E_NOMEM;
1717 
1718 	mlme_init_rate_config(vdev_mlme);
1719 	mlme_init_connect_chan_info_config(vdev_mlme);
1720 	mlme_cm_alloc_roam_stats_info(vdev_mlme);
1721 	vdev_mlme->ext_vdev_ptr->connect_info.fils_con_info = NULL;
1722 	mlme_init_wait_for_key_timer(vdev_mlme->vdev,
1723 				     &vdev_mlme->ext_vdev_ptr->wait_key_timer);
1724 
1725 	qdf_wake_lock_create(
1726 			&vdev_mlme->ext_vdev_ptr->bss_color_change_wakelock,
1727 			"bss_color_change_wakelock");
1728 	qdf_runtime_lock_init(
1729 		&vdev_mlme->ext_vdev_ptr->bss_color_change_runtime_lock);
1730 	qdf_runtime_lock_init(
1731 		&vdev_mlme->ext_vdev_ptr->disconnect_runtime_lock);
1732 
1733 	sme_get_vdev_type_nss(wlan_vdev_mlme_get_opmode(vdev_mlme->vdev),
1734 			      &vdev_mlme->proto.generic.nss_2g,
1735 			      &vdev_mlme->proto.generic.nss_5g);
1736 
1737 	status = mlme_get_vdev_types(wlan_vdev_mlme_get_opmode(vdev_mlme->vdev),
1738 				     &vdev_mlme->mgmt.generic.type,
1739 				     &vdev_mlme->mgmt.generic.subtype);
1740 	if (QDF_IS_STATUS_ERROR(status)) {
1741 		mlme_err("Get vdev type failed; status:%d", status);
1742 		mlme_ext_handler_destroy(vdev_mlme);
1743 		return status;
1744 	}
1745 
1746 	status = vdev_mgr_create_send(vdev_mlme);
1747 	if (QDF_IS_STATUS_ERROR(status)) {
1748 		mlme_err("Failed to create vdev for vdev id %d",
1749 			 wlan_vdev_get_id(vdev_mlme->vdev));
1750 		vdevmgr_mlme_ext_hdl_destroy(vdev_mlme);
1751 		return status;
1752 	}
1753 
1754 	return status;
1755 }
1756 
1757 #ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE
1758 static
vdevmgr_mlme_vdev_send_set_mac_addr(struct qdf_mac_addr mac_addr,struct qdf_mac_addr mld_addr,struct wlan_objmgr_vdev * vdev)1759 QDF_STATUS vdevmgr_mlme_vdev_send_set_mac_addr(struct qdf_mac_addr mac_addr,
1760 					       struct qdf_mac_addr mld_addr,
1761 					       struct wlan_objmgr_vdev *vdev)
1762 {
1763 	return vdev_mgr_send_set_mac_addr(mac_addr, mld_addr, vdev);
1764 }
1765 #endif
1766 
1767 /**
1768  * ap_vdev_dfs_cac_timer_stop() - callback to stop cac timer
1769  * @vdev_mlme: vdev mlme object
1770  * @event_data_len: event data length
1771  * @event_data: event data
1772  *
1773  * This function is called to stop cac timer
1774  *
1775  * Return: QDF_STATUS
1776  */
ap_vdev_dfs_cac_timer_stop(struct vdev_mlme_obj * vdev_mlme,uint16_t event_data_len,void * event_data)1777 static QDF_STATUS ap_vdev_dfs_cac_timer_stop(struct vdev_mlme_obj *vdev_mlme,
1778 					     uint16_t event_data_len,
1779 					     void *event_data)
1780 {
1781 	mlme_legacy_debug("vdev id = %d ",
1782 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
1783 	return QDF_STATUS_SUCCESS;
1784 }
1785 
1786 /**
1787  * mon_mlme_vdev_start_restart_send () - send vdev start/restart req
1788  * @vdev_mlme: vdev mlme object
1789  * @data_len: event data length
1790  * @data: event data
1791  *
1792  * This function is called to initiate actions of VDEV start/restart
1793  *
1794  * Return: QDF_STATUS
1795  */
mon_mlme_vdev_start_restart_send(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)1796 static QDF_STATUS mon_mlme_vdev_start_restart_send(
1797 	struct vdev_mlme_obj *vdev_mlme,
1798 	uint16_t data_len, void *data)
1799 {
1800 	mlme_legacy_debug("vdev id = %d",
1801 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
1802 	return lim_mon_mlme_vdev_start_send(vdev_mlme, data_len, data);
1803 }
1804 
1805 /**
1806  * mon_mlme_start_continue () - vdev start rsp callback
1807  * @vdev_mlme: vdev mlme object
1808  * @data_len: event data length
1809  * @data: event data
1810  *
1811  * This function is called to handle the VDEV START/RESTART callback
1812  *
1813  * Return: QDF_STATUS
1814  */
mon_mlme_start_continue(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)1815 static QDF_STATUS mon_mlme_start_continue(struct vdev_mlme_obj *vdev_mlme,
1816 					  uint16_t data_len, void *data)
1817 {
1818 	mlme_legacy_debug("vdev id = %d",
1819 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
1820 	return wma_mon_mlme_vdev_start_continue(vdev_mlme, data_len, data);
1821 }
1822 
1823 /**
1824  * mon_mlme_vdev_up_send() - callback to send vdev up
1825  * @vdev_mlme: vdev mlme object
1826  * @data_len: event data length
1827  * @data: event data
1828  *
1829  * This function is called to send vdev up req
1830  *
1831  * Return: QDF_STATUS
1832  */
mon_mlme_vdev_up_send(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)1833 static QDF_STATUS mon_mlme_vdev_up_send(struct vdev_mlme_obj *vdev_mlme,
1834 					uint16_t data_len, void *data)
1835 {
1836 	mlme_legacy_debug("vdev id = %d",
1837 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
1838 	return wma_mon_mlme_vdev_up_send(vdev_mlme, data_len, data);
1839 }
1840 
1841 /**
1842  * mon_mlme_vdev_disconnect_peers() - callback to disconnect all connected peers
1843  * @vdev_mlme: vdev mlme object
1844  * @data_len: event data length
1845  * @data: event data
1846  * @is_disconnect_legacy_only: flag to indicate legacy disconnect
1847  *
1848  * montior mode no connected peers, only do VDEV state transition.
1849  *
1850  * Return: QDF_STATUS
1851  */
mon_mlme_vdev_disconnect_peers(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data,bool is_disconnect_legacy_only)1852 static QDF_STATUS mon_mlme_vdev_disconnect_peers(
1853 		struct vdev_mlme_obj *vdev_mlme,
1854 		uint16_t data_len, void *data,
1855 		bool is_disconnect_legacy_only)
1856 {
1857 	struct wlan_objmgr_psoc *psoc = NULL;
1858 	struct wlan_objmgr_pdev *pdev = NULL;
1859 	uint32_t pdev_id;
1860 
1861 	psoc = wlan_vdev_get_psoc(vdev_mlme->vdev);
1862 	if (!psoc) {
1863 		mlme_legacy_debug("Invalid psoc");
1864 		return QDF_STATUS_E_INVAL;
1865 	}
1866 
1867 	pdev = wlan_vdev_get_pdev(vdev_mlme->vdev);
1868 	if (!pdev) {
1869 		mlme_legacy_debug("Invalid pdev");
1870 		return QDF_STATUS_E_INVAL;
1871 	}
1872 
1873 	pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
1874 	if (pdev_id == WLAN_INVALID_PDEV_ID) {
1875 		mlme_legacy_debug("Invalid pdev id");
1876 		return QDF_STATUS_E_INVAL;
1877 	}
1878 
1879 	/* Cancel periodic pdev stats update */
1880 	tgt_set_pdev_stats_update_period(psoc, pdev_id, 0);
1881 
1882 	mlme_legacy_debug("vdev id = %d",
1883 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
1884 	return wlan_vdev_mlme_sm_deliver_evt(
1885 				vdev_mlme->vdev,
1886 				WLAN_VDEV_SM_EV_DISCONNECT_COMPLETE,
1887 				0, NULL);
1888 }
1889 
1890 /**
1891  * mon_mlme_vdev_stop_send() - callback to send stop vdev request
1892  * @vdev_mlme: vdev mlme object
1893  * @data_len: event data length
1894  * @data: event data
1895  *
1896  * This function is called to send stop vdev request
1897  *
1898  * Return: QDF_STATUS
1899  */
mon_mlme_vdev_stop_send(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)1900 static QDF_STATUS mon_mlme_vdev_stop_send(struct vdev_mlme_obj *vdev_mlme,
1901 					  uint16_t data_len, void *data)
1902 {
1903 	mlme_legacy_debug("vdev id = %d",
1904 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
1905 	return wma_mon_mlme_vdev_stop_send(vdev_mlme, data_len, data);
1906 }
1907 
1908 /**
1909  * mon_mlme_vdev_down_send() - callback to send vdev down req
1910  * @vdev_mlme: vdev mlme object
1911  * @data_len: event data length
1912  * @data: event data
1913  *
1914  * This function is called to send vdev down req
1915  *
1916  * Return: QDF_STATUS
1917  */
mon_mlme_vdev_down_send(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)1918 static QDF_STATUS mon_mlme_vdev_down_send(struct vdev_mlme_obj *vdev_mlme,
1919 					  uint16_t data_len, void *data)
1920 {
1921 	mlme_legacy_debug("vdev id = %d",
1922 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
1923 	return wma_mon_mlme_vdev_down_send(vdev_mlme, data_len, data);
1924 }
1925 
1926 /**
1927  * vdevmgr_vdev_delete_rsp_handle() - callback to handle vdev delete response
1928  * @psoc: psoc object
1929  * @rsp: pointer to vdev delete response
1930  *
1931  * This function is called to handle vdev delete response and send result to
1932  * upper layer
1933  *
1934  * Return: QDF_STATUS
1935  */
1936 static QDF_STATUS
vdevmgr_vdev_delete_rsp_handle(struct wlan_objmgr_psoc * psoc,struct vdev_delete_response * rsp)1937 vdevmgr_vdev_delete_rsp_handle(struct wlan_objmgr_psoc *psoc,
1938 			       struct vdev_delete_response *rsp)
1939 {
1940 	mlme_legacy_debug("vdev id = %d ", rsp->vdev_id);
1941 	return wma_vdev_detach_callback(rsp);
1942 }
1943 
1944 /**
1945  * vdevmgr_vdev_stop_rsp_handle() - callback to handle vdev stop response
1946  * @vdev_mlme: vdev mlme object
1947  * @rsp: pointer to vdev stop response
1948  *
1949  * This function is called to handle vdev stop response and send result to
1950  * upper layer
1951  *
1952  * Return: QDF_STATUS
1953  */
1954 static QDF_STATUS
vdevmgr_vdev_stop_rsp_handle(struct vdev_mlme_obj * vdev_mlme,struct vdev_stop_response * rsp)1955 vdevmgr_vdev_stop_rsp_handle(struct vdev_mlme_obj *vdev_mlme,
1956 			     struct vdev_stop_response *rsp)
1957 {
1958 	mlme_legacy_debug("vdev id = %d ",
1959 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
1960 	return wma_vdev_stop_resp_handler(vdev_mlme, rsp);
1961 }
1962 
1963 /**
1964  * psoc_mlme_ext_hdl_enable() - to enable mlme ext param handler
1965  * @psoc: psoc object
1966  *
1967  * Return: QDF_STATUS
1968  */
psoc_mlme_ext_hdl_enable(struct wlan_objmgr_psoc * psoc)1969 static QDF_STATUS psoc_mlme_ext_hdl_enable(struct wlan_objmgr_psoc *psoc)
1970 {
1971 	struct wlan_mlme_psoc_ext_obj *mlme_obj;
1972 
1973 	mlme_obj = mlme_get_psoc_ext_obj(psoc);
1974 	if (!mlme_obj)
1975 		return QDF_STATUS_E_FAILURE;
1976 
1977 	mlme_obj->scan_requester_id =
1978 		wlan_scan_register_requester(psoc, "MLME_EXT",
1979 					     wlan_mlme_chan_stats_scan_event_cb,
1980 					     NULL);
1981 
1982 	return QDF_STATUS_SUCCESS;
1983 }
1984 
1985 /**
1986  * psoc_mlme_ext_hdl_disable() - to disable mlme ext param handler
1987  * @psoc: psoc object
1988  *
1989  * Return: QDF_STATUS
1990  */
psoc_mlme_ext_hdl_disable(struct wlan_objmgr_psoc * psoc)1991 static QDF_STATUS psoc_mlme_ext_hdl_disable(struct wlan_objmgr_psoc *psoc)
1992 {
1993 	struct wlan_mlme_psoc_ext_obj *mlme_obj;
1994 
1995 	mlme_obj = mlme_get_psoc_ext_obj(psoc);
1996 	if (!mlme_obj)
1997 		return QDF_STATUS_E_FAILURE;
1998 
1999 	wlan_scan_unregister_requester(psoc, mlme_obj->scan_requester_id);
2000 
2001 	return QDF_STATUS_SUCCESS;
2002 }
2003 
2004 /**
2005  * psoc_mlme_ext_hdl_create() - Create mlme legacy priv object
2006  * @psoc_mlme: psoc mlme object
2007  *
2008  * Return: QDF_STATUS
2009  */
2010 static
psoc_mlme_ext_hdl_create(struct psoc_mlme_obj * psoc_mlme)2011 QDF_STATUS psoc_mlme_ext_hdl_create(struct psoc_mlme_obj *psoc_mlme)
2012 {
2013 	psoc_mlme->ext_psoc_ptr =
2014 		qdf_mem_malloc(sizeof(struct wlan_mlme_psoc_ext_obj));
2015 	if (!psoc_mlme->ext_psoc_ptr)
2016 		return QDF_STATUS_E_NOMEM;
2017 
2018 	target_if_cm_roam_register_tx_ops(
2019 			&psoc_mlme->ext_psoc_ptr->rso_tx_ops);
2020 
2021 	target_if_wfatestcmd_register_tx_ops(
2022 			&psoc_mlme->ext_psoc_ptr->wfa_testcmd.tx_ops);
2023 	target_if_cm_roam_register_rx_ops(
2024 			&psoc_mlme->ext_psoc_ptr->rso_rx_ops);
2025 	wlan_mlme_register_rx_ops(&psoc_mlme->ext_psoc_ptr->mlme_rx_ops);
2026 
2027 	target_if_mlme_register_tx_ops(
2028 			&psoc_mlme->ext_psoc_ptr->mlme_tx_ops);
2029 
2030 	return QDF_STATUS_SUCCESS;
2031 }
2032 
2033 /**
2034  * psoc_mlme_ext_hdl_destroy() - Destroy mlme legacy priv object
2035  * @psoc_mlme: psoc mlme object
2036  *
2037  * Return: QDF_STATUS
2038  */
2039 static
psoc_mlme_ext_hdl_destroy(struct psoc_mlme_obj * psoc_mlme)2040 QDF_STATUS psoc_mlme_ext_hdl_destroy(struct psoc_mlme_obj *psoc_mlme)
2041 {
2042 	if (!psoc_mlme) {
2043 		mlme_err("PSOC MLME is NULL");
2044 		return QDF_STATUS_E_FAILURE;
2045 	}
2046 
2047 	if (psoc_mlme->ext_psoc_ptr) {
2048 		qdf_mem_free(psoc_mlme->ext_psoc_ptr);
2049 		psoc_mlme->ext_psoc_ptr = NULL;
2050 	}
2051 
2052 	return QDF_STATUS_SUCCESS;
2053 }
2054 
2055 /**
2056  * vdevmgr_vdev_start_rsp_handle() - callback to handle vdev start response
2057  * @vdev_mlme: vdev mlme object
2058  * @rsp: pointer to vdev start response
2059  *
2060  * This function is called to handle vdev start response
2061  *
2062  * Return: QDF_STATUS
2063  */
2064 static QDF_STATUS
vdevmgr_vdev_start_rsp_handle(struct vdev_mlme_obj * vdev_mlme,struct vdev_start_response * rsp)2065 vdevmgr_vdev_start_rsp_handle(struct vdev_mlme_obj *vdev_mlme,
2066 			      struct vdev_start_response *rsp)
2067 {
2068 	QDF_STATUS status;
2069 
2070 	mlme_legacy_debug("vdev id = %d ",
2071 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
2072 	status =  wma_vdev_start_resp_handler(vdev_mlme, rsp);
2073 
2074 	return status;
2075 }
2076 
2077 /**
2078  * vdevmgr_vdev_peer_delete_all_rsp_handle() - callback to handle vdev delete
2079  *                                             all response
2080  * @vdev_mlme: vdev mlme object
2081  * @rsp: pointer to vdev delete response
2082  *
2083  * This function is called to handle vdev delete response and send result to
2084  * upper layer
2085  *
2086  * Return: QDF_STATUS
2087  */
2088 static QDF_STATUS
vdevmgr_vdev_peer_delete_all_rsp_handle(struct vdev_mlme_obj * vdev_mlme,struct peer_delete_all_response * rsp)2089 vdevmgr_vdev_peer_delete_all_rsp_handle(struct vdev_mlme_obj *vdev_mlme,
2090 					struct peer_delete_all_response *rsp)
2091 {
2092 	struct wlan_objmgr_psoc *psoc;
2093 	struct wlan_lmac_if_wifi_pos_rx_ops *rx_ops;
2094 	QDF_STATUS status;
2095 
2096 	psoc = wlan_vdev_get_psoc(vdev_mlme->vdev);
2097 	if (!psoc)
2098 		return -QDF_STATUS_E_INVAL;
2099 
2100 	if (QDF_HAS_PARAM(rsp->peer_type_bitmap, WLAN_PEER_RTT_PASN)) {
2101 		rx_ops = wifi_pos_get_rx_ops(psoc);
2102 		if (!rx_ops ||
2103 		    !rx_ops->wifi_pos_vdev_delete_all_ranging_peers_rsp_cb) {
2104 			mlme_err("rx_ops is NULL");
2105 			return QDF_STATUS_E_FAILURE;
2106 		}
2107 
2108 		status = rx_ops->wifi_pos_vdev_delete_all_ranging_peers_rsp_cb(
2109 							psoc, rsp->vdev_id);
2110 		return status;
2111 	}
2112 
2113 	status = lim_process_mlm_del_all_sta_rsp(vdev_mlme, rsp);
2114 	if (QDF_IS_STATUS_ERROR(status))
2115 		mlme_err("Failed to call lim_process_mlm_del_all_sta_rsp");
2116 
2117 	return status;
2118 }
2119 
2120 #ifdef WLAN_FEATURE_11BE_MLO
vdevmgr_reconfig_req_cb(struct scheduler_msg * msg)2121 static QDF_STATUS vdevmgr_reconfig_req_cb(struct scheduler_msg *msg)
2122 {
2123 	struct wlan_objmgr_vdev *vdev = msg->bodyptr;
2124 	struct wlan_objmgr_psoc *psoc;
2125 	uint8_t vdev_id;
2126 
2127 	if (!vdev) {
2128 		mlme_err("vdev null");
2129 		return QDF_STATUS_E_INVAL;
2130 	}
2131 
2132 	psoc = wlan_vdev_get_psoc(vdev);
2133 	if (!psoc) {
2134 		mlme_err("Failed to get psoc");
2135 		return QDF_STATUS_E_INVAL;
2136 	}
2137 
2138 	vdev_id = wlan_vdev_get_id(vdev);
2139 	if (!wlan_get_vdev_link_removed_flag_by_vdev_id(psoc, vdev_id))
2140 		mlme_cm_osif_link_reconfig_notify(vdev);
2141 
2142 	policy_mgr_handle_link_removal_on_vdev(vdev);
2143 	mlo_sta_stop_reconfig_timer_by_vdev(vdev);
2144 
2145 	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
2146 
2147 	return QDF_STATUS_SUCCESS;
2148 }
2149 
vdevmgr_reconfig_req_flush_cb(struct scheduler_msg * msg)2150 static QDF_STATUS vdevmgr_reconfig_req_flush_cb(struct scheduler_msg *msg)
2151 {
2152 	struct wlan_objmgr_vdev *vdev = msg->bodyptr;
2153 
2154 	if (!vdev) {
2155 		mlme_err("vdev null");
2156 		return QDF_STATUS_E_INVAL;
2157 	}
2158 	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
2159 
2160 	return QDF_STATUS_SUCCESS;
2161 }
2162 
2163 static QDF_STATUS
vdevmgr_vdev_reconfig_notify(struct vdev_mlme_obj * vdev_mlme,uint16_t * tbtt_count,uint16_t bcn_int)2164 vdevmgr_vdev_reconfig_notify(struct vdev_mlme_obj *vdev_mlme,
2165 			     uint16_t *tbtt_count, uint16_t bcn_int)
2166 {
2167 	struct wlan_objmgr_vdev *vdev = vdev_mlme->vdev;
2168 
2169 	if (!vdev) {
2170 		mlme_err("invalid vdev");
2171 		return QDF_STATUS_E_INVAL;
2172 	}
2173 	mlme_debug("vdev %d link removal notify tbtt %d bcn_int %d",
2174 		   wlan_vdev_get_id(vdev), *tbtt_count, bcn_int);
2175 	if (*tbtt_count * bcn_int <= LINK_REMOVAL_MIN_TIMEOUT_MS)
2176 		*tbtt_count = 0;
2177 	else if (bcn_int)
2178 		*tbtt_count -= LINK_REMOVAL_MIN_TIMEOUT_MS / bcn_int;
2179 
2180 	return QDF_STATUS_SUCCESS;
2181 }
2182 
2183 static QDF_STATUS
vdevmgr_vdev_reconfig_notify_standby(struct vdev_mlme_obj * vdev_mlme,struct ml_rv_info * reconfig_info)2184 vdevmgr_vdev_reconfig_notify_standby(struct vdev_mlme_obj *vdev_mlme,
2185 				     struct ml_rv_info *reconfig_info)
2186 {
2187 	struct wlan_objmgr_vdev *vdev = vdev_mlme->vdev;
2188 
2189 	if (!vdev) {
2190 		mlme_err("invalid vdev");
2191 		return QDF_STATUS_E_INVAL;
2192 	}
2193 
2194 	return policy_mgr_handle_link_removal_on_standby(vdev, reconfig_info);
2195 }
2196 
2197 static void
vdevmgr_vdev_reconfig_timer_complete(struct vdev_mlme_obj * vdev_mlme)2198 vdevmgr_vdev_reconfig_timer_complete(struct vdev_mlme_obj *vdev_mlme)
2199 {
2200 	struct wlan_objmgr_vdev *vdev = vdev_mlme->vdev;
2201 	struct scheduler_msg msg = {0};
2202 	QDF_STATUS ret;
2203 
2204 	if (!vdev) {
2205 		mlme_err("invalid vdev");
2206 		return;
2207 	}
2208 	mlme_debug("vdev %d link removal timed out", wlan_vdev_get_id(vdev));
2209 
2210 	msg.bodyptr = vdev;
2211 	msg.callback = vdevmgr_reconfig_req_cb;
2212 	msg.flush_callback = vdevmgr_reconfig_req_flush_cb;
2213 
2214 	ret = wlan_objmgr_vdev_try_get_ref(vdev, WLAN_MLME_CM_ID);
2215 	if (QDF_IS_STATUS_ERROR(ret))
2216 		return;
2217 
2218 	ret = scheduler_post_message(QDF_MODULE_ID_MLME,
2219 				     QDF_MODULE_ID_TARGET_IF,
2220 				     QDF_MODULE_ID_TARGET_IF, &msg);
2221 
2222 	if (QDF_IS_STATUS_ERROR(ret)) {
2223 		mlme_err("vdev %d failed to post scheduler_msg",
2224 			 wlan_vdev_get_id(vdev));
2225 		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
2226 		return;
2227 	}
2228 }
2229 #endif
2230 
mlme_vdev_self_peer_create(struct wlan_objmgr_vdev * vdev)2231 QDF_STATUS mlme_vdev_self_peer_create(struct wlan_objmgr_vdev *vdev)
2232 {
2233 	struct vdev_mlme_obj *vdev_mlme;
2234 
2235 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
2236 	if (!vdev_mlme) {
2237 		mlme_err("Failed to get vdev mlme obj for vdev id %d",
2238 			 wlan_vdev_get_id(vdev));
2239 		return QDF_STATUS_E_INVAL;
2240 	}
2241 
2242 	return wma_vdev_self_peer_create(vdev_mlme);
2243 }
2244 
2245 static
vdevmgr_mlme_ext_post_hdl_create(struct vdev_mlme_obj * vdev_mlme)2246 QDF_STATUS vdevmgr_mlme_ext_post_hdl_create(struct vdev_mlme_obj *vdev_mlme)
2247 {
2248 	return QDF_STATUS_SUCCESS;
2249 }
2250 
mlme_vdev_uses_self_peer(uint32_t vdev_type,uint32_t vdev_subtype)2251 bool mlme_vdev_uses_self_peer(uint32_t vdev_type, uint32_t vdev_subtype)
2252 {
2253 	switch (vdev_type) {
2254 	case WMI_VDEV_TYPE_AP:
2255 		return vdev_subtype == WMI_UNIFIED_VDEV_SUBTYPE_P2P_DEVICE;
2256 
2257 	case WMI_VDEV_TYPE_MONITOR:
2258 	case WMI_VDEV_TYPE_OCB:
2259 		return true;
2260 
2261 	default:
2262 		return false;
2263 	}
2264 }
2265 
mlme_vdev_del_resp(uint8_t vdev_id)2266 void mlme_vdev_del_resp(uint8_t vdev_id)
2267 {
2268 	sme_vdev_del_resp(vdev_id);
2269 }
2270 
2271 static
mlme_vdev_self_peer_delete_resp_flush_cb(struct scheduler_msg * msg)2272 QDF_STATUS mlme_vdev_self_peer_delete_resp_flush_cb(struct scheduler_msg *msg)
2273 {
2274 	/*
2275 	 * sme should be the last component to hold the reference invoke the
2276 	 * same to release the reference gracefully
2277 	 */
2278 	sme_vdev_self_peer_delete_resp(msg->bodyptr);
2279 	return QDF_STATUS_SUCCESS;
2280 }
2281 
mlme_vdev_self_peer_delete_resp(struct del_vdev_params * param)2282 void mlme_vdev_self_peer_delete_resp(struct del_vdev_params *param)
2283 {
2284 	struct scheduler_msg peer_del_rsp = {0};
2285 	QDF_STATUS status;
2286 
2287 	peer_del_rsp.type = eWNI_SME_VDEV_DELETE_RSP;
2288 	peer_del_rsp.bodyptr = param;
2289 	peer_del_rsp.flush_callback = mlme_vdev_self_peer_delete_resp_flush_cb;
2290 
2291 	status = scheduler_post_message(QDF_MODULE_ID_MLME,
2292 					QDF_MODULE_ID_SME,
2293 					QDF_MODULE_ID_SME, &peer_del_rsp);
2294 	if (!QDF_IS_STATUS_SUCCESS(status)) {
2295 		/* In the error cases release the final sme reference */
2296 		wlan_objmgr_vdev_release_ref(param->vdev, WLAN_LEGACY_SME_ID);
2297 		qdf_mem_free(param);
2298 	}
2299 }
2300 
mlme_vdev_self_peer_delete(struct scheduler_msg * self_peer_del_msg)2301 QDF_STATUS mlme_vdev_self_peer_delete(struct scheduler_msg *self_peer_del_msg)
2302 {
2303 	QDF_STATUS status;
2304 	struct del_vdev_params *del_vdev = self_peer_del_msg->bodyptr;
2305 
2306 	if (!del_vdev) {
2307 		mlme_err("Invalid del self peer params");
2308 		return QDF_STATUS_E_INVAL;
2309 	}
2310 
2311 	status = wma_vdev_detach(del_vdev);
2312 	if (QDF_IS_STATUS_ERROR(status))
2313 		mlme_err("Failed to detach vdev");
2314 
2315 	return status;
2316 }
2317 
wlan_sap_disconnect_all_p2p_client(uint8_t vdev_id)2318 QDF_STATUS wlan_sap_disconnect_all_p2p_client(uint8_t vdev_id)
2319 {
2320 	return csr_mlme_vdev_disconnect_all_p2p_client_event(vdev_id);
2321 }
2322 
wlan_sap_stop_bss(uint8_t vdev_id)2323 QDF_STATUS wlan_sap_stop_bss(uint8_t vdev_id)
2324 {
2325 	return csr_mlme_vdev_stop_bss(vdev_id);
2326 }
2327 
wlan_get_conc_freq(void)2328 qdf_freq_t wlan_get_conc_freq(void)
2329 {
2330 	return csr_mlme_get_concurrent_operation_freq();
2331 }
2332 
2333 /**
2334  * ap_mlme_vdev_csa_complete() - callback to initiate csa complete
2335  *
2336  * @vdev_mlme: vdev mlme object
2337  *
2338  * This function is called for csa complete indication
2339  *
2340  * Return: QDF_STATUS
2341  */
ap_mlme_vdev_csa_complete(struct vdev_mlme_obj * vdev_mlme)2342 static QDF_STATUS ap_mlme_vdev_csa_complete(struct vdev_mlme_obj *vdev_mlme)
2343 
2344 {
2345 	uint8_t vdev_id;
2346 
2347 	vdev_id = wlan_vdev_get_id(vdev_mlme->vdev);
2348 	mlme_legacy_debug("vdev id = %d ", vdev_id);
2349 
2350 	if (lim_is_csa_tx_pending(vdev_id))
2351 		lim_send_csa_tx_complete(vdev_id);
2352 	else
2353 		mlme_legacy_debug("CSAIE_TX_COMPLETE_IND already sent");
2354 
2355 	return QDF_STATUS_SUCCESS;
2356 }
2357 
2358 #ifdef WLAN_FEATURE_LL_LT_SAP
2359 QDF_STATUS
wlan_ll_sap_sort_channel_list(uint8_t vdev_id,qdf_list_t * list,struct sap_sel_ch_info * ch_info)2360 wlan_ll_sap_sort_channel_list(uint8_t vdev_id, qdf_list_t *list,
2361 			      struct sap_sel_ch_info *ch_info)
2362 {
2363 	return wlansap_sort_channel_list(vdev_id, list, ch_info);
2364 }
2365 
wlan_ll_sap_free_chan_info(struct sap_sel_ch_info * ch_param)2366 void wlan_ll_sap_free_chan_info(struct sap_sel_ch_info *ch_param)
2367 {
2368 	return wlansap_free_chan_info(ch_param);
2369 }
2370 
wlan_ll_sap_freq_present_in_pcl(struct policy_mgr_pcl_list * pcl,qdf_freq_t freq)2371 bool wlan_ll_sap_freq_present_in_pcl(struct policy_mgr_pcl_list *pcl,
2372 				     qdf_freq_t freq)
2373 {
2374 	uint8_t i;
2375 
2376 	for (i = 0; i < pcl->pcl_len; i++) {
2377 		if (pcl->pcl_list[i] == freq)
2378 			return true;
2379 	}
2380 
2381 	return false;
2382 }
2383 #endif
2384 
2385 void
wlan_sap_get_user_config_acs_ch_list(uint8_t vdev_id,struct scan_filter * filter)2386 wlan_sap_get_user_config_acs_ch_list(uint8_t vdev_id,
2387 				     struct scan_filter *filter)
2388 {
2389 	wlansap_get_user_config_acs_ch_list(vdev_id, filter);
2390 }
2391 
2392 static struct vdev_mlme_ops sta_mlme_ops = {
2393 	.mlme_vdev_start_send = sta_mlme_vdev_start_send,
2394 	.mlme_vdev_restart_send = sta_mlme_vdev_restart_send,
2395 	.mlme_vdev_start_continue = sta_mlme_start_continue,
2396 	.mlme_vdev_start_req_failed = sta_mlme_vdev_start_req_failed,
2397 	.mlme_vdev_sta_conn_start = sta_mlme_vdev_start_connection,
2398 	.mlme_vdev_up_send = sta_mlme_vdev_up_send,
2399 	.mlme_vdev_notify_up_complete = sta_mlme_vdev_notify_up_complete,
2400 	.mlme_vdev_notify_roam_start = sta_mlme_vdev_notify_roam_start,
2401 	.mlme_vdev_disconnect_peers = sta_mlme_vdev_disconnect_bss,
2402 	.mlme_vdev_stop_send = sta_mlme_vdev_stop_send,
2403 	.mlme_vdev_stop_continue = vdevmgr_mlme_stop_continue,
2404 	.mlme_vdev_down_send = vdevmgr_mlme_vdev_down_send,
2405 	.mlme_vdev_notify_down_complete = vdevmgr_notify_down_complete,
2406 	.mlme_vdev_ext_stop_rsp = vdevmgr_vdev_stop_rsp_handle,
2407 	.mlme_vdev_ext_start_rsp = vdevmgr_vdev_start_rsp_handle,
2408 	.mlme_vdev_sta_disconn_start = sta_mlme_vdev_sta_disconnect_start,
2409 	.mlme_vdev_ext_peer_delete_all_rsp =
2410 			vdevmgr_vdev_peer_delete_all_rsp_handle,
2411 #ifdef WLAN_FEATURE_11BE_MLO
2412 	.mlme_vdev_reconfig_notify =
2413 			vdevmgr_vdev_reconfig_notify,
2414 	.mlme_vdev_reconfig_timer_complete =
2415 			vdevmgr_vdev_reconfig_timer_complete,
2416 	.mlme_vdev_reconfig_notify_standby =
2417 			vdevmgr_vdev_reconfig_notify_standby,
2418 
2419 #endif
2420 };
2421 
2422 static struct vdev_mlme_ops ap_mlme_ops = {
2423 	.mlme_vdev_start_send = ap_mlme_vdev_start_send,
2424 	.mlme_vdev_restart_send = ap_mlme_vdev_restart_send,
2425 	.mlme_vdev_stop_start_send = ap_mlme_vdev_stop_start_send,
2426 	.mlme_vdev_start_continue = ap_mlme_start_continue,
2427 	.mlme_vdev_start_req_failed = ap_mlme_vdev_start_req_failed,
2428 	.mlme_vdev_up_send = ap_mlme_vdev_up_send,
2429 	.mlme_vdev_notify_up_complete = ap_mlme_vdev_notify_up_complete,
2430 	.mlme_vdev_update_beacon = ap_mlme_vdev_update_beacon,
2431 	.mlme_vdev_disconnect_peers = ap_mlme_vdev_disconnect_peers,
2432 	.mlme_vdev_dfs_cac_timer_stop = ap_vdev_dfs_cac_timer_stop,
2433 	.mlme_vdev_stop_send = ap_mlme_vdev_stop_send,
2434 	.mlme_vdev_stop_continue = vdevmgr_mlme_stop_continue,
2435 	.mlme_vdev_down_send = vdevmgr_mlme_vdev_down_send,
2436 	.mlme_vdev_notify_down_complete = vdevmgr_notify_down_complete,
2437 	.mlme_vdev_is_newchan_no_cac = ap_mlme_vdev_is_newchan_no_cac,
2438 	.mlme_vdev_ext_stop_rsp = vdevmgr_vdev_stop_rsp_handle,
2439 	.mlme_vdev_ext_start_rsp = vdevmgr_vdev_start_rsp_handle,
2440 	.mlme_vdev_ext_peer_delete_all_rsp =
2441 				vdevmgr_vdev_peer_delete_all_rsp_handle,
2442 	.mlme_vdev_csa_complete = ap_mlme_vdev_csa_complete,
2443 };
2444 
2445 static struct vdev_mlme_ops mon_mlme_ops = {
2446 	.mlme_vdev_start_send = mon_mlme_vdev_start_restart_send,
2447 	.mlme_vdev_restart_send = mon_mlme_vdev_start_restart_send,
2448 	.mlme_vdev_start_continue = mon_mlme_start_continue,
2449 	.mlme_vdev_up_send = mon_mlme_vdev_up_send,
2450 	.mlme_vdev_disconnect_peers = mon_mlme_vdev_disconnect_peers,
2451 	.mlme_vdev_stop_send = mon_mlme_vdev_stop_send,
2452 	.mlme_vdev_down_send = mon_mlme_vdev_down_send,
2453 	.mlme_vdev_ext_start_rsp = vdevmgr_vdev_start_rsp_handle,
2454 };
2455 
2456 static struct mlme_ext_ops ext_ops = {
2457 	.mlme_psoc_ext_hdl_create = psoc_mlme_ext_hdl_create,
2458 	.mlme_psoc_ext_hdl_destroy = psoc_mlme_ext_hdl_destroy,
2459 	.mlme_vdev_ext_hdl_create = vdevmgr_mlme_ext_hdl_create,
2460 	.mlme_vdev_ext_hdl_destroy = vdevmgr_mlme_ext_hdl_destroy,
2461 	.mlme_vdev_ext_hdl_post_create = vdevmgr_mlme_ext_post_hdl_create,
2462 	.mlme_vdev_ext_delete_rsp = vdevmgr_vdev_delete_rsp_handle,
2463 	.mlme_cm_ext_hdl_create_cb = cm_ext_hdl_create,
2464 	.mlme_cm_ext_hdl_destroy_cb = cm_ext_hdl_destroy,
2465 	.mlme_cm_ext_connect_start_ind_cb = cm_connect_start_ind,
2466 	.mlme_cm_ext_connect_req_cb = cm_handle_connect_req,
2467 	.mlme_cm_ext_bss_peer_create_req_cb = cm_send_bss_peer_create_req,
2468 	.mlme_cm_ext_connect_complete_ind_cb = cm_connect_complete_ind,
2469 	.mlme_cm_ext_disconnect_start_ind_cb = cm_disconnect_start_ind,
2470 	.mlme_cm_ext_disconnect_req_cb = cm_handle_disconnect_req,
2471 	.mlme_cm_ext_bss_peer_delete_req_cb = cm_send_bss_peer_delete_req,
2472 	.mlme_cm_ext_disconnect_complete_ind_cb = cm_disconnect_complete_ind,
2473 	.mlme_cm_ext_vdev_down_req_cb = cm_send_vdev_down_req,
2474 	.mlme_cm_ext_reassoc_req_cb = cm_handle_reassoc_req,
2475 	.mlme_cm_ext_roam_start_ind_cb = cm_handle_roam_start,
2476 	.mlme_psoc_ext_hdl_enable = psoc_mlme_ext_hdl_enable,
2477 	.mlme_psoc_ext_hdl_disable = psoc_mlme_ext_hdl_disable,
2478 #ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE
2479 	.mlme_vdev_send_set_mac_addr = vdevmgr_mlme_vdev_send_set_mac_addr,
2480 #endif
2481 	.mlme_cm_ext_rso_stop_cb = cm_send_rso_stop,
2482 };
2483 
2484 #ifdef WLAN_FEATURE_11BE_MLO
2485 static struct mlo_mlme_ext_ops mlo_ext_ops = {
2486 	.mlo_mlme_ext_peer_create = lim_mlo_proc_assoc_req_frm,
2487 	.mlo_mlme_ext_peer_delete = lim_mlo_cleanup_partner_peer,
2488 	.mlo_mlme_ext_peer_assoc_fail = lim_mlo_ap_sta_assoc_fail,
2489 	.mlo_mlme_ext_assoc_resp = lim_mlo_ap_sta_assoc_suc,
2490 	.mlo_mlme_ext_handle_sta_csa_param = lim_handle_mlo_sta_csa_param,
2491 };
2492 #endif
2493