1 /* 2 * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved. 3 * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for 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 * DOC: define internal APIs related to the mlme component, legacy APIs are 21 * called for the time being, but will be cleaned up after convergence 22 */ 23 #include "wlan_mlme_main.h" 24 #include "wlan_mlme_vdev_mgr_interface.h" 25 #include "lim_utils.h" 26 #include "wma_api.h" 27 #include "wma.h" 28 #include "lim_types.h" 29 #include <include/wlan_mlme_cmn.h> 30 #include <../../core/src/vdev_mgr_ops.h> 31 #include "wlan_psoc_mlme_api.h" 32 #include "target_if_cm_roam_offload.h" 33 #include "wlan_crypto_global_api.h" 34 #include "target_if_wfa_testcmd.h" 35 #include <../../core/src/wlan_cm_vdev_api.h> 36 #include "csr_api.h" 37 #include <cm_utf.h> 38 #include "target_if_cm_roam_event.h" 39 #include "wlan_cm_roam_api.h" 40 #include "wifi_pos_api.h" 41 #ifdef WLAN_FEATURE_11BE_MLO 42 #include <wlan_mlo_mgr_public_structs.h> 43 #include <wlan_mlo_mgr_cmn.h> 44 #include <lim_mlo.h> 45 #include "wlan_mlo_mgr_sta.h" 46 #endif 47 #include <wlan_lmac_if_def.h> 48 #include "target_if_mlme.h" 49 #include "wlan_mlo_mgr_sta.h" 50 #include "wlan_cp_stats_mc_tgt_api.h" 51 #include "wlan_objmgr_pdev_obj.h" 52 53 static struct vdev_mlme_ops sta_mlme_ops; 54 static struct vdev_mlme_ops ap_mlme_ops; 55 static struct vdev_mlme_ops mon_mlme_ops; 56 static struct mlme_ext_ops ext_ops; 57 #ifdef WLAN_FEATURE_11BE_MLO 58 static struct mlo_mlme_ext_ops mlo_ext_ops; 59 #endif 60 mlme_is_vdev_in_beaconning_mode(enum QDF_OPMODE vdev_opmode)61 bool mlme_is_vdev_in_beaconning_mode(enum QDF_OPMODE vdev_opmode) 62 { 63 switch (vdev_opmode) { 64 case QDF_SAP_MODE: 65 case QDF_P2P_GO_MODE: 66 case QDF_IBSS_MODE: 67 case QDF_NDI_MODE: 68 return true; 69 default: 70 return false; 71 } 72 } 73 74 /** 75 * mlme_get_global_ops() - Register ext global ops 76 * 77 * Return: ext_ops global ops 78 */ mlme_get_global_ops(void)79 static struct mlme_ext_ops *mlme_get_global_ops(void) 80 { 81 return &ext_ops; 82 } 83 mlme_register_mlme_ext_ops(void)84 QDF_STATUS mlme_register_mlme_ext_ops(void) 85 { 86 mlme_set_ops_register_cb(mlme_get_global_ops); 87 88 /* Overwrite with UTF cb if UTF enabled */ 89 cm_utf_set_mlme_ops(mlme_get_global_ops()); 90 return QDF_STATUS_SUCCESS; 91 } 92 93 #ifdef WLAN_FEATURE_11BE_MLO mlme_register_mlo_ext_ops(void)94 QDF_STATUS mlme_register_mlo_ext_ops(void) 95 { 96 QDF_STATUS status; 97 struct mlo_mgr_context *mlo_ctx = wlan_objmgr_get_mlo_ctx(); 98 99 if (!mlo_ctx) 100 return QDF_STATUS_E_FAILURE; 101 102 mlo_reg_mlme_ext_cb(mlo_ctx, &mlo_ext_ops); 103 104 status = mlo_mgr_register_link_switch_notifier(WLAN_UMAC_COMP_MLME, 105 wlan_cm_link_switch_notif_cb); 106 if (status == QDF_STATUS_E_NOSUPPORT) { 107 status = QDF_STATUS_SUCCESS; 108 mlme_debug("Link switch not supported"); 109 } else if (QDF_IS_STATUS_ERROR(status)) { 110 mlme_err("Failed to register link switch notifier for mlme!"); 111 } 112 113 return status; 114 } 115 mlme_unregister_mlo_ext_ops(void)116 QDF_STATUS mlme_unregister_mlo_ext_ops(void) 117 { 118 struct mlo_mgr_context *mlo_ctx = wlan_objmgr_get_mlo_ctx(); 119 120 if (mlo_ctx) 121 mlo_unreg_mlme_ext_cb(mlo_ctx); 122 123 return QDF_STATUS_SUCCESS; 124 } 125 #else mlme_register_mlo_ext_ops(void)126 QDF_STATUS mlme_register_mlo_ext_ops(void) 127 { 128 return QDF_STATUS_SUCCESS; 129 } 130 mlme_unregister_mlo_ext_ops(void)131 QDF_STATUS mlme_unregister_mlo_ext_ops(void) 132 { 133 return QDF_STATUS_SUCCESS; 134 } 135 #endif 136 /** 137 * mlme_register_vdev_mgr_ops() - Register vdev mgr ops 138 * @vdev_mlme: vdev mlme object 139 * 140 * This function is called to register vdev manager operations 141 * 142 * Return: QDF_STATUS 143 */ mlme_register_vdev_mgr_ops(struct vdev_mlme_obj * vdev_mlme)144 QDF_STATUS mlme_register_vdev_mgr_ops(struct vdev_mlme_obj *vdev_mlme) 145 { 146 struct wlan_objmgr_vdev *vdev; 147 148 vdev = vdev_mlme->vdev; 149 150 if (mlme_is_vdev_in_beaconning_mode(vdev->vdev_mlme.vdev_opmode)) 151 vdev_mlme->ops = &ap_mlme_ops; 152 else if (vdev->vdev_mlme.vdev_opmode == QDF_MONITOR_MODE) 153 vdev_mlme->ops = &mon_mlme_ops; 154 else 155 vdev_mlme->ops = &sta_mlme_ops; 156 157 return QDF_STATUS_SUCCESS; 158 } 159 160 /** 161 * mlme_unregister_vdev_mgr_ops() - Unregister vdev mgr ops 162 * @vdev_mlme: vdev mlme object 163 * 164 * This function is called to unregister vdev manager operations 165 * 166 * Return: QDF_STATUS 167 */ mlme_unregister_vdev_mgr_ops(struct vdev_mlme_obj * vdev_mlme)168 QDF_STATUS mlme_unregister_vdev_mgr_ops(struct vdev_mlme_obj *vdev_mlme) 169 { 170 return QDF_STATUS_SUCCESS; 171 } 172 173 /** 174 * sta_mlme_vdev_start_send() - MLME vdev start callback 175 * @vdev_mlme: vdev mlme object 176 * @event_data_len: event data length 177 * @event_data: event data 178 * 179 * This function is called to initiate actions of VDEV.start 180 * 181 * Return: QDF_STATUS 182 */ sta_mlme_vdev_start_send(struct vdev_mlme_obj * vdev_mlme,uint16_t event_data_len,void * event_data)183 static QDF_STATUS sta_mlme_vdev_start_send(struct vdev_mlme_obj *vdev_mlme, 184 uint16_t event_data_len, 185 void *event_data) 186 { 187 mlme_legacy_debug("vdev id = %d ", 188 vdev_mlme->vdev->vdev_objmgr.vdev_id); 189 return lim_sta_mlme_vdev_start_send(vdev_mlme, event_data_len, 190 event_data); 191 } 192 193 /** 194 * sta_mlme_start_continue() - vdev start rsp callback 195 * @vdev_mlme: vdev mlme object 196 * @data_len: event data length 197 * @data: event data 198 * 199 * This function is called to handle the VDEV START/RESTART callback 200 * 201 * Return: QDF_STATUS 202 */ sta_mlme_start_continue(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)203 static QDF_STATUS sta_mlme_start_continue(struct vdev_mlme_obj *vdev_mlme, 204 uint16_t data_len, void *data) 205 { 206 mlme_legacy_debug("vdev id = %d ", 207 vdev_mlme->vdev->vdev_objmgr.vdev_id); 208 return wma_sta_mlme_vdev_start_continue(vdev_mlme, data_len, data); 209 } 210 211 /** 212 * sta_mlme_vdev_restart_send() - MLME vdev restart send 213 * @vdev_mlme: vdev mlme object 214 * @event_data_len: event data length 215 * @event_data: event data 216 * 217 * This function is called to initiate actions of VDEV.start 218 * 219 * Return: QDF_STATUS 220 */ sta_mlme_vdev_restart_send(struct vdev_mlme_obj * vdev_mlme,uint16_t event_data_len,void * event_data)221 static QDF_STATUS sta_mlme_vdev_restart_send(struct vdev_mlme_obj *vdev_mlme, 222 uint16_t event_data_len, 223 void *event_data) 224 { 225 mlme_legacy_debug("vdev id = %d ", 226 vdev_mlme->vdev->vdev_objmgr.vdev_id); 227 return lim_sta_mlme_vdev_restart_send(vdev_mlme, event_data_len, 228 event_data); 229 } 230 231 /** 232 * sta_mlme_vdev_start_req_failed() - MLME start fail callback 233 * @vdev_mlme: vdev mlme object 234 * @data_len: event data length 235 * @data: event data 236 * 237 * This function is called to send the vdev stop to firmware 238 * 239 * Return: QDF_STATUS 240 */ sta_mlme_vdev_start_req_failed(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)241 static QDF_STATUS sta_mlme_vdev_start_req_failed(struct vdev_mlme_obj *vdev_mlme, 242 uint16_t data_len, 243 void *data) 244 { 245 mlme_legacy_debug("vdev id = %d ", 246 vdev_mlme->vdev->vdev_objmgr.vdev_id); 247 return lim_sta_mlme_vdev_req_fail(vdev_mlme, data_len, data); 248 } 249 250 /** 251 * sta_mlme_vdev_start_connection() - MLME vdev start callback 252 * @vdev_mlme: vdev mlme object 253 * @event_data_len: event data length 254 * @event_data: event data 255 * 256 * This function is called to initiate actions of STA connection 257 * 258 * Return: QDF_STATUS 259 */ sta_mlme_vdev_start_connection(struct vdev_mlme_obj * vdev_mlme,uint16_t event_data_len,void * event_data)260 static QDF_STATUS sta_mlme_vdev_start_connection(struct vdev_mlme_obj *vdev_mlme, 261 uint16_t event_data_len, 262 void *event_data) 263 { 264 mlme_legacy_debug("vdev id = %d ", 265 vdev_mlme->vdev->vdev_objmgr.vdev_id); 266 return QDF_STATUS_SUCCESS; 267 } 268 269 #if defined WLAN_FEATURE_SR mlme_sr_is_enable(struct wlan_objmgr_vdev * vdev)270 int mlme_sr_is_enable(struct wlan_objmgr_vdev *vdev) 271 { 272 uint8_t sr_ctrl; 273 274 sr_ctrl = wlan_vdev_mlme_get_sr_ctrl(vdev); 275 return (!sr_ctrl || !(sr_ctrl & NON_SRG_PD_SR_DISALLOWED) || 276 (sr_ctrl & SRG_INFO_PRESENT)); 277 } 278 279 /** 280 * mlme_sr_handle_conc(): Handle concurrency scenario i.e Single MAC 281 * concurrency is not supoprted for SR, Disable SR if it is enable on other 282 * VDEV and enable it back once the once the concurrent vdev is down. 283 * 284 * @vdev: object manager vdev 285 * @conc_vdev: cuncurrent vdev object 286 * @en_sr_curr_vdev: indicates spatial reuse enable/disable 287 * 288 */ 289 static void mlme_sr_handle_conc(struct wlan_objmgr_vdev * vdev,struct wlan_objmgr_vdev * conc_vdev,bool en_sr_curr_vdev)290 mlme_sr_handle_conc(struct wlan_objmgr_vdev *vdev, 291 struct wlan_objmgr_vdev *conc_vdev, bool en_sr_curr_vdev) 292 { 293 uint32_t val = 0; 294 struct wlan_objmgr_pdev *pdev; 295 struct wlan_objmgr_psoc *psoc; 296 struct wlan_lmac_if_tx_ops *tx_ops; 297 struct wlan_lmac_if_spatial_reuse_tx_ops *sr_tx_ops; 298 uint8_t conc_vdev_id = wlan_vdev_get_id(conc_vdev); 299 300 pdev = wlan_vdev_get_pdev(vdev); 301 if (!pdev) { 302 mlme_err("pdev is NULL"); 303 return; 304 } 305 306 psoc = wlan_vdev_get_psoc(vdev); 307 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 308 if (!tx_ops) { 309 mlme_err("tx_ops is NULL"); 310 return; 311 } 312 313 sr_tx_ops = &tx_ops->spatial_reuse_tx_ops; 314 if (en_sr_curr_vdev) { 315 wlan_vdev_mlme_set_sr_disable_due_conc(vdev, true); 316 wlan_vdev_mlme_set_sr_disable_due_conc(conc_vdev, true); 317 318 if (!wlan_vdev_mlme_get_he_spr_enabled(conc_vdev)) 319 return; 320 321 if (mlme_sr_is_enable(conc_vdev)) { 322 if (sr_tx_ops->target_if_sr_update) 323 sr_tx_ops->target_if_sr_update 324 (pdev, conc_vdev_id, val); 325 326 wlan_spatial_reuse_osif_event(conc_vdev, 327 SR_OPERATION_SUSPEND, 328 SR_REASON_CODE_CONCURRENCY); 329 } 330 } else if (wlan_vdev_mlme_is_sr_disable_due_conc(conc_vdev)) { 331 wlan_vdev_mlme_set_sr_disable_due_conc(conc_vdev, false); 332 333 if (!wlan_vdev_mlme_get_he_spr_enabled(conc_vdev)) 334 return; 335 336 if (mlme_sr_is_enable(conc_vdev)) { 337 wlan_mlme_update_sr_data(conc_vdev, &val, 0, 0, true); 338 339 if (sr_tx_ops->target_if_sr_update) 340 sr_tx_ops->target_if_sr_update 341 (pdev, conc_vdev_id, val); 342 343 wlan_spatial_reuse_osif_event(conc_vdev, 344 SR_OPERATION_RESUME, 345 SR_REASON_CODE_CONCURRENCY); 346 } else { 347 mlme_debug("SR Disabled in SR Control"); 348 } 349 } 350 } 351 mlme_sr_update(struct wlan_objmgr_vdev * vdev,bool enable)352 void mlme_sr_update(struct wlan_objmgr_vdev *vdev, bool enable) 353 { 354 struct wlan_objmgr_vdev *conc_vdev; 355 struct wlan_objmgr_psoc *psoc; 356 struct wlan_objmgr_pdev *pdev; 357 struct wlan_lmac_if_tx_ops *tx_ops; 358 uint32_t conc_vdev_id; 359 uint32_t val = 0; 360 uint8_t vdev_id; 361 uint8_t mac_id; 362 363 if (!vdev) { 364 mlme_err("vdev is NULL"); 365 return; 366 } 367 vdev_id = wlan_vdev_get_id(vdev); 368 369 pdev = wlan_vdev_get_pdev(vdev); 370 if (!pdev) { 371 mlme_err("pdev is NULL"); 372 return; 373 } 374 375 psoc = wlan_vdev_get_psoc(vdev); 376 if (!psoc) { 377 mlme_err("psoc is NULL"); 378 return; 379 } 380 381 policy_mgr_get_mac_id_by_session_id(psoc, vdev_id, &mac_id); 382 conc_vdev_id = policy_mgr_get_conc_vdev_on_same_mac(psoc, vdev_id, 383 mac_id); 384 if (conc_vdev_id != WLAN_INVALID_VDEV_ID && 385 !policy_mgr_sr_same_mac_conc_enabled(psoc)) { 386 /* 387 * Single MAC concurrency is not supoprted for SR, 388 * Disable SR if it is enable on other VDEV and enable 389 * it back once the once the concurrent vdev is down. 390 */ 391 mlme_debug("SR with concurrency is not allowed"); 392 conc_vdev = 393 wlan_objmgr_get_vdev_by_id_from_psoc(psoc, conc_vdev_id, 394 WLAN_MLME_SB_ID); 395 if (!conc_vdev) { 396 mlme_err("Can't get vdev by vdev_id:%d", conc_vdev_id); 397 } else { 398 mlme_sr_handle_conc(vdev, conc_vdev, enable); 399 wlan_objmgr_vdev_release_ref(conc_vdev, 400 WLAN_MLME_SB_ID); 401 goto err; 402 } 403 } 404 405 if (!wlan_vdev_mlme_get_he_spr_enabled(vdev)) { 406 mlme_err("Spatial Reuse disabled for vdev_id: %d", vdev_id); 407 goto err; 408 } 409 410 if (mlme_sr_is_enable(vdev)) { 411 if (enable) { 412 wlan_mlme_update_sr_data(vdev, &val, 0, 0, true); 413 } else { 414 /* VDEV down, disable SR */ 415 wlan_vdev_mlme_set_he_spr_enabled(vdev, false); 416 wlan_vdev_mlme_set_sr_ctrl(vdev, 0); 417 wlan_vdev_mlme_set_non_srg_pd_offset(vdev, 0); 418 } 419 420 mlme_debug("SR param val: %x, Enable: %x", val, enable); 421 422 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 423 if (tx_ops && tx_ops->spatial_reuse_tx_ops.target_if_sr_update) 424 tx_ops->spatial_reuse_tx_ops.target_if_sr_update 425 (pdev, vdev_id, val); 426 } else { 427 mlme_debug("Spatial reuse is disabled in SR control"); 428 } 429 err: 430 return; 431 } 432 #endif 433 434 /** 435 * sta_mlme_vdev_up_send() - MLME vdev UP callback 436 * @vdev_mlme: vdev mlme object 437 * @event_data_len: event data length 438 * @event_data: event data 439 * 440 * This function is called to send the vdev up command 441 * 442 * Return: QDF_STATUS 443 */ sta_mlme_vdev_up_send(struct vdev_mlme_obj * vdev_mlme,uint16_t event_data_len,void * event_data)444 static QDF_STATUS sta_mlme_vdev_up_send(struct vdev_mlme_obj *vdev_mlme, 445 uint16_t event_data_len, 446 void *event_data) 447 { 448 QDF_STATUS status; 449 450 mlme_legacy_debug("vdev id = %d ", 451 vdev_mlme->vdev->vdev_objmgr.vdev_id); 452 status = wma_sta_vdev_up_send(vdev_mlme, event_data_len, event_data); 453 454 if (QDF_IS_STATUS_SUCCESS(status)) 455 mlme_sr_update(vdev_mlme->vdev, true); 456 457 return status; 458 } 459 460 /** 461 * sta_mlme_vdev_notify_up_complete() - MLME vdev UP complete callback 462 * @vdev_mlme: vdev mlme object 463 * @event_data_len: event data length 464 * @event_data: event data 465 * 466 * This function is called to VDEV MLME on moving 467 * to UP state 468 * 469 * Return: QDF_STATUS 470 */ sta_mlme_vdev_notify_up_complete(struct vdev_mlme_obj * vdev_mlme,uint16_t event_data_len,void * event_data)471 static QDF_STATUS sta_mlme_vdev_notify_up_complete(struct vdev_mlme_obj *vdev_mlme, 472 uint16_t event_data_len, 473 void *event_data) 474 { 475 mlme_legacy_debug("vdev id = %d ", 476 vdev_mlme->vdev->vdev_objmgr.vdev_id); 477 return QDF_STATUS_SUCCESS; 478 } 479 480 /** 481 * sta_mlme_vdev_notify_roam_start() - MLME vdev Roam start callback 482 * @vdev_mlme: vdev mlme object 483 * @event_data_len: event data length 484 * @event_data: event data 485 * 486 * This function is called to VDEV MLME on roaming 487 * to UP state 488 * 489 * Return: QDF_STATUS 490 */ 491 static sta_mlme_vdev_notify_roam_start(struct vdev_mlme_obj * vdev_mlme,uint16_t event_data_len,void * event_data)492 QDF_STATUS sta_mlme_vdev_notify_roam_start(struct vdev_mlme_obj *vdev_mlme, 493 uint16_t event_data_len, 494 void *event_data) 495 { 496 mlme_legacy_debug("vdev id = %d ", 497 vdev_mlme->vdev->vdev_objmgr.vdev_id); 498 return wlan_cm_sta_mlme_vdev_roam_notify(vdev_mlme, event_data_len, 499 event_data); 500 } 501 502 /** 503 * sta_mlme_vdev_disconnect_bss() - MLME vdev disconnect bss callback 504 * @vdev_mlme: vdev mlme object 505 * @event_data_len: event data length 506 * @event_data: event data 507 * @is_disconnect_legacy_only: flag to indicate legacy disconnect 508 * 509 * This function is called to disconnect BSS/send deauth to AP 510 * 511 * Return: QDF_STATUS 512 */ sta_mlme_vdev_disconnect_bss(struct vdev_mlme_obj * vdev_mlme,uint16_t event_data_len,void * event_data,bool is_disconnect_legacy_only)513 static QDF_STATUS sta_mlme_vdev_disconnect_bss(struct vdev_mlme_obj *vdev_mlme, 514 uint16_t event_data_len, 515 void *event_data, 516 bool is_disconnect_legacy_only) 517 { 518 mlme_legacy_debug("vdev id = %d ", 519 vdev_mlme->vdev->vdev_objmgr.vdev_id); 520 return lim_sta_mlme_vdev_disconnect_bss(vdev_mlme, event_data_len, 521 event_data); 522 } 523 524 /** 525 * sta_mlme_vdev_stop_send() - MLME vdev stop send callback 526 * @vdev_mlme: vdev mlme object 527 * @data_len: event data length 528 * @data: event data 529 * 530 * This function is called to send the vdev stop to firmware 531 * 532 * Return: QDF_STATUS 533 */ sta_mlme_vdev_stop_send(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)534 static QDF_STATUS sta_mlme_vdev_stop_send(struct vdev_mlme_obj *vdev_mlme, 535 uint16_t data_len, 536 void *data) 537 { 538 mlme_legacy_debug("vdev id = %d ", 539 vdev_mlme->vdev->vdev_objmgr.vdev_id); 540 return lim_sta_mlme_vdev_stop_send(vdev_mlme, data_len, data); 541 } 542 543 /** 544 * sta_mlme_vdev_sta_disconnect_start() - MLME vdev disconnect send callback 545 * @vdev_mlme: vdev mlme object 546 * @data_len: event data length 547 * @data: event data 548 * 549 * This function is called to trigger the vdev stop to firmware when 550 * reassoc failure 551 * 552 * Return: QDF_STATUS 553 */ 554 static QDF_STATUS sta_mlme_vdev_sta_disconnect_start(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)555 sta_mlme_vdev_sta_disconnect_start(struct vdev_mlme_obj *vdev_mlme, 556 uint16_t data_len, void *data) 557 { 558 mlme_legacy_debug("vdev id = %d ", 559 vdev_mlme->vdev->vdev_objmgr.vdev_id); 560 return lim_sta_mlme_vdev_sta_disconnect_start(vdev_mlme, data_len, 561 data); 562 } 563 564 /** 565 * vdevmgr_mlme_stop_continue() - MLME vdev stop send callback 566 * @vdev_mlme: vdev mlme object 567 * @data_len: event data length 568 * @data: event data 569 * 570 * This function is called to initiate operations on 571 * LMAC/FW stop response such as remove peer. 572 * 573 * Return: QDF_STATUS 574 */ vdevmgr_mlme_stop_continue(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)575 static QDF_STATUS vdevmgr_mlme_stop_continue(struct vdev_mlme_obj *vdev_mlme, 576 uint16_t data_len, 577 void *data) 578 { 579 mlme_legacy_debug("vdev id = %d ", 580 vdev_mlme->vdev->vdev_objmgr.vdev_id); 581 return wma_mlme_vdev_stop_continue(vdev_mlme, data_len, data); 582 } 583 584 /** 585 * ap_mlme_vdev_start_send () - send vdev start req 586 * @vdev_mlme: vdev mlme object 587 * @data_len: event data length 588 * @data: event data 589 * 590 * This function is called to initiate actions of VDEV start ie start bss 591 * 592 * Return: QDF_STATUS 593 */ ap_mlme_vdev_start_send(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)594 static QDF_STATUS ap_mlme_vdev_start_send(struct vdev_mlme_obj *vdev_mlme, 595 uint16_t data_len, void *data) 596 { 597 mlme_legacy_debug("vdev id = %d ", 598 vdev_mlme->vdev->vdev_objmgr.vdev_id); 599 return lim_ap_mlme_vdev_start_send(vdev_mlme, data_len, data); 600 } 601 602 /** 603 * ap_mlme_start_continue () - vdev start rsp callback 604 * @vdev_mlme: vdev mlme object 605 * @data_len: event data length 606 * @data: event data 607 * 608 * This function is called to handle the VDEV START/RESTART callback 609 * 610 * Return: QDF_STATUS 611 */ ap_mlme_start_continue(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)612 static QDF_STATUS ap_mlme_start_continue(struct vdev_mlme_obj *vdev_mlme, 613 uint16_t data_len, void *data) 614 { 615 mlme_legacy_debug("vdev id = %d ", 616 vdev_mlme->vdev->vdev_objmgr.vdev_id); 617 mlme_set_notify_co_located_ap_update_rnr(vdev_mlme->vdev, true); 618 619 return wma_ap_mlme_vdev_start_continue(vdev_mlme, data_len, data); 620 } 621 622 /** 623 * ap_mlme_vdev_update_beacon() - callback to initiate beacon update 624 * @vdev_mlme: vdev mlme object 625 * @op: beacon operation 626 * @data_len: event data length 627 * @data: event data 628 * 629 * This function is called to update beacon 630 * 631 * Return: QDF_STATUS 632 */ ap_mlme_vdev_update_beacon(struct vdev_mlme_obj * vdev_mlme,enum beacon_update_op op,uint16_t data_len,void * data)633 static QDF_STATUS ap_mlme_vdev_update_beacon(struct vdev_mlme_obj *vdev_mlme, 634 enum beacon_update_op op, 635 uint16_t data_len, void *data) 636 { 637 mlme_legacy_debug("vdev id = %d ", 638 vdev_mlme->vdev->vdev_objmgr.vdev_id); 639 return lim_ap_mlme_vdev_update_beacon(vdev_mlme, op, data_len, data); 640 } 641 642 /** 643 * ap_mlme_vdev_up_send() - callback to send vdev up 644 * @vdev_mlme: vdev mlme object 645 * @data_len: event data length 646 * @data: event data 647 * 648 * This function is called to send vdev up req 649 * 650 * Return: QDF_STATUS 651 */ ap_mlme_vdev_up_send(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)652 static QDF_STATUS ap_mlme_vdev_up_send(struct vdev_mlme_obj *vdev_mlme, 653 uint16_t data_len, void *data) 654 { 655 mlme_legacy_debug("vdev id = %d ", 656 vdev_mlme->vdev->vdev_objmgr.vdev_id); 657 return lim_ap_mlme_vdev_up_send(vdev_mlme, data_len, data); 658 } 659 660 #ifdef WLAN_FEATURE_11BE_MLO wlan_handle_emlsr_sta_concurrency(struct wlan_objmgr_psoc * psoc,bool conc_con_coming_up,bool emlsr_sta_coming_up)661 void wlan_handle_emlsr_sta_concurrency(struct wlan_objmgr_psoc *psoc, 662 bool conc_con_coming_up, 663 bool emlsr_sta_coming_up) 664 { 665 policy_mgr_handle_emlsr_sta_concurrency(psoc, conc_con_coming_up, 666 emlsr_sta_coming_up); 667 } 668 #endif 669 670 /** 671 * ap_mlme_vdev_notify_up_complete() - callback to notify up completion 672 * @vdev_mlme: vdev mlme object 673 * @data_len: event data length 674 * @data: event data 675 * 676 * This function is called to indicate up is completed 677 * 678 * Return: QDF_STATUS 679 */ 680 static QDF_STATUS ap_mlme_vdev_notify_up_complete(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)681 ap_mlme_vdev_notify_up_complete(struct vdev_mlme_obj *vdev_mlme, 682 uint16_t data_len, void *data) 683 { 684 if (!vdev_mlme) { 685 mlme_legacy_err("data is NULL"); 686 return QDF_STATUS_E_INVAL; 687 } 688 689 pe_debug("Vdev %d is up", wlan_vdev_get_id(vdev_mlme->vdev)); 690 691 return QDF_STATUS_SUCCESS; 692 } 693 694 /** 695 * ap_mlme_vdev_disconnect_peers() - callback to disconnect all connected peers 696 * @vdev_mlme: vdev mlme object 697 * @data_len: event data length 698 * @data: event data 699 * @is_disconnect_legacy_only: flag to indicate is disconnect legacy 700 * 701 * This function is called to disconnect all connected peers 702 * 703 * Return: QDF_STATUS 704 */ ap_mlme_vdev_disconnect_peers(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data,bool is_disconnect_legacy_only)705 static QDF_STATUS ap_mlme_vdev_disconnect_peers(struct vdev_mlme_obj *vdev_mlme, 706 uint16_t data_len, void *data, 707 bool is_disconnect_legacy_only) 708 { 709 mlme_legacy_debug("vdev id = %d ", 710 vdev_mlme->vdev->vdev_objmgr.vdev_id); 711 return lim_ap_mlme_vdev_disconnect_peers(vdev_mlme, data_len, data); 712 } 713 714 /** 715 * ap_mlme_vdev_stop_send() - callback to send stop vdev request 716 * @vdev_mlme: vdev mlme object 717 * @data_len: event data length 718 * @data: event data 719 * 720 * This function is called to send stop vdev request 721 * 722 * Return: QDF_STATUS 723 */ ap_mlme_vdev_stop_send(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)724 static QDF_STATUS ap_mlme_vdev_stop_send(struct vdev_mlme_obj *vdev_mlme, 725 uint16_t data_len, void *data) 726 { 727 mlme_legacy_debug("vdev id = %d ", 728 vdev_mlme->vdev->vdev_objmgr.vdev_id); 729 return lim_ap_mlme_vdev_stop_send(vdev_mlme, data_len, data); 730 } 731 732 /** 733 * ap_mlme_vdev_is_newchan_no_cac - VDEV SM CSA complete notification 734 * @vdev_mlme: VDEV MLME comp object 735 * 736 * On CSA complete, checks whether Channel does not needs CAC period, if 737 * it doesn't need cac return SUCCESS else FAILURE 738 * 739 * Return: SUCCESS if new channel doesn't need cac 740 * else FAILURE 741 */ 742 static QDF_STATUS ap_mlme_vdev_is_newchan_no_cac(struct vdev_mlme_obj * vdev_mlme)743 ap_mlme_vdev_is_newchan_no_cac(struct vdev_mlme_obj *vdev_mlme) 744 { 745 bool cac_required; 746 747 cac_required = mlme_get_cac_required(vdev_mlme->vdev); 748 mlme_legacy_debug("vdev id = %d cac_required %d", 749 vdev_mlme->vdev->vdev_objmgr.vdev_id, cac_required); 750 751 if (!cac_required) 752 return QDF_STATUS_SUCCESS; 753 754 mlme_set_cac_required(vdev_mlme->vdev, false); 755 756 return QDF_STATUS_E_FAILURE; 757 } 758 759 /** 760 * vdevmgr_mlme_vdev_down_send() - callback to send vdev down req 761 * @vdev_mlme: vdev mlme object 762 * @data_len: event data length 763 * @data: event data 764 * 765 * This function is called to send vdev down req 766 * 767 * Return: QDF_STATUS 768 */ vdevmgr_mlme_vdev_down_send(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)769 static QDF_STATUS vdevmgr_mlme_vdev_down_send(struct vdev_mlme_obj *vdev_mlme, 770 uint16_t data_len, void *data) 771 { 772 QDF_STATUS status; 773 uint8_t vdev_id; 774 775 vdev_id = wlan_vdev_get_id(vdev_mlme->vdev); 776 777 mlme_legacy_debug("vdev id = %d ", vdev_id); 778 status = wma_ap_mlme_vdev_down_send(vdev_mlme, data_len, data); 779 if (QDF_IS_STATUS_SUCCESS(status)) 780 mlme_sr_update(vdev_mlme->vdev, false); 781 782 return status; 783 } 784 785 /** 786 * vdevmgr_notify_down_complete() - callback to indicate vdev down is completed 787 * @vdev_mlme: vdev mlme object 788 * @data_len: event data length 789 * @data: event data 790 * 791 * This function is called to indicate vdev down is completed 792 * 793 * Return: QDF_STATUS 794 */ vdevmgr_notify_down_complete(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)795 static QDF_STATUS vdevmgr_notify_down_complete(struct vdev_mlme_obj *vdev_mlme, 796 uint16_t data_len, void *data) 797 { 798 mlme_legacy_debug("vdev id = %d ", 799 vdev_mlme->vdev->vdev_objmgr.vdev_id); 800 801 return wma_mlme_vdev_notify_down_complete(vdev_mlme, data_len, data); 802 } 803 804 /** 805 * ap_mlme_vdev_start_req_failed () - vdev start req fail callback 806 * @vdev_mlme: vdev mlme object 807 * @data_len: event data length 808 * @data: event data 809 * 810 * This function is called to handle vdev start req/rsp failure 811 * 812 * Return: QDF_STATUS 813 */ ap_mlme_vdev_start_req_failed(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)814 static QDF_STATUS ap_mlme_vdev_start_req_failed(struct vdev_mlme_obj *vdev_mlme, 815 uint16_t data_len, void *data) 816 { 817 mlme_legacy_debug("vdev id = %d ", 818 vdev_mlme->vdev->vdev_objmgr.vdev_id); 819 return lim_ap_mlme_vdev_start_req_failed(vdev_mlme, data_len, data); 820 } 821 822 /** 823 * ap_mlme_vdev_restart_send() - a callback to send vdev restart 824 * @vdev_mlme: vdev mlme object 825 * @data_len: event data length 826 * @data: event data 827 * 828 * This function is called to initiate and send vdev restart req 829 * 830 * Return: QDF_STATUS 831 */ ap_mlme_vdev_restart_send(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)832 static QDF_STATUS ap_mlme_vdev_restart_send(struct vdev_mlme_obj *vdev_mlme, 833 uint16_t data_len, void *data) 834 { 835 mlme_legacy_debug("vdev id = %d ", 836 vdev_mlme->vdev->vdev_objmgr.vdev_id); 837 return lim_ap_mlme_vdev_restart_send(vdev_mlme, data_len, data); 838 } 839 840 /** 841 * ap_mlme_vdev_stop_start_send() - handle vdev stop during start req 842 * @vdev_mlme: vdev mlme object 843 * @type: restart req or start req 844 * @data_len: event data length 845 * @data: event data 846 * 847 * This function is called to handle vdev stop during start req 848 * 849 * Return: QDF_STATUS 850 */ ap_mlme_vdev_stop_start_send(struct vdev_mlme_obj * vdev_mlme,enum vdev_cmd_type type,uint16_t data_len,void * data)851 static QDF_STATUS ap_mlme_vdev_stop_start_send(struct vdev_mlme_obj *vdev_mlme, 852 enum vdev_cmd_type type, 853 uint16_t data_len, void *data) 854 { 855 mlme_legacy_debug("vdev id = %d ", 856 vdev_mlme->vdev->vdev_objmgr.vdev_id); 857 return wma_ap_mlme_vdev_stop_start_send(vdev_mlme, type, 858 data_len, data); 859 } 860 mlme_set_chan_switch_in_progress(struct wlan_objmgr_vdev * vdev,bool val)861 QDF_STATUS mlme_set_chan_switch_in_progress(struct wlan_objmgr_vdev *vdev, 862 bool val) 863 { 864 struct mlme_legacy_priv *mlme_priv; 865 866 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 867 if (!mlme_priv) { 868 mlme_legacy_err("vdev legacy private object is NULL"); 869 return QDF_STATUS_E_FAILURE; 870 } 871 872 mlme_priv->chan_switch_in_progress = val; 873 mlo_set_chan_switch_in_progress(vdev, val); 874 875 mlme_legacy_info("Set chan_switch_in_progress: %d vdev %d", 876 val, wlan_vdev_get_id(vdev)); 877 878 return QDF_STATUS_SUCCESS; 879 } 880 881 #ifdef WLAN_FEATURE_MSCS mlme_set_is_mscs_req_sent(struct wlan_objmgr_vdev * vdev,bool val)882 QDF_STATUS mlme_set_is_mscs_req_sent(struct wlan_objmgr_vdev *vdev, bool val) 883 { 884 struct mlme_legacy_priv *mlme_priv; 885 886 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 887 if (!mlme_priv) { 888 mlme_legacy_err("vdev legacy private object is NULL"); 889 return QDF_STATUS_E_FAILURE; 890 } 891 892 mlme_priv->mscs_req_info.is_mscs_req_sent = val; 893 894 return QDF_STATUS_SUCCESS; 895 } 896 mlme_get_is_mscs_req_sent(struct wlan_objmgr_vdev * vdev)897 bool mlme_get_is_mscs_req_sent(struct wlan_objmgr_vdev *vdev) 898 { 899 struct mlme_legacy_priv *mlme_priv; 900 901 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 902 if (!mlme_priv) { 903 mlme_legacy_err("vdev legacy private object is NULL"); 904 return false; 905 } 906 907 return mlme_priv->mscs_req_info.is_mscs_req_sent; 908 } 909 #endif 910 mlme_is_chan_switch_in_progress(struct wlan_objmgr_vdev * vdev)911 bool mlme_is_chan_switch_in_progress(struct wlan_objmgr_vdev *vdev) 912 { 913 struct mlme_legacy_priv *mlme_priv; 914 915 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 916 if (!mlme_priv) { 917 mlme_legacy_err("vdev legacy private object is NULL"); 918 return false; 919 } 920 921 return mlme_priv->chan_switch_in_progress; 922 } 923 924 QDF_STATUS ap_mlme_set_hidden_ssid_restart_in_progress(struct wlan_objmgr_vdev * vdev,bool val)925 ap_mlme_set_hidden_ssid_restart_in_progress(struct wlan_objmgr_vdev *vdev, 926 bool val) 927 { 928 struct mlme_legacy_priv *mlme_priv; 929 930 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 931 if (!mlme_priv) { 932 mlme_legacy_err("vdev legacy private object is NULL"); 933 return QDF_STATUS_E_FAILURE; 934 } 935 936 mlme_priv->hidden_ssid_restart_in_progress = val; 937 938 return QDF_STATUS_SUCCESS; 939 } 940 ap_mlme_is_hidden_ssid_restart_in_progress(struct wlan_objmgr_vdev * vdev)941 bool ap_mlme_is_hidden_ssid_restart_in_progress(struct wlan_objmgr_vdev *vdev) 942 { 943 struct mlme_legacy_priv *mlme_priv; 944 945 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 946 if (!mlme_priv) { 947 mlme_legacy_err("vdev legacy private object is NULL"); 948 return false; 949 } 950 951 return mlme_priv->hidden_ssid_restart_in_progress; 952 } 953 mlme_set_bigtk_support(struct wlan_objmgr_vdev * vdev,bool val)954 QDF_STATUS mlme_set_bigtk_support(struct wlan_objmgr_vdev *vdev, bool val) 955 { 956 struct mlme_legacy_priv *mlme_priv; 957 958 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 959 if (!mlme_priv) { 960 mlme_legacy_err("vdev legacy private object is NULL"); 961 return QDF_STATUS_E_FAILURE; 962 } 963 964 mlme_priv->bigtk_vdev_support = val; 965 966 return QDF_STATUS_SUCCESS; 967 } 968 mlme_get_bigtk_support(struct wlan_objmgr_vdev * vdev)969 bool mlme_get_bigtk_support(struct wlan_objmgr_vdev *vdev) 970 { 971 struct mlme_legacy_priv *mlme_priv; 972 973 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 974 if (!mlme_priv) { 975 mlme_legacy_err("vdev legacy private object is NULL"); 976 return false; 977 } 978 979 return mlme_priv->bigtk_vdev_support; 980 } 981 982 #ifdef FEATURE_WLAN_TDLS 983 QDF_STATUS mlme_set_tdls_chan_switch_prohibited(struct wlan_objmgr_vdev * vdev,bool val)984 mlme_set_tdls_chan_switch_prohibited(struct wlan_objmgr_vdev *vdev, bool val) 985 { 986 struct mlme_legacy_priv *mlme_priv; 987 988 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 989 if (!mlme_priv) { 990 mlme_legacy_err("vdev legacy private object is NULL"); 991 return QDF_STATUS_E_FAILURE; 992 } 993 994 mlme_priv->connect_info.tdls_chan_swit_prohibited = val; 995 996 return QDF_STATUS_SUCCESS; 997 } 998 mlme_get_tdls_chan_switch_prohibited(struct wlan_objmgr_vdev * vdev)999 bool mlme_get_tdls_chan_switch_prohibited(struct wlan_objmgr_vdev *vdev) 1000 { 1001 struct mlme_legacy_priv *mlme_priv; 1002 1003 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 1004 if (!mlme_priv) { 1005 mlme_legacy_err("vdev legacy private object is NULL"); 1006 return false; 1007 } 1008 1009 return mlme_priv->connect_info.tdls_chan_swit_prohibited; 1010 } 1011 1012 QDF_STATUS mlme_set_tdls_prohibited(struct wlan_objmgr_vdev * vdev,bool val)1013 mlme_set_tdls_prohibited(struct wlan_objmgr_vdev *vdev, bool val) 1014 { 1015 struct mlme_legacy_priv *mlme_priv; 1016 1017 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 1018 if (!mlme_priv) { 1019 mlme_legacy_err("vdev legacy private object is NULL"); 1020 return QDF_STATUS_E_FAILURE; 1021 } 1022 1023 mlme_priv->connect_info.tdls_prohibited = val; 1024 1025 return QDF_STATUS_SUCCESS; 1026 } 1027 mlme_get_tdls_prohibited(struct wlan_objmgr_vdev * vdev)1028 bool mlme_get_tdls_prohibited(struct wlan_objmgr_vdev *vdev) 1029 { 1030 struct mlme_legacy_priv *mlme_priv; 1031 1032 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 1033 if (!mlme_priv) { 1034 mlme_legacy_err("vdev legacy private object is NULL"); 1035 return false; 1036 } 1037 1038 return mlme_priv->connect_info.tdls_prohibited; 1039 } 1040 #endif 1041 1042 QDF_STATUS mlme_set_roam_reason_better_ap(struct wlan_objmgr_vdev * vdev,bool val)1043 mlme_set_roam_reason_better_ap(struct wlan_objmgr_vdev *vdev, bool val) 1044 { 1045 struct mlme_legacy_priv *mlme_priv; 1046 1047 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 1048 if (!mlme_priv) { 1049 mlme_legacy_err("vdev legacy private object is NULL"); 1050 return QDF_STATUS_E_FAILURE; 1051 } 1052 1053 mlme_priv->roam_reason_better_ap = val; 1054 1055 return QDF_STATUS_SUCCESS; 1056 } 1057 mlme_get_roam_reason_better_ap(struct wlan_objmgr_vdev * vdev)1058 bool mlme_get_roam_reason_better_ap(struct wlan_objmgr_vdev *vdev) 1059 { 1060 struct mlme_legacy_priv *mlme_priv; 1061 1062 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 1063 if (!mlme_priv) { 1064 mlme_legacy_err("vdev legacy private object is NULL"); 1065 return false; 1066 } 1067 1068 return mlme_priv->roam_reason_better_ap; 1069 } 1070 1071 QDF_STATUS mlme_set_hb_ap_rssi(struct wlan_objmgr_vdev * vdev,uint32_t val)1072 mlme_set_hb_ap_rssi(struct wlan_objmgr_vdev *vdev, uint32_t val) 1073 { 1074 struct mlme_legacy_priv *mlme_priv; 1075 1076 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 1077 if (!mlme_priv) { 1078 mlme_legacy_err("vdev legacy private object is NULL"); 1079 return QDF_STATUS_E_FAILURE; 1080 } 1081 1082 mlme_priv->hb_failure_rssi = val; 1083 1084 return QDF_STATUS_SUCCESS; 1085 } 1086 mlme_get_hb_ap_rssi(struct wlan_objmgr_vdev * vdev)1087 uint32_t mlme_get_hb_ap_rssi(struct wlan_objmgr_vdev *vdev) 1088 { 1089 struct mlme_legacy_priv *mlme_priv; 1090 1091 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 1092 if (!mlme_priv) { 1093 mlme_legacy_err("vdev legacy private object is NULL"); 1094 return 0; 1095 } 1096 1097 return mlme_priv->hb_failure_rssi; 1098 } 1099 1100 mlme_set_connection_fail(struct wlan_objmgr_vdev * vdev,bool val)1101 QDF_STATUS mlme_set_connection_fail(struct wlan_objmgr_vdev *vdev, bool val) 1102 { 1103 struct mlme_legacy_priv *mlme_priv; 1104 1105 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 1106 if (!mlme_priv) { 1107 mlme_legacy_err("vdev legacy private object is NULL"); 1108 return QDF_STATUS_E_FAILURE; 1109 } 1110 1111 mlme_priv->connection_fail = val; 1112 1113 return QDF_STATUS_SUCCESS; 1114 } 1115 mlme_is_connection_fail(struct wlan_objmgr_vdev * vdev)1116 bool mlme_is_connection_fail(struct wlan_objmgr_vdev *vdev) 1117 { 1118 struct mlme_legacy_priv *mlme_priv; 1119 1120 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 1121 if (!mlme_priv) { 1122 mlme_legacy_err("vdev legacy private object is NULL"); 1123 return false; 1124 } 1125 1126 return mlme_priv->connection_fail; 1127 } 1128 1129 #ifdef FEATURE_WLAN_WAPI mlme_is_sta_vdev_wapi(struct wlan_objmgr_pdev * pdev,void * object,void * arg)1130 static void mlme_is_sta_vdev_wapi(struct wlan_objmgr_pdev *pdev, 1131 void *object, void *arg) 1132 { 1133 struct wlan_objmgr_vdev *vdev = (struct wlan_objmgr_vdev *)object; 1134 int32_t keymgmt; 1135 bool *is_wapi_sta_exist = (bool *)arg; 1136 QDF_STATUS status; 1137 1138 if (*is_wapi_sta_exist) 1139 return; 1140 if (wlan_vdev_mlme_get_opmode(vdev) != QDF_STA_MODE) 1141 return; 1142 1143 status = wlan_vdev_is_up(vdev); 1144 if (QDF_IS_STATUS_ERROR(status)) 1145 return; 1146 1147 keymgmt = wlan_crypto_get_param(vdev, WLAN_CRYPTO_PARAM_KEY_MGMT); 1148 if (keymgmt < 0) 1149 return; 1150 1151 if (keymgmt & ((1 << WLAN_CRYPTO_KEY_MGMT_WAPI_PSK) | 1152 (1 << WLAN_CRYPTO_KEY_MGMT_WAPI_CERT))) { 1153 *is_wapi_sta_exist = true; 1154 mlme_debug("wapi exist for Vdev: %d", 1155 wlan_vdev_get_id(vdev)); 1156 } 1157 } 1158 mlme_is_wapi_sta_active(struct wlan_objmgr_pdev * pdev)1159 bool mlme_is_wapi_sta_active(struct wlan_objmgr_pdev *pdev) 1160 { 1161 bool is_wapi_sta_exist = false; 1162 1163 wlan_objmgr_pdev_iterate_obj_list(pdev, 1164 WLAN_VDEV_OP, 1165 mlme_is_sta_vdev_wapi, 1166 &is_wapi_sta_exist, 0, 1167 WLAN_MLME_OBJMGR_ID); 1168 1169 return is_wapi_sta_exist; 1170 } 1171 #endif 1172 mlme_set_assoc_type(struct wlan_objmgr_vdev * vdev,enum vdev_assoc_type assoc_type)1173 QDF_STATUS mlme_set_assoc_type(struct wlan_objmgr_vdev *vdev, 1174 enum vdev_assoc_type assoc_type) 1175 { 1176 struct mlme_legacy_priv *mlme_priv; 1177 1178 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 1179 if (!mlme_priv) { 1180 mlme_legacy_err("vdev legacy private object is NULL"); 1181 return QDF_STATUS_E_FAILURE; 1182 } 1183 1184 mlme_priv->assoc_type = assoc_type; 1185 1186 return QDF_STATUS_SUCCESS; 1187 } 1188 mlme_get_vdev_stop_type(struct wlan_objmgr_vdev * vdev,uint32_t * vdev_stop_type)1189 QDF_STATUS mlme_get_vdev_stop_type(struct wlan_objmgr_vdev *vdev, 1190 uint32_t *vdev_stop_type) 1191 { 1192 struct mlme_legacy_priv *mlme_priv; 1193 1194 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 1195 if (!mlme_priv) { 1196 mlme_legacy_err("vdev legacy private object is NULL"); 1197 return QDF_STATUS_E_FAILURE; 1198 } 1199 1200 *vdev_stop_type = mlme_priv->vdev_stop_type; 1201 1202 return QDF_STATUS_SUCCESS; 1203 } 1204 mlme_set_vdev_stop_type(struct wlan_objmgr_vdev * vdev,uint32_t vdev_stop_type)1205 QDF_STATUS mlme_set_vdev_stop_type(struct wlan_objmgr_vdev *vdev, 1206 uint32_t vdev_stop_type) 1207 { 1208 struct mlme_legacy_priv *mlme_priv; 1209 1210 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 1211 if (!mlme_priv) { 1212 mlme_legacy_err("vdev legacy private object is NULL"); 1213 return QDF_STATUS_E_FAILURE; 1214 } 1215 1216 mlme_priv->vdev_stop_type = vdev_stop_type; 1217 1218 return QDF_STATUS_SUCCESS; 1219 } 1220 mlme_set_notify_co_located_ap_update_rnr(struct wlan_objmgr_vdev * vdev,bool upt_rnr)1221 void mlme_set_notify_co_located_ap_update_rnr(struct wlan_objmgr_vdev *vdev, 1222 bool upt_rnr) 1223 { 1224 struct mlme_legacy_priv *mlme_priv; 1225 1226 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 1227 if (!mlme_priv) { 1228 mlme_legacy_err("vdev legacy private object is NULL"); 1229 return; 1230 } 1231 1232 mlme_priv->notify_co_located_ap_upt_rnr = upt_rnr; 1233 } 1234 mlme_is_notify_co_located_ap_update_rnr(struct wlan_objmgr_vdev * vdev)1235 bool mlme_is_notify_co_located_ap_update_rnr(struct wlan_objmgr_vdev *vdev) 1236 { 1237 struct mlme_legacy_priv *mlme_priv; 1238 1239 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 1240 if (!mlme_priv) { 1241 mlme_legacy_err("vdev legacy private object is NULL"); 1242 return false; 1243 } 1244 1245 return mlme_priv->notify_co_located_ap_upt_rnr; 1246 } 1247 wlan_is_vdev_traffic_ll_ht(struct wlan_objmgr_vdev * vdev)1248 bool wlan_is_vdev_traffic_ll_ht(struct wlan_objmgr_vdev *vdev) 1249 { 1250 struct mlme_legacy_priv *mlme_priv; 1251 1252 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 1253 if (!mlme_priv) { 1254 mlme_legacy_err("vdev legacy private object is NULL"); 1255 return false; 1256 } 1257 1258 if (mlme_priv->vdev_traffic_type & PM_VDEV_TRAFFIC_LOW_LATENCY || 1259 mlme_priv->vdev_traffic_type & PM_VDEV_TRAFFIC_HIGH_TPUT) 1260 return true; 1261 1262 return false; 1263 } 1264 mlme_get_vdev_wifi_std(struct wlan_objmgr_vdev * vdev)1265 WMI_HOST_WIFI_STANDARD mlme_get_vdev_wifi_std(struct wlan_objmgr_vdev *vdev) 1266 { 1267 struct mlme_legacy_priv *mlme_priv; 1268 1269 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 1270 if (!mlme_priv) { 1271 mlme_legacy_err("vdev legacy private object is NULL"); 1272 return WMI_HOST_WIFI_STANDARD_7; 1273 } 1274 1275 if (!mlme_priv->is_user_std_set) 1276 return WMI_HOST_WIFI_STANDARD_7; 1277 1278 return mlme_priv->wifi_std; 1279 } 1280 mlme_get_assoc_type(struct wlan_objmgr_vdev * vdev)1281 enum vdev_assoc_type mlme_get_assoc_type(struct wlan_objmgr_vdev *vdev) 1282 { 1283 struct mlme_legacy_priv *mlme_priv; 1284 1285 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 1286 if (!mlme_priv) { 1287 mlme_legacy_err("vdev legacy private object is NULL"); 1288 return false; 1289 } 1290 1291 return mlme_priv->assoc_type; 1292 } 1293 1294 QDF_STATUS mlme_set_vdev_start_failed(struct wlan_objmgr_vdev * vdev,bool val)1295 mlme_set_vdev_start_failed(struct wlan_objmgr_vdev *vdev, bool val) 1296 { 1297 struct mlme_legacy_priv *mlme_priv; 1298 1299 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 1300 if (!mlme_priv) { 1301 mlme_legacy_err("vdev legacy private object is NULL"); 1302 return QDF_STATUS_E_FAILURE; 1303 } 1304 1305 mlme_priv->vdev_start_failed = val; 1306 1307 return QDF_STATUS_SUCCESS; 1308 } 1309 mlme_get_vdev_start_failed(struct wlan_objmgr_vdev * vdev)1310 bool mlme_get_vdev_start_failed(struct wlan_objmgr_vdev *vdev) 1311 { 1312 struct mlme_legacy_priv *mlme_priv; 1313 1314 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 1315 if (!mlme_priv) { 1316 mlme_legacy_err("vdev legacy private object is NULL"); 1317 return false; 1318 } 1319 1320 return mlme_priv->vdev_start_failed; 1321 } 1322 mlme_set_cac_required(struct wlan_objmgr_vdev * vdev,bool val)1323 QDF_STATUS mlme_set_cac_required(struct wlan_objmgr_vdev *vdev, bool val) 1324 { 1325 struct mlme_legacy_priv *mlme_priv; 1326 1327 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 1328 if (!mlme_priv) { 1329 mlme_legacy_err("vdev legacy private object is NULL"); 1330 return QDF_STATUS_E_FAILURE; 1331 } 1332 1333 mlme_priv->cac_required_for_new_channel = val; 1334 1335 return QDF_STATUS_SUCCESS; 1336 } 1337 mlme_get_cac_required(struct wlan_objmgr_vdev * vdev)1338 bool mlme_get_cac_required(struct wlan_objmgr_vdev *vdev) 1339 { 1340 struct mlme_legacy_priv *mlme_priv; 1341 1342 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 1343 if (!mlme_priv) { 1344 mlme_legacy_err("vdev legacy private object is NULL"); 1345 return false; 1346 } 1347 1348 return mlme_priv->cac_required_for_new_channel; 1349 } 1350 mlme_set_mbssid_info(struct wlan_objmgr_vdev * vdev,struct scan_mbssid_info * mbssid_info,qdf_freq_t freq)1351 QDF_STATUS mlme_set_mbssid_info(struct wlan_objmgr_vdev *vdev, 1352 struct scan_mbssid_info *mbssid_info, 1353 qdf_freq_t freq) 1354 { 1355 struct vdev_mlme_obj *vdev_mlme; 1356 struct vdev_mlme_mbss_11ax *mbss_11ax; 1357 struct qdf_mac_addr bssid; 1358 struct qdf_mac_addr bcast_addr = QDF_MAC_ADDR_BCAST_INIT; 1359 1360 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 1361 if (!vdev_mlme) { 1362 mlme_legacy_err("vdev component object is NULL"); 1363 return QDF_STATUS_E_FAILURE; 1364 } 1365 1366 mbss_11ax = &vdev_mlme->mgmt.mbss_11ax; 1367 mbss_11ax->profile_idx = mbssid_info->profile_num; 1368 mbss_11ax->profile_num = mbssid_info->profile_count; 1369 qdf_mem_copy(mbss_11ax->trans_bssid, 1370 mbssid_info->trans_bssid, QDF_MAC_ADDR_SIZE); 1371 qdf_mem_copy(mbss_11ax->non_trans_bssid, 1372 mbssid_info->non_trans_bssid, QDF_MAC_ADDR_SIZE); 1373 1374 qdf_mem_copy(&bssid.bytes, vdev_mlme->mgmt.generic.bssid, 1375 QDF_MAC_ADDR_SIZE); 1376 1377 /* 1378 * Consider the case of 5 GHz + non-tx 6 GHz MLO candidate. 1379 * The scan entry might be generated from a ML-probe, which doesn't have 1380 * the MBSSID info for the non-tx partner link. In this case, host has 1381 * to identify if this link is MBSS or not. This is essential to receive 1382 * traffic over this link. 1383 * 1384 * The below logic looks into the rnr db for the 6 GHz bssid and 1385 * determines if the bssid is non-tx profile from the bss parameter 1386 * saved by its neighbor. If this is a non-tx bssid, but trans_bssid 1387 * info is not available from the scan entry, then set transmitted bssid 1388 * to bcast address. Upon sending this bcast tx bssid to firmware, the 1389 * firmware would auto-detect the tx bssid from the upcoming beacons 1390 * and tunes the interface to proper bssid. 1391 * 1392 * Note: Always send bcast mac in trans_bssid if the host is unable 1393 * to determine if a given BSS is part of an MBSS. 1394 */ 1395 if (freq != INVALID_CHANNEL_NUM && !mbss_11ax->profile_idx && 1396 qdf_is_macaddr_zero((struct qdf_mac_addr *)&mbss_11ax->trans_bssid) && 1397 util_is_bssid_non_tx(wlan_vdev_get_psoc(vdev), &bssid, freq)) 1398 qdf_mem_copy(mbss_11ax->trans_bssid, 1399 bcast_addr.bytes, QDF_MAC_ADDR_SIZE); 1400 1401 return QDF_STATUS_SUCCESS; 1402 } 1403 mlme_get_mbssid_info(struct wlan_objmgr_vdev * vdev,struct vdev_mlme_mbss_11ax * mbss_11ax)1404 void mlme_get_mbssid_info(struct wlan_objmgr_vdev *vdev, 1405 struct vdev_mlme_mbss_11ax *mbss_11ax) 1406 { 1407 struct vdev_mlme_obj *vdev_mlme; 1408 1409 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 1410 if (!vdev_mlme) { 1411 mlme_legacy_err("vdev component object is NULL"); 1412 return; 1413 } 1414 1415 mbss_11ax = &vdev_mlme->mgmt.mbss_11ax; 1416 } 1417 mlme_set_tx_power(struct wlan_objmgr_vdev * vdev,int8_t tx_power)1418 QDF_STATUS mlme_set_tx_power(struct wlan_objmgr_vdev *vdev, 1419 int8_t tx_power) 1420 { 1421 struct vdev_mlme_obj *vdev_mlme; 1422 1423 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 1424 1425 if (!vdev_mlme) { 1426 mlme_legacy_err("vdev component object is NULL"); 1427 return QDF_STATUS_E_FAILURE; 1428 } 1429 1430 vdev_mlme->mgmt.generic.tx_power = tx_power; 1431 1432 return QDF_STATUS_SUCCESS; 1433 } 1434 mlme_get_tx_power(struct wlan_objmgr_vdev * vdev)1435 int8_t mlme_get_tx_power(struct wlan_objmgr_vdev *vdev) 1436 { 1437 struct vdev_mlme_obj *vdev_mlme; 1438 1439 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 1440 if (!vdev_mlme) { 1441 mlme_legacy_err("vdev component object is NULL"); 1442 return QDF_STATUS_E_INVAL; 1443 } 1444 1445 return vdev_mlme->mgmt.generic.tx_power; 1446 } 1447 mlme_set_max_reg_power(struct wlan_objmgr_vdev * vdev,int8_t max_reg_power)1448 QDF_STATUS mlme_set_max_reg_power(struct wlan_objmgr_vdev *vdev, 1449 int8_t max_reg_power) 1450 { 1451 struct vdev_mlme_obj *vdev_mlme; 1452 1453 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 1454 1455 if (!vdev_mlme) { 1456 mlme_legacy_err("vdev component object is NULL"); 1457 return QDF_STATUS_E_FAILURE; 1458 } 1459 1460 vdev_mlme->mgmt.generic.maxregpower = max_reg_power; 1461 1462 return QDF_STATUS_SUCCESS; 1463 } 1464 mlme_get_max_reg_power(struct wlan_objmgr_vdev * vdev)1465 int8_t mlme_get_max_reg_power(struct wlan_objmgr_vdev *vdev) 1466 { 1467 struct vdev_mlme_obj *vdev_mlme; 1468 1469 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 1470 if (!vdev_mlme) { 1471 mlme_legacy_err("vdev component object is NULL"); 1472 return QDF_STATUS_E_INVAL; 1473 } 1474 1475 return vdev_mlme->mgmt.generic.maxregpower; 1476 } 1477 1478 #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_FEATURE_ROAM_OFFLOAD) 1479 QDF_STATUS mlme_set_single_link_mlo_roaming(struct wlan_objmgr_vdev * vdev,bool val)1480 mlme_set_single_link_mlo_roaming(struct wlan_objmgr_vdev *vdev, bool val) 1481 { 1482 struct mlme_legacy_priv *mlme_priv; 1483 1484 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 1485 if (!mlme_priv) { 1486 mlme_legacy_err("vdev legacy private object is NULL"); 1487 return QDF_STATUS_E_FAILURE; 1488 } 1489 1490 mlme_priv->is_single_link_mlo_roam = val; 1491 1492 return QDF_STATUS_SUCCESS; 1493 } 1494 mlme_get_single_link_mlo_roaming(struct wlan_objmgr_vdev * vdev)1495 bool mlme_get_single_link_mlo_roaming(struct wlan_objmgr_vdev *vdev) 1496 { 1497 struct mlme_legacy_priv *mlme_priv; 1498 1499 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 1500 if (!mlme_priv) { 1501 mlme_legacy_err("vdev legacy private object is NULL"); 1502 return false; 1503 } 1504 1505 return mlme_priv->is_single_link_mlo_roam; 1506 } 1507 #endif 1508 1509 /** 1510 * mlme_get_vdev_types() - get vdev type and subtype from its operation mode 1511 * @mode: operation mode of vdev 1512 * @type: type of vdev 1513 * @sub_type: sub_type of vdev 1514 * 1515 * This API is called to get vdev type and subtype from its operation mode. 1516 * Vdev operation modes are defined in enum QDF_OPMODE. 1517 * 1518 * Type of vdev are WLAN_VDEV_MLME_TYPE_AP, WLAN_VDEV_MLME_TYPE_STA, 1519 * WLAN_VDEV_MLME_TYPE_IBSS, ,WLAN_VDEV_MLME_TYPE_MONITOR, 1520 * WLAN_VDEV_MLME_TYPE_NAN, WLAN_VDEV_MLME_TYPE_OCB, WLAN_VDEV_MLME_TYPE_NDI 1521 * 1522 * Sub_types of vdev are WLAN_VDEV_MLME_SUBTYPE_P2P_DEVICE, 1523 * WLAN_VDEV_MLME_SUBTYPE_P2P_CLIENT, WLAN_VDEV_MLME_SUBTYPE_P2P_GO, 1524 * WLAN_VDEV_MLME_SUBTYPE_PROXY_STA, WLAN_VDEV_MLME_SUBTYPE_MESH 1525 * Return: QDF_STATUS 1526 */ 1527 mlme_get_vdev_types(enum QDF_OPMODE mode,uint8_t * type,uint8_t * sub_type)1528 static QDF_STATUS mlme_get_vdev_types(enum QDF_OPMODE mode, uint8_t *type, 1529 uint8_t *sub_type) 1530 { 1531 QDF_STATUS status = QDF_STATUS_SUCCESS; 1532 *type = 0; 1533 *sub_type = 0; 1534 1535 switch (mode) { 1536 case QDF_STA_MODE: 1537 *type = WLAN_VDEV_MLME_TYPE_STA; 1538 break; 1539 case QDF_SAP_MODE: 1540 *type = WLAN_VDEV_MLME_TYPE_AP; 1541 break; 1542 case QDF_P2P_DEVICE_MODE: 1543 *type = WLAN_VDEV_MLME_TYPE_AP; 1544 *sub_type = WLAN_VDEV_MLME_SUBTYPE_P2P_DEVICE; 1545 break; 1546 case QDF_P2P_CLIENT_MODE: 1547 *type = WLAN_VDEV_MLME_TYPE_STA; 1548 *sub_type = WLAN_VDEV_MLME_SUBTYPE_P2P_CLIENT; 1549 break; 1550 case QDF_P2P_GO_MODE: 1551 *type = WLAN_VDEV_MLME_TYPE_AP; 1552 *sub_type = WLAN_VDEV_MLME_SUBTYPE_P2P_GO; 1553 break; 1554 case QDF_OCB_MODE: 1555 *type = WLAN_VDEV_MLME_TYPE_OCB; 1556 break; 1557 case QDF_IBSS_MODE: 1558 *type = WLAN_VDEV_MLME_TYPE_IBSS; 1559 break; 1560 case QDF_MONITOR_MODE: 1561 *type = WMI_HOST_VDEV_TYPE_MONITOR; 1562 break; 1563 case QDF_NDI_MODE: 1564 *type = WLAN_VDEV_MLME_TYPE_NDI; 1565 break; 1566 case QDF_NAN_DISC_MODE: 1567 *type = WLAN_VDEV_MLME_TYPE_NAN; 1568 break; 1569 default: 1570 mlme_err("Invalid device mode %d", mode); 1571 status = QDF_STATUS_E_INVAL; 1572 break; 1573 } 1574 return status; 1575 } 1576 1577 #ifdef WLAN_FEATURE_FILS_SK mlme_free_fils_info(struct mlme_connect_info * connect_info)1578 static inline void mlme_free_fils_info(struct mlme_connect_info *connect_info) 1579 { 1580 qdf_mem_free(connect_info->fils_con_info); 1581 qdf_mem_free(connect_info->hlp_ie); 1582 connect_info->hlp_ie = NULL; 1583 connect_info->hlp_ie_len = 0; 1584 connect_info->fils_con_info = NULL; 1585 } 1586 #else mlme_free_fils_info(struct mlme_connect_info * connect_info)1587 static inline void mlme_free_fils_info(struct mlme_connect_info *connect_info) 1588 {} 1589 #endif 1590 1591 static mlme_init_wait_for_key_timer(struct wlan_objmgr_vdev * vdev,struct wait_for_key_timer * wait_key_timer)1592 void mlme_init_wait_for_key_timer(struct wlan_objmgr_vdev *vdev, 1593 struct wait_for_key_timer *wait_key_timer) 1594 { 1595 QDF_STATUS status; 1596 1597 if (!vdev || !wait_key_timer) { 1598 mlme_err("vdev or wait for key is NULL"); 1599 return; 1600 } 1601 1602 wait_key_timer->vdev = vdev; 1603 status = qdf_mc_timer_init(&wait_key_timer->timer, QDF_TIMER_TYPE_SW, 1604 cm_wait_for_key_time_out_handler, 1605 wait_key_timer); 1606 if (QDF_IS_STATUS_ERROR(status)) 1607 mlme_err("cannot allocate memory for WaitForKey time out timer"); 1608 } 1609 1610 static mlme_deinit_wait_for_key_timer(struct wait_for_key_timer * wait_key_timer)1611 void mlme_deinit_wait_for_key_timer(struct wait_for_key_timer *wait_key_timer) 1612 { 1613 qdf_mc_timer_stop(&wait_key_timer->timer); 1614 qdf_mc_timer_destroy(&wait_key_timer->timer); 1615 } 1616 mlme_ext_handler_destroy(struct vdev_mlme_obj * vdev_mlme)1617 static void mlme_ext_handler_destroy(struct vdev_mlme_obj *vdev_mlme) 1618 { 1619 if (!vdev_mlme || !vdev_mlme->ext_vdev_ptr) 1620 return; 1621 qdf_runtime_lock_deinit( 1622 &vdev_mlme->ext_vdev_ptr->bss_color_change_runtime_lock); 1623 qdf_wake_lock_destroy( 1624 &vdev_mlme->ext_vdev_ptr->bss_color_change_wakelock); 1625 qdf_runtime_lock_deinit( 1626 &vdev_mlme->ext_vdev_ptr->disconnect_runtime_lock); 1627 mlme_free_self_disconnect_ies(vdev_mlme->vdev); 1628 mlme_free_peer_disconnect_ies(vdev_mlme->vdev); 1629 mlme_free_sae_auth_retry(vdev_mlme->vdev); 1630 mlme_deinit_wait_for_key_timer(&vdev_mlme->ext_vdev_ptr->wait_key_timer); 1631 mlme_free_fils_info(&vdev_mlme->ext_vdev_ptr->connect_info); 1632 mlme_cm_free_roam_stats_info(vdev_mlme->ext_vdev_ptr); 1633 qdf_mem_free(vdev_mlme->ext_vdev_ptr); 1634 vdev_mlme->ext_vdev_ptr = NULL; 1635 } 1636 1637 static QDF_STATUS mlme_wma_vdev_detach_post_cb(struct scheduler_msg * msg)1638 mlme_wma_vdev_detach_post_cb(struct scheduler_msg *msg) 1639 { 1640 struct vdev_delete_response rsp = {0}; 1641 1642 if (!msg) { 1643 mlme_err("Msg is NULL"); 1644 return QDF_STATUS_E_INVAL; 1645 } 1646 1647 rsp.vdev_id = msg->bodyval; 1648 wma_vdev_detach_callback(&rsp); 1649 1650 return QDF_STATUS_SUCCESS; 1651 } 1652 mlme_wma_vdev_detach_handler(uint8_t vdev_id)1653 static void mlme_wma_vdev_detach_handler(uint8_t vdev_id) 1654 { 1655 struct scheduler_msg msg = {0}; 1656 1657 msg.bodyptr = NULL; 1658 msg.bodyval = vdev_id; 1659 msg.callback = mlme_wma_vdev_detach_post_cb; 1660 1661 if (scheduler_post_message(QDF_MODULE_ID_MLME, 1662 QDF_MODULE_ID_TARGET_IF, 1663 QDF_MODULE_ID_TARGET_IF, &msg) == 1664 QDF_STATUS_SUCCESS) 1665 return; 1666 1667 mlme_err("Failed to post wma vdev detach"); 1668 } 1669 1670 /** 1671 * vdevmgr_mlme_ext_hdl_destroy () - Destroy mlme legacy priv object 1672 * @vdev_mlme: vdev mlme object 1673 * 1674 * Return: QDF_STATUS 1675 */ 1676 static vdevmgr_mlme_ext_hdl_destroy(struct vdev_mlme_obj * vdev_mlme)1677 QDF_STATUS vdevmgr_mlme_ext_hdl_destroy(struct vdev_mlme_obj *vdev_mlme) 1678 { 1679 QDF_STATUS status = QDF_STATUS_E_FAILURE; 1680 uint8_t vdev_id; 1681 1682 vdev_id = vdev_mlme->vdev->vdev_objmgr.vdev_id; 1683 mlme_legacy_debug("Sending vdev delete to firmware for vdev id = %d ", 1684 vdev_id); 1685 1686 if (!vdev_mlme->ext_vdev_ptr) 1687 return status; 1688 1689 status = vdev_mgr_delete_send(vdev_mlme); 1690 if (QDF_IS_STATUS_ERROR(status)) { 1691 mlme_err("Failed to send vdev delete to firmware"); 1692 mlme_wma_vdev_detach_handler(vdev_id); 1693 } 1694 1695 mlme_ext_handler_destroy(vdev_mlme); 1696 1697 return QDF_STATUS_SUCCESS; 1698 } 1699 1700 /** 1701 * vdevmgr_mlme_ext_hdl_create () - Create mlme legacy priv object 1702 * @vdev_mlme: vdev mlme object 1703 * 1704 * Return: QDF_STATUS 1705 */ 1706 static vdevmgr_mlme_ext_hdl_create(struct vdev_mlme_obj * vdev_mlme)1707 QDF_STATUS vdevmgr_mlme_ext_hdl_create(struct vdev_mlme_obj *vdev_mlme) 1708 { 1709 QDF_STATUS status; 1710 1711 mlme_legacy_debug("vdev id = %d ", 1712 vdev_mlme->vdev->vdev_objmgr.vdev_id); 1713 vdev_mlme->ext_vdev_ptr = 1714 qdf_mem_malloc(sizeof(struct mlme_legacy_priv)); 1715 if (!vdev_mlme->ext_vdev_ptr) 1716 return QDF_STATUS_E_NOMEM; 1717 1718 mlme_init_rate_config(vdev_mlme); 1719 mlme_init_connect_chan_info_config(vdev_mlme); 1720 mlme_cm_alloc_roam_stats_info(vdev_mlme); 1721 vdev_mlme->ext_vdev_ptr->connect_info.fils_con_info = NULL; 1722 mlme_init_wait_for_key_timer(vdev_mlme->vdev, 1723 &vdev_mlme->ext_vdev_ptr->wait_key_timer); 1724 1725 qdf_wake_lock_create( 1726 &vdev_mlme->ext_vdev_ptr->bss_color_change_wakelock, 1727 "bss_color_change_wakelock"); 1728 qdf_runtime_lock_init( 1729 &vdev_mlme->ext_vdev_ptr->bss_color_change_runtime_lock); 1730 qdf_runtime_lock_init( 1731 &vdev_mlme->ext_vdev_ptr->disconnect_runtime_lock); 1732 1733 sme_get_vdev_type_nss(wlan_vdev_mlme_get_opmode(vdev_mlme->vdev), 1734 &vdev_mlme->proto.generic.nss_2g, 1735 &vdev_mlme->proto.generic.nss_5g); 1736 1737 status = mlme_get_vdev_types(wlan_vdev_mlme_get_opmode(vdev_mlme->vdev), 1738 &vdev_mlme->mgmt.generic.type, 1739 &vdev_mlme->mgmt.generic.subtype); 1740 if (QDF_IS_STATUS_ERROR(status)) { 1741 mlme_err("Get vdev type failed; status:%d", status); 1742 mlme_ext_handler_destroy(vdev_mlme); 1743 return status; 1744 } 1745 1746 status = vdev_mgr_create_send(vdev_mlme); 1747 if (QDF_IS_STATUS_ERROR(status)) { 1748 mlme_err("Failed to create vdev for vdev id %d", 1749 wlan_vdev_get_id(vdev_mlme->vdev)); 1750 vdevmgr_mlme_ext_hdl_destroy(vdev_mlme); 1751 return status; 1752 } 1753 1754 return status; 1755 } 1756 1757 #ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE 1758 static vdevmgr_mlme_vdev_send_set_mac_addr(struct qdf_mac_addr mac_addr,struct qdf_mac_addr mld_addr,struct wlan_objmgr_vdev * vdev)1759 QDF_STATUS vdevmgr_mlme_vdev_send_set_mac_addr(struct qdf_mac_addr mac_addr, 1760 struct qdf_mac_addr mld_addr, 1761 struct wlan_objmgr_vdev *vdev) 1762 { 1763 return vdev_mgr_send_set_mac_addr(mac_addr, mld_addr, vdev); 1764 } 1765 #endif 1766 1767 /** 1768 * ap_vdev_dfs_cac_timer_stop() - callback to stop cac timer 1769 * @vdev_mlme: vdev mlme object 1770 * @event_data_len: event data length 1771 * @event_data: event data 1772 * 1773 * This function is called to stop cac timer 1774 * 1775 * Return: QDF_STATUS 1776 */ ap_vdev_dfs_cac_timer_stop(struct vdev_mlme_obj * vdev_mlme,uint16_t event_data_len,void * event_data)1777 static QDF_STATUS ap_vdev_dfs_cac_timer_stop(struct vdev_mlme_obj *vdev_mlme, 1778 uint16_t event_data_len, 1779 void *event_data) 1780 { 1781 mlme_legacy_debug("vdev id = %d ", 1782 vdev_mlme->vdev->vdev_objmgr.vdev_id); 1783 return QDF_STATUS_SUCCESS; 1784 } 1785 1786 /** 1787 * mon_mlme_vdev_start_restart_send () - send vdev start/restart req 1788 * @vdev_mlme: vdev mlme object 1789 * @data_len: event data length 1790 * @data: event data 1791 * 1792 * This function is called to initiate actions of VDEV start/restart 1793 * 1794 * Return: QDF_STATUS 1795 */ mon_mlme_vdev_start_restart_send(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)1796 static QDF_STATUS mon_mlme_vdev_start_restart_send( 1797 struct vdev_mlme_obj *vdev_mlme, 1798 uint16_t data_len, void *data) 1799 { 1800 mlme_legacy_debug("vdev id = %d", 1801 vdev_mlme->vdev->vdev_objmgr.vdev_id); 1802 return lim_mon_mlme_vdev_start_send(vdev_mlme, data_len, data); 1803 } 1804 1805 /** 1806 * mon_mlme_start_continue () - vdev start rsp callback 1807 * @vdev_mlme: vdev mlme object 1808 * @data_len: event data length 1809 * @data: event data 1810 * 1811 * This function is called to handle the VDEV START/RESTART callback 1812 * 1813 * Return: QDF_STATUS 1814 */ mon_mlme_start_continue(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)1815 static QDF_STATUS mon_mlme_start_continue(struct vdev_mlme_obj *vdev_mlme, 1816 uint16_t data_len, void *data) 1817 { 1818 mlme_legacy_debug("vdev id = %d", 1819 vdev_mlme->vdev->vdev_objmgr.vdev_id); 1820 return wma_mon_mlme_vdev_start_continue(vdev_mlme, data_len, data); 1821 } 1822 1823 /** 1824 * mon_mlme_vdev_up_send() - callback to send vdev up 1825 * @vdev_mlme: vdev mlme object 1826 * @data_len: event data length 1827 * @data: event data 1828 * 1829 * This function is called to send vdev up req 1830 * 1831 * Return: QDF_STATUS 1832 */ mon_mlme_vdev_up_send(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)1833 static QDF_STATUS mon_mlme_vdev_up_send(struct vdev_mlme_obj *vdev_mlme, 1834 uint16_t data_len, void *data) 1835 { 1836 mlme_legacy_debug("vdev id = %d", 1837 vdev_mlme->vdev->vdev_objmgr.vdev_id); 1838 return wma_mon_mlme_vdev_up_send(vdev_mlme, data_len, data); 1839 } 1840 1841 /** 1842 * mon_mlme_vdev_disconnect_peers() - callback to disconnect all connected peers 1843 * @vdev_mlme: vdev mlme object 1844 * @data_len: event data length 1845 * @data: event data 1846 * @is_disconnect_legacy_only: flag to indicate legacy disconnect 1847 * 1848 * montior mode no connected peers, only do VDEV state transition. 1849 * 1850 * Return: QDF_STATUS 1851 */ mon_mlme_vdev_disconnect_peers(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data,bool is_disconnect_legacy_only)1852 static QDF_STATUS mon_mlme_vdev_disconnect_peers( 1853 struct vdev_mlme_obj *vdev_mlme, 1854 uint16_t data_len, void *data, 1855 bool is_disconnect_legacy_only) 1856 { 1857 struct wlan_objmgr_psoc *psoc = NULL; 1858 struct wlan_objmgr_pdev *pdev = NULL; 1859 uint32_t pdev_id; 1860 1861 psoc = wlan_vdev_get_psoc(vdev_mlme->vdev); 1862 if (!psoc) { 1863 mlme_legacy_debug("Invalid psoc"); 1864 return QDF_STATUS_E_INVAL; 1865 } 1866 1867 pdev = wlan_vdev_get_pdev(vdev_mlme->vdev); 1868 if (!pdev) { 1869 mlme_legacy_debug("Invalid pdev"); 1870 return QDF_STATUS_E_INVAL; 1871 } 1872 1873 pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev); 1874 if (pdev_id == WLAN_INVALID_PDEV_ID) { 1875 mlme_legacy_debug("Invalid pdev id"); 1876 return QDF_STATUS_E_INVAL; 1877 } 1878 1879 /* Cancel periodic pdev stats update */ 1880 tgt_set_pdev_stats_update_period(psoc, pdev_id, 0); 1881 1882 mlme_legacy_debug("vdev id = %d", 1883 vdev_mlme->vdev->vdev_objmgr.vdev_id); 1884 return wlan_vdev_mlme_sm_deliver_evt( 1885 vdev_mlme->vdev, 1886 WLAN_VDEV_SM_EV_DISCONNECT_COMPLETE, 1887 0, NULL); 1888 } 1889 1890 /** 1891 * mon_mlme_vdev_stop_send() - callback to send stop vdev request 1892 * @vdev_mlme: vdev mlme object 1893 * @data_len: event data length 1894 * @data: event data 1895 * 1896 * This function is called to send stop vdev request 1897 * 1898 * Return: QDF_STATUS 1899 */ mon_mlme_vdev_stop_send(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)1900 static QDF_STATUS mon_mlme_vdev_stop_send(struct vdev_mlme_obj *vdev_mlme, 1901 uint16_t data_len, void *data) 1902 { 1903 mlme_legacy_debug("vdev id = %d", 1904 vdev_mlme->vdev->vdev_objmgr.vdev_id); 1905 return wma_mon_mlme_vdev_stop_send(vdev_mlme, data_len, data); 1906 } 1907 1908 /** 1909 * mon_mlme_vdev_down_send() - callback to send vdev down req 1910 * @vdev_mlme: vdev mlme object 1911 * @data_len: event data length 1912 * @data: event data 1913 * 1914 * This function is called to send vdev down req 1915 * 1916 * Return: QDF_STATUS 1917 */ mon_mlme_vdev_down_send(struct vdev_mlme_obj * vdev_mlme,uint16_t data_len,void * data)1918 static QDF_STATUS mon_mlme_vdev_down_send(struct vdev_mlme_obj *vdev_mlme, 1919 uint16_t data_len, void *data) 1920 { 1921 mlme_legacy_debug("vdev id = %d", 1922 vdev_mlme->vdev->vdev_objmgr.vdev_id); 1923 return wma_mon_mlme_vdev_down_send(vdev_mlme, data_len, data); 1924 } 1925 1926 /** 1927 * vdevmgr_vdev_delete_rsp_handle() - callback to handle vdev delete response 1928 * @psoc: psoc object 1929 * @rsp: pointer to vdev delete response 1930 * 1931 * This function is called to handle vdev delete response and send result to 1932 * upper layer 1933 * 1934 * Return: QDF_STATUS 1935 */ 1936 static QDF_STATUS vdevmgr_vdev_delete_rsp_handle(struct wlan_objmgr_psoc * psoc,struct vdev_delete_response * rsp)1937 vdevmgr_vdev_delete_rsp_handle(struct wlan_objmgr_psoc *psoc, 1938 struct vdev_delete_response *rsp) 1939 { 1940 mlme_legacy_debug("vdev id = %d ", rsp->vdev_id); 1941 return wma_vdev_detach_callback(rsp); 1942 } 1943 1944 /** 1945 * vdevmgr_vdev_stop_rsp_handle() - callback to handle vdev stop response 1946 * @vdev_mlme: vdev mlme object 1947 * @rsp: pointer to vdev stop response 1948 * 1949 * This function is called to handle vdev stop response and send result to 1950 * upper layer 1951 * 1952 * Return: QDF_STATUS 1953 */ 1954 static QDF_STATUS vdevmgr_vdev_stop_rsp_handle(struct vdev_mlme_obj * vdev_mlme,struct vdev_stop_response * rsp)1955 vdevmgr_vdev_stop_rsp_handle(struct vdev_mlme_obj *vdev_mlme, 1956 struct vdev_stop_response *rsp) 1957 { 1958 mlme_legacy_debug("vdev id = %d ", 1959 vdev_mlme->vdev->vdev_objmgr.vdev_id); 1960 return wma_vdev_stop_resp_handler(vdev_mlme, rsp); 1961 } 1962 1963 /** 1964 * psoc_mlme_ext_hdl_enable() - to enable mlme ext param handler 1965 * @psoc: psoc object 1966 * 1967 * Return: QDF_STATUS 1968 */ psoc_mlme_ext_hdl_enable(struct wlan_objmgr_psoc * psoc)1969 static QDF_STATUS psoc_mlme_ext_hdl_enable(struct wlan_objmgr_psoc *psoc) 1970 { 1971 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1972 1973 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1974 if (!mlme_obj) 1975 return QDF_STATUS_E_FAILURE; 1976 1977 mlme_obj->scan_requester_id = 1978 wlan_scan_register_requester(psoc, "MLME_EXT", 1979 wlan_mlme_chan_stats_scan_event_cb, 1980 NULL); 1981 1982 return QDF_STATUS_SUCCESS; 1983 } 1984 1985 /** 1986 * psoc_mlme_ext_hdl_disable() - to disable mlme ext param handler 1987 * @psoc: psoc object 1988 * 1989 * Return: QDF_STATUS 1990 */ psoc_mlme_ext_hdl_disable(struct wlan_objmgr_psoc * psoc)1991 static QDF_STATUS psoc_mlme_ext_hdl_disable(struct wlan_objmgr_psoc *psoc) 1992 { 1993 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1994 1995 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1996 if (!mlme_obj) 1997 return QDF_STATUS_E_FAILURE; 1998 1999 wlan_scan_unregister_requester(psoc, mlme_obj->scan_requester_id); 2000 2001 return QDF_STATUS_SUCCESS; 2002 } 2003 2004 /** 2005 * psoc_mlme_ext_hdl_create() - Create mlme legacy priv object 2006 * @psoc_mlme: psoc mlme object 2007 * 2008 * Return: QDF_STATUS 2009 */ 2010 static psoc_mlme_ext_hdl_create(struct psoc_mlme_obj * psoc_mlme)2011 QDF_STATUS psoc_mlme_ext_hdl_create(struct psoc_mlme_obj *psoc_mlme) 2012 { 2013 psoc_mlme->ext_psoc_ptr = 2014 qdf_mem_malloc(sizeof(struct wlan_mlme_psoc_ext_obj)); 2015 if (!psoc_mlme->ext_psoc_ptr) 2016 return QDF_STATUS_E_NOMEM; 2017 2018 target_if_cm_roam_register_tx_ops( 2019 &psoc_mlme->ext_psoc_ptr->rso_tx_ops); 2020 2021 target_if_wfatestcmd_register_tx_ops( 2022 &psoc_mlme->ext_psoc_ptr->wfa_testcmd.tx_ops); 2023 target_if_cm_roam_register_rx_ops( 2024 &psoc_mlme->ext_psoc_ptr->rso_rx_ops); 2025 wlan_mlme_register_rx_ops(&psoc_mlme->ext_psoc_ptr->mlme_rx_ops); 2026 2027 target_if_mlme_register_tx_ops( 2028 &psoc_mlme->ext_psoc_ptr->mlme_tx_ops); 2029 2030 return QDF_STATUS_SUCCESS; 2031 } 2032 2033 /** 2034 * psoc_mlme_ext_hdl_destroy() - Destroy mlme legacy priv object 2035 * @psoc_mlme: psoc mlme object 2036 * 2037 * Return: QDF_STATUS 2038 */ 2039 static psoc_mlme_ext_hdl_destroy(struct psoc_mlme_obj * psoc_mlme)2040 QDF_STATUS psoc_mlme_ext_hdl_destroy(struct psoc_mlme_obj *psoc_mlme) 2041 { 2042 if (!psoc_mlme) { 2043 mlme_err("PSOC MLME is NULL"); 2044 return QDF_STATUS_E_FAILURE; 2045 } 2046 2047 if (psoc_mlme->ext_psoc_ptr) { 2048 qdf_mem_free(psoc_mlme->ext_psoc_ptr); 2049 psoc_mlme->ext_psoc_ptr = NULL; 2050 } 2051 2052 return QDF_STATUS_SUCCESS; 2053 } 2054 2055 /** 2056 * vdevmgr_vdev_start_rsp_handle() - callback to handle vdev start response 2057 * @vdev_mlme: vdev mlme object 2058 * @rsp: pointer to vdev start response 2059 * 2060 * This function is called to handle vdev start response 2061 * 2062 * Return: QDF_STATUS 2063 */ 2064 static QDF_STATUS vdevmgr_vdev_start_rsp_handle(struct vdev_mlme_obj * vdev_mlme,struct vdev_start_response * rsp)2065 vdevmgr_vdev_start_rsp_handle(struct vdev_mlme_obj *vdev_mlme, 2066 struct vdev_start_response *rsp) 2067 { 2068 QDF_STATUS status; 2069 2070 mlme_legacy_debug("vdev id = %d ", 2071 vdev_mlme->vdev->vdev_objmgr.vdev_id); 2072 status = wma_vdev_start_resp_handler(vdev_mlme, rsp); 2073 2074 return status; 2075 } 2076 2077 /** 2078 * vdevmgr_vdev_peer_delete_all_rsp_handle() - callback to handle vdev delete 2079 * all response 2080 * @vdev_mlme: vdev mlme object 2081 * @rsp: pointer to vdev delete response 2082 * 2083 * This function is called to handle vdev delete response and send result to 2084 * upper layer 2085 * 2086 * Return: QDF_STATUS 2087 */ 2088 static QDF_STATUS vdevmgr_vdev_peer_delete_all_rsp_handle(struct vdev_mlme_obj * vdev_mlme,struct peer_delete_all_response * rsp)2089 vdevmgr_vdev_peer_delete_all_rsp_handle(struct vdev_mlme_obj *vdev_mlme, 2090 struct peer_delete_all_response *rsp) 2091 { 2092 struct wlan_objmgr_psoc *psoc; 2093 struct wlan_lmac_if_wifi_pos_rx_ops *rx_ops; 2094 QDF_STATUS status; 2095 2096 psoc = wlan_vdev_get_psoc(vdev_mlme->vdev); 2097 if (!psoc) 2098 return -QDF_STATUS_E_INVAL; 2099 2100 if (QDF_HAS_PARAM(rsp->peer_type_bitmap, WLAN_PEER_RTT_PASN)) { 2101 rx_ops = wifi_pos_get_rx_ops(psoc); 2102 if (!rx_ops || 2103 !rx_ops->wifi_pos_vdev_delete_all_ranging_peers_rsp_cb) { 2104 mlme_err("rx_ops is NULL"); 2105 return QDF_STATUS_E_FAILURE; 2106 } 2107 2108 status = rx_ops->wifi_pos_vdev_delete_all_ranging_peers_rsp_cb( 2109 psoc, rsp->vdev_id); 2110 return status; 2111 } 2112 2113 status = lim_process_mlm_del_all_sta_rsp(vdev_mlme, rsp); 2114 if (QDF_IS_STATUS_ERROR(status)) 2115 mlme_err("Failed to call lim_process_mlm_del_all_sta_rsp"); 2116 2117 return status; 2118 } 2119 2120 #ifdef WLAN_FEATURE_11BE_MLO vdevmgr_reconfig_req_cb(struct scheduler_msg * msg)2121 static QDF_STATUS vdevmgr_reconfig_req_cb(struct scheduler_msg *msg) 2122 { 2123 struct wlan_objmgr_vdev *vdev = msg->bodyptr; 2124 struct wlan_objmgr_psoc *psoc; 2125 uint8_t vdev_id; 2126 2127 if (!vdev) { 2128 mlme_err("vdev null"); 2129 return QDF_STATUS_E_INVAL; 2130 } 2131 2132 psoc = wlan_vdev_get_psoc(vdev); 2133 if (!psoc) { 2134 mlme_err("Failed to get psoc"); 2135 return QDF_STATUS_E_INVAL; 2136 } 2137 2138 vdev_id = wlan_vdev_get_id(vdev); 2139 if (!wlan_get_vdev_link_removed_flag_by_vdev_id(psoc, vdev_id)) 2140 mlme_cm_osif_link_reconfig_notify(vdev); 2141 2142 policy_mgr_handle_link_removal_on_vdev(vdev); 2143 mlo_sta_stop_reconfig_timer_by_vdev(vdev); 2144 2145 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID); 2146 2147 return QDF_STATUS_SUCCESS; 2148 } 2149 vdevmgr_reconfig_req_flush_cb(struct scheduler_msg * msg)2150 static QDF_STATUS vdevmgr_reconfig_req_flush_cb(struct scheduler_msg *msg) 2151 { 2152 struct wlan_objmgr_vdev *vdev = msg->bodyptr; 2153 2154 if (!vdev) { 2155 mlme_err("vdev null"); 2156 return QDF_STATUS_E_INVAL; 2157 } 2158 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID); 2159 2160 return QDF_STATUS_SUCCESS; 2161 } 2162 2163 static QDF_STATUS vdevmgr_vdev_reconfig_notify(struct vdev_mlme_obj * vdev_mlme,uint16_t * tbtt_count,uint16_t bcn_int)2164 vdevmgr_vdev_reconfig_notify(struct vdev_mlme_obj *vdev_mlme, 2165 uint16_t *tbtt_count, uint16_t bcn_int) 2166 { 2167 struct wlan_objmgr_vdev *vdev = vdev_mlme->vdev; 2168 2169 if (!vdev) { 2170 mlme_err("invalid vdev"); 2171 return QDF_STATUS_E_INVAL; 2172 } 2173 mlme_debug("vdev %d link removal notify tbtt %d bcn_int %d", 2174 wlan_vdev_get_id(vdev), *tbtt_count, bcn_int); 2175 if (*tbtt_count * bcn_int <= LINK_REMOVAL_MIN_TIMEOUT_MS) 2176 *tbtt_count = 0; 2177 else if (bcn_int) 2178 *tbtt_count -= LINK_REMOVAL_MIN_TIMEOUT_MS / bcn_int; 2179 2180 return QDF_STATUS_SUCCESS; 2181 } 2182 2183 static QDF_STATUS vdevmgr_vdev_reconfig_notify_standby(struct vdev_mlme_obj * vdev_mlme,struct ml_rv_info * reconfig_info)2184 vdevmgr_vdev_reconfig_notify_standby(struct vdev_mlme_obj *vdev_mlme, 2185 struct ml_rv_info *reconfig_info) 2186 { 2187 struct wlan_objmgr_vdev *vdev = vdev_mlme->vdev; 2188 2189 if (!vdev) { 2190 mlme_err("invalid vdev"); 2191 return QDF_STATUS_E_INVAL; 2192 } 2193 2194 return policy_mgr_handle_link_removal_on_standby(vdev, reconfig_info); 2195 } 2196 2197 static void vdevmgr_vdev_reconfig_timer_complete(struct vdev_mlme_obj * vdev_mlme)2198 vdevmgr_vdev_reconfig_timer_complete(struct vdev_mlme_obj *vdev_mlme) 2199 { 2200 struct wlan_objmgr_vdev *vdev = vdev_mlme->vdev; 2201 struct scheduler_msg msg = {0}; 2202 QDF_STATUS ret; 2203 2204 if (!vdev) { 2205 mlme_err("invalid vdev"); 2206 return; 2207 } 2208 mlme_debug("vdev %d link removal timed out", wlan_vdev_get_id(vdev)); 2209 2210 msg.bodyptr = vdev; 2211 msg.callback = vdevmgr_reconfig_req_cb; 2212 msg.flush_callback = vdevmgr_reconfig_req_flush_cb; 2213 2214 ret = wlan_objmgr_vdev_try_get_ref(vdev, WLAN_MLME_CM_ID); 2215 if (QDF_IS_STATUS_ERROR(ret)) 2216 return; 2217 2218 ret = scheduler_post_message(QDF_MODULE_ID_MLME, 2219 QDF_MODULE_ID_TARGET_IF, 2220 QDF_MODULE_ID_TARGET_IF, &msg); 2221 2222 if (QDF_IS_STATUS_ERROR(ret)) { 2223 mlme_err("vdev %d failed to post scheduler_msg", 2224 wlan_vdev_get_id(vdev)); 2225 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID); 2226 return; 2227 } 2228 } 2229 #endif 2230 mlme_vdev_self_peer_create(struct wlan_objmgr_vdev * vdev)2231 QDF_STATUS mlme_vdev_self_peer_create(struct wlan_objmgr_vdev *vdev) 2232 { 2233 struct vdev_mlme_obj *vdev_mlme; 2234 2235 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 2236 if (!vdev_mlme) { 2237 mlme_err("Failed to get vdev mlme obj for vdev id %d", 2238 wlan_vdev_get_id(vdev)); 2239 return QDF_STATUS_E_INVAL; 2240 } 2241 2242 return wma_vdev_self_peer_create(vdev_mlme); 2243 } 2244 2245 static vdevmgr_mlme_ext_post_hdl_create(struct vdev_mlme_obj * vdev_mlme)2246 QDF_STATUS vdevmgr_mlme_ext_post_hdl_create(struct vdev_mlme_obj *vdev_mlme) 2247 { 2248 return QDF_STATUS_SUCCESS; 2249 } 2250 mlme_vdev_uses_self_peer(uint32_t vdev_type,uint32_t vdev_subtype)2251 bool mlme_vdev_uses_self_peer(uint32_t vdev_type, uint32_t vdev_subtype) 2252 { 2253 switch (vdev_type) { 2254 case WMI_VDEV_TYPE_AP: 2255 return vdev_subtype == WMI_UNIFIED_VDEV_SUBTYPE_P2P_DEVICE; 2256 2257 case WMI_VDEV_TYPE_MONITOR: 2258 case WMI_VDEV_TYPE_OCB: 2259 return true; 2260 2261 default: 2262 return false; 2263 } 2264 } 2265 mlme_vdev_del_resp(uint8_t vdev_id)2266 void mlme_vdev_del_resp(uint8_t vdev_id) 2267 { 2268 sme_vdev_del_resp(vdev_id); 2269 } 2270 2271 static mlme_vdev_self_peer_delete_resp_flush_cb(struct scheduler_msg * msg)2272 QDF_STATUS mlme_vdev_self_peer_delete_resp_flush_cb(struct scheduler_msg *msg) 2273 { 2274 /* 2275 * sme should be the last component to hold the reference invoke the 2276 * same to release the reference gracefully 2277 */ 2278 sme_vdev_self_peer_delete_resp(msg->bodyptr); 2279 return QDF_STATUS_SUCCESS; 2280 } 2281 mlme_vdev_self_peer_delete_resp(struct del_vdev_params * param)2282 void mlme_vdev_self_peer_delete_resp(struct del_vdev_params *param) 2283 { 2284 struct scheduler_msg peer_del_rsp = {0}; 2285 QDF_STATUS status; 2286 2287 peer_del_rsp.type = eWNI_SME_VDEV_DELETE_RSP; 2288 peer_del_rsp.bodyptr = param; 2289 peer_del_rsp.flush_callback = mlme_vdev_self_peer_delete_resp_flush_cb; 2290 2291 status = scheduler_post_message(QDF_MODULE_ID_MLME, 2292 QDF_MODULE_ID_SME, 2293 QDF_MODULE_ID_SME, &peer_del_rsp); 2294 if (!QDF_IS_STATUS_SUCCESS(status)) { 2295 /* In the error cases release the final sme reference */ 2296 wlan_objmgr_vdev_release_ref(param->vdev, WLAN_LEGACY_SME_ID); 2297 qdf_mem_free(param); 2298 } 2299 } 2300 mlme_vdev_self_peer_delete(struct scheduler_msg * self_peer_del_msg)2301 QDF_STATUS mlme_vdev_self_peer_delete(struct scheduler_msg *self_peer_del_msg) 2302 { 2303 QDF_STATUS status; 2304 struct del_vdev_params *del_vdev = self_peer_del_msg->bodyptr; 2305 2306 if (!del_vdev) { 2307 mlme_err("Invalid del self peer params"); 2308 return QDF_STATUS_E_INVAL; 2309 } 2310 2311 status = wma_vdev_detach(del_vdev); 2312 if (QDF_IS_STATUS_ERROR(status)) 2313 mlme_err("Failed to detach vdev"); 2314 2315 return status; 2316 } 2317 wlan_sap_disconnect_all_p2p_client(uint8_t vdev_id)2318 QDF_STATUS wlan_sap_disconnect_all_p2p_client(uint8_t vdev_id) 2319 { 2320 return csr_mlme_vdev_disconnect_all_p2p_client_event(vdev_id); 2321 } 2322 wlan_sap_stop_bss(uint8_t vdev_id)2323 QDF_STATUS wlan_sap_stop_bss(uint8_t vdev_id) 2324 { 2325 return csr_mlme_vdev_stop_bss(vdev_id); 2326 } 2327 wlan_get_conc_freq(void)2328 qdf_freq_t wlan_get_conc_freq(void) 2329 { 2330 return csr_mlme_get_concurrent_operation_freq(); 2331 } 2332 2333 /** 2334 * ap_mlme_vdev_csa_complete() - callback to initiate csa complete 2335 * 2336 * @vdev_mlme: vdev mlme object 2337 * 2338 * This function is called for csa complete indication 2339 * 2340 * Return: QDF_STATUS 2341 */ ap_mlme_vdev_csa_complete(struct vdev_mlme_obj * vdev_mlme)2342 static QDF_STATUS ap_mlme_vdev_csa_complete(struct vdev_mlme_obj *vdev_mlme) 2343 2344 { 2345 uint8_t vdev_id; 2346 2347 vdev_id = wlan_vdev_get_id(vdev_mlme->vdev); 2348 mlme_legacy_debug("vdev id = %d ", vdev_id); 2349 2350 if (lim_is_csa_tx_pending(vdev_id)) 2351 lim_send_csa_tx_complete(vdev_id); 2352 else 2353 mlme_legacy_debug("CSAIE_TX_COMPLETE_IND already sent"); 2354 2355 return QDF_STATUS_SUCCESS; 2356 } 2357 2358 #ifdef WLAN_FEATURE_LL_LT_SAP 2359 QDF_STATUS wlan_ll_sap_sort_channel_list(uint8_t vdev_id,qdf_list_t * list,struct sap_sel_ch_info * ch_info)2360 wlan_ll_sap_sort_channel_list(uint8_t vdev_id, qdf_list_t *list, 2361 struct sap_sel_ch_info *ch_info) 2362 { 2363 return wlansap_sort_channel_list(vdev_id, list, ch_info); 2364 } 2365 wlan_ll_sap_free_chan_info(struct sap_sel_ch_info * ch_param)2366 void wlan_ll_sap_free_chan_info(struct sap_sel_ch_info *ch_param) 2367 { 2368 return wlansap_free_chan_info(ch_param); 2369 } 2370 wlan_ll_sap_freq_present_in_pcl(struct policy_mgr_pcl_list * pcl,qdf_freq_t freq)2371 bool wlan_ll_sap_freq_present_in_pcl(struct policy_mgr_pcl_list *pcl, 2372 qdf_freq_t freq) 2373 { 2374 uint8_t i; 2375 2376 for (i = 0; i < pcl->pcl_len; i++) { 2377 if (pcl->pcl_list[i] == freq) 2378 return true; 2379 } 2380 2381 return false; 2382 } 2383 #endif 2384 2385 void wlan_sap_get_user_config_acs_ch_list(uint8_t vdev_id,struct scan_filter * filter)2386 wlan_sap_get_user_config_acs_ch_list(uint8_t vdev_id, 2387 struct scan_filter *filter) 2388 { 2389 wlansap_get_user_config_acs_ch_list(vdev_id, filter); 2390 } 2391 2392 static struct vdev_mlme_ops sta_mlme_ops = { 2393 .mlme_vdev_start_send = sta_mlme_vdev_start_send, 2394 .mlme_vdev_restart_send = sta_mlme_vdev_restart_send, 2395 .mlme_vdev_start_continue = sta_mlme_start_continue, 2396 .mlme_vdev_start_req_failed = sta_mlme_vdev_start_req_failed, 2397 .mlme_vdev_sta_conn_start = sta_mlme_vdev_start_connection, 2398 .mlme_vdev_up_send = sta_mlme_vdev_up_send, 2399 .mlme_vdev_notify_up_complete = sta_mlme_vdev_notify_up_complete, 2400 .mlme_vdev_notify_roam_start = sta_mlme_vdev_notify_roam_start, 2401 .mlme_vdev_disconnect_peers = sta_mlme_vdev_disconnect_bss, 2402 .mlme_vdev_stop_send = sta_mlme_vdev_stop_send, 2403 .mlme_vdev_stop_continue = vdevmgr_mlme_stop_continue, 2404 .mlme_vdev_down_send = vdevmgr_mlme_vdev_down_send, 2405 .mlme_vdev_notify_down_complete = vdevmgr_notify_down_complete, 2406 .mlme_vdev_ext_stop_rsp = vdevmgr_vdev_stop_rsp_handle, 2407 .mlme_vdev_ext_start_rsp = vdevmgr_vdev_start_rsp_handle, 2408 .mlme_vdev_sta_disconn_start = sta_mlme_vdev_sta_disconnect_start, 2409 .mlme_vdev_ext_peer_delete_all_rsp = 2410 vdevmgr_vdev_peer_delete_all_rsp_handle, 2411 #ifdef WLAN_FEATURE_11BE_MLO 2412 .mlme_vdev_reconfig_notify = 2413 vdevmgr_vdev_reconfig_notify, 2414 .mlme_vdev_reconfig_timer_complete = 2415 vdevmgr_vdev_reconfig_timer_complete, 2416 .mlme_vdev_reconfig_notify_standby = 2417 vdevmgr_vdev_reconfig_notify_standby, 2418 2419 #endif 2420 }; 2421 2422 static struct vdev_mlme_ops ap_mlme_ops = { 2423 .mlme_vdev_start_send = ap_mlme_vdev_start_send, 2424 .mlme_vdev_restart_send = ap_mlme_vdev_restart_send, 2425 .mlme_vdev_stop_start_send = ap_mlme_vdev_stop_start_send, 2426 .mlme_vdev_start_continue = ap_mlme_start_continue, 2427 .mlme_vdev_start_req_failed = ap_mlme_vdev_start_req_failed, 2428 .mlme_vdev_up_send = ap_mlme_vdev_up_send, 2429 .mlme_vdev_notify_up_complete = ap_mlme_vdev_notify_up_complete, 2430 .mlme_vdev_update_beacon = ap_mlme_vdev_update_beacon, 2431 .mlme_vdev_disconnect_peers = ap_mlme_vdev_disconnect_peers, 2432 .mlme_vdev_dfs_cac_timer_stop = ap_vdev_dfs_cac_timer_stop, 2433 .mlme_vdev_stop_send = ap_mlme_vdev_stop_send, 2434 .mlme_vdev_stop_continue = vdevmgr_mlme_stop_continue, 2435 .mlme_vdev_down_send = vdevmgr_mlme_vdev_down_send, 2436 .mlme_vdev_notify_down_complete = vdevmgr_notify_down_complete, 2437 .mlme_vdev_is_newchan_no_cac = ap_mlme_vdev_is_newchan_no_cac, 2438 .mlme_vdev_ext_stop_rsp = vdevmgr_vdev_stop_rsp_handle, 2439 .mlme_vdev_ext_start_rsp = vdevmgr_vdev_start_rsp_handle, 2440 .mlme_vdev_ext_peer_delete_all_rsp = 2441 vdevmgr_vdev_peer_delete_all_rsp_handle, 2442 .mlme_vdev_csa_complete = ap_mlme_vdev_csa_complete, 2443 }; 2444 2445 static struct vdev_mlme_ops mon_mlme_ops = { 2446 .mlme_vdev_start_send = mon_mlme_vdev_start_restart_send, 2447 .mlme_vdev_restart_send = mon_mlme_vdev_start_restart_send, 2448 .mlme_vdev_start_continue = mon_mlme_start_continue, 2449 .mlme_vdev_up_send = mon_mlme_vdev_up_send, 2450 .mlme_vdev_disconnect_peers = mon_mlme_vdev_disconnect_peers, 2451 .mlme_vdev_stop_send = mon_mlme_vdev_stop_send, 2452 .mlme_vdev_down_send = mon_mlme_vdev_down_send, 2453 .mlme_vdev_ext_start_rsp = vdevmgr_vdev_start_rsp_handle, 2454 }; 2455 2456 static struct mlme_ext_ops ext_ops = { 2457 .mlme_psoc_ext_hdl_create = psoc_mlme_ext_hdl_create, 2458 .mlme_psoc_ext_hdl_destroy = psoc_mlme_ext_hdl_destroy, 2459 .mlme_vdev_ext_hdl_create = vdevmgr_mlme_ext_hdl_create, 2460 .mlme_vdev_ext_hdl_destroy = vdevmgr_mlme_ext_hdl_destroy, 2461 .mlme_vdev_ext_hdl_post_create = vdevmgr_mlme_ext_post_hdl_create, 2462 .mlme_vdev_ext_delete_rsp = vdevmgr_vdev_delete_rsp_handle, 2463 .mlme_cm_ext_hdl_create_cb = cm_ext_hdl_create, 2464 .mlme_cm_ext_hdl_destroy_cb = cm_ext_hdl_destroy, 2465 .mlme_cm_ext_connect_start_ind_cb = cm_connect_start_ind, 2466 .mlme_cm_ext_connect_req_cb = cm_handle_connect_req, 2467 .mlme_cm_ext_bss_peer_create_req_cb = cm_send_bss_peer_create_req, 2468 .mlme_cm_ext_connect_complete_ind_cb = cm_connect_complete_ind, 2469 .mlme_cm_ext_disconnect_start_ind_cb = cm_disconnect_start_ind, 2470 .mlme_cm_ext_disconnect_req_cb = cm_handle_disconnect_req, 2471 .mlme_cm_ext_bss_peer_delete_req_cb = cm_send_bss_peer_delete_req, 2472 .mlme_cm_ext_disconnect_complete_ind_cb = cm_disconnect_complete_ind, 2473 .mlme_cm_ext_vdev_down_req_cb = cm_send_vdev_down_req, 2474 .mlme_cm_ext_reassoc_req_cb = cm_handle_reassoc_req, 2475 .mlme_cm_ext_roam_start_ind_cb = cm_handle_roam_start, 2476 .mlme_psoc_ext_hdl_enable = psoc_mlme_ext_hdl_enable, 2477 .mlme_psoc_ext_hdl_disable = psoc_mlme_ext_hdl_disable, 2478 #ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE 2479 .mlme_vdev_send_set_mac_addr = vdevmgr_mlme_vdev_send_set_mac_addr, 2480 #endif 2481 .mlme_cm_ext_rso_stop_cb = cm_send_rso_stop, 2482 }; 2483 2484 #ifdef WLAN_FEATURE_11BE_MLO 2485 static struct mlo_mlme_ext_ops mlo_ext_ops = { 2486 .mlo_mlme_ext_peer_create = lim_mlo_proc_assoc_req_frm, 2487 .mlo_mlme_ext_peer_delete = lim_mlo_cleanup_partner_peer, 2488 .mlo_mlme_ext_peer_assoc_fail = lim_mlo_ap_sta_assoc_fail, 2489 .mlo_mlme_ext_assoc_resp = lim_mlo_ap_sta_assoc_suc, 2490 .mlo_mlme_ext_handle_sta_csa_param = lim_handle_mlo_sta_csa_param, 2491 }; 2492 #endif 2493