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
mlme_cm_ops_init(void)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
mlme_cm_ops_deinit(void)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
mlme_vdev_mgr_ops_init(void)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
mlme_vdev_mgr_ops_deinit(void)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
mlme_twt_ops_init(void)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
mlme_twt_ops_deinit(void)74 static void mlme_twt_ops_deinit(void)
75 {
76 if (glbl_twt_ops_cb)
77 glbl_twt_ops = NULL;
78 }
79
wlan_cmn_mlme_init(void)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
wlan_cmn_mlme_deinit(void)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
mlme_psoc_ops_ext_hdl_create(struct psoc_mlme_obj * psoc_mlme)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
mlme_psoc_ext_enable_cb(struct wlan_objmgr_psoc * psoc)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
mlme_psoc_ext_disable_cb(struct wlan_objmgr_psoc * psoc)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
mlme_psoc_ops_ext_hdl_destroy(struct psoc_mlme_obj * psoc_mlme)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
mlme_pdev_ops_ext_hdl_create(struct pdev_mlme_obj * pdev_mlme)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
mlme_pdev_ops_ext_hdl_destroy(struct pdev_mlme_obj * pdev_mlme)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
mlme_vdev_ops_ext_hdl_create(struct vdev_mlme_obj * vdev_mlme)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
mlme_vdev_ops_ext_hdl_post_create(struct vdev_mlme_obj * vdev_mlme)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
mlme_vdev_ops_ext_hdl_destroy(struct vdev_mlme_obj * vdev_mlme)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
mlme_vdev_ops_start_fw_send(struct wlan_objmgr_vdev * vdev,uint8_t restart)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
mlme_vdev_ops_multivdev_restart_fw_cmd_send(struct wlan_objmgr_pdev * pdev)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
mlme_vdev_ops_stop_fw_send(struct wlan_objmgr_vdev * vdev)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
mlme_vdev_ops_down_fw_send(struct wlan_objmgr_vdev * vdev)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
mlme_vdev_enqueue_exp_ser_cmd(struct vdev_mlme_obj * vdev_mlme,uint8_t cmd_type)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
mlme_vdev_ops_ext_hdl_delete_rsp(struct wlan_objmgr_psoc * psoc,struct vdev_delete_response * rsp)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
mlme_vdev_ops_ext_hdl_multivdev_restart_resp(struct wlan_objmgr_psoc * psoc,struct multi_vdev_restart_resp * resp)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
mlme_cm_ext_hdl_create(struct wlan_objmgr_vdev * vdev,cm_ext_t ** ext_cm_ptr)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
mlme_cm_ext_hdl_destroy(struct wlan_objmgr_vdev * vdev,cm_ext_t * ext_cm_ptr)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
mlme_cm_connect_start_ind(struct wlan_objmgr_vdev * vdev,struct wlan_cm_connect_req * req)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
mlme_ext_hdl_get_acs_in_progress(struct wlan_objmgr_vdev * vdev,bool * acs_in_progress)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
mlme_cm_bss_select_ind(struct wlan_objmgr_vdev * vdev,struct wlan_cm_vdev_connect_req * req)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
mlme_cm_bss_peer_create_req(struct wlan_objmgr_vdev * vdev,struct qdf_mac_addr * peer_mac,struct qdf_mac_addr * mld_mac,bool is_assoc_link)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
mlme_cm_connect_req(struct wlan_objmgr_vdev * vdev,struct wlan_cm_vdev_connect_req * req)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
mlme_cm_roam_start_ind(struct wlan_objmgr_vdev * vdev,struct wlan_cm_roam_req * req)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
mlme_cm_rso_stop_req(struct wlan_objmgr_vdev * vdev)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
mlme_cm_reassoc_req(struct wlan_objmgr_vdev * vdev,struct wlan_cm_vdev_reassoc_req * req)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
mlme_cm_osif_connect_active_notify(uint8_t vdev_id)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
mlme_cm_connect_complete_ind(struct wlan_objmgr_vdev * vdev,struct wlan_cm_connect_resp * rsp)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
mlme_cm_disconnect_start_ind(struct wlan_objmgr_vdev * vdev,struct wlan_cm_disconnect_req * req)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
mlme_cm_disconnect_req(struct wlan_objmgr_vdev * vdev,struct wlan_cm_vdev_discon_req * req)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
mlme_cm_bss_peer_delete_req(struct wlan_objmgr_vdev * vdev)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
mlme_cm_disconnect_complete_ind(struct wlan_objmgr_vdev * vdev,struct wlan_cm_discon_rsp * rsp)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
mlme_cm_vdev_down_req(struct wlan_objmgr_vdev * vdev)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
mlme_cm_osif_connect_complete(struct wlan_objmgr_vdev * vdev,struct wlan_cm_connect_resp * rsp)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
mlme_cm_osif_failed_candidate_ind(struct wlan_objmgr_vdev * vdev,struct wlan_cm_connect_resp * rsp)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
mlme_cm_osif_update_id_and_src(struct wlan_objmgr_vdev * vdev,enum wlan_cm_source source,wlan_cm_id cm_id)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
mlme_cm_osif_disconnect_complete(struct wlan_objmgr_vdev * vdev,struct wlan_cm_discon_rsp * rsp)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
mlme_cm_osif_disconnect_start_ind(struct wlan_objmgr_vdev * vdev,enum wlan_cm_source source)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
mlme_cm_osif_get_vendor_handoff_params(struct wlan_objmgr_psoc * psoc,void * vendor_handoff_context)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
mlme_cm_osif_roam_sync_ind(struct wlan_objmgr_vdev * vdev)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
mlme_cm_osif_pmksa_candidate_notify(struct wlan_objmgr_vdev * vdev,struct qdf_mac_addr * bssid,int index,bool preauth)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
mlme_cm_osif_send_keys(struct wlan_objmgr_vdev * vdev,uint8_t key_index,bool pairwise,enum wlan_crypto_cipher_type cipher_type)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
mlme_cm_osif_link_reconfig_notify(struct wlan_objmgr_vdev * vdev)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
mlme_cm_osif_roam_start_ind(struct wlan_objmgr_vdev * vdev)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
mlme_cm_osif_roam_abort_ind(struct wlan_objmgr_vdev * vdev)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
mlme_cm_osif_roam_complete(struct wlan_objmgr_vdev * vdev)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
mlme_cm_osif_roam_rt_stats(struct roam_stats_event * roam_stats,uint8_t idx)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
mlme_cm_osif_roam_get_scan_params(struct wlan_objmgr_vdev * vdev,struct element_info * scan_ie,enum dot11_mode_filter * dot11mode_filter)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
mlme_cm_osif_ft_preauth_complete(struct wlan_objmgr_vdev * vdev,struct wlan_preauth_rsp * rsp)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
mlme_cm_osif_cckm_preauth_complete(struct wlan_objmgr_vdev * vdev,struct wlan_preauth_rsp * rsp)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
mlme_set_osif_cm_cb(osif_cm_get_global_ops_cb osif_cm_ops)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
mlme_set_osif_twt_cb(osif_twt_get_global_ops_cb osif_twt_ops)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
mlme_set_ops_register_cb(mlme_get_global_ops_cb ops_cb)712 void mlme_set_ops_register_cb(mlme_get_global_ops_cb ops_cb)
713 {
714 glbl_ops_cb = ops_cb;
715 }
716
mlme_send_scan_done_complete_cb(uint8_t vdev_id)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
mlme_max_chan_switch_is_set(struct wlan_objmgr_psoc * psoc)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
mlme_set_osif_vdev_mgr_cb(osif_vdev_mgr_get_global_ops_cb mlme_vdev_mgr_osif_ops)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
mlme_vdev_ops_send_set_mac_address(struct qdf_mac_addr mac_addr,struct qdf_mac_addr mld_addr,struct wlan_objmgr_vdev * vdev)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
mlme_vdev_mgr_notify_set_mac_addr_response(uint8_t vdev_id,uint8_t resp_status)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
mlme_twt_osif_enable_complete_ind(struct wlan_objmgr_psoc * psoc,struct twt_enable_complete_event_param * event,void * context)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
mlme_twt_osif_disable_complete_ind(struct wlan_objmgr_psoc * psoc,struct twt_disable_complete_event_param * event,void * context)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
mlme_twt_osif_ack_complete_ind(struct wlan_objmgr_psoc * psoc,struct twt_ack_complete_event_param * event,void * context)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
mlme_twt_osif_setup_complete_ind(struct wlan_objmgr_psoc * psoc,struct twt_add_dialog_complete_event * event,bool renego)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
mlme_twt_osif_teardown_complete_ind(struct wlan_objmgr_psoc * psoc,struct twt_del_dialog_complete_event_param * event)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
mlme_twt_osif_pause_complete_ind(struct wlan_objmgr_psoc * psoc,struct twt_pause_dialog_complete_event_param * event)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
mlme_twt_osif_resume_complete_ind(struct wlan_objmgr_psoc * psoc,struct twt_resume_dialog_complete_event_param * event)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
mlme_twt_osif_nudge_complete_ind(struct wlan_objmgr_psoc * psoc,struct twt_nudge_dialog_complete_event_param * event)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
mlme_twt_osif_notify_complete_ind(struct wlan_objmgr_psoc * psoc,struct twt_notify_event_param * event)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
mlme_twt_vdev_create_notification(struct wlan_objmgr_vdev * vdev)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
mlme_twt_vdev_destroy_notification(struct wlan_objmgr_vdev * vdev)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
mlme_vdev_reconfig_timer_cb(void * arg)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
mlme_mlo_is_reconfig_reassoc_enable(struct wlan_objmgr_psoc * psoc)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
mlme_cm_osif_perfd_reset_cpufreq(void)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