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