1 /* 2 * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved. 3 * Copyright (c) 2022-2023 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: VDEV MLME comp object 427 * @event_data_len: data size 428 * @event_data: event data 429 * @discon_legacy_only: flag indicating that only legacy peer to be 430 * disconnected 431 * 432 * API trigger stations disconnection with AP VDEV or AP disconnection with STA 433 * VDEV 434 * 435 * Return: SUCCESS on successful invocation of station disconnection 436 * FAILURE, if it fails due to any 437 */ 438 static inline QDF_STATUS mlme_vdev_disconnect_peers( 439 struct vdev_mlme_obj *vdev_mlme, 440 uint16_t event_data_len, void *event_data, 441 bool discon_legacy_only) 442 { 443 QDF_STATUS ret = QDF_STATUS_SUCCESS; 444 445 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_disconnect_peers) 446 ret = vdev_mlme->ops->mlme_vdev_disconnect_peers( 447 vdev_mlme, event_data_len, event_data, 448 discon_legacy_only); 449 450 return ret; 451 } 452 453 /** 454 * mlme_vdev_dfs_cac_timer_stop() - Stop CAC timer 455 * @vdev_mlme: VDEV MLME comp object 456 * @event_data_len: data size 457 * @event_data: event data 458 * 459 * API stops the CAC timer through DFS API 460 * 461 * Return: SUCCESS on successful CAC timer stop 462 * FAILURE, if it fails due to any 463 */ 464 static inline QDF_STATUS mlme_vdev_dfs_cac_timer_stop( 465 struct vdev_mlme_obj *vdev_mlme, 466 uint16_t event_data_len, void *event_data) 467 { 468 QDF_STATUS ret = QDF_STATUS_SUCCESS; 469 470 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_dfs_cac_timer_stop) 471 ret = vdev_mlme->ops->mlme_vdev_dfs_cac_timer_stop( 472 vdev_mlme, event_data_len, event_data); 473 474 return ret; 475 } 476 477 /** 478 * mlme_vdev_stop_send() - Invokes VDEV stop operation 479 * @vdev_mlme: VDEV MLME comp object 480 * @event_data_len: data size 481 * @event_data: event data 482 * 483 * API invokes VDEV stop operation 484 * 485 * Return: SUCCESS on successful completion of stop operation 486 * FAILURE, if it fails due to any 487 */ 488 static inline QDF_STATUS mlme_vdev_stop_send( 489 struct vdev_mlme_obj *vdev_mlme, 490 uint16_t event_data_len, void *event_data) 491 { 492 QDF_STATUS ret = QDF_STATUS_SUCCESS; 493 494 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_stop_send) 495 ret = vdev_mlme->ops->mlme_vdev_stop_send( 496 vdev_mlme, event_data_len, event_data); 497 498 return ret; 499 } 500 501 /** 502 * mlme_vdev_stop_continue() - VDEV stop response handling 503 * @vdev_mlme: VDEV MLME comp object 504 * @event_data_len: data size 505 * @event_data: event data 506 * 507 * API invokes VDEV stop response actions 508 * 509 * Return: SUCCESS on successful completion of stop response operation 510 * FAILURE, if it fails due to any 511 */ 512 static inline QDF_STATUS mlme_vdev_stop_continue( 513 struct vdev_mlme_obj *vdev_mlme, 514 uint16_t event_data_len, void *event_data) 515 { 516 QDF_STATUS ret = QDF_STATUS_SUCCESS; 517 518 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_stop_continue) 519 ret = vdev_mlme->ops->mlme_vdev_stop_continue(vdev_mlme, 520 event_data_len, 521 event_data); 522 523 return ret; 524 } 525 526 /** 527 * mlme_vdev_down_send() - VDEV down operation 528 * @vdev_mlme: VDEV MLME comp object 529 * @event_data_len: data size 530 * @event_data: event data 531 * 532 * API invokes VDEV down operation 533 * 534 * Return: SUCCESS on successful completion of VDEV down operation 535 * FAILURE, if it fails due to any 536 */ 537 static inline QDF_STATUS mlme_vdev_down_send( 538 struct vdev_mlme_obj *vdev_mlme, 539 uint16_t event_data_len, void *event_data) 540 { 541 QDF_STATUS ret = QDF_STATUS_SUCCESS; 542 543 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_down_send) 544 ret = vdev_mlme->ops->mlme_vdev_down_send( 545 vdev_mlme, event_data_len, event_data); 546 547 return ret; 548 } 549 550 /** 551 * mlme_vdev_notify_down_complete() - VDEV init state transition notification 552 * @vdev_mlme: VDEV MLME comp object 553 * @event_data_len: data size 554 * @event_data: event data 555 * 556 * API notifies MLME on moving to INIT state 557 * 558 * Return: SUCCESS on successful completion of down notification 559 * FAILURE, if it fails due to any 560 */ 561 static inline QDF_STATUS mlme_vdev_notify_down_complete( 562 struct vdev_mlme_obj *vdev_mlme, 563 uint16_t event_data_len, void *event_data) 564 { 565 QDF_STATUS ret = QDF_STATUS_SUCCESS; 566 567 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_notify_down_complete) 568 ret = vdev_mlme->ops->mlme_vdev_notify_down_complete( 569 vdev_mlme, event_data_len, event_data); 570 571 return ret; 572 } 573 574 /** 575 * mlme_vdev_notify_start_state_exit() - VDEV SM start state exit notification 576 * @vdev_mlme: VDEV MLME comp object 577 * 578 * API notifies on start state exit 579 * 580 * Return: SUCCESS on successful completion of notification 581 * FAILURE, if it fails due to any 582 */ 583 static inline QDF_STATUS mlme_vdev_notify_start_state_exit( 584 struct vdev_mlme_obj *vdev_mlme) 585 { 586 QDF_STATUS ret = QDF_STATUS_SUCCESS; 587 588 if ((vdev_mlme->ops) && 589 vdev_mlme->ops->mlme_vdev_notify_start_state_exit) 590 ret = vdev_mlme->ops->mlme_vdev_notify_start_state_exit( 591 vdev_mlme); 592 593 return ret; 594 } 595 596 /** 597 * mlme_vdev_is_newchan_no_cac() - Checks new channel requires CAC 598 * @vdev_mlme: VDEV MLME comp object 599 * 600 * API checks whether Channel needs CAC period, 601 * if yes, it moves to SUSPEND_RESTART to disconnect stations before 602 * sending RESTART to FW, otherwise, it moves to RESTART_PROGRESS substate 603 * 604 * Return: SUCCESS to move to RESTART_PROGRESS substate 605 * FAILURE, move to SUSPEND_RESTART state 606 */ 607 static inline QDF_STATUS mlme_vdev_is_newchan_no_cac( 608 struct vdev_mlme_obj *vdev_mlme) 609 { 610 QDF_STATUS ret = QDF_STATUS_SUCCESS; 611 612 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_is_newchan_no_cac) 613 ret = vdev_mlme->ops->mlme_vdev_is_newchan_no_cac(vdev_mlme); 614 615 return ret; 616 } 617 618 /** 619 * mlme_vdev_dfs_cac_wait_notify() - Notifies DFS CAC wait state 620 * @vdev_mlme: VDEV MLME comp object 621 * 622 * Return: NO_SUPPORT if the callback is not supported. 623 * SUCCESS if DFS CAC Wait notification handled by caller 624 */ 625 static inline QDF_STATUS mlme_vdev_dfs_cac_wait_notify( 626 struct vdev_mlme_obj *vdev_mlme) 627 { 628 QDF_STATUS ret = QDF_STATUS_E_NOSUPPORT; 629 630 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_dfs_cac_wait_notify) 631 ret = vdev_mlme->ops->mlme_vdev_dfs_cac_wait_notify(vdev_mlme); 632 633 return ret; 634 } 635 636 /** 637 * mlme_vdev_chan_switch_disable_notify_dfs() - Notifies DFS when channel 638 * switch is disabled 639 * @vdev_mlme: VDEV MLME comp object 640 * 641 * Return: QDF_STATUS. 642 */ 643 static inline QDF_STATUS mlme_vdev_chan_switch_disable_notify_dfs( 644 struct vdev_mlme_obj *vdev_mlme) 645 { 646 return utils_dfs_radar_enable(wlan_vdev_get_pdev(vdev_mlme->vdev)); 647 } 648 #ifdef WLAN_FEATURE_11BE_MLO 649 /** 650 * mlme_vdev_up_notify_mlo_mgr() - notify mlo link is ready to up 651 * @vdev_mlme: VDEV MLME comp object 652 * 653 * Return: true if MLO_SYNC_COMPLETE is posted, else false 654 */ 655 static inline bool mlme_vdev_up_notify_mlo_mgr(struct vdev_mlme_obj *vdev_mlme) 656 { 657 if (wlan_vdev_mlme_is_mlo_ap(vdev_mlme->vdev)) 658 return mlo_ap_link_sync_wait_notify(vdev_mlme->vdev); 659 660 return true; 661 } 662 663 /** 664 * mlme_vdev_start_rsp_notify_mlo_mgr() - notify mlo link is started 665 * @vdev_mlme: VDEV MLME comp object 666 * 667 * Return: VOID. 668 */ 669 static inline void mlme_vdev_start_rsp_notify_mlo_mgr( 670 struct vdev_mlme_obj *vdev_mlme) 671 { 672 if (wlan_vdev_mlme_is_mlo_ap(vdev_mlme->vdev)) 673 mlo_ap_link_start_rsp_notify(vdev_mlme->vdev); 674 } 675 676 /** 677 * mlme_vdev_down_cmpl_notify_mlo_mgr() - notify mlo link is down complete 678 * @vdev_mlme: VDEV MLME comp object 679 * 680 * Return: VOID. 681 */ 682 static inline void mlme_vdev_down_cmpl_notify_mlo_mgr( 683 struct vdev_mlme_obj *vdev_mlme) 684 { 685 if (wlan_vdev_mlme_is_mlo_ap(vdev_mlme->vdev)) 686 mlo_ap_link_down_cmpl_notify(vdev_mlme->vdev); 687 } 688 689 /** 690 * mlme_vdev_up_active_notify_mlo_mgr() - notify mlo link is up active 691 * @vdev_mlme: VDEV MLME comp object 692 * 693 * Return: VOID. 694 */ 695 static inline void mlme_vdev_up_active_notify_mlo_mgr( 696 struct vdev_mlme_obj *vdev_mlme) 697 { 698 if ((wlan_vdev_mlme_get_opmode(vdev_mlme->vdev) == QDF_STA_MODE) && 699 wlan_vdev_mlme_is_mlo_vdev(vdev_mlme->vdev)) 700 mlo_sta_up_active_notify(vdev_mlme->vdev); 701 } 702 703 /** 704 * mlme_vdev_notify_mlo_sync_wait_entry() - Notifies mlo sync wait state 705 * @vdev_mlme: VDEV MLME comp object 706 * 707 * Return: NO_SUPPORT if the callback is not supported. 708 * SUCCESS if notification is handled by caller 709 */ 710 static inline QDF_STATUS mlme_vdev_notify_mlo_sync_wait_entry( 711 struct vdev_mlme_obj *vdev_mlme) 712 { 713 QDF_STATUS ret = QDF_STATUS_E_NOSUPPORT; 714 715 if (vdev_mlme->ops && 716 vdev_mlme->ops->mlme_vdev_notify_mlo_sync_wait_entry) 717 ret = vdev_mlme->ops->mlme_vdev_notify_mlo_sync_wait_entry( 718 vdev_mlme); 719 return ret; 720 } 721 #else 722 static inline bool mlme_vdev_up_notify_mlo_mgr(struct vdev_mlme_obj *vdev_mlme) 723 { 724 return true; 725 } 726 727 static inline void mlme_vdev_start_rsp_notify_mlo_mgr( 728 struct vdev_mlme_obj *vdev_mlme) 729 { 730 } 731 732 static inline void mlme_vdev_down_cmpl_notify_mlo_mgr( 733 struct vdev_mlme_obj *vdev_mlme) 734 { 735 } 736 737 static inline void mlme_vdev_up_active_notify_mlo_mgr( 738 struct vdev_mlme_obj *vdev_mlme) 739 { 740 } 741 742 static inline QDF_STATUS mlme_vdev_notify_mlo_sync_wait_entry( 743 struct vdev_mlme_obj *vdev_mlme) 744 { 745 return QDF_STATUS_SUCCESS; 746 } 747 #endif 748 749 #ifdef VDEV_SM_LOCK_SUPPORT 750 /** 751 * mlme_vdev_sm_spinlock_create() - Create VDEV MLME spinlock 752 * @vdev_mlme: VDEV MLME comp object 753 * 754 * Creates VDEV MLME spinlock 755 * 756 * Return: void 757 */ 758 static inline void mlme_vdev_sm_spinlock_create(struct vdev_mlme_obj *vdev_mlme) 759 { 760 qdf_spinlock_create(&vdev_mlme->sm_lock); 761 } 762 763 /** 764 * mlme_vdev_sm_spinlock_destroy() - Destroy VDEV MLME spinlock 765 * @vdev_mlme: VDEV MLME comp object 766 * 767 * Destroy VDEV MLME spinlock 768 * 769 * Return: void 770 */ 771 static inline void mlme_vdev_sm_spinlock_destroy( 772 struct vdev_mlme_obj *vdev_mlme) 773 { 774 qdf_spinlock_destroy(&vdev_mlme->sm_lock); 775 } 776 777 /** 778 * mlme_vdev_sm_spin_lock() - acquire spinlock 779 * @vdev_mlme: vdev mlme comp object 780 * 781 * acquire vdev mlme spinlock 782 * 783 * return: void 784 */ 785 static inline void mlme_vdev_sm_spin_lock(struct vdev_mlme_obj *vdev_mlme) 786 { 787 qdf_spin_lock_bh(&vdev_mlme->sm_lock); 788 } 789 790 /** 791 * mlme_vdev_sm_spin_unlock() - release spinlock 792 * @vdev_mlme: vdev mlme comp object 793 * 794 * release vdev mlme spinlock 795 * 796 * return: void 797 */ 798 static inline void mlme_vdev_sm_spin_unlock(struct vdev_mlme_obj *vdev_mlme) 799 { 800 qdf_spin_unlock_bh(&vdev_mlme->sm_lock); 801 } 802 803 /** 804 * mlme_vdev_cmd_mutex_create() - Create VDEV MLME cmd mutex 805 * @vdev_mlme: VDEV MLME comp object 806 * 807 * Creates VDEV MLME cmd mutex 808 * 809 * Return: void 810 */ 811 static inline void 812 mlme_vdev_cmd_mutex_create(struct vdev_mlme_obj *vdev_mlme) 813 { 814 qdf_mutex_create(&vdev_mlme->vdev_cmd_lock); 815 } 816 817 /** 818 * mlme_vdev_cmd_mutex_destroy() - Destroy VDEV MLME cmd mutex 819 * @vdev_mlme: VDEV MLME comp object 820 * 821 * Destroy VDEV MLME cmd mutex 822 * 823 * Return: void 824 */ 825 static inline void 826 mlme_vdev_cmd_mutex_destroy(struct vdev_mlme_obj *vdev_mlme) 827 { 828 qdf_mutex_destroy(&vdev_mlme->vdev_cmd_lock); 829 } 830 831 /** 832 * mlme_vdev_cmd_mutex_acquire() - acquire mutex 833 * @vdev_mlme: vdev mlme comp object 834 * 835 * acquire vdev mlme cmd mutex 836 * 837 * return: void 838 */ 839 static inline void mlme_vdev_cmd_mutex_acquire(struct vdev_mlme_obj *vdev_mlme) 840 { 841 qdf_mutex_acquire(&vdev_mlme->vdev_cmd_lock); 842 } 843 844 /** 845 * mlme_vdev_cmd_mutex_release() - release mutex 846 * @vdev_mlme: vdev mlme comp object 847 * 848 * release vdev mlme cmd mutex 849 * 850 * return: void 851 */ 852 static inline void mlme_vdev_cmd_mutex_release(struct vdev_mlme_obj *vdev_mlme) 853 { 854 qdf_mutex_release(&vdev_mlme->vdev_cmd_lock); 855 } 856 857 #else 858 static inline void mlme_vdev_sm_spinlock_create(struct vdev_mlme_obj *vdev_mlme) 859 { 860 mlme_debug("VDEV SM lock is disabled!!!"); 861 } 862 863 static inline void mlme_vdev_sm_spinlock_destroy( 864 struct vdev_mlme_obj *vdev_mlme) 865 { 866 mlme_debug("VDEV SM lock is disabled!!!"); 867 } 868 869 static inline void mlme_vdev_sm_spin_lock(struct vdev_mlme_obj *vdev_mlme) 870 { 871 } 872 873 static inline void mlme_vdev_sm_spin_unlock(struct vdev_mlme_obj *vdev_mlme) 874 { 875 } 876 877 static inline void 878 mlme_vdev_cmd_mutex_create(struct vdev_mlme_obj *vdev_mlme) 879 { 880 mlme_debug("VDEV CMD lock is disabled!!!"); 881 } 882 883 static inline void 884 mlme_vdev_cmd_mutex_destroy(struct vdev_mlme_obj *vdev_mlme) 885 { 886 mlme_debug("VDEV CMD lock is disabled!!!"); 887 } 888 889 static inline void mlme_vdev_cmd_mutex_acquire(struct vdev_mlme_obj *vdev_mlme) 890 { 891 } 892 893 static inline void mlme_vdev_cmd_mutex_release(struct vdev_mlme_obj *vdev_mlme) 894 { 895 } 896 #endif 897