xref: /wlan-dirver/qca-wifi-host-cmn/umac/mlme/mlme_objmgr/dispatcher/src/wlan_cmn_mlme_main.c (revision 901120c066e139c7f8a2c8e4820561fdd83c67ef)
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 
555 QDF_STATUS mlme_cm_osif_send_keys(struct wlan_objmgr_vdev *vdev,
556 				  uint8_t key_index, bool pairwise,
557 				  enum wlan_crypto_cipher_type cipher_type)
558 {
559 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
560 
561 	if (glbl_cm_ops && glbl_cm_ops->mlme_cm_send_keys_cb)
562 		ret = glbl_cm_ops->mlme_cm_send_keys_cb(vdev, key_index,
563 							pairwise,
564 							cipher_type);
565 
566 	return ret;
567 }
568 #endif
569 
570 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
571 QDF_STATUS mlme_cm_osif_roam_start_ind(struct wlan_objmgr_vdev *vdev)
572 {
573 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
574 
575 	if (glbl_cm_ops &&
576 	    glbl_cm_ops->mlme_cm_roam_start_cb)
577 		ret = glbl_cm_ops->mlme_cm_roam_start_cb(vdev);
578 
579 	return ret;
580 }
581 
582 QDF_STATUS mlme_cm_osif_roam_abort_ind(struct wlan_objmgr_vdev *vdev)
583 {
584 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
585 
586 	if (glbl_cm_ops &&
587 	    glbl_cm_ops->mlme_cm_roam_abort_cb)
588 		ret = glbl_cm_ops->mlme_cm_roam_abort_cb(vdev);
589 
590 	return ret;
591 }
592 
593 QDF_STATUS
594 mlme_cm_osif_roam_complete(struct wlan_objmgr_vdev *vdev)
595 {
596 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
597 
598 	if (glbl_cm_ops &&
599 	    glbl_cm_ops->mlme_cm_roam_cmpl_cb)
600 		ret = glbl_cm_ops->mlme_cm_roam_cmpl_cb(vdev);
601 
602 	return ret;
603 }
604 #endif
605 
606 #ifdef WLAN_FEATURE_PREAUTH_ENABLE
607 QDF_STATUS
608 mlme_cm_osif_ft_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_ft_preauth_cmpl_cb)
615 		ret = glbl_cm_ops->mlme_cm_ft_preauth_cmpl_cb(vdev, rsp);
616 
617 	return ret;
618 }
619 
620 #ifdef FEATURE_WLAN_ESE
621 QDF_STATUS
622 mlme_cm_osif_cckm_preauth_complete(struct wlan_objmgr_vdev *vdev,
623 				   struct wlan_preauth_rsp *rsp)
624 {
625 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
626 
627 	if (glbl_cm_ops &&
628 	    glbl_cm_ops->mlme_cm_cckm_preauth_cmpl_cb)
629 		ret = glbl_cm_ops->mlme_cm_cckm_preauth_cmpl_cb(vdev, rsp);
630 
631 	return ret;
632 }
633 #endif
634 #endif
635 
636 void mlme_set_osif_cm_cb(osif_cm_get_global_ops_cb osif_cm_ops)
637 {
638 	glbl_cm_ops_cb = osif_cm_ops;
639 }
640 
641 void mlme_set_osif_twt_cb(osif_twt_get_global_ops_cb osif_twt_ops)
642 {
643 	glbl_twt_ops_cb = osif_twt_ops;
644 }
645 
646 void mlme_set_ops_register_cb(mlme_get_global_ops_cb ops_cb)
647 {
648 	glbl_ops_cb = ops_cb;
649 }
650 
651 bool mlme_max_chan_switch_is_set(struct wlan_objmgr_psoc *psoc)
652 {
653 	struct psoc_mlme_obj *mlme_psoc_obj;
654 	struct psoc_phy_config *phy_config;
655 
656 	if (!psoc)
657 		return false;
658 
659 	mlme_psoc_obj = wlan_psoc_mlme_get_cmpt_obj(psoc);
660 	if (!mlme_psoc_obj)
661 		return false;
662 
663 	phy_config = &mlme_psoc_obj->psoc_cfg.phy_config;
664 
665 	return phy_config->max_chan_switch_ie;
666 }
667 
668 void mlme_set_osif_vdev_mgr_cb(
669 			osif_vdev_mgr_get_global_ops_cb mlme_vdev_mgr_osif_ops)
670 {
671 	glbl_vdev_mgr_ops_cb = mlme_vdev_mgr_osif_ops;
672 }
673 
674 #ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE
675 QDF_STATUS mlme_vdev_ops_send_set_mac_address(struct qdf_mac_addr mac_addr,
676 					      struct qdf_mac_addr mld_addr,
677 					      struct wlan_objmgr_vdev *vdev)
678 {
679 	QDF_STATUS ret = QDF_STATUS_E_FAILURE;
680 
681 	if (glbl_ops && glbl_ops->mlme_vdev_send_set_mac_addr)
682 		ret = glbl_ops->mlme_vdev_send_set_mac_addr(mac_addr, mld_addr,
683 							    vdev);
684 
685 	return ret;
686 }
687 
688 void mlme_vdev_mgr_notify_set_mac_addr_response(uint8_t vdev_id,
689 						uint8_t resp_status)
690 {
691 	if (glbl_vdev_mgr_ops &&
692 	    glbl_vdev_mgr_ops->mlme_vdev_mgr_set_mac_addr_response)
693 		glbl_vdev_mgr_ops->mlme_vdev_mgr_set_mac_addr_response(
694 							vdev_id, resp_status);
695 }
696 #endif
697 
698 #if defined(WLAN_SUPPORT_TWT) && defined(WLAN_TWT_CONV_SUPPORTED)
699 QDF_STATUS
700 mlme_twt_osif_enable_complete_ind(struct wlan_objmgr_psoc *psoc,
701 				  struct twt_enable_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_enable_complete_cb)
707 		ret = glbl_twt_ops->mlme_twt_enable_complete_cb(psoc,
708 								event, context);
709 
710 	return ret;
711 }
712 
713 QDF_STATUS
714 mlme_twt_osif_disable_complete_ind(struct wlan_objmgr_psoc *psoc,
715 				 struct twt_disable_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_disable_complete_cb)
721 		ret = glbl_twt_ops->mlme_twt_disable_complete_cb(psoc,
722 								event, context);
723 
724 	return ret;
725 }
726 
727 QDF_STATUS
728 mlme_twt_osif_ack_complete_ind(struct wlan_objmgr_psoc *psoc,
729 			       struct twt_ack_complete_event_param *event,
730 			       void *context)
731 {
732 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
733 
734 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_ack_complete_cb)
735 		ret = glbl_twt_ops->mlme_twt_ack_complete_cb(psoc,
736 							     event, context);
737 
738 	return ret;
739 }
740 
741 QDF_STATUS
742 mlme_twt_osif_setup_complete_ind(struct wlan_objmgr_psoc *psoc,
743 				 struct twt_add_dialog_complete_event *event,
744 				 bool renego)
745 {
746 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
747 
748 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_setup_complete_cb)
749 		ret = glbl_twt_ops->mlme_twt_setup_complete_cb(psoc, event,
750 							       renego);
751 
752 	return ret;
753 }
754 
755 QDF_STATUS
756 mlme_twt_osif_teardown_complete_ind(struct wlan_objmgr_psoc *psoc,
757 			    struct twt_del_dialog_complete_event_param *event)
758 {
759 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
760 
761 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_teardown_complete_cb)
762 		ret = glbl_twt_ops->mlme_twt_teardown_complete_cb(psoc, event);
763 
764 	return ret;
765 }
766 
767 QDF_STATUS
768 mlme_twt_osif_pause_complete_ind(struct wlan_objmgr_psoc *psoc,
769 			    struct twt_pause_dialog_complete_event_param *event)
770 {
771 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
772 
773 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_pause_complete_cb)
774 		ret = glbl_twt_ops->mlme_twt_pause_complete_cb(psoc, event);
775 
776 	return ret;
777 }
778 
779 QDF_STATUS
780 mlme_twt_osif_resume_complete_ind(struct wlan_objmgr_psoc *psoc,
781 			   struct twt_resume_dialog_complete_event_param *event)
782 {
783 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
784 
785 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_resume_complete_cb)
786 		ret = glbl_twt_ops->mlme_twt_resume_complete_cb(psoc, event);
787 
788 	return ret;
789 }
790 
791 QDF_STATUS
792 mlme_twt_osif_nudge_complete_ind(struct wlan_objmgr_psoc *psoc,
793 			    struct twt_nudge_dialog_complete_event_param *event)
794 {
795 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
796 
797 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_nudge_complete_cb)
798 		ret = glbl_twt_ops->mlme_twt_nudge_complete_cb(psoc, event);
799 
800 	return ret;
801 }
802 
803 QDF_STATUS
804 mlme_twt_osif_notify_complete_ind(struct wlan_objmgr_psoc *psoc,
805 				  struct twt_notify_event_param *event)
806 {
807 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
808 
809 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_notify_complete_cb)
810 		ret = glbl_twt_ops->mlme_twt_notify_complete_cb(psoc, event);
811 
812 	return ret;
813 }
814 
815 QDF_STATUS
816 mlme_twt_vdev_create_notification(struct wlan_objmgr_vdev *vdev)
817 {
818 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
819 
820 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_vdev_create_cb)
821 		ret = glbl_twt_ops->mlme_twt_vdev_create_cb(vdev);
822 
823 	return ret;
824 }
825 
826 QDF_STATUS
827 mlme_twt_vdev_destroy_notification(struct wlan_objmgr_vdev *vdev)
828 {
829 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
830 
831 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_vdev_destroy_cb)
832 		ret = glbl_twt_ops->mlme_twt_vdev_destroy_cb(vdev);
833 
834 	return ret;
835 }
836 
837 #endif
838 
839