xref: /wlan-dirver/qca-wifi-host-cmn/umac/mlme/mlme_objmgr/dispatcher/src/wlan_cmn_mlme_main.c (revision b34016828e5ab8485a5b81ff7aa8891e8e0ac7be)
1 /*
2  * Copyright (c) 2019-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 any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17 
18 /**
19  * DOC: Implements MLME global APIs
20  */
21 
22 #include <wlan_objmgr_cmn.h>
23 #include <include/wlan_mlme_cmn.h>
24 #include <include/wlan_pdev_mlme.h>
25 #include <include/wlan_vdev_mlme.h>
26 #include <include/wlan_mlme_cmn.h>
27 #include <wlan_psoc_mlme_main.h>
28 #include <wlan_pdev_mlme_main.h>
29 #include <wlan_vdev_mlme_main.h>
30 #include <wlan_psoc_mlme_api.h>
31 
32 struct mlme_ext_ops *glbl_ops;
33 mlme_get_global_ops_cb glbl_ops_cb;
34 
35 struct mlme_cm_ops *glbl_cm_ops;
36 osif_cm_get_global_ops_cb glbl_cm_ops_cb;
37 
38 struct mlme_twt_ops *glbl_twt_ops;
39 osif_twt_get_global_ops_cb glbl_twt_ops_cb;
40 
41 static void mlme_cm_ops_init(void)
42 {
43 	if (glbl_cm_ops_cb)
44 		glbl_cm_ops = glbl_cm_ops_cb();
45 }
46 
47 static void mlme_cm_ops_deinit(void)
48 {
49 	if (glbl_cm_ops_cb)
50 		glbl_cm_ops = NULL;
51 }
52 
53 struct mlme_vdev_mgr_ops *glbl_vdev_mgr_ops;
54 osif_vdev_mgr_get_global_ops_cb glbl_vdev_mgr_ops_cb;
55 
56 static void mlme_vdev_mgr_ops_init(void)
57 {
58 	if (glbl_vdev_mgr_ops_cb)
59 		glbl_vdev_mgr_ops = glbl_vdev_mgr_ops_cb();
60 }
61 
62 static void mlme_vdev_mgr_ops_deinit(void)
63 {
64 	if (glbl_vdev_mgr_ops_cb)
65 		glbl_vdev_mgr_ops = NULL;
66 }
67 
68 static void mlme_twt_ops_init(void)
69 {
70 	if (glbl_twt_ops_cb)
71 		glbl_twt_ops = glbl_twt_ops_cb();
72 }
73 
74 static void mlme_twt_ops_deinit(void)
75 {
76 	if (glbl_twt_ops_cb)
77 		glbl_twt_ops = NULL;
78 }
79 
80 QDF_STATUS wlan_cmn_mlme_init(void)
81 {
82 	QDF_STATUS status;
83 
84 	status = wlan_psoc_mlme_init();
85 	if (status != QDF_STATUS_SUCCESS)
86 		return status;
87 
88 	status = wlan_pdev_mlme_init();
89 	if (status != QDF_STATUS_SUCCESS)
90 		return status;
91 
92 	status = wlan_vdev_mlme_init();
93 	if (status != QDF_STATUS_SUCCESS)
94 		return status;
95 
96 	if (glbl_ops_cb)
97 		glbl_ops = glbl_ops_cb();
98 
99 	mlme_cm_ops_init();
100 
101 	mlme_vdev_mgr_ops_init();
102 
103 	mlme_twt_ops_init();
104 
105 	return QDF_STATUS_SUCCESS;
106 }
107 
108 QDF_STATUS wlan_cmn_mlme_deinit(void)
109 {
110 	QDF_STATUS status;
111 
112 	mlme_twt_ops_deinit();
113 
114 	mlme_vdev_mgr_ops_deinit();
115 
116 	mlme_cm_ops_deinit();
117 
118 	status = wlan_vdev_mlme_deinit();
119 	if (status != QDF_STATUS_SUCCESS)
120 		return status;
121 
122 	status = wlan_pdev_mlme_deinit();
123 	if (status != QDF_STATUS_SUCCESS)
124 		return status;
125 
126 	status = wlan_psoc_mlme_deinit();
127 	if (status != QDF_STATUS_SUCCESS)
128 		return status;
129 
130 	return QDF_STATUS_SUCCESS;
131 }
132 
133 QDF_STATUS mlme_psoc_ops_ext_hdl_create(struct psoc_mlme_obj *psoc_mlme)
134 {
135 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
136 
137 	if (glbl_ops && glbl_ops->mlme_psoc_ext_hdl_create)
138 		ret = glbl_ops->mlme_psoc_ext_hdl_create(psoc_mlme);
139 
140 	return ret;
141 }
142 
143 QDF_STATUS mlme_psoc_ext_enable_cb(struct wlan_objmgr_psoc *psoc)
144 {
145 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
146 
147 	if (glbl_ops && glbl_ops->mlme_psoc_ext_hdl_enable)
148 		ret = glbl_ops->mlme_psoc_ext_hdl_enable(psoc);
149 
150 	return ret;
151 }
152 
153 QDF_STATUS mlme_psoc_ext_disable_cb(struct wlan_objmgr_psoc *psoc)
154 {
155 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
156 
157 	if (glbl_ops && glbl_ops->mlme_psoc_ext_hdl_disable)
158 		ret = glbl_ops->mlme_psoc_ext_hdl_disable(psoc);
159 
160 	return ret;
161 }
162 
163 QDF_STATUS mlme_psoc_ops_ext_hdl_destroy(struct psoc_mlme_obj *psoc_mlme)
164 {
165 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
166 
167 	if (glbl_ops && glbl_ops->mlme_psoc_ext_hdl_destroy)
168 		ret = glbl_ops->mlme_psoc_ext_hdl_destroy(psoc_mlme);
169 
170 	return ret;
171 }
172 
173 QDF_STATUS mlme_pdev_ops_ext_hdl_create(struct pdev_mlme_obj *pdev_mlme)
174 {
175 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
176 
177 	if (glbl_ops && glbl_ops->mlme_pdev_ext_hdl_create)
178 		ret = glbl_ops->mlme_pdev_ext_hdl_create(pdev_mlme);
179 
180 	return ret;
181 }
182 
183 QDF_STATUS mlme_pdev_ops_ext_hdl_destroy(struct pdev_mlme_obj *pdev_mlme)
184 {
185 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
186 
187 	if (glbl_ops && glbl_ops->mlme_pdev_ext_hdl_destroy)
188 		ret = glbl_ops->mlme_pdev_ext_hdl_destroy(pdev_mlme);
189 
190 	return ret;
191 }
192 
193 QDF_STATUS mlme_vdev_ops_ext_hdl_create(struct vdev_mlme_obj *vdev_mlme)
194 {
195 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
196 
197 	if (glbl_ops && glbl_ops->mlme_vdev_ext_hdl_create)
198 		ret = glbl_ops->mlme_vdev_ext_hdl_create(vdev_mlme);
199 
200 	return ret;
201 }
202 
203 QDF_STATUS mlme_vdev_ops_ext_hdl_post_create(struct vdev_mlme_obj *vdev_mlme)
204 {
205 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
206 
207 	if (glbl_ops && glbl_ops->mlme_vdev_ext_hdl_post_create)
208 		ret = glbl_ops->mlme_vdev_ext_hdl_post_create(vdev_mlme);
209 
210 	return ret;
211 }
212 
213 QDF_STATUS mlme_vdev_ops_ext_hdl_destroy(struct vdev_mlme_obj *vdev_mlme)
214 {
215 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
216 
217 	if (glbl_ops && glbl_ops->mlme_vdev_ext_hdl_destroy)
218 		ret = glbl_ops->mlme_vdev_ext_hdl_destroy(vdev_mlme);
219 
220 	return ret;
221 }
222 
223 QDF_STATUS mlme_vdev_ops_start_fw_send(struct wlan_objmgr_vdev *vdev,
224 				       uint8_t restart)
225 {
226 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
227 
228 	if (glbl_ops && glbl_ops->mlme_vdev_start_fw_send)
229 		ret = glbl_ops->mlme_vdev_start_fw_send(vdev, restart);
230 
231 	return ret;
232 }
233 
234 QDF_STATUS mlme_vdev_ops_multivdev_restart_fw_cmd_send(
235 						struct wlan_objmgr_pdev *pdev)
236 {
237 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
238 
239 	if (glbl_ops && glbl_ops->mlme_multivdev_restart_fw_send)
240 		ret = glbl_ops->mlme_multivdev_restart_fw_send(pdev);
241 
242 	return ret;
243 }
244 
245 QDF_STATUS mlme_vdev_ops_stop_fw_send(struct wlan_objmgr_vdev *vdev)
246 {
247 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
248 
249 	if (glbl_ops && glbl_ops->mlme_vdev_stop_fw_send)
250 		ret = glbl_ops->mlme_vdev_stop_fw_send(vdev);
251 
252 	return ret;
253 }
254 
255 QDF_STATUS mlme_vdev_ops_down_fw_send(struct wlan_objmgr_vdev *vdev)
256 {
257 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
258 
259 	if (glbl_ops && glbl_ops->mlme_vdev_down_fw_send)
260 		ret = glbl_ops->mlme_vdev_down_fw_send(vdev);
261 
262 	return ret;
263 }
264 
265 QDF_STATUS mlme_vdev_enqueue_exp_ser_cmd(struct vdev_mlme_obj *vdev_mlme,
266 					 uint8_t cmd_type)
267 {
268 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
269 
270 	if (glbl_ops && glbl_ops->mlme_vdev_enqueue_exp_cmd)
271 		ret = glbl_ops->mlme_vdev_enqueue_exp_cmd(vdev_mlme, cmd_type);
272 
273 	return ret;
274 }
275 
276 QDF_STATUS mlme_vdev_ops_ext_hdl_delete_rsp(struct wlan_objmgr_psoc *psoc,
277 					    struct vdev_delete_response *rsp)
278 {
279 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
280 
281 	if ((glbl_ops) && glbl_ops->mlme_vdev_ext_delete_rsp)
282 		ret = glbl_ops->mlme_vdev_ext_delete_rsp(psoc, rsp);
283 
284 	return ret;
285 }
286 
287 QDF_STATUS mlme_vdev_ops_ext_hdl_multivdev_restart_resp(
288 					struct wlan_objmgr_psoc *psoc,
289 					struct multi_vdev_restart_resp *resp)
290 {
291 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
292 
293 	if ((glbl_ops) && glbl_ops->mlme_multi_vdev_restart_resp)
294 		ret = glbl_ops->mlme_multi_vdev_restart_resp(psoc, resp);
295 
296 	return ret;
297 }
298 
299 QDF_STATUS mlme_cm_ext_hdl_create(struct wlan_objmgr_vdev *vdev,
300 				  cm_ext_t **ext_cm_ptr)
301 {
302 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
303 
304 	if (glbl_ops && glbl_ops->mlme_cm_ext_hdl_create_cb)
305 		ret = glbl_ops->mlme_cm_ext_hdl_create_cb(vdev, ext_cm_ptr);
306 
307 	return ret;
308 }
309 
310 QDF_STATUS mlme_cm_ext_hdl_destroy(struct wlan_objmgr_vdev *vdev,
311 				   cm_ext_t *ext_cm_ptr)
312 {
313 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
314 
315 	if (glbl_ops && glbl_ops->mlme_cm_ext_hdl_destroy_cb)
316 		ret = glbl_ops->mlme_cm_ext_hdl_destroy_cb(vdev, ext_cm_ptr);
317 
318 	return ret;
319 }
320 
321 QDF_STATUS mlme_cm_connect_start_ind(struct wlan_objmgr_vdev *vdev,
322 				     struct wlan_cm_connect_req *req)
323 {
324 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
325 
326 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_connect_start_ind_cb)
327 		ret = glbl_ops->mlme_cm_ext_connect_start_ind_cb(vdev, req);
328 
329 	return ret;
330 }
331 
332 QDF_STATUS mlme_ext_hdl_get_acs_in_progress(struct wlan_objmgr_vdev *vdev,
333 					    bool *acs_in_progress)
334 {
335 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
336 
337 	if ((glbl_ops) && glbl_ops->mlme_ext_get_acs_inprogress)
338 		ret = glbl_ops->mlme_ext_get_acs_inprogress(vdev,
339 							    acs_in_progress);
340 
341 	return ret;
342 }
343 
344 QDF_STATUS mlme_cm_bss_select_ind(struct wlan_objmgr_vdev *vdev,
345 				  struct wlan_cm_vdev_connect_req *req)
346 {
347 	QDF_STATUS ret = QDF_STATUS_E_NOSUPPORT;
348 
349 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_bss_select_ind_cb)
350 		ret = glbl_ops->mlme_cm_ext_bss_select_ind_cb(vdev, req);
351 
352 	return ret;
353 }
354 
355 QDF_STATUS mlme_cm_bss_peer_create_req(struct wlan_objmgr_vdev *vdev,
356 				       struct qdf_mac_addr *peer_mac,
357 				       struct qdf_mac_addr *mld_mac,
358 				       bool is_assoc_link)
359 {
360 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
361 
362 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_bss_peer_create_req_cb)
363 		ret = glbl_ops->mlme_cm_ext_bss_peer_create_req_cb(
364 				vdev, peer_mac, mld_mac, is_assoc_link);
365 
366 	return ret;
367 }
368 
369 QDF_STATUS mlme_cm_connect_req(struct wlan_objmgr_vdev *vdev,
370 			       struct wlan_cm_vdev_connect_req *req)
371 {
372 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
373 
374 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_connect_req_cb)
375 		ret = glbl_ops->mlme_cm_ext_connect_req_cb(vdev, req);
376 
377 	return ret;
378 }
379 
380 QDF_STATUS mlme_cm_roam_start_ind(struct wlan_objmgr_vdev *vdev,
381 				  struct wlan_cm_roam_req *req)
382 {
383 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
384 
385 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_roam_start_ind_cb)
386 		ret = glbl_ops->mlme_cm_ext_roam_start_ind_cb(vdev, req);
387 
388 	return ret;
389 }
390 
391 QDF_STATUS mlme_cm_rso_stop_req(struct wlan_objmgr_vdev *vdev)
392 {
393 	QDF_STATUS ret = QDF_STATUS_E_NOSUPPORT;
394 
395 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_rso_stop_cb)
396 		ret = glbl_ops->mlme_cm_ext_rso_stop_cb(vdev);
397 
398 	return ret;
399 }
400 
401 QDF_STATUS mlme_cm_reassoc_req(struct wlan_objmgr_vdev *vdev,
402 			       struct wlan_cm_vdev_reassoc_req *req)
403 {
404 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
405 
406 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_reassoc_req_cb)
407 		ret = glbl_ops->mlme_cm_ext_reassoc_req_cb(vdev, req);
408 
409 	return ret;
410 }
411 
412 #ifdef CONN_MGR_ADV_FEATURE
413 void mlme_cm_osif_connect_active_notify(uint8_t vdev_id)
414 {
415 	if (glbl_cm_ops && glbl_cm_ops->mlme_cm_connect_active_notify_cb)
416 		glbl_cm_ops->mlme_cm_connect_active_notify_cb(vdev_id);
417 }
418 #endif
419 
420 QDF_STATUS mlme_cm_connect_complete_ind(struct wlan_objmgr_vdev *vdev,
421 					struct wlan_cm_connect_resp *rsp)
422 {
423 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
424 
425 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_connect_complete_ind_cb)
426 		ret = glbl_ops->mlme_cm_ext_connect_complete_ind_cb(vdev, rsp);
427 
428 	return ret;
429 }
430 
431 QDF_STATUS mlme_cm_disconnect_start_ind(struct wlan_objmgr_vdev *vdev,
432 					struct wlan_cm_disconnect_req *req)
433 {
434 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
435 
436 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_disconnect_start_ind_cb)
437 		ret = glbl_ops->mlme_cm_ext_disconnect_start_ind_cb(vdev, req);
438 
439 	return ret;
440 }
441 
442 QDF_STATUS mlme_cm_disconnect_req(struct wlan_objmgr_vdev *vdev,
443 				  struct wlan_cm_vdev_discon_req *req)
444 {
445 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
446 
447 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_disconnect_req_cb)
448 		ret = glbl_ops->mlme_cm_ext_disconnect_req_cb(vdev, req);
449 
450 	return ret;
451 }
452 
453 QDF_STATUS mlme_cm_bss_peer_delete_req(struct wlan_objmgr_vdev *vdev)
454 {
455 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
456 
457 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_bss_peer_delete_req_cb)
458 		ret = glbl_ops->mlme_cm_ext_bss_peer_delete_req_cb(vdev);
459 
460 	return ret;
461 }
462 
463 QDF_STATUS mlme_cm_disconnect_complete_ind(struct wlan_objmgr_vdev *vdev,
464 					   struct wlan_cm_discon_rsp *rsp)
465 {
466 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
467 
468 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_disconnect_complete_ind_cb)
469 		ret = glbl_ops->mlme_cm_ext_disconnect_complete_ind_cb(vdev,
470 								       rsp);
471 
472 	return ret;
473 }
474 
475 QDF_STATUS mlme_cm_vdev_down_req(struct wlan_objmgr_vdev *vdev)
476 {
477 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
478 
479 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_vdev_down_req_cb)
480 		ret = glbl_ops->mlme_cm_ext_vdev_down_req_cb(vdev);
481 	return ret;
482 }
483 
484 QDF_STATUS mlme_cm_osif_connect_complete(struct wlan_objmgr_vdev *vdev,
485 				    struct wlan_cm_connect_resp *rsp)
486 {
487 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
488 
489 	if (glbl_cm_ops && glbl_cm_ops->mlme_cm_connect_complete_cb)
490 		ret = glbl_cm_ops->mlme_cm_connect_complete_cb(vdev, rsp);
491 
492 	return ret;
493 }
494 
495 QDF_STATUS
496 mlme_cm_osif_failed_candidate_ind(struct wlan_objmgr_vdev *vdev,
497 				  struct wlan_cm_connect_resp *rsp)
498 {
499 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
500 
501 	if (glbl_cm_ops &&
502 	    glbl_cm_ops->mlme_cm_failed_candidate_cb)
503 		ret = glbl_cm_ops->mlme_cm_failed_candidate_cb(vdev, rsp);
504 
505 	return ret;
506 }
507 
508 QDF_STATUS mlme_cm_osif_update_id_and_src(struct wlan_objmgr_vdev *vdev,
509 					  enum wlan_cm_source source,
510 					  wlan_cm_id cm_id)
511 {
512 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
513 
514 	if (glbl_cm_ops &&
515 	    glbl_cm_ops->mlme_cm_update_id_and_src_cb)
516 		ret = glbl_cm_ops->mlme_cm_update_id_and_src_cb(vdev, source,
517 								cm_id);
518 
519 	return ret;
520 }
521 
522 QDF_STATUS mlme_cm_osif_disconnect_complete(struct wlan_objmgr_vdev *vdev,
523 					    struct wlan_cm_discon_rsp *rsp)
524 {
525 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
526 
527 	if (glbl_cm_ops &&
528 	    glbl_cm_ops->mlme_cm_disconnect_complete_cb)
529 		ret = glbl_cm_ops->mlme_cm_disconnect_complete_cb(vdev, rsp);
530 
531 	return ret;
532 }
533 
534 QDF_STATUS mlme_cm_osif_disconnect_start_ind(struct wlan_objmgr_vdev *vdev,
535 					     enum wlan_cm_source source)
536 {
537 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
538 
539 	if (glbl_cm_ops &&
540 	    glbl_cm_ops->mlme_cm_disconnect_start_cb)
541 		ret = glbl_cm_ops->mlme_cm_disconnect_start_cb(vdev, source);
542 
543 	return ret;
544 }
545 
546 #ifdef WLAN_VENDOR_HANDOFF_CONTROL
547 QDF_STATUS mlme_cm_osif_get_vendor_handoff_params(struct wlan_objmgr_psoc *psoc,
548 						  void *vendor_handoff_context)
549 {
550 	if (glbl_cm_ops && glbl_cm_ops->mlme_cm_get_vendor_handoff_params_cb)
551 		return glbl_cm_ops->mlme_cm_get_vendor_handoff_params_cb(psoc,
552 							vendor_handoff_context);
553 
554 	return QDF_STATUS_E_FAILURE;
555 }
556 #endif
557 
558 #ifdef CONN_MGR_ADV_FEATURE
559 QDF_STATUS mlme_cm_osif_roam_sync_ind(struct wlan_objmgr_vdev *vdev)
560 {
561 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
562 
563 	if (glbl_cm_ops &&
564 	    glbl_cm_ops->mlme_cm_roam_sync_cb)
565 		ret = glbl_cm_ops->mlme_cm_roam_sync_cb(vdev);
566 
567 	return ret;
568 }
569 
570 QDF_STATUS mlme_cm_osif_pmksa_candidate_notify(struct wlan_objmgr_vdev *vdev,
571 					       struct qdf_mac_addr *bssid,
572 					       int index, bool preauth)
573 {
574 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
575 
576 	if (glbl_cm_ops &&
577 	    glbl_cm_ops->mlme_cm_pmksa_candidate_notify_cb)
578 		ret = glbl_cm_ops->mlme_cm_pmksa_candidate_notify_cb(
579 						vdev, bssid, index, preauth);
580 
581 	return ret;
582 }
583 
584 QDF_STATUS mlme_cm_osif_send_keys(struct wlan_objmgr_vdev *vdev,
585 				  uint8_t key_index, bool pairwise,
586 				  enum wlan_crypto_cipher_type cipher_type)
587 {
588 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
589 
590 	if (glbl_cm_ops && glbl_cm_ops->mlme_cm_send_keys_cb)
591 		ret = glbl_cm_ops->mlme_cm_send_keys_cb(vdev, key_index,
592 							pairwise,
593 							cipher_type);
594 
595 	return ret;
596 }
597 
598 QDF_STATUS mlme_cm_osif_link_reconfig_notify(struct wlan_objmgr_vdev *vdev)
599 {
600 	QDF_STATUS ret = QDF_STATUS_E_INVAL;
601 
602 	if (glbl_cm_ops &&
603 	    glbl_cm_ops->mlme_cm_link_reconfig_notify_cb)
604 		ret = glbl_cm_ops->mlme_cm_link_reconfig_notify_cb(vdev);
605 
606 	return ret;
607 }
608 #endif
609 
610 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
611 QDF_STATUS mlme_cm_osif_roam_start_ind(struct wlan_objmgr_vdev *vdev)
612 {
613 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
614 
615 	if (glbl_cm_ops &&
616 	    glbl_cm_ops->mlme_cm_roam_start_cb)
617 		ret = glbl_cm_ops->mlme_cm_roam_start_cb(vdev);
618 
619 	return ret;
620 }
621 
622 QDF_STATUS mlme_cm_osif_roam_abort_ind(struct wlan_objmgr_vdev *vdev)
623 {
624 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
625 
626 	if (glbl_cm_ops &&
627 	    glbl_cm_ops->mlme_cm_roam_abort_cb)
628 		ret = glbl_cm_ops->mlme_cm_roam_abort_cb(vdev);
629 
630 	return ret;
631 }
632 
633 QDF_STATUS
634 mlme_cm_osif_roam_complete(struct wlan_objmgr_vdev *vdev)
635 {
636 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
637 
638 	if (glbl_cm_ops &&
639 	    glbl_cm_ops->mlme_cm_roam_cmpl_cb)
640 		ret = glbl_cm_ops->mlme_cm_roam_cmpl_cb(vdev);
641 
642 	return ret;
643 }
644 
645 void
646 mlme_cm_osif_roam_rt_stats(struct roam_stats_event *roam_stats,
647 			   uint8_t idx)
648 {
649 	if (glbl_cm_ops &&
650 	    glbl_cm_ops->mlme_cm_roam_rt_stats_cb)
651 		glbl_cm_ops->mlme_cm_roam_rt_stats_cb(roam_stats,
652 						      idx);
653 }
654 
655 QDF_STATUS
656 mlme_cm_osif_roam_get_scan_params(struct wlan_objmgr_vdev *vdev,
657 				  struct element_info *scan_ie,
658 				  enum dot11_mode_filter *dot11mode_filter)
659 {
660 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
661 
662 	if (glbl_cm_ops &&
663 	    glbl_cm_ops->mlme_cm_roam_get_scan_ie_cb)
664 		ret = glbl_cm_ops->mlme_cm_roam_get_scan_ie_cb(vdev,
665 						scan_ie, dot11mode_filter);
666 
667 	return ret;
668 }
669 
670 #endif
671 
672 #ifdef WLAN_FEATURE_PREAUTH_ENABLE
673 QDF_STATUS
674 mlme_cm_osif_ft_preauth_complete(struct wlan_objmgr_vdev *vdev,
675 				 struct wlan_preauth_rsp *rsp)
676 {
677 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
678 
679 	if (glbl_cm_ops &&
680 	    glbl_cm_ops->mlme_cm_ft_preauth_cmpl_cb)
681 		ret = glbl_cm_ops->mlme_cm_ft_preauth_cmpl_cb(vdev, rsp);
682 
683 	return ret;
684 }
685 
686 #ifdef FEATURE_WLAN_ESE
687 QDF_STATUS
688 mlme_cm_osif_cckm_preauth_complete(struct wlan_objmgr_vdev *vdev,
689 				   struct wlan_preauth_rsp *rsp)
690 {
691 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
692 
693 	if (glbl_cm_ops &&
694 	    glbl_cm_ops->mlme_cm_cckm_preauth_cmpl_cb)
695 		ret = glbl_cm_ops->mlme_cm_cckm_preauth_cmpl_cb(vdev, rsp);
696 
697 	return ret;
698 }
699 #endif
700 #endif
701 
702 void mlme_set_osif_cm_cb(osif_cm_get_global_ops_cb osif_cm_ops)
703 {
704 	glbl_cm_ops_cb = osif_cm_ops;
705 }
706 
707 void mlme_set_osif_twt_cb(osif_twt_get_global_ops_cb osif_twt_ops)
708 {
709 	glbl_twt_ops_cb = osif_twt_ops;
710 }
711 
712 void mlme_set_ops_register_cb(mlme_get_global_ops_cb ops_cb)
713 {
714 	glbl_ops_cb = ops_cb;
715 }
716 
717 void mlme_send_scan_done_complete_cb(uint8_t vdev_id)
718 {
719 	if (glbl_vdev_mgr_ops &&
720 	    glbl_vdev_mgr_ops->mlme_vdev_mgr_send_scan_done_complete_cb)
721 		glbl_vdev_mgr_ops->mlme_vdev_mgr_send_scan_done_complete_cb(
722 							vdev_id);
723 }
724 
725 bool mlme_max_chan_switch_is_set(struct wlan_objmgr_psoc *psoc)
726 {
727 	struct psoc_mlme_obj *mlme_psoc_obj;
728 	struct psoc_phy_config *phy_config;
729 
730 	if (!psoc)
731 		return false;
732 
733 	mlme_psoc_obj = wlan_psoc_mlme_get_cmpt_obj(psoc);
734 	if (!mlme_psoc_obj)
735 		return false;
736 
737 	phy_config = &mlme_psoc_obj->psoc_cfg.phy_config;
738 
739 	return phy_config->max_chan_switch_ie;
740 }
741 
742 void mlme_set_osif_vdev_mgr_cb(
743 			osif_vdev_mgr_get_global_ops_cb mlme_vdev_mgr_osif_ops)
744 {
745 	glbl_vdev_mgr_ops_cb = mlme_vdev_mgr_osif_ops;
746 }
747 
748 #ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE
749 QDF_STATUS mlme_vdev_ops_send_set_mac_address(struct qdf_mac_addr mac_addr,
750 					      struct qdf_mac_addr mld_addr,
751 					      struct wlan_objmgr_vdev *vdev)
752 {
753 	QDF_STATUS ret = QDF_STATUS_E_FAILURE;
754 
755 	if (glbl_ops && glbl_ops->mlme_vdev_send_set_mac_addr)
756 		ret = glbl_ops->mlme_vdev_send_set_mac_addr(mac_addr, mld_addr,
757 							    vdev);
758 
759 	return ret;
760 }
761 
762 void mlme_vdev_mgr_notify_set_mac_addr_response(uint8_t vdev_id,
763 						uint8_t resp_status)
764 {
765 	if (glbl_vdev_mgr_ops &&
766 	    glbl_vdev_mgr_ops->mlme_vdev_mgr_set_mac_addr_response)
767 		glbl_vdev_mgr_ops->mlme_vdev_mgr_set_mac_addr_response(
768 							vdev_id, resp_status);
769 }
770 #endif
771 
772 #if defined(WLAN_SUPPORT_TWT) && defined(WLAN_TWT_CONV_SUPPORTED)
773 QDF_STATUS
774 mlme_twt_osif_enable_complete_ind(struct wlan_objmgr_psoc *psoc,
775 				  struct twt_enable_complete_event_param *event,
776 				  void *context)
777 {
778 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
779 
780 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_enable_complete_cb)
781 		ret = glbl_twt_ops->mlme_twt_enable_complete_cb(psoc,
782 								event, context);
783 
784 	return ret;
785 }
786 
787 QDF_STATUS
788 mlme_twt_osif_disable_complete_ind(struct wlan_objmgr_psoc *psoc,
789 				 struct twt_disable_complete_event_param *event,
790 				 void *context)
791 {
792 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
793 
794 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_disable_complete_cb)
795 		ret = glbl_twt_ops->mlme_twt_disable_complete_cb(psoc,
796 								event, context);
797 
798 	return ret;
799 }
800 
801 QDF_STATUS
802 mlme_twt_osif_ack_complete_ind(struct wlan_objmgr_psoc *psoc,
803 			       struct twt_ack_complete_event_param *event,
804 			       void *context)
805 {
806 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
807 
808 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_ack_complete_cb)
809 		ret = glbl_twt_ops->mlme_twt_ack_complete_cb(psoc,
810 							     event, context);
811 
812 	return ret;
813 }
814 
815 QDF_STATUS
816 mlme_twt_osif_setup_complete_ind(struct wlan_objmgr_psoc *psoc,
817 				 struct twt_add_dialog_complete_event *event,
818 				 bool renego)
819 {
820 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
821 
822 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_setup_complete_cb)
823 		ret = glbl_twt_ops->mlme_twt_setup_complete_cb(psoc, event,
824 							       renego);
825 
826 	return ret;
827 }
828 
829 QDF_STATUS
830 mlme_twt_osif_teardown_complete_ind(struct wlan_objmgr_psoc *psoc,
831 			    struct twt_del_dialog_complete_event_param *event)
832 {
833 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
834 
835 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_teardown_complete_cb)
836 		ret = glbl_twt_ops->mlme_twt_teardown_complete_cb(psoc, event);
837 
838 	return ret;
839 }
840 
841 QDF_STATUS
842 mlme_twt_osif_pause_complete_ind(struct wlan_objmgr_psoc *psoc,
843 			    struct twt_pause_dialog_complete_event_param *event)
844 {
845 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
846 
847 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_pause_complete_cb)
848 		ret = glbl_twt_ops->mlme_twt_pause_complete_cb(psoc, event);
849 
850 	return ret;
851 }
852 
853 QDF_STATUS
854 mlme_twt_osif_resume_complete_ind(struct wlan_objmgr_psoc *psoc,
855 			   struct twt_resume_dialog_complete_event_param *event)
856 {
857 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
858 
859 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_resume_complete_cb)
860 		ret = glbl_twt_ops->mlme_twt_resume_complete_cb(psoc, event);
861 
862 	return ret;
863 }
864 
865 QDF_STATUS
866 mlme_twt_osif_nudge_complete_ind(struct wlan_objmgr_psoc *psoc,
867 			    struct twt_nudge_dialog_complete_event_param *event)
868 {
869 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
870 
871 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_nudge_complete_cb)
872 		ret = glbl_twt_ops->mlme_twt_nudge_complete_cb(psoc, event);
873 
874 	return ret;
875 }
876 
877 QDF_STATUS
878 mlme_twt_osif_notify_complete_ind(struct wlan_objmgr_psoc *psoc,
879 				  struct twt_notify_event_param *event)
880 {
881 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
882 
883 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_notify_complete_cb)
884 		ret = glbl_twt_ops->mlme_twt_notify_complete_cb(psoc, event);
885 
886 	return ret;
887 }
888 
889 QDF_STATUS
890 mlme_twt_vdev_create_notification(struct wlan_objmgr_vdev *vdev)
891 {
892 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
893 
894 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_vdev_create_cb)
895 		ret = glbl_twt_ops->mlme_twt_vdev_create_cb(vdev);
896 
897 	return ret;
898 }
899 
900 QDF_STATUS
901 mlme_twt_vdev_destroy_notification(struct wlan_objmgr_vdev *vdev)
902 {
903 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
904 
905 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_vdev_destroy_cb)
906 		ret = glbl_twt_ops->mlme_twt_vdev_destroy_cb(vdev);
907 
908 	return ret;
909 }
910 
911 #endif
912 
913 void mlme_vdev_reconfig_timer_cb(void *arg)
914 {
915 	struct vdev_mlme_obj *vdev_mlme;
916 
917 	vdev_mlme = (struct vdev_mlme_obj *)arg;
918 	if (!vdev_mlme)
919 		return;
920 
921 	if ((vdev_mlme->ops) &&
922 	    vdev_mlme->ops->mlme_vdev_reconfig_timer_complete)
923 		vdev_mlme->ops->mlme_vdev_reconfig_timer_complete(vdev_mlme);
924 }
925 
926 bool mlme_mlo_is_reconfig_reassoc_enable(struct wlan_objmgr_psoc *psoc)
927 {
928 	struct psoc_mlme_obj *mlme_psoc_obj;
929 	struct psoc_mlo_config *mlo_config;
930 
931 	if (!psoc)
932 		return false;
933 
934 	mlme_psoc_obj = wlan_psoc_mlme_get_cmpt_obj(psoc);
935 	if (!mlme_psoc_obj)
936 		return false;
937 
938 	mlo_config = &mlme_psoc_obj->psoc_cfg.mlo_config;
939 
940 	return mlo_config->reconfig_reassoc_en;
941 }
942 
943 #ifdef WLAN_BOOST_CPU_FREQ_IN_ROAM
944 void mlme_cm_osif_perfd_reset_cpufreq(void)
945 {
946 	if (glbl_cm_ops && glbl_cm_ops->mlme_cm_perfd_reset_cpufreq_ctrl_cb)
947 		glbl_cm_ops->mlme_cm_perfd_reset_cpufreq_ctrl_cb();
948 }
949 #endif
950