xref: /wlan-dirver/qca-wifi-host-cmn/umac/mlme/mlme_objmgr/dispatcher/src/wlan_cmn_mlme_main.c (revision d0c05845839e5f2ba5a8dcebe0cd3e4cd4e8dfcf)
1 /*
2  * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for 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_ops_ext_hdl_destroy(struct psoc_mlme_obj *psoc_mlme)
144 {
145 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
146 
147 	if (glbl_ops && glbl_ops->mlme_psoc_ext_hdl_destroy)
148 		ret = glbl_ops->mlme_psoc_ext_hdl_destroy(psoc_mlme);
149 
150 	return ret;
151 }
152 
153 QDF_STATUS mlme_pdev_ops_ext_hdl_create(struct pdev_mlme_obj *pdev_mlme)
154 {
155 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
156 
157 	if (glbl_ops && glbl_ops->mlme_pdev_ext_hdl_create)
158 		ret = glbl_ops->mlme_pdev_ext_hdl_create(pdev_mlme);
159 
160 	return ret;
161 }
162 
163 QDF_STATUS mlme_pdev_ops_ext_hdl_destroy(struct pdev_mlme_obj *pdev_mlme)
164 {
165 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
166 
167 	if (glbl_ops && glbl_ops->mlme_pdev_ext_hdl_destroy)
168 		ret = glbl_ops->mlme_pdev_ext_hdl_destroy(pdev_mlme);
169 
170 	return ret;
171 }
172 
173 QDF_STATUS mlme_vdev_ops_ext_hdl_create(struct vdev_mlme_obj *vdev_mlme)
174 {
175 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
176 
177 	if (glbl_ops && glbl_ops->mlme_vdev_ext_hdl_create)
178 		ret = glbl_ops->mlme_vdev_ext_hdl_create(vdev_mlme);
179 
180 	return ret;
181 }
182 
183 QDF_STATUS mlme_vdev_ops_ext_hdl_post_create(struct vdev_mlme_obj *vdev_mlme)
184 {
185 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
186 
187 	if (glbl_ops && glbl_ops->mlme_vdev_ext_hdl_post_create)
188 		ret = glbl_ops->mlme_vdev_ext_hdl_post_create(vdev_mlme);
189 
190 	return ret;
191 }
192 
193 QDF_STATUS mlme_vdev_ops_ext_hdl_destroy(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_destroy)
198 		ret = glbl_ops->mlme_vdev_ext_hdl_destroy(vdev_mlme);
199 
200 	return ret;
201 }
202 
203 QDF_STATUS mlme_vdev_ops_start_fw_send(struct wlan_objmgr_vdev *vdev,
204 				       uint8_t restart)
205 {
206 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
207 
208 	if (glbl_ops && glbl_ops->mlme_vdev_start_fw_send)
209 		ret = glbl_ops->mlme_vdev_start_fw_send(vdev, restart);
210 
211 	return ret;
212 }
213 
214 QDF_STATUS mlme_vdev_ops_multivdev_restart_fw_cmd_send(
215 						struct wlan_objmgr_pdev *pdev)
216 {
217 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
218 
219 	if (glbl_ops && glbl_ops->mlme_multivdev_restart_fw_send)
220 		ret = glbl_ops->mlme_multivdev_restart_fw_send(pdev);
221 
222 	return ret;
223 }
224 
225 QDF_STATUS mlme_vdev_ops_stop_fw_send(struct wlan_objmgr_vdev *vdev)
226 {
227 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
228 
229 	if (glbl_ops && glbl_ops->mlme_vdev_stop_fw_send)
230 		ret = glbl_ops->mlme_vdev_stop_fw_send(vdev);
231 
232 	return ret;
233 }
234 
235 QDF_STATUS mlme_vdev_ops_down_fw_send(struct wlan_objmgr_vdev *vdev)
236 {
237 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
238 
239 	if (glbl_ops && glbl_ops->mlme_vdev_down_fw_send)
240 		ret = glbl_ops->mlme_vdev_down_fw_send(vdev);
241 
242 	return ret;
243 }
244 
245 QDF_STATUS mlme_vdev_enqueue_exp_ser_cmd(struct vdev_mlme_obj *vdev_mlme,
246 					 uint8_t cmd_type)
247 {
248 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
249 
250 	if (glbl_ops && glbl_ops->mlme_vdev_enqueue_exp_cmd)
251 		ret = glbl_ops->mlme_vdev_enqueue_exp_cmd(vdev_mlme, cmd_type);
252 
253 	return ret;
254 }
255 
256 QDF_STATUS mlme_vdev_ops_ext_hdl_delete_rsp(struct wlan_objmgr_psoc *psoc,
257 					    struct vdev_delete_response *rsp)
258 {
259 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
260 
261 	if ((glbl_ops) && glbl_ops->mlme_vdev_ext_delete_rsp)
262 		ret = glbl_ops->mlme_vdev_ext_delete_rsp(psoc, rsp);
263 
264 	return ret;
265 }
266 
267 QDF_STATUS mlme_vdev_ops_ext_hdl_multivdev_restart_resp(
268 					struct wlan_objmgr_psoc *psoc,
269 					struct multi_vdev_restart_resp *resp)
270 {
271 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
272 
273 	if ((glbl_ops) && glbl_ops->mlme_multi_vdev_restart_resp)
274 		ret = glbl_ops->mlme_multi_vdev_restart_resp(psoc, resp);
275 
276 	return ret;
277 }
278 
279 QDF_STATUS mlme_cm_ext_hdl_create(struct wlan_objmgr_vdev *vdev,
280 				  cm_ext_t **ext_cm_ptr)
281 {
282 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
283 
284 	if (glbl_ops && glbl_ops->mlme_cm_ext_hdl_create_cb)
285 		ret = glbl_ops->mlme_cm_ext_hdl_create_cb(vdev, ext_cm_ptr);
286 
287 	return ret;
288 }
289 
290 QDF_STATUS mlme_cm_ext_hdl_destroy(struct wlan_objmgr_vdev *vdev,
291 				   cm_ext_t *ext_cm_ptr)
292 {
293 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
294 
295 	if (glbl_ops && glbl_ops->mlme_cm_ext_hdl_destroy_cb)
296 		ret = glbl_ops->mlme_cm_ext_hdl_destroy_cb(vdev, ext_cm_ptr);
297 
298 	return ret;
299 }
300 
301 QDF_STATUS mlme_cm_connect_start_ind(struct wlan_objmgr_vdev *vdev,
302 				     struct wlan_cm_connect_req *req)
303 {
304 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
305 
306 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_connect_start_ind_cb)
307 		ret = glbl_ops->mlme_cm_ext_connect_start_ind_cb(vdev, req);
308 
309 	return ret;
310 }
311 
312 QDF_STATUS mlme_ext_hdl_get_acs_in_progress(struct wlan_objmgr_vdev *vdev,
313 					    bool *acs_in_progress)
314 {
315 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
316 
317 	if ((glbl_ops) && glbl_ops->mlme_ext_get_acs_inprogress)
318 		ret = glbl_ops->mlme_ext_get_acs_inprogress(vdev,
319 							    acs_in_progress);
320 
321 	return ret;
322 }
323 
324 QDF_STATUS mlme_cm_bss_select_ind(struct wlan_objmgr_vdev *vdev,
325 				  struct wlan_cm_vdev_connect_req *req)
326 {
327 	QDF_STATUS ret = QDF_STATUS_E_NOSUPPORT;
328 
329 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_bss_select_ind_cb)
330 		ret = glbl_ops->mlme_cm_ext_bss_select_ind_cb(vdev, req);
331 
332 	return ret;
333 }
334 
335 QDF_STATUS mlme_cm_bss_peer_create_req(struct wlan_objmgr_vdev *vdev,
336 				       struct qdf_mac_addr *peer_mac,
337 				       struct qdf_mac_addr *mld_mac,
338 				       bool is_assoc_link)
339 {
340 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
341 
342 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_bss_peer_create_req_cb)
343 		ret = glbl_ops->mlme_cm_ext_bss_peer_create_req_cb(
344 				vdev, peer_mac, mld_mac, is_assoc_link);
345 
346 	return ret;
347 }
348 
349 QDF_STATUS mlme_cm_connect_req(struct wlan_objmgr_vdev *vdev,
350 			       struct wlan_cm_vdev_connect_req *req)
351 {
352 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
353 
354 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_connect_req_cb)
355 		ret = glbl_ops->mlme_cm_ext_connect_req_cb(vdev, req);
356 
357 	return ret;
358 }
359 
360 QDF_STATUS mlme_cm_roam_start_ind(struct wlan_objmgr_vdev *vdev,
361 				  struct wlan_cm_roam_req *req)
362 {
363 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
364 
365 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_roam_start_ind_cb)
366 		ret = glbl_ops->mlme_cm_ext_roam_start_ind_cb(vdev, req);
367 
368 	return ret;
369 }
370 
371 QDF_STATUS mlme_cm_rso_stop_req(struct wlan_objmgr_vdev *vdev)
372 {
373 	QDF_STATUS ret = QDF_STATUS_E_NOSUPPORT;
374 
375 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_rso_stop_cb)
376 		ret = glbl_ops->mlme_cm_ext_rso_stop_cb(vdev);
377 
378 	return ret;
379 }
380 
381 QDF_STATUS mlme_cm_reassoc_req(struct wlan_objmgr_vdev *vdev,
382 			       struct wlan_cm_vdev_reassoc_req *req)
383 {
384 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
385 
386 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_reassoc_req_cb)
387 		ret = glbl_ops->mlme_cm_ext_reassoc_req_cb(vdev, req);
388 
389 	return ret;
390 }
391 
392 QDF_STATUS mlme_cm_connect_complete_ind(struct wlan_objmgr_vdev *vdev,
393 					struct wlan_cm_connect_resp *rsp)
394 {
395 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
396 
397 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_connect_complete_ind_cb)
398 		ret = glbl_ops->mlme_cm_ext_connect_complete_ind_cb(vdev, rsp);
399 
400 	return ret;
401 }
402 
403 QDF_STATUS mlme_cm_disconnect_start_ind(struct wlan_objmgr_vdev *vdev,
404 					struct wlan_cm_disconnect_req *req)
405 {
406 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
407 
408 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_disconnect_start_ind_cb)
409 		ret = glbl_ops->mlme_cm_ext_disconnect_start_ind_cb(vdev, req);
410 
411 	return ret;
412 }
413 
414 QDF_STATUS mlme_cm_disconnect_req(struct wlan_objmgr_vdev *vdev,
415 				  struct wlan_cm_vdev_discon_req *req)
416 {
417 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
418 
419 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_disconnect_req_cb)
420 		ret = glbl_ops->mlme_cm_ext_disconnect_req_cb(vdev, req);
421 
422 	return ret;
423 }
424 
425 QDF_STATUS mlme_cm_bss_peer_delete_req(struct wlan_objmgr_vdev *vdev)
426 {
427 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
428 
429 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_bss_peer_delete_req_cb)
430 		ret = glbl_ops->mlme_cm_ext_bss_peer_delete_req_cb(vdev);
431 
432 	return ret;
433 }
434 
435 QDF_STATUS mlme_cm_disconnect_complete_ind(struct wlan_objmgr_vdev *vdev,
436 					   struct wlan_cm_discon_rsp *rsp)
437 {
438 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
439 
440 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_disconnect_complete_ind_cb)
441 		ret = glbl_ops->mlme_cm_ext_disconnect_complete_ind_cb(vdev,
442 								       rsp);
443 
444 	return ret;
445 }
446 
447 QDF_STATUS mlme_cm_vdev_down_req(struct wlan_objmgr_vdev *vdev)
448 {
449 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
450 
451 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_vdev_down_req_cb)
452 		ret = glbl_ops->mlme_cm_ext_vdev_down_req_cb(vdev);
453 	return ret;
454 }
455 
456 QDF_STATUS mlme_cm_osif_connect_complete(struct wlan_objmgr_vdev *vdev,
457 				    struct wlan_cm_connect_resp *rsp)
458 {
459 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
460 
461 	if (glbl_cm_ops && glbl_cm_ops->mlme_cm_connect_complete_cb)
462 		ret = glbl_cm_ops->mlme_cm_connect_complete_cb(vdev, rsp);
463 
464 	return ret;
465 }
466 
467 QDF_STATUS
468 mlme_cm_osif_failed_candidate_ind(struct wlan_objmgr_vdev *vdev,
469 				  struct wlan_cm_connect_resp *rsp)
470 {
471 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
472 
473 	if (glbl_cm_ops &&
474 	    glbl_cm_ops->mlme_cm_failed_candidate_cb)
475 		ret = glbl_cm_ops->mlme_cm_failed_candidate_cb(vdev, rsp);
476 
477 	return ret;
478 }
479 
480 QDF_STATUS mlme_cm_osif_update_id_and_src(struct wlan_objmgr_vdev *vdev,
481 					  enum wlan_cm_source source,
482 					  wlan_cm_id cm_id)
483 {
484 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
485 
486 	if (glbl_cm_ops &&
487 	    glbl_cm_ops->mlme_cm_update_id_and_src_cb)
488 		ret = glbl_cm_ops->mlme_cm_update_id_and_src_cb(vdev, source,
489 								cm_id);
490 
491 	return ret;
492 }
493 
494 QDF_STATUS mlme_cm_osif_disconnect_complete(struct wlan_objmgr_vdev *vdev,
495 					    struct wlan_cm_discon_rsp *rsp)
496 {
497 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
498 
499 	if (glbl_cm_ops &&
500 	    glbl_cm_ops->mlme_cm_disconnect_complete_cb)
501 		ret = glbl_cm_ops->mlme_cm_disconnect_complete_cb(vdev, rsp);
502 
503 	return ret;
504 }
505 
506 QDF_STATUS mlme_cm_osif_disconnect_start_ind(struct wlan_objmgr_vdev *vdev)
507 {
508 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
509 
510 	if (glbl_cm_ops &&
511 	    glbl_cm_ops->mlme_cm_disconnect_start_cb)
512 		ret = glbl_cm_ops->mlme_cm_disconnect_start_cb(vdev);
513 
514 	return ret;
515 }
516 
517 #ifdef WLAN_VENDOR_HANDOFF_CONTROL
518 QDF_STATUS mlme_cm_osif_get_vendor_handoff_params(struct wlan_objmgr_psoc *psoc,
519 						  void *vendor_handoff_context)
520 {
521 	if (glbl_cm_ops && glbl_cm_ops->mlme_cm_get_vendor_handoff_params_cb)
522 		return glbl_cm_ops->mlme_cm_get_vendor_handoff_params_cb(psoc,
523 							vendor_handoff_context);
524 
525 	return QDF_STATUS_E_FAILURE;
526 }
527 #endif
528 
529 #ifdef CONN_MGR_ADV_FEATURE
530 QDF_STATUS mlme_cm_osif_roam_sync_ind(struct wlan_objmgr_vdev *vdev)
531 {
532 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
533 
534 	if (glbl_cm_ops &&
535 	    glbl_cm_ops->mlme_cm_roam_sync_cb)
536 		ret = glbl_cm_ops->mlme_cm_roam_sync_cb(vdev);
537 
538 	return ret;
539 }
540 
541 QDF_STATUS mlme_cm_osif_pmksa_candidate_notify(struct wlan_objmgr_vdev *vdev,
542 					       struct qdf_mac_addr *bssid,
543 					       int index, bool preauth)
544 {
545 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
546 
547 	if (glbl_cm_ops &&
548 	    glbl_cm_ops->mlme_cm_pmksa_candidate_notify_cb)
549 		ret = glbl_cm_ops->mlme_cm_pmksa_candidate_notify_cb(
550 						vdev, bssid, index, preauth);
551 
552 	return ret;
553 }
554 #endif
555 
556 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
557 QDF_STATUS mlme_cm_osif_roam_start_ind(struct wlan_objmgr_vdev *vdev)
558 {
559 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
560 
561 	if (glbl_cm_ops &&
562 	    glbl_cm_ops->mlme_cm_roam_start_cb)
563 		ret = glbl_cm_ops->mlme_cm_roam_start_cb(vdev);
564 
565 	return ret;
566 }
567 
568 QDF_STATUS mlme_cm_osif_roam_abort_ind(struct wlan_objmgr_vdev *vdev)
569 {
570 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
571 
572 	if (glbl_cm_ops &&
573 	    glbl_cm_ops->mlme_cm_roam_abort_cb)
574 		ret = glbl_cm_ops->mlme_cm_roam_abort_cb(vdev);
575 
576 	return ret;
577 }
578 
579 QDF_STATUS
580 mlme_cm_osif_roam_complete(struct wlan_objmgr_vdev *vdev)
581 {
582 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
583 
584 	if (glbl_cm_ops &&
585 	    glbl_cm_ops->mlme_cm_roam_cmpl_cb)
586 		ret = glbl_cm_ops->mlme_cm_roam_cmpl_cb(vdev);
587 
588 	return ret;
589 }
590 #endif
591 
592 #ifdef WLAN_FEATURE_PREAUTH_ENABLE
593 QDF_STATUS
594 mlme_cm_osif_ft_preauth_complete(struct wlan_objmgr_vdev *vdev,
595 				 struct wlan_preauth_rsp *rsp)
596 {
597 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
598 
599 	if (glbl_cm_ops &&
600 	    glbl_cm_ops->mlme_cm_ft_preauth_cmpl_cb)
601 		ret = glbl_cm_ops->mlme_cm_ft_preauth_cmpl_cb(vdev, rsp);
602 
603 	return ret;
604 }
605 
606 #ifdef FEATURE_WLAN_ESE
607 QDF_STATUS
608 mlme_cm_osif_cckm_preauth_complete(struct wlan_objmgr_vdev *vdev,
609 				   struct wlan_preauth_rsp *rsp)
610 {
611 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
612 
613 	if (glbl_cm_ops &&
614 	    glbl_cm_ops->mlme_cm_cckm_preauth_cmpl_cb)
615 		ret = glbl_cm_ops->mlme_cm_cckm_preauth_cmpl_cb(vdev, rsp);
616 
617 	return ret;
618 }
619 #endif
620 #endif
621 
622 void mlme_set_osif_cm_cb(osif_cm_get_global_ops_cb osif_cm_ops)
623 {
624 	glbl_cm_ops_cb = osif_cm_ops;
625 }
626 
627 void mlme_set_osif_twt_cb(osif_twt_get_global_ops_cb osif_twt_ops)
628 {
629 	glbl_twt_ops_cb = osif_twt_ops;
630 }
631 
632 void mlme_set_ops_register_cb(mlme_get_global_ops_cb ops_cb)
633 {
634 	glbl_ops_cb = ops_cb;
635 }
636 
637 bool mlme_max_chan_switch_is_set(struct wlan_objmgr_psoc *psoc)
638 {
639 	struct psoc_mlme_obj *mlme_psoc_obj;
640 	struct psoc_phy_config *phy_config;
641 
642 	if (!psoc)
643 		return false;
644 
645 	mlme_psoc_obj = wlan_psoc_mlme_get_cmpt_obj(psoc);
646 	if (!mlme_psoc_obj)
647 		return false;
648 
649 	phy_config = &mlme_psoc_obj->psoc_cfg.phy_config;
650 
651 	return phy_config->max_chan_switch_ie;
652 }
653 
654 void mlme_set_osif_vdev_mgr_cb(
655 			osif_vdev_mgr_get_global_ops_cb mlme_vdev_mgr_osif_ops)
656 {
657 	glbl_vdev_mgr_ops_cb = mlme_vdev_mgr_osif_ops;
658 }
659 
660 #ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE
661 QDF_STATUS mlme_vdev_ops_send_set_mac_address(struct qdf_mac_addr mac_addr,
662 					      struct qdf_mac_addr mld_addr,
663 					      struct wlan_objmgr_vdev *vdev)
664 {
665 	QDF_STATUS ret = QDF_STATUS_E_FAILURE;
666 
667 	if (glbl_ops && glbl_ops->mlme_vdev_send_set_mac_addr)
668 		ret = glbl_ops->mlme_vdev_send_set_mac_addr(mac_addr, mld_addr,
669 							    vdev);
670 
671 	return ret;
672 }
673 
674 void mlme_vdev_mgr_notify_set_mac_addr_response(uint8_t vdev_id,
675 						uint8_t resp_status)
676 {
677 	if (glbl_vdev_mgr_ops &&
678 	    glbl_vdev_mgr_ops->mlme_vdev_mgr_set_mac_addr_response)
679 		glbl_vdev_mgr_ops->mlme_vdev_mgr_set_mac_addr_response(
680 							vdev_id, resp_status);
681 }
682 #endif
683 
684 #if defined(WLAN_SUPPORT_TWT) && defined(WLAN_TWT_CONV_SUPPORTED)
685 QDF_STATUS
686 mlme_twt_osif_enable_complete_ind(struct wlan_objmgr_psoc *psoc,
687 				  struct twt_enable_complete_event_param *event,
688 				  void *context)
689 {
690 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
691 
692 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_enable_complete_cb)
693 		ret = glbl_twt_ops->mlme_twt_enable_complete_cb(psoc,
694 								event, context);
695 
696 	return ret;
697 }
698 
699 QDF_STATUS
700 mlme_twt_osif_disable_complete_ind(struct wlan_objmgr_psoc *psoc,
701 				 struct twt_disable_complete_event_param *event,
702 				 void *context)
703 {
704 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
705 
706 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_disable_complete_cb)
707 		ret = glbl_twt_ops->mlme_twt_disable_complete_cb(psoc,
708 								event, context);
709 
710 	return ret;
711 }
712 
713 QDF_STATUS
714 mlme_twt_osif_ack_complete_ind(struct wlan_objmgr_psoc *psoc,
715 			       struct twt_ack_complete_event_param *event,
716 			       void *context)
717 {
718 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
719 
720 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_ack_complete_cb)
721 		ret = glbl_twt_ops->mlme_twt_ack_complete_cb(psoc,
722 							     event, context);
723 
724 	return ret;
725 }
726 
727 QDF_STATUS
728 mlme_twt_osif_setup_complete_ind(struct wlan_objmgr_psoc *psoc,
729 				 struct twt_add_dialog_complete_event *event,
730 				 bool renego)
731 {
732 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
733 
734 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_setup_complete_cb)
735 		ret = glbl_twt_ops->mlme_twt_setup_complete_cb(psoc, event,
736 							       renego);
737 
738 	return ret;
739 }
740 
741 QDF_STATUS
742 mlme_twt_osif_teardown_complete_ind(struct wlan_objmgr_psoc *psoc,
743 			    struct twt_del_dialog_complete_event_param *event)
744 {
745 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
746 
747 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_teardown_complete_cb)
748 		ret = glbl_twt_ops->mlme_twt_teardown_complete_cb(psoc, event);
749 
750 	return ret;
751 }
752 
753 QDF_STATUS
754 mlme_twt_osif_pause_complete_ind(struct wlan_objmgr_psoc *psoc,
755 			    struct twt_pause_dialog_complete_event_param *event)
756 {
757 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
758 
759 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_pause_complete_cb)
760 		ret = glbl_twt_ops->mlme_twt_pause_complete_cb(psoc, event);
761 
762 	return ret;
763 }
764 
765 QDF_STATUS
766 mlme_twt_osif_resume_complete_ind(struct wlan_objmgr_psoc *psoc,
767 			   struct twt_resume_dialog_complete_event_param *event)
768 {
769 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
770 
771 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_resume_complete_cb)
772 		ret = glbl_twt_ops->mlme_twt_resume_complete_cb(psoc, event);
773 
774 	return ret;
775 }
776 
777 QDF_STATUS
778 mlme_twt_osif_nudge_complete_ind(struct wlan_objmgr_psoc *psoc,
779 			    struct twt_nudge_dialog_complete_event_param *event)
780 {
781 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
782 
783 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_nudge_complete_cb)
784 		ret = glbl_twt_ops->mlme_twt_nudge_complete_cb(psoc, event);
785 
786 	return ret;
787 }
788 
789 QDF_STATUS
790 mlme_twt_osif_notify_complete_ind(struct wlan_objmgr_psoc *psoc,
791 				  struct twt_notify_event_param *event)
792 {
793 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
794 
795 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_notify_complete_cb)
796 		ret = glbl_twt_ops->mlme_twt_notify_complete_cb(psoc, event);
797 
798 	return ret;
799 }
800 
801 QDF_STATUS
802 mlme_twt_vdev_create_notification(struct wlan_objmgr_vdev *vdev)
803 {
804 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
805 
806 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_vdev_create_cb)
807 		ret = glbl_twt_ops->mlme_twt_vdev_create_cb(vdev);
808 
809 	return ret;
810 }
811 
812 QDF_STATUS
813 mlme_twt_vdev_destroy_notification(struct wlan_objmgr_vdev *vdev)
814 {
815 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
816 
817 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_vdev_destroy_cb)
818 		ret = glbl_twt_ops->mlme_twt_vdev_destroy_cb(vdev);
819 
820 	return ret;
821 }
822 
823 #endif
824 
825