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