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