1 /* 2 * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved. 3 * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for 6 * any purpose with or without fee is hereby granted, provided that the 7 * above copyright notice and this permission notice appear in all 8 * copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 11 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 12 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 13 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 16 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 17 * PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20 /** 21 * DOC: Declares VDEV MLME SM APIs and structures 22 */ 23 24 #ifndef _VDEV_MLME_SM_H_ 25 #define _VDEV_MLME_SM_H_ 26 27 #ifdef WLAN_FEATURE_11BE_MLO 28 #include <wlan_mlo_mgr_ap.h> 29 #include <wlan_mlo_mgr_sta.h> 30 #endif 31 #include <wlan_dfs_utils_api.h> 32 33 /** 34 * mlme_vdev_sm_deliver_event() - Delivers event to VDEV MLME SM 35 * @vdev_mlme: MLME VDEV comp object 36 * @event: MLME event 37 * @event_data_len: data size 38 * @event_data: event data 39 * 40 * API to dispatch event to VDEV MLME SM 41 * 42 * Return: SUCCESS: on handling event 43 * FAILURE: on ignoring the event 44 */ 45 QDF_STATUS mlme_vdev_sm_deliver_event(struct vdev_mlme_obj *vdev_mlme, 46 enum wlan_vdev_sm_evt event, 47 uint16_t event_data_len, 48 void *event_data); 49 50 /** 51 * mlme_vdev_sm_print_state_event() - Prints the state/substate, event 52 * @vdev_mlme: MLME VDEV comp object 53 * @event: MLME event 54 * 55 * API to print current state/substate, events in readable format 56 * 57 * Return: void 58 */ 59 void mlme_vdev_sm_print_state_event(struct vdev_mlme_obj *vdev_mlme, 60 enum wlan_vdev_sm_evt event); 61 62 /** 63 * mlme_vdev_sm_print_state() - Prints the state/substate 64 * @vdev_mlme: MLME VDEV comp object 65 * 66 * API to print current state/substate 67 * 68 * Return: void 69 */ 70 void mlme_vdev_sm_print_state(struct vdev_mlme_obj *vdev_mlme); 71 #ifdef SM_ENG_HIST_ENABLE 72 /** 73 * mlme_vdev_sm_history_print() - Prints SM history 74 * @vdev_mlme: MLME VDEV comp object 75 * 76 * API to print SM history 77 * 78 * Return: void 79 */ 80 void mlme_vdev_sm_history_print(struct vdev_mlme_obj *vdev_mlme); 81 #endif 82 83 #endif 84 85 /** 86 * mlme_vdev_sm_create - Invoke SME creation for VDEV 87 * @vdev_mlme_obj: VDEV MLME comp object 88 * 89 * API allocates VDEV MLME SM and initializes SM lock 90 * 91 * Return: SUCCESS on successful allocation 92 * FAILURE, if registration fails 93 */ 94 QDF_STATUS mlme_vdev_sm_create(struct vdev_mlme_obj *vdev_mlme); 95 96 /** 97 * mlme_vdev_sm_destroy - Invoke SME destroy for VDEV 98 * @vdev_mlme_obj: VDEV MLME comp object 99 * 100 * API frees VDEV MLME SM and destroys the SM lock 101 * 102 * Return: SUCCESS on successful destroy 103 * FAILURE, if registration fails 104 */ 105 QDF_STATUS mlme_vdev_sm_destroy(struct vdev_mlme_obj *vdev_mlme); 106 107 /** 108 * mlme_vdev_validate_basic_params - Validate basic params 109 * @vdev_mlme_obj: VDEV MLME comp object 110 * @event_data_len: data size 111 * @event_data: event data 112 * 113 * API validate MLME VDEV basic parameters 114 * 115 * Return: SUCCESS on successful validation 116 * FAILURE, if any parameter is not initialized 117 */ 118 static inline QDF_STATUS mlme_vdev_validate_basic_params( 119 struct vdev_mlme_obj *vdev_mlme, 120 uint16_t event_data_len, void *event_data) 121 { 122 QDF_STATUS ret = QDF_STATUS_SUCCESS; 123 124 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_validate_basic_params) 125 ret = vdev_mlme->ops->mlme_vdev_validate_basic_params( 126 vdev_mlme, event_data_len, event_data); 127 128 return ret; 129 } 130 131 /** 132 * mlme_vdev_reset_proto_params - Reset VDEV protocol params 133 * @vdev_mlme_obj: VDEV MLME comp object 134 * @event_data_len: data size 135 * @event_data: event data 136 * 137 * API resets the protocol params of vdev 138 * 139 * Return: SUCCESS on successful reset 140 * FAILURE, if it fails due to any 141 */ 142 static inline QDF_STATUS mlme_vdev_reset_proto_params( 143 struct vdev_mlme_obj *vdev_mlme, 144 uint16_t event_data_len, void *event_data) 145 { 146 QDF_STATUS ret = QDF_STATUS_SUCCESS; 147 148 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_reset_proto_params) 149 ret = vdev_mlme->ops->mlme_vdev_reset_proto_params( 150 vdev_mlme, event_data_len, event_data); 151 152 return ret; 153 } 154 155 /** 156 * mlme_vdev_start_send - Invokes VDEV start operation 157 * @vdev_mlme_obj: VDEV MLME comp object 158 * @event_data_len: data size 159 * @event_data: event data 160 * 161 * API invokes VDEV start operation 162 * 163 * Return: SUCCESS on successful completion of start operation 164 * FAILURE, if it fails due to any 165 */ 166 static inline QDF_STATUS mlme_vdev_start_send( 167 struct vdev_mlme_obj *vdev_mlme, 168 uint16_t event_data_len, void *event_data) 169 { 170 QDF_STATUS ret = QDF_STATUS_SUCCESS; 171 172 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_start_send) 173 ret = vdev_mlme->ops->mlme_vdev_start_send( 174 vdev_mlme, event_data_len, event_data); 175 176 return ret; 177 } 178 179 /** 180 * mlme_vdev_restart_send - Invokes VDEV restart operation 181 * @vdev_mlme_obj: VDEV MLME comp object 182 * @event_data_len: data size 183 * @event_data: event data 184 * 185 * API invokes VDEV restart operation 186 * 187 * Return: SUCCESS on successful completion of restart operation 188 * FAILURE, if it fails due to any 189 */ 190 static inline QDF_STATUS mlme_vdev_restart_send( 191 struct vdev_mlme_obj *vdev_mlme, 192 uint16_t event_data_len, void *event_data) 193 { 194 QDF_STATUS ret = QDF_STATUS_SUCCESS; 195 196 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_restart_send) 197 ret = vdev_mlme->ops->mlme_vdev_restart_send( 198 vdev_mlme, event_data_len, event_data); 199 200 return ret; 201 } 202 203 /** 204 * mlme_vdev_stop_start_send - Invoke block VDEV restart operation 205 * @vdev_mlme_obj: VDEV MLME comp object 206 * @restart: restart req/start req 207 * @event_data_len: data size 208 * @event_data: event data 209 * 210 * API invokes stops pending VDEV restart operation 211 * 212 * Return: SUCCESS alsways 213 */ 214 static inline QDF_STATUS mlme_vdev_stop_start_send( 215 struct vdev_mlme_obj *vdev_mlme, 216 uint8_t restart, 217 uint16_t event_data_len, void *event_data) 218 { 219 QDF_STATUS ret = QDF_STATUS_SUCCESS; 220 221 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_stop_start_send) 222 ret = vdev_mlme->ops->mlme_vdev_stop_start_send( 223 vdev_mlme, restart, event_data_len, event_data); 224 225 return ret; 226 } 227 228 /** 229 * mlme_vdev_start_continue - VDEV start response handling 230 * @vdev_mlme_obj: VDEV MLME comp object 231 * @event_data_len: data size 232 * @event_data: event data 233 * 234 * API invokes VDEV start response actions 235 * 236 * Return: SUCCESS on successful completion of start response operation 237 * FAILURE, if it fails due to any 238 */ 239 static inline QDF_STATUS mlme_vdev_start_continue( 240 struct vdev_mlme_obj *vdev_mlme, 241 uint16_t event_data_len, void *event_data) 242 { 243 QDF_STATUS ret = QDF_STATUS_SUCCESS; 244 245 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_start_continue) 246 ret = vdev_mlme->ops->mlme_vdev_start_continue( 247 vdev_mlme, event_data_len, event_data); 248 249 return ret; 250 } 251 252 /** 253 * mlme_vdev_start_req_failed - Invoke Station VDEV connection, if it pause 254 * @vdev_mlme_obj: VDEV MLME comp object 255 * @event_data_len: data size 256 * @event_data: event data 257 * 258 * API invokes on START fail response 259 * 260 * Return: SUCCESS on successful invocation of callback 261 * FAILURE, if it fails due to any 262 */ 263 static inline QDF_STATUS mlme_vdev_start_req_failed( 264 struct vdev_mlme_obj *vdev_mlme, 265 uint16_t event_data_len, void *event_data) 266 { 267 QDF_STATUS ret = QDF_STATUS_SUCCESS; 268 269 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_start_req_failed) 270 ret = vdev_mlme->ops->mlme_vdev_start_req_failed( 271 vdev_mlme, event_data_len, event_data); 272 273 return ret; 274 } 275 276 /** 277 * mlme_vdev_sta_conn_start - Invoke Station VDEV connection, if it pause 278 * @vdev_mlme_obj: VDEV MLME comp object 279 * @event_data_len: data size 280 * @event_data: event data 281 * 282 * API invokes connection SM to start station connection 283 * 284 * Return: SUCCESS on successful invocation of connection sm 285 * FAILURE, if it fails due to any 286 */ 287 static inline QDF_STATUS mlme_vdev_sta_conn_start( 288 struct vdev_mlme_obj *vdev_mlme, 289 uint16_t event_data_len, void *event_data) 290 { 291 QDF_STATUS ret = QDF_STATUS_SUCCESS; 292 293 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_sta_conn_start) 294 ret = vdev_mlme->ops->mlme_vdev_sta_conn_start( 295 vdev_mlme, event_data_len, event_data); 296 297 return ret; 298 } 299 300 /** 301 * mlme_vdev_sta_disconn_start - Invoke Station VDEV disconnection 302 * @vdev_mlme_obj: VDEV MLME comp object 303 * @event_data_len: data size 304 * @event_data: event data 305 * 306 * API invokes connection SM to start station disconnection 307 * 308 * Return: SUCCESS on successful invocation of disconnection sm 309 * FAILURE, if it fails due to any 310 */ 311 static inline QDF_STATUS mlme_vdev_sta_disconn_start( 312 struct vdev_mlme_obj *vdev_mlme, 313 uint16_t event_data_len, void *event_data) 314 { 315 QDF_STATUS ret = QDF_STATUS_SUCCESS; 316 317 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_sta_disconn_start) 318 ret = vdev_mlme->ops->mlme_vdev_sta_disconn_start( 319 vdev_mlme, event_data_len, event_data); 320 321 return ret; 322 } 323 324 /** 325 * mlme_vdev_up_send - VDEV up operation 326 * @vdev_mlme_obj: VDEV MLME comp object 327 * @event_data_len: data size 328 * @event_data: event data 329 * 330 * API invokes VDEV up operations 331 * 332 * Return: SUCCESS on successful completion of up operation 333 * FAILURE, if it fails due to any 334 */ 335 static inline QDF_STATUS mlme_vdev_up_send( 336 struct vdev_mlme_obj *vdev_mlme, 337 uint16_t event_data_len, void *event_data) 338 { 339 QDF_STATUS ret = QDF_STATUS_SUCCESS; 340 341 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_up_send) 342 ret = vdev_mlme->ops->mlme_vdev_up_send( 343 vdev_mlme, event_data_len, event_data); 344 345 return ret; 346 } 347 348 /** 349 * mlme_vdev_notify_up_complete - VDEV up state transition notification 350 * @vdev_mlme_obj: VDEV MLME comp object 351 * @event_data_len: data size 352 * @event_data: event data 353 * 354 * API notifies MLME on moving to UP state 355 * 356 * Return: SUCCESS on successful completion of up notification 357 * FAILURE, if it fails due to any 358 */ 359 static inline 360 QDF_STATUS mlme_vdev_notify_up_complete(struct vdev_mlme_obj *vdev_mlme, 361 uint16_t event_data_len, 362 void *event_data) 363 { 364 QDF_STATUS ret = QDF_STATUS_SUCCESS; 365 366 if (vdev_mlme->ops && vdev_mlme->ops->mlme_vdev_notify_up_complete) 367 ret = vdev_mlme->ops->mlme_vdev_notify_up_complete( 368 vdev_mlme, event_data_len, event_data); 369 370 return ret; 371 } 372 373 /** 374 * mlme_vdev_notify_roam_start - VDEV Roaming notification 375 * @vdev_mlme_obj: VDEV MLME comp object 376 * @event_len: data size 377 * @event_data: event data 378 * 379 * API notifies MLME on roaming 380 * 381 * Return: SUCCESS on successful completion of up notification 382 * FAILURE, if it fails due to any 383 */ 384 static inline 385 QDF_STATUS mlme_vdev_notify_roam_start(struct vdev_mlme_obj *vdev_mlme, 386 uint16_t event_len, void *event_data) 387 { 388 QDF_STATUS ret = QDF_STATUS_SUCCESS; 389 390 if (vdev_mlme->ops && vdev_mlme->ops->mlme_vdev_notify_roam_start) 391 ret = vdev_mlme->ops->mlme_vdev_notify_roam_start(vdev_mlme, 392 event_len, 393 event_data); 394 395 return ret; 396 } 397 398 /** 399 * mlme_vdev_update_beacon - Updates beacon 400 * @vdev_mlme_obj: VDEV MLME comp object 401 * @op: beacon update type 402 * @event_data_len: data size 403 * @event_data: event data 404 * 405 * API updates/allocates/frees the beacon 406 * 407 * Return: SUCCESS on successful update of beacon 408 * FAILURE, if it fails due to any 409 */ 410 static inline 411 QDF_STATUS mlme_vdev_update_beacon(struct vdev_mlme_obj *vdev_mlme, 412 enum beacon_update_op op, 413 uint16_t event_data_len, void *event_data) 414 { 415 QDF_STATUS ret = QDF_STATUS_SUCCESS; 416 417 if (vdev_mlme->ops && vdev_mlme->ops->mlme_vdev_update_beacon) 418 ret = vdev_mlme->ops->mlme_vdev_update_beacon(vdev_mlme, op, 419 event_data_len, event_data); 420 421 return ret; 422 } 423 424 /** 425 * mlme_vdev_disconnect_peers - Disconnect peers 426 * @vdev_mlme_obj: VDEV MLME comp object 427 * @event_data_len: data size 428 * @event_data: event data 429 * 430 * API trigger stations disconnection with AP VDEV or AP disconnection with STA 431 * VDEV 432 * 433 * Return: SUCCESS on successful invocation of station disconnection 434 * FAILURE, if it fails due to any 435 */ 436 static inline QDF_STATUS mlme_vdev_disconnect_peers( 437 struct vdev_mlme_obj *vdev_mlme, 438 uint16_t event_data_len, void *event_data) 439 { 440 QDF_STATUS ret = QDF_STATUS_SUCCESS; 441 442 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_disconnect_peers) 443 ret = vdev_mlme->ops->mlme_vdev_disconnect_peers( 444 vdev_mlme, event_data_len, event_data); 445 446 return ret; 447 } 448 449 /** 450 * mlme_vdev_dfs_cac_timer_stop - Stop CAC timer 451 * @vdev_mlme_obj: VDEV MLME comp object 452 * @event_data_len: data size 453 * @event_data: event data 454 * 455 * API stops the CAC timer through DFS API 456 * 457 * Return: SUCCESS on successful CAC timer stop 458 * FAILURE, if it fails due to any 459 */ 460 static inline QDF_STATUS mlme_vdev_dfs_cac_timer_stop( 461 struct vdev_mlme_obj *vdev_mlme, 462 uint16_t event_data_len, void *event_data) 463 { 464 QDF_STATUS ret = QDF_STATUS_SUCCESS; 465 466 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_dfs_cac_timer_stop) 467 ret = vdev_mlme->ops->mlme_vdev_dfs_cac_timer_stop( 468 vdev_mlme, event_data_len, event_data); 469 470 return ret; 471 } 472 473 /** 474 * mlme_vdev_stop_send - Invokes VDEV stop operation 475 * @vdev_mlme_obj: VDEV MLME comp object 476 * @event_data_len: data size 477 * @event_data: event data 478 * 479 * API invokes VDEV stop operation 480 * 481 * Return: SUCCESS on successful completion of stop operation 482 * FAILURE, if it fails due to any 483 */ 484 static inline QDF_STATUS mlme_vdev_stop_send( 485 struct vdev_mlme_obj *vdev_mlme, 486 uint16_t event_data_len, void *event_data) 487 { 488 QDF_STATUS ret = QDF_STATUS_SUCCESS; 489 490 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_stop_send) 491 ret = vdev_mlme->ops->mlme_vdev_stop_send( 492 vdev_mlme, event_data_len, event_data); 493 494 return ret; 495 } 496 497 /** 498 * mlme_vdev_stop_continue - VDEV stop response handling 499 * @vdev_mlme_obj: VDEV MLME comp object 500 * @event_data_len: data size 501 * @event_data: event data 502 * 503 * API invokes VDEV stop response actions 504 * 505 * Return: SUCCESS on successful completion of stop response operation 506 * FAILURE, if it fails due to any 507 */ 508 static inline QDF_STATUS mlme_vdev_stop_continue( 509 struct vdev_mlme_obj *vdev_mlme, 510 uint16_t event_data_len, void *event_data) 511 { 512 QDF_STATUS ret = QDF_STATUS_SUCCESS; 513 514 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_stop_continue) 515 ret = vdev_mlme->ops->mlme_vdev_stop_continue(vdev_mlme, 516 event_data_len, 517 event_data); 518 519 return ret; 520 } 521 522 /** 523 * mlme_vdev_down_send - VDEV down operation 524 * @vdev_mlme_obj: VDEV MLME comp object 525 * @event_data_len: data size 526 * @event_data: event data 527 * 528 * API invokes VDEV down operation 529 * 530 * Return: SUCCESS on successful completion of VDEV down operation 531 * FAILURE, if it fails due to any 532 */ 533 static inline QDF_STATUS mlme_vdev_down_send( 534 struct vdev_mlme_obj *vdev_mlme, 535 uint16_t event_data_len, void *event_data) 536 { 537 QDF_STATUS ret = QDF_STATUS_SUCCESS; 538 539 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_down_send) 540 ret = vdev_mlme->ops->mlme_vdev_down_send( 541 vdev_mlme, event_data_len, event_data); 542 543 return ret; 544 } 545 546 /** 547 * mlme_vdev_notify_down_complete - VDEV init state transition notification 548 * @vdev_mlme_obj: VDEV MLME comp object 549 * @event_data_len: data size 550 * @event_data: event data 551 * 552 * API notifies MLME on moving to INIT state 553 * 554 * Return: SUCCESS on successful completion of down notification 555 * FAILURE, if it fails due to any 556 */ 557 static inline QDF_STATUS mlme_vdev_notify_down_complete( 558 struct vdev_mlme_obj *vdev_mlme, 559 uint16_t event_data_len, void *event_data) 560 { 561 QDF_STATUS ret = QDF_STATUS_SUCCESS; 562 563 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_notify_down_complete) 564 ret = vdev_mlme->ops->mlme_vdev_notify_down_complete( 565 vdev_mlme, event_data_len, event_data); 566 567 return ret; 568 } 569 570 /** 571 * mlme_vdev_notify_start_state_exit - VDEV SM start state exit notification 572 * @vdev_mlme_obj: VDEV MLME comp object 573 * 574 * API notifies on start state exit 575 * 576 * Return: SUCCESS on successful completion of notification 577 * FAILURE, if it fails due to any 578 */ 579 static inline QDF_STATUS mlme_vdev_notify_start_state_exit( 580 struct vdev_mlme_obj *vdev_mlme) 581 { 582 QDF_STATUS ret = QDF_STATUS_SUCCESS; 583 584 if ((vdev_mlme->ops) && 585 vdev_mlme->ops->mlme_vdev_notify_start_state_exit) 586 ret = vdev_mlme->ops->mlme_vdev_notify_start_state_exit( 587 vdev_mlme); 588 589 return ret; 590 } 591 592 /** 593 * mlme_vdev_is_newchan_no_cac - Checks new channel requires CAC 594 * @vdev_mlme_obj: VDEV MLME comp object 595 * 596 * API checks whether Channel needs CAC period, 597 * if yes, it moves to SUSPEND_RESTART to disconnect stations before 598 * sending RESTART to FW, otherwise, it moves to RESTART_PROGRESS substate 599 * 600 * Return: SUCCESS to move to RESTART_PROGRESS substate 601 * FAILURE, move to SUSPEND_RESTART state 602 */ 603 static inline QDF_STATUS mlme_vdev_is_newchan_no_cac( 604 struct vdev_mlme_obj *vdev_mlme) 605 { 606 QDF_STATUS ret = QDF_STATUS_SUCCESS; 607 608 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_is_newchan_no_cac) 609 ret = vdev_mlme->ops->mlme_vdev_is_newchan_no_cac(vdev_mlme); 610 611 return ret; 612 } 613 614 /** 615 * mlme_vdev_dfs_cac_wait_notify - Notifies DFS CAC wait state 616 * @vdev_mlme_obj: VDEV MLME comp object 617 * 618 * Return: NO_SUPPORT if the callback is not supported. 619 * SUCCESS if DFS CAC Wait notification handled by caller 620 */ 621 static inline QDF_STATUS mlme_vdev_dfs_cac_wait_notify( 622 struct vdev_mlme_obj *vdev_mlme) 623 { 624 QDF_STATUS ret = QDF_STATUS_E_NOSUPPORT; 625 626 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_dfs_cac_wait_notify) 627 ret = vdev_mlme->ops->mlme_vdev_dfs_cac_wait_notify(vdev_mlme); 628 629 return ret; 630 } 631 632 /** 633 * mlme_vdev_chan_switch_disable_notify_dfs - Notifies DFS when channel 634 * switch is disabled 635 * @vdev_mlme: VDEV MLME comp object 636 * 637 * Return: QDF_STATUS. 638 */ 639 static inline QDF_STATUS mlme_vdev_chan_switch_disable_notify_dfs( 640 struct vdev_mlme_obj *vdev_mlme) 641 { 642 return utils_dfs_radar_enable(wlan_vdev_get_pdev(vdev_mlme->vdev)); 643 } 644 #ifdef WLAN_FEATURE_11BE_MLO 645 /** 646 * mlme_vdev_up_notify_mlo_mgr - notify mlo link is ready to up 647 * @vdev_mlme: VDEV MLME comp object 648 * 649 * Return: true if MLO_SYNC_COMPLETE is posted, else false 650 */ 651 static inline bool mlme_vdev_up_notify_mlo_mgr(struct vdev_mlme_obj *vdev_mlme) 652 { 653 if (wlan_vdev_mlme_is_mlo_ap(vdev_mlme->vdev)) 654 return mlo_ap_link_sync_wait_notify(vdev_mlme->vdev); 655 656 return true; 657 } 658 659 /** 660 * mlme_vdev_start_rsp_notify_mlo_mgr - notify mlo link is started 661 * @vdev_mlme_obj: VDEV MLME comp object 662 * 663 * Return: VOID. 664 */ 665 static inline void mlme_vdev_start_rsp_notify_mlo_mgr( 666 struct vdev_mlme_obj *vdev_mlme) 667 { 668 if (wlan_vdev_mlme_is_mlo_ap(vdev_mlme->vdev)) 669 mlo_ap_link_start_rsp_notify(vdev_mlme->vdev); 670 } 671 672 /** 673 * mlme_vdev_down_cmpl_notify_mlo_mgr - notify mlo link is down complete 674 * @vdev_mlme_obj: VDEV MLME comp object 675 * 676 * Return: VOID. 677 */ 678 static inline void mlme_vdev_down_cmpl_notify_mlo_mgr( 679 struct vdev_mlme_obj *vdev_mlme) 680 { 681 if (wlan_vdev_mlme_is_mlo_ap(vdev_mlme->vdev)) 682 mlo_ap_link_down_cmpl_notify(vdev_mlme->vdev); 683 } 684 685 /** 686 * mlme_vdev_up_active_notify_mlo_mgr - notify mlo link is up active 687 * @vdev_mlme_obj: VDEV MLME comp object 688 * 689 * Return: VOID. 690 */ 691 static inline void mlme_vdev_up_active_notify_mlo_mgr( 692 struct vdev_mlme_obj *vdev_mlme) 693 { 694 if ((wlan_vdev_mlme_get_opmode(vdev_mlme->vdev) == QDF_STA_MODE) && 695 wlan_vdev_mlme_is_mlo_vdev(vdev_mlme->vdev)) 696 mlo_sta_up_active_notify(vdev_mlme->vdev); 697 } 698 699 /** 700 * mlme_vdev_notify_mlo_sync_wait_entry - Notifies mlo sync wait state 701 * @vdev_mlme_obj: VDEV MLME comp object 702 * 703 * Return: NO_SUPPORT if the callback is not supported. 704 * SUCCESS if notification is handled by caller 705 */ 706 static inline QDF_STATUS mlme_vdev_notify_mlo_sync_wait_entry( 707 struct vdev_mlme_obj *vdev_mlme) 708 { 709 QDF_STATUS ret = QDF_STATUS_E_NOSUPPORT; 710 711 if (vdev_mlme->ops && 712 vdev_mlme->ops->mlme_vdev_notify_mlo_sync_wait_entry) 713 ret = vdev_mlme->ops->mlme_vdev_notify_mlo_sync_wait_entry( 714 vdev_mlme); 715 return ret; 716 } 717 #else 718 static inline bool mlme_vdev_up_notify_mlo_mgr(struct vdev_mlme_obj *vdev_mlme) 719 { 720 return true; 721 } 722 723 static inline void mlme_vdev_start_rsp_notify_mlo_mgr( 724 struct vdev_mlme_obj *vdev_mlme) 725 { 726 } 727 728 static inline void mlme_vdev_down_cmpl_notify_mlo_mgr( 729 struct vdev_mlme_obj *vdev_mlme) 730 { 731 } 732 733 static inline void mlme_vdev_up_active_notify_mlo_mgr( 734 struct vdev_mlme_obj *vdev_mlme) 735 { 736 } 737 738 static inline QDF_STATUS mlme_vdev_notify_mlo_sync_wait_entry( 739 struct vdev_mlme_obj *vdev_mlme) 740 { 741 return QDF_STATUS_SUCCESS; 742 } 743 #endif 744 745 #ifdef VDEV_SM_LOCK_SUPPORT 746 /** 747 * mlme_vdev_sm_spinlock_create - Create VDEV MLME spinlock 748 * @vdev_mlme_obj: VDEV MLME comp object 749 * 750 * Creates VDEV MLME spinlock 751 * 752 * Return: void 753 */ 754 static inline void mlme_vdev_sm_spinlock_create(struct vdev_mlme_obj *vdev_mlme) 755 { 756 qdf_spinlock_create(&vdev_mlme->sm_lock); 757 } 758 759 /** 760 * mlme_vdev_sm_spinlock_destroy - Destroy VDEV MLME spinlock 761 * @vdev_mlme_obj: VDEV MLME comp object 762 * 763 * Destroy VDEV MLME spinlock 764 * 765 * Return: void 766 */ 767 static inline void mlme_vdev_sm_spinlock_destroy( 768 struct vdev_mlme_obj *vdev_mlme) 769 { 770 qdf_spinlock_destroy(&vdev_mlme->sm_lock); 771 } 772 773 /** 774 * mlme_vdev_sm_spin_lock - acquire spinlock 775 * @vdev_mlme_obj: vdev mlme comp object 776 * 777 * acquire vdev mlme spinlock 778 * 779 * return: void 780 */ 781 static inline void mlme_vdev_sm_spin_lock(struct vdev_mlme_obj *vdev_mlme) 782 { 783 qdf_spin_lock_bh(&vdev_mlme->sm_lock); 784 } 785 786 /** 787 * mlme_vdev_sm_spin_unlock - release spinlock 788 * @vdev_mlme_obj: vdev mlme comp object 789 * 790 * release vdev mlme spinlock 791 * 792 * return: void 793 */ 794 static inline void mlme_vdev_sm_spin_unlock(struct vdev_mlme_obj *vdev_mlme) 795 { 796 qdf_spin_unlock_bh(&vdev_mlme->sm_lock); 797 } 798 799 /** 800 * mlme_vdev_cmd_mutex_create - Create VDEV MLME cmd mutex 801 * @vdev_mlme_obj: VDEV MLME comp object 802 * 803 * Creates VDEV MLME cmd mutex 804 * 805 * Return: void 806 */ 807 static inline void 808 mlme_vdev_cmd_mutex_create(struct vdev_mlme_obj *vdev_mlme) 809 { 810 qdf_mutex_create(&vdev_mlme->vdev_cmd_lock); 811 } 812 813 /** 814 * mlme_vdev_cmd_mutex_destroy - Destroy VDEV MLME cmd mutex 815 * @vdev_mlme_obj: VDEV MLME comp object 816 * 817 * Destroy VDEV MLME cmd mutex 818 * 819 * Return: void 820 */ 821 static inline void 822 mlme_vdev_cmd_mutex_destroy(struct vdev_mlme_obj *vdev_mlme) 823 { 824 qdf_mutex_destroy(&vdev_mlme->vdev_cmd_lock); 825 } 826 827 /** 828 * mlme_vdev_cmd_mutex_acquire - acquire mutex 829 * @vdev_mlme_obj: vdev mlme comp object 830 * 831 * acquire vdev mlme cmd mutex 832 * 833 * return: void 834 */ 835 static inline void mlme_vdev_cmd_mutex_acquire(struct vdev_mlme_obj *vdev_mlme) 836 { 837 qdf_mutex_acquire(&vdev_mlme->vdev_cmd_lock); 838 } 839 840 /** 841 * mlme_vdev_cmd_mutex_release - release mutex 842 * @vdev_mlme_obj: vdev mlme comp object 843 * 844 * release vdev mlme cmd mutex 845 * 846 * return: void 847 */ 848 static inline void mlme_vdev_cmd_mutex_release(struct vdev_mlme_obj *vdev_mlme) 849 { 850 qdf_mutex_release(&vdev_mlme->vdev_cmd_lock); 851 } 852 853 #else 854 static inline void mlme_vdev_sm_spinlock_create(struct vdev_mlme_obj *vdev_mlme) 855 { 856 mlme_debug("VDEV SM lock is disabled!!!"); 857 } 858 859 static inline void mlme_vdev_sm_spinlock_destroy( 860 struct vdev_mlme_obj *vdev_mlme) 861 { 862 mlme_debug("VDEV SM lock is disabled!!!"); 863 } 864 865 static inline void mlme_vdev_sm_spin_lock(struct vdev_mlme_obj *vdev_mlme) 866 { 867 } 868 869 static inline void mlme_vdev_sm_spin_unlock(struct vdev_mlme_obj *vdev_mlme) 870 { 871 } 872 873 static inline void 874 mlme_vdev_cmd_mutex_create(struct vdev_mlme_obj *vdev_mlme) 875 { 876 mlme_debug("VDEV CMD lock is disabled!!!"); 877 } 878 879 static inline void 880 mlme_vdev_cmd_mutex_destroy(struct vdev_mlme_obj *vdev_mlme) 881 { 882 mlme_debug("VDEV CMD lock is disabled!!!"); 883 } 884 885 static inline void mlme_vdev_cmd_mutex_acquire(struct vdev_mlme_obj *vdev_mlme) 886 { 887 } 888 889 static inline void mlme_vdev_cmd_mutex_release(struct vdev_mlme_obj *vdev_mlme) 890 { 891 } 892 #endif 893