1 /* 2 * Copyright (c) 2021, The Linux Foundation. All rights reserved. 3 * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18 /* 19 * DOC: contains MLO manager public file containing STA functionality 20 */ 21 #ifndef _WLAN_MLO_MGR_STA_H_ 22 #define _WLAN_MLO_MGR_STA_H_ 23 24 #include <wlan_cm_ucfg_api.h> 25 #include <wlan_objmgr_vdev_obj.h> 26 #include <wlan_mlo_mgr_cmn.h> 27 #ifdef WLAN_FEATURE_11BE_MLO 28 #include <wlan_mlo_mgr_public_structs.h> 29 30 /** 31 * mlo_connect - Start the connection process 32 * @vdev: pointer to vdev 33 * @req: connection request 34 * 35 * Return: QDF_STATUS 36 */ 37 QDF_STATUS mlo_connect(struct wlan_objmgr_vdev *vdev, 38 struct wlan_cm_connect_req *req); 39 40 /** 41 * mlo_sta_link_connect_notify - Called by connection manager to notify the 42 * STA link connect is complete 43 * @vdev: pointer to vdev 44 * @mlo_ie: MLO information element 45 * 46 * Connection manager will notify the MLO manager when the link has started 47 * and MLO manager will start the subsequent connections, if necessary 48 * 49 * Return: none 50 */ 51 void 52 mlo_sta_link_connect_notify(struct wlan_objmgr_vdev *vdev, 53 struct wlan_cm_connect_resp *rsp); 54 55 /** 56 * mlo_disconnect - Start the disconnection process 57 * @vdev: pointer to vdev 58 * @source: source of the request (can be connect or disconnect request) 59 * @reason_code: reason for disconnect 60 * @bssid: BSSID 61 * 62 * Return: QDF_STATUS 63 */ 64 QDF_STATUS mlo_disconnect(struct wlan_objmgr_vdev *vdev, 65 enum wlan_cm_source source, 66 enum wlan_reason_code reason_code, 67 struct qdf_mac_addr *bssid); 68 69 /** 70 * mlo_sync_disconnect - Start the sync disconnection process 71 * @vdev: pointer to vdev 72 * @source: source of the request (can be connect or disconnect request) 73 * @reason_code: reason for disconnect 74 * @bssid: BSSID 75 * 76 * Return: QDF_STATUS 77 */ 78 QDF_STATUS mlo_sync_disconnect(struct wlan_objmgr_vdev *vdev, 79 enum wlan_cm_source source, 80 enum wlan_reason_code reason_code, 81 struct qdf_mac_addr *bssid); 82 83 /** 84 * mlo_sta_link_disconn_notify - Notifies that STA link disconnect completion 85 * @vdev: pointer to vdev 86 * @resp: disconnect resp 87 * 88 * Return: none 89 */ 90 void mlo_sta_link_disconn_notify(struct wlan_objmgr_vdev *vdev, 91 struct wlan_cm_discon_rsp *resp); 92 93 /** 94 * mlo_handle_sta_link_connect_failure - Notifies that STA link connect failure 95 * @vdev: pointer to vdev 96 * @rsp: connect resp 97 * 98 * Return: none 99 */ 100 void mlo_handle_sta_link_connect_failure(struct wlan_objmgr_vdev *vdev, 101 struct wlan_cm_connect_resp *rsp); 102 103 /** 104 * mlo_handle_pending_disconnect - Handle pending disconnect if received 105 * while link connect is ongoing. 106 * @vdev: pointer to vdev 107 * 108 * Return: none 109 */ 110 void mlo_handle_pending_disconnect(struct wlan_objmgr_vdev *vdev); 111 112 /** 113 * mlo_is_mld_sta - Check if MLD associated with the vdev is a station 114 * @vdev: pointer to vdev 115 * 116 * Return: true if MLD is a station, false otherwise 117 */ 118 bool mlo_is_mld_sta(struct wlan_objmgr_vdev *vdev); 119 120 /** 121 * ucfg_mlo_is_mld_disconnected - Check whether MLD is disconnected 122 * @vdev: pointer to vdev 123 * 124 * Return: true if mld is disconnected, false otherwise 125 */ 126 bool ucfg_mlo_is_mld_disconnected(struct wlan_objmgr_vdev *vdev); 127 128 /** 129 * mlo_is_mld_disconnecting_connecting - Check whether MLD is disconnecting or 130 * connecting 131 * @vdev: pointer to vdev 132 * 133 * Return: true if mld is disconnecting or connecting, false otherwise 134 */ 135 bool mlo_is_mld_disconnecting_connecting(struct wlan_objmgr_vdev *vdev); 136 137 #ifndef WLAN_FEATURE_11BE_MLO_ADV_FEATURE 138 /** 139 * ucfg_mlo_is_mld_connected - Check whether MLD is connected 140 * @vdev: pointer to vdev 141 * 142 * Return: true if mld is connected, false otherwise 143 */ 144 bool ucfg_mlo_is_mld_connected(struct wlan_objmgr_vdev *vdev); 145 146 /** 147 * ucfg_mlo_mld_clear_mlo_cap - Clear MLO cap for all vdevs in MLD 148 * @vdev: pointer to vdev 149 * 150 * Return: None 151 */ 152 void ucfg_mlo_mld_clear_mlo_cap(struct wlan_objmgr_vdev *vdev); 153 #endif 154 155 /** 156 * ucfg_mlo_get_assoc_link_vdev - API to get assoc link vdev 157 * @mlo_dev_ctx: mlo dev ctx 158 * 159 * Return: MLD assoc link vdev 160 */ 161 struct wlan_objmgr_vdev * 162 ucfg_mlo_get_assoc_link_vdev(struct wlan_objmgr_vdev *vdev); 163 164 /** 165 * wlan_mlo_get_assoc_link_vdev - API to get assoc link vdev 166 * @mlo_dev_ctx: mlo dev ctx 167 * 168 * Return: MLD assoc link vdev 169 */ 170 struct wlan_objmgr_vdev * 171 wlan_mlo_get_assoc_link_vdev(struct wlan_objmgr_vdev *vdev); 172 173 /** 174 * mlo_update_connected_links_bmap: update connected links bitmap 175 * @mlo_dev_ctx: mlo dev context ptr 176 * @ml_partner_info: ml parnter info ptr 177 * 178 * Return: none 179 */ 180 void 181 mlo_update_connected_links_bmap(struct wlan_mlo_dev_context *mlo_dev_ctx, 182 struct mlo_partner_info ml_parnter_info); 183 184 /** 185 * mlo_clear_connected_links: clear connected links bitmap 186 * @vdev: vdev object 187 * 188 * Return: none 189 */ 190 void mlo_clear_connected_links_bmap(struct wlan_objmgr_vdev *vdev); 191 192 /** 193 * API to have operation on ml vdevs 194 */ 195 typedef void (*mlo_vdev_op_handler)(struct wlan_objmgr_vdev *vdev, 196 void *arg); 197 198 /** 199 * mlo_iterate_connected_vdev_list: Iterate on connected ML links 200 * @vdev: vdev object 201 * @handler: the handler will be called for each object in ML list 202 * @arg: argument to be passed to handler 203 * 204 * Return: none 205 */ 206 static inline 207 void mlo_iterate_connected_vdev_list(struct wlan_objmgr_vdev *vdev, 208 mlo_vdev_op_handler handler, 209 void *arg) 210 { 211 struct wlan_mlo_dev_context *mlo_dev_ctx = vdev->mlo_dev_ctx; 212 struct wlan_mlo_sta *sta_ctx = NULL; 213 uint8_t i = 0; 214 215 if (!mlo_dev_ctx || !(wlan_vdev_mlme_is_mlo_vdev(vdev))) 216 return; 217 218 sta_ctx = mlo_dev_ctx->sta_ctx; 219 if (!sta_ctx) 220 return; 221 222 for (i = 0; i < WLAN_UMAC_MLO_MAX_VDEVS; i++) { 223 if (!mlo_dev_ctx->wlan_vdev_list[i]) 224 continue; 225 if (qdf_test_bit(i, sta_ctx->wlan_connected_links)) { 226 if (handler) 227 handler(mlo_dev_ctx->wlan_vdev_list[i], arg); 228 } 229 } 230 } 231 232 /** 233 * call_handler_for_standalone_ap: Iterate on all standalone ML vdevs in 234 * ML AP context and call handler only for standalone AP 235 * 236 * @vdev: vdev object 237 * @handler: the handler will be called for each object in ML list 238 * @arg: argument to be passed to handler 239 * 240 * Return: none 241 */ 242 static inline void 243 call_handler_for_standalone_ap(struct wlan_mlo_dev_context *ap_dev_ctx, 244 mlo_vdev_op_handler handler, void *arg) 245 { 246 struct wlan_objmgr_vdev *ml_ap_vdev = NULL; 247 int i; 248 249 for (i = 0; i < WLAN_UMAC_MLO_MAX_VDEVS; i++) { 250 /* For each vdev in ML AP context, check if its PDEV has any 251 * STA. If it doesn't, call the handler for that particular 252 * VDEV. 253 */ 254 if (!ap_dev_ctx->wlan_vdev_list[i]) 255 continue; 256 ml_ap_vdev = ap_dev_ctx->wlan_vdev_list[i]; 257 handler(ml_ap_vdev, arg); 258 } 259 } 260 261 /* 262 * mlo_iterate_ml_standalone_vdev_list: Iterate on all standalone ML vdevs in 263 * ML link 264 * 265 * @vdev: vdev object 266 * @handler: the handler will be called for each object in ML list 267 * @arg: argument to be passed to handler 268 * 269 * Return: none 270 */ 271 static inline 272 void mlo_iterate_ml_standalone_vdev_list(struct wlan_objmgr_vdev *vdev, 273 mlo_vdev_op_handler handler, 274 void *arg) 275 { 276 struct wlan_mlo_dev_context *mlo_dev_ctx = vdev->mlo_dev_ctx; 277 struct wlan_mlo_sta *sta_ctx = NULL; 278 uint8_t i = 0; 279 struct wlan_objmgr_pdev *pdev = NULL; 280 struct wlan_objmgr_vdev *vdev_temp = NULL; 281 struct wlan_mlo_dev_context *ap_ml_ctx; 282 qdf_list_t *vdev_list; 283 284 if (!mlo_dev_ctx || !(wlan_vdev_mlme_is_mlo_vdev(vdev)) || !handler) 285 return; 286 287 sta_ctx = mlo_dev_ctx->sta_ctx; 288 if (!sta_ctx) 289 return; 290 291 /* If repeater is configured as dependent WDS repeater, 292 * bring up/bring down all the standalone AP vaps in it once all 293 * the other AP vaps present in the AP ML context are up/down. 294 */ 295 296 for (i = 0; i < WLAN_UMAC_MLO_MAX_VDEVS; i++) { 297 if (!mlo_dev_ctx->wlan_vdev_list[i]) 298 continue; 299 300 pdev = wlan_vdev_get_pdev(mlo_dev_ctx->wlan_vdev_list[i]); 301 vdev_list = &pdev->pdev_objmgr.wlan_vdev_list; 302 vdev_temp = wlan_pdev_vdev_list_peek_head(vdev_list); 303 while (vdev_temp) { 304 // Get all VDEVs of the STA vap from its PDEV 305 if ((vdev_temp != vdev) && 306 wlan_vdev_mlme_get_opmode(vdev_temp) == 307 QDF_SAP_MODE) { 308 ap_ml_ctx = vdev_temp->mlo_dev_ctx; 309 if (!ap_ml_ctx) 310 return; 311 312 call_handler_for_standalone_ap(ap_ml_ctx, 313 handler, arg); 314 } 315 316 vdev_temp = wlan_vdev_get_next_vdev_of_pdev( 317 vdev_list, vdev_temp); 318 } 319 } 320 } 321 322 /** 323 * mlo_update_connect_req_links: update connect req links index 324 * @vdev: vdev object 325 * @value: set/clear the bit 326 * 327 * Return: none 328 */ 329 static inline void 330 mlo_update_connect_req_links(struct wlan_objmgr_vdev *vdev, uint8_t value) 331 { 332 struct wlan_mlo_dev_context *mlo_dev_ctx = vdev->mlo_dev_ctx; 333 struct wlan_mlo_sta *sta_ctx = NULL; 334 uint8_t i = 0; 335 336 if (!mlo_dev_ctx) 337 return; 338 339 sta_ctx = mlo_dev_ctx->sta_ctx; 340 if (!sta_ctx) 341 return; 342 343 for (i = 0; i < WLAN_UMAC_MLO_MAX_VDEVS; i++) { 344 if (!mlo_dev_ctx->wlan_vdev_list[i]) 345 continue; 346 347 if (vdev == mlo_dev_ctx->wlan_vdev_list[i]) { 348 if (value) 349 qdf_set_bit(i, sta_ctx->wlan_connect_req_links); 350 else 351 qdf_clear_bit( 352 i, sta_ctx->wlan_connect_req_links); 353 } 354 } 355 } 356 357 /** 358 * mlo_is_vdev_connect_req_link: API to check if vdev is in active connection 359 * @vdev: vdev object 360 * 361 * Return: true is vdev is participating in active connect else false 362 */ 363 static inline bool 364 mlo_is_vdev_connect_req_link(struct wlan_objmgr_vdev *vdev) 365 { 366 struct wlan_mlo_dev_context *mlo_dev_ctx = vdev->mlo_dev_ctx; 367 struct wlan_mlo_sta *sta_ctx = NULL; 368 369 if (!mlo_dev_ctx) 370 return false; 371 372 sta_ctx = mlo_dev_ctx->sta_ctx; 373 if (!sta_ctx) 374 return false; 375 376 if (qdf_test_bit( 377 mlo_get_link_vdev_ix(vdev->mlo_dev_ctx, vdev), 378 sta_ctx->wlan_connect_req_links)) 379 return true; 380 381 return false; 382 } 383 384 /** 385 * mlo_clear_connect_req_links: clear connect req links bitmap 386 * @vdev: vdev object 387 * 388 * Return: none 389 */ 390 static inline 391 void mlo_clear_connect_req_links_bmap(struct wlan_objmgr_vdev *vdev) 392 { 393 struct wlan_mlo_dev_context *mlo_dev_ctx = vdev->mlo_dev_ctx; 394 struct wlan_mlo_sta *sta_ctx = NULL; 395 396 if (!mlo_dev_ctx) 397 return; 398 399 sta_ctx = mlo_dev_ctx->sta_ctx; 400 if (!sta_ctx) 401 return; 402 403 qdf_mem_zero(sta_ctx->wlan_connect_req_links, 404 sizeof(sta_ctx->wlan_connect_req_links)); 405 } 406 407 /** 408 * mlo_update_connected_links: update connected links index 409 * @vdev: vdev object 410 * @value: set/clear the bit 411 * 412 * Return: none 413 */ 414 static inline void 415 mlo_update_connected_links(struct wlan_objmgr_vdev *vdev, uint8_t value) 416 { 417 struct wlan_mlo_dev_context *mlo_dev_ctx = vdev->mlo_dev_ctx; 418 struct wlan_mlo_sta *sta_ctx = NULL; 419 uint8_t i = 0; 420 421 if (!mlo_dev_ctx) 422 return; 423 424 sta_ctx = mlo_dev_ctx->sta_ctx; 425 if (!sta_ctx) 426 return; 427 428 for (i = 0; i < WLAN_UMAC_MLO_MAX_VDEVS; i++) { 429 if (!mlo_dev_ctx->wlan_vdev_list[i]) 430 continue; 431 432 if (vdev == mlo_dev_ctx->wlan_vdev_list[i]) { 433 if (value) 434 qdf_set_bit(i, sta_ctx->wlan_connected_links); 435 else 436 qdf_clear_bit(i, sta_ctx->wlan_connected_links); 437 } 438 } 439 } 440 441 #ifndef WLAN_FEATURE_11BE_MLO_ADV_FEATURE 442 /** 443 * mlo_get_ml_vdev_by_mac: get ml vdev from mac 444 * @vdev: vdev object 445 * @macaddr: mac of vdev to be returned 446 * 447 * Return: vdev object if found else NULL 448 */ 449 struct wlan_objmgr_vdev * 450 mlo_get_ml_vdev_by_mac(struct wlan_objmgr_vdev *vdev, 451 struct qdf_mac_addr *macaddr); 452 #endif 453 454 /** 455 * mlo_set_keys_saved: set mlo keys saved bool for vdev 456 * @vdev: vdev object 457 * @mac_address: peer mac address 458 * @value: bool true or false 459 * Return: none 460 */ 461 void mlo_set_keys_saved(struct wlan_objmgr_vdev *vdev, 462 struct qdf_mac_addr *mac_address, bool value); 463 464 /** 465 * mlo_get_keys_saved: get if mlo keys are saved for vdev 466 * @vdev: vdev object 467 * @mac_address: peer mac address 468 * Return: boolean value true or false 469 */ 470 bool mlo_get_keys_saved(struct wlan_objmgr_vdev *vdev, uint8_t *mac_address); 471 472 /** 473 * mlo_get_chan_freq_by_bssid - Get channel freq by bssid 474 * @pdev: pdev pointer 475 * @bssid: link mac address 476 * 477 * Return: chan frequency 478 */ 479 qdf_freq_t 480 mlo_get_chan_freq_by_bssid(struct wlan_objmgr_pdev *pdev, 481 struct qdf_mac_addr *bssid); 482 483 /** 484 * mlo_get_assoc_rsp - Get Assoc response from mlo manager 485 * @vdev: vdev obj mgr 486 * @assoc_rsp_frame: association response frame ptr 487 * 488 * Return: none 489 */ 490 void mlo_get_assoc_rsp(struct wlan_objmgr_vdev *vdev, 491 struct element_info *assoc_rsp_frame); 492 493 /** 494 * mlo_sta_save_quiet_status - save quiet status for given link of mlo station 495 * @mlo_dev_ctx: mlo context 496 * @link_id: link id 497 * @quiet_status: True if quiet starts. False if quiet stops. 498 * 499 * Return: QDF_STATUS 500 */ 501 QDF_STATUS mlo_sta_save_quiet_status(struct wlan_mlo_dev_context *mlo_dev_ctx, 502 uint8_t link_id, 503 bool quiet_status); 504 505 /** 506 * mlo_is_sta_in_quiet_status - is the link of given mlo sta is in quiet status 507 * @mlo_dev_ctx: mlo context 508 * @link_id: link id 509 * 510 * Return: true if the link of given mlo sta is in quiet status 511 */ 512 bool mlo_is_sta_in_quiet_status(struct wlan_mlo_dev_context *mlo_dev_ctx, 513 uint8_t link_id); 514 515 /** 516 * mlo_is_sta_inactivity_allowed_with_quiet() - Is link OK to force inactivity 517 * based on current quiet status 518 * of mlo connection 519 * @psoc: pointer to psoc 520 * @vdev_id_list: vdev id list 521 * @num_mlo: number of mlo vdev 522 * @mlo_idx: list of index of vdev_id_list if it is vdev id of mlo vdev 523 * @affected_links: number of links to be set inactivity 524 * @affected_list: list of vdev id to be set inactivity 525 * 526 * Return: true if any link not in mlo_vdev_list is not in quiet mode 527 */ 528 bool mlo_is_sta_inactivity_allowed_with_quiet(struct wlan_objmgr_psoc *psoc, 529 uint8_t *vdev_id_list, 530 uint8_t num_mlo, uint8_t *mlo_idx, 531 uint8_t affected_links, 532 uint8_t *affected_list); 533 534 /** 535 * mlo_is_sta_csa_synced - Is mlo sta csa parameters are synced or not 536 * @mlo_dev_ctx: mlo context 537 * @link_id: link id 538 * 539 * Return: true if mlo sta csa parameters of given link id is synced 540 */ 541 bool mlo_is_sta_csa_synced(struct wlan_mlo_dev_context *mlo_dev_ctx, 542 uint8_t link_id); 543 544 /** 545 * mlo_sta_csa_save_params - Save csa parameters for mlo station 546 * @mlo_dev_ctx: mlo context 547 * @link_id: link id 548 * @csa_param: csa parameters to be saved 549 * 550 * Return: QDF_STATUS 551 */ 552 QDF_STATUS mlo_sta_csa_save_params(struct wlan_mlo_dev_context *mlo_dev_ctx, 553 uint8_t link_id, 554 struct csa_offload_params *csa_param); 555 556 /** 557 * mlo_sta_up_active_notify - mlo sta up active notify 558 * @vdev: vdev obj mgr 559 * 560 * Return: QDF_STATUS 561 */ 562 QDF_STATUS mlo_sta_up_active_notify(struct wlan_objmgr_vdev *vdev); 563 564 /** 565 * mlo_is_sta_csa_param_handled - Is given csa_param handled or not 566 * @vdev: vdev obj mgr 567 * @csa_param: csa parameters to be checked 568 * 569 * Return: true if given csa parameters is handled 570 */ 571 bool mlo_is_sta_csa_param_handled(struct wlan_objmgr_vdev *vdev, 572 struct csa_offload_params *csa_param); 573 574 /** 575 * mlo_internal_disconnect_links - Internal disconnect for connection manager 576 * @vdev: vdev obj mgr 577 * 578 * Return: none 579 */ 580 void mlo_internal_disconnect_links(struct wlan_objmgr_vdev *vdev); 581 582 /** 583 * mlo_sta_get_vdev_list() - get mlo vdev list 584 * @vdev: vdev pointer 585 * @vdev_count: vdev count 586 * @wlan_vdev_list: vdev list 587 * 588 * Return: None 589 */ 590 void mlo_sta_get_vdev_list(struct wlan_objmgr_vdev *vdev, uint16_t *vdev_count, 591 struct wlan_objmgr_vdev **wlan_vdev_list); 592 593 /** 594 * mlo_process_ml_reconfig_ie() - process ml reconfig ie for vdev 595 * @vdev: vdev pointer 596 * @scan_entry: RootAP scan entry 597 * @ml_ie: Pointer to ML IE 598 * @ml_ie_len: Length of ML IE 599 * @partner_info: Cached partner info 600 * 601 * Return: None 602 */ 603 void mlo_process_ml_reconfig_ie(struct wlan_objmgr_vdev *vdev, 604 struct scan_cache_entry *scan_entry, 605 uint8_t *ml_ie, qdf_size_t ml_ie_len, 606 struct mlo_partner_info *partner_info); 607 /** 608 * mlo_allocate_and_copy_ies() - allocate and copy ies 609 * @target: target connect req pointer 610 * @source: source connect req pointer 611 * 612 * Return: None 613 */ 614 void 615 mlo_allocate_and_copy_ies(struct wlan_cm_connect_req *target, 616 struct wlan_cm_connect_req *source); 617 618 /** 619 * mlo_free_connect_ies() - free connect ies 620 * @connect_req: connect req pointer 621 * 622 * Return: None 623 */ 624 void 625 mlo_free_connect_ies(struct wlan_cm_connect_req *connect_req); 626 #else 627 static inline 628 QDF_STATUS mlo_connect(struct wlan_objmgr_vdev *vdev, 629 struct wlan_cm_connect_req *req) 630 { 631 return wlan_cm_start_connect(vdev, req); 632 } 633 634 static inline 635 void mlo_sta_link_connect_notify(struct wlan_objmgr_vdev *vdev, 636 struct wlan_cm_connect_resp *rsp) 637 { } 638 639 static inline 640 QDF_STATUS mlo_disconnect(struct wlan_objmgr_vdev *vdev, 641 enum wlan_cm_source source, 642 enum wlan_reason_code reason_code, 643 struct qdf_mac_addr *bssid) 644 { 645 QDF_STATUS status; 646 647 status = wlan_cm_disconnect(vdev, source, 648 reason_code, 649 bssid); 650 return status; 651 } 652 653 static inline 654 QDF_STATUS mlo_sync_disconnect(struct wlan_objmgr_vdev *vdev, 655 enum wlan_cm_source source, 656 enum wlan_reason_code reason_code, 657 struct qdf_mac_addr *bssid) 658 { 659 return wlan_cm_disconnect_sync(vdev, CM_OSIF_DISCONNECT, 660 reason_code); 661 } 662 663 static inline 664 void mlo_sta_link_disconn_notify(struct wlan_objmgr_vdev *vdev, 665 struct wlan_cm_discon_rsp *resp) 666 { } 667 668 #ifndef WLAN_FEATURE_11BE_MLO_ADV_FEATURE 669 static inline 670 bool ucfg_mlo_is_mld_connected(struct wlan_objmgr_vdev *vdev) 671 { 672 return true; 673 } 674 675 static inline 676 bool ucfg_mlo_is_mld_disconnected(struct wlan_objmgr_vdev *vdev) 677 { 678 return true; 679 } 680 #endif 681 682 static inline 683 bool mlo_is_mld_disconnecting_connecting(struct wlan_objmgr_vdev *vdev) 684 { 685 return false; 686 } 687 688 static inline 689 bool mlo_is_mld_sta(struct wlan_objmgr_vdev *vdev) 690 { 691 return false; 692 } 693 694 static inline 695 struct wlan_objmgr_vdev * 696 ucfg_mlo_get_assoc_link_vdev(struct wlan_objmgr_vdev *vdev) 697 { 698 return vdev; 699 } 700 701 static inline void 702 mlo_update_connect_req_links(struct wlan_objmgr_vdev *vdev, uint8_t value) 703 { } 704 705 static inline void 706 mlo_update_connected_links_bmap(struct wlan_mlo_dev_context *mlo_dev_ctx, 707 struct mlo_partner_info ml_parnter_info) 708 { } 709 710 static inline bool 711 mlo_is_vdev_connect_req_link(struct wlan_objmgr_vdev *vdev) 712 { 713 return true; 714 } 715 716 static inline void 717 mlo_update_connected_links(struct wlan_objmgr_vdev *vdev, uint8_t value) 718 { } 719 720 static inline void 721 mlo_clear_connect_req_links_bmap(struct wlan_objmgr_vdev *vdev) 722 { } 723 724 static inline void 725 mlo_clear_connected_links_bmap(struct wlan_objmgr_vdev *vdev) 726 { } 727 728 static inline struct wlan_objmgr_vdev * 729 mlo_get_ml_vdev_by_mac(struct wlan_objmgr_vdev *vdev, 730 struct qdf_mac_addr *macaddr) 731 { 732 return vdev; 733 } 734 735 static inline qdf_freq_t 736 mlo_get_chan_freq_by_bssid(struct wlan_objmgr_pdev *pdev, 737 struct qdf_mac_addr *bssid) 738 { 739 return 0; 740 } 741 742 static inline void 743 mlo_get_assoc_rsp(struct wlan_objmgr_vdev *vdev, 744 struct element_info *assoc_rsp_frame) 745 { 746 } 747 748 static inline bool 749 mlo_is_sta_csa_param_handled(struct wlan_objmgr_vdev *vdev, 750 struct csa_offload_params *csa_param) 751 { 752 return false; 753 } 754 755 static inline void mlo_internal_disconnect_links(struct wlan_objmgr_vdev *vdev) 756 { 757 } 758 759 static inline 760 void mlo_sta_get_vdev_list(struct wlan_objmgr_vdev *vdev, 761 uint16_t *vdev_count, 762 struct wlan_objmgr_vdev **wlan_vdev_list) 763 { 764 } 765 766 static inline 767 void mlo_set_keys_saved(struct wlan_objmgr_vdev *vdev, 768 struct qdf_mac_addr *mac_address, bool value) 769 { 770 } 771 772 static inline 773 bool mlo_get_keys_saved(struct wlan_objmgr_vdev *vdev, 774 uint8_t *mac_address) 775 { 776 return false; 777 } 778 779 static inline 780 void mlo_process_ml_reconfig_ie(struct wlan_objmgr_vdev *vdev, 781 struct scan_cache_entry *scan_entry, 782 uint8_t *ml_ie, qdf_size_t ml_ie_len, 783 struct mlo_partner_info *partner_info) 784 { } 785 #endif 786 #endif 787