1 /* 2 * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved. 3 * Copyright (c) 2021-2023 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 605 QDF_STATUS 606 mlme_cm_osif_roam_get_scan_params(struct wlan_objmgr_vdev *vdev, 607 struct element_info *scan_ie, 608 enum dot11_mode_filter *dot11mode_filter) 609 { 610 QDF_STATUS ret = QDF_STATUS_SUCCESS; 611 612 if (glbl_cm_ops && 613 glbl_cm_ops->mlme_cm_roam_get_scan_ie_cb) 614 ret = glbl_cm_ops->mlme_cm_roam_get_scan_ie_cb(vdev, 615 scan_ie, dot11mode_filter); 616 617 return ret; 618 } 619 620 #endif 621 622 #ifdef WLAN_FEATURE_PREAUTH_ENABLE 623 QDF_STATUS 624 mlme_cm_osif_ft_preauth_complete(struct wlan_objmgr_vdev *vdev, 625 struct wlan_preauth_rsp *rsp) 626 { 627 QDF_STATUS ret = QDF_STATUS_SUCCESS; 628 629 if (glbl_cm_ops && 630 glbl_cm_ops->mlme_cm_ft_preauth_cmpl_cb) 631 ret = glbl_cm_ops->mlme_cm_ft_preauth_cmpl_cb(vdev, rsp); 632 633 return ret; 634 } 635 636 #ifdef FEATURE_WLAN_ESE 637 QDF_STATUS 638 mlme_cm_osif_cckm_preauth_complete(struct wlan_objmgr_vdev *vdev, 639 struct wlan_preauth_rsp *rsp) 640 { 641 QDF_STATUS ret = QDF_STATUS_SUCCESS; 642 643 if (glbl_cm_ops && 644 glbl_cm_ops->mlme_cm_cckm_preauth_cmpl_cb) 645 ret = glbl_cm_ops->mlme_cm_cckm_preauth_cmpl_cb(vdev, rsp); 646 647 return ret; 648 } 649 #endif 650 #endif 651 652 void mlme_set_osif_cm_cb(osif_cm_get_global_ops_cb osif_cm_ops) 653 { 654 glbl_cm_ops_cb = osif_cm_ops; 655 } 656 657 void mlme_set_osif_twt_cb(osif_twt_get_global_ops_cb osif_twt_ops) 658 { 659 glbl_twt_ops_cb = osif_twt_ops; 660 } 661 662 void mlme_set_ops_register_cb(mlme_get_global_ops_cb ops_cb) 663 { 664 glbl_ops_cb = ops_cb; 665 } 666 667 bool mlme_max_chan_switch_is_set(struct wlan_objmgr_psoc *psoc) 668 { 669 struct psoc_mlme_obj *mlme_psoc_obj; 670 struct psoc_phy_config *phy_config; 671 672 if (!psoc) 673 return false; 674 675 mlme_psoc_obj = wlan_psoc_mlme_get_cmpt_obj(psoc); 676 if (!mlme_psoc_obj) 677 return false; 678 679 phy_config = &mlme_psoc_obj->psoc_cfg.phy_config; 680 681 return phy_config->max_chan_switch_ie; 682 } 683 684 void mlme_set_osif_vdev_mgr_cb( 685 osif_vdev_mgr_get_global_ops_cb mlme_vdev_mgr_osif_ops) 686 { 687 glbl_vdev_mgr_ops_cb = mlme_vdev_mgr_osif_ops; 688 } 689 690 #ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE 691 QDF_STATUS mlme_vdev_ops_send_set_mac_address(struct qdf_mac_addr mac_addr, 692 struct qdf_mac_addr mld_addr, 693 struct wlan_objmgr_vdev *vdev) 694 { 695 QDF_STATUS ret = QDF_STATUS_E_FAILURE; 696 697 if (glbl_ops && glbl_ops->mlme_vdev_send_set_mac_addr) 698 ret = glbl_ops->mlme_vdev_send_set_mac_addr(mac_addr, mld_addr, 699 vdev); 700 701 return ret; 702 } 703 704 void mlme_vdev_mgr_notify_set_mac_addr_response(uint8_t vdev_id, 705 uint8_t resp_status) 706 { 707 if (glbl_vdev_mgr_ops && 708 glbl_vdev_mgr_ops->mlme_vdev_mgr_set_mac_addr_response) 709 glbl_vdev_mgr_ops->mlme_vdev_mgr_set_mac_addr_response( 710 vdev_id, resp_status); 711 } 712 #endif 713 714 #if defined(WLAN_SUPPORT_TWT) && defined(WLAN_TWT_CONV_SUPPORTED) 715 QDF_STATUS 716 mlme_twt_osif_enable_complete_ind(struct wlan_objmgr_psoc *psoc, 717 struct twt_enable_complete_event_param *event, 718 void *context) 719 { 720 QDF_STATUS ret = QDF_STATUS_SUCCESS; 721 722 if (glbl_twt_ops && glbl_twt_ops->mlme_twt_enable_complete_cb) 723 ret = glbl_twt_ops->mlme_twt_enable_complete_cb(psoc, 724 event, context); 725 726 return ret; 727 } 728 729 QDF_STATUS 730 mlme_twt_osif_disable_complete_ind(struct wlan_objmgr_psoc *psoc, 731 struct twt_disable_complete_event_param *event, 732 void *context) 733 { 734 QDF_STATUS ret = QDF_STATUS_SUCCESS; 735 736 if (glbl_twt_ops && glbl_twt_ops->mlme_twt_disable_complete_cb) 737 ret = glbl_twt_ops->mlme_twt_disable_complete_cb(psoc, 738 event, context); 739 740 return ret; 741 } 742 743 QDF_STATUS 744 mlme_twt_osif_ack_complete_ind(struct wlan_objmgr_psoc *psoc, 745 struct twt_ack_complete_event_param *event, 746 void *context) 747 { 748 QDF_STATUS ret = QDF_STATUS_SUCCESS; 749 750 if (glbl_twt_ops && glbl_twt_ops->mlme_twt_ack_complete_cb) 751 ret = glbl_twt_ops->mlme_twt_ack_complete_cb(psoc, 752 event, context); 753 754 return ret; 755 } 756 757 QDF_STATUS 758 mlme_twt_osif_setup_complete_ind(struct wlan_objmgr_psoc *psoc, 759 struct twt_add_dialog_complete_event *event, 760 bool renego) 761 { 762 QDF_STATUS ret = QDF_STATUS_SUCCESS; 763 764 if (glbl_twt_ops && glbl_twt_ops->mlme_twt_setup_complete_cb) 765 ret = glbl_twt_ops->mlme_twt_setup_complete_cb(psoc, event, 766 renego); 767 768 return ret; 769 } 770 771 QDF_STATUS 772 mlme_twt_osif_teardown_complete_ind(struct wlan_objmgr_psoc *psoc, 773 struct twt_del_dialog_complete_event_param *event) 774 { 775 QDF_STATUS ret = QDF_STATUS_SUCCESS; 776 777 if (glbl_twt_ops && glbl_twt_ops->mlme_twt_teardown_complete_cb) 778 ret = glbl_twt_ops->mlme_twt_teardown_complete_cb(psoc, event); 779 780 return ret; 781 } 782 783 QDF_STATUS 784 mlme_twt_osif_pause_complete_ind(struct wlan_objmgr_psoc *psoc, 785 struct twt_pause_dialog_complete_event_param *event) 786 { 787 QDF_STATUS ret = QDF_STATUS_SUCCESS; 788 789 if (glbl_twt_ops && glbl_twt_ops->mlme_twt_pause_complete_cb) 790 ret = glbl_twt_ops->mlme_twt_pause_complete_cb(psoc, event); 791 792 return ret; 793 } 794 795 QDF_STATUS 796 mlme_twt_osif_resume_complete_ind(struct wlan_objmgr_psoc *psoc, 797 struct twt_resume_dialog_complete_event_param *event) 798 { 799 QDF_STATUS ret = QDF_STATUS_SUCCESS; 800 801 if (glbl_twt_ops && glbl_twt_ops->mlme_twt_resume_complete_cb) 802 ret = glbl_twt_ops->mlme_twt_resume_complete_cb(psoc, event); 803 804 return ret; 805 } 806 807 QDF_STATUS 808 mlme_twt_osif_nudge_complete_ind(struct wlan_objmgr_psoc *psoc, 809 struct twt_nudge_dialog_complete_event_param *event) 810 { 811 QDF_STATUS ret = QDF_STATUS_SUCCESS; 812 813 if (glbl_twt_ops && glbl_twt_ops->mlme_twt_nudge_complete_cb) 814 ret = glbl_twt_ops->mlme_twt_nudge_complete_cb(psoc, event); 815 816 return ret; 817 } 818 819 QDF_STATUS 820 mlme_twt_osif_notify_complete_ind(struct wlan_objmgr_psoc *psoc, 821 struct twt_notify_event_param *event) 822 { 823 QDF_STATUS ret = QDF_STATUS_SUCCESS; 824 825 if (glbl_twt_ops && glbl_twt_ops->mlme_twt_notify_complete_cb) 826 ret = glbl_twt_ops->mlme_twt_notify_complete_cb(psoc, event); 827 828 return ret; 829 } 830 831 QDF_STATUS 832 mlme_twt_vdev_create_notification(struct wlan_objmgr_vdev *vdev) 833 { 834 QDF_STATUS ret = QDF_STATUS_SUCCESS; 835 836 if (glbl_twt_ops && glbl_twt_ops->mlme_twt_vdev_create_cb) 837 ret = glbl_twt_ops->mlme_twt_vdev_create_cb(vdev); 838 839 return ret; 840 } 841 842 QDF_STATUS 843 mlme_twt_vdev_destroy_notification(struct wlan_objmgr_vdev *vdev) 844 { 845 QDF_STATUS ret = QDF_STATUS_SUCCESS; 846 847 if (glbl_twt_ops && glbl_twt_ops->mlme_twt_vdev_destroy_cb) 848 ret = glbl_twt_ops->mlme_twt_vdev_destroy_cb(vdev); 849 850 return ret; 851 } 852 853 #endif 854 855 void mlme_vdev_reconfig_timer_cb(void *arg) 856 { 857 struct vdev_mlme_obj *vdev_mlme; 858 859 vdev_mlme = (struct vdev_mlme_obj *)arg; 860 if (!vdev_mlme) 861 return; 862 863 if ((vdev_mlme->ops) && 864 vdev_mlme->ops->mlme_vdev_reconfig_timer_complete) 865 vdev_mlme->ops->mlme_vdev_reconfig_timer_complete(vdev_mlme); 866 } 867 868 bool mlme_mlo_is_reconfig_reassoc_enable(struct wlan_objmgr_psoc *psoc) 869 { 870 struct psoc_mlme_obj *mlme_psoc_obj; 871 struct psoc_mlo_config *mlo_config; 872 873 if (!psoc) 874 return false; 875 876 mlme_psoc_obj = wlan_psoc_mlme_get_cmpt_obj(psoc); 877 if (!mlme_psoc_obj) 878 return false; 879 880 mlo_config = &mlme_psoc_obj->psoc_cfg.mlo_config; 881 882 return mlo_config->reconfig_reassoc_en; 883 } 884