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 public APIs exposed by the mlme component 21 */ 22 23 #include "cfg_ucfg_api.h" 24 #include "wlan_mlme_main.h" 25 #include "wlan_mlme_ucfg_api.h" 26 #include "wma_types.h" 27 #include "wmi_unified.h" 28 #include "wma.h" 29 #include "wma_internal.h" 30 #include "wlan_crypto_global_api.h" 31 #include "wlan_utility.h" 32 #include "wlan_policy_mgr_ucfg.h" 33 #include "wlan_vdev_mgr_utils_api.h" 34 #include <../../core/src/wlan_cm_vdev_api.h> 35 #include "wlan_psoc_mlme_api.h" 36 #include "wlan_action_oui_main.h" 37 #include "target_if.h" 38 #include "wlan_vdev_mgr_tgt_if_tx_api.h" 39 #include "wmi_unified_vdev_api.h" 40 #include "wlan_mlme_api.h" 41 #include "../../core/src/wlan_cp_stats_defs.h" 42 #include "wlan_reg_services_api.h" 43 44 /* quota in milliseconds */ 45 #define MCC_DUTY_CYCLE 70 46 47 QDF_STATUS wlan_mlme_get_cfg_str(uint8_t *dst, struct mlme_cfg_str *cfg_str, 48 qdf_size_t *len) 49 { 50 if (*len < cfg_str->len) { 51 mlme_legacy_err("Invalid len %zd", *len); 52 return QDF_STATUS_E_INVAL; 53 } 54 55 *len = cfg_str->len; 56 qdf_mem_copy(dst, cfg_str->data, *len); 57 58 return QDF_STATUS_SUCCESS; 59 } 60 61 QDF_STATUS wlan_mlme_set_cfg_str(uint8_t *src, struct mlme_cfg_str *dst_cfg_str, 62 qdf_size_t len) 63 { 64 if (len > dst_cfg_str->max_len) { 65 mlme_legacy_err("Invalid len %zd (>%zd)", len, 66 dst_cfg_str->max_len); 67 return QDF_STATUS_E_INVAL; 68 } 69 70 dst_cfg_str->len = len; 71 qdf_mem_copy(dst_cfg_str->data, src, len); 72 73 return QDF_STATUS_SUCCESS; 74 } 75 76 uint8_t wlan_mlme_get_tx_power(struct wlan_objmgr_psoc *psoc, 77 enum band_info band) 78 { 79 struct wlan_mlme_psoc_ext_obj *mlme_obj; 80 81 mlme_obj = mlme_get_psoc_ext_obj(psoc); 82 if (!mlme_obj) 83 return 0; 84 85 switch (band) { 86 case BAND_2G: 87 return mlme_obj->cfg.power.tx_power_2g; 88 case BAND_5G: 89 return mlme_obj->cfg.power.tx_power_5g; 90 default: 91 break; 92 } 93 return 0; 94 } 95 96 char *wlan_mlme_get_power_usage(struct wlan_objmgr_psoc *psoc) 97 { 98 struct wlan_mlme_psoc_ext_obj *mlme_obj; 99 100 mlme_obj = mlme_get_psoc_ext_obj(psoc); 101 if (!mlme_obj) 102 return NULL; 103 104 return mlme_obj->cfg.power.power_usage.data; 105 } 106 107 QDF_STATUS 108 wlan_mlme_get_enable_deauth_to_disassoc_map(struct wlan_objmgr_psoc *psoc, 109 bool *value) 110 { 111 struct wlan_mlme_psoc_ext_obj *mlme_obj; 112 113 mlme_obj = mlme_get_psoc_ext_obj(psoc); 114 if (!mlme_obj) 115 return QDF_STATUS_E_INVAL; 116 117 *value = mlme_obj->cfg.gen.enable_deauth_to_disassoc_map; 118 return QDF_STATUS_SUCCESS; 119 } 120 121 QDF_STATUS wlan_mlme_get_ht_cap_info(struct wlan_objmgr_psoc *psoc, 122 struct mlme_ht_capabilities_info 123 *ht_cap_info) 124 { 125 struct wlan_mlme_psoc_ext_obj *mlme_obj; 126 127 mlme_obj = mlme_get_psoc_ext_obj(psoc); 128 if (!mlme_obj) 129 return QDF_STATUS_E_FAILURE; 130 131 *ht_cap_info = mlme_obj->cfg.ht_caps.ht_cap_info; 132 133 return QDF_STATUS_SUCCESS; 134 } 135 136 QDF_STATUS wlan_mlme_set_ht_cap_info(struct wlan_objmgr_psoc *psoc, 137 struct mlme_ht_capabilities_info 138 ht_cap_info) 139 { 140 struct wlan_mlme_psoc_ext_obj *mlme_obj; 141 142 mlme_obj = mlme_get_psoc_ext_obj(psoc); 143 if (!mlme_obj) 144 return QDF_STATUS_E_FAILURE; 145 146 mlme_obj->cfg.ht_caps.ht_cap_info = ht_cap_info; 147 148 return QDF_STATUS_SUCCESS; 149 } 150 151 QDF_STATUS wlan_mlme_get_max_amsdu_num(struct wlan_objmgr_psoc *psoc, 152 uint8_t *value) 153 { 154 struct wlan_mlme_psoc_ext_obj *mlme_obj; 155 156 mlme_obj = mlme_get_psoc_ext_obj(psoc); 157 if (!mlme_obj) 158 return QDF_STATUS_E_FAILURE; 159 160 *value = mlme_obj->cfg.ht_caps.max_num_amsdu; 161 162 return QDF_STATUS_SUCCESS; 163 } 164 165 QDF_STATUS wlan_mlme_set_max_amsdu_num(struct wlan_objmgr_psoc *psoc, 166 uint8_t value) 167 { 168 struct wlan_mlme_psoc_ext_obj *mlme_obj; 169 170 mlme_obj = mlme_get_psoc_ext_obj(psoc); 171 if (!mlme_obj) 172 return QDF_STATUS_E_FAILURE; 173 174 if (!cfg_in_range(CFG_MAX_AMSDU_NUM, value)) { 175 mlme_legacy_err("Error in setting Max AMSDU Num"); 176 return QDF_STATUS_E_INVAL; 177 } 178 179 mlme_obj->cfg.ht_caps.max_num_amsdu = value; 180 181 return QDF_STATUS_SUCCESS; 182 } 183 184 QDF_STATUS wlan_mlme_get_ht_mpdu_density(struct wlan_objmgr_psoc *psoc, 185 uint8_t *value) 186 { 187 struct wlan_mlme_psoc_ext_obj *mlme_obj; 188 189 mlme_obj = mlme_get_psoc_ext_obj(psoc); 190 if (!mlme_obj) 191 return QDF_STATUS_E_FAILURE; 192 193 *value = (uint8_t)mlme_obj->cfg.ht_caps.ampdu_params.mpdu_density; 194 195 return QDF_STATUS_SUCCESS; 196 } 197 198 QDF_STATUS wlan_mlme_set_ht_mpdu_density(struct wlan_objmgr_psoc *psoc, 199 uint8_t value) 200 { 201 struct wlan_mlme_psoc_ext_obj *mlme_obj; 202 203 mlme_obj = mlme_get_psoc_ext_obj(psoc); 204 if (!mlme_obj) 205 return QDF_STATUS_E_FAILURE; 206 207 if (!cfg_in_range(CFG_MPDU_DENSITY, value)) { 208 mlme_legacy_err("Invalid value %d", value); 209 return QDF_STATUS_E_INVAL; 210 } 211 212 mlme_obj->cfg.ht_caps.ampdu_params.mpdu_density = value; 213 214 return QDF_STATUS_SUCCESS; 215 } 216 217 #ifdef MULTI_CLIENT_LL_SUPPORT 218 bool wlan_mlme_get_wlm_multi_client_ll_caps(struct wlan_objmgr_psoc *psoc) 219 { 220 return wlan_psoc_nif_fw_ext2_cap_get(psoc, 221 WLAN_SOC_WLM_MULTI_CLIENT_LL_SUPPORT); 222 } 223 #endif 224 225 #ifdef FEATURE_WLAN_CH_AVOID_EXT 226 bool wlan_mlme_get_coex_unsafe_chan_nb_user_prefer( 227 struct wlan_objmgr_psoc *psoc) 228 { 229 struct wlan_mlme_psoc_ext_obj *mlme_obj; 230 231 mlme_obj = mlme_get_psoc_ext_obj(psoc); 232 if (!mlme_obj) { 233 mlme_legacy_err("Failed to get MLME Obj"); 234 return cfg_default(CFG_COEX_UNSAFE_CHAN_NB_USER_PREFER); 235 } 236 return mlme_obj->cfg.reg.coex_unsafe_chan_nb_user_prefer; 237 } 238 #endif 239 240 QDF_STATUS wlan_mlme_get_band_capability(struct wlan_objmgr_psoc *psoc, 241 uint32_t *band_capability) 242 { 243 struct wlan_mlme_psoc_ext_obj *mlme_obj; 244 245 mlme_obj = mlme_get_psoc_ext_obj(psoc); 246 if (!mlme_obj) 247 return QDF_STATUS_E_FAILURE; 248 249 *band_capability = mlme_obj->cfg.gen.band_capability; 250 251 return QDF_STATUS_SUCCESS; 252 } 253 254 #ifdef QCA_MULTIPASS_SUPPORT 255 QDF_STATUS 256 wlan_mlme_peer_config_vlan(struct wlan_objmgr_vdev *vdev, 257 uint8_t *mac_addr) 258 { 259 QDF_STATUS status; 260 wmi_unified_t wmi_handle; 261 struct peer_vlan_config_param param; 262 263 wmi_handle = get_wmi_unified_hdl_from_pdev(wlan_vdev_get_pdev(vdev)); 264 if (!wmi_handle) { 265 mlme_err("unable to get wmi_handle"); 266 return QDF_STATUS_E_INVAL; 267 } 268 269 qdf_mem_set(¶m, sizeof(param), 0); 270 271 param.rx_cmd = 1; 272 /* Enabling Rx_insert_inner_vlan_tag */ 273 param.rx_insert_c_tag = 1; 274 param.vdev_id = wlan_vdev_get_id(vdev); 275 276 status = wmi_send_peer_vlan_config(wmi_handle, mac_addr, param); 277 if (QDF_IS_STATUS_ERROR(status)) 278 return status; 279 280 return QDF_STATUS_SUCCESS; 281 } 282 #endif 283 284 QDF_STATUS wlan_mlme_set_band_capability(struct wlan_objmgr_psoc *psoc, 285 uint32_t band_capability) 286 287 { 288 struct wlan_mlme_psoc_ext_obj *mlme_obj; 289 290 mlme_obj = mlme_get_psoc_ext_obj(psoc); 291 if (!mlme_obj) 292 return QDF_STATUS_E_FAILURE; 293 294 mlme_obj->cfg.gen.band_capability = band_capability; 295 296 return QDF_STATUS_SUCCESS; 297 } 298 299 #ifdef WLAN_VENDOR_HANDOFF_CONTROL 300 bool wlan_mlme_get_vendor_handoff_control_caps(struct wlan_objmgr_psoc *psoc) 301 { 302 return wlan_psoc_nif_fw_ext2_cap_get(psoc, 303 WLAN_SOC_VENDOR_HANDOFF_CONTROL); 304 } 305 #endif 306 307 QDF_STATUS wlan_mlme_set_dual_sta_policy(struct wlan_objmgr_psoc *psoc, 308 uint8_t dual_sta_config) 309 310 { 311 struct wlan_mlme_psoc_ext_obj *mlme_obj; 312 313 mlme_obj = mlme_get_psoc_ext_obj(psoc); 314 if (!mlme_obj) 315 return QDF_STATUS_E_FAILURE; 316 317 mlme_obj->cfg.gen.dual_sta_policy.concurrent_sta_policy = 318 dual_sta_config; 319 mlme_debug("Set dual_sta_config to :%d", dual_sta_config); 320 321 return QDF_STATUS_SUCCESS; 322 } 323 324 QDF_STATUS wlan_mlme_get_dual_sta_policy(struct wlan_objmgr_psoc *psoc, 325 uint8_t *dual_sta_config) 326 327 { 328 struct wlan_mlme_psoc_ext_obj *mlme_obj; 329 330 mlme_obj = mlme_get_psoc_ext_obj(psoc); 331 if (!mlme_obj) 332 return QDF_STATUS_E_FAILURE; 333 334 *dual_sta_config = 335 mlme_obj->cfg.gen.dual_sta_policy.concurrent_sta_policy; 336 337 return QDF_STATUS_SUCCESS; 338 } 339 340 enum host_concurrent_ap_policy 341 wlan_mlme_convert_ap_policy_config( 342 enum qca_wlan_concurrent_ap_policy_config ap_config) 343 { 344 switch (ap_config) { 345 case QCA_WLAN_CONCURRENT_AP_POLICY_UNSPECIFIED: 346 return HOST_CONCURRENT_AP_POLICY_UNSPECIFIED; 347 case QCA_WLAN_CONCURRENT_AP_POLICY_GAMING_AUDIO: 348 return HOST_CONCURRENT_AP_POLICY_GAMING_AUDIO; 349 case QCA_WLAN_CONCURRENT_AP_POLICY_LOSSLESS_AUDIO_STREAMING: 350 return HOST_CONCURRENT_AP_POLICY_LOSSLESS_AUDIO_STREAMING; 351 case QCA_WLAN_CONCURRENT_AP_POLICY_XR: 352 return HOST_CONCURRENT_AP_POLICY_XR; 353 default: 354 return HOST_CONCURRENT_AP_POLICY_UNSPECIFIED; 355 } 356 } 357 358 void wlan_mlme_ll_lt_sap_send_oce_flags_fw(struct wlan_objmgr_vdev *vdev) 359 { 360 struct wlan_objmgr_psoc *psoc = NULL; 361 uint8_t vdev_id; 362 uint8_t updated_fw_value = 0; 363 struct wlan_mlme_psoc_ext_obj *mlme_obj; 364 365 psoc = wlan_vdev_get_psoc(vdev); 366 if (!psoc) 367 return; 368 369 mlme_obj = mlme_get_psoc_ext_obj(psoc); 370 371 if (!mlme_obj) 372 return; 373 374 updated_fw_value = mlme_obj->cfg.oce.feature_bitmap; 375 vdev_id = wlan_vdev_get_id(vdev); 376 wma_debug("Vdev %d Disable FILS discovery", vdev_id); 377 updated_fw_value &= ~(WMI_VDEV_OCE_FILS_DISCOVERY_FRAME_FEATURE_BITMAP); 378 if (wma_cli_set_command(vdev_id, 379 wmi_vdev_param_enable_disable_oce_features, 380 updated_fw_value, VDEV_CMD)) 381 mlme_legacy_err("Vdev %d failed to send OCE update", vdev_id); 382 } 383 384 QDF_STATUS wlan_mlme_set_ap_policy(struct wlan_objmgr_vdev *vdev, 385 enum host_concurrent_ap_policy ap_cfg_policy) 386 387 { 388 struct mlme_legacy_priv *mlme_priv; 389 390 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 391 if (!mlme_priv) { 392 mlme_legacy_err("vdev legacy private object is NULL"); 393 return QDF_STATUS_E_FAILURE; 394 } 395 396 mlme_priv->mlme_ap.ap_policy = ap_cfg_policy; 397 mlme_debug("Set ap_cfg_policy to :%d", mlme_priv->mlme_ap.ap_policy); 398 399 return QDF_STATUS_SUCCESS; 400 } 401 402 enum host_concurrent_ap_policy 403 wlan_mlme_get_ap_policy(struct wlan_objmgr_vdev *vdev) 404 { 405 struct mlme_legacy_priv *mlme_priv; 406 407 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 408 if (!mlme_priv) { 409 mlme_legacy_err("vdev legacy private object is NULL"); 410 return HOST_CONCURRENT_AP_POLICY_UNSPECIFIED; 411 } 412 413 mlme_debug("Get ap_cfg_policy to :%d", mlme_priv->mlme_ap.ap_policy); 414 415 return mlme_priv->mlme_ap.ap_policy; 416 } 417 418 QDF_STATUS wlan_mlme_get_prevent_link_down(struct wlan_objmgr_psoc *psoc, 419 bool *prevent_link_down) 420 { 421 struct wlan_mlme_psoc_ext_obj *mlme_obj; 422 423 mlme_obj = mlme_get_psoc_ext_obj(psoc); 424 if (!mlme_obj) 425 return QDF_STATUS_E_FAILURE; 426 427 *prevent_link_down = mlme_obj->cfg.gen.prevent_link_down; 428 429 return QDF_STATUS_SUCCESS; 430 } 431 432 QDF_STATUS wlan_mlme_get_select_5ghz_margin(struct wlan_objmgr_psoc *psoc, 433 uint8_t *select_5ghz_margin) 434 { 435 struct wlan_mlme_psoc_ext_obj *mlme_obj; 436 437 mlme_obj = mlme_get_psoc_ext_obj(psoc); 438 if (!mlme_obj) 439 return QDF_STATUS_E_FAILURE; 440 441 *select_5ghz_margin = mlme_obj->cfg.gen.select_5ghz_margin; 442 443 return QDF_STATUS_SUCCESS; 444 } 445 446 QDF_STATUS wlan_mlme_get_rtt_mac_randomization(struct wlan_objmgr_psoc *psoc, 447 bool *rtt_mac_randomization) 448 { 449 struct wlan_mlme_psoc_ext_obj *mlme_obj; 450 451 mlme_obj = mlme_get_psoc_ext_obj(psoc); 452 if (!mlme_obj) 453 return QDF_STATUS_E_FAILURE; 454 455 *rtt_mac_randomization = mlme_obj->cfg.gen.rtt_mac_randomization; 456 457 return QDF_STATUS_SUCCESS; 458 } 459 460 QDF_STATUS wlan_mlme_get_crash_inject(struct wlan_objmgr_psoc *psoc, 461 bool *crash_inject) 462 { 463 struct wlan_mlme_psoc_ext_obj *mlme_obj; 464 465 mlme_obj = mlme_get_psoc_ext_obj(psoc); 466 if (!mlme_obj) 467 return QDF_STATUS_E_FAILURE; 468 469 *crash_inject = mlme_obj->cfg.gen.crash_inject; 470 471 return QDF_STATUS_SUCCESS; 472 } 473 474 QDF_STATUS wlan_mlme_get_lpass_support(struct wlan_objmgr_psoc *psoc, 475 bool *lpass_support) 476 { 477 struct wlan_mlme_psoc_ext_obj *mlme_obj; 478 479 mlme_obj = mlme_get_psoc_ext_obj(psoc); 480 if (!mlme_obj) 481 return QDF_STATUS_E_FAILURE; 482 483 *lpass_support = mlme_obj->cfg.gen.lpass_support; 484 485 return QDF_STATUS_SUCCESS; 486 } 487 488 void wlan_mlme_get_wls_6ghz_cap(struct wlan_objmgr_psoc *psoc, 489 bool *wls_6ghz_capable) 490 { 491 struct wlan_mlme_psoc_ext_obj *mlme_obj; 492 493 mlme_obj = mlme_get_psoc_ext_obj(psoc); 494 if (!mlme_obj) { 495 *wls_6ghz_capable = cfg_default(CFG_WLS_6GHZ_CAPABLE); 496 return; 497 } 498 *wls_6ghz_capable = mlme_obj->cfg.gen.wls_6ghz_capable; 499 } 500 501 QDF_STATUS wlan_mlme_get_self_recovery(struct wlan_objmgr_psoc *psoc, 502 bool *self_recovery) 503 { 504 struct wlan_mlme_psoc_ext_obj *mlme_obj; 505 506 mlme_obj = mlme_get_psoc_ext_obj(psoc); 507 if (!mlme_obj) 508 return QDF_STATUS_E_FAILURE; 509 510 *self_recovery = mlme_obj->cfg.gen.self_recovery; 511 512 return QDF_STATUS_SUCCESS; 513 } 514 515 QDF_STATUS wlan_mlme_get_sub_20_chan_width(struct wlan_objmgr_psoc *psoc, 516 uint8_t *sub_20_chan_width) 517 { 518 struct wlan_mlme_psoc_ext_obj *mlme_obj; 519 520 mlme_obj = mlme_get_psoc_ext_obj(psoc); 521 if (!mlme_obj) 522 return QDF_STATUS_E_FAILURE; 523 524 *sub_20_chan_width = mlme_obj->cfg.gen.sub_20_chan_width; 525 526 return QDF_STATUS_SUCCESS; 527 } 528 529 QDF_STATUS wlan_mlme_get_fw_timeout_crash(struct wlan_objmgr_psoc *psoc, 530 bool *fw_timeout_crash) 531 { 532 struct wlan_mlme_psoc_ext_obj *mlme_obj; 533 534 mlme_obj = mlme_get_psoc_ext_obj(psoc); 535 if (!mlme_obj) 536 return QDF_STATUS_E_FAILURE; 537 538 *fw_timeout_crash = mlme_obj->cfg.gen.fw_timeout_crash; 539 540 return QDF_STATUS_SUCCESS; 541 } 542 543 QDF_STATUS wlan_mlme_get_ito_repeat_count(struct wlan_objmgr_psoc *psoc, 544 uint8_t *ito_repeat_count) 545 { 546 struct wlan_mlme_psoc_ext_obj *mlme_obj; 547 548 mlme_obj = mlme_get_psoc_ext_obj(psoc); 549 if (!mlme_obj) 550 return QDF_STATUS_E_FAILURE; 551 552 *ito_repeat_count = mlme_obj->cfg.gen.ito_repeat_count; 553 554 return QDF_STATUS_SUCCESS; 555 } 556 557 void wlan_mlme_get_sap_inactivity_override(struct wlan_objmgr_psoc *psoc, 558 bool *val) 559 { 560 struct wlan_mlme_psoc_ext_obj *mlme_obj; 561 562 mlme_obj = mlme_get_psoc_ext_obj(psoc); 563 if (!mlme_obj) 564 return; 565 566 *val = mlme_obj->cfg.qos_mlme_params.sap_max_inactivity_override; 567 } 568 569 QDF_STATUS wlan_mlme_get_acs_with_more_param(struct wlan_objmgr_psoc *psoc, 570 bool *value) 571 { 572 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 573 574 if (!mlme_obj) 575 return QDF_STATUS_E_FAILURE; 576 577 *value = mlme_obj->cfg.acs.is_acs_with_more_param; 578 return QDF_STATUS_SUCCESS; 579 } 580 581 QDF_STATUS wlan_mlme_get_auto_channel_weight(struct wlan_objmgr_psoc *psoc, 582 uint32_t *value) 583 { 584 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 585 586 if (!mlme_obj) { 587 *value = cfg_default(CFG_AUTO_CHANNEL_SELECT_WEIGHT); 588 return QDF_STATUS_E_FAILURE; 589 } 590 591 *value = mlme_obj->cfg.acs.auto_channel_select_weight; 592 return QDF_STATUS_SUCCESS; 593 } 594 595 QDF_STATUS wlan_mlme_get_vendor_acs_support(struct wlan_objmgr_psoc *psoc, 596 bool *value) 597 { 598 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 599 600 if (!mlme_obj) 601 return QDF_STATUS_E_FAILURE; 602 603 *value = mlme_obj->cfg.acs.is_vendor_acs_support; 604 return QDF_STATUS_SUCCESS; 605 } 606 607 QDF_STATUS 608 wlan_mlme_get_acs_support_for_dfs_ltecoex(struct wlan_objmgr_psoc *psoc, 609 bool *value) 610 { 611 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 612 613 if (!mlme_obj) 614 return QDF_STATUS_E_FAILURE; 615 616 *value = mlme_obj->cfg.acs.is_acs_support_for_dfs_ltecoex; 617 return QDF_STATUS_SUCCESS; 618 } 619 620 QDF_STATUS 621 wlan_mlme_get_external_acs_policy(struct wlan_objmgr_psoc *psoc, 622 bool *value) 623 { 624 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 625 626 if (!mlme_obj) 627 return QDF_STATUS_E_FAILURE; 628 629 *value = mlme_obj->cfg.acs.is_external_acs_policy; 630 return QDF_STATUS_SUCCESS; 631 } 632 633 QDF_STATUS wlan_mlme_get_tx_chainmask_cck(struct wlan_objmgr_psoc *psoc, 634 bool *value) 635 { 636 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 637 638 if (!mlme_obj) 639 return QDF_STATUS_E_FAILURE; 640 641 *value = mlme_obj->cfg.chainmask_cfg.tx_chain_mask_cck; 642 return QDF_STATUS_SUCCESS; 643 } 644 645 QDF_STATUS wlan_mlme_get_tx_chainmask_1ss(struct wlan_objmgr_psoc *psoc, 646 uint8_t *value) 647 { 648 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 649 650 if (!mlme_obj) 651 return QDF_STATUS_E_FAILURE; 652 653 *value = mlme_obj->cfg.chainmask_cfg.tx_chain_mask_1ss; 654 return QDF_STATUS_SUCCESS; 655 } 656 657 bool 658 wlan_mlme_is_data_stall_recovery_fw_supported(struct wlan_objmgr_psoc *psoc) 659 { 660 struct wlan_mlme_psoc_ext_obj *mlme_obj; 661 662 mlme_obj = mlme_get_psoc_ext_obj(psoc); 663 if (!mlme_obj) { 664 mlme_err("MLME obj is NULL"); 665 return false; 666 } 667 668 return mlme_obj->cfg.gen.data_stall_recovery_fw_support; 669 } 670 671 void 672 wlan_mlme_update_cfg_with_tgt_caps(struct wlan_objmgr_psoc *psoc, 673 struct mlme_tgt_caps *tgt_caps) 674 { 675 struct wlan_mlme_psoc_ext_obj *mlme_obj; 676 677 mlme_obj = mlme_get_psoc_ext_obj(psoc); 678 if (!mlme_obj) 679 return; 680 681 /* Update the mlme cfg according to the tgt capability received */ 682 683 mlme_obj->cfg.gen.data_stall_recovery_fw_support = 684 tgt_caps->data_stall_recovery_fw_support; 685 686 mlme_obj->cfg.gen.bigtk_support = tgt_caps->bigtk_support; 687 mlme_obj->cfg.gen.stop_all_host_scan_support = 688 tgt_caps->stop_all_host_scan_support; 689 mlme_obj->cfg.gen.dual_sta_roam_fw_support = 690 tgt_caps->dual_sta_roam_fw_support; 691 mlme_obj->cfg.gen.ocv_support = tgt_caps->ocv_support; 692 } 693 694 void 695 wlan_mlme_update_aux_dev_caps( 696 struct wlan_objmgr_psoc *psoc, 697 struct wlan_mlme_aux_dev_caps wlan_mlme_aux_dev_caps[]) 698 { 699 struct wlan_mlme_psoc_ext_obj *mlme_obj; 700 701 mlme_obj = mlme_get_psoc_ext_obj(psoc); 702 if (!mlme_obj) 703 return; 704 705 qdf_mem_copy(&mlme_obj->cfg.gen.wlan_mlme_aux0_dev_caps[0], 706 &wlan_mlme_aux_dev_caps[0], 707 sizeof(mlme_obj->cfg.gen.wlan_mlme_aux0_dev_caps)); 708 } 709 710 bool wlan_mlme_cfg_get_aux_supported_modes( 711 struct wlan_objmgr_psoc *psoc, 712 uint32_t aux_index, 713 enum wlan_mlme_hw_mode_config_type hw_mode_id, 714 uint32_t *supported_modes_bitmap) 715 { 716 struct wlan_mlme_psoc_ext_obj *mlme_obj; 717 struct wlan_mlme_aux_dev_caps *wlan_mlme_aux0_dev_caps; 718 719 if (aux_index != 0) { 720 mlme_err("current only support aux0"); 721 return false; 722 } 723 724 if (hw_mode_id >= WLAN_MLME_HW_MODE_MAX) { 725 mlme_err("invalid hw mode id %d.", hw_mode_id); 726 return false; 727 } 728 729 mlme_obj = mlme_get_psoc_ext_obj(psoc); 730 if (!mlme_obj) { 731 mlme_err("MLME obj is NULL"); 732 return false; 733 } 734 wlan_mlme_aux0_dev_caps = mlme_obj->cfg.gen.wlan_mlme_aux0_dev_caps; 735 *supported_modes_bitmap = 736 wlan_mlme_aux0_dev_caps[hw_mode_id].supported_modes_bitmap; 737 return true; 738 } 739 740 /** 741 * wlan_mlme_is_aux_cap_support() - checking the corresponding capability 742 * @psoc: wlan_objmgr_psoc pointer 743 * @bit: the corresponding bit 744 * @hw_mode_id: hw mode id 745 * 746 * Return: true if corresponding capability supporting 747 */ 748 static bool 749 wlan_mlme_is_aux_cap_support(struct wlan_objmgr_psoc *psoc, 750 enum wlan_mlme_aux_caps_bit bit, 751 enum wlan_mlme_hw_mode_config_type hw_mode_id) 752 { 753 uint32_t supported_modes_bitmap = 0; 754 struct wlan_mlme_psoc_ext_obj *mlme_obj; 755 struct wlan_mlme_aux_dev_caps *wlan_mlme_aux0_dev_caps; 756 int idx; 757 758 mlme_obj = mlme_get_psoc_ext_obj(psoc); 759 if (!mlme_obj) { 760 mlme_err("MLME obj is NULL"); 761 return false; 762 } 763 764 wlan_mlme_aux0_dev_caps = mlme_obj->cfg.gen.wlan_mlme_aux0_dev_caps; 765 if (hw_mode_id >= WLAN_MLME_HW_MODE_MAX) { 766 for (idx = 0; idx < WLAN_MLME_HW_MODE_MAX; idx++) 767 supported_modes_bitmap |= 768 wlan_mlme_aux0_dev_caps[idx].supported_modes_bitmap; 769 } else { 770 supported_modes_bitmap = 771 wlan_mlme_aux0_dev_caps[hw_mode_id].supported_modes_bitmap; 772 } 773 774 return (supported_modes_bitmap & (0x1 << bit)) ? true : false; 775 } 776 777 bool 778 wlan_mlme_is_aux_scan_support(struct wlan_objmgr_psoc *psoc, 779 enum wlan_mlme_hw_mode_config_type hw_mode_id) 780 { 781 return wlan_mlme_is_aux_cap_support(psoc, WLAN_MLME_AUX_MODE_SCAN_BIT, 782 hw_mode_id); 783 } 784 785 bool 786 wlan_mlme_is_aux_listen_support(struct wlan_objmgr_psoc *psoc, 787 enum wlan_mlme_hw_mode_config_type hw_mode_id) 788 { 789 return wlan_mlme_is_aux_cap_support(psoc, WLAN_MLME_AUX_MODE_LISTEN_BIT, 790 hw_mode_id); 791 } 792 793 bool 794 wlan_mlme_is_aux_emlsr_support(struct wlan_objmgr_psoc *psoc, 795 enum wlan_mlme_hw_mode_config_type hw_mode_id) 796 { 797 return wlan_mlme_is_aux_cap_support(psoc, WLAN_MLME_AUX_MODE_EMLSR_BIT, 798 hw_mode_id); 799 } 800 801 #ifdef WLAN_FEATURE_11AX 802 QDF_STATUS wlan_mlme_cfg_get_he_ul_mumimo(struct wlan_objmgr_psoc *psoc, 803 uint32_t *value) 804 { 805 struct wlan_mlme_psoc_ext_obj *mlme_obj; 806 807 mlme_obj = mlme_get_psoc_ext_obj(psoc); 808 if (!mlme_obj) 809 return QDF_STATUS_E_FAILURE; 810 811 *value = mlme_obj->cfg.he_caps.dot11_he_cap.ul_mu; 812 813 return QDF_STATUS_SUCCESS; 814 } 815 816 QDF_STATUS mlme_cfg_get_he_caps(struct wlan_objmgr_psoc *psoc, 817 tDot11fIEhe_cap *he_cap) 818 { 819 struct wlan_mlme_psoc_ext_obj *mlme_obj; 820 821 mlme_obj = mlme_get_psoc_ext_obj(psoc); 822 if (!mlme_obj) 823 return QDF_STATUS_E_FAILURE; 824 825 *he_cap = mlme_obj->cfg.he_caps.he_cap_orig; 826 827 return QDF_STATUS_SUCCESS; 828 } 829 830 QDF_STATUS wlan_mlme_cfg_set_he_ul_mumimo(struct wlan_objmgr_psoc *psoc, 831 uint32_t value) 832 { 833 struct wlan_mlme_psoc_ext_obj *mlme_obj; 834 835 mlme_obj = mlme_get_psoc_ext_obj(psoc); 836 if (!mlme_obj) 837 return QDF_STATUS_E_FAILURE; 838 839 if (!cfg_in_range(CFG_HE_UL_MUMIMO, value)) { 840 mlme_legacy_debug("Failed to set CFG_HE_UL_MUMIMO with %d", 841 value); 842 return QDF_STATUS_E_FAILURE; 843 } 844 845 mlme_obj->cfg.he_caps.dot11_he_cap.ul_mu = value; 846 847 return QDF_STATUS_SUCCESS; 848 } 849 850 QDF_STATUS wlan_mlme_cfg_get_enable_ul_mimo(struct wlan_objmgr_psoc *psoc, 851 uint8_t *value) 852 { 853 struct wlan_mlme_psoc_ext_obj *mlme_obj; 854 855 mlme_obj = mlme_get_psoc_ext_obj(psoc); 856 if (!mlme_obj) 857 return QDF_STATUS_E_FAILURE; 858 859 *value = mlme_obj->cfg.he_caps.enable_ul_mimo; 860 861 return QDF_STATUS_SUCCESS; 862 } 863 864 QDF_STATUS wlan_mlme_cfg_get_enable_ul_ofdm(struct wlan_objmgr_psoc *psoc, 865 uint8_t *value) 866 { 867 struct wlan_mlme_psoc_ext_obj *mlme_obj; 868 869 mlme_obj = mlme_get_psoc_ext_obj(psoc); 870 if (!mlme_obj) 871 return QDF_STATUS_E_FAILURE; 872 873 874 *value = mlme_obj->cfg.he_caps.enable_ul_ofdm; 875 876 return QDF_STATUS_SUCCESS; 877 } 878 879 /* mlme_get_min_rate_cap() - get minimum capability for HE-MCS between 880 * ini value and fw capability. 881 * 882 * Rx HE-MCS Map and Tx HE-MCS Map subfields format where 2-bit indicates 883 * 0 indicates support for HE-MCS 0-7 for n spatial streams 884 * 1 indicates support for HE-MCS 0-9 for n spatial streams 885 * 2 indicates support for HE-MCS 0-11 for n spatial streams 886 * 3 indicates that n spatial streams is not supported for HE PPDUs 887 * 888 */ 889 static uint16_t mlme_get_min_rate_cap(uint16_t val1, uint16_t val2) 890 { 891 uint16_t ret = 0, i; 892 893 for (i = 0; i < 8; i++) { 894 if (((val1 >> (2 * i)) & 0x3) == 0x3 || 895 ((val2 >> (2 * i)) & 0x3) == 0x3) { 896 ret |= 0x3 << (2 * i); 897 continue; 898 } 899 ret |= QDF_MIN((val1 >> (2 * i)) & 0x3, 900 (val2 >> (2 * i)) & 0x3) << (2 * i); 901 } 902 return ret; 903 } 904 905 QDF_STATUS mlme_update_tgt_he_caps_in_cfg(struct wlan_objmgr_psoc *psoc, 906 struct wma_tgt_cfg *wma_cfg) 907 { 908 uint8_t chan_width; 909 QDF_STATUS status = QDF_STATUS_SUCCESS; 910 tDot11fIEhe_cap *he_cap = &wma_cfg->he_cap; 911 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 912 uint8_t value, twt_req, twt_resp; 913 uint16_t tx_mcs_map = 0; 914 uint16_t rx_mcs_map = 0; 915 uint8_t nss; 916 917 if (!mlme_obj) 918 return QDF_STATUS_E_FAILURE; 919 920 mlme_obj->cfg.he_caps.dot11_he_cap.present = 1; 921 mlme_obj->cfg.he_caps.dot11_he_cap.htc_he = he_cap->htc_he; 922 923 twt_req = QDF_MIN(he_cap->twt_request, 924 mlme_obj->cfg.he_caps.dot11_he_cap.twt_request); 925 mlme_obj->cfg.he_caps.dot11_he_cap.twt_request = twt_req; 926 927 twt_resp = QDF_MIN(he_cap->twt_responder, 928 mlme_obj->cfg.he_caps.dot11_he_cap.twt_responder); 929 mlme_obj->cfg.he_caps.dot11_he_cap.twt_responder = twt_resp; 930 931 value = QDF_MIN(he_cap->fragmentation, 932 mlme_obj->cfg.he_caps.he_dynamic_fragmentation); 933 934 if (cfg_in_range(CFG_HE_FRAGMENTATION, value)) 935 mlme_obj->cfg.he_caps.dot11_he_cap.fragmentation = value; 936 937 if (cfg_in_range(CFG_HE_MAX_FRAG_MSDU, 938 he_cap->max_num_frag_msdu_amsdu_exp)) 939 mlme_obj->cfg.he_caps.dot11_he_cap.max_num_frag_msdu_amsdu_exp = 940 he_cap->max_num_frag_msdu_amsdu_exp; 941 if (cfg_in_range(CFG_HE_MIN_FRAG_SIZE, he_cap->min_frag_size)) 942 mlme_obj->cfg.he_caps.dot11_he_cap.min_frag_size = 943 he_cap->min_frag_size; 944 if (cfg_in_range(CFG_HE_TRIG_PAD, he_cap->trigger_frm_mac_pad)) 945 mlme_obj->cfg.he_caps.dot11_he_cap.trigger_frm_mac_pad = 946 QDF_MIN(he_cap->trigger_frm_mac_pad, 947 mlme_obj->cfg.he_caps.dot11_he_cap.trigger_frm_mac_pad); 948 if (cfg_in_range(CFG_HE_MTID_AGGR_RX, he_cap->multi_tid_aggr_rx_supp)) 949 mlme_obj->cfg.he_caps.dot11_he_cap.multi_tid_aggr_rx_supp = 950 he_cap->multi_tid_aggr_rx_supp; 951 if (cfg_in_range(CFG_HE_MTID_AGGR_TX, he_cap->multi_tid_aggr_tx_supp)) 952 mlme_obj->cfg.he_caps.dot11_he_cap.multi_tid_aggr_tx_supp = 953 he_cap->multi_tid_aggr_tx_supp; 954 if (cfg_in_range(CFG_HE_LINK_ADAPTATION, he_cap->he_link_adaptation)) 955 mlme_obj->cfg.he_caps.dot11_he_cap.he_link_adaptation = 956 he_cap->he_link_adaptation; 957 mlme_obj->cfg.he_caps.dot11_he_cap.all_ack = he_cap->all_ack; 958 mlme_obj->cfg.he_caps.dot11_he_cap.trigd_rsp_sched = 959 he_cap->trigd_rsp_sched; 960 mlme_obj->cfg.he_caps.dot11_he_cap.a_bsr = he_cap->a_bsr; 961 962 value = QDF_MIN(he_cap->broadcast_twt, 963 mlme_obj->cfg.he_caps.dot11_he_cap.broadcast_twt); 964 mlme_obj->cfg.he_caps.dot11_he_cap.broadcast_twt = value; 965 966 /* 967 * As per 802.11ax spec, Flexible TWT capability can be set 968 * independent of TWT Requestor/Responder capability. 969 * But currently we don't have any such usecase and firmware 970 * does not support it. Hence enabling Flexible TWT only when 971 * either or both of the TWT Requestor/Responder capability 972 * is set/enabled. 973 */ 974 value = QDF_MIN(he_cap->flex_twt_sched, (twt_req || twt_resp)); 975 mlme_obj->cfg.he_caps.dot11_he_cap.flex_twt_sched = value; 976 977 mlme_obj->cfg.he_caps.dot11_he_cap.ba_32bit_bitmap = 978 he_cap->ba_32bit_bitmap; 979 mlme_obj->cfg.he_caps.dot11_he_cap.mu_cascade = he_cap->mu_cascade; 980 mlme_obj->cfg.he_caps.dot11_he_cap.ack_enabled_multitid = 981 he_cap->ack_enabled_multitid; 982 mlme_obj->cfg.he_caps.dot11_he_cap.omi_a_ctrl = he_cap->omi_a_ctrl; 983 mlme_obj->cfg.he_caps.dot11_he_cap.ofdma_ra = he_cap->ofdma_ra; 984 if (cfg_in_range(CFG_HE_MAX_AMPDU_LEN, he_cap->max_ampdu_len_exp_ext)) 985 mlme_obj->cfg.he_caps.dot11_he_cap.max_ampdu_len_exp_ext = 986 he_cap->max_ampdu_len_exp_ext; 987 mlme_obj->cfg.he_caps.dot11_he_cap.amsdu_frag = he_cap->amsdu_frag; 988 mlme_obj->cfg.he_caps.dot11_he_cap.rx_ctrl_frame = 989 he_cap->rx_ctrl_frame; 990 mlme_obj->cfg.he_caps.dot11_he_cap.bsrp_ampdu_aggr = 991 he_cap->bsrp_ampdu_aggr; 992 mlme_obj->cfg.he_caps.dot11_he_cap.qtp = he_cap->qtp; 993 mlme_obj->cfg.he_caps.dot11_he_cap.a_bqr = he_cap->a_bqr; 994 mlme_obj->cfg.he_caps.dot11_he_cap.spatial_reuse_param_rspder = 995 he_cap->spatial_reuse_param_rspder; 996 mlme_obj->cfg.he_caps.dot11_he_cap.ndp_feedback_supp = 997 he_cap->ndp_feedback_supp; 998 mlme_obj->cfg.he_caps.dot11_he_cap.ops_supp = he_cap->ops_supp; 999 mlme_obj->cfg.he_caps.dot11_he_cap.amsdu_in_ampdu = 1000 he_cap->amsdu_in_ampdu; 1001 mlme_obj->cfg.he_caps.dot11_he_cap.he_sub_ch_sel_tx_supp = 1002 he_cap->he_sub_ch_sel_tx_supp; 1003 mlme_obj->cfg.he_caps.dot11_he_cap.ul_2x996_tone_ru_supp = 1004 he_cap->ul_2x996_tone_ru_supp; 1005 mlme_obj->cfg.he_caps.dot11_he_cap.om_ctrl_ul_mu_data_dis_rx = 1006 he_cap->om_ctrl_ul_mu_data_dis_rx; 1007 mlme_obj->cfg.he_caps.dot11_he_cap.he_dynamic_smps = 1008 he_cap->he_dynamic_smps; 1009 mlme_obj->cfg.he_caps.dot11_he_cap.punctured_sounding_supp = 1010 he_cap->punctured_sounding_supp; 1011 mlme_obj->cfg.he_caps.dot11_he_cap.ht_vht_trg_frm_rx_supp = 1012 he_cap->ht_vht_trg_frm_rx_supp; 1013 1014 chan_width = HE_CH_WIDTH_COMBINE(he_cap->chan_width_0, 1015 he_cap->chan_width_1, 1016 he_cap->chan_width_2, 1017 he_cap->chan_width_3, 1018 he_cap->chan_width_4, 1019 he_cap->chan_width_5, 1020 he_cap->chan_width_6); 1021 if (cfg_in_range(CFG_HE_CHAN_WIDTH, chan_width)) { 1022 mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_0 = 1023 he_cap->chan_width_0; 1024 mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_1 = 1025 he_cap->chan_width_1; 1026 mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_2 = 1027 he_cap->chan_width_2; 1028 mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_3 = 1029 he_cap->chan_width_3; 1030 mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_4 = 1031 he_cap->chan_width_4; 1032 mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_5 = 1033 he_cap->chan_width_5; 1034 mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_6 = 1035 he_cap->chan_width_6; 1036 } 1037 if (cfg_in_range(CFG_HE_RX_PREAM_PUNC, he_cap->rx_pream_puncturing)) 1038 mlme_obj->cfg.he_caps.dot11_he_cap.rx_pream_puncturing = 1039 he_cap->rx_pream_puncturing; 1040 mlme_obj->cfg.he_caps.dot11_he_cap.device_class = he_cap->device_class; 1041 mlme_obj->cfg.he_caps.dot11_he_cap.ldpc_coding = he_cap->ldpc_coding; 1042 if (cfg_in_range(CFG_HE_LTF_PPDU, he_cap->he_1x_ltf_800_gi_ppdu)) 1043 mlme_obj->cfg.he_caps.dot11_he_cap.he_1x_ltf_800_gi_ppdu = 1044 he_cap->he_1x_ltf_800_gi_ppdu; 1045 if (cfg_in_range(CFG_HE_MIDAMBLE_RX_MAX_NSTS, 1046 he_cap->midamble_tx_rx_max_nsts)) 1047 mlme_obj->cfg.he_caps.dot11_he_cap.midamble_tx_rx_max_nsts = 1048 he_cap->midamble_tx_rx_max_nsts; 1049 mlme_obj->cfg.he_caps.dot11_he_cap.he_4x_ltf_3200_gi_ndp = 1050 he_cap->he_4x_ltf_3200_gi_ndp; 1051 if (mlme_obj->cfg.vht_caps.vht_cap_info.rx_stbc) { 1052 mlme_obj->cfg.he_caps.dot11_he_cap.rx_stbc_lt_80mhz = 1053 he_cap->rx_stbc_lt_80mhz; 1054 mlme_obj->cfg.he_caps.dot11_he_cap.rx_stbc_gt_80mhz = 1055 he_cap->rx_stbc_gt_80mhz; 1056 } else { 1057 mlme_obj->cfg.he_caps.dot11_he_cap.rx_stbc_lt_80mhz = 0; 1058 mlme_obj->cfg.he_caps.dot11_he_cap.rx_stbc_gt_80mhz = 0; 1059 } 1060 if (mlme_obj->cfg.vht_caps.vht_cap_info.tx_stbc) { 1061 mlme_obj->cfg.he_caps.dot11_he_cap.tb_ppdu_tx_stbc_lt_80mhz = 1062 he_cap->tb_ppdu_tx_stbc_lt_80mhz; 1063 mlme_obj->cfg.he_caps.dot11_he_cap.tb_ppdu_tx_stbc_gt_80mhz = 1064 he_cap->tb_ppdu_tx_stbc_gt_80mhz; 1065 } else { 1066 mlme_obj->cfg.he_caps.dot11_he_cap.tb_ppdu_tx_stbc_lt_80mhz = 0; 1067 mlme_obj->cfg.he_caps.dot11_he_cap.tb_ppdu_tx_stbc_gt_80mhz = 0; 1068 } 1069 1070 if (cfg_in_range(CFG_HE_DOPPLER, he_cap->doppler)) 1071 mlme_obj->cfg.he_caps.dot11_he_cap.doppler = he_cap->doppler; 1072 if (cfg_in_range(CFG_HE_DCM_TX, he_cap->dcm_enc_tx)) 1073 mlme_obj->cfg.he_caps.dot11_he_cap.dcm_enc_tx = 1074 he_cap->dcm_enc_tx; 1075 if (cfg_in_range(CFG_HE_DCM_RX, he_cap->dcm_enc_rx)) 1076 mlme_obj->cfg.he_caps.dot11_he_cap.dcm_enc_rx = 1077 he_cap->dcm_enc_rx; 1078 mlme_obj->cfg.he_caps.dot11_he_cap.ul_he_mu = he_cap->ul_he_mu; 1079 if (mlme_obj->cfg.vht_caps.vht_cap_info.su_bformer) { 1080 mlme_obj->cfg.he_caps.dot11_he_cap.su_beamformer = 1081 he_cap->su_beamformer; 1082 if (cfg_in_range(CFG_HE_NUM_SOUND_LT80, 1083 he_cap->num_sounding_lt_80)) 1084 mlme_obj->cfg.he_caps.dot11_he_cap.num_sounding_lt_80 = 1085 he_cap->num_sounding_lt_80; 1086 if (cfg_in_range(CFG_HE_NUM_SOUND_GT80, 1087 he_cap->num_sounding_gt_80)) 1088 mlme_obj->cfg.he_caps.dot11_he_cap.num_sounding_gt_80 = 1089 he_cap->num_sounding_gt_80; 1090 mlme_obj->cfg.he_caps.dot11_he_cap.mu_beamformer = 1091 he_cap->mu_beamformer; 1092 1093 } else { 1094 mlme_obj->cfg.he_caps.dot11_he_cap.su_beamformer = 0; 1095 mlme_obj->cfg.he_caps.dot11_he_cap.num_sounding_lt_80 = 0; 1096 mlme_obj->cfg.he_caps.dot11_he_cap.num_sounding_gt_80 = 0; 1097 mlme_obj->cfg.he_caps.dot11_he_cap.mu_beamformer = 0; 1098 } 1099 1100 if (mlme_obj->cfg.vht_caps.vht_cap_info.su_bformee) { 1101 mlme_obj->cfg.he_caps.dot11_he_cap.su_beamformee = 1102 he_cap->su_beamformee; 1103 if (cfg_in_range(CFG_HE_BFEE_STS_LT80, he_cap->bfee_sts_lt_80)) 1104 mlme_obj->cfg.he_caps.dot11_he_cap.bfee_sts_lt_80 = 1105 he_cap->bfee_sts_lt_80; 1106 if (cfg_in_range(CFG_HE_BFEE_STS_GT80, he_cap->bfee_sts_gt_80)) 1107 mlme_obj->cfg.he_caps.dot11_he_cap.bfee_sts_gt_80 = 1108 he_cap->bfee_sts_gt_80; 1109 1110 } else { 1111 mlme_obj->cfg.he_caps.dot11_he_cap.su_beamformee = 0; 1112 mlme_obj->cfg.he_caps.dot11_he_cap.bfee_sts_lt_80 = 0; 1113 mlme_obj->cfg.he_caps.dot11_he_cap.bfee_sts_gt_80 = 0; 1114 } 1115 mlme_obj->cfg.he_caps.dot11_he_cap.ul_mu = he_cap->ul_mu; 1116 mlme_obj->cfg.he_caps.dot11_he_cap.su_feedback_tone16 = 1117 he_cap->su_feedback_tone16; 1118 mlme_obj->cfg.he_caps.dot11_he_cap.mu_feedback_tone16 = 1119 he_cap->mu_feedback_tone16; 1120 mlme_obj->cfg.he_caps.dot11_he_cap.codebook_su = he_cap->codebook_su; 1121 mlme_obj->cfg.he_caps.dot11_he_cap.codebook_mu = he_cap->codebook_mu; 1122 if (cfg_in_range(CFG_HE_BFRM_FEED, he_cap->beamforming_feedback)) 1123 mlme_obj->cfg.he_caps.dot11_he_cap.beamforming_feedback = 1124 he_cap->beamforming_feedback; 1125 mlme_obj->cfg.he_caps.dot11_he_cap.he_er_su_ppdu = 1126 he_cap->he_er_su_ppdu; 1127 mlme_obj->cfg.he_caps.dot11_he_cap.dl_mu_mimo_part_bw = 1128 he_cap->dl_mu_mimo_part_bw; 1129 mlme_obj->cfg.he_caps.dot11_he_cap.ppet_present = he_cap->ppet_present; 1130 mlme_obj->cfg.he_caps.dot11_he_cap.srp = he_cap->srp; 1131 mlme_obj->cfg.he_caps.dot11_he_cap.power_boost = he_cap->power_boost; 1132 mlme_obj->cfg.he_caps.dot11_he_cap.he_ltf_800_gi_4x = 1133 he_cap->he_ltf_800_gi_4x; 1134 if (cfg_in_range(CFG_HE_MAX_NC, he_cap->max_nc)) 1135 mlme_obj->cfg.he_caps.dot11_he_cap.max_nc = he_cap->max_nc; 1136 mlme_obj->cfg.he_caps.dot11_he_cap.er_he_ltf_800_gi_4x = 1137 he_cap->er_he_ltf_800_gi_4x; 1138 mlme_obj->cfg.he_caps.dot11_he_cap.he_ppdu_20_in_40Mhz_2G = 1139 he_cap->he_ppdu_20_in_40Mhz_2G; 1140 mlme_obj->cfg.he_caps.dot11_he_cap.he_ppdu_20_in_160_80p80Mhz = 1141 he_cap->he_ppdu_20_in_160_80p80Mhz; 1142 mlme_obj->cfg.he_caps.dot11_he_cap.he_ppdu_80_in_160_80p80Mhz = 1143 he_cap->he_ppdu_80_in_160_80p80Mhz; 1144 mlme_obj->cfg.he_caps.dot11_he_cap.er_1x_he_ltf_gi = 1145 he_cap->er_1x_he_ltf_gi; 1146 mlme_obj->cfg.he_caps.dot11_he_cap.midamble_tx_rx_1x_he_ltf = 1147 he_cap->midamble_tx_rx_1x_he_ltf; 1148 if (cfg_in_range(CFG_HE_DCM_MAX_BW, he_cap->dcm_max_bw)) 1149 mlme_obj->cfg.he_caps.dot11_he_cap.dcm_max_bw = 1150 he_cap->dcm_max_bw; 1151 mlme_obj->cfg.he_caps.dot11_he_cap.longer_than_16_he_sigb_ofdm_sym = 1152 he_cap->longer_than_16_he_sigb_ofdm_sym; 1153 mlme_obj->cfg.he_caps.dot11_he_cap.tx_1024_qam_lt_242_tone_ru = 1154 he_cap->tx_1024_qam_lt_242_tone_ru; 1155 mlme_obj->cfg.he_caps.dot11_he_cap.rx_1024_qam_lt_242_tone_ru = 1156 he_cap->rx_1024_qam_lt_242_tone_ru; 1157 mlme_obj->cfg.he_caps.dot11_he_cap.non_trig_cqi_feedback = 1158 he_cap->non_trig_cqi_feedback; 1159 mlme_obj->cfg.he_caps.dot11_he_cap.rx_full_bw_su_he_mu_compress_sigb = 1160 he_cap->rx_full_bw_su_he_mu_compress_sigb; 1161 mlme_obj->cfg.he_caps.dot11_he_cap.rx_full_bw_su_he_mu_non_cmpr_sigb = 1162 he_cap->rx_full_bw_su_he_mu_non_cmpr_sigb; 1163 1164 tx_mcs_map = mlme_get_min_rate_cap( 1165 mlme_obj->cfg.he_caps.dot11_he_cap.tx_he_mcs_map_lt_80, 1166 he_cap->tx_he_mcs_map_lt_80); 1167 rx_mcs_map = mlme_get_min_rate_cap( 1168 mlme_obj->cfg.he_caps.dot11_he_cap.rx_he_mcs_map_lt_80, 1169 he_cap->rx_he_mcs_map_lt_80); 1170 if (!mlme_obj->cfg.vht_caps.vht_cap_info.enable2x2) { 1171 nss = 2; 1172 tx_mcs_map = HE_SET_MCS_4_NSS(tx_mcs_map, HE_MCS_DISABLE, nss); 1173 rx_mcs_map = HE_SET_MCS_4_NSS(rx_mcs_map, HE_MCS_DISABLE, nss); 1174 } 1175 1176 if (cfg_in_range(CFG_HE_RX_MCS_MAP_LT_80, rx_mcs_map)) 1177 mlme_obj->cfg.he_caps.dot11_he_cap.rx_he_mcs_map_lt_80 = 1178 rx_mcs_map; 1179 if (cfg_in_range(CFG_HE_TX_MCS_MAP_LT_80, tx_mcs_map)) 1180 mlme_obj->cfg.he_caps.dot11_he_cap.tx_he_mcs_map_lt_80 = 1181 tx_mcs_map; 1182 tx_mcs_map = mlme_get_min_rate_cap( 1183 *((uint16_t *)mlme_obj->cfg.he_caps.dot11_he_cap.tx_he_mcs_map_160), 1184 *((uint16_t *)he_cap->tx_he_mcs_map_160)); 1185 rx_mcs_map = mlme_get_min_rate_cap( 1186 *((uint16_t *)mlme_obj->cfg.he_caps.dot11_he_cap.rx_he_mcs_map_160), 1187 *((uint16_t *)he_cap->rx_he_mcs_map_160)); 1188 1189 if (!mlme_obj->cfg.vht_caps.vht_cap_info.enable2x2) { 1190 nss = 2; 1191 tx_mcs_map = HE_SET_MCS_4_NSS(tx_mcs_map, HE_MCS_DISABLE, nss); 1192 rx_mcs_map = HE_SET_MCS_4_NSS(rx_mcs_map, HE_MCS_DISABLE, nss); 1193 } 1194 1195 if (cfg_in_range(CFG_HE_RX_MCS_MAP_160, rx_mcs_map)) 1196 qdf_mem_copy(mlme_obj->cfg.he_caps.dot11_he_cap. 1197 rx_he_mcs_map_160, 1198 &rx_mcs_map, sizeof(uint16_t)); 1199 1200 if (cfg_in_range(CFG_HE_TX_MCS_MAP_160, tx_mcs_map)) 1201 qdf_mem_copy(mlme_obj->cfg.he_caps.dot11_he_cap. 1202 tx_he_mcs_map_160, 1203 &tx_mcs_map, sizeof(uint16_t)); 1204 1205 if (cfg_in_range(CFG_HE_RX_MCS_MAP_80_80, 1206 *((uint16_t *)he_cap->rx_he_mcs_map_80_80))) 1207 qdf_mem_copy(mlme_obj->cfg.he_caps.dot11_he_cap. 1208 rx_he_mcs_map_80_80, 1209 he_cap->rx_he_mcs_map_80_80, sizeof(uint16_t)); 1210 1211 if (cfg_in_range(CFG_HE_TX_MCS_MAP_80_80, 1212 *((uint16_t *)he_cap->tx_he_mcs_map_80_80))) 1213 qdf_mem_copy(mlme_obj->cfg.he_caps.dot11_he_cap. 1214 tx_he_mcs_map_80_80, 1215 he_cap->tx_he_mcs_map_80_80, sizeof(uint16_t)); 1216 1217 qdf_mem_copy(mlme_obj->cfg.he_caps.he_ppet_2g, wma_cfg->ppet_2g, 1218 HE_MAX_PPET_SIZE); 1219 1220 qdf_mem_copy(mlme_obj->cfg.he_caps.he_ppet_5g, wma_cfg->ppet_5g, 1221 HE_MAX_PPET_SIZE); 1222 1223 mlme_obj->cfg.he_caps.he_cap_orig = mlme_obj->cfg.he_caps.dot11_he_cap; 1224 /* Take intersection of host and FW capabilities */ 1225 mlme_obj->cfg.he_caps.he_mcs_12_13_supp_2g &= 1226 wma_cfg->he_mcs_12_13_supp_2g; 1227 mlme_obj->cfg.he_caps.he_mcs_12_13_supp_5g &= 1228 wma_cfg->he_mcs_12_13_supp_5g; 1229 mlme_debug("mcs_12_13 2G: %x 5G: %x FW_cap: 2G: %x 5G: %x", 1230 mlme_obj->cfg.he_caps.he_mcs_12_13_supp_2g, 1231 mlme_obj->cfg.he_caps.he_mcs_12_13_supp_5g, 1232 wma_cfg->he_mcs_12_13_supp_2g, 1233 wma_cfg->he_mcs_12_13_supp_5g); 1234 1235 return status; 1236 } 1237 #ifdef WLAN_FEATURE_SR 1238 void 1239 wlan_mlme_get_sr_enable_modes(struct wlan_objmgr_psoc *psoc, uint8_t *val) 1240 { 1241 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 1242 1243 if (!mlme_obj) { 1244 *val = cfg_default(CFG_SR_ENABLE_MODES); 1245 return; 1246 } 1247 *val = mlme_obj->cfg.gen.sr_enable_modes; 1248 } 1249 #endif 1250 #endif 1251 1252 #ifdef WLAN_FEATURE_11BE 1253 QDF_STATUS mlme_update_tgt_eht_caps_in_cfg(struct wlan_objmgr_psoc *psoc, 1254 struct wma_tgt_cfg *wma_cfg) 1255 { 1256 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 1257 tDot11fIEeht_cap *eht_cap = &wma_cfg->eht_cap; 1258 tDot11fIEeht_cap *mlme_eht_cap; 1259 bool eht_capab; 1260 1261 if (!mlme_obj) 1262 return QDF_STATUS_E_FAILURE; 1263 1264 wlan_psoc_mlme_get_11be_capab(psoc, &eht_capab); 1265 if (!eht_capab) 1266 return QDF_STATUS_SUCCESS; 1267 1268 mlme_obj->cfg.eht_caps.dot11_eht_cap.present = 1; 1269 qdf_mem_copy(&mlme_obj->cfg.eht_caps.dot11_eht_cap, eht_cap, 1270 sizeof(tDot11fIEeht_cap)); 1271 mlme_eht_cap = &mlme_obj->cfg.eht_caps.dot11_eht_cap; 1272 if (mlme_obj->cfg.vht_caps.vht_cap_info.su_bformer) { 1273 mlme_eht_cap->su_beamformer = eht_cap->su_beamformer; 1274 if (cfg_in_range(CFG_EHT_NUM_SOUNDING_DIM_LE_80MHZ, 1275 eht_cap->num_sounding_dim_le_80mhz)) 1276 mlme_eht_cap->num_sounding_dim_le_80mhz = 1277 eht_cap->num_sounding_dim_le_80mhz; 1278 if (cfg_in_range(CFG_EHT_NUM_SOUNDING_DIM_160MHZ, 1279 eht_cap->num_sounding_dim_160mhz)) 1280 mlme_eht_cap->num_sounding_dim_160mhz = 1281 eht_cap->num_sounding_dim_160mhz; 1282 if (cfg_in_range(CFG_EHT_NUM_SOUNDING_DIM_320MHZ, 1283 eht_cap->num_sounding_dim_320mhz)) 1284 mlme_eht_cap->num_sounding_dim_320mhz = 1285 eht_cap->num_sounding_dim_320mhz; 1286 mlme_eht_cap->mu_bformer_le_80mhz = 1287 eht_cap->mu_bformer_le_80mhz; 1288 mlme_eht_cap->mu_bformer_160mhz = eht_cap->mu_bformer_160mhz; 1289 mlme_eht_cap->mu_bformer_320mhz = eht_cap->mu_bformer_320mhz; 1290 1291 } else { 1292 mlme_eht_cap->su_beamformer = 0; 1293 mlme_eht_cap->num_sounding_dim_le_80mhz = 0; 1294 mlme_eht_cap->num_sounding_dim_160mhz = 0; 1295 mlme_eht_cap->num_sounding_dim_320mhz = 0; 1296 mlme_eht_cap->mu_bformer_le_80mhz = 0; 1297 mlme_eht_cap->mu_bformer_160mhz = 0; 1298 mlme_eht_cap->mu_bformer_320mhz = 0; 1299 } 1300 1301 if (mlme_obj->cfg.vht_caps.vht_cap_info.su_bformee) { 1302 mlme_eht_cap->su_beamformee = eht_cap->su_beamformee; 1303 if (cfg_in_range(CFG_EHT_BFEE_SS_LE_80MHZ, 1304 eht_cap->bfee_ss_le_80mhz)) 1305 mlme_eht_cap->bfee_ss_le_80mhz = 1306 eht_cap->bfee_ss_le_80mhz; 1307 if (cfg_in_range(CFG_EHT_BFEE_SS_160MHZ, 1308 eht_cap->bfee_ss_160mhz)) 1309 mlme_eht_cap->bfee_ss_160mhz = eht_cap->bfee_ss_160mhz; 1310 if (cfg_in_range(CFG_EHT_BFEE_SS_320MHZ, 1311 eht_cap->bfee_ss_320mhz)) 1312 mlme_eht_cap->bfee_ss_320mhz = eht_cap->bfee_ss_320mhz; 1313 1314 } else { 1315 mlme_eht_cap->su_beamformee = 0; 1316 mlme_eht_cap->bfee_ss_le_80mhz = 0; 1317 mlme_eht_cap->bfee_ss_160mhz = 0; 1318 mlme_eht_cap->bfee_ss_320mhz = 0; 1319 } 1320 mlme_obj->cfg.eht_caps.eht_cap_orig = 1321 mlme_obj->cfg.eht_caps.dot11_eht_cap; 1322 1323 return QDF_STATUS_SUCCESS; 1324 } 1325 1326 QDF_STATUS mlme_update_tgt_mlo_caps_in_cfg(struct wlan_objmgr_psoc *psoc) 1327 { 1328 struct target_psoc_info *tgt_hdl; 1329 QDF_STATUS status; 1330 uint16_t value; 1331 1332 tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc); 1333 if (!tgt_hdl) { 1334 mlme_debug("target psoc info is NULL"); 1335 return QDF_STATUS_E_FAILURE; 1336 } 1337 1338 value = target_if_res_cfg_get_num_max_mlo_link(tgt_hdl); 1339 status = wlan_mlme_set_sta_mlo_conn_max_num(psoc, value); 1340 mlme_debug("Max ML link supported: %d", value); 1341 1342 return status; 1343 } 1344 1345 uint8_t wlan_mlme_convert_phy_ch_width_to_eht_op_bw(enum phy_ch_width ch_width) 1346 { 1347 switch (ch_width) { 1348 case CH_WIDTH_320MHZ: 1349 return WLAN_EHT_CHWIDTH_320; 1350 case CH_WIDTH_160MHZ: 1351 return WLAN_EHT_CHWIDTH_160; 1352 case CH_WIDTH_80MHZ: 1353 return WLAN_EHT_CHWIDTH_80; 1354 case CH_WIDTH_40MHZ: 1355 return WLAN_EHT_CHWIDTH_40; 1356 default: 1357 return WLAN_EHT_CHWIDTH_20; 1358 } 1359 } 1360 1361 enum phy_ch_width wlan_mlme_convert_eht_op_bw_to_phy_ch_width( 1362 uint8_t channel_width) 1363 { 1364 enum phy_ch_width phy_bw = CH_WIDTH_20MHZ; 1365 1366 if (channel_width == WLAN_EHT_CHWIDTH_320) 1367 phy_bw = CH_WIDTH_320MHZ; 1368 else if (channel_width == WLAN_EHT_CHWIDTH_160) 1369 phy_bw = CH_WIDTH_160MHZ; 1370 else if (channel_width == WLAN_EHT_CHWIDTH_80) 1371 phy_bw = CH_WIDTH_80MHZ; 1372 else if (channel_width == WLAN_EHT_CHWIDTH_40) 1373 phy_bw = CH_WIDTH_40MHZ; 1374 1375 return phy_bw; 1376 } 1377 1378 bool wlan_mlme_get_epcs_capability(struct wlan_objmgr_psoc *psoc) 1379 { 1380 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 1381 1382 if (!mlme_obj) 1383 return true; 1384 1385 return mlme_obj->cfg.sta.epcs_capability; 1386 } 1387 1388 void wlan_mlme_set_epcs_capability(struct wlan_objmgr_psoc *psoc, bool flag) 1389 { 1390 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 1391 1392 if (!mlme_obj) 1393 return; 1394 1395 mlme_debug("set mlme epcs capability from %d to %d", 1396 mlme_obj->cfg.sta.epcs_capability, flag); 1397 mlme_obj->cfg.sta.epcs_capability = flag; 1398 } 1399 1400 bool wlan_mlme_get_eht_disable_punct_in_us_lpi(struct wlan_objmgr_psoc *psoc) 1401 { 1402 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 1403 1404 if (!mlme_obj) 1405 return false; 1406 1407 return mlme_obj->cfg.sta.eht_disable_punct_in_us_lpi; 1408 } 1409 1410 void wlan_mlme_set_eht_disable_punct_in_us_lpi(struct wlan_objmgr_psoc *psoc, bool flag) 1411 { 1412 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 1413 1414 if (!mlme_obj) 1415 return; 1416 1417 mlme_debug("set mlme epcs capability to %d", flag); 1418 mlme_obj->cfg.sta.eht_disable_punct_in_us_lpi = flag; 1419 } 1420 1421 bool wlan_mlme_get_usr_disable_sta_eht(struct wlan_objmgr_psoc *psoc) 1422 { 1423 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 1424 1425 if (!mlme_obj) 1426 return true; 1427 1428 return mlme_obj->cfg.sta.usr_disable_eht; 1429 } 1430 1431 void wlan_mlme_set_usr_disable_sta_eht(struct wlan_objmgr_psoc *psoc, 1432 bool disable) 1433 { 1434 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 1435 1436 if (!mlme_obj) 1437 return; 1438 1439 mlme_debug("set usr_disable_eht from %d to %d", 1440 mlme_obj->cfg.sta.usr_disable_eht, disable); 1441 mlme_obj->cfg.sta.usr_disable_eht = disable; 1442 } 1443 1444 enum phy_ch_width wlan_mlme_get_max_bw(void) 1445 { 1446 uint32_t max_bw = wma_get_eht_ch_width(); 1447 1448 if (max_bw == WNI_CFG_EHT_CHANNEL_WIDTH_320MHZ) 1449 return CH_WIDTH_320MHZ; 1450 else if (max_bw == WNI_CFG_VHT_CHANNEL_WIDTH_160MHZ) 1451 return CH_WIDTH_160MHZ; 1452 else if (max_bw == WNI_CFG_VHT_CHANNEL_WIDTH_80_PLUS_80MHZ) 1453 return CH_WIDTH_80P80MHZ; 1454 else if (max_bw == WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ) 1455 return CH_WIDTH_80MHZ; 1456 else 1457 return CH_WIDTH_40MHZ; 1458 } 1459 #else 1460 enum phy_ch_width wlan_mlme_get_max_bw(void) 1461 { 1462 uint32_t max_bw = wma_get_vht_ch_width(); 1463 1464 if (max_bw == WNI_CFG_VHT_CHANNEL_WIDTH_160MHZ) 1465 return CH_WIDTH_160MHZ; 1466 else if (max_bw == WNI_CFG_VHT_CHANNEL_WIDTH_80_PLUS_80MHZ) 1467 return CH_WIDTH_80P80MHZ; 1468 else if (max_bw == WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ) 1469 return CH_WIDTH_80MHZ; 1470 else 1471 return CH_WIDTH_40MHZ; 1472 } 1473 #endif 1474 1475 QDF_STATUS wlan_mlme_get_sta_ch_width(struct wlan_objmgr_vdev *vdev, 1476 enum phy_ch_width *ch_width) 1477 { 1478 QDF_STATUS status = QDF_STATUS_E_INVAL; 1479 struct wlan_objmgr_peer *peer; 1480 enum wlan_phymode phymode; 1481 enum QDF_OPMODE op_mode; 1482 1483 peer = wlan_vdev_get_bsspeer(vdev); 1484 op_mode = wlan_vdev_mlme_get_opmode(vdev); 1485 1486 if (ch_width && peer && 1487 (op_mode == QDF_STA_MODE || 1488 op_mode == QDF_P2P_CLIENT_MODE)) { 1489 wlan_peer_obj_lock(peer); 1490 phymode = wlan_peer_get_phymode(peer); 1491 wlan_peer_obj_unlock(peer); 1492 *ch_width = wlan_mlme_get_ch_width_from_phymode(phymode); 1493 status = QDF_STATUS_SUCCESS; 1494 } 1495 1496 return status; 1497 } 1498 1499 void 1500 wlan_mlme_set_bt_profile_con(struct wlan_objmgr_psoc *psoc, 1501 bool bt_profile_con) 1502 { 1503 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1504 1505 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1506 if (!mlme_obj) 1507 return; 1508 1509 mlme_obj->cfg.gen.bt_profile_con = bt_profile_con; 1510 } 1511 1512 bool 1513 wlan_mlme_get_bt_profile_con(struct wlan_objmgr_psoc *psoc) 1514 { 1515 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1516 1517 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1518 if (!mlme_obj) 1519 return false; 1520 1521 return mlme_obj->cfg.gen.bt_profile_con; 1522 } 1523 1524 #ifdef WLAN_FEATURE_11BE_MLO 1525 uint8_t wlan_mlme_get_sta_mlo_simultaneous_links(struct wlan_objmgr_psoc *psoc) 1526 { 1527 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1528 1529 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1530 if (!mlme_obj) 1531 return 0; 1532 1533 return mlme_obj->cfg.sta.mlo_max_simultaneous_links; 1534 } 1535 1536 QDF_STATUS 1537 wlan_mlme_set_sta_mlo_simultaneous_links(struct wlan_objmgr_psoc *psoc, 1538 uint8_t value) 1539 { 1540 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1541 1542 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1543 if (!mlme_obj) 1544 return QDF_STATUS_E_FAILURE; 1545 1546 mlme_obj->cfg.sta.mlo_max_simultaneous_links = value; 1547 mlme_legacy_debug("mlo_max_simultaneous_links %d", value); 1548 1549 return QDF_STATUS_SUCCESS; 1550 } 1551 1552 uint8_t wlan_mlme_get_sta_mlo_conn_max_num(struct wlan_objmgr_psoc *psoc) 1553 { 1554 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1555 1556 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1557 if (!mlme_obj) 1558 return 0; 1559 1560 return mlme_obj->cfg.sta.mlo_support_link_num; 1561 } 1562 1563 QDF_STATUS wlan_mlme_set_sta_mlo_conn_max_num(struct wlan_objmgr_psoc *psoc, 1564 uint8_t value) 1565 { 1566 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1567 1568 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1569 if (!mlme_obj) 1570 return QDF_STATUS_E_FAILURE; 1571 1572 if (!value) 1573 mlme_obj->cfg.sta.mlo_support_link_num = 1574 cfg_default(CFG_MLO_SUPPORT_LINK_NUM); 1575 else 1576 mlme_obj->cfg.sta.mlo_support_link_num = value; 1577 1578 mlme_legacy_debug("mlo_support_link_num %d", value); 1579 1580 return QDF_STATUS_SUCCESS; 1581 } 1582 1583 QDF_STATUS wlan_mlme_set_user_set_link_num(struct wlan_objmgr_psoc *psoc, 1584 uint8_t value) 1585 { 1586 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1587 1588 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1589 if (!mlme_obj) 1590 return QDF_STATUS_E_FAILURE; 1591 1592 mlme_obj->cfg.sta.user_set_link_num = value; 1593 mlme_legacy_debug("user_set_link_num %d", value); 1594 1595 return QDF_STATUS_SUCCESS; 1596 } 1597 1598 void wlan_mlme_set_ml_link_control_mode(struct wlan_objmgr_psoc *psoc, 1599 uint8_t vdev_id, uint8_t value) 1600 { 1601 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1602 struct wlan_objmgr_vdev *vdev; 1603 1604 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1605 if (!mlme_obj) 1606 return; 1607 1608 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, 1609 WLAN_MLME_SB_ID); 1610 if (!vdev) 1611 return; 1612 1613 if (!wlan_vdev_mlme_is_mlo_vdev(vdev)) { 1614 mlme_legacy_debug("not mlo vdev"); 1615 goto release_ref; 1616 } 1617 1618 if (!vdev->mlo_dev_ctx || !vdev->mlo_dev_ctx->sta_ctx) { 1619 mlme_legacy_debug("mlo dev/sta ctx is null"); 1620 goto release_ref; 1621 } 1622 1623 vdev->mlo_dev_ctx->sta_ctx->ml_link_control_mode = value; 1624 mlme_legacy_debug("set ml_link_control_mode %d", value); 1625 1626 release_ref: 1627 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_SB_ID); 1628 return; 1629 } 1630 1631 uint8_t wlan_mlme_get_ml_link_control_mode(struct wlan_objmgr_psoc *psoc, 1632 uint8_t vdev_id) 1633 { 1634 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1635 struct wlan_objmgr_vdev *vdev; 1636 uint8_t value = 0; 1637 1638 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1639 if (!mlme_obj) 1640 return 0; 1641 1642 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, 1643 WLAN_MLME_SB_ID); 1644 if (!vdev) 1645 return 0; 1646 1647 if (!wlan_vdev_mlme_is_mlo_vdev(vdev)) { 1648 mlme_legacy_debug("not mlo vdev"); 1649 goto release_ref; 1650 } 1651 1652 if (!vdev->mlo_dev_ctx || !vdev->mlo_dev_ctx->sta_ctx) { 1653 mlme_legacy_debug("mlo dev/sta ctx is null"); 1654 goto release_ref; 1655 } 1656 1657 value = vdev->mlo_dev_ctx->sta_ctx->ml_link_control_mode; 1658 mlme_legacy_debug("get ml_link_control_mode %d", value); 1659 release_ref: 1660 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_SB_ID); 1661 return value; 1662 } 1663 1664 void wlan_mlme_restore_user_set_link_num(struct wlan_objmgr_psoc *psoc) 1665 { 1666 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1667 1668 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1669 if (!mlme_obj) 1670 return; 1671 1672 if (!mlme_obj->cfg.sta.user_set_link_num) 1673 return; 1674 1675 mlme_obj->cfg.sta.mlo_support_link_num = 1676 mlme_obj->cfg.sta.user_set_link_num; 1677 mlme_legacy_debug("restore mlo_support_link_num %d", 1678 mlme_obj->cfg.sta.user_set_link_num); 1679 } 1680 1681 void wlan_mlme_clear_user_set_link_num(struct wlan_objmgr_psoc *psoc) 1682 { 1683 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1684 1685 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1686 if (!mlme_obj) 1687 return; 1688 1689 mlme_obj->cfg.sta.user_set_link_num = 0; 1690 } 1691 1692 uint8_t wlan_mlme_get_sta_mlo_conn_band_bmp(struct wlan_objmgr_psoc *psoc) 1693 { 1694 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1695 1696 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1697 if (!mlme_obj) 1698 return 0; 1699 1700 return mlme_obj->cfg.sta.mlo_support_link_band; 1701 } 1702 1703 QDF_STATUS wlan_mlme_set_sta_mlo_conn_band_bmp(struct wlan_objmgr_psoc *psoc, 1704 uint8_t value) 1705 { 1706 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1707 1708 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1709 if (!mlme_obj) 1710 return QDF_STATUS_E_FAILURE; 1711 1712 mlme_obj->cfg.sta.mlo_support_link_band = value; 1713 mlme_legacy_debug("mlo_support_link_conn band %d", value); 1714 1715 return QDF_STATUS_SUCCESS; 1716 } 1717 1718 bool wlan_mlme_is_5gl_5gh_mlsr_supported(struct wlan_objmgr_psoc *psoc) 1719 { 1720 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1721 1722 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1723 if (!mlme_obj) 1724 return 0; 1725 return mlme_obj->cfg.sta.mlo_5gl_5gh_mlsr; 1726 } 1727 1728 void 1729 wlan_mlme_get_mlo_prefer_percentage(struct wlan_objmgr_psoc *psoc, 1730 int8_t *mlo_prefer_percentage) 1731 { 1732 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1733 1734 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1735 if (!mlme_obj) { 1736 mlme_legacy_err("invalid mlo object"); 1737 return; 1738 } 1739 1740 *mlo_prefer_percentage = mlme_obj->cfg.sta.mlo_prefer_percentage; 1741 mlme_legacy_debug("mlo_prefer_percentage %d", *mlo_prefer_percentage); 1742 } 1743 1744 bool wlan_mlme_get_sta_same_link_mld_addr(struct wlan_objmgr_psoc *psoc) 1745 { 1746 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1747 1748 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1749 if (!mlme_obj) 1750 return false; 1751 1752 return mlme_obj->cfg.sta.mlo_same_link_mld_address; 1753 } 1754 #endif 1755 1756 QDF_STATUS wlan_mlme_get_num_11b_tx_chains(struct wlan_objmgr_psoc *psoc, 1757 uint16_t *value) 1758 { 1759 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 1760 1761 if (!mlme_obj) 1762 return QDF_STATUS_E_FAILURE; 1763 1764 *value = mlme_obj->cfg.chainmask_cfg.num_11b_tx_chains; 1765 return QDF_STATUS_SUCCESS; 1766 } 1767 1768 QDF_STATUS wlan_mlme_get_bt_chain_separation_flag(struct wlan_objmgr_psoc *psoc, 1769 bool *value) 1770 { 1771 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 1772 1773 if (!mlme_obj) 1774 return QDF_STATUS_E_FAILURE; 1775 1776 *value = mlme_obj->cfg.chainmask_cfg.enable_bt_chain_separation; 1777 return QDF_STATUS_SUCCESS; 1778 } 1779 1780 QDF_STATUS wlan_mlme_get_num_11ag_tx_chains(struct wlan_objmgr_psoc *psoc, 1781 uint16_t *value) 1782 { 1783 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 1784 1785 if (!mlme_obj) 1786 return QDF_STATUS_E_FAILURE; 1787 1788 *value = mlme_obj->cfg.chainmask_cfg.num_11ag_tx_chains; 1789 return QDF_STATUS_SUCCESS; 1790 } 1791 1792 1793 static 1794 bool wlan_mlme_configure_chain_mask_supported(struct wlan_objmgr_psoc *psoc) 1795 { 1796 struct wma_caps_per_phy non_dbs_phy_cap = {0}; 1797 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 1798 QDF_STATUS status; 1799 bool as_enabled, enable_bt_chain_sep, enable2x2; 1800 uint8_t dual_mac_feature; 1801 bool hw_dbs_2x2_cap; 1802 1803 if (!mlme_obj) 1804 return false; 1805 1806 status = wma_get_caps_for_phyidx_hwmode(&non_dbs_phy_cap, 1807 HW_MODE_DBS_NONE, 1808 CDS_BAND_ALL); 1809 if (QDF_IS_STATUS_ERROR(status)) { 1810 mlme_legacy_err("couldn't get phy caps. skip chain mask programming"); 1811 return false; 1812 } 1813 1814 if (non_dbs_phy_cap.tx_chain_mask_2G < 3 || 1815 non_dbs_phy_cap.rx_chain_mask_2G < 3 || 1816 non_dbs_phy_cap.tx_chain_mask_5G < 3 || 1817 non_dbs_phy_cap.rx_chain_mask_5G < 3) { 1818 mlme_legacy_debug("firmware not capable. skip chain mask programming"); 1819 return false; 1820 } 1821 1822 enable_bt_chain_sep = 1823 mlme_obj->cfg.chainmask_cfg.enable_bt_chain_separation; 1824 as_enabled = mlme_obj->cfg.gen.as_enabled; 1825 ucfg_policy_mgr_get_dual_mac_feature(psoc, &dual_mac_feature); 1826 1827 hw_dbs_2x2_cap = policy_mgr_is_hw_dbs_2x2_capable(psoc); 1828 enable2x2 = mlme_obj->cfg.vht_caps.vht_cap_info.enable2x2; 1829 1830 if ((enable2x2 && !enable_bt_chain_sep) || as_enabled || 1831 (!hw_dbs_2x2_cap && (dual_mac_feature != DISABLE_DBS_CXN_AND_SCAN) && 1832 enable2x2)) { 1833 mlme_legacy_debug("Cannot configure chainmask enable_bt_chain_sep %d as_enabled %d enable2x2 %d hw_dbs_2x2_cap %d dual_mac_feature %d", 1834 enable_bt_chain_sep, as_enabled, enable2x2, 1835 hw_dbs_2x2_cap, dual_mac_feature); 1836 return false; 1837 } 1838 1839 return true; 1840 } 1841 1842 bool wlan_mlme_is_chain_mask_supported(struct wlan_objmgr_psoc *psoc) 1843 1844 { 1845 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 1846 1847 if (!mlme_obj) 1848 return false; 1849 1850 if (!wlan_mlme_configure_chain_mask_supported(psoc)) 1851 return false; 1852 1853 /* If user has configured 1x1 from INI */ 1854 if (mlme_obj->cfg.chainmask_cfg.txchainmask1x1 != 3 || 1855 mlme_obj->cfg.chainmask_cfg.rxchainmask1x1 != 3) { 1856 mlme_legacy_debug("txchainmask1x1 %d rxchainmask1x1 %d", 1857 mlme_obj->cfg.chainmask_cfg.txchainmask1x1, 1858 mlme_obj->cfg.chainmask_cfg.rxchainmask1x1); 1859 return false; 1860 } 1861 1862 return true; 1863 1864 } 1865 1866 #define MAX_PDEV_CHAIN_MASK_PARAMS 6 1867 /* params being sent: 1868 * wmi_pdev_param_tx_chain_mask 1869 * wmi_pdev_param_rx_chain_mask 1870 * wmi_pdev_param_tx_chain_mask_2g 1871 * wmi_pdev_param_rx_chain_mask_2g 1872 * wmi_pdev_param_tx_chain_mask_5g 1873 * wmi_pdev_param_rx_chain_mask_5g 1874 */ 1875 QDF_STATUS wlan_mlme_configure_chain_mask(struct wlan_objmgr_psoc *psoc, 1876 uint8_t session_id) 1877 { 1878 QDF_STATUS ret_val = QDF_STATUS_E_FAILURE; 1879 uint8_t ch_msk_val; 1880 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 1881 bool mrc_disabled_2g_rx, mrc_disabled_2g_tx; 1882 bool mrc_disabled_5g_rx, mrc_disabled_5g_tx; 1883 struct dev_set_param setparam[MAX_PDEV_CHAIN_MASK_PARAMS]; 1884 uint8_t index = 0; 1885 1886 if (!mlme_obj) 1887 return QDF_STATUS_E_FAILURE; 1888 1889 mlme_legacy_debug("txchainmask1x1: %d rxchainmask1x1: %d", 1890 mlme_obj->cfg.chainmask_cfg.txchainmask1x1, 1891 mlme_obj->cfg.chainmask_cfg.rxchainmask1x1); 1892 mlme_legacy_debug("tx_chain_mask_2g: %d, rx_chain_mask_2g: %d", 1893 mlme_obj->cfg.chainmask_cfg.tx_chain_mask_2g, 1894 mlme_obj->cfg.chainmask_cfg.rx_chain_mask_2g); 1895 mlme_legacy_debug("tx_chain_mask_5g: %d, rx_chain_mask_5g: %d", 1896 mlme_obj->cfg.chainmask_cfg.tx_chain_mask_5g, 1897 mlme_obj->cfg.chainmask_cfg.rx_chain_mask_5g); 1898 1899 mrc_disabled_2g_rx = 1900 mlme_obj->cfg.nss_chains_ini_cfg.disable_rx_mrc[NSS_CHAINS_BAND_2GHZ]; 1901 mrc_disabled_2g_tx = 1902 mlme_obj->cfg.nss_chains_ini_cfg.disable_tx_mrc[NSS_CHAINS_BAND_2GHZ]; 1903 mrc_disabled_5g_rx = 1904 mlme_obj->cfg.nss_chains_ini_cfg.disable_rx_mrc[NSS_CHAINS_BAND_5GHZ]; 1905 mrc_disabled_5g_tx = 1906 mlme_obj->cfg.nss_chains_ini_cfg.disable_tx_mrc[NSS_CHAINS_BAND_5GHZ]; 1907 1908 mlme_legacy_debug("MRC values TX:- 2g %d 5g %d RX:- 2g %d 5g %d", 1909 mrc_disabled_2g_tx, mrc_disabled_5g_tx, 1910 mrc_disabled_2g_rx, mrc_disabled_5g_rx); 1911 1912 if (!wlan_mlme_configure_chain_mask_supported(psoc)) 1913 return QDF_STATUS_E_FAILURE; 1914 1915 if (mlme_obj->cfg.chainmask_cfg.txchainmask1x1) { 1916 ch_msk_val = mlme_obj->cfg.chainmask_cfg.txchainmask1x1; 1917 if (wma_validate_txrx_chain_mask(wmi_pdev_param_tx_chain_mask, 1918 ch_msk_val)) { 1919 goto error; 1920 } 1921 ret_val = mlme_check_index_setparam( 1922 setparam, 1923 wmi_pdev_param_tx_chain_mask, 1924 ch_msk_val, index++, 1925 MAX_PDEV_CHAIN_MASK_PARAMS); 1926 if (QDF_IS_STATUS_ERROR(ret_val)) { 1927 mlme_err("failed at wmi_pdev_param_tx_chain_mask"); 1928 goto error; 1929 } 1930 } 1931 1932 if (mlme_obj->cfg.chainmask_cfg.rxchainmask1x1) { 1933 ch_msk_val = mlme_obj->cfg.chainmask_cfg.rxchainmask1x1; 1934 if (wma_validate_txrx_chain_mask(wmi_pdev_param_rx_chain_mask, 1935 ch_msk_val)) { 1936 goto error; 1937 } 1938 ret_val = mlme_check_index_setparam( 1939 setparam, 1940 wmi_pdev_param_rx_chain_mask, 1941 ch_msk_val, index++, 1942 MAX_PDEV_CHAIN_MASK_PARAMS); 1943 if (QDF_IS_STATUS_ERROR(ret_val)) { 1944 mlme_err("failed at wmi_pdev_param_rx_chain_mask"); 1945 goto error; 1946 } 1947 } 1948 1949 if (mlme_obj->cfg.chainmask_cfg.txchainmask1x1 || 1950 mlme_obj->cfg.chainmask_cfg.rxchainmask1x1) { 1951 mlme_legacy_debug("band agnostic tx/rx chain mask set. skip per band chain mask"); 1952 goto sendparam; 1953 } 1954 1955 if (mlme_obj->cfg.chainmask_cfg.tx_chain_mask_2g && 1956 mrc_disabled_2g_tx) { 1957 ch_msk_val = mlme_obj->cfg.chainmask_cfg.tx_chain_mask_2g; 1958 ret_val = mlme_check_index_setparam( 1959 setparam, 1960 wmi_pdev_param_tx_chain_mask_2g, 1961 ch_msk_val, index++, 1962 MAX_PDEV_CHAIN_MASK_PARAMS); 1963 if (QDF_IS_STATUS_ERROR(ret_val)) { 1964 mlme_err("failed at wmi_pdev_param_tx_chain_mask_2g"); 1965 goto error; 1966 } 1967 } 1968 1969 if (mlme_obj->cfg.chainmask_cfg.rx_chain_mask_2g && 1970 mrc_disabled_2g_rx) { 1971 ch_msk_val = mlme_obj->cfg.chainmask_cfg.rx_chain_mask_2g; 1972 ret_val = mlme_check_index_setparam( 1973 setparam, 1974 wmi_pdev_param_rx_chain_mask_2g, 1975 ch_msk_val, index++, 1976 MAX_PDEV_CHAIN_MASK_PARAMS); 1977 if (QDF_IS_STATUS_ERROR(ret_val)) { 1978 mlme_err("failed at wmi_pdev_param_rx_chain_mask_2g"); 1979 goto error; 1980 } 1981 } 1982 1983 if (mlme_obj->cfg.chainmask_cfg.tx_chain_mask_5g && 1984 mrc_disabled_5g_tx) { 1985 ch_msk_val = mlme_obj->cfg.chainmask_cfg.tx_chain_mask_5g; 1986 ret_val = mlme_check_index_setparam( 1987 setparam, 1988 wmi_pdev_param_tx_chain_mask_5g, 1989 ch_msk_val, index++, 1990 MAX_PDEV_CHAIN_MASK_PARAMS); 1991 if (QDF_IS_STATUS_ERROR(ret_val)) { 1992 mlme_err("failed at wmi_pdev_param_tx_chain_mask_5g"); 1993 goto error; 1994 } 1995 } 1996 1997 if (mlme_obj->cfg.chainmask_cfg.rx_chain_mask_5g && 1998 mrc_disabled_5g_rx) { 1999 ch_msk_val = mlme_obj->cfg.chainmask_cfg.rx_chain_mask_5g; 2000 ret_val = mlme_check_index_setparam( 2001 setparam, 2002 wmi_pdev_param_rx_chain_mask_5g, 2003 ch_msk_val, index++, 2004 MAX_PDEV_CHAIN_MASK_PARAMS); 2005 if (QDF_IS_STATUS_ERROR(ret_val)) { 2006 mlme_err("failed at wmi_pdev_param_rx_chain_mask_5g"); 2007 goto error; 2008 } 2009 } 2010 sendparam: 2011 ret_val = wma_send_multi_pdev_vdev_set_params(MLME_PDEV_SETPARAM, 2012 WMI_PDEV_ID_SOC, setparam, 2013 index); 2014 if (QDF_IS_STATUS_ERROR(ret_val)) 2015 mlme_err("failed to send chainmask params"); 2016 error: 2017 return ret_val; 2018 } 2019 2020 QDF_STATUS 2021 wlan_mlme_get_manufacturer_name(struct wlan_objmgr_psoc *psoc, 2022 uint8_t *pbuf, uint32_t *plen) 2023 { 2024 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2025 2026 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2027 if (!mlme_obj) 2028 return QDF_STATUS_E_FAILURE; 2029 2030 *plen = qdf_str_lcopy(pbuf, 2031 mlme_obj->cfg.product_details.manufacturer_name, 2032 *plen); 2033 return QDF_STATUS_SUCCESS; 2034 } 2035 2036 QDF_STATUS 2037 wlan_mlme_get_model_number(struct wlan_objmgr_psoc *psoc, 2038 uint8_t *pbuf, uint32_t *plen) 2039 { 2040 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2041 2042 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2043 if (!mlme_obj) 2044 return QDF_STATUS_E_FAILURE; 2045 2046 *plen = qdf_str_lcopy(pbuf, 2047 mlme_obj->cfg.product_details.model_number, 2048 *plen); 2049 2050 return QDF_STATUS_SUCCESS; 2051 } 2052 2053 QDF_STATUS 2054 wlan_mlme_get_model_name(struct wlan_objmgr_psoc *psoc, 2055 uint8_t *pbuf, uint32_t *plen) 2056 { 2057 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2058 2059 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2060 if (!mlme_obj) 2061 return QDF_STATUS_E_FAILURE; 2062 2063 *plen = qdf_str_lcopy(pbuf, 2064 mlme_obj->cfg.product_details.model_name, 2065 *plen); 2066 return QDF_STATUS_SUCCESS; 2067 } 2068 2069 QDF_STATUS 2070 wlan_mlme_get_manufacture_product_version(struct wlan_objmgr_psoc *psoc, 2071 uint8_t *pbuf, uint32_t *plen) 2072 { 2073 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2074 2075 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2076 if (!mlme_obj) 2077 return QDF_STATUS_E_FAILURE; 2078 2079 *plen = qdf_str_lcopy(pbuf, 2080 mlme_obj->cfg.product_details.manufacture_product_version, 2081 *plen); 2082 return QDF_STATUS_SUCCESS; 2083 } 2084 2085 QDF_STATUS 2086 wlan_mlme_get_manufacture_product_name(struct wlan_objmgr_psoc *psoc, 2087 uint8_t *pbuf, uint32_t *plen) 2088 { 2089 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2090 2091 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2092 if (!mlme_obj) 2093 return QDF_STATUS_E_FAILURE; 2094 2095 *plen = qdf_str_lcopy(pbuf, 2096 mlme_obj->cfg.product_details.manufacture_product_name, 2097 *plen); 2098 return QDF_STATUS_SUCCESS; 2099 } 2100 2101 2102 void wlan_mlme_get_tl_delayed_trgr_frm_int(struct wlan_objmgr_psoc *psoc, 2103 uint32_t *value) 2104 { 2105 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2106 2107 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2108 if (!mlme_obj) { 2109 *value = cfg_default(CFG_TL_DELAYED_TRGR_FRM_INTERVAL); 2110 return; 2111 } 2112 2113 *value = mlme_obj->cfg.wmm_params.delayed_trigger_frm_int; 2114 } 2115 2116 2117 QDF_STATUS wlan_mlme_get_wmm_dir_ac_vo(struct wlan_objmgr_psoc *psoc, 2118 uint8_t *value) 2119 { 2120 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2121 2122 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2123 if (!mlme_obj) 2124 return QDF_STATUS_E_FAILURE; 2125 2126 *value = mlme_obj->cfg.wmm_params.ac_vo.dir_ac_vo; 2127 2128 return QDF_STATUS_SUCCESS; 2129 } 2130 2131 2132 QDF_STATUS wlan_mlme_get_wmm_nom_msdu_size_ac_vo(struct wlan_objmgr_psoc *psoc, 2133 uint16_t *value) 2134 { 2135 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2136 2137 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2138 if (!mlme_obj) 2139 return QDF_STATUS_E_FAILURE; 2140 2141 *value = mlme_obj->cfg.wmm_params.ac_vo.nom_msdu_size_ac_vo; 2142 return QDF_STATUS_SUCCESS; 2143 } 2144 2145 QDF_STATUS 2146 wlan_mlme_get_wmm_mean_data_rate_ac_vo(struct wlan_objmgr_psoc *psoc, 2147 uint32_t *value) 2148 { 2149 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2150 2151 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2152 if (!mlme_obj) 2153 return QDF_STATUS_E_FAILURE; 2154 2155 *value = mlme_obj->cfg.wmm_params.ac_vo.mean_data_rate_ac_vo; 2156 2157 return QDF_STATUS_SUCCESS; 2158 } 2159 2160 QDF_STATUS wlan_mlme_get_wmm_min_phy_rate_ac_vo(struct wlan_objmgr_psoc *psoc, 2161 uint32_t *value) 2162 { 2163 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2164 2165 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2166 if (!mlme_obj) 2167 return QDF_STATUS_E_FAILURE; 2168 2169 *value = mlme_obj->cfg.wmm_params.ac_vo.min_phy_rate_ac_vo; 2170 return QDF_STATUS_SUCCESS; 2171 } 2172 2173 QDF_STATUS 2174 wlan_mlme_get_wmm_sba_ac_vo(struct wlan_objmgr_psoc *psoc, uint16_t *value) 2175 { 2176 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2177 2178 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2179 if (!mlme_obj) { 2180 return QDF_STATUS_E_FAILURE; 2181 } 2182 2183 *value = mlme_obj->cfg.wmm_params.ac_vo.sba_ac_vo; 2184 2185 return QDF_STATUS_SUCCESS; 2186 } 2187 2188 QDF_STATUS wlan_mlme_get_wmm_uapsd_vo_srv_intv(struct wlan_objmgr_psoc *psoc, 2189 uint32_t *value) 2190 { 2191 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2192 2193 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2194 if (!mlme_obj) 2195 return QDF_STATUS_E_FAILURE; 2196 2197 *value = mlme_obj->cfg.wmm_params.ac_vo.uapsd_vo_srv_intv; 2198 2199 return QDF_STATUS_SUCCESS; 2200 } 2201 2202 QDF_STATUS wlan_mlme_get_wmm_uapsd_vo_sus_intv(struct wlan_objmgr_psoc *psoc, 2203 uint32_t *value) 2204 { 2205 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2206 2207 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2208 if (!mlme_obj) 2209 return QDF_STATUS_E_FAILURE; 2210 2211 *value = mlme_obj->cfg.wmm_params.ac_vo.uapsd_vo_sus_intv; 2212 2213 return QDF_STATUS_SUCCESS; 2214 } 2215 2216 QDF_STATUS wlan_mlme_cfg_get_vht_ampdu_len_exp(struct wlan_objmgr_psoc *psoc, 2217 uint8_t *value) 2218 { 2219 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2220 2221 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2222 if (!mlme_obj) 2223 return QDF_STATUS_E_FAILURE; 2224 2225 *value = mlme_obj->cfg.vht_caps.vht_cap_info.ampdu_len_exponent; 2226 2227 return QDF_STATUS_SUCCESS; 2228 } 2229 2230 QDF_STATUS wlan_mlme_cfg_get_vht_max_mpdu_len(struct wlan_objmgr_psoc *psoc, 2231 uint8_t *value) 2232 { 2233 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2234 2235 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2236 if (!mlme_obj) 2237 return QDF_STATUS_E_FAILURE; 2238 2239 *value = mlme_obj->cfg.vht_caps.vht_cap_info.ampdu_len; 2240 2241 return QDF_STATUS_SUCCESS; 2242 } 2243 2244 QDF_STATUS wlan_mlme_cfg_get_ht_smps(struct wlan_objmgr_psoc *psoc, 2245 uint8_t *value) 2246 { 2247 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2248 2249 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2250 if (!mlme_obj) 2251 return QDF_STATUS_E_FAILURE; 2252 2253 *value = mlme_obj->cfg.ht_caps.smps; 2254 2255 return QDF_STATUS_SUCCESS; 2256 } 2257 2258 QDF_STATUS 2259 wlan_mlme_get_wmm_dir_ac_vi(struct wlan_objmgr_psoc *psoc, uint8_t *value) 2260 { 2261 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2262 2263 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2264 if (!mlme_obj) 2265 return QDF_STATUS_E_FAILURE; 2266 2267 *value = mlme_obj->cfg.wmm_params.ac_vi.dir_ac_vi; 2268 2269 return QDF_STATUS_SUCCESS; 2270 } 2271 2272 QDF_STATUS wlan_mlme_get_wmm_nom_msdu_size_ac_vi(struct wlan_objmgr_psoc *psoc, 2273 uint16_t *value) 2274 { 2275 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2276 2277 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2278 if (!mlme_obj) 2279 return QDF_STATUS_E_FAILURE; 2280 2281 *value = 2282 mlme_obj->cfg.wmm_params.ac_vi.nom_msdu_size_ac_vi; 2283 2284 return QDF_STATUS_SUCCESS; 2285 } 2286 2287 QDF_STATUS 2288 wlan_mlme_get_wmm_mean_data_rate_ac_vi(struct wlan_objmgr_psoc *psoc, 2289 uint32_t *value) 2290 { 2291 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2292 2293 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2294 if (!mlme_obj) 2295 return QDF_STATUS_E_FAILURE; 2296 2297 *value = mlme_obj->cfg.wmm_params.ac_vi.mean_data_rate_ac_vi; 2298 2299 return QDF_STATUS_SUCCESS; 2300 } 2301 2302 QDF_STATUS wlan_mlme_get_wmm_min_phy_rate_ac_vi(struct wlan_objmgr_psoc *psoc, 2303 uint32_t *value) 2304 { 2305 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2306 2307 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2308 if (!mlme_obj) 2309 return QDF_STATUS_E_FAILURE; 2310 2311 *value = mlme_obj->cfg.wmm_params.ac_vi.min_phy_rate_ac_vi; 2312 2313 return QDF_STATUS_SUCCESS; 2314 } 2315 2316 QDF_STATUS wlan_mlme_get_wmm_sba_ac_vi(struct wlan_objmgr_psoc *psoc, 2317 uint16_t *value) 2318 { 2319 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2320 2321 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2322 if (!mlme_obj) 2323 return QDF_STATUS_E_FAILURE; 2324 2325 *value = mlme_obj->cfg.wmm_params.ac_vi.sba_ac_vi; 2326 2327 return QDF_STATUS_SUCCESS; 2328 } 2329 2330 QDF_STATUS 2331 wlan_mlme_get_wmm_uapsd_vi_srv_intv(struct wlan_objmgr_psoc *psoc, 2332 uint32_t *value) 2333 { 2334 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2335 2336 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2337 if (!mlme_obj) 2338 return QDF_STATUS_E_FAILURE; 2339 2340 *value = mlme_obj->cfg.wmm_params.ac_vi.uapsd_vi_srv_intv; 2341 2342 return QDF_STATUS_SUCCESS; 2343 } 2344 2345 QDF_STATUS wlan_mlme_get_wmm_uapsd_vi_sus_intv(struct wlan_objmgr_psoc *psoc, 2346 uint32_t *value) 2347 { 2348 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2349 2350 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2351 if (!mlme_obj) 2352 return QDF_STATUS_E_FAILURE; 2353 2354 *value = mlme_obj->cfg.wmm_params.ac_vi.uapsd_vi_sus_intv; 2355 2356 return QDF_STATUS_SUCCESS; 2357 } 2358 2359 QDF_STATUS 2360 wlan_mlme_get_wmm_dir_ac_be(struct wlan_objmgr_psoc *psoc, uint8_t *value) 2361 { 2362 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2363 2364 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2365 if (!mlme_obj) 2366 return QDF_STATUS_E_FAILURE; 2367 2368 *value = mlme_obj->cfg.wmm_params.ac_be.dir_ac_be; 2369 2370 return QDF_STATUS_SUCCESS; 2371 } 2372 2373 QDF_STATUS wlan_mlme_get_wmm_nom_msdu_size_ac_be(struct wlan_objmgr_psoc *psoc, 2374 uint16_t *value) 2375 { 2376 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2377 2378 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2379 if (!mlme_obj) 2380 return QDF_STATUS_E_FAILURE; 2381 2382 *value = mlme_obj->cfg.wmm_params.ac_be.nom_msdu_size_ac_be; 2383 2384 return QDF_STATUS_SUCCESS; 2385 } 2386 2387 QDF_STATUS 2388 wlan_mlme_get_wmm_mean_data_rate_ac_be(struct wlan_objmgr_psoc *psoc, 2389 uint32_t *value) 2390 { 2391 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2392 2393 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2394 if (!mlme_obj) 2395 return QDF_STATUS_E_FAILURE; 2396 2397 *value = mlme_obj->cfg.wmm_params.ac_be.mean_data_rate_ac_be; 2398 2399 return QDF_STATUS_SUCCESS; 2400 } 2401 2402 QDF_STATUS wlan_mlme_get_wmm_min_phy_rate_ac_be(struct wlan_objmgr_psoc *psoc, 2403 uint32_t *value) 2404 { 2405 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2406 2407 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2408 if (!mlme_obj) 2409 return QDF_STATUS_E_FAILURE; 2410 2411 *value = mlme_obj->cfg.wmm_params.ac_be.min_phy_rate_ac_be; 2412 2413 return QDF_STATUS_SUCCESS; 2414 } 2415 2416 QDF_STATUS 2417 wlan_mlme_get_wmm_sba_ac_be(struct wlan_objmgr_psoc *psoc, uint16_t *value) 2418 { 2419 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2420 2421 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2422 if (!mlme_obj) 2423 return QDF_STATUS_E_FAILURE; 2424 2425 *value = mlme_obj->cfg.wmm_params.ac_be.sba_ac_be; 2426 2427 return QDF_STATUS_SUCCESS; 2428 } 2429 2430 QDF_STATUS wlan_mlme_get_wmm_uapsd_be_srv_intv(struct wlan_objmgr_psoc *psoc, 2431 uint32_t *value) 2432 { 2433 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2434 2435 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2436 if (!mlme_obj) 2437 return QDF_STATUS_E_FAILURE; 2438 2439 *value = mlme_obj->cfg.wmm_params.ac_be.uapsd_be_srv_intv; 2440 2441 return QDF_STATUS_SUCCESS; 2442 } 2443 2444 QDF_STATUS wlan_mlme_get_wmm_uapsd_be_sus_intv(struct wlan_objmgr_psoc *psoc, 2445 uint32_t *value) 2446 { 2447 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2448 2449 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2450 if (!mlme_obj) 2451 return QDF_STATUS_E_FAILURE; 2452 2453 *value = mlme_obj->cfg.wmm_params.ac_be.uapsd_be_sus_intv; 2454 2455 return QDF_STATUS_SUCCESS; 2456 } 2457 2458 QDF_STATUS 2459 wlan_mlme_get_wmm_dir_ac_bk(struct wlan_objmgr_psoc *psoc, uint8_t *value) 2460 { 2461 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2462 2463 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2464 if (!mlme_obj) 2465 return QDF_STATUS_E_FAILURE; 2466 2467 *value = mlme_obj->cfg.wmm_params.ac_bk.dir_ac_bk; 2468 2469 return QDF_STATUS_SUCCESS; 2470 } 2471 2472 QDF_STATUS wlan_mlme_get_wmm_nom_msdu_size_ac_bk(struct wlan_objmgr_psoc *psoc, 2473 uint16_t *value) 2474 { 2475 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2476 2477 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2478 if (!mlme_obj) 2479 return QDF_STATUS_E_FAILURE; 2480 2481 *value = mlme_obj->cfg.wmm_params.ac_bk.nom_msdu_size_ac_bk; 2482 2483 return QDF_STATUS_SUCCESS; 2484 } 2485 2486 QDF_STATUS 2487 wlan_mlme_get_wmm_mean_data_rate_ac_bk(struct wlan_objmgr_psoc *psoc, 2488 uint32_t *value) 2489 { 2490 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2491 2492 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2493 if (!mlme_obj) 2494 return QDF_STATUS_E_FAILURE; 2495 2496 *value = mlme_obj->cfg.wmm_params.ac_bk.mean_data_rate_ac_bk; 2497 2498 return QDF_STATUS_SUCCESS; 2499 } 2500 2501 QDF_STATUS wlan_mlme_get_wmm_min_phy_rate_ac_bk(struct wlan_objmgr_psoc *psoc, 2502 uint32_t *value) 2503 { 2504 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2505 2506 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2507 if (!mlme_obj) 2508 return QDF_STATUS_E_FAILURE; 2509 2510 *value = mlme_obj->cfg.wmm_params.ac_bk.min_phy_rate_ac_bk; 2511 2512 return QDF_STATUS_SUCCESS; 2513 } 2514 2515 QDF_STATUS 2516 wlan_mlme_get_wmm_sba_ac_bk(struct wlan_objmgr_psoc *psoc, uint16_t *value) 2517 { 2518 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2519 2520 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2521 if (!mlme_obj) 2522 return QDF_STATUS_E_FAILURE; 2523 2524 *value = mlme_obj->cfg.wmm_params.ac_bk.sba_ac_bk; 2525 2526 return QDF_STATUS_SUCCESS; 2527 } 2528 2529 QDF_STATUS 2530 wlan_mlme_get_wmm_uapsd_bk_srv_intv(struct wlan_objmgr_psoc *psoc, 2531 uint32_t *value) 2532 { 2533 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2534 2535 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2536 if (!mlme_obj) 2537 return QDF_STATUS_E_FAILURE; 2538 2539 *value = mlme_obj->cfg.wmm_params.ac_bk.uapsd_bk_srv_intv; 2540 2541 return QDF_STATUS_SUCCESS; 2542 } 2543 2544 QDF_STATUS 2545 wlan_mlme_get_wmm_uapsd_bk_sus_intv(struct wlan_objmgr_psoc *psoc, 2546 uint32_t *value) 2547 { 2548 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2549 2550 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2551 if (!mlme_obj) 2552 return QDF_STATUS_E_FAILURE; 2553 2554 *value = mlme_obj->cfg.wmm_params.ac_bk.uapsd_bk_sus_intv; 2555 2556 return QDF_STATUS_SUCCESS; 2557 } 2558 2559 QDF_STATUS 2560 wlan_mlme_get_wmm_mode(struct wlan_objmgr_psoc *psoc, uint8_t *value) 2561 { 2562 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2563 2564 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2565 if (!mlme_obj) 2566 return QDF_STATUS_E_FAILURE; 2567 2568 *value = mlme_obj->cfg.wmm_params.wmm_config.wmm_mode; 2569 2570 return QDF_STATUS_SUCCESS; 2571 } 2572 2573 QDF_STATUS 2574 wlan_mlme_get_80211e_is_enabled(struct wlan_objmgr_psoc *psoc, bool *value) 2575 { 2576 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2577 2578 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2579 if (!mlme_obj) 2580 return QDF_STATUS_E_FAILURE; 2581 2582 *value = mlme_obj->cfg.wmm_params.wmm_config.b80211e_is_enabled; 2583 2584 return QDF_STATUS_SUCCESS; 2585 } 2586 2587 QDF_STATUS 2588 wlan_mlme_get_wmm_uapsd_mask(struct wlan_objmgr_psoc *psoc, uint8_t *value) 2589 { 2590 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2591 2592 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2593 if (!mlme_obj) 2594 return QDF_STATUS_E_FAILURE; 2595 2596 *value = mlme_obj->cfg.wmm_params.wmm_config.uapsd_mask; 2597 2598 return QDF_STATUS_SUCCESS; 2599 } 2600 2601 #ifdef FEATURE_WLAN_ESE 2602 void wlan_mlme_get_inactivity_interval(struct wlan_objmgr_psoc *psoc, 2603 uint32_t *value) 2604 { 2605 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2606 2607 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2608 if (!mlme_obj) { 2609 *value = cfg_default(CFG_QOS_WMM_INACTIVITY_INTERVAL); 2610 return; 2611 } 2612 2613 *value = mlme_obj->cfg.wmm_params.wmm_tspec_element.inactivity_intv; 2614 } 2615 #endif 2616 2617 void wlan_mlme_get_is_ts_burst_size_enable(struct wlan_objmgr_psoc *psoc, 2618 bool *value) 2619 { 2620 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2621 2622 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2623 if (!mlme_obj) { 2624 *value = cfg_default(CFG_QOS_WMM_BURST_SIZE_DEFN); 2625 return; 2626 } 2627 2628 *value = mlme_obj->cfg.wmm_params.wmm_tspec_element.burst_size_def; 2629 } 2630 2631 void wlan_mlme_get_ts_info_ack_policy(struct wlan_objmgr_psoc *psoc, 2632 enum mlme_ts_info_ack_policy *value) 2633 { 2634 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2635 2636 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2637 if (!mlme_obj) { 2638 *value = cfg_default(CFG_QOS_WMM_TS_INFO_ACK_POLICY); 2639 return; 2640 } 2641 2642 *value = mlme_obj->cfg.wmm_params.wmm_tspec_element.ts_ack_policy; 2643 2644 } 2645 2646 QDF_STATUS 2647 wlan_mlme_get_ts_acm_value_for_ac(struct wlan_objmgr_psoc *psoc, bool *value) 2648 { 2649 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2650 2651 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2652 if (!mlme_obj) 2653 return QDF_STATUS_E_FAILURE; 2654 2655 *value = mlme_obj->cfg.wmm_params.wmm_tspec_element.ts_acm_is_off; 2656 2657 return QDF_STATUS_SUCCESS; 2658 } 2659 2660 QDF_STATUS wlan_mlme_get_listen_interval(struct wlan_objmgr_psoc *psoc, 2661 int *value) 2662 { 2663 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2664 2665 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2666 if (!mlme_obj) 2667 return QDF_STATUS_E_FAILURE; 2668 2669 *value = mlme_obj->cfg.sap_cfg.listen_interval; 2670 2671 return QDF_STATUS_SUCCESS; 2672 } 2673 2674 QDF_STATUS wlan_mlme_set_sap_listen_interval(struct wlan_objmgr_psoc *psoc, 2675 int value) 2676 { 2677 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2678 2679 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2680 if (!mlme_obj) 2681 return QDF_STATUS_E_FAILURE; 2682 2683 if (cfg_in_range(CFG_LISTEN_INTERVAL, value)) 2684 mlme_obj->cfg.sap_cfg.listen_interval = value; 2685 else 2686 return QDF_STATUS_E_FAILURE; 2687 2688 return QDF_STATUS_SUCCESS; 2689 } 2690 2691 QDF_STATUS wlan_mlme_set_assoc_sta_limit(struct wlan_objmgr_psoc *psoc, 2692 int value) 2693 { 2694 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2695 2696 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2697 if (!mlme_obj) 2698 return QDF_STATUS_E_FAILURE; 2699 2700 if (cfg_in_range(CFG_ASSOC_STA_LIMIT, value) && 2701 (value <= mlme_obj->cfg.sap_cfg.sap_max_no_peers)) 2702 mlme_obj->cfg.sap_cfg.assoc_sta_limit = value; 2703 else 2704 return QDF_STATUS_E_FAILURE; 2705 2706 return QDF_STATUS_SUCCESS; 2707 } 2708 2709 QDF_STATUS wlan_mlme_get_assoc_sta_limit(struct wlan_objmgr_psoc *psoc, 2710 int *value) 2711 { 2712 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2713 2714 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2715 if (!mlme_obj) 2716 return QDF_STATUS_E_FAILURE; 2717 2718 *value = mlme_obj->cfg.sap_cfg.assoc_sta_limit; 2719 2720 return QDF_STATUS_SUCCESS; 2721 } 2722 2723 QDF_STATUS wlan_mlme_get_sap_get_peer_info(struct wlan_objmgr_psoc *psoc, 2724 bool *value) 2725 { 2726 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2727 2728 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2729 if (!mlme_obj) 2730 return QDF_STATUS_E_FAILURE; 2731 2732 *value = mlme_obj->cfg.sap_cfg.sap_get_peer_info; 2733 2734 return QDF_STATUS_SUCCESS; 2735 } 2736 2737 QDF_STATUS wlan_mlme_set_sap_get_peer_info(struct wlan_objmgr_psoc *psoc, 2738 bool value) 2739 { 2740 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2741 2742 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2743 if (!mlme_obj) 2744 return QDF_STATUS_E_FAILURE; 2745 2746 mlme_obj->cfg.sap_cfg.sap_get_peer_info = value; 2747 2748 return QDF_STATUS_SUCCESS; 2749 } 2750 2751 QDF_STATUS 2752 wlan_mlme_get_sap_bcast_deauth_enabled(struct wlan_objmgr_psoc *psoc, 2753 bool *value) 2754 { 2755 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2756 2757 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2758 if (!mlme_obj) 2759 return QDF_STATUS_E_FAILURE; 2760 2761 *value = mlme_obj->cfg.sap_cfg.is_sap_bcast_deauth_enabled; 2762 2763 return QDF_STATUS_SUCCESS; 2764 } 2765 2766 QDF_STATUS 2767 wlan_mlme_is_6g_sap_fd_enabled(struct wlan_objmgr_psoc *psoc, 2768 bool *value) 2769 { 2770 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2771 2772 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2773 if (!mlme_obj) 2774 return QDF_STATUS_E_FAILURE; 2775 2776 *value = mlme_obj->cfg.sap_cfg.is_6g_sap_fd_enabled; 2777 2778 return QDF_STATUS_SUCCESS; 2779 } 2780 2781 QDF_STATUS wlan_mlme_get_sap_allow_all_channels(struct wlan_objmgr_psoc *psoc, 2782 bool *value) 2783 { 2784 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2785 2786 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2787 if (!mlme_obj) 2788 return QDF_STATUS_E_FAILURE; 2789 2790 *value = mlme_obj->cfg.sap_cfg.sap_allow_all_chan_param_name; 2791 2792 return QDF_STATUS_SUCCESS; 2793 } 2794 2795 QDF_STATUS wlan_mlme_get_sap_max_peers(struct wlan_objmgr_psoc *psoc, 2796 int *value) 2797 { 2798 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2799 2800 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2801 if (!mlme_obj) 2802 return QDF_STATUS_E_FAILURE; 2803 2804 *value = mlme_obj->cfg.sap_cfg.sap_max_no_peers; 2805 2806 return QDF_STATUS_SUCCESS; 2807 } 2808 2809 QDF_STATUS wlan_mlme_set_sap_max_peers(struct wlan_objmgr_psoc *psoc, 2810 int value) 2811 { 2812 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2813 2814 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2815 if (!mlme_obj) 2816 return QDF_STATUS_E_FAILURE; 2817 2818 if (cfg_in_range(CFG_SAP_MAX_NO_PEERS, value)) 2819 mlme_obj->cfg.sap_cfg.sap_max_no_peers = value; 2820 else 2821 return QDF_STATUS_E_FAILURE; 2822 2823 return QDF_STATUS_SUCCESS; 2824 } 2825 2826 QDF_STATUS wlan_mlme_get_sap_max_offload_peers(struct wlan_objmgr_psoc *psoc, 2827 int *value) 2828 { 2829 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2830 2831 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2832 if (!mlme_obj) 2833 return QDF_STATUS_E_FAILURE; 2834 2835 *value = mlme_obj->cfg.sap_cfg.sap_max_offload_peers; 2836 2837 return QDF_STATUS_SUCCESS; 2838 } 2839 2840 QDF_STATUS wlan_mlme_get_sap_max_offload_reorder_buffs(struct wlan_objmgr_psoc 2841 *psoc, int *value) 2842 { 2843 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2844 2845 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2846 if (!mlme_obj) 2847 return QDF_STATUS_E_FAILURE; 2848 2849 *value = mlme_obj->cfg.sap_cfg.sap_max_offload_reorder_buffs; 2850 2851 return QDF_STATUS_SUCCESS; 2852 } 2853 2854 QDF_STATUS wlan_mlme_get_sap_chn_switch_bcn_count(struct wlan_objmgr_psoc *psoc, 2855 int *value) 2856 { 2857 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2858 2859 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2860 if (!mlme_obj) 2861 return QDF_STATUS_E_FAILURE; 2862 2863 *value = mlme_obj->cfg.sap_cfg.sap_ch_switch_beacon_cnt; 2864 2865 return QDF_STATUS_SUCCESS; 2866 } 2867 2868 QDF_STATUS wlan_mlme_get_sap_chn_switch_mode(struct wlan_objmgr_psoc *psoc, 2869 bool *value) 2870 { 2871 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2872 2873 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2874 if (!mlme_obj) 2875 return QDF_STATUS_E_FAILURE; 2876 2877 *value = mlme_obj->cfg.sap_cfg.sap_ch_switch_mode; 2878 2879 return QDF_STATUS_SUCCESS; 2880 } 2881 2882 QDF_STATUS wlan_mlme_get_sap_internal_restart(struct wlan_objmgr_psoc *psoc, 2883 bool *value) 2884 { 2885 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2886 2887 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2888 if (!mlme_obj) 2889 return QDF_STATUS_E_FAILURE; 2890 2891 *value = mlme_obj->cfg.sap_cfg.sap_internal_restart; 2892 2893 return QDF_STATUS_SUCCESS; 2894 } 2895 2896 QDF_STATUS wlan_mlme_get_sap_max_modulated_dtim(struct wlan_objmgr_psoc *psoc, 2897 uint8_t *value) 2898 { 2899 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2900 2901 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2902 if (!mlme_obj) 2903 return QDF_STATUS_E_FAILURE; 2904 2905 *value = mlme_obj->cfg.sap_cfg.max_li_modulated_dtim_time; 2906 2907 return QDF_STATUS_SUCCESS; 2908 } 2909 2910 QDF_STATUS wlan_mlme_get_sap_chan_pref_location(struct wlan_objmgr_psoc *psoc, 2911 uint8_t *value) 2912 { 2913 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2914 2915 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2916 if (!mlme_obj) 2917 return QDF_STATUS_E_FAILURE; 2918 2919 *value = mlme_obj->cfg.sap_cfg.sap_pref_chan_location; 2920 2921 return QDF_STATUS_SUCCESS; 2922 } 2923 2924 QDF_STATUS wlan_mlme_get_sap_country_priority(struct wlan_objmgr_psoc *psoc, 2925 bool *value) 2926 { 2927 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2928 2929 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2930 if (!mlme_obj) 2931 return QDF_STATUS_E_FAILURE; 2932 2933 *value = mlme_obj->cfg.sap_cfg.country_code_priority; 2934 2935 return QDF_STATUS_SUCCESS; 2936 } 2937 2938 QDF_STATUS wlan_mlme_get_sap_reduced_beacon_interval(struct wlan_objmgr_psoc 2939 *psoc, int *value) 2940 { 2941 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2942 2943 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2944 if (!mlme_obj) { 2945 *value = cfg_default(CFG_REDUCED_BEACON_INTERVAL); 2946 return QDF_STATUS_E_FAILURE; 2947 } 2948 2949 *value = mlme_obj->cfg.sap_cfg.reduced_beacon_interval; 2950 2951 return QDF_STATUS_SUCCESS; 2952 } 2953 2954 QDF_STATUS wlan_mlme_get_sap_chan_switch_rate_enabled(struct wlan_objmgr_psoc 2955 *psoc, bool *value) 2956 { 2957 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2958 2959 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2960 if (!mlme_obj) 2961 return QDF_STATUS_E_FAILURE; 2962 2963 *value = mlme_obj->cfg.sap_cfg.chan_switch_hostapd_rate_enabled_name; 2964 2965 return QDF_STATUS_SUCCESS; 2966 } 2967 2968 QDF_STATUS wlan_mlme_get_sap_force_11n_for_11ac(struct wlan_objmgr_psoc 2969 *psoc, bool *value) 2970 { 2971 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2972 2973 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2974 if (!mlme_obj) 2975 return QDF_STATUS_E_FAILURE; 2976 2977 *value = mlme_obj->cfg.sap_cfg.sap_force_11n_for_11ac; 2978 2979 return QDF_STATUS_SUCCESS; 2980 } 2981 2982 QDF_STATUS wlan_mlme_get_go_force_11n_for_11ac(struct wlan_objmgr_psoc 2983 *psoc, bool *value) 2984 { 2985 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2986 2987 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2988 if (!mlme_obj) 2989 return QDF_STATUS_E_FAILURE; 2990 2991 *value = mlme_obj->cfg.sap_cfg.go_force_11n_for_11ac; 2992 2993 return QDF_STATUS_SUCCESS; 2994 } 2995 2996 QDF_STATUS wlan_mlme_is_sap_11ac_override(struct wlan_objmgr_psoc *psoc, 2997 bool *value) 2998 { 2999 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3000 3001 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3002 if (!mlme_obj) { 3003 *value = cfg_default(CFG_SAP_11AC_OVERRIDE); 3004 return QDF_STATUS_E_FAILURE; 3005 } 3006 *value = mlme_obj->cfg.sap_cfg.sap_11ac_override; 3007 3008 return QDF_STATUS_SUCCESS; 3009 } 3010 3011 QDF_STATUS wlan_mlme_is_go_11ac_override(struct wlan_objmgr_psoc *psoc, 3012 bool *value) 3013 { 3014 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3015 3016 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3017 if (!mlme_obj) { 3018 *value = cfg_default(CFG_GO_11AC_OVERRIDE); 3019 return QDF_STATUS_E_FAILURE; 3020 } 3021 *value = mlme_obj->cfg.sap_cfg.go_11ac_override; 3022 3023 return QDF_STATUS_SUCCESS; 3024 } 3025 3026 QDF_STATUS wlan_mlme_set_sap_11ac_override(struct wlan_objmgr_psoc *psoc, 3027 bool value) 3028 { 3029 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3030 3031 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3032 if (!mlme_obj) 3033 return QDF_STATUS_E_FAILURE; 3034 mlme_obj->cfg.sap_cfg.sap_11ac_override = value; 3035 3036 return QDF_STATUS_SUCCESS; 3037 } 3038 3039 QDF_STATUS wlan_mlme_set_go_11ac_override(struct wlan_objmgr_psoc *psoc, 3040 bool value) 3041 { 3042 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3043 3044 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3045 if (!mlme_obj) 3046 return QDF_STATUS_E_FAILURE; 3047 mlme_obj->cfg.sap_cfg.go_11ac_override = value; 3048 3049 return QDF_STATUS_SUCCESS; 3050 } 3051 3052 QDF_STATUS wlan_mlme_get_bigtk_support(struct wlan_objmgr_psoc *psoc, 3053 bool *value) 3054 { 3055 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 3056 3057 if (!mlme_obj) 3058 return QDF_STATUS_E_FAILURE; 3059 3060 *value = mlme_obj->cfg.gen.bigtk_support; 3061 3062 return QDF_STATUS_SUCCESS; 3063 } 3064 3065 QDF_STATUS wlan_mlme_get_ocv_support(struct wlan_objmgr_psoc *psoc, 3066 bool *value) 3067 { 3068 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 3069 3070 if (!mlme_obj) 3071 return QDF_STATUS_E_FAILURE; 3072 3073 *value = mlme_obj->cfg.gen.ocv_support; 3074 3075 return QDF_STATUS_SUCCESS; 3076 } 3077 3078 bool wlan_mlme_get_host_scan_abort_support(struct wlan_objmgr_psoc *psoc) 3079 { 3080 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 3081 3082 if (!mlme_obj) 3083 return false; 3084 3085 return mlme_obj->cfg.gen.stop_all_host_scan_support; 3086 } 3087 3088 bool wlan_mlme_get_dual_sta_roam_support(struct wlan_objmgr_psoc *psoc) 3089 { 3090 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 3091 3092 if (!mlme_obj) 3093 return false; 3094 3095 return mlme_obj->cfg.gen.dual_sta_roam_fw_support; 3096 } 3097 3098 QDF_STATUS wlan_mlme_get_oce_sta_enabled_info(struct wlan_objmgr_psoc *psoc, 3099 bool *value) 3100 { 3101 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 3102 3103 if (!mlme_obj) 3104 return QDF_STATUS_E_FAILURE; 3105 3106 *value = mlme_obj->cfg.oce.oce_sta_enabled; 3107 return QDF_STATUS_SUCCESS; 3108 } 3109 3110 QDF_STATUS wlan_mlme_get_oce_sap_enabled_info(struct wlan_objmgr_psoc *psoc, 3111 bool *value) 3112 { 3113 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 3114 3115 if (!mlme_obj) 3116 return QDF_STATUS_E_FAILURE; 3117 3118 *value = mlme_obj->cfg.oce.oce_sap_enabled; 3119 return QDF_STATUS_SUCCESS; 3120 } 3121 3122 /** 3123 * wlan_mlme_send_oce_flags_fw() - Send the oce flags to FW 3124 * @pdev: pointer to pdev object 3125 * @object: vdev object 3126 * @arg: Arguments to the handler 3127 * 3128 * Return: void 3129 */ 3130 static void wlan_mlme_send_oce_flags_fw(struct wlan_objmgr_pdev *pdev, 3131 void *object, void *arg) 3132 { 3133 struct wlan_objmgr_vdev *vdev = object; 3134 uint8_t *updated_fw_value = arg; 3135 uint8_t *dynamic_fw_value = 0; 3136 uint8_t vdev_id; 3137 3138 if (wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE) { 3139 dynamic_fw_value = mlme_get_dynamic_oce_flags(vdev); 3140 if (!dynamic_fw_value) 3141 return; 3142 if (*updated_fw_value == *dynamic_fw_value) { 3143 mlme_legacy_debug("Current FW flags matches with updated value."); 3144 return; 3145 } 3146 *dynamic_fw_value = *updated_fw_value; 3147 vdev_id = wlan_vdev_get_id(vdev); 3148 if (wma_cli_set_command(vdev_id, 3149 wmi_vdev_param_enable_disable_oce_features, 3150 *updated_fw_value, VDEV_CMD)) 3151 mlme_legacy_err("Failed to send OCE update to FW"); 3152 } 3153 } 3154 3155 void wlan_mlme_update_oce_flags(struct wlan_objmgr_pdev *pdev) 3156 { 3157 uint16_t sap_connected_peer, go_connected_peer; 3158 struct wlan_objmgr_psoc *psoc = NULL; 3159 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3160 uint8_t updated_fw_value = 0; 3161 3162 psoc = wlan_pdev_get_psoc(pdev); 3163 if (!psoc) 3164 return; 3165 3166 sap_connected_peer = 3167 wlan_util_get_peer_count_for_mode(pdev, QDF_SAP_MODE); 3168 go_connected_peer = 3169 wlan_util_get_peer_count_for_mode(pdev, QDF_P2P_GO_MODE); 3170 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3171 3172 if (!mlme_obj) 3173 return; 3174 3175 if (sap_connected_peer || go_connected_peer) { 3176 updated_fw_value = mlme_obj->cfg.oce.feature_bitmap; 3177 updated_fw_value &= 3178 ~(WMI_VDEV_OCE_PROBE_REQUEST_RATE_FEATURE_BITMAP); 3179 updated_fw_value &= 3180 ~(WMI_VDEV_OCE_PROBE_REQUEST_DEFERRAL_FEATURE_BITMAP); 3181 mlme_legacy_debug("Disable STA OCE probe req rate and defferal updated_fw_value :%d", 3182 updated_fw_value); 3183 } else { 3184 updated_fw_value = mlme_obj->cfg.oce.feature_bitmap; 3185 mlme_legacy_debug("Update the STA OCE flags to default INI updated_fw_value :%d", 3186 updated_fw_value); 3187 } 3188 3189 wlan_objmgr_pdev_iterate_obj_list(pdev, WLAN_VDEV_OP, 3190 wlan_mlme_send_oce_flags_fw, 3191 &updated_fw_value, 0, WLAN_MLME_NB_ID); 3192 } 3193 3194 bool wlan_mlme_is_ap_prot_enabled(struct wlan_objmgr_psoc *psoc) 3195 { 3196 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3197 3198 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3199 if (!mlme_obj) 3200 return false; 3201 3202 return mlme_obj->cfg.sap_protection_cfg.is_ap_prot_enabled; 3203 } 3204 3205 QDF_STATUS wlan_mlme_get_ap_protection_mode(struct wlan_objmgr_psoc *psoc, 3206 uint16_t *value) 3207 { 3208 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3209 3210 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3211 if (!mlme_obj) 3212 return QDF_STATUS_E_FAILURE; 3213 3214 *value = mlme_obj->cfg.sap_protection_cfg.ap_protection_mode; 3215 3216 return QDF_STATUS_SUCCESS; 3217 } 3218 3219 QDF_STATUS wlan_mlme_is_ap_obss_prot_enabled(struct wlan_objmgr_psoc *psoc, 3220 bool *value) 3221 { 3222 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3223 3224 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3225 if (!mlme_obj) 3226 return QDF_STATUS_E_FAILURE; 3227 3228 *value = mlme_obj->cfg.sap_protection_cfg.enable_ap_obss_protection; 3229 3230 return QDF_STATUS_SUCCESS; 3231 } 3232 3233 QDF_STATUS wlan_mlme_get_rts_threshold(struct wlan_objmgr_psoc *psoc, 3234 uint32_t *value) 3235 { 3236 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3237 3238 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3239 if (!mlme_obj) 3240 return QDF_STATUS_E_FAILURE; 3241 3242 *value = mlme_obj->cfg.threshold.rts_threshold; 3243 3244 return QDF_STATUS_SUCCESS; 3245 } 3246 3247 QDF_STATUS wlan_mlme_set_rts_threshold(struct wlan_objmgr_psoc *psoc, 3248 uint32_t value) 3249 { 3250 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3251 tp_wma_handle wma_handle; 3252 3253 wma_handle = cds_get_context(QDF_MODULE_ID_WMA); 3254 3255 if (!wma_handle) 3256 return QDF_STATUS_E_INVAL; 3257 3258 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3259 3260 if (!mlme_obj) 3261 return QDF_STATUS_E_FAILURE; 3262 3263 mlme_obj->cfg.threshold.rts_threshold = value; 3264 wma_update_rts_params(wma_handle, value); 3265 3266 return QDF_STATUS_SUCCESS; 3267 } 3268 3269 QDF_STATUS wlan_mlme_get_frag_threshold(struct wlan_objmgr_psoc *psoc, 3270 uint32_t *value) 3271 { 3272 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3273 3274 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3275 if (!mlme_obj) 3276 return QDF_STATUS_E_FAILURE; 3277 3278 *value = mlme_obj->cfg.threshold.frag_threshold; 3279 3280 return QDF_STATUS_SUCCESS; 3281 } 3282 3283 QDF_STATUS wlan_mlme_set_frag_threshold(struct wlan_objmgr_psoc *psoc, 3284 uint32_t value) 3285 { 3286 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3287 tp_wma_handle wma_handle; 3288 3289 wma_handle = cds_get_context(QDF_MODULE_ID_WMA); 3290 3291 if (!wma_handle) 3292 return QDF_STATUS_E_INVAL; 3293 3294 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3295 3296 if (!mlme_obj) 3297 return QDF_STATUS_E_FAILURE; 3298 3299 mlme_obj->cfg.threshold.frag_threshold = value; 3300 wma_update_frag_params(wma_handle, 3301 value); 3302 3303 return QDF_STATUS_SUCCESS; 3304 } 3305 3306 QDF_STATUS wlan_mlme_get_fils_enabled_info(struct wlan_objmgr_psoc *psoc, 3307 bool *value) 3308 { 3309 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 3310 3311 if (!mlme_obj) 3312 return QDF_STATUS_E_FAILURE; 3313 3314 *value = mlme_obj->cfg.oce.fils_enabled; 3315 return QDF_STATUS_SUCCESS; 3316 } 3317 3318 QDF_STATUS wlan_mlme_set_fils_enabled_info(struct wlan_objmgr_psoc *psoc, 3319 bool value) 3320 { 3321 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 3322 3323 if (!mlme_obj) 3324 return QDF_STATUS_E_FAILURE; 3325 3326 mlme_obj->cfg.oce.fils_enabled = value; 3327 return QDF_STATUS_SUCCESS; 3328 } 3329 3330 QDF_STATUS wlan_mlme_set_primary_interface(struct wlan_objmgr_psoc *psoc, 3331 uint8_t value) 3332 { 3333 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 3334 3335 if (!mlme_obj) 3336 return QDF_STATUS_E_FAILURE; 3337 3338 mlme_obj->cfg.gen.dual_sta_policy.primary_vdev_id = value; 3339 mlme_debug("Set primary iface to :%d", value); 3340 3341 return QDF_STATUS_SUCCESS; 3342 } 3343 3344 bool wlan_mlme_is_primary_interface_configured(struct wlan_objmgr_psoc *psoc) 3345 { 3346 return wlan_cm_same_band_sta_allowed(psoc); 3347 } 3348 3349 QDF_STATUS wlan_mlme_peer_get_assoc_rsp_ies(struct wlan_objmgr_peer *peer, 3350 const uint8_t **ie_buf, 3351 size_t *ie_len) 3352 { 3353 struct peer_mlme_priv_obj *peer_priv; 3354 3355 if (!peer || !ie_buf || !ie_len) 3356 return QDF_STATUS_E_INVAL; 3357 3358 *ie_buf = NULL; 3359 *ie_len = 0; 3360 3361 peer_priv = wlan_objmgr_peer_get_comp_private_obj(peer, 3362 WLAN_UMAC_COMP_MLME); 3363 3364 if (!peer_priv || peer_priv->assoc_rsp.len == 0) 3365 return QDF_STATUS_SUCCESS; 3366 3367 *ie_buf = peer_priv->assoc_rsp.ptr; 3368 *ie_len = peer_priv->assoc_rsp.len; 3369 3370 return QDF_STATUS_SUCCESS; 3371 } 3372 3373 int wlan_mlme_get_mcc_duty_cycle_percentage(struct wlan_objmgr_pdev *pdev) 3374 { 3375 struct wlan_objmgr_psoc *psoc = NULL; 3376 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3377 uint32_t op_ch_freq_list[MAX_NUMBER_OF_CONC_CONNECTIONS]; 3378 uint8_t vdev_id_list[MAX_NUMBER_OF_CONC_CONNECTIONS]; 3379 uint32_t i, operating_channel, quota_value = MCC_DUTY_CYCLE; 3380 struct dual_sta_policy *dual_sta_policy; 3381 uint32_t count, primary_sta_freq = 0, secondary_sta_freq = 0; 3382 3383 psoc = wlan_pdev_get_psoc(pdev); 3384 if (!psoc) 3385 return -EINVAL; 3386 3387 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3388 if (!mlme_obj) 3389 return -EINVAL; 3390 dual_sta_policy = &mlme_obj->cfg.gen.dual_sta_policy; 3391 3392 if (dual_sta_policy->primary_vdev_id == WLAN_INVALID_VDEV_ID || 3393 (dual_sta_policy->concurrent_sta_policy == 3394 QCA_WLAN_CONCURRENT_STA_POLICY_UNBIASED)) { 3395 mlme_debug("Invalid primary vdev id or policy is unbaised :%d", 3396 dual_sta_policy->concurrent_sta_policy); 3397 return -EINVAL; 3398 } 3399 3400 count = policy_mgr_get_mode_specific_conn_info(psoc, op_ch_freq_list, 3401 vdev_id_list, 3402 PM_STA_MODE); 3403 3404 /* Proceed only in case of STA+STA */ 3405 if (count != 2) { 3406 mlme_debug("STA+STA concurrency is not present"); 3407 return -EINVAL; 3408 } 3409 3410 for (i = 0; i < count; i++) { 3411 if (vdev_id_list[i] == dual_sta_policy->primary_vdev_id) { 3412 primary_sta_freq = op_ch_freq_list[i]; 3413 mlme_debug("primary sta vdev:%d at inxex:%d, freq:%d", 3414 i, vdev_id_list[i], op_ch_freq_list[i]); 3415 } else { 3416 secondary_sta_freq = op_ch_freq_list[i]; 3417 mlme_debug("secondary sta vdev:%d at inxex:%d, freq:%d", 3418 i, vdev_id_list[i], op_ch_freq_list[i]); 3419 } 3420 } 3421 3422 if (!primary_sta_freq || !secondary_sta_freq) { 3423 mlme_debug("Invalid primary or secondary sta freq"); 3424 return -EINVAL; 3425 } 3426 3427 operating_channel = wlan_freq_to_chan(primary_sta_freq); 3428 3429 /* 3430 * The channel numbers for both adapters and the time 3431 * quota for the 1st adapter, i.e., one specified in cmd 3432 * are formatted as a bit vector 3433 * ****************************************************** 3434 * |bit 31-24 | bit 23-16 | bits 15-8 |bits 7-0 | 3435 * | Unused | Quota for | chan. # for |chan. # for| 3436 * | | 1st chan | 1st chan. |2nd chan. | 3437 * ****************************************************** 3438 */ 3439 mlme_debug("First connection channel No.:%d and quota:%dms", 3440 operating_channel, quota_value); 3441 /* Move the time quota for first channel to bits 15-8 */ 3442 quota_value = quota_value << 8; 3443 /* 3444 * Store the channel number of 1st channel at bits 7-0 3445 * of the bit vector 3446 */ 3447 quota_value |= operating_channel; 3448 /* Second STA Connection */ 3449 operating_channel = wlan_freq_to_chan(secondary_sta_freq); 3450 if (!operating_channel) 3451 mlme_debug("Secondary adapter op channel is invalid"); 3452 /* 3453 * Now move the time quota and channel number of the 3454 * 1st adapter to bits 23-16 and bits 15-8 of the bit 3455 * vector, respectively. 3456 */ 3457 quota_value = quota_value << 8; 3458 /* 3459 * Set the channel number for 2nd MCC vdev at bits 3460 * 7-0 of set_value 3461 */ 3462 quota_value |= operating_channel; 3463 mlme_debug("quota value:%x", quota_value); 3464 3465 return quota_value; 3466 } 3467 3468 QDF_STATUS wlan_mlme_set_enable_bcast_probe_rsp(struct wlan_objmgr_psoc *psoc, 3469 bool value) 3470 { 3471 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 3472 3473 if (!mlme_obj) 3474 return QDF_STATUS_E_FAILURE; 3475 3476 mlme_obj->cfg.oce.enable_bcast_probe_rsp = value; 3477 return QDF_STATUS_SUCCESS; 3478 } 3479 3480 QDF_STATUS 3481 wlan_mlme_get_sta_miracast_mcc_rest_time(struct wlan_objmgr_psoc *psoc, 3482 uint32_t *value) 3483 { 3484 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3485 3486 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3487 if (!mlme_obj) 3488 return QDF_STATUS_E_FAILURE; 3489 3490 *value = mlme_obj->cfg.sta.sta_miracast_mcc_rest_time; 3491 3492 return QDF_STATUS_SUCCESS; 3493 } 3494 3495 QDF_STATUS 3496 wlan_mlme_get_max_modulated_dtim_ms(struct wlan_objmgr_psoc *psoc, 3497 uint16_t *value) 3498 { 3499 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3500 3501 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3502 if (!mlme_obj) 3503 return QDF_STATUS_E_FAILURE; 3504 3505 *value = mlme_obj->cfg.sta.max_li_modulated_dtim_time_ms; 3506 3507 return QDF_STATUS_SUCCESS; 3508 } 3509 3510 QDF_STATUS 3511 wlan_mlme_get_scan_probe_unicast_ra(struct wlan_objmgr_psoc *psoc, 3512 bool *value) 3513 { 3514 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3515 3516 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3517 if (!mlme_obj) 3518 return QDF_STATUS_E_FAILURE; 3519 3520 *value = mlme_obj->cfg.sta.usr_scan_probe_unicast_ra; 3521 3522 mlme_legacy_debug("scan_probe_unicast_ra %d", *value); 3523 3524 return QDF_STATUS_SUCCESS; 3525 } 3526 3527 QDF_STATUS 3528 wlan_mlme_set_scan_probe_unicast_ra(struct wlan_objmgr_psoc *psoc, 3529 bool value) 3530 { 3531 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3532 3533 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3534 if (!mlme_obj) 3535 return QDF_STATUS_E_FAILURE; 3536 3537 mlme_legacy_debug("scan_probe_unicast_ra %d", value); 3538 mlme_obj->cfg.sta.usr_scan_probe_unicast_ra = value; 3539 3540 return QDF_STATUS_SUCCESS; 3541 } 3542 3543 QDF_STATUS 3544 wlan_mlme_get_sap_mcc_chnl_avoid(struct wlan_objmgr_psoc *psoc, 3545 uint8_t *value) 3546 { 3547 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3548 3549 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3550 if (!mlme_obj) 3551 return QDF_STATUS_E_FAILURE; 3552 3553 *value = mlme_obj->cfg.sap_cfg.sap_mcc_chnl_avoid; 3554 3555 return QDF_STATUS_SUCCESS; 3556 } 3557 3558 QDF_STATUS 3559 wlan_mlme_get_mcc_bcast_prob_resp(struct wlan_objmgr_psoc *psoc, 3560 uint8_t *value) 3561 { 3562 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3563 3564 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3565 if (!mlme_obj) 3566 return QDF_STATUS_E_FAILURE; 3567 3568 *value = mlme_obj->cfg.feature_flags.mcc_bcast_prob_rsp; 3569 3570 return QDF_STATUS_SUCCESS; 3571 } 3572 3573 QDF_STATUS 3574 wlan_mlme_get_mcc_rts_cts_prot(struct wlan_objmgr_psoc *psoc, 3575 uint8_t *value) 3576 { 3577 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3578 3579 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3580 if (!mlme_obj) 3581 return QDF_STATUS_E_FAILURE; 3582 3583 *value = mlme_obj->cfg.feature_flags.mcc_rts_cts_prot; 3584 3585 return QDF_STATUS_SUCCESS; 3586 } 3587 3588 QDF_STATUS 3589 wlan_mlme_get_mcc_feature(struct wlan_objmgr_psoc *psoc, 3590 uint8_t *value) 3591 { 3592 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3593 3594 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3595 if (!mlme_obj) 3596 return QDF_STATUS_E_FAILURE; 3597 3598 *value = mlme_obj->cfg.feature_flags.enable_mcc; 3599 3600 return QDF_STATUS_SUCCESS; 3601 } 3602 3603 QDF_STATUS wlan_mlme_get_edca_params(struct wlan_mlme_edca_params *edca_params, 3604 uint8_t *data, enum e_edca_type edca_ac) 3605 { 3606 qdf_size_t len; 3607 3608 switch (edca_ac) { 3609 case edca_ani_acbe_local: 3610 len = edca_params->ani_acbe_l.len; 3611 wlan_mlme_get_cfg_str(data, &edca_params->ani_acbe_l, &len); 3612 break; 3613 3614 case edca_ani_acbk_local: 3615 len = edca_params->ani_acbk_l.len; 3616 wlan_mlme_get_cfg_str(data, &edca_params->ani_acbk_l, &len); 3617 break; 3618 3619 case edca_ani_acvi_local: 3620 len = edca_params->ani_acvi_l.len; 3621 wlan_mlme_get_cfg_str(data, &edca_params->ani_acvi_l, &len); 3622 break; 3623 3624 case edca_ani_acvo_local: 3625 len = edca_params->ani_acvo_l.len; 3626 wlan_mlme_get_cfg_str(data, &edca_params->ani_acvo_l, &len); 3627 break; 3628 3629 case edca_ani_acbk_bcast: 3630 len = edca_params->ani_acbk_b.len; 3631 wlan_mlme_get_cfg_str(data, &edca_params->ani_acbk_b, &len); 3632 break; 3633 3634 case edca_ani_acbe_bcast: 3635 len = edca_params->ani_acbe_b.len; 3636 wlan_mlme_get_cfg_str(data, &edca_params->ani_acbe_b, &len); 3637 break; 3638 3639 case edca_ani_acvi_bcast: 3640 len = edca_params->ani_acvi_b.len; 3641 wlan_mlme_get_cfg_str(data, &edca_params->ani_acvi_b, &len); 3642 break; 3643 3644 case edca_ani_acvo_bcast: 3645 len = edca_params->ani_acvo_b.len; 3646 wlan_mlme_get_cfg_str(data, &edca_params->ani_acvo_b, &len); 3647 break; 3648 3649 case edca_wme_acbe_local: 3650 len = edca_params->wme_acbe_l.len; 3651 wlan_mlme_get_cfg_str(data, &edca_params->wme_acbe_l, &len); 3652 break; 3653 3654 case edca_wme_acbk_local: 3655 len = edca_params->wme_acbk_l.len; 3656 wlan_mlme_get_cfg_str(data, &edca_params->wme_acbk_l, &len); 3657 break; 3658 3659 case edca_wme_acvi_local: 3660 len = edca_params->wme_acvi_l.len; 3661 wlan_mlme_get_cfg_str(data, &edca_params->wme_acvi_l, &len); 3662 break; 3663 3664 case edca_wme_acvo_local: 3665 len = edca_params->wme_acvo_l.len; 3666 wlan_mlme_get_cfg_str(data, &edca_params->wme_acvo_l, &len); 3667 break; 3668 3669 case edca_wme_acbe_bcast: 3670 len = edca_params->wme_acbe_b.len; 3671 wlan_mlme_get_cfg_str(data, &edca_params->wme_acbe_b, &len); 3672 break; 3673 3674 case edca_wme_acbk_bcast: 3675 len = edca_params->wme_acbk_b.len; 3676 wlan_mlme_get_cfg_str(data, &edca_params->wme_acbk_b, &len); 3677 break; 3678 3679 case edca_wme_acvi_bcast: 3680 len = edca_params->wme_acvi_b.len; 3681 wlan_mlme_get_cfg_str(data, &edca_params->wme_acvi_b, &len); 3682 break; 3683 3684 case edca_wme_acvo_bcast: 3685 len = edca_params->wme_acvo_b.len; 3686 wlan_mlme_get_cfg_str(data, &edca_params->wme_acvo_b, &len); 3687 break; 3688 3689 case edca_etsi_acbe_local: 3690 len = edca_params->etsi_acbe_l.len; 3691 wlan_mlme_get_cfg_str(data, &edca_params->etsi_acbe_l, &len); 3692 break; 3693 3694 case edca_etsi_acbk_local: 3695 len = edca_params->etsi_acbk_l.len; 3696 wlan_mlme_get_cfg_str(data, &edca_params->etsi_acbk_l, &len); 3697 break; 3698 3699 case edca_etsi_acvi_local: 3700 len = edca_params->etsi_acvi_l.len; 3701 wlan_mlme_get_cfg_str(data, &edca_params->etsi_acvi_l, &len); 3702 break; 3703 3704 case edca_etsi_acvo_local: 3705 len = edca_params->etsi_acvo_l.len; 3706 wlan_mlme_get_cfg_str(data, &edca_params->etsi_acvo_l, &len); 3707 break; 3708 3709 case edca_etsi_acbe_bcast: 3710 len = edca_params->etsi_acbe_b.len; 3711 wlan_mlme_get_cfg_str(data, &edca_params->etsi_acbe_b, &len); 3712 break; 3713 3714 case edca_etsi_acbk_bcast: 3715 len = edca_params->etsi_acbk_b.len; 3716 wlan_mlme_get_cfg_str(data, &edca_params->etsi_acbk_b, &len); 3717 break; 3718 3719 case edca_etsi_acvi_bcast: 3720 len = edca_params->etsi_acvi_b.len; 3721 wlan_mlme_get_cfg_str(data, &edca_params->etsi_acvi_b, &len); 3722 break; 3723 3724 case edca_etsi_acvo_bcast: 3725 len = edca_params->etsi_acvo_b.len; 3726 wlan_mlme_get_cfg_str(data, &edca_params->etsi_acvo_b, &len); 3727 break; 3728 default: 3729 mlme_legacy_err("Invalid edca access category"); 3730 return QDF_STATUS_E_INVAL; 3731 } 3732 return QDF_STATUS_SUCCESS; 3733 } 3734 3735 QDF_STATUS mlme_get_wep_key(struct wlan_objmgr_vdev *vdev, 3736 struct wlan_mlme_wep_cfg *wep_params, 3737 enum wep_key_id wep_keyid, uint8_t *default_key, 3738 qdf_size_t *key_len) 3739 { 3740 struct wlan_crypto_key *crypto_key = NULL; 3741 3742 if (wep_keyid >= WLAN_CRYPTO_MAXKEYIDX) { 3743 mlme_legacy_err("Incorrect wep key index %d", wep_keyid); 3744 return QDF_STATUS_E_INVAL; 3745 } 3746 crypto_key = wlan_crypto_get_key(vdev, wep_keyid); 3747 if (!crypto_key) { 3748 mlme_legacy_err("Crypto KEY not present"); 3749 return QDF_STATUS_E_INVAL; 3750 } 3751 3752 if (crypto_key->keylen > WLAN_CRYPTO_KEY_WEP104_LEN) { 3753 mlme_legacy_err("Key too large to hold"); 3754 return QDF_STATUS_E_INVAL; 3755 } 3756 *key_len = crypto_key->keylen; 3757 qdf_mem_copy(default_key, &crypto_key->keyval, crypto_key->keylen); 3758 3759 return QDF_STATUS_SUCCESS; 3760 } 3761 3762 QDF_STATUS 3763 wlan_mlme_is_11h_enabled(struct wlan_objmgr_psoc *psoc, bool *value) 3764 { 3765 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3766 3767 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3768 if (!mlme_obj) 3769 return QDF_STATUS_E_FAILURE; 3770 3771 *value = mlme_obj->cfg.gen.enabled_11h; 3772 3773 return QDF_STATUS_SUCCESS; 3774 } 3775 3776 QDF_STATUS 3777 wlan_mlme_set_11h_enabled(struct wlan_objmgr_psoc *psoc, bool value) 3778 { 3779 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3780 3781 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3782 if (!mlme_obj) 3783 return QDF_STATUS_E_FAILURE; 3784 3785 mlme_obj->cfg.gen.enabled_11h = value; 3786 3787 return QDF_STATUS_SUCCESS; 3788 } 3789 3790 QDF_STATUS 3791 wlan_mlme_is_11d_enabled(struct wlan_objmgr_psoc *psoc, bool *value) 3792 { 3793 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3794 3795 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3796 if (!mlme_obj) 3797 return QDF_STATUS_E_FAILURE; 3798 3799 *value = mlme_obj->cfg.gen.enabled_11d; 3800 3801 return QDF_STATUS_SUCCESS; 3802 } 3803 3804 QDF_STATUS 3805 wlan_mlme_set_11d_enabled(struct wlan_objmgr_psoc *psoc, bool value) 3806 { 3807 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3808 3809 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3810 if (!mlme_obj) 3811 return QDF_STATUS_E_FAILURE; 3812 3813 mlme_obj->cfg.gen.enabled_11d = value; 3814 3815 return QDF_STATUS_SUCCESS; 3816 } 3817 3818 QDF_STATUS 3819 wlan_mlme_is_rf_test_mode_enabled(struct wlan_objmgr_psoc *psoc, bool *value) 3820 { 3821 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3822 3823 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3824 if (!mlme_obj) { 3825 *value = false; 3826 return QDF_STATUS_E_FAILURE; 3827 } 3828 3829 *value = mlme_obj->cfg.gen.enabled_rf_test_mode; 3830 3831 return QDF_STATUS_SUCCESS; 3832 } 3833 3834 QDF_STATUS 3835 wlan_mlme_set_rf_test_mode_enabled(struct wlan_objmgr_psoc *psoc, bool value) 3836 { 3837 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3838 3839 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3840 if (!mlme_obj) 3841 return QDF_STATUS_E_FAILURE; 3842 3843 mlme_obj->cfg.gen.enabled_rf_test_mode = value; 3844 3845 return QDF_STATUS_SUCCESS; 3846 } 3847 3848 #ifdef CONFIG_BAND_6GHZ 3849 QDF_STATUS 3850 wlan_mlme_is_standard_6ghz_conn_policy_enabled(struct wlan_objmgr_psoc *psoc, 3851 bool *value) 3852 { 3853 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3854 3855 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3856 if (!mlme_obj) 3857 return QDF_STATUS_E_FAILURE; 3858 3859 *value = mlme_obj->cfg.gen.std_6ghz_conn_policy; 3860 3861 return QDF_STATUS_SUCCESS; 3862 } 3863 3864 QDF_STATUS 3865 wlan_mlme_is_disable_vlp_sta_conn_to_sp_ap_enabled( 3866 struct wlan_objmgr_psoc *psoc, 3867 bool *value) 3868 { 3869 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3870 3871 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3872 if (!mlme_obj) 3873 return QDF_STATUS_E_FAILURE; 3874 3875 *value = mlme_obj->cfg.gen.disable_vlp_sta_conn_to_sp_ap; 3876 3877 return QDF_STATUS_SUCCESS; 3878 } 3879 #endif 3880 3881 #ifdef WLAN_FEATURE_11BE_MLO 3882 QDF_STATUS 3883 wlan_mlme_get_eht_mode(struct wlan_objmgr_psoc *psoc, enum wlan_eht_mode *value) 3884 { 3885 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3886 3887 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3888 if (!mlme_obj) 3889 return QDF_STATUS_E_FAILURE; 3890 3891 *value = mlme_obj->cfg.gen.eht_mode; 3892 3893 return QDF_STATUS_SUCCESS; 3894 } 3895 3896 QDF_STATUS 3897 wlan_mlme_get_emlsr_mode_enabled(struct wlan_objmgr_psoc *psoc, bool *value) 3898 { 3899 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3900 3901 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3902 if (!mlme_obj) 3903 return QDF_STATUS_E_FAILURE; 3904 3905 *value = mlme_obj->cfg.gen.enable_emlsr_mode; 3906 3907 return QDF_STATUS_SUCCESS; 3908 } 3909 3910 QDF_STATUS 3911 wlan_mlme_set_eht_mode(struct wlan_objmgr_psoc *psoc, enum wlan_eht_mode value) 3912 { 3913 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3914 3915 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3916 if (!mlme_obj) 3917 return QDF_STATUS_E_FAILURE; 3918 3919 mlme_obj->cfg.gen.eht_mode = value; 3920 3921 return QDF_STATUS_SUCCESS; 3922 } 3923 3924 QDF_STATUS 3925 wlan_mlme_set_emlsr_mode_enabled(struct wlan_objmgr_psoc *psoc, bool value) 3926 { 3927 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3928 3929 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3930 if (!mlme_obj) 3931 return QDF_STATUS_E_FAILURE; 3932 3933 mlme_obj->cfg.gen.enable_emlsr_mode = value; 3934 3935 return QDF_STATUS_SUCCESS; 3936 } 3937 3938 void 3939 wlan_mlme_set_eml_params(struct wlan_objmgr_psoc *psoc, 3940 struct wlan_psoc_host_mac_phy_caps_ext2 *cap) 3941 { 3942 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3943 3944 if (!cap->emlcap.emlsr_supp) { 3945 mlme_legacy_debug("EMLSR supp: %d", cap->emlcap.emlsr_supp); 3946 return; 3947 } 3948 3949 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3950 if (!mlme_obj) { 3951 mlme_legacy_err("No psoc object"); 3952 return; 3953 } 3954 mlme_obj->cfg.eml_cap.emlsr_supp = cap->emlcap.emlsr_supp; 3955 mlme_obj->cfg.eml_cap.emlsr_pad_delay = cap->emlcap.emlsr_pad_delay; 3956 mlme_obj->cfg.eml_cap.emlsr_trans_delay = cap->emlcap.emlsr_trans_delay; 3957 mlme_obj->cfg.eml_cap.emlmr_supp = cap->emlcap.emlmr_supp; 3958 } 3959 3960 void 3961 wlan_mlme_get_eml_params(struct wlan_objmgr_psoc *psoc, 3962 struct wlan_mlo_eml_cap *cap) 3963 { 3964 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3965 3966 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3967 if (!mlme_obj) { 3968 mlme_legacy_err("No psoc object"); 3969 return; 3970 } 3971 cap->emlsr_supp = mlme_obj->cfg.eml_cap.emlsr_supp; 3972 cap->emlsr_pad_delay = mlme_obj->cfg.eml_cap.emlsr_pad_delay; 3973 cap->emlsr_trans_delay = mlme_obj->cfg.eml_cap.emlsr_trans_delay; 3974 cap->emlmr_supp = mlme_obj->cfg.eml_cap.emlmr_supp; 3975 } 3976 3977 void 3978 wlan_mlme_cfg_set_emlsr_pad_delay(struct wlan_objmgr_psoc *psoc, uint8_t val) 3979 { 3980 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3981 3982 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3983 if (!mlme_obj) { 3984 mlme_legacy_err("No psoc object"); 3985 return; 3986 } 3987 3988 if (val > mlme_obj->cfg.eml_cap.emlsr_pad_delay && 3989 val <= WLAN_ML_BV_CINFO_EMLCAP_EMLSRDELAY_256US) { 3990 mlme_obj->cfg.eml_cap.emlsr_pad_delay = val; 3991 mlme_debug("EMLSR padding delay configured to %d", val); 3992 } 3993 } 3994 3995 enum t2lm_negotiation_support 3996 wlan_mlme_get_t2lm_negotiation_supported(struct wlan_objmgr_psoc *psoc) 3997 { 3998 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3999 4000 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4001 if (!mlme_obj) 4002 return T2LM_NEGOTIATION_DISABLED; 4003 4004 return mlme_obj->cfg.gen.t2lm_negotiation_support; 4005 } 4006 4007 QDF_STATUS 4008 wlan_mlme_set_t2lm_negotiation_supported(struct wlan_objmgr_psoc *psoc, 4009 uint8_t value) 4010 { 4011 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4012 4013 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4014 if (!mlme_obj) 4015 return QDF_STATUS_E_FAILURE; 4016 4017 if (value > T2LM_NEGOTIATION_MAX) { 4018 mlme_err("Invalid value %d", value); 4019 return QDF_STATUS_E_INVAL; 4020 } 4021 4022 mlme_obj->cfg.gen.t2lm_negotiation_support = value; 4023 4024 return QDF_STATUS_SUCCESS; 4025 } 4026 4027 uint8_t 4028 wlan_mlme_get_eht_mld_id(struct wlan_objmgr_psoc *psoc) 4029 { 4030 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4031 4032 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4033 if (!mlme_obj) 4034 return 0; 4035 4036 return mlme_obj->cfg.gen.mld_id; 4037 } 4038 4039 QDF_STATUS 4040 wlan_mlme_set_eht_mld_id(struct wlan_objmgr_psoc *psoc, 4041 uint8_t value) 4042 { 4043 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4044 4045 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4046 if (!mlme_obj) 4047 return QDF_STATUS_E_FAILURE; 4048 4049 mlme_obj->cfg.gen.mld_id = value; 4050 4051 return QDF_STATUS_SUCCESS; 4052 } 4053 #endif 4054 4055 QDF_STATUS 4056 wlan_mlme_set_btm_abridge_flag(struct wlan_objmgr_psoc *psoc, 4057 bool value) 4058 { 4059 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4060 4061 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4062 if (!mlme_obj) 4063 return QDF_STATUS_E_FAILURE; 4064 4065 mlme_obj->cfg.btm.abridge_flag = value; 4066 4067 return QDF_STATUS_SUCCESS; 4068 } 4069 4070 bool 4071 wlan_mlme_get_btm_abridge_flag(struct wlan_objmgr_psoc *psoc) 4072 { 4073 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4074 4075 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4076 if (!mlme_obj) 4077 return false; 4078 4079 return mlme_obj->cfg.btm.abridge_flag; 4080 } 4081 4082 QDF_STATUS 4083 wlan_mlme_cfg_set_vht_chan_width(struct wlan_objmgr_psoc *psoc, uint8_t value) 4084 { 4085 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4086 4087 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4088 if (!mlme_obj) 4089 return QDF_STATUS_E_FAILURE; 4090 4091 mlme_obj->cfg.vht_caps.vht_cap_info.supp_chan_width = value; 4092 if (value == VHT_CAP_160_AND_80P80_SUPP || 4093 value == VHT_CAP_160_SUPP) { 4094 mlme_obj->cfg.vht_caps.vht_cap_info.vht_extended_nss_bw_cap = 1; 4095 mlme_obj->cfg.vht_caps.vht_cap_info.extended_nss_bw_supp = 0; 4096 } 4097 4098 return QDF_STATUS_SUCCESS; 4099 } 4100 4101 QDF_STATUS 4102 wlan_mlme_cfg_get_vht_chan_width(struct wlan_objmgr_psoc *psoc, uint8_t *value) 4103 { 4104 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4105 4106 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4107 if (!mlme_obj) 4108 return QDF_STATUS_E_FAILURE; 4109 4110 *value = mlme_obj->cfg.vht_caps.vht_cap_info.supp_chan_width; 4111 4112 return QDF_STATUS_SUCCESS; 4113 } 4114 4115 QDF_STATUS wlan_mlme_cfg_set_vht_ldpc_coding_cap(struct wlan_objmgr_psoc *psoc, 4116 bool value) 4117 { 4118 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4119 4120 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4121 if (!mlme_obj) 4122 return QDF_STATUS_E_FAILURE; 4123 4124 mlme_obj->cfg.vht_caps.vht_cap_info.ldpc_coding_cap = value; 4125 4126 return QDF_STATUS_SUCCESS; 4127 } 4128 4129 QDF_STATUS 4130 wlan_mlme_cfg_set_short_gi_160_mhz(struct wlan_objmgr_psoc *psoc, 4131 bool value) 4132 { 4133 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4134 4135 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4136 if (!mlme_obj) 4137 return QDF_STATUS_E_FAILURE; 4138 4139 mlme_obj->cfg.vht_caps.vht_cap_info.short_gi_160mhz = value; 4140 4141 return QDF_STATUS_SUCCESS; 4142 } 4143 4144 QDF_STATUS 4145 wlan_mlme_cfg_get_short_gi_160_mhz(struct wlan_objmgr_psoc *psoc, bool *value) 4146 { 4147 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4148 4149 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4150 if (!mlme_obj) 4151 return QDF_STATUS_E_FAILURE; 4152 4153 *value = mlme_obj->cfg.vht_caps.vht_cap_info.short_gi_160mhz; 4154 4155 return QDF_STATUS_SUCCESS; 4156 } 4157 4158 QDF_STATUS 4159 wlan_mlme_cfg_get_vht_tx_stbc(struct wlan_objmgr_psoc *psoc, bool *value) 4160 { 4161 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4162 4163 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4164 if (!mlme_obj) 4165 return QDF_STATUS_E_FAILURE; 4166 4167 *value = mlme_obj->cfg.vht_caps.vht_cap_info.tx_stbc; 4168 4169 return QDF_STATUS_SUCCESS; 4170 } 4171 4172 QDF_STATUS 4173 wlan_mlme_cfg_get_vht_rx_stbc(struct wlan_objmgr_psoc *psoc, bool *value) 4174 { 4175 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4176 4177 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4178 if (!mlme_obj) 4179 return QDF_STATUS_E_FAILURE; 4180 4181 *value = mlme_obj->cfg.vht_caps.vht_cap_info.rx_stbc; 4182 4183 return QDF_STATUS_SUCCESS; 4184 } 4185 4186 QDF_STATUS 4187 wlan_mlme_cfg_set_vht_tx_bfee_ant_supp(struct wlan_objmgr_psoc *psoc, 4188 uint8_t value) 4189 { 4190 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4191 4192 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4193 if (!mlme_obj) 4194 return QDF_STATUS_E_FAILURE; 4195 4196 mlme_obj->cfg.vht_caps.vht_cap_info.tx_bfee_ant_supp = value; 4197 4198 return QDF_STATUS_SUCCESS; 4199 } 4200 4201 QDF_STATUS 4202 wlan_mlme_cfg_get_vht_tx_bfee_ant_supp(struct wlan_objmgr_psoc *psoc, 4203 uint8_t *value) 4204 { 4205 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4206 4207 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4208 if (!mlme_obj) 4209 return QDF_STATUS_E_FAILURE; 4210 4211 *value = mlme_obj->cfg.vht_caps.vht_cap_info.tx_bfee_ant_supp; 4212 4213 return QDF_STATUS_SUCCESS; 4214 } 4215 4216 QDF_STATUS wlan_mlme_cfg_get_vht_rx_mcs_map(struct wlan_objmgr_psoc *psoc, 4217 uint32_t *value) 4218 { 4219 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4220 4221 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4222 if (!mlme_obj) 4223 return QDF_STATUS_E_FAILURE; 4224 4225 *value = mlme_obj->cfg.vht_caps.vht_cap_info.rx_mcs_map; 4226 4227 return QDF_STATUS_SUCCESS; 4228 } 4229 4230 QDF_STATUS wlan_mlme_cfg_set_vht_rx_mcs_map(struct wlan_objmgr_psoc *psoc, 4231 uint32_t value) 4232 { 4233 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4234 4235 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4236 if (!mlme_obj) 4237 return QDF_STATUS_E_FAILURE; 4238 4239 mlme_obj->cfg.vht_caps.vht_cap_info.rx_mcs_map = value; 4240 4241 return QDF_STATUS_SUCCESS; 4242 } 4243 4244 QDF_STATUS wlan_mlme_cfg_get_vht_tx_mcs_map(struct wlan_objmgr_psoc *psoc, 4245 uint32_t *value) 4246 { 4247 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4248 4249 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4250 if (!mlme_obj) 4251 return QDF_STATUS_E_FAILURE; 4252 4253 *value = mlme_obj->cfg.vht_caps.vht_cap_info.tx_mcs_map; 4254 4255 return QDF_STATUS_SUCCESS; 4256 } 4257 4258 QDF_STATUS wlan_mlme_cfg_set_vht_tx_mcs_map(struct wlan_objmgr_psoc *psoc, 4259 uint32_t value) 4260 { 4261 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4262 4263 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4264 if (!mlme_obj) 4265 return QDF_STATUS_E_FAILURE; 4266 4267 mlme_obj->cfg.vht_caps.vht_cap_info.tx_mcs_map = value; 4268 4269 return QDF_STATUS_SUCCESS; 4270 } 4271 4272 QDF_STATUS 4273 wlan_mlme_cfg_set_vht_rx_supp_data_rate(struct wlan_objmgr_psoc *psoc, 4274 uint32_t value) 4275 { 4276 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4277 4278 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4279 if (!mlme_obj) 4280 return QDF_STATUS_E_FAILURE; 4281 4282 mlme_obj->cfg.vht_caps.vht_cap_info.rx_supp_data_rate = value; 4283 4284 return QDF_STATUS_SUCCESS; 4285 } 4286 4287 QDF_STATUS 4288 wlan_mlme_cfg_set_vht_tx_supp_data_rate(struct wlan_objmgr_psoc *psoc, 4289 uint32_t value) 4290 { 4291 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4292 4293 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4294 if (!mlme_obj) 4295 return QDF_STATUS_E_FAILURE; 4296 4297 mlme_obj->cfg.vht_caps.vht_cap_info.tx_supp_data_rate = value; 4298 4299 return QDF_STATUS_SUCCESS; 4300 } 4301 4302 QDF_STATUS 4303 wlan_mlme_cfg_get_vht_basic_mcs_set(struct wlan_objmgr_psoc *psoc, 4304 uint32_t *value) 4305 { 4306 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4307 4308 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4309 if (!mlme_obj) 4310 return QDF_STATUS_E_FAILURE; 4311 4312 *value = mlme_obj->cfg.vht_caps.vht_cap_info.basic_mcs_set; 4313 4314 return QDF_STATUS_SUCCESS; 4315 } 4316 4317 QDF_STATUS 4318 wlan_mlme_cfg_set_vht_basic_mcs_set(struct wlan_objmgr_psoc *psoc, 4319 uint32_t value) 4320 { 4321 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4322 4323 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4324 if (!mlme_obj) 4325 return QDF_STATUS_E_FAILURE; 4326 4327 mlme_obj->cfg.vht_caps.vht_cap_info.basic_mcs_set = value; 4328 4329 return QDF_STATUS_SUCCESS; 4330 } 4331 4332 QDF_STATUS 4333 wlan_mlme_get_vht_enable_tx_bf(struct wlan_objmgr_psoc *psoc, bool *value) 4334 { 4335 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4336 4337 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4338 if (!mlme_obj) 4339 return QDF_STATUS_E_FAILURE; 4340 4341 *value = mlme_obj->cfg.vht_caps.vht_cap_info.su_bformee; 4342 4343 return QDF_STATUS_SUCCESS; 4344 } 4345 4346 QDF_STATUS 4347 wlan_mlme_get_vht_tx_su_beamformer(struct wlan_objmgr_psoc *psoc, bool *value) 4348 { 4349 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4350 4351 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4352 if (!mlme_obj) 4353 return QDF_STATUS_E_FAILURE; 4354 4355 *value = mlme_obj->cfg.vht_caps.vht_cap_info.su_bformer; 4356 4357 return QDF_STATUS_SUCCESS; 4358 } 4359 4360 QDF_STATUS 4361 wlan_mlme_get_vht_channel_width(struct wlan_objmgr_psoc *psoc, uint8_t *value) 4362 { 4363 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4364 4365 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4366 if (!mlme_obj) 4367 return QDF_STATUS_E_FAILURE; 4368 4369 *value = mlme_obj->cfg.vht_caps.vht_cap_info.channel_width; 4370 4371 return QDF_STATUS_SUCCESS; 4372 } 4373 4374 4375 QDF_STATUS 4376 wlan_mlme_get_vht_rx_mcs_8_9(struct wlan_objmgr_psoc *psoc, uint8_t *value) 4377 { 4378 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4379 4380 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4381 if (!mlme_obj) 4382 return QDF_STATUS_E_FAILURE; 4383 4384 *value = mlme_obj->cfg.vht_caps.vht_cap_info.rx_mcs; 4385 4386 return QDF_STATUS_SUCCESS; 4387 } 4388 4389 QDF_STATUS 4390 wlan_mlme_get_vht_tx_mcs_8_9(struct wlan_objmgr_psoc *psoc, uint8_t *value) 4391 { 4392 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4393 4394 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4395 if (!mlme_obj) 4396 return QDF_STATUS_E_FAILURE; 4397 4398 *value = mlme_obj->cfg.vht_caps.vht_cap_info.tx_mcs; 4399 4400 return QDF_STATUS_SUCCESS; 4401 } 4402 4403 QDF_STATUS 4404 wlan_mlme_get_vht_rx_mcs_2x2(struct wlan_objmgr_psoc *psoc, uint8_t *value) 4405 { 4406 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4407 4408 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4409 if (!mlme_obj) 4410 return QDF_STATUS_E_FAILURE; 4411 4412 *value = mlme_obj->cfg.vht_caps.vht_cap_info.rx_mcs2x2; 4413 4414 return QDF_STATUS_SUCCESS; 4415 } 4416 4417 QDF_STATUS 4418 wlan_mlme_get_vht_tx_mcs_2x2(struct wlan_objmgr_psoc *psoc, uint8_t *value) 4419 { 4420 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4421 4422 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4423 if (!mlme_obj) 4424 return QDF_STATUS_E_FAILURE; 4425 4426 *value = mlme_obj->cfg.vht_caps.vht_cap_info.tx_mcs2x2; 4427 4428 return QDF_STATUS_SUCCESS; 4429 } 4430 4431 QDF_STATUS 4432 wlan_mlme_get_vht20_mcs9(struct wlan_objmgr_psoc *psoc, bool *value) 4433 { 4434 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4435 4436 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4437 if (!mlme_obj) 4438 return QDF_STATUS_E_FAILURE; 4439 4440 *value = mlme_obj->cfg.vht_caps.vht_cap_info.enable_vht20_mcs9; 4441 4442 return QDF_STATUS_SUCCESS; 4443 } 4444 4445 QDF_STATUS 4446 wlan_mlme_get_indoor_support_for_nan(struct wlan_objmgr_psoc *psoc, 4447 bool *value) 4448 { 4449 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4450 4451 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4452 if (!mlme_obj) { 4453 *value = false; 4454 mlme_legacy_err("Failed to get MLME Obj"); 4455 return QDF_STATUS_E_INVAL; 4456 } 4457 4458 *value = mlme_obj->cfg.reg.enable_nan_on_indoor_channels; 4459 4460 return QDF_STATUS_SUCCESS; 4461 } 4462 4463 QDF_STATUS 4464 wlan_mlme_get_srd_master_mode_for_vdev(struct wlan_objmgr_psoc *psoc, 4465 enum QDF_OPMODE vdev_opmode, 4466 bool *value) 4467 { 4468 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4469 4470 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4471 if (!mlme_obj) { 4472 *value = false; 4473 mlme_legacy_err("Failed to get MLME Obj"); 4474 return QDF_STATUS_E_INVAL; 4475 } 4476 4477 switch (vdev_opmode) { 4478 case QDF_SAP_MODE: 4479 *value = mlme_obj->cfg.reg.etsi_srd_chan_in_master_mode & 4480 MLME_SRD_MASTER_MODE_SAP; 4481 break; 4482 case QDF_P2P_GO_MODE: 4483 *value = mlme_obj->cfg.reg.etsi_srd_chan_in_master_mode & 4484 MLME_SRD_MASTER_MODE_P2P_GO; 4485 break; 4486 case QDF_NAN_DISC_MODE: 4487 *value = mlme_obj->cfg.reg.etsi_srd_chan_in_master_mode & 4488 MLME_SRD_MASTER_MODE_NAN; 4489 break; 4490 default: 4491 mlme_legacy_err("Unexpected opmode %d", vdev_opmode); 4492 *value = false; 4493 } 4494 4495 return QDF_STATUS_SUCCESS; 4496 } 4497 4498 QDF_STATUS 4499 wlan_mlme_get_enable_dynamic_nss_chains_cfg(struct wlan_objmgr_psoc *psoc, 4500 bool *value) 4501 { 4502 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4503 4504 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4505 if (!mlme_obj) 4506 return QDF_STATUS_E_FAILURE; 4507 4508 *value = mlme_obj->cfg.nss_chains_ini_cfg.enable_dynamic_nss_chains_cfg; 4509 4510 return QDF_STATUS_SUCCESS; 4511 } 4512 4513 QDF_STATUS 4514 wlan_mlme_get_restart_sap_on_dynamic_nss_chains_cfg( 4515 struct wlan_objmgr_psoc *psoc, 4516 bool *value) 4517 { 4518 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4519 4520 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4521 if (!mlme_obj) 4522 return QDF_STATUS_E_FAILURE; 4523 4524 *value = 4525 mlme_obj->cfg.nss_chains_ini_cfg.restart_sap_on_dyn_nss_chains_cfg; 4526 4527 return QDF_STATUS_SUCCESS; 4528 } 4529 4530 QDF_STATUS 4531 wlan_mlme_cfg_get_dynamic_nss_chains_support(struct wlan_objmgr_psoc *psoc, 4532 bool *value) 4533 { 4534 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4535 4536 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4537 if (!mlme_obj) 4538 return QDF_STATUS_E_FAILURE; 4539 4540 *value = mlme_obj->cfg.dynamic_nss_chains_support; 4541 4542 return QDF_STATUS_SUCCESS; 4543 } 4544 4545 QDF_STATUS 4546 wlan_mlme_cfg_set_dynamic_nss_chains_support(struct wlan_objmgr_psoc *psoc, 4547 bool value) 4548 { 4549 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4550 4551 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4552 if (!mlme_obj) 4553 return QDF_STATUS_E_FAILURE; 4554 4555 mlme_obj->cfg.dynamic_nss_chains_support = value; 4556 4557 return QDF_STATUS_SUCCESS; 4558 } 4559 4560 QDF_STATUS 4561 wlan_mlme_get_vht_enable2x2(struct wlan_objmgr_psoc *psoc, bool *value) 4562 { 4563 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4564 4565 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4566 if (!mlme_obj) 4567 return QDF_STATUS_E_FAILURE; 4568 4569 *value = mlme_obj->cfg.vht_caps.vht_cap_info.enable2x2; 4570 4571 return QDF_STATUS_SUCCESS; 4572 } 4573 4574 QDF_STATUS 4575 wlan_mlme_get_force_sap_enabled(struct wlan_objmgr_psoc *psoc, bool *value) 4576 { 4577 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4578 4579 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4580 if (!mlme_obj) 4581 return QDF_STATUS_E_FAILURE; 4582 4583 *value = mlme_obj->cfg.acs.force_sap_start; 4584 4585 return QDF_STATUS_SUCCESS; 4586 } 4587 4588 QDF_STATUS 4589 wlan_mlme_set_vht_enable2x2(struct wlan_objmgr_psoc *psoc, bool value) 4590 { 4591 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4592 4593 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4594 if (!mlme_obj) 4595 return QDF_STATUS_E_FAILURE; 4596 4597 mlme_obj->cfg.vht_caps.vht_cap_info.enable2x2 = value; 4598 4599 return QDF_STATUS_SUCCESS; 4600 } 4601 4602 QDF_STATUS 4603 wlan_mlme_get_vht_enable_paid(struct wlan_objmgr_psoc *psoc, bool *value) 4604 { 4605 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4606 4607 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4608 if (!mlme_obj) 4609 return QDF_STATUS_E_FAILURE; 4610 4611 *value = mlme_obj->cfg.vht_caps.vht_cap_info.enable_paid; 4612 4613 return QDF_STATUS_SUCCESS; 4614 } 4615 4616 QDF_STATUS 4617 wlan_mlme_get_vht_enable_gid(struct wlan_objmgr_psoc *psoc, bool *value) 4618 { 4619 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4620 4621 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4622 if (!mlme_obj) 4623 return QDF_STATUS_E_FAILURE; 4624 4625 *value = mlme_obj->cfg.vht_caps.vht_cap_info.enable_gid; 4626 4627 return QDF_STATUS_SUCCESS; 4628 } 4629 4630 QDF_STATUS 4631 wlan_mlme_get_vht_for_24ghz(struct wlan_objmgr_psoc *psoc, bool *value) 4632 { 4633 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4634 4635 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4636 if (!mlme_obj) 4637 return QDF_STATUS_E_FAILURE; 4638 4639 *value = mlme_obj->cfg.vht_caps.vht_cap_info.b24ghz_band; 4640 4641 return QDF_STATUS_SUCCESS; 4642 } 4643 4644 QDF_STATUS 4645 wlan_mlme_set_vht_for_24ghz(struct wlan_objmgr_psoc *psoc, bool value) 4646 { 4647 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4648 4649 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4650 if (!mlme_obj) 4651 return QDF_STATUS_E_FAILURE; 4652 4653 mlme_obj->cfg.vht_caps.vht_cap_info.b24ghz_band = value; 4654 4655 return QDF_STATUS_SUCCESS; 4656 } 4657 4658 QDF_STATUS 4659 wlan_mlme_get_vendor_vht_for_24ghz(struct wlan_objmgr_psoc *psoc, bool *value) 4660 { 4661 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4662 4663 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4664 if (!mlme_obj) 4665 return QDF_STATUS_E_FAILURE; 4666 4667 *value = mlme_obj->cfg.vht_caps.vht_cap_info.vendor_24ghz_band; 4668 4669 return QDF_STATUS_SUCCESS; 4670 } 4671 4672 QDF_STATUS 4673 mlme_update_vht_cap(struct wlan_objmgr_psoc *psoc, struct wma_tgt_vht_cap *cfg) 4674 { 4675 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4676 struct mlme_vht_capabilities_info *vht_cap_info; 4677 uint32_t value = 0; 4678 bool hw_rx_ldpc_enabled; 4679 4680 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4681 if (!mlme_obj) 4682 return QDF_STATUS_E_FAILURE; 4683 4684 vht_cap_info = &mlme_obj->cfg.vht_caps.vht_cap_info; 4685 4686 /* 4687 * VHT max MPDU length: 4688 * override if user configured value is too high 4689 * that the target cannot support 4690 */ 4691 if (vht_cap_info->ampdu_len > cfg->vht_max_mpdu) 4692 vht_cap_info->ampdu_len = cfg->vht_max_mpdu; 4693 if (vht_cap_info->ampdu_len >= 1) 4694 mlme_obj->cfg.ht_caps.ht_cap_info.maximal_amsdu_size = 1; 4695 value = (CFG_VHT_BASIC_MCS_SET_STADEF & VHT_MCS_1x1) | 4696 vht_cap_info->basic_mcs_set; 4697 if (vht_cap_info->enable2x2) 4698 value = (value & VHT_MCS_2x2) | (vht_cap_info->rx_mcs2x2 << 2); 4699 vht_cap_info->basic_mcs_set = value; 4700 4701 value = (CFG_VHT_RX_MCS_MAP_STADEF & VHT_MCS_1x1) | 4702 vht_cap_info->rx_mcs; 4703 4704 if (vht_cap_info->enable2x2) 4705 value = (value & VHT_MCS_2x2) | (vht_cap_info->rx_mcs2x2 << 2); 4706 vht_cap_info->rx_mcs_map = value; 4707 4708 value = (CFG_VHT_TX_MCS_MAP_STADEF & VHT_MCS_1x1) | 4709 vht_cap_info->tx_mcs; 4710 if (vht_cap_info->enable2x2) 4711 value = (value & VHT_MCS_2x2) | (vht_cap_info->tx_mcs2x2 << 2); 4712 vht_cap_info->tx_mcs_map = value; 4713 4714 /* Set HW RX LDPC capability */ 4715 hw_rx_ldpc_enabled = !!cfg->vht_rx_ldpc; 4716 if (vht_cap_info->ldpc_coding_cap && !hw_rx_ldpc_enabled) 4717 vht_cap_info->ldpc_coding_cap = hw_rx_ldpc_enabled; 4718 4719 /* set the Guard interval 80MHz */ 4720 if (vht_cap_info->short_gi_80mhz && !cfg->vht_short_gi_80) 4721 vht_cap_info->short_gi_80mhz = cfg->vht_short_gi_80; 4722 4723 /* Set VHT TX/RX STBC cap */ 4724 if (vht_cap_info->enable2x2) { 4725 if (vht_cap_info->tx_stbc && !cfg->vht_tx_stbc) 4726 vht_cap_info->tx_stbc = cfg->vht_tx_stbc; 4727 4728 if (vht_cap_info->rx_stbc && !cfg->vht_rx_stbc) 4729 vht_cap_info->rx_stbc = cfg->vht_rx_stbc; 4730 } else { 4731 vht_cap_info->tx_stbc = 0; 4732 vht_cap_info->rx_stbc = 0; 4733 } 4734 4735 /* Set VHT SU Beamformer cap */ 4736 if (vht_cap_info->su_bformer && !cfg->vht_su_bformer) 4737 vht_cap_info->su_bformer = cfg->vht_su_bformer; 4738 4739 /* check and update SU BEAMFORMEE capabality */ 4740 if (vht_cap_info->su_bformee && !cfg->vht_su_bformee) 4741 vht_cap_info->su_bformee = cfg->vht_su_bformee; 4742 4743 /* Set VHT MU Beamformer cap */ 4744 if (vht_cap_info->mu_bformer && !cfg->vht_mu_bformer) 4745 vht_cap_info->mu_bformer = cfg->vht_mu_bformer; 4746 4747 /* Set VHT MU Beamformee cap */ 4748 if (vht_cap_info->enable_mu_bformee && !cfg->vht_mu_bformee) 4749 vht_cap_info->enable_mu_bformee = cfg->vht_mu_bformee; 4750 4751 /* 4752 * VHT max AMPDU len exp: 4753 * override if user configured value is too high 4754 * that the target cannot support. 4755 * Even though Rome publish ampdu_len=7, it can 4756 * only support 4 because of some h/w bug. 4757 */ 4758 if (vht_cap_info->ampdu_len_exponent > cfg->vht_max_ampdu_len_exp) 4759 vht_cap_info->ampdu_len_exponent = cfg->vht_max_ampdu_len_exp; 4760 4761 /* Set VHT TXOP PS CAP */ 4762 if (vht_cap_info->txop_ps && !cfg->vht_txop_ps) 4763 vht_cap_info->txop_ps = cfg->vht_txop_ps; 4764 4765 /* set the Guard interval 160MHz */ 4766 if (vht_cap_info->short_gi_160mhz && !cfg->vht_short_gi_160) 4767 vht_cap_info->short_gi_160mhz = cfg->vht_short_gi_160; 4768 4769 if (cfg_get(psoc, CFG_ENABLE_VHT_MCS_10_11)) 4770 vht_cap_info->vht_mcs_10_11_supp = cfg->vht_mcs_10_11_supp; 4771 4772 mlme_legacy_debug("vht_mcs_10_11_supp %d", 4773 vht_cap_info->vht_mcs_10_11_supp); 4774 4775 return QDF_STATUS_SUCCESS; 4776 } 4777 4778 QDF_STATUS mlme_update_nss_vht_cap(struct wlan_objmgr_psoc *psoc) 4779 { 4780 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4781 struct mlme_vht_capabilities_info *vht_cap_info; 4782 uint32_t temp = 0; 4783 4784 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4785 if (!mlme_obj) 4786 return QDF_STATUS_E_FAILURE; 4787 4788 vht_cap_info = &mlme_obj->cfg.vht_caps.vht_cap_info; 4789 4790 temp = vht_cap_info->basic_mcs_set; 4791 temp = (temp & 0xFFFC) | vht_cap_info->rx_mcs; 4792 if (vht_cap_info->enable2x2) 4793 temp = (temp & 0xFFF3) | (vht_cap_info->rx_mcs2x2 << 2); 4794 else 4795 temp |= 0x000C; 4796 4797 vht_cap_info->basic_mcs_set = temp; 4798 4799 temp = vht_cap_info->rx_mcs_map; 4800 temp = (temp & 0xFFFC) | vht_cap_info->rx_mcs; 4801 if (vht_cap_info->enable2x2) 4802 temp = (temp & 0xFFF3) | (vht_cap_info->rx_mcs2x2 << 2); 4803 else 4804 temp |= 0x000C; 4805 4806 vht_cap_info->rx_mcs_map = temp; 4807 4808 temp = vht_cap_info->tx_mcs_map; 4809 temp = (temp & 0xFFFC) | vht_cap_info->tx_mcs; 4810 if (vht_cap_info->enable2x2) 4811 temp = (temp & 0xFFF3) | (vht_cap_info->tx_mcs2x2 << 2); 4812 else 4813 temp |= 0x000C; 4814 4815 vht_cap_info->tx_mcs_map = temp; 4816 4817 return QDF_STATUS_SUCCESS; 4818 } 4819 4820 #ifdef WLAN_FEATURE_11BE 4821 bool mlme_get_bss_11be_allowed(struct wlan_objmgr_psoc *psoc, 4822 struct qdf_mac_addr *bssid, 4823 uint8_t *ie_data, 4824 uint32_t ie_length) 4825 { 4826 struct action_oui_search_attr search_attr; 4827 4828 if (wlan_action_oui_is_empty(psoc, ACTION_OUI_11BE_OUI_ALLOW)) 4829 return true; 4830 4831 qdf_mem_zero(&search_attr, sizeof(search_attr)); 4832 search_attr.ie_data = ie_data; 4833 search_attr.ie_length = ie_length; 4834 if (wlan_action_oui_search(psoc, &search_attr, 4835 ACTION_OUI_11BE_OUI_ALLOW)) 4836 return true; 4837 4838 mlme_legacy_debug("AP not in 11be oui allow list "QDF_MAC_ADDR_FMT, 4839 QDF_MAC_ADDR_REF(bssid->bytes)); 4840 4841 return false; 4842 } 4843 4844 QDF_STATUS wlan_mlme_get_oem_eht_mlo_config(struct wlan_objmgr_psoc *psoc, 4845 uint32_t *oem_eht_cfg) 4846 { 4847 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4848 4849 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4850 if (!mlme_obj) 4851 return QDF_STATUS_E_FAILURE; 4852 4853 *oem_eht_cfg = mlme_obj->cfg.gen.oem_eht_mlo_crypto_bitmap; 4854 4855 return QDF_STATUS_SUCCESS; 4856 } 4857 #endif 4858 4859 QDF_STATUS wlan_mlme_is_sap_uapsd_enabled(struct wlan_objmgr_psoc *psoc, 4860 bool *value) 4861 { 4862 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4863 4864 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4865 if (!mlme_obj) 4866 return QDF_STATUS_E_FAILURE; 4867 4868 *value = mlme_obj->cfg.qos_mlme_params.sap_uapsd_enabled; 4869 4870 return QDF_STATUS_SUCCESS; 4871 } 4872 4873 QDF_STATUS wlan_mlme_get_dtim_selection_diversity(struct wlan_objmgr_psoc *psoc, 4874 uint32_t *dtim_selection_div) 4875 { 4876 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4877 4878 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4879 if (!mlme_obj) { 4880 *dtim_selection_div = cfg_default(CFG_DTIM_SELECTION_DIVERSITY); 4881 return QDF_STATUS_E_FAILURE; 4882 } 4883 4884 *dtim_selection_div = mlme_obj->cfg.ps_params.dtim_selection_diversity; 4885 4886 return QDF_STATUS_SUCCESS; 4887 } 4888 4889 QDF_STATUS wlan_mlme_get_bmps_min_listen_interval(struct wlan_objmgr_psoc *psoc, 4890 uint32_t *value) 4891 { 4892 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4893 4894 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4895 if (!mlme_obj) { 4896 *value = cfg_default(CFG_BMPS_MINIMUM_LI); 4897 return QDF_STATUS_E_FAILURE; 4898 } 4899 4900 *value = mlme_obj->cfg.ps_params.bmps_min_listen_interval; 4901 4902 return QDF_STATUS_SUCCESS; 4903 } 4904 4905 QDF_STATUS wlan_mlme_get_bmps_max_listen_interval(struct wlan_objmgr_psoc *psoc, 4906 uint32_t *value) 4907 { 4908 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4909 4910 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4911 if (!mlme_obj) { 4912 *value = cfg_default(CFG_BMPS_MAXIMUM_LI); 4913 return QDF_STATUS_E_FAILURE; 4914 } 4915 4916 *value = mlme_obj->cfg.ps_params.bmps_max_listen_interval; 4917 4918 return QDF_STATUS_SUCCESS; 4919 } 4920 4921 QDF_STATUS wlan_mlme_set_sap_uapsd_flag(struct wlan_objmgr_psoc *psoc, 4922 bool value) 4923 { 4924 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4925 4926 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4927 if (!mlme_obj) 4928 return QDF_STATUS_E_FAILURE; 4929 4930 mlme_obj->cfg.qos_mlme_params.sap_uapsd_enabled &= value; 4931 4932 return QDF_STATUS_SUCCESS; 4933 } 4934 4935 QDF_STATUS wlan_mlme_get_rrm_enabled(struct wlan_objmgr_psoc *psoc, 4936 bool *value) 4937 { 4938 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4939 4940 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4941 if (!mlme_obj) 4942 return QDF_STATUS_E_FAILURE; 4943 4944 *value = mlme_obj->cfg.rrm_config.rrm_enabled; 4945 return QDF_STATUS_SUCCESS; 4946 } 4947 4948 QDF_STATUS wlan_mlme_get_auto_bmps_timer_value(struct wlan_objmgr_psoc *psoc, 4949 uint32_t *value) 4950 { 4951 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4952 4953 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4954 if (!mlme_obj) { 4955 *value = cfg_default(CFG_AUTO_BMPS_ENABLE_TIMER); 4956 return QDF_STATUS_E_FAILURE; 4957 } 4958 4959 *value = mlme_obj->cfg.ps_params.auto_bmps_timer_val; 4960 4961 return QDF_STATUS_SUCCESS; 4962 } 4963 4964 QDF_STATUS wlan_mlme_is_bmps_enabled(struct wlan_objmgr_psoc *psoc, 4965 bool *value) 4966 { 4967 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4968 4969 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4970 if (!mlme_obj) { 4971 *value = cfg_default(CFG_ENABLE_PS); 4972 return QDF_STATUS_E_FAILURE; 4973 } 4974 4975 *value = mlme_obj->cfg.ps_params.is_bmps_enabled; 4976 4977 return QDF_STATUS_SUCCESS; 4978 } 4979 4980 QDF_STATUS wlan_mlme_is_imps_enabled(struct wlan_objmgr_psoc *psoc, 4981 bool *value) 4982 { 4983 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4984 4985 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4986 if (!mlme_obj) { 4987 *value = cfg_default(CFG_ENABLE_IMPS); 4988 return QDF_STATUS_E_FAILURE; 4989 } 4990 4991 *value = mlme_obj->cfg.ps_params.is_imps_enabled; 4992 4993 return QDF_STATUS_SUCCESS; 4994 } 4995 4996 QDF_STATUS wlan_mlme_override_bmps_imps(struct wlan_objmgr_psoc *psoc) 4997 { 4998 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4999 5000 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5001 if (!mlme_obj) 5002 return QDF_STATUS_E_FAILURE; 5003 5004 mlme_obj->cfg.ps_params.is_imps_enabled = 0; 5005 mlme_obj->cfg.ps_params.is_bmps_enabled = 0; 5006 5007 return QDF_STATUS_SUCCESS; 5008 } 5009 5010 void wlan_mlme_get_wps_uuid(struct wlan_mlme_wps_params *wps_params, 5011 uint8_t *data) 5012 { 5013 qdf_size_t len = wps_params->wps_uuid.len; 5014 5015 wlan_mlme_get_cfg_str(data, &wps_params->wps_uuid, &len); 5016 } 5017 5018 QDF_STATUS 5019 wlan_mlme_get_self_gen_frm_pwr(struct wlan_objmgr_psoc *psoc, 5020 uint32_t *value) 5021 { 5022 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5023 5024 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5025 if (!mlme_obj) { 5026 *value = cfg_default(CFG_SELF_GEN_FRM_PWR); 5027 mlme_legacy_err("Failed to get MLME Obj"); 5028 return QDF_STATUS_E_FAILURE; 5029 } 5030 5031 *value = mlme_obj->cfg.reg.self_gen_frm_pwr; 5032 5033 return QDF_STATUS_SUCCESS; 5034 } 5035 5036 QDF_STATUS 5037 wlan_mlme_get_4way_hs_offload(struct wlan_objmgr_psoc *psoc, uint32_t *value) 5038 { 5039 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5040 5041 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5042 if (!mlme_obj) { 5043 *value = cfg_default(CFG_DISABLE_4WAY_HS_OFFLOAD); 5044 mlme_legacy_err("Failed to get MLME Obj"); 5045 return QDF_STATUS_E_FAILURE; 5046 } 5047 5048 *value = mlme_obj->cfg.gen.disable_4way_hs_offload; 5049 5050 return QDF_STATUS_SUCCESS; 5051 } 5052 5053 QDF_STATUS 5054 wlan_mlme_get_bmiss_skip_full_scan_value(struct wlan_objmgr_psoc *psoc, 5055 bool *value) 5056 { 5057 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5058 5059 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5060 if (!mlme_obj) { 5061 *value = cfg_default(CFG_BMISS_SKIP_FULL_SCAN); 5062 mlme_legacy_err("Failed to get MLME Obj"); 5063 return QDF_STATUS_E_FAILURE; 5064 } 5065 5066 *value = mlme_obj->cfg.gen.bmiss_skip_full_scan; 5067 5068 return QDF_STATUS_SUCCESS; 5069 } 5070 5071 QDF_STATUS mlme_get_peer_phymode(struct wlan_objmgr_psoc *psoc, uint8_t *mac, 5072 enum wlan_phymode *peer_phymode) 5073 { 5074 struct wlan_objmgr_peer *peer; 5075 5076 peer = wlan_objmgr_get_peer_by_mac(psoc, mac, WLAN_MLME_NB_ID); 5077 if (!peer) { 5078 mlme_legacy_err("peer object is null"); 5079 return QDF_STATUS_E_NULL_VALUE; 5080 } 5081 5082 *peer_phymode = wlan_peer_get_phymode(peer); 5083 wlan_objmgr_peer_release_ref(peer, WLAN_MLME_NB_ID); 5084 5085 return QDF_STATUS_SUCCESS; 5086 } 5087 5088 QDF_STATUS mlme_set_tgt_wpa3_roam_cap(struct wlan_objmgr_psoc *psoc, 5089 uint32_t akm_bitmap) 5090 { 5091 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5092 5093 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5094 if (!mlme_obj) 5095 return QDF_STATUS_E_FAILURE; 5096 5097 mlme_obj->cfg.lfr.fw_akm_bitmap |= akm_bitmap; 5098 5099 return QDF_STATUS_SUCCESS; 5100 } 5101 5102 QDF_STATUS 5103 wlan_mlme_get_ignore_fw_reg_offload_ind(struct wlan_objmgr_psoc *psoc, 5104 bool *disabled) 5105 { 5106 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5107 5108 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5109 5110 if (!mlme_obj) 5111 return QDF_STATUS_E_FAILURE; 5112 5113 *disabled = mlme_obj->cfg.reg.ignore_fw_reg_offload_ind; 5114 return QDF_STATUS_SUCCESS; 5115 } 5116 5117 char *mlme_get_roam_status_str(uint32_t roam_status) 5118 { 5119 switch (roam_status) { 5120 case 0: 5121 return "SUCCESS"; 5122 case 1: 5123 return "FAILED"; 5124 case 2: 5125 return "NO ROAM"; 5126 default: 5127 return "UNKNOWN"; 5128 } 5129 } 5130 5131 char *mlme_get_roam_trigger_str(uint32_t roam_scan_trigger) 5132 { 5133 switch (roam_scan_trigger) { 5134 case WMI_ROAM_TRIGGER_REASON_PER: 5135 return "PER"; 5136 case WMI_ROAM_TRIGGER_REASON_BMISS: 5137 return "BEACON MISS"; 5138 case WMI_ROAM_TRIGGER_REASON_LOW_RSSI: 5139 return "LOW RSSI"; 5140 case WMI_ROAM_TRIGGER_REASON_HIGH_RSSI: 5141 return "HIGH RSSI"; 5142 case WMI_ROAM_TRIGGER_REASON_PERIODIC: 5143 return "PERIODIC SCAN"; 5144 case WMI_ROAM_TRIGGER_REASON_MAWC: 5145 return "MAWC"; 5146 case WMI_ROAM_TRIGGER_REASON_DENSE: 5147 return "DENSE ENVIRONMENT"; 5148 case WMI_ROAM_TRIGGER_REASON_BACKGROUND: 5149 return "BACKGROUND SCAN"; 5150 case WMI_ROAM_TRIGGER_REASON_FORCED: 5151 return "FORCED SCAN"; 5152 case WMI_ROAM_TRIGGER_REASON_BTM: 5153 return "BTM TRIGGER"; 5154 case WMI_ROAM_TRIGGER_REASON_UNIT_TEST: 5155 return "TEST COMMAND"; 5156 case WMI_ROAM_TRIGGER_REASON_BSS_LOAD: 5157 return "HIGH BSS LOAD"; 5158 case WMI_ROAM_TRIGGER_REASON_DEAUTH: 5159 return "DEAUTH RECEIVED"; 5160 case WMI_ROAM_TRIGGER_REASON_IDLE: 5161 return "IDLE STATE SCAN"; 5162 case WMI_ROAM_TRIGGER_REASON_STA_KICKOUT: 5163 return "STA KICKOUT"; 5164 case WMI_ROAM_TRIGGER_REASON_ESS_RSSI: 5165 return "ESS RSSI"; 5166 case WMI_ROAM_TRIGGER_REASON_WTC_BTM: 5167 return "WTC BTM"; 5168 case WMI_ROAM_TRIGGER_REASON_NONE: 5169 return "NONE"; 5170 case WMI_ROAM_TRIGGER_REASON_PMK_TIMEOUT: 5171 return "PMK Expired"; 5172 case WMI_ROAM_TRIGGER_REASON_BTC: 5173 return "BTC TRIGGER"; 5174 default: 5175 return "UNKNOWN"; 5176 } 5177 } 5178 5179 void mlme_get_converted_timestamp(uint32_t timestamp, char *time) 5180 { 5181 uint32_t hr, mins, secs; 5182 5183 secs = timestamp / 1000; 5184 mins = secs / 60; 5185 hr = mins / 60; 5186 qdf_snprint(time, TIME_STRING_LEN, "[%02d:%02d:%02d.%06u]", 5187 (hr % 24), (mins % 60), (secs % 60), 5188 (timestamp % 1000) * 1000); 5189 } 5190 5191 #if defined(WLAN_SAE_SINGLE_PMK) && defined(WLAN_FEATURE_ROAM_OFFLOAD) 5192 void wlan_mlme_set_sae_single_pmk_bss_cap(struct wlan_objmgr_psoc *psoc, 5193 uint8_t vdev_id, bool val) 5194 { 5195 struct mlme_legacy_priv *mlme_priv; 5196 struct wlan_objmgr_vdev *vdev; 5197 5198 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, 5199 WLAN_MLME_OBJMGR_ID); 5200 5201 if (!vdev) { 5202 mlme_err("get vdev failed"); 5203 return; 5204 } 5205 5206 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 5207 if (!mlme_priv) { 5208 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID); 5209 mlme_legacy_err("vdev legacy private object is NULL"); 5210 return; 5211 } 5212 5213 mlme_priv->mlme_roam.sae_single_pmk.sae_single_pmk_ap = val; 5214 5215 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID); 5216 } 5217 5218 void wlan_mlme_update_sae_single_pmk(struct wlan_objmgr_vdev *vdev, 5219 struct mlme_pmk_info *sae_single_pmk) 5220 { 5221 struct mlme_legacy_priv *mlme_priv; 5222 int32_t keymgmt; 5223 bool is_sae_connection = false; 5224 5225 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 5226 if (!mlme_priv) { 5227 mlme_legacy_err("vdev legacy private object is NULL"); 5228 return; 5229 } 5230 5231 keymgmt = wlan_crypto_get_param(vdev, WLAN_CRYPTO_PARAM_KEY_MGMT); 5232 if (keymgmt < 0) { 5233 mlme_legacy_err("Invalid mgmt cipher"); 5234 return; 5235 } 5236 5237 if (keymgmt & (1 << WLAN_CRYPTO_KEY_MGMT_SAE)) 5238 is_sae_connection = true; 5239 5240 mlme_legacy_debug("SAE_SPMK: single_pmk_ap:%d, is_sae_connection:%d, pmk_len:%d", 5241 mlme_priv->mlme_roam.sae_single_pmk.sae_single_pmk_ap, 5242 is_sae_connection, sae_single_pmk->pmk_len); 5243 5244 if (mlme_priv->mlme_roam.sae_single_pmk.sae_single_pmk_ap && 5245 is_sae_connection) 5246 mlme_priv->mlme_roam.sae_single_pmk.pmk_info = *sae_single_pmk; 5247 } 5248 5249 bool wlan_mlme_is_sae_single_pmk_enabled(struct wlan_objmgr_psoc *psoc) 5250 { 5251 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5252 5253 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5254 if (!mlme_obj) 5255 return cfg_default(CFG_SAE_SINGLE_PMK); 5256 5257 return mlme_obj->cfg.lfr.sae_single_pmk_feature_enabled; 5258 } 5259 5260 void wlan_mlme_get_sae_single_pmk_info(struct wlan_objmgr_vdev *vdev, 5261 struct wlan_mlme_sae_single_pmk *pmksa) 5262 { 5263 struct mlme_legacy_priv *mlme_priv; 5264 struct mlme_pmk_info *pmk_info; 5265 5266 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 5267 if (!mlme_priv) { 5268 mlme_legacy_err("vdev legacy private object is NULL"); 5269 return; 5270 } 5271 5272 pmk_info = &mlme_priv->mlme_roam.sae_single_pmk.pmk_info; 5273 5274 pmksa->sae_single_pmk_ap = 5275 mlme_priv->mlme_roam.sae_single_pmk.sae_single_pmk_ap; 5276 pmksa->pmk_info.spmk_timeout_period = pmk_info->spmk_timeout_period; 5277 pmksa->pmk_info.spmk_timestamp = pmk_info->spmk_timestamp; 5278 5279 if (pmk_info->pmk_len) { 5280 qdf_mem_copy(pmksa->pmk_info.pmk, pmk_info->pmk, 5281 pmk_info->pmk_len); 5282 pmksa->pmk_info.pmk_len = pmk_info->pmk_len; 5283 return; 5284 } 5285 5286 qdf_mem_zero(pmksa->pmk_info.pmk, sizeof(*pmksa->pmk_info.pmk)); 5287 pmksa->pmk_info.pmk_len = 0; 5288 } 5289 5290 void wlan_mlme_clear_sae_single_pmk_info(struct wlan_objmgr_vdev *vdev, 5291 struct mlme_pmk_info *pmk_recv) 5292 { 5293 struct mlme_legacy_priv *mlme_priv; 5294 struct wlan_mlme_sae_single_pmk *sae_single_pmk; 5295 5296 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 5297 if (!mlme_priv) { 5298 mlme_legacy_err("vdev legacy private object is NULL"); 5299 return; 5300 } 5301 5302 sae_single_pmk = &mlme_priv->mlme_roam.sae_single_pmk; 5303 5304 if (!pmk_recv) { 5305 /* Process flush pmk cmd */ 5306 mlme_legacy_debug("Flush sae_single_pmk info"); 5307 qdf_mem_zero(&sae_single_pmk->pmk_info, 5308 sizeof(sae_single_pmk->pmk_info)); 5309 } else if (pmk_recv->pmk_len != sae_single_pmk->pmk_info.pmk_len) { 5310 mlme_legacy_debug("Invalid pmk len"); 5311 return; 5312 } else if (!qdf_mem_cmp(&sae_single_pmk->pmk_info.pmk, pmk_recv->pmk, 5313 pmk_recv->pmk_len)) { 5314 /* Process delete pmk cmd */ 5315 mlme_legacy_debug("Clear sae_single_pmk info"); 5316 qdf_mem_zero(&sae_single_pmk->pmk_info, 5317 sizeof(sae_single_pmk->pmk_info)); 5318 } 5319 } 5320 #endif 5321 5322 char *mlme_get_roam_fail_reason_str(enum wlan_roam_failure_reason_code result) 5323 { 5324 switch (result) { 5325 case ROAM_FAIL_REASON_NO_SCAN_START: 5326 return "SCAN NOT STARTED"; 5327 case ROAM_FAIL_REASON_NO_AP_FOUND: 5328 return "NO AP FOUND"; 5329 case ROAM_FAIL_REASON_NO_CAND_AP_FOUND: 5330 return "NO CANDIDATE FOUND"; 5331 case ROAM_FAIL_REASON_HOST: 5332 return "HOST ABORTED"; 5333 case ROAM_FAIL_REASON_AUTH_SEND: 5334 return "Send AUTH Failed"; 5335 case ROAM_FAIL_REASON_AUTH_RECV: 5336 return "Received AUTH with FAILURE Status"; 5337 case ROAM_FAIL_REASON_NO_AUTH_RESP: 5338 return "No Auth response from AP"; 5339 case ROAM_FAIL_REASON_REASSOC_SEND: 5340 return "Send Re-assoc request failed"; 5341 case ROAM_FAIL_REASON_REASSOC_RECV: 5342 return "Received Re-Assoc resp with Failure status"; 5343 case ROAM_FAIL_REASON_NO_REASSOC_RESP: 5344 return "No Re-assoc response from AP"; 5345 case ROAM_FAIL_REASON_EAPOL_TIMEOUT: 5346 return "EAPOL M1 timed out"; 5347 case ROAM_FAIL_REASON_MLME: 5348 return "MLME error"; 5349 case ROAM_FAIL_REASON_INTERNAL_ABORT: 5350 return "Fw aborted roam"; 5351 case ROAM_FAIL_REASON_SCAN_START: 5352 return "Unable to start roam scan"; 5353 case ROAM_FAIL_REASON_AUTH_NO_ACK: 5354 return "No ACK for Auth req"; 5355 case ROAM_FAIL_REASON_AUTH_INTERNAL_DROP: 5356 return "Auth req dropped internally"; 5357 case ROAM_FAIL_REASON_REASSOC_NO_ACK: 5358 return "No ACK for Re-assoc req"; 5359 case ROAM_FAIL_REASON_REASSOC_INTERNAL_DROP: 5360 return "Re-assoc dropped internally"; 5361 case ROAM_FAIL_REASON_EAPOL_M2_SEND: 5362 return "Unable to send M2 frame"; 5363 case ROAM_FAIL_REASON_EAPOL_M2_INTERNAL_DROP: 5364 return "M2 Frame dropped internally"; 5365 case ROAM_FAIL_REASON_EAPOL_M2_NO_ACK: 5366 return "No ACK for M2 frame"; 5367 case ROAM_FAIL_REASON_EAPOL_M3_TIMEOUT: 5368 return "EAPOL M3 timed out"; 5369 case ROAM_FAIL_REASON_EAPOL_M4_SEND: 5370 return "Unable to send M4 frame"; 5371 case ROAM_FAIL_REASON_EAPOL_M4_INTERNAL_DROP: 5372 return "M4 frame dropped internally"; 5373 case ROAM_FAIL_REASON_EAPOL_M4_NO_ACK: 5374 return "No ACK for M4 frame"; 5375 case ROAM_FAIL_REASON_NO_SCAN_FOR_FINAL_BMISS: 5376 return "No scan on final BMISS"; 5377 case ROAM_FAIL_REASON_DISCONNECT: 5378 return "Disconnect received during handoff"; 5379 case ROAM_FAIL_REASON_SYNC: 5380 return "Previous roam sync pending"; 5381 case ROAM_FAIL_REASON_SAE_INVALID_PMKID: 5382 return "Reason assoc reject - invalid PMKID"; 5383 case ROAM_FAIL_REASON_SAE_PREAUTH_TIMEOUT: 5384 return "SAE preauth timed out"; 5385 case ROAM_FAIL_REASON_SAE_PREAUTH_FAIL: 5386 return "SAE preauth failed"; 5387 case ROAM_FAIL_REASON_UNABLE_TO_START_ROAM_HO: 5388 return "Start handoff failed- internal error"; 5389 case ROAM_FAIL_REASON_NO_AP_FOUND_AND_FINAL_BMISS_SENT: 5390 return "No AP found on final BMISS"; 5391 case ROAM_FAIL_REASON_NO_CAND_AP_FOUND_AND_FINAL_BMISS_SENT: 5392 return "No Candidate AP found on final BMISS"; 5393 case ROAM_FAIL_REASON_CURR_AP_STILL_OK: 5394 return "CURRENT AP STILL OK"; 5395 default: 5396 return "UNKNOWN"; 5397 } 5398 } 5399 5400 char *mlme_get_sub_reason_str(enum roam_trigger_sub_reason sub_reason) 5401 { 5402 switch (sub_reason) { 5403 case ROAM_TRIGGER_SUB_REASON_PERIODIC_TIMER: 5404 return "PERIODIC TIMER"; 5405 case ROAM_TRIGGER_SUB_REASON_LOW_RSSI_PERIODIC: 5406 return "LOW RSSI PERIODIC TIMER1"; 5407 case ROAM_TRIGGER_SUB_REASON_BTM_DI_TIMER: 5408 return "BTM DISASSOC IMMINENT TIMER"; 5409 case ROAM_TRIGGER_SUB_REASON_FULL_SCAN: 5410 return "FULL SCAN"; 5411 case ROAM_TRIGGER_SUB_REASON_CU_PERIODIC: 5412 return "CU PERIODIC Timer1"; 5413 case ROAM_TRIGGER_SUB_REASON_INACTIVITY_TIMER_LOW_RSSI: 5414 return "LOW RSSI INACTIVE TIMER"; 5415 case ROAM_TRIGGER_SUB_REASON_PERIODIC_TIMER_AFTER_INACTIVITY_CU: 5416 return "CU PERIODIC TIMER2"; 5417 case ROAM_TRIGGER_SUB_REASON_PERIODIC_TIMER_AFTER_INACTIVITY: 5418 return "LOW RSSI PERIODIC TIMER2"; 5419 case ROAM_TRIGGER_SUB_REASON_INACTIVITY_TIMER_CU: 5420 return "CU INACTIVITY TIMER"; 5421 default: 5422 return "NONE"; 5423 } 5424 } 5425 5426 QDF_STATUS 5427 wlan_mlme_get_mgmt_max_retry(struct wlan_objmgr_psoc *psoc, 5428 uint8_t *max_retry) 5429 { 5430 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5431 5432 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5433 5434 if (!mlme_obj) { 5435 *max_retry = cfg_default(CFG_MGMT_RETRY_MAX); 5436 return QDF_STATUS_E_FAILURE; 5437 } 5438 5439 *max_retry = mlme_obj->cfg.gen.mgmt_retry_max; 5440 return QDF_STATUS_SUCCESS; 5441 } 5442 5443 QDF_STATUS 5444 wlan_mlme_get_mgmt_6ghz_rate_support(struct wlan_objmgr_psoc *psoc, 5445 bool *enable_he_mcs0_for_6ghz_mgmt) 5446 { 5447 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5448 5449 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5450 5451 if (!mlme_obj) { 5452 *enable_he_mcs0_for_6ghz_mgmt = 5453 cfg_default(CFG_ENABLE_HE_MCS0_MGMT_6GHZ); 5454 return QDF_STATUS_E_FAILURE; 5455 } 5456 5457 *enable_he_mcs0_for_6ghz_mgmt = 5458 mlme_obj->cfg.gen.enable_he_mcs0_for_6ghz_mgmt; 5459 return QDF_STATUS_SUCCESS; 5460 } 5461 5462 QDF_STATUS 5463 wlan_mlme_get_status_ring_buffer(struct wlan_objmgr_psoc *psoc, 5464 bool *enable_ring_buffer) 5465 { 5466 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5467 5468 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5469 5470 if (!mlme_obj) { 5471 *enable_ring_buffer = cfg_default(CFG_ENABLE_RING_BUFFER); 5472 return QDF_STATUS_E_FAILURE; 5473 } 5474 5475 *enable_ring_buffer = mlme_obj->cfg.gen.enable_ring_buffer; 5476 return QDF_STATUS_SUCCESS; 5477 } 5478 5479 bool wlan_mlme_get_peer_unmap_conf(struct wlan_objmgr_psoc *psoc) 5480 { 5481 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5482 5483 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5484 if (!mlme_obj) 5485 return false; 5486 5487 return mlme_obj->cfg.gen.enable_peer_unmap_conf_support; 5488 } 5489 5490 #ifdef WLAN_FEATURE_ROAM_OFFLOAD 5491 QDF_STATUS 5492 wlan_mlme_get_roam_reason_vsie_status(struct wlan_objmgr_psoc *psoc, 5493 uint8_t *roam_reason_vsie_enable) 5494 { 5495 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5496 5497 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5498 if (!mlme_obj) { 5499 *roam_reason_vsie_enable = 5500 cfg_default(CFG_ENABLE_ROAM_REASON_VSIE); 5501 return QDF_STATUS_E_FAILURE; 5502 } 5503 5504 *roam_reason_vsie_enable = mlme_obj->cfg.lfr.enable_roam_reason_vsie; 5505 return QDF_STATUS_SUCCESS; 5506 } 5507 5508 QDF_STATUS 5509 wlan_mlme_set_roam_reason_vsie_status(struct wlan_objmgr_psoc *psoc, 5510 uint8_t roam_reason_vsie_enable) 5511 { 5512 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5513 5514 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5515 if (!mlme_obj) 5516 return QDF_STATUS_E_FAILURE; 5517 5518 mlme_obj->cfg.lfr.enable_roam_reason_vsie = roam_reason_vsie_enable; 5519 return QDF_STATUS_SUCCESS; 5520 } 5521 5522 uint32_t wlan_mlme_get_roaming_triggers(struct wlan_objmgr_psoc *psoc) 5523 { 5524 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5525 5526 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5527 if (!mlme_obj) 5528 return cfg_default(CFG_ROAM_TRIGGER_BITMAP); 5529 5530 return mlme_obj->cfg.lfr.roam_trigger_bitmap; 5531 } 5532 5533 void wlan_mlme_set_roaming_triggers(struct wlan_objmgr_psoc *psoc, 5534 uint32_t trigger_bitmap) 5535 { 5536 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5537 5538 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5539 if (!mlme_obj) 5540 return; 5541 5542 mlme_obj->cfg.lfr.roam_trigger_bitmap = trigger_bitmap; 5543 } 5544 5545 QDF_STATUS 5546 wlan_mlme_get_roaming_offload(struct wlan_objmgr_psoc *psoc, 5547 bool *val) 5548 { 5549 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5550 5551 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5552 if (!mlme_obj) { 5553 *val = cfg_default(CFG_LFR3_ROAMING_OFFLOAD); 5554 return QDF_STATUS_E_INVAL; 5555 } 5556 5557 *val = mlme_obj->cfg.lfr.lfr3_roaming_offload; 5558 5559 return QDF_STATUS_SUCCESS; 5560 } 5561 5562 QDF_STATUS 5563 wlan_mlme_get_enable_disconnect_roam_offload(struct wlan_objmgr_psoc *psoc, 5564 bool *val) 5565 { 5566 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5567 5568 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5569 if (!mlme_obj) { 5570 *val = cfg_default(CFG_LFR_ENABLE_DISCONNECT_ROAM); 5571 return QDF_STATUS_E_INVAL; 5572 } 5573 5574 *val = mlme_obj->cfg.lfr.enable_disconnect_roam_offload; 5575 5576 return QDF_STATUS_SUCCESS; 5577 } 5578 5579 QDF_STATUS 5580 wlan_mlme_get_enable_idle_roam(struct wlan_objmgr_psoc *psoc, bool *val) 5581 { 5582 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5583 5584 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5585 if (!mlme_obj) { 5586 *val = cfg_default(CFG_LFR_ENABLE_IDLE_ROAM); 5587 return QDF_STATUS_E_INVAL; 5588 } 5589 5590 *val = mlme_obj->cfg.lfr.enable_idle_roam; 5591 5592 return QDF_STATUS_SUCCESS; 5593 } 5594 5595 QDF_STATUS 5596 wlan_mlme_get_idle_roam_rssi_delta(struct wlan_objmgr_psoc *psoc, uint32_t *val) 5597 { 5598 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5599 5600 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5601 if (!mlme_obj) { 5602 *val = cfg_default(CFG_LFR_IDLE_ROAM_RSSI_DELTA); 5603 return QDF_STATUS_E_INVAL; 5604 } 5605 5606 *val = mlme_obj->cfg.lfr.idle_roam_rssi_delta; 5607 5608 return QDF_STATUS_SUCCESS; 5609 } 5610 5611 QDF_STATUS 5612 wlan_mlme_get_roam_info_stats_num(struct wlan_objmgr_psoc *psoc, uint32_t *val) 5613 { 5614 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5615 5616 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5617 if (!mlme_obj) { 5618 *val = cfg_default(CFG_LFR3_ROAM_INFO_STATS_NUM); 5619 return QDF_STATUS_E_INVAL; 5620 } 5621 5622 *val = mlme_obj->cfg.lfr.roam_info_stats_num; 5623 5624 return QDF_STATUS_SUCCESS; 5625 } 5626 5627 QDF_STATUS 5628 wlan_mlme_get_idle_roam_inactive_time(struct wlan_objmgr_psoc *psoc, 5629 uint32_t *val) 5630 { 5631 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5632 5633 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5634 if (!mlme_obj) { 5635 *val = cfg_default(CFG_LFR_IDLE_ROAM_INACTIVE_TIME); 5636 return QDF_STATUS_E_INVAL; 5637 } 5638 5639 *val = mlme_obj->cfg.lfr.idle_roam_inactive_time; 5640 5641 return QDF_STATUS_SUCCESS; 5642 } 5643 5644 QDF_STATUS 5645 wlan_mlme_get_idle_data_packet_count(struct wlan_objmgr_psoc *psoc, 5646 uint32_t *val) 5647 { 5648 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5649 5650 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5651 if (!mlme_obj) { 5652 *val = cfg_default(CFG_LFR_IDLE_ROAM_PACKET_COUNT); 5653 return QDF_STATUS_E_INVAL; 5654 } 5655 5656 *val = mlme_obj->cfg.lfr.idle_data_packet_count; 5657 5658 return QDF_STATUS_SUCCESS; 5659 } 5660 5661 QDF_STATUS 5662 wlan_mlme_get_idle_roam_min_rssi(struct wlan_objmgr_psoc *psoc, uint32_t *val) 5663 { 5664 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5665 5666 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5667 if (!mlme_obj) { 5668 *val = cfg_default(CFG_LFR_IDLE_ROAM_MIN_RSSI); 5669 return QDF_STATUS_E_INVAL; 5670 } 5671 5672 *val = mlme_obj->cfg.lfr.idle_roam_min_rssi; 5673 5674 return QDF_STATUS_SUCCESS; 5675 } 5676 5677 QDF_STATUS 5678 wlan_mlme_get_idle_roam_band(struct wlan_objmgr_psoc *psoc, uint32_t *val) 5679 { 5680 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5681 5682 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5683 if (!mlme_obj) { 5684 *val = cfg_default(CFG_LFR_IDLE_ROAM_BAND); 5685 return QDF_STATUS_E_INVAL; 5686 } 5687 5688 *val = mlme_obj->cfg.lfr.idle_roam_band; 5689 5690 return QDF_STATUS_SUCCESS; 5691 } 5692 5693 QDF_STATUS 5694 wlan_mlme_get_self_bss_roam(struct wlan_objmgr_psoc *psoc, 5695 uint8_t *enable_self_bss_roam) 5696 { 5697 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5698 5699 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5700 5701 if (!mlme_obj) { 5702 *enable_self_bss_roam = 5703 cfg_get(psoc, CFG_LFR3_ENABLE_SELF_BSS_ROAM); 5704 return QDF_STATUS_E_FAILURE; 5705 } 5706 5707 *enable_self_bss_roam = mlme_obj->cfg.lfr.enable_self_bss_roam; 5708 5709 return QDF_STATUS_SUCCESS; 5710 } 5711 #endif 5712 5713 QDF_STATUS 5714 wlan_mlme_get_peer_indicated_ch_width(struct wlan_objmgr_psoc *psoc, 5715 struct peer_oper_mode_event *data) 5716 { 5717 struct wlan_objmgr_peer *peer; 5718 struct peer_mlme_priv_obj *peer_priv; 5719 QDF_STATUS status = QDF_STATUS_SUCCESS; 5720 5721 if (!data) { 5722 mlme_err("Data params is NULL"); 5723 return QDF_STATUS_E_INVAL; 5724 } 5725 5726 peer = wlan_objmgr_get_peer_by_mac(psoc, data->peer_mac_address.bytes, 5727 WLAN_MLME_NB_ID); 5728 if (!peer) { 5729 mlme_err("peer not found for mac: " QDF_MAC_ADDR_FMT, 5730 QDF_MAC_ADDR_REF(data->peer_mac_address.bytes)); 5731 return QDF_STATUS_E_NULL_VALUE; 5732 } 5733 5734 peer_priv = wlan_objmgr_peer_get_comp_private_obj(peer, 5735 WLAN_UMAC_COMP_MLME); 5736 if (!peer_priv) { 5737 mlme_err("peer priv not found for mac: " QDF_MAC_ADDR_FMT, 5738 QDF_MAC_ADDR_REF(peer->macaddr)); 5739 status = QDF_STATUS_E_NULL_VALUE; 5740 goto done; 5741 } 5742 5743 if (peer_priv->peer_ind_bw == CH_WIDTH_INVALID) { 5744 status = QDF_STATUS_E_INVAL; 5745 goto done; 5746 } 5747 5748 data->new_bw = peer_priv->peer_ind_bw; 5749 5750 done: 5751 wlan_objmgr_peer_release_ref(peer, WLAN_MLME_NB_ID); 5752 5753 return status; 5754 } 5755 5756 QDF_STATUS 5757 wlan_mlme_set_peer_indicated_ch_width(struct wlan_objmgr_psoc *psoc, 5758 struct peer_oper_mode_event *data) 5759 { 5760 struct wlan_objmgr_peer *peer; 5761 struct peer_mlme_priv_obj *peer_priv; 5762 QDF_STATUS status = QDF_STATUS_SUCCESS; 5763 5764 if (!data) { 5765 mlme_err("Data params is NULL"); 5766 return QDF_STATUS_E_INVAL; 5767 } 5768 5769 peer = wlan_objmgr_get_peer_by_mac(psoc, data->peer_mac_address.bytes, 5770 WLAN_MLME_NB_ID); 5771 if (!peer) { 5772 mlme_err("peer not found for mac: " QDF_MAC_ADDR_FMT, 5773 QDF_MAC_ADDR_REF(data->peer_mac_address.bytes)); 5774 return QDF_STATUS_E_NULL_VALUE; 5775 } 5776 5777 peer_priv = wlan_objmgr_peer_get_comp_private_obj(peer, 5778 WLAN_UMAC_COMP_MLME); 5779 if (!peer_priv) { 5780 mlme_err("peer priv not found for mac: " QDF_MAC_ADDR_FMT, 5781 QDF_MAC_ADDR_REF(peer->macaddr)); 5782 status = QDF_STATUS_E_NULL_VALUE; 5783 goto done; 5784 } 5785 5786 peer_priv->peer_ind_bw = 5787 target_if_wmi_chan_width_to_phy_ch_width(data->new_bw); 5788 5789 done: 5790 wlan_objmgr_peer_release_ref(peer, WLAN_MLME_NB_ID); 5791 5792 return status; 5793 } 5794 5795 QDF_STATUS 5796 wlan_mlme_set_ft_over_ds(struct wlan_objmgr_psoc *psoc, 5797 uint8_t ft_over_ds_enable) 5798 { 5799 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5800 5801 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5802 if (!mlme_obj) 5803 return QDF_STATUS_E_FAILURE; 5804 5805 mlme_obj->cfg.lfr.enable_ft_over_ds = ft_over_ds_enable; 5806 return QDF_STATUS_SUCCESS; 5807 } 5808 5809 QDF_STATUS 5810 wlan_mlme_get_dfs_chan_ageout_time(struct wlan_objmgr_psoc *psoc, 5811 uint8_t *dfs_chan_ageout_time) 5812 { 5813 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5814 5815 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5816 5817 if (!mlme_obj) { 5818 *dfs_chan_ageout_time = 5819 cfg_default(CFG_DFS_CHAN_AGEOUT_TIME); 5820 return QDF_STATUS_E_FAILURE; 5821 } 5822 5823 *dfs_chan_ageout_time = mlme_obj->cfg.gen.dfs_chan_ageout_time; 5824 5825 return QDF_STATUS_SUCCESS; 5826 } 5827 5828 #ifdef WLAN_FEATURE_SAE 5829 5830 #define NUM_RETRY_BITS 3 5831 #define ROAM_AUTH_INDEX 2 5832 #define ASSOC_INDEX 1 5833 #define AUTH_INDEX 0 5834 #define MAX_RETRIES 2 5835 #define MAX_ROAM_AUTH_RETRIES 1 5836 #define MAX_AUTH_RETRIES 3 5837 5838 QDF_STATUS 5839 wlan_mlme_get_sae_assoc_retry_count(struct wlan_objmgr_psoc *psoc, 5840 uint8_t *retry_count) 5841 { 5842 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5843 5844 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5845 5846 if (!mlme_obj) { 5847 *retry_count = 0; 5848 return QDF_STATUS_E_FAILURE; 5849 } 5850 5851 *retry_count = 5852 QDF_GET_BITS(mlme_obj->cfg.gen.sae_connect_retries, 5853 ASSOC_INDEX * NUM_RETRY_BITS, NUM_RETRY_BITS); 5854 5855 *retry_count = QDF_MIN(MAX_RETRIES, *retry_count); 5856 5857 return QDF_STATUS_SUCCESS; 5858 } 5859 5860 QDF_STATUS 5861 wlan_mlme_get_sae_auth_retry_count(struct wlan_objmgr_psoc *psoc, 5862 uint8_t *retry_count) 5863 { 5864 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5865 5866 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5867 5868 if (!mlme_obj) { 5869 *retry_count = 0; 5870 return QDF_STATUS_E_FAILURE; 5871 } 5872 5873 *retry_count = 5874 QDF_GET_BITS(mlme_obj->cfg.gen.sae_connect_retries, 5875 AUTH_INDEX * NUM_RETRY_BITS, NUM_RETRY_BITS); 5876 5877 *retry_count = QDF_MIN(MAX_AUTH_RETRIES, *retry_count); 5878 5879 return QDF_STATUS_SUCCESS; 5880 } 5881 5882 QDF_STATUS 5883 wlan_mlme_get_sae_roam_auth_retry_count(struct wlan_objmgr_psoc *psoc, 5884 uint8_t *retry_count) 5885 { 5886 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5887 5888 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5889 5890 if (!mlme_obj) { 5891 *retry_count = 0; 5892 return QDF_STATUS_E_FAILURE; 5893 } 5894 5895 *retry_count = 5896 QDF_GET_BITS(mlme_obj->cfg.gen.sae_connect_retries, 5897 ROAM_AUTH_INDEX * NUM_RETRY_BITS, NUM_RETRY_BITS); 5898 5899 *retry_count = QDF_MIN(MAX_ROAM_AUTH_RETRIES, *retry_count); 5900 5901 return QDF_STATUS_SUCCESS; 5902 } 5903 5904 #endif 5905 5906 #ifdef WLAN_FEATURE_ROAM_OFFLOAD 5907 bool 5908 wlan_mlme_get_dual_sta_roaming_enabled(struct wlan_objmgr_psoc *psoc) 5909 { 5910 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5911 bool dual_sta_roaming_enabled; 5912 5913 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5914 5915 if (!mlme_obj) 5916 return cfg_default(CFG_ENABLE_DUAL_STA_ROAM_OFFLOAD); 5917 5918 dual_sta_roaming_enabled = 5919 mlme_obj->cfg.lfr.lfr3_roaming_offload && 5920 mlme_obj->cfg.lfr.lfr3_dual_sta_roaming_enabled && 5921 wlan_mlme_get_dual_sta_roam_support(psoc) && 5922 policy_mgr_is_hw_dbs_capable(psoc); 5923 5924 return dual_sta_roaming_enabled; 5925 } 5926 #endif 5927 5928 QDF_STATUS 5929 wlan_mlme_get_roam_scan_offload_enabled(struct wlan_objmgr_psoc *psoc, 5930 bool *val) 5931 { 5932 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5933 5934 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5935 if (!mlme_obj) { 5936 *val = cfg_default(CFG_LFR_ROAM_SCAN_OFFLOAD_ENABLED); 5937 return QDF_STATUS_E_INVAL; 5938 } 5939 5940 *val = mlme_obj->cfg.lfr.roam_scan_offload_enabled; 5941 5942 return QDF_STATUS_SUCCESS; 5943 } 5944 5945 QDF_STATUS 5946 wlan_mlme_get_roam_bmiss_final_bcnt(struct wlan_objmgr_psoc *psoc, 5947 uint8_t *val) 5948 { 5949 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5950 5951 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5952 if (!mlme_obj) { 5953 *val = cfg_default(CFG_LFR_ROAM_BMISS_FINAL_BCNT); 5954 return QDF_STATUS_E_INVAL; 5955 } 5956 5957 *val = mlme_obj->cfg.lfr.roam_bmiss_final_bcnt; 5958 5959 return QDF_STATUS_SUCCESS; 5960 } 5961 5962 QDF_STATUS 5963 wlan_mlme_get_bmiss_timeout_on_wakeup(struct wlan_objmgr_psoc *psoc, 5964 uint8_t *val) 5965 { 5966 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5967 5968 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5969 if (!mlme_obj) { 5970 *val = cfg_default(CFG_LFR_BEACONLOSS_TIMEOUT_ON_WAKEUP); 5971 return QDF_STATUS_E_INVAL; 5972 } 5973 5974 *val = mlme_obj->cfg.lfr.beaconloss_timeout_onwakeup; 5975 5976 return QDF_STATUS_SUCCESS; 5977 } 5978 5979 QDF_STATUS 5980 wlan_mlme_get_bmiss_timeout_on_sleep(struct wlan_objmgr_psoc *psoc, 5981 uint8_t *val) 5982 { 5983 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5984 5985 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5986 if (!mlme_obj) { 5987 *val = cfg_default(CFG_LFR_BEACONLOSS_TIMEOUT_ON_SLEEP); 5988 return QDF_STATUS_E_INVAL; 5989 } 5990 5991 *val = mlme_obj->cfg.lfr.beaconloss_timeout_onsleep; 5992 5993 return QDF_STATUS_SUCCESS; 5994 } 5995 5996 QDF_STATUS 5997 wlan_mlme_get_roam_bmiss_first_bcnt(struct wlan_objmgr_psoc *psoc, 5998 uint8_t *val) 5999 { 6000 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6001 6002 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6003 if (!mlme_obj) { 6004 *val = cfg_default(CFG_LFR_ROAM_BMISS_FIRST_BCNT); 6005 return QDF_STATUS_E_INVAL; 6006 } 6007 6008 *val = mlme_obj->cfg.lfr.roam_bmiss_first_bcnt; 6009 6010 return QDF_STATUS_SUCCESS; 6011 } 6012 6013 #ifdef WLAN_ADAPTIVE_11R 6014 bool wlan_mlme_adaptive_11r_enabled(struct wlan_objmgr_psoc *psoc) 6015 { 6016 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6017 6018 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6019 if (!mlme_obj) 6020 return cfg_default(CFG_ADAPTIVE_11R); 6021 6022 return mlme_obj->cfg.lfr.enable_adaptive_11r; 6023 } 6024 #endif 6025 6026 QDF_STATUS 6027 wlan_mlme_get_mawc_enabled(struct wlan_objmgr_psoc *psoc, bool *val) 6028 { 6029 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6030 6031 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6032 if (!mlme_obj) { 6033 *val = cfg_default(CFG_LFR_MAWC_FEATURE_ENABLED); 6034 return QDF_STATUS_E_INVAL; 6035 } 6036 6037 *val = mlme_obj->cfg.lfr.mawc_enabled; 6038 6039 return QDF_STATUS_SUCCESS; 6040 } 6041 6042 QDF_STATUS 6043 wlan_mlme_get_mawc_roam_enabled(struct wlan_objmgr_psoc *psoc, bool *val) 6044 { 6045 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6046 6047 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6048 if (!mlme_obj) { 6049 *val = cfg_default(CFG_LFR_MAWC_ROAM_ENABLED); 6050 return QDF_STATUS_E_INVAL; 6051 } 6052 6053 *val = mlme_obj->cfg.lfr.mawc_roam_enabled; 6054 6055 return QDF_STATUS_SUCCESS; 6056 } 6057 6058 QDF_STATUS 6059 wlan_mlme_get_mawc_roam_traffic_threshold(struct wlan_objmgr_psoc *psoc, 6060 uint32_t *val) 6061 { 6062 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6063 6064 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6065 if (!mlme_obj) { 6066 *val = cfg_default(CFG_LFR_MAWC_ROAM_TRAFFIC_THRESHOLD); 6067 return QDF_STATUS_E_INVAL; 6068 } 6069 6070 *val = mlme_obj->cfg.lfr.mawc_roam_traffic_threshold; 6071 6072 return QDF_STATUS_SUCCESS; 6073 } 6074 6075 QDF_STATUS 6076 wlan_mlme_get_mawc_roam_ap_rssi_threshold(struct wlan_objmgr_psoc *psoc, 6077 uint32_t *val) 6078 { 6079 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6080 6081 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6082 if (!mlme_obj) { 6083 *val = cfg_default(CFG_LFR_MAWC_ROAM_AP_RSSI_THRESHOLD); 6084 return QDF_STATUS_E_INVAL; 6085 } 6086 6087 *val = mlme_obj->cfg.lfr.mawc_roam_ap_rssi_threshold; 6088 6089 return QDF_STATUS_SUCCESS; 6090 } 6091 6092 QDF_STATUS 6093 wlan_mlme_get_mawc_roam_rssi_high_adjust(struct wlan_objmgr_psoc *psoc, 6094 uint8_t *val) 6095 { 6096 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6097 6098 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6099 if (!mlme_obj) { 6100 *val = cfg_default(CFG_LFR_MAWC_ROAM_RSSI_HIGH_ADJUST); 6101 return QDF_STATUS_E_INVAL; 6102 } 6103 6104 *val = mlme_obj->cfg.lfr.mawc_roam_rssi_high_adjust; 6105 6106 return QDF_STATUS_SUCCESS; 6107 } 6108 6109 QDF_STATUS 6110 wlan_mlme_get_mawc_roam_rssi_low_adjust(struct wlan_objmgr_psoc *psoc, 6111 uint8_t *val) 6112 { 6113 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6114 6115 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6116 if (!mlme_obj) { 6117 *val = cfg_default(CFG_LFR_MAWC_ROAM_RSSI_LOW_ADJUST); 6118 return QDF_STATUS_E_INVAL; 6119 } 6120 6121 *val = mlme_obj->cfg.lfr.mawc_roam_rssi_low_adjust; 6122 6123 return QDF_STATUS_SUCCESS; 6124 } 6125 6126 QDF_STATUS 6127 wlan_mlme_get_bss_load_enabled(struct wlan_objmgr_psoc *psoc, bool *val) 6128 { 6129 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6130 6131 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6132 if (!mlme_obj) { 6133 *val = cfg_default(CFG_ENABLE_BSS_LOAD_TRIGGERED_ROAM); 6134 return QDF_STATUS_E_INVAL; 6135 } 6136 6137 *val = mlme_obj->cfg.lfr.bss_load_trig.enabled; 6138 6139 return QDF_STATUS_SUCCESS; 6140 } 6141 6142 QDF_STATUS 6143 wlan_mlme_get_bss_load_threshold(struct wlan_objmgr_psoc *psoc, uint32_t *val) 6144 { 6145 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6146 6147 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6148 if (!mlme_obj) { 6149 *val = cfg_default(CFG_BSS_LOAD_THRESHOLD); 6150 return QDF_STATUS_E_INVAL; 6151 } 6152 6153 *val = mlme_obj->cfg.lfr.bss_load_trig.threshold; 6154 6155 return QDF_STATUS_SUCCESS; 6156 } 6157 6158 QDF_STATUS 6159 wlan_mlme_get_bss_load_sample_time(struct wlan_objmgr_psoc *psoc, 6160 uint32_t *val) 6161 { 6162 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6163 6164 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6165 if (!mlme_obj) { 6166 *val = cfg_default(CFG_BSS_LOAD_SAMPLE_TIME); 6167 return QDF_STATUS_E_INVAL; 6168 } 6169 6170 *val = mlme_obj->cfg.lfr.bss_load_trig.sample_time; 6171 6172 return QDF_STATUS_SUCCESS; 6173 } 6174 6175 QDF_STATUS 6176 wlan_mlme_get_bss_load_rssi_threshold_6ghz(struct wlan_objmgr_psoc *psoc, 6177 int32_t *val) 6178 { 6179 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6180 6181 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6182 if (!mlme_obj) { 6183 *val = cfg_default(CFG_BSS_LOAD_TRIG_6G_RSSI_THRES); 6184 return QDF_STATUS_E_INVAL; 6185 } 6186 6187 *val = mlme_obj->cfg.lfr.bss_load_trig.rssi_threshold_6ghz; 6188 6189 return QDF_STATUS_SUCCESS; 6190 } 6191 6192 QDF_STATUS 6193 wlan_mlme_get_bss_load_rssi_threshold_5ghz(struct wlan_objmgr_psoc *psoc, 6194 int32_t *val) 6195 { 6196 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6197 6198 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6199 if (!mlme_obj) { 6200 *val = cfg_default(CFG_BSS_LOAD_TRIG_5G_RSSI_THRES); 6201 return QDF_STATUS_E_INVAL; 6202 } 6203 6204 *val = mlme_obj->cfg.lfr.bss_load_trig.rssi_threshold_5ghz; 6205 6206 return QDF_STATUS_SUCCESS; 6207 } 6208 6209 QDF_STATUS 6210 wlan_mlme_get_bss_load_rssi_threshold_24ghz(struct wlan_objmgr_psoc *psoc, 6211 int32_t *val) 6212 { 6213 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6214 6215 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6216 if (!mlme_obj) { 6217 *val = cfg_default(CFG_BSS_LOAD_TRIG_2G_RSSI_THRES); 6218 return QDF_STATUS_E_INVAL; 6219 } 6220 6221 *val = mlme_obj->cfg.lfr.bss_load_trig.rssi_threshold_24ghz; 6222 6223 return QDF_STATUS_SUCCESS; 6224 } 6225 6226 bool 6227 wlan_mlme_check_chan_param_has_dfs(struct wlan_objmgr_pdev *pdev, 6228 struct ch_params *ch_params, 6229 uint32_t chan_freq) 6230 { 6231 bool is_dfs = false; 6232 6233 if (ch_params->ch_width == CH_WIDTH_160MHZ) { 6234 wlan_reg_set_create_punc_bitmap(ch_params, true); 6235 if (wlan_reg_get_5g_bonded_channel_state_for_pwrmode(pdev, 6236 chan_freq, 6237 ch_params, 6238 REG_CURRENT_PWR_MODE) == 6239 CHANNEL_STATE_DFS) 6240 is_dfs = true; 6241 } else if (ch_params->ch_width == CH_WIDTH_80P80MHZ) { 6242 if (wlan_reg_get_channel_state_for_pwrmode( 6243 pdev, 6244 chan_freq, 6245 REG_CURRENT_PWR_MODE) == CHANNEL_STATE_DFS || 6246 wlan_reg_get_channel_state_for_pwrmode( 6247 pdev, 6248 ch_params->mhz_freq_seg1, 6249 REG_CURRENT_PWR_MODE) == CHANNEL_STATE_DFS) 6250 is_dfs = true; 6251 } else if (wlan_reg_is_dfs_for_freq(pdev, chan_freq)) { 6252 /*Indoor channels are also marked DFS, therefore 6253 * check if the channel has REGULATORY_CHAN_RADAR 6254 * channel flag to identify if the channel is DFS 6255 */ 6256 is_dfs = true; 6257 } 6258 6259 if (WLAN_REG_IS_6GHZ_CHAN_FREQ(chan_freq) || 6260 WLAN_REG_IS_24GHZ_CH_FREQ(chan_freq)) 6261 is_dfs = false; 6262 6263 return is_dfs; 6264 } 6265 6266 QDF_STATUS 6267 wlan_mlme_set_usr_disabled_roaming(struct wlan_objmgr_psoc *psoc, bool val) 6268 { 6269 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6270 6271 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6272 if (!mlme_obj) 6273 return QDF_STATUS_E_FAILURE; 6274 6275 mlme_obj->cfg.sta.usr_disabled_roaming = val; 6276 6277 return QDF_STATUS_SUCCESS; 6278 } 6279 6280 QDF_STATUS 6281 wlan_mlme_get_usr_disabled_roaming(struct wlan_objmgr_psoc *psoc, bool *val) 6282 { 6283 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6284 6285 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6286 if (!mlme_obj) 6287 return QDF_STATUS_E_INVAL; 6288 6289 *val = mlme_obj->cfg.sta.usr_disabled_roaming; 6290 6291 return QDF_STATUS_SUCCESS; 6292 } 6293 6294 qdf_size_t mlme_get_opr_rate(struct wlan_objmgr_vdev *vdev, uint8_t *dst, 6295 qdf_size_t len) 6296 { 6297 struct mlme_legacy_priv *mlme_priv; 6298 6299 if (!vdev || !dst || !len) { 6300 mlme_legacy_err("invalid params"); 6301 return 0; 6302 } 6303 6304 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 6305 if (!mlme_priv) { 6306 mlme_legacy_err("vdev legacy private object is NULL"); 6307 return 0; 6308 } 6309 6310 if (len < mlme_priv->opr_rate_set.len) { 6311 mlme_legacy_err("Invalid length %zd (<%zd)", len, 6312 mlme_priv->opr_rate_set.len); 6313 return 0; 6314 } 6315 6316 qdf_mem_copy(dst, mlme_priv->opr_rate_set.data, 6317 mlme_priv->opr_rate_set.len); 6318 6319 return mlme_priv->opr_rate_set.len; 6320 } 6321 6322 QDF_STATUS mlme_set_opr_rate(struct wlan_objmgr_vdev *vdev, uint8_t *src, 6323 qdf_size_t len) 6324 { 6325 struct mlme_legacy_priv *mlme_priv; 6326 6327 if (!vdev || !src) { 6328 mlme_legacy_err("invalid params"); 6329 return QDF_STATUS_E_INVAL; 6330 } 6331 6332 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 6333 if (!mlme_priv) { 6334 mlme_legacy_err("vdev legacy private object is NULL"); 6335 return QDF_STATUS_E_FAILURE; 6336 } 6337 6338 if (len > mlme_priv->opr_rate_set.max_len) { 6339 mlme_legacy_err("Invalid len %zd (>%zd)", len, 6340 mlme_priv->opr_rate_set.max_len); 6341 return QDF_STATUS_E_INVAL; 6342 } 6343 6344 mlme_priv->opr_rate_set.len = len; 6345 qdf_mem_copy(mlme_priv->opr_rate_set.data, src, len); 6346 6347 return QDF_STATUS_SUCCESS; 6348 } 6349 6350 qdf_size_t mlme_get_ext_opr_rate(struct wlan_objmgr_vdev *vdev, uint8_t *dst, 6351 qdf_size_t len) 6352 { 6353 struct mlme_legacy_priv *mlme_priv; 6354 6355 if (!vdev || !dst || !len) { 6356 mlme_legacy_err("invalid params"); 6357 return 0; 6358 } 6359 6360 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 6361 if (!mlme_priv) { 6362 mlme_legacy_err("vdev legacy private object is NULL"); 6363 return 0; 6364 } 6365 6366 if (len < mlme_priv->ext_opr_rate_set.len) { 6367 mlme_legacy_err("Invalid length %zd (<%zd)", len, 6368 mlme_priv->ext_opr_rate_set.len); 6369 return 0; 6370 } 6371 6372 qdf_mem_copy(dst, mlme_priv->ext_opr_rate_set.data, 6373 mlme_priv->ext_opr_rate_set.len); 6374 6375 return mlme_priv->ext_opr_rate_set.len; 6376 } 6377 6378 QDF_STATUS mlme_set_ext_opr_rate(struct wlan_objmgr_vdev *vdev, uint8_t *src, 6379 qdf_size_t len) 6380 { 6381 struct mlme_legacy_priv *mlme_priv; 6382 6383 if (!vdev || !src) { 6384 mlme_legacy_err("invalid params"); 6385 return QDF_STATUS_E_INVAL; 6386 } 6387 6388 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 6389 if (!mlme_priv) { 6390 mlme_legacy_err("vdev legacy private object is NULL"); 6391 return QDF_STATUS_E_FAILURE; 6392 } 6393 6394 if (len > mlme_priv->ext_opr_rate_set.max_len) { 6395 mlme_legacy_err("Invalid len %zd (>%zd)", len, 6396 mlme_priv->ext_opr_rate_set.max_len); 6397 return QDF_STATUS_E_INVAL; 6398 } 6399 6400 mlme_priv->ext_opr_rate_set.len = len; 6401 qdf_mem_copy(mlme_priv->ext_opr_rate_set.data, src, len); 6402 6403 return QDF_STATUS_SUCCESS; 6404 } 6405 6406 QDF_STATUS mlme_clear_ext_opr_rate(struct wlan_objmgr_vdev *vdev) 6407 { 6408 struct mlme_legacy_priv *mlme_priv; 6409 6410 if (!vdev) { 6411 mlme_legacy_err("invalid params"); 6412 return QDF_STATUS_E_INVAL; 6413 } 6414 6415 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 6416 if (!mlme_priv) { 6417 mlme_legacy_err("vdev legacy private object is NULL"); 6418 return QDF_STATUS_E_FAILURE; 6419 } 6420 6421 mlme_priv->ext_opr_rate_set.len = 0; 6422 qdf_mem_set(mlme_priv->ext_opr_rate_set.data, CFG_STR_DATA_LEN, 0); 6423 6424 return QDF_STATUS_SUCCESS; 6425 } 6426 6427 qdf_size_t mlme_get_mcs_rate(struct wlan_objmgr_vdev *vdev, uint8_t *dst, 6428 qdf_size_t len) 6429 { 6430 struct mlme_legacy_priv *mlme_priv; 6431 6432 if (!vdev || !dst || !len) { 6433 mlme_legacy_err("invalid params"); 6434 return 0; 6435 } 6436 6437 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 6438 if (!mlme_priv) { 6439 mlme_legacy_err("vdev legacy private object is NULL"); 6440 return 0; 6441 } 6442 6443 if (len < mlme_priv->mcs_rate_set.len) { 6444 mlme_legacy_err("Invalid length %zd (<%zd)", len, 6445 mlme_priv->mcs_rate_set.len); 6446 return 0; 6447 } 6448 6449 qdf_mem_copy(dst, mlme_priv->mcs_rate_set.data, 6450 mlme_priv->mcs_rate_set.len); 6451 6452 return mlme_priv->mcs_rate_set.len; 6453 } 6454 6455 QDF_STATUS mlme_set_mcs_rate(struct wlan_objmgr_vdev *vdev, uint8_t *src, 6456 qdf_size_t len) 6457 { 6458 struct mlme_legacy_priv *mlme_priv; 6459 6460 if (!vdev || !src) { 6461 mlme_legacy_err("invalid params"); 6462 return QDF_STATUS_E_INVAL; 6463 } 6464 6465 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 6466 if (!mlme_priv) { 6467 mlme_legacy_err("vdev legacy private object is NULL"); 6468 return QDF_STATUS_E_FAILURE; 6469 } 6470 6471 if (len > mlme_priv->mcs_rate_set.max_len) { 6472 mlme_legacy_err("Invalid len %zd (>%zd)", len, 6473 mlme_priv->mcs_rate_set.max_len); 6474 return QDF_STATUS_E_INVAL; 6475 } 6476 6477 mlme_priv->mcs_rate_set.len = len; 6478 qdf_mem_copy(mlme_priv->mcs_rate_set.data, src, len); 6479 6480 return QDF_STATUS_SUCCESS; 6481 } 6482 6483 QDF_STATUS mlme_clear_mcs_rate(struct wlan_objmgr_vdev *vdev) 6484 { 6485 struct mlme_legacy_priv *mlme_priv; 6486 6487 if (!vdev) { 6488 mlme_legacy_err("invalid params"); 6489 return QDF_STATUS_E_INVAL; 6490 } 6491 6492 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 6493 if (!mlme_priv) { 6494 mlme_legacy_err("vdev legacy private object is NULL"); 6495 return QDF_STATUS_E_FAILURE; 6496 } 6497 6498 mlme_priv->mcs_rate_set.len = 0; 6499 qdf_mem_set(mlme_priv->mcs_rate_set.data, CFG_STR_DATA_LEN, 0); 6500 6501 return QDF_STATUS_SUCCESS; 6502 } 6503 6504 static enum monitor_mode_concurrency 6505 wlan_mlme_get_monitor_mode_concurrency(struct wlan_objmgr_psoc *psoc) 6506 { 6507 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6508 6509 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6510 if (!mlme_obj) 6511 return cfg_default(CFG_MONITOR_MODE_CONCURRENCY); 6512 6513 return mlme_obj->cfg.gen.monitor_mode_concurrency; 6514 } 6515 6516 #ifdef FEATURE_WDS 6517 enum wlan_wds_mode 6518 wlan_mlme_get_wds_mode(struct wlan_objmgr_psoc *psoc) 6519 { 6520 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6521 6522 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6523 if (!mlme_obj) 6524 return cfg_default(CFG_WDS_MODE); 6525 6526 return mlme_obj->cfg.gen.wds_mode; 6527 } 6528 6529 void wlan_mlme_set_wds_mode(struct wlan_objmgr_psoc *psoc, 6530 enum wlan_wds_mode mode) 6531 { 6532 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6533 6534 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6535 if (!mlme_obj) 6536 return; 6537 if (mode <= WLAN_WDS_MODE_MAX) 6538 mlme_obj->cfg.gen.wds_mode = mode; 6539 } 6540 #endif 6541 6542 bool wlan_mlme_is_sta_mon_conc_supported(struct wlan_objmgr_psoc *psoc) 6543 { 6544 if (wlan_mlme_get_monitor_mode_concurrency(psoc) == 6545 MONITOR_MODE_CONC_STA_SCAN_MON) 6546 return true; 6547 6548 return false; 6549 } 6550 6551 bool wlan_mlme_skip_tpe(struct wlan_objmgr_psoc *psoc) 6552 { 6553 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6554 6555 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6556 if (!mlme_obj) 6557 return false; 6558 6559 return mlme_obj->cfg.power.skip_tpe; 6560 } 6561 6562 #ifdef WLAN_FEATURE_11BE 6563 QDF_STATUS mlme_cfg_get_orig_eht_caps(struct wlan_objmgr_psoc *psoc, 6564 tDot11fIEeht_cap *eht_cap) 6565 { 6566 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6567 6568 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6569 if (!mlme_obj) 6570 return QDF_STATUS_E_FAILURE; 6571 6572 *eht_cap = mlme_obj->cfg.eht_caps.eht_cap_orig; 6573 6574 return QDF_STATUS_SUCCESS; 6575 } 6576 6577 QDF_STATUS mlme_cfg_get_eht_caps(struct wlan_objmgr_psoc *psoc, 6578 tDot11fIEeht_cap *eht_cap) 6579 { 6580 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6581 6582 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6583 if (!mlme_obj) 6584 return QDF_STATUS_E_FAILURE; 6585 6586 *eht_cap = mlme_obj->cfg.eht_caps.dot11_eht_cap; 6587 6588 return QDF_STATUS_SUCCESS; 6589 } 6590 #endif 6591 6592 QDF_STATUS 6593 wlan_mlme_set_ba_2k_jump_iot_ap(struct wlan_objmgr_vdev *vdev, bool found) 6594 { 6595 struct mlme_legacy_priv *mlme_priv; 6596 6597 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 6598 if (!mlme_priv) { 6599 mlme_legacy_err("vdev legacy private object is NULL"); 6600 return QDF_STATUS_E_FAILURE; 6601 } 6602 6603 mlme_priv->ba_2k_jump_iot_ap = found; 6604 6605 return QDF_STATUS_SUCCESS; 6606 } 6607 6608 bool wlan_mlme_is_ba_2k_jump_iot_ap(struct wlan_objmgr_vdev *vdev) 6609 { 6610 struct mlme_legacy_priv *mlme_priv; 6611 6612 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 6613 if (!mlme_priv) { 6614 mlme_legacy_err("vdev legacy private object is NULL"); 6615 return false; 6616 } 6617 6618 return mlme_priv->ba_2k_jump_iot_ap; 6619 } 6620 6621 QDF_STATUS 6622 wlan_mlme_set_last_delba_sent_time(struct wlan_objmgr_vdev *vdev, 6623 qdf_time_t delba_sent_time) 6624 { 6625 struct mlme_legacy_priv *mlme_priv; 6626 6627 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 6628 if (!mlme_priv) { 6629 mlme_legacy_err("vdev legacy private object is NULL"); 6630 return QDF_STATUS_E_FAILURE; 6631 } 6632 6633 mlme_priv->last_delba_sent_time = delba_sent_time; 6634 6635 return QDF_STATUS_SUCCESS; 6636 } 6637 6638 qdf_time_t 6639 wlan_mlme_get_last_delba_sent_time(struct wlan_objmgr_vdev *vdev) 6640 { 6641 struct mlme_legacy_priv *mlme_priv; 6642 6643 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 6644 if (!mlme_priv) { 6645 mlme_legacy_err("vdev legacy private object is NULL"); 6646 return 0; 6647 } 6648 6649 return mlme_priv->last_delba_sent_time; 6650 } 6651 6652 QDF_STATUS mlme_set_user_ps(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, 6653 bool ps_enable) 6654 { 6655 struct wlan_objmgr_vdev *vdev; 6656 struct mlme_legacy_priv *mlme_priv; 6657 QDF_STATUS status = QDF_STATUS_E_FAILURE; 6658 6659 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, 6660 WLAN_MLME_OBJMGR_ID); 6661 if (!vdev) 6662 return status; 6663 6664 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 6665 if (mlme_priv) { 6666 mlme_priv->is_usr_ps_enabled = ps_enable; 6667 status = QDF_STATUS_SUCCESS; 6668 mlme_legacy_debug("vdev:%d user PS:%d", vdev_id, 6669 mlme_priv->is_usr_ps_enabled); 6670 } 6671 6672 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID); 6673 6674 return status; 6675 } 6676 6677 bool mlme_get_user_ps(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id) 6678 { 6679 struct wlan_objmgr_vdev *vdev; 6680 struct mlme_legacy_priv *mlme_priv; 6681 bool usr_ps_enable = false; 6682 6683 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, 6684 WLAN_MLME_OBJMGR_ID); 6685 if (!vdev) 6686 return false; 6687 6688 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 6689 if (mlme_priv) 6690 usr_ps_enable = mlme_priv->is_usr_ps_enabled; 6691 6692 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID); 6693 6694 return usr_ps_enable; 6695 } 6696 6697 bool wlan_mlme_is_multipass_sap(struct wlan_objmgr_psoc *psoc) 6698 { 6699 struct target_psoc_info *info; 6700 6701 info = wlan_psoc_get_tgt_if_handle(psoc); 6702 if (!info) { 6703 mlme_legacy_err("target_psoc_info is null"); 6704 return QDF_STATUS_E_FAILURE; 6705 } 6706 6707 return target_is_multipass_sap(info); 6708 } 6709 6710 QDF_STATUS wlan_mlme_get_phy_max_freq_range(struct wlan_objmgr_psoc *psoc, 6711 uint32_t *low_2ghz_chan, 6712 uint32_t *high_2ghz_chan, 6713 uint32_t *low_5ghz_chan, 6714 uint32_t *high_5ghz_chan) 6715 { 6716 uint32_t i; 6717 uint32_t reg_low_2ghz_chan; 6718 uint32_t reg_high_2ghz_chan; 6719 uint32_t reg_low_5ghz_chan; 6720 uint32_t reg_high_5ghz_chan; 6721 struct target_psoc_info *info; 6722 struct wlan_psoc_host_mac_phy_caps *mac_phy_cap; 6723 struct wlan_psoc_host_hal_reg_cap_ext *reg_cap_ext; 6724 6725 info = wlan_psoc_get_tgt_if_handle(psoc); 6726 if (!info) { 6727 mlme_legacy_err("target_psoc_info is null"); 6728 return QDF_STATUS_E_FAILURE; 6729 } 6730 mac_phy_cap = info->info.mac_phy_cap; 6731 reg_cap_ext = &mac_phy_cap->reg_cap_ext; 6732 reg_low_2ghz_chan = reg_cap_ext->low_2ghz_chan; 6733 reg_high_2ghz_chan = reg_cap_ext->high_2ghz_chan; 6734 reg_low_5ghz_chan = reg_cap_ext->low_5ghz_chan; 6735 reg_high_5ghz_chan = reg_cap_ext->high_5ghz_chan; 6736 for (i = 1; i < PSOC_MAX_MAC_PHY_CAP; i++) { 6737 mac_phy_cap = &info->info.mac_phy_cap[i]; 6738 reg_cap_ext = &mac_phy_cap->reg_cap_ext; 6739 6740 if (reg_cap_ext->low_2ghz_chan) { 6741 reg_low_2ghz_chan = reg_low_2ghz_chan ? 6742 QDF_MIN(reg_cap_ext->low_2ghz_chan, 6743 reg_low_2ghz_chan) : 6744 reg_cap_ext->low_2ghz_chan; 6745 } 6746 if (reg_cap_ext->high_2ghz_chan) { 6747 reg_high_2ghz_chan = reg_high_2ghz_chan ? 6748 QDF_MAX(reg_cap_ext->high_2ghz_chan, 6749 reg_high_2ghz_chan) : 6750 reg_cap_ext->high_2ghz_chan; 6751 } 6752 if (reg_cap_ext->low_5ghz_chan) { 6753 reg_low_5ghz_chan = reg_low_5ghz_chan ? 6754 QDF_MIN(reg_cap_ext->low_5ghz_chan, 6755 reg_low_5ghz_chan) : 6756 reg_cap_ext->low_5ghz_chan; 6757 } 6758 if (reg_cap_ext->high_5ghz_chan) { 6759 reg_high_5ghz_chan = reg_high_5ghz_chan ? 6760 QDF_MAX(reg_cap_ext->high_5ghz_chan, 6761 reg_high_5ghz_chan) : 6762 reg_cap_ext->high_5ghz_chan; 6763 } 6764 } 6765 /* For old hw, no reg_cap_ext reported from service ready ext, 6766 * fill the low/high with default of regulatory. 6767 */ 6768 if (!reg_low_2ghz_chan && !reg_high_2ghz_chan && 6769 !reg_low_5ghz_chan && !reg_high_5ghz_chan) { 6770 mlme_legacy_debug("no reg_cap_ext in mac_phy_cap"); 6771 reg_low_2ghz_chan = TWOG_STARTING_FREQ - 10; 6772 reg_high_2ghz_chan = TWOG_CHAN_14_IN_MHZ + 10; 6773 reg_low_5ghz_chan = FIVEG_STARTING_FREQ - 10; 6774 reg_high_5ghz_chan = SIXG_CHAN_233_IN_MHZ + 10; 6775 } 6776 if (!wlan_reg_is_6ghz_supported(psoc)) { 6777 mlme_legacy_debug("disabling 6ghz channels"); 6778 reg_high_5ghz_chan = FIVEG_CHAN_177_IN_MHZ + 10; 6779 } 6780 mlme_legacy_debug("%d %d %d %d", reg_low_2ghz_chan, reg_high_2ghz_chan, 6781 reg_low_5ghz_chan, reg_high_5ghz_chan); 6782 *low_2ghz_chan = reg_low_2ghz_chan; 6783 *high_2ghz_chan = reg_high_2ghz_chan; 6784 *low_5ghz_chan = reg_low_5ghz_chan; 6785 *high_5ghz_chan = reg_high_5ghz_chan; 6786 6787 return QDF_STATUS_SUCCESS; 6788 } 6789 6790 #ifdef WLAN_FEATURE_P2P_P2P_STA 6791 bool 6792 wlan_mlme_get_p2p_p2p_conc_support(struct wlan_objmgr_psoc *psoc) 6793 { 6794 return wlan_psoc_nif_fw_ext_cap_get(psoc, 6795 WLAN_SOC_EXT_P2P_P2P_CONC_SUPPORT); 6796 } 6797 #endif 6798 6799 enum phy_ch_width mlme_get_vht_ch_width(void) 6800 { 6801 enum phy_ch_width bandwidth = CH_WIDTH_INVALID; 6802 uint32_t fw_ch_wd = wma_get_vht_ch_width(); 6803 6804 if (fw_ch_wd == WNI_CFG_VHT_CHANNEL_WIDTH_80_PLUS_80MHZ) 6805 bandwidth = CH_WIDTH_80P80MHZ; 6806 else if (fw_ch_wd == WNI_CFG_VHT_CHANNEL_WIDTH_160MHZ) 6807 bandwidth = CH_WIDTH_160MHZ; 6808 else 6809 bandwidth = CH_WIDTH_80MHZ; 6810 6811 return bandwidth; 6812 } 6813 6814 uint8_t 6815 wlan_mlme_get_mgmt_hw_tx_retry_count(struct wlan_objmgr_psoc *psoc, 6816 enum mlme_cfg_frame_type frm_type) 6817 { 6818 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6819 6820 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6821 6822 if (!mlme_obj) 6823 return 0; 6824 6825 if (frm_type >= CFG_FRAME_TYPE_MAX) 6826 return 0; 6827 6828 return mlme_obj->cfg.gen.mgmt_hw_tx_retry_count[frm_type]; 6829 } 6830 6831 QDF_STATUS 6832 wlan_mlme_get_tx_retry_multiplier(struct wlan_objmgr_psoc *psoc, 6833 uint32_t *tx_retry_multiplier) 6834 { 6835 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6836 6837 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6838 6839 if (!mlme_obj) { 6840 *tx_retry_multiplier = 6841 cfg_default(CFG_TX_RETRY_MULTIPLIER); 6842 return QDF_STATUS_E_FAILURE; 6843 } 6844 6845 *tx_retry_multiplier = mlme_obj->cfg.gen.tx_retry_multiplier; 6846 return QDF_STATUS_SUCCESS; 6847 } 6848 6849 QDF_STATUS 6850 wlan_mlme_get_update_chan_width_allowed(struct wlan_objmgr_psoc *psoc, 6851 bool *value) 6852 { 6853 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6854 6855 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6856 if (!mlme_obj) { 6857 *value = cfg_default(CFG_ALLOW_UPDATE_CHANNEL_WIDTH); 6858 return QDF_STATUS_E_INVAL; 6859 } 6860 6861 *value = mlme_obj->cfg.feature_flags.update_cw_allowed; 6862 6863 return QDF_STATUS_SUCCESS; 6864 } 6865 6866 QDF_STATUS 6867 wlan_mlme_get_channel_bonding_5ghz(struct wlan_objmgr_psoc *psoc, 6868 uint32_t *value) 6869 { 6870 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6871 6872 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6873 if (!mlme_obj) { 6874 *value = cfg_default(CFG_CHANNEL_BONDING_MODE_5GHZ); 6875 return QDF_STATUS_E_INVAL; 6876 } 6877 6878 *value = mlme_obj->cfg.feature_flags.channel_bonding_mode_5ghz; 6879 6880 return QDF_STATUS_SUCCESS; 6881 } 6882 6883 QDF_STATUS 6884 wlan_mlme_update_ratemask_params(struct wlan_objmgr_vdev *vdev, 6885 uint8_t num_ratemask, 6886 struct config_ratemask_params *rate_params) 6887 { 6888 struct vdev_mlme_obj *vdev_mlme; 6889 struct vdev_mlme_rate_info *rate_info; 6890 QDF_STATUS ret; 6891 uint8_t i = 0; 6892 uint8_t index; 6893 6894 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 6895 if (!vdev_mlme) 6896 return QDF_STATUS_E_FAILURE; 6897 6898 rate_info = &vdev_mlme->mgmt.rate_info; 6899 while (i < num_ratemask) { 6900 index = rate_params[i].type; 6901 if (index >= WLAN_VDEV_RATEMASK_TYPE_MAX) { 6902 mlme_legacy_err("Invalid ratemask type"); 6903 ++i; 6904 continue; 6905 } 6906 6907 if (rate_info->ratemask_params[index].lower32 != 6908 rate_params[i].lower32 || 6909 rate_info->ratemask_params[index].lower32_2 != 6910 rate_params[i].lower32_2 || 6911 rate_info->ratemask_params[index].higher32 != 6912 rate_params[i].higher32 || 6913 rate_info->ratemask_params[index].higher32_2 != 6914 rate_params[i].higher32_2) { 6915 rate_info->ratemask_params[index].lower32 = 6916 rate_params[i].lower32; 6917 rate_info->ratemask_params[index].higher32 = 6918 rate_params[i].higher32; 6919 rate_info->ratemask_params[index].lower32_2 = 6920 rate_params[i].lower32_2; 6921 rate_info->ratemask_params[index].higher32_2 = 6922 rate_params[i].higher32_2; 6923 ret = wlan_util_vdev_mlme_set_ratemask_config(vdev_mlme, 6924 index); 6925 if (ret != QDF_STATUS_SUCCESS) 6926 mlme_legacy_err("ratemask config failed"); 6927 } else { 6928 mlme_legacy_debug("Ratemask same as configured mask"); 6929 } 6930 ++i; 6931 } 6932 return QDF_STATUS_SUCCESS; 6933 } 6934 6935 bool wlan_mlme_is_channel_valid(struct wlan_objmgr_psoc *psoc, 6936 uint32_t chan_freq) 6937 { 6938 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6939 6940 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6941 if (!mlme_obj) 6942 return false; 6943 6944 return wlan_roam_is_channel_valid(&mlme_obj->cfg.reg, 6945 chan_freq); 6946 } 6947 6948 #ifdef WLAN_FEATURE_MCC_QUOTA 6949 #define WLAN_MCC_MIN_QUOTA 10 /* in %age */ 6950 #define WLAN_MCC_MAX_QUOTA 90 /* in %age */ 6951 QDF_STATUS wlan_mlme_set_user_mcc_quota(struct wlan_objmgr_psoc *psoc, 6952 struct wlan_user_mcc_quota *quota) 6953 6954 { 6955 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6956 6957 if (!quota) 6958 return QDF_STATUS_E_NULL_VALUE; 6959 6960 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6961 if (!mlme_obj) 6962 return QDF_STATUS_E_FAILURE; 6963 6964 if (quota->quota < WLAN_MCC_MIN_QUOTA) 6965 quota->quota = WLAN_MCC_MIN_QUOTA; 6966 else if (quota->quota > WLAN_MCC_MAX_QUOTA) 6967 quota->quota = WLAN_MCC_MAX_QUOTA; 6968 6969 mlme_obj->cfg.gen.user_mcc_quota.quota = quota->quota; 6970 mlme_obj->cfg.gen.user_mcc_quota.op_mode = quota->op_mode; 6971 mlme_obj->cfg.gen.user_mcc_quota.vdev_id = quota->vdev_id; 6972 6973 mlme_debug("quota : %u, op_mode : %d, vdev_id : %u", 6974 quota->quota, quota->op_mode, quota->vdev_id); 6975 6976 return QDF_STATUS_SUCCESS; 6977 } 6978 6979 QDF_STATUS wlan_mlme_get_user_mcc_quota(struct wlan_objmgr_psoc *psoc, 6980 struct wlan_user_mcc_quota *quota) 6981 { 6982 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6983 6984 if (!quota) 6985 return QDF_STATUS_E_NULL_VALUE; 6986 6987 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6988 if (!mlme_obj) 6989 return QDF_STATUS_E_FAILURE; 6990 6991 quota->quota = mlme_obj->cfg.gen.user_mcc_quota.quota; 6992 quota->op_mode = mlme_obj->cfg.gen.user_mcc_quota.op_mode; 6993 quota->vdev_id = mlme_obj->cfg.gen.user_mcc_quota.vdev_id; 6994 6995 return QDF_STATUS_SUCCESS; 6996 } 6997 6998 uint32_t 6999 wlan_mlme_get_user_mcc_duty_cycle_percentage(struct wlan_objmgr_psoc *psoc) 7000 { 7001 uint32_t mcc_freq, ch_freq, quota_value; 7002 struct wlan_user_mcc_quota quota; 7003 uint8_t operating_channel; 7004 int status; 7005 7006 quota.vdev_id = WLAN_UMAC_VDEV_ID_MAX; 7007 quota.quota = 0; 7008 if (QDF_IS_STATUS_ERROR(wlan_mlme_get_user_mcc_quota(psoc, "a))) { 7009 mlme_debug("Error getting user quota set"); 7010 return 0; 7011 } 7012 7013 if (quota.vdev_id == WLAN_UMAC_VDEV_ID_MAX || quota.quota == 0) { 7014 mlme_debug("Invalid quota : vdev %u, quota %u", 7015 quota.vdev_id, quota.quota); 7016 return 0; 7017 } 7018 status = policy_mgr_get_chan_by_session_id(psoc, quota.vdev_id, 7019 &ch_freq); 7020 if (QDF_IS_STATUS_ERROR(status)) { 7021 mlme_debug("Could not get vdev %u chan", quota.vdev_id); 7022 return 0; 7023 } 7024 mcc_freq = policy_mgr_get_mcc_operating_channel(psoc, quota.vdev_id); 7025 if (mcc_freq == INVALID_CHANNEL_ID) 7026 return 0; 7027 7028 operating_channel = wlan_freq_to_chan(ch_freq); 7029 if (!operating_channel) { 7030 mlme_debug("Primary op channel is invalid"); 7031 return 0; 7032 } 7033 /* 7034 * The channel numbers for both adapters and the time 7035 * quota for the 1st adapter, i.e., one specified in cmd 7036 * are formatted as a bit vector 7037 * ****************************************************** 7038 * |bit 31-24 | bit 23-16 | bits 15-8 |bits 7-0 | 7039 * | Unused | Quota for | chan. # for |chan. # for| 7040 * | | 1st chan | 1st chan. |2nd chan. | 7041 * ****************************************************** 7042 */ 7043 mlme_debug("Opmode (%d) vdev (%u) channel %u and quota %u", 7044 quota.op_mode, quota.vdev_id, 7045 operating_channel, quota.quota); 7046 quota_value = quota.quota; 7047 /* Move the time quota for first channel to bits 15-8 */ 7048 quota_value = quota_value << 8; 7049 /* 7050 * Store the channel number of 1st channel at bits 7-0 7051 * of the bit vector 7052 */ 7053 quota_value |= operating_channel; 7054 7055 operating_channel = wlan_freq_to_chan(mcc_freq); 7056 if (!operating_channel) { 7057 mlme_debug("Secondary op channel is invalid"); 7058 return 0; 7059 } 7060 7061 /* 7062 * Now move the time quota and channel number of the 7063 * 1st adapter to bits 23-16 and bits 15-8 of the bit 7064 * vector, respectively. 7065 */ 7066 quota_value = quota_value << 8; 7067 /* 7068 * Set the channel number for 2nd MCC vdev at bits 7069 * 7-0 of set_value 7070 */ 7071 quota_value |= operating_channel; 7072 mlme_debug("quota value:%x", quota_value); 7073 7074 return quota_value; 7075 } 7076 #endif /* WLAN_FEATURE_MCC_QUOTA */ 7077 7078 uint8_t mlme_get_max_he_mcs_idx(enum phy_ch_width mcs_ch_width, 7079 u_int16_t *hecap_rxmcsnssmap, 7080 u_int16_t *hecap_txmcsnssmap) 7081 { 7082 uint8_t rx_max_mcs, tx_max_mcs, max_mcs = INVALID_MCS_NSS_INDEX; 7083 7084 switch (mcs_ch_width) { 7085 case CH_WIDTH_80P80MHZ: 7086 if (hecap_rxmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_80_80] && 7087 hecap_txmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_80_80]) { 7088 rx_max_mcs = hecap_rxmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_80_80] & 0x03; 7089 tx_max_mcs = hecap_txmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_80_80] & 0x03; 7090 max_mcs = rx_max_mcs < tx_max_mcs ? rx_max_mcs : tx_max_mcs; 7091 if (max_mcs < 0x03) 7092 max_mcs = 7 + 2 * max_mcs; 7093 } 7094 fallthrough; 7095 case CH_WIDTH_160MHZ: 7096 if (hecap_rxmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_160] && 7097 hecap_txmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_160]) { 7098 rx_max_mcs = hecap_rxmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_160] & 0x03; 7099 tx_max_mcs = hecap_txmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_160] & 0x03; 7100 max_mcs = rx_max_mcs < tx_max_mcs ? rx_max_mcs : tx_max_mcs; 7101 if (max_mcs < 0x03) 7102 max_mcs = 7 + 2 * max_mcs; 7103 } 7104 fallthrough; 7105 default: 7106 if (hecap_rxmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_80] && 7107 hecap_txmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_80]) { 7108 rx_max_mcs = hecap_rxmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_80] & 0x03; 7109 tx_max_mcs = hecap_txmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_80] & 0x03; 7110 max_mcs = rx_max_mcs < tx_max_mcs ? rx_max_mcs : tx_max_mcs; 7111 if (max_mcs < 0x03) 7112 max_mcs = 7 + 2 * max_mcs; 7113 } 7114 } 7115 7116 return max_mcs; 7117 } 7118 7119 uint8_t mlme_get_max_vht_mcs_idx(u_int16_t rx_vht_mcs_map, 7120 u_int16_t tx_vht_mcs_map) 7121 { 7122 uint8_t rx_max_mcs, tx_max_mcs, max_mcs = INVALID_MCS_NSS_INDEX; 7123 7124 if (rx_vht_mcs_map && tx_vht_mcs_map) { 7125 rx_max_mcs = rx_vht_mcs_map & 0x03; 7126 tx_max_mcs = tx_vht_mcs_map & 0x03; 7127 max_mcs = rx_max_mcs < tx_max_mcs ? rx_max_mcs : tx_max_mcs; 7128 if (max_mcs < 0x03) 7129 return 7 + max_mcs; 7130 } 7131 7132 return max_mcs; 7133 } 7134 7135 #ifdef WLAN_FEATURE_SON 7136 QDF_STATUS mlme_save_vdev_max_mcs_idx(struct wlan_objmgr_vdev *vdev, 7137 uint8_t max_mcs_idx) 7138 { 7139 struct mlme_legacy_priv *mlme_priv; 7140 7141 if (!vdev) { 7142 mlme_legacy_err("invalid vdev"); 7143 return QDF_STATUS_E_INVAL; 7144 } 7145 7146 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 7147 if (!mlme_priv) { 7148 mlme_legacy_err("vdev legacy private object is NULL"); 7149 return QDF_STATUS_E_FAILURE; 7150 } 7151 7152 mlme_priv->max_mcs_index = max_mcs_idx; 7153 7154 return QDF_STATUS_SUCCESS; 7155 } 7156 7157 uint8_t mlme_get_vdev_max_mcs_idx(struct wlan_objmgr_vdev *vdev) 7158 { 7159 struct mlme_legacy_priv *mlme_priv; 7160 7161 if (!vdev) { 7162 mlme_legacy_err("invalid vdev"); 7163 return INVALID_MCS_NSS_INDEX; 7164 } 7165 7166 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 7167 if (!mlme_priv) { 7168 mlme_legacy_err("vdev legacy private object is NULL"); 7169 return INVALID_MCS_NSS_INDEX; 7170 } 7171 7172 return mlme_priv->max_mcs_index; 7173 } 7174 #endif /* WLAN_FEATURE_SON */ 7175 7176 void wlan_mlme_get_safe_mode_enable(struct wlan_objmgr_psoc *psoc, 7177 bool *safe_mode_enable) 7178 { 7179 struct wlan_mlme_psoc_ext_obj *mlme_obj; 7180 7181 mlme_obj = mlme_get_psoc_ext_obj(psoc); 7182 if (!mlme_obj) { 7183 mlme_legacy_err("invalid mlme obj"); 7184 *safe_mode_enable = false; 7185 return; 7186 } 7187 7188 *safe_mode_enable = mlme_obj->cfg.gen.safe_mode_enable; 7189 } 7190 7191 void wlan_mlme_set_safe_mode_enable(struct wlan_objmgr_psoc *psoc, 7192 bool safe_mode_enable) 7193 { 7194 struct wlan_mlme_psoc_ext_obj *mlme_obj; 7195 7196 mlme_obj = mlme_get_psoc_ext_obj(psoc); 7197 if (!mlme_obj) { 7198 mlme_legacy_err("invalid mlme obj"); 7199 return; 7200 } 7201 7202 mlme_obj->cfg.gen.safe_mode_enable = safe_mode_enable; 7203 } 7204 7205 uint32_t wlan_mlme_get_6g_ap_power_type(struct wlan_objmgr_vdev *vdev) 7206 { 7207 struct vdev_mlme_obj *mlme_obj; 7208 7209 mlme_obj = wlan_vdev_mlme_get_cmpt_obj(vdev); 7210 7211 if (!mlme_obj) { 7212 mlme_legacy_err("vdev component object is NULL"); 7213 return REG_MAX_AP_TYPE; 7214 } 7215 7216 return mlme_obj->reg_tpc_obj.power_type_6g; 7217 } 7218 7219 QDF_STATUS wlan_connect_hw_mode_change_resp(struct wlan_objmgr_pdev *pdev, 7220 uint8_t vdev_id, 7221 wlan_cm_id cm_id, QDF_STATUS status) 7222 { 7223 return wlan_cm_handle_hw_mode_change_resp(pdev, vdev_id, cm_id, 7224 status); 7225 } 7226 7227 enum phy_ch_width 7228 wlan_mlme_get_ch_width_from_phymode(enum wlan_phymode phy_mode) 7229 { 7230 enum phy_ch_width ch_width; 7231 7232 if (IS_WLAN_PHYMODE_320MHZ(phy_mode)) 7233 ch_width = CH_WIDTH_320MHZ; 7234 else if (IS_WLAN_PHYMODE_160MHZ(phy_mode)) 7235 ch_width = CH_WIDTH_160MHZ; 7236 else if (IS_WLAN_PHYMODE_80MHZ(phy_mode)) 7237 ch_width = CH_WIDTH_80MHZ; 7238 else if (IS_WLAN_PHYMODE_40MHZ(phy_mode)) 7239 ch_width = CH_WIDTH_40MHZ; 7240 else 7241 ch_width = CH_WIDTH_20MHZ; 7242 7243 mlme_legacy_debug("phymode: %d, ch_width: %d ", phy_mode, ch_width); 7244 7245 return ch_width; 7246 } 7247 7248 enum phy_ch_width 7249 wlan_mlme_get_peer_ch_width(struct wlan_objmgr_psoc *psoc, uint8_t *mac) 7250 { 7251 enum wlan_phymode phy_mode; 7252 QDF_STATUS status; 7253 7254 status = mlme_get_peer_phymode(psoc, mac, &phy_mode); 7255 if (QDF_IS_STATUS_ERROR(status)) { 7256 mlme_legacy_err("failed to fetch phy_mode status: %d for mac: " QDF_MAC_ADDR_FMT, 7257 status, QDF_MAC_ADDR_REF(mac)); 7258 return CH_WIDTH_20MHZ; 7259 } 7260 7261 return wlan_mlme_get_ch_width_from_phymode(phy_mode); 7262 } 7263 7264 #ifdef FEATURE_SET 7265 7266 /** 7267 * wlan_mlme_get_latency_enable() - get wlm latency cfg value 7268 * @psoc: psoc context 7269 * @value: Pointer in which wlam latency cfg value needs to be filled 7270 * 7271 * Return: QDF_STATUS_SUCCESS on success or QDF_STATUS_E_INVAL on failure 7272 */ 7273 static QDF_STATUS 7274 wlan_mlme_get_latency_enable(struct wlan_objmgr_psoc *psoc, bool *value) 7275 { 7276 struct wlan_mlme_psoc_ext_obj *mlme_obj; 7277 7278 mlme_obj = mlme_get_psoc_ext_obj(psoc); 7279 if (!mlme_obj) { 7280 mlme_legacy_err("mlme obj null"); 7281 return QDF_STATUS_E_INVAL; 7282 } 7283 7284 *value = mlme_obj->cfg.wlm_config.latency_enable; 7285 return QDF_STATUS_SUCCESS; 7286 } 7287 7288 #ifdef WLAN_ADAPTIVE_11R 7289 /** 7290 * wlan_mlme_get_adaptive11r_enabled() - get adaptive 11r cfg value 7291 * @psoc: psoc context 7292 * @val: Pointer in which adaptive 11r cfg value needs to be filled 7293 * 7294 * Return: QDF_STATUS_SUCCESS on success or QDF_STATUS_E_INVAL on failure 7295 */ 7296 static QDF_STATUS 7297 wlan_mlme_get_adaptive11r_enabled(struct wlan_objmgr_psoc *psoc, bool *val) 7298 { 7299 struct wlan_mlme_psoc_ext_obj *mlme_obj; 7300 7301 mlme_obj = mlme_get_psoc_ext_obj(psoc); 7302 if (!mlme_obj) { 7303 *val = cfg_default(CFG_ADAPTIVE_11R); 7304 return QDF_STATUS_E_INVAL; 7305 } 7306 7307 *val = mlme_obj->cfg.lfr.enable_adaptive_11r; 7308 7309 return QDF_STATUS_SUCCESS; 7310 } 7311 #else 7312 static inline QDF_STATUS 7313 wlan_mlme_get_adaptive11r_enabled(struct wlan_objmgr_psoc *psoc, bool *val) 7314 { 7315 *val = false; 7316 return QDF_STATUS_SUCCESS; 7317 } 7318 #endif 7319 7320 #if defined(WLAN_FEATURE_P2P_P2P_STA) && \ 7321 !defined(WLAN_FEATURE_NO_P2P_CONCURRENCY) 7322 static bool 7323 wlan_mlme_get_p2p_p2p_host_conc_support(void) 7324 { 7325 return true; 7326 } 7327 #else 7328 static bool 7329 wlan_mlme_get_p2p_p2p_host_conc_support(void) 7330 { 7331 return false; 7332 } 7333 #endif 7334 7335 #ifndef WLAN_FEATURE_NO_STA_SAP_CONCURRENCY 7336 static bool 7337 wlan_mlme_get_sta_sap_host_conc_support(void) 7338 { 7339 return true; 7340 } 7341 #else 7342 static bool 7343 wlan_mlme_get_sta_sap_host_conc_support(void) 7344 { 7345 return false; 7346 } 7347 #endif 7348 7349 #ifndef WLAN_FEATURE_NO_STA_NAN_CONCURRENCY 7350 static bool 7351 wlan_mlme_get_sta_nan_host_conc_support(void) 7352 { 7353 return true; 7354 } 7355 #else 7356 static bool 7357 wlan_mlme_get_sta_nan_host_conc_support(void) 7358 { 7359 return false; 7360 } 7361 #endif 7362 7363 #ifdef FEATURE_WLAN_TDLS 7364 static bool 7365 wlan_mlme_get_sta_tdls_host_conc_support(void) 7366 { 7367 return true; 7368 } 7369 #else 7370 static bool 7371 wlan_mlme_get_sta_tdls_host_conc_support(void) 7372 { 7373 return false; 7374 } 7375 #endif 7376 7377 #if !defined(WLAN_FEATURE_NO_STA_SAP_CONCURRENCY) && \ 7378 (!defined(WLAN_FEATURE_NO_P2P_CONCURRENCY) || \ 7379 defined(WLAN_FEATURE_STA_SAP_P2P_CONCURRENCY)) 7380 static bool 7381 wlan_mlme_get_sta_sap_p2p_host_conc_support(void) 7382 { 7383 return true; 7384 } 7385 #else 7386 static bool 7387 wlan_mlme_get_sta_sap_p2p_host_conc_support(void) 7388 { 7389 return false; 7390 } 7391 #endif 7392 7393 #if defined(FEATURE_WLAN_TDLS) 7394 static bool 7395 wlan_mlme_get_sta_p2p_tdls_host_conc_support(void) 7396 { 7397 return true; 7398 } 7399 #else 7400 static bool 7401 wlan_mlme_get_sta_p2p_tdls_host_conc_support(void) 7402 { 7403 return false; 7404 } 7405 #endif 7406 7407 #if defined(FEATURE_WLAN_TDLS) && !defined(WLAN_FEATURE_NO_STA_SAP_CONCURRENCY) 7408 static bool 7409 wlan_mlme_get_sta_sap_tdls_host_conc_support(void) 7410 { 7411 return true; 7412 } 7413 #else 7414 static bool 7415 wlan_mlme_get_sta_sap_tdls_host_conc_support(void) 7416 { 7417 return false; 7418 } 7419 #endif 7420 7421 #if defined(FEATURE_WLAN_TDLS) && \ 7422 !defined(WLAN_FEATURE_NO_STA_SAP_CONCURRENCY) && \ 7423 (!defined(WLAN_FEATURE_NO_P2P_CONCURRENCY) || \ 7424 defined(WLAN_FEATURE_STA_SAP_P2P_CONCURRENCY)) 7425 7426 static bool 7427 wlan_mlme_get_sta_sap_p2p_tdls_host_conc_support(void) 7428 { 7429 return true; 7430 } 7431 #else 7432 static bool 7433 wlan_mlme_get_sta_sap_p2p_tdls_host_conc_support(void) 7434 { 7435 return false; 7436 } 7437 #endif 7438 7439 #if defined(FEATURE_WLAN_TDLS) && defined(WLAN_FEATURE_P2P_P2P_STA) && \ 7440 !defined(WLAN_FEATURE_NO_P2P_CONCURRENCY) 7441 static bool 7442 wlan_mlme_get_sta_p2p_p2p_tdls_host_conc_support(void) 7443 { 7444 return true; 7445 } 7446 #else 7447 static bool 7448 wlan_mlme_get_sta_p2p_p2p_tdls_host_conc_support(void) 7449 { 7450 return false; 7451 } 7452 #endif 7453 7454 /** 7455 * wlan_mlme_set_iface_combinations() - Set interface combinations 7456 * @mlme_feature_set: Pointer to wlan_mlme_features 7457 * 7458 * Return: None 7459 */ 7460 static void 7461 wlan_mlme_set_iface_combinations(struct wlan_mlme_features *mlme_feature_set) 7462 { 7463 mlme_feature_set->iface_combinations = 0; 7464 mlme_feature_set->iface_combinations |= MLME_IFACE_STA_P2P_SUPPORT; 7465 if (wlan_mlme_get_sta_sap_host_conc_support()) 7466 mlme_feature_set->iface_combinations |= 7467 MLME_IFACE_STA_SAP_SUPPORT; 7468 if (wlan_mlme_get_sta_nan_host_conc_support()) 7469 mlme_feature_set->iface_combinations |= 7470 MLME_IFACE_STA_NAN_SUPPORT; 7471 if (wlan_mlme_get_sta_tdls_host_conc_support()) 7472 mlme_feature_set->iface_combinations |= 7473 MLME_IFACE_STA_TDLS_SUPPORT; 7474 if (wlan_mlme_get_p2p_p2p_host_conc_support()) 7475 mlme_feature_set->iface_combinations |= 7476 MLME_IFACE_STA_DUAL_P2P_SUPPORT; 7477 if (wlan_mlme_get_sta_sap_p2p_host_conc_support()) 7478 mlme_feature_set->iface_combinations |= 7479 MLME_IFACE_STA_SAP_P2P_SUPPORT; 7480 if (wlan_mlme_get_sta_p2p_tdls_host_conc_support()) 7481 mlme_feature_set->iface_combinations |= 7482 MLME_IFACE_STA_P2P_TDLS_SUPPORT; 7483 if (wlan_mlme_get_sta_sap_tdls_host_conc_support()) 7484 mlme_feature_set->iface_combinations |= 7485 MLME_IFACE_STA_SAP_TDLS_SUPPORT; 7486 if (wlan_mlme_get_sta_sap_p2p_tdls_host_conc_support()) 7487 mlme_feature_set->iface_combinations |= 7488 MLME_IFACE_STA_SAP_P2P_TDLS_SUPPORT; 7489 if (wlan_mlme_get_sta_p2p_p2p_tdls_host_conc_support()) 7490 mlme_feature_set->iface_combinations |= 7491 MLME_IFACE_STA_P2P_P2P_TDLS_SUPPORT; 7492 mlme_debug("iface combinations = %x", 7493 mlme_feature_set->iface_combinations); 7494 } 7495 7496 void wlan_mlme_get_feature_info(struct wlan_objmgr_psoc *psoc, 7497 struct wlan_mlme_features *mlme_feature_set) 7498 { 7499 uint32_t roam_triggers; 7500 int sap_max_num_clients = 0; 7501 bool is_enable_idle_roam = false, is_bss_load_enabled = false; 7502 7503 wlan_mlme_get_latency_enable(psoc, 7504 &mlme_feature_set->enable_wifi_optimizer); 7505 wlan_mlme_get_sap_max_peers(psoc, &sap_max_num_clients); 7506 mlme_feature_set->sap_max_num_clients = sap_max_num_clients; 7507 mlme_feature_set->vendor_req_1_version = 7508 WMI_HOST_VENDOR1_REQ1_VERSION_4_00; 7509 roam_triggers = wlan_mlme_get_roaming_triggers(psoc); 7510 7511 wlan_mlme_get_bss_load_enabled(psoc, &is_bss_load_enabled); 7512 mlme_feature_set->roaming_high_cu_roam_trigger = 7513 (roam_triggers & BIT(ROAM_TRIGGER_REASON_BSS_LOAD)) && 7514 is_bss_load_enabled; 7515 7516 mlme_feature_set->roaming_emergency_trigger = 7517 roam_triggers & BIT(ROAM_TRIGGER_REASON_FORCED); 7518 mlme_feature_set->roaming_btm_trihgger = 7519 roam_triggers & BIT(ROAM_TRIGGER_REASON_BTM); 7520 7521 wlan_mlme_get_enable_idle_roam(psoc, &is_enable_idle_roam); 7522 mlme_feature_set->roaming_idle_trigger = 7523 (roam_triggers & BIT(ROAM_TRIGGER_REASON_IDLE)) && 7524 is_enable_idle_roam; 7525 7526 mlme_feature_set->roaming_wtc_trigger = 7527 roam_triggers & BIT(ROAM_TRIGGER_REASON_WTC_BTM); 7528 mlme_feature_set->roaming_btcoex_trigger = 7529 roam_triggers & BIT(ROAM_TRIGGER_REASON_BTC); 7530 mlme_feature_set->roaming_btw_wpa_wpa2 = true; 7531 mlme_feature_set->roaming_manage_chan_list_api = true; 7532 7533 wlan_mlme_get_adaptive11r_enabled( 7534 psoc, 7535 &mlme_feature_set->roaming_adaptive_11r); 7536 mlme_feature_set->roaming_ctrl_api_get_set = true; 7537 mlme_feature_set->roaming_ctrl_api_reassoc = true; 7538 mlme_feature_set->roaming_ctrl_get_cu = true; 7539 7540 mlme_feature_set->vendor_req_2_version = 7541 WMI_HOST_VENDOR1_REQ2_VERSION_3_50; 7542 wlan_mlme_set_iface_combinations(mlme_feature_set); 7543 wlan_mlme_get_vht_enable2x2(psoc, &mlme_feature_set->enable2x2); 7544 } 7545 #endif 7546 7547 void wlan_mlme_chan_stats_scan_event_cb(struct wlan_objmgr_vdev *vdev, 7548 struct scan_event *event, void *arg) 7549 { 7550 bool success = false; 7551 7552 if (!util_is_scan_completed(event, &success)) 7553 return; 7554 7555 mlme_send_scan_done_complete_cb(event->vdev_id); 7556 } 7557 7558 static QDF_STATUS 7559 wlan_mlme_update_vdev_chwidth_with_notify(struct wlan_objmgr_psoc *psoc, 7560 struct wlan_objmgr_vdev *vdev, 7561 uint8_t vdev_id, 7562 wmi_host_channel_width ch_width) 7563 { 7564 struct vdev_mlme_obj *vdev_mlme; 7565 struct vdev_set_params param = {0}; 7566 QDF_STATUS status; 7567 7568 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 7569 if (!vdev_mlme) 7570 return QDF_STATUS_E_FAILURE; 7571 7572 param.param_id = wmi_vdev_param_chwidth_with_notify; 7573 param.vdev_id = vdev_id; 7574 param.param_value = ch_width; 7575 status = tgt_vdev_mgr_set_param_send(vdev_mlme, ¶m); 7576 policy_mgr_handle_ml_sta_link_on_traffic_type_change(psoc, vdev); 7577 7578 return status; 7579 } 7580 7581 #ifdef WLAN_FEATURE_11BE 7582 static 7583 void wlan_mlme_set_puncture(struct wlan_channel *des_chan, 7584 uint16_t puncture_bitmap) 7585 { 7586 des_chan->puncture_bitmap = puncture_bitmap; 7587 } 7588 #else 7589 static 7590 void wlan_mlme_set_puncture(struct wlan_channel *des_chan, 7591 uint16_t puncture_bitmap) 7592 { 7593 } 7594 #endif 7595 7596 static QDF_STATUS wlan_mlme_update_ch_width(struct wlan_objmgr_vdev *vdev, 7597 uint8_t vdev_id, 7598 enum phy_ch_width ch_width, 7599 uint16_t puncture_bitmap, 7600 qdf_freq_t sec_2g_freq) 7601 { 7602 struct wlan_channel *des_chan; 7603 struct wlan_channel *bss_chan; 7604 uint16_t curr_op_freq; 7605 struct ch_params ch_params = {0}; 7606 struct wlan_objmgr_pdev *pdev; 7607 QDF_STATUS status; 7608 7609 des_chan = wlan_vdev_mlme_get_des_chan(vdev); 7610 if (!des_chan) 7611 return QDF_STATUS_E_FAILURE; 7612 7613 bss_chan = wlan_vdev_mlme_get_bss_chan(vdev); 7614 if (!bss_chan) 7615 return QDF_STATUS_E_FAILURE; 7616 7617 pdev = wlan_vdev_get_pdev(vdev); 7618 if (!pdev) { 7619 mlme_err("vdev %d: Pdev is NULL", vdev_id); 7620 return QDF_STATUS_E_INVAL; 7621 } 7622 7623 ch_params.ch_width = ch_width; 7624 curr_op_freq = des_chan->ch_freq; 7625 7626 wlan_reg_set_channel_params_for_pwrmode(pdev, curr_op_freq, 7627 sec_2g_freq, &ch_params, 7628 REG_CURRENT_PWR_MODE); 7629 7630 des_chan->ch_width = ch_width; 7631 des_chan->ch_freq_seg1 = ch_params.center_freq_seg0; 7632 des_chan->ch_freq_seg2 = ch_params.center_freq_seg1; 7633 des_chan->ch_cfreq1 = ch_params.mhz_freq_seg0; 7634 des_chan->ch_cfreq2 = ch_params.mhz_freq_seg1; 7635 wlan_mlme_set_puncture(des_chan, puncture_bitmap); 7636 7637 status = wlan_update_peer_phy_mode(des_chan, vdev); 7638 if (QDF_IS_STATUS_ERROR(status)) { 7639 mlme_err("Failed to update phymode"); 7640 return QDF_STATUS_E_INVAL; 7641 } 7642 7643 qdf_mem_copy(bss_chan, des_chan, sizeof(struct wlan_channel)); 7644 7645 mlme_legacy_debug("vdev id %d freq %d seg0 %d seg1 %d ch_width %d mhz seg0 %d mhz seg1 %d", 7646 vdev_id, curr_op_freq, ch_params.center_freq_seg0, 7647 ch_params.center_freq_seg1, ch_params.ch_width, 7648 ch_params.mhz_freq_seg0, ch_params.mhz_freq_seg1); 7649 7650 return QDF_STATUS_SUCCESS; 7651 } 7652 7653 static uint32_t 7654 wlan_mlme_get_vht_rate_flags(enum phy_ch_width ch_width) 7655 { 7656 uint32_t rate_flags = 0; 7657 7658 if (ch_width == CH_WIDTH_80P80MHZ || ch_width == CH_WIDTH_160MHZ) 7659 rate_flags |= TX_RATE_VHT160 | TX_RATE_VHT80 | TX_RATE_VHT40 | 7660 TX_RATE_VHT20; 7661 if (ch_width == CH_WIDTH_80MHZ) 7662 rate_flags |= TX_RATE_VHT80 | TX_RATE_VHT40 | TX_RATE_VHT20; 7663 else if (ch_width) 7664 rate_flags |= TX_RATE_VHT40 | TX_RATE_VHT20; 7665 else 7666 rate_flags |= TX_RATE_VHT20; 7667 return rate_flags; 7668 } 7669 7670 static uint32_t wlan_mlme_get_ht_rate_flags(enum phy_ch_width ch_width) 7671 { 7672 uint32_t rate_flags = 0; 7673 7674 if (ch_width) 7675 rate_flags |= TX_RATE_HT40 | TX_RATE_HT20; 7676 else 7677 rate_flags |= TX_RATE_HT20; 7678 7679 return rate_flags; 7680 } 7681 7682 #ifdef WLAN_FEATURE_11BE 7683 static uint32_t 7684 wlan_mlme_get_eht_rate_flags(enum phy_ch_width ch_width) 7685 { 7686 uint32_t rate_flags = 0; 7687 7688 if (ch_width == CH_WIDTH_320MHZ) 7689 rate_flags |= TX_RATE_EHT320 | TX_RATE_EHT160 | 7690 TX_RATE_EHT80 | TX_RATE_EHT40 | TX_RATE_EHT20; 7691 else if (ch_width == CH_WIDTH_160MHZ || ch_width == CH_WIDTH_80P80MHZ) 7692 rate_flags |= TX_RATE_EHT160 | TX_RATE_EHT80 | TX_RATE_EHT40 | 7693 TX_RATE_EHT20; 7694 else if (ch_width == CH_WIDTH_80MHZ) 7695 rate_flags |= TX_RATE_EHT80 | TX_RATE_EHT40 | TX_RATE_EHT20; 7696 else if (ch_width) 7697 rate_flags |= TX_RATE_EHT40 | TX_RATE_EHT20; 7698 else 7699 rate_flags |= TX_RATE_EHT20; 7700 7701 return rate_flags; 7702 } 7703 7704 static QDF_STATUS 7705 wlan_mlme_set_bss_rate_flags_eht(uint32_t *rate_flags, uint8_t eht_present, 7706 enum phy_ch_width ch_width) 7707 { 7708 if (!eht_present) 7709 return QDF_STATUS_E_NOSUPPORT; 7710 7711 *rate_flags |= wlan_mlme_get_eht_rate_flags(ch_width); 7712 7713 return QDF_STATUS_SUCCESS; 7714 } 7715 #else 7716 static inline QDF_STATUS 7717 wlan_mlme_set_bss_rate_flags_eht(uint32_t *rate_flags, uint8_t eht_present, 7718 enum phy_ch_width ch_width) 7719 { 7720 return QDF_STATUS_E_NOSUPPORT; 7721 } 7722 #endif 7723 7724 #ifdef WLAN_FEATURE_11AX 7725 static uint32_t wlan_mlme_get_he_rate_flags(enum phy_ch_width ch_width) 7726 { 7727 uint32_t rate_flags = 0; 7728 7729 if (ch_width == CH_WIDTH_160MHZ || 7730 ch_width == CH_WIDTH_80P80MHZ) 7731 rate_flags |= TX_RATE_HE160 | TX_RATE_HE80 | TX_RATE_HE40 | 7732 TX_RATE_HE20; 7733 else if (ch_width == CH_WIDTH_80MHZ) 7734 rate_flags |= TX_RATE_HE80 | TX_RATE_HE40 | TX_RATE_HE20; 7735 else if (ch_width) 7736 rate_flags |= TX_RATE_HE40 | TX_RATE_HE20; 7737 else 7738 rate_flags |= TX_RATE_HE20; 7739 7740 return rate_flags; 7741 } 7742 7743 static QDF_STATUS wlan_mlme_set_bss_rate_flags_he(uint32_t *rate_flags, 7744 uint8_t he_present, 7745 enum phy_ch_width ch_width) 7746 { 7747 if (!he_present) 7748 return QDF_STATUS_E_NOSUPPORT; 7749 7750 *rate_flags |= wlan_mlme_get_he_rate_flags(ch_width); 7751 7752 return QDF_STATUS_SUCCESS; 7753 } 7754 7755 #else 7756 static inline QDF_STATUS 7757 wlan_mlme_set_bss_rate_flags_he(uint32_t *rate_flags, 7758 uint8_t he_present, 7759 enum phy_ch_width ch_width) 7760 { 7761 return QDF_STATUS_E_NOSUPPORT; 7762 } 7763 #endif 7764 7765 static QDF_STATUS 7766 wlan_mlme_cp_stats_set_rate_flags(struct wlan_objmgr_vdev *vdev, 7767 uint32_t flags) 7768 { 7769 struct vdev_mc_cp_stats *vdev_mc_stats; 7770 struct vdev_cp_stats *vdev_cp_stats_priv; 7771 7772 vdev_cp_stats_priv = wlan_cp_stats_get_vdev_stats_obj(vdev); 7773 if (!vdev_cp_stats_priv) { 7774 cp_stats_err("vdev cp stats object is null"); 7775 return QDF_STATUS_E_NULL_VALUE; 7776 } 7777 7778 wlan_cp_stats_vdev_obj_lock(vdev_cp_stats_priv); 7779 vdev_mc_stats = vdev_cp_stats_priv->vdev_stats; 7780 vdev_mc_stats->tx_rate_flags = flags; 7781 wlan_cp_stats_vdev_obj_unlock(vdev_cp_stats_priv); 7782 7783 return QDF_STATUS_SUCCESS; 7784 } 7785 7786 QDF_STATUS 7787 wlan_mlme_update_bss_rate_flags(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, 7788 enum phy_ch_width cw, uint8_t eht_present, 7789 uint8_t he_present, uint8_t vht_present, 7790 uint8_t ht_present) 7791 { 7792 uint32_t *rate_flags; 7793 struct vdev_mlme_obj *vdev_mlme; 7794 struct wlan_objmgr_vdev *vdev; 7795 QDF_STATUS status; 7796 7797 if (!eht_present && !he_present && !vht_present && !ht_present) 7798 return QDF_STATUS_E_INVAL; 7799 7800 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, 7801 WLAN_HDD_ID_OBJ_MGR); 7802 if (!vdev) { 7803 mlme_debug("vdev: %d vdev not found", vdev_id); 7804 return QDF_STATUS_E_INVAL; 7805 } 7806 7807 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 7808 if (!vdev_mlme) { 7809 mlme_debug("vdev: %d mlme obj not found", vdev_id); 7810 wlan_objmgr_vdev_release_ref(vdev, WLAN_HDD_ID_OBJ_MGR); 7811 return QDF_STATUS_E_INVAL; 7812 } 7813 7814 rate_flags = &vdev_mlme->mgmt.rate_info.rate_flags; 7815 *rate_flags = 0; 7816 7817 status = wlan_mlme_set_bss_rate_flags_eht(rate_flags, eht_present, cw); 7818 if (QDF_IS_STATUS_ERROR(status)) { 7819 status = wlan_mlme_set_bss_rate_flags_he(rate_flags, 7820 he_present, cw); 7821 if (QDF_IS_STATUS_ERROR(status)) { 7822 if (vht_present) 7823 *rate_flags = wlan_mlme_get_vht_rate_flags(cw); 7824 else if (ht_present) 7825 *rate_flags |= wlan_mlme_get_ht_rate_flags(cw); 7826 } 7827 } 7828 7829 mlme_debug("vdev:%d, eht:%u, he:%u, vht:%u, ht:%u, flag:%x, cw:%d", 7830 vdev_id, eht_present, he_present, vht_present, ht_present, 7831 *rate_flags, cw); 7832 7833 status = wlan_mlme_cp_stats_set_rate_flags(vdev, *rate_flags); 7834 7835 wlan_objmgr_vdev_release_ref(vdev, WLAN_HDD_ID_OBJ_MGR); 7836 return status; 7837 } 7838 7839 QDF_STATUS 7840 wlan_mlme_send_ch_width_update_with_notify(struct wlan_objmgr_psoc *psoc, 7841 struct wlan_objmgr_vdev *vdev, 7842 uint8_t vdev_id, 7843 enum phy_ch_width ch_width) 7844 { 7845 QDF_STATUS status; 7846 wmi_host_channel_width wmi_chan_width; 7847 enum phy_ch_width associated_ch_width; 7848 struct wlan_channel *des_chan; 7849 struct mlme_legacy_priv *mlme_priv; 7850 qdf_freq_t sec_2g_freq = 0; 7851 7852 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 7853 if (!mlme_priv) 7854 return QDF_STATUS_E_INVAL; 7855 7856 des_chan = wlan_vdev_mlme_get_des_chan(vdev); 7857 if (!des_chan) 7858 return QDF_STATUS_E_INVAL; 7859 7860 associated_ch_width = 7861 mlme_priv->connect_info.assoc_chan_info.assoc_ch_width; 7862 if (associated_ch_width == CH_WIDTH_INVALID || 7863 ch_width > associated_ch_width) { 7864 mlme_debug("vdev %d: Invalid new chwidth:%d, assoc ch_width:%d", 7865 vdev_id, ch_width, associated_ch_width); 7866 return QDF_STATUS_E_INVAL; 7867 } 7868 7869 if (wlan_reg_is_24ghz_ch_freq(des_chan->ch_freq)) { 7870 if (ch_width == CH_WIDTH_40MHZ && 7871 mlme_priv->connect_info.assoc_chan_info.sec_2g_freq) { 7872 sec_2g_freq = 7873 mlme_priv->connect_info.assoc_chan_info.sec_2g_freq; 7874 } else if (ch_width != CH_WIDTH_20MHZ) { 7875 mlme_debug("vdev %d: CW:%d update not supported for freq:%d sec_2g_freq %d", 7876 vdev_id, ch_width, des_chan->ch_freq, 7877 mlme_priv->connect_info.assoc_chan_info.sec_2g_freq); 7878 return QDF_STATUS_E_NOSUPPORT; 7879 } 7880 } 7881 7882 /* update ch width to internal host structure */ 7883 status = wlan_mlme_update_ch_width(vdev, vdev_id, ch_width, 0, 7884 sec_2g_freq); 7885 if (QDF_IS_STATUS_ERROR(status)) { 7886 mlme_err("vdev %d: Failed to update CW:%d to host, status:%d", 7887 vdev_id, ch_width, status); 7888 return status; 7889 } 7890 7891 wmi_chan_width = target_if_phy_ch_width_to_wmi_chan_width(ch_width); 7892 7893 /* update ch width to fw */ 7894 status = wlan_mlme_update_vdev_chwidth_with_notify(psoc, vdev, vdev_id, 7895 wmi_chan_width); 7896 if (QDF_IS_STATUS_ERROR(status)) 7897 mlme_err("vdev %d: Failed to update CW:%d to fw, status:%d", 7898 vdev_id, ch_width, status); 7899 7900 return status; 7901 } 7902 7903 enum phy_ch_width 7904 wlan_mlme_convert_vht_op_bw_to_phy_ch_width(uint8_t channel_width, 7905 uint8_t chan_id, 7906 uint8_t ccfs0, 7907 uint8_t ccfs1) 7908 { 7909 /** channel_width in vht op from 802.11-2020 7910 * Set to 0 for 20 MHz or 40 MHz BSS bandwidth. 7911 * Set to 1 for 80 MHz, 160 MHz or 80+80 MHz BSS 7912 * bandwidth. 7913 * Set to 2 for 160 MHz BSS bandwidth (deprecated). 7914 * Set to 3 for noncontiguous 80+80 MHz BSS 7915 * bandwidth (deprecated). 7916 * Values in the range 4 to 255 are reserved 7917 * 7918 * 80+80 not supported by MCC platform, so downgrade to 80 7919 */ 7920 enum phy_ch_width phy_bw = CH_WIDTH_20MHZ; 7921 7922 if (channel_width == WLAN_VHTOP_CHWIDTH_2040) { 7923 phy_bw = CH_WIDTH_20MHZ; 7924 if (abs(ccfs0 - chan_id) == 2) 7925 phy_bw = CH_WIDTH_40MHZ; 7926 } else if (channel_width == WLAN_VHTOP_CHWIDTH_80) { 7927 if (ccfs1 && (abs(ccfs1 - ccfs0) == 8)) 7928 phy_bw = CH_WIDTH_160MHZ; 7929 else 7930 phy_bw = CH_WIDTH_80MHZ; 7931 } else if (channel_width == WLAN_VHTOP_CHWIDTH_160) { 7932 phy_bw = CH_WIDTH_160MHZ; 7933 } else if (channel_width == WLAN_VHTOP_CHWIDTH_80_80) { 7934 phy_bw = WLAN_VHTOP_CHWIDTH_80; 7935 } 7936 7937 return phy_bw; 7938 } 7939 7940 enum phy_ch_width 7941 wlan_mlme_convert_he_6ghz_op_bw_to_phy_ch_width(uint8_t channel_width, 7942 uint8_t chan_id, 7943 uint8_t ccfs0, 7944 uint8_t ccfs1) 7945 { 7946 enum phy_ch_width phy_bw = CH_WIDTH_20MHZ; 7947 7948 if (channel_width == WLAN_HE_6GHZ_CHWIDTH_20) { 7949 phy_bw = CH_WIDTH_20MHZ; 7950 } else if (channel_width == WLAN_HE_6GHZ_CHWIDTH_40) { 7951 phy_bw = CH_WIDTH_40MHZ; 7952 } else if (channel_width == WLAN_HE_6GHZ_CHWIDTH_80) { 7953 phy_bw = CH_WIDTH_80MHZ; 7954 } else if (channel_width == WLAN_HE_6GHZ_CHWIDTH_160_80_80) { 7955 phy_bw = CH_WIDTH_160MHZ; 7956 /* 80+80 not supported */ 7957 if (ccfs1 && abs(ccfs0 - ccfs1) > 8) 7958 phy_bw = CH_WIDTH_80MHZ; 7959 } 7960 7961 return phy_bw; 7962 } 7963 7964 void 7965 wlan_mlme_set_edca_pifs_param(struct wlan_edca_pifs_param_ie *ep, 7966 enum host_edca_param_type type) 7967 { 7968 ep->edca_param_type = type; 7969 7970 if (type == HOST_EDCA_PARAM_TYPE_AGGRESSIVE) { 7971 ep->edca_pifs_param.eparam.acvo_aifsn = CFG_EDCA_PARAM_AIFSN; 7972 ep->edca_pifs_param.eparam.acvo_acm = CFG_EDCA_PARAM_ACM; 7973 ep->edca_pifs_param.eparam.acvo_aci = CFG_EDCA_PARAM_ACI; 7974 ep->edca_pifs_param.eparam.acvo_cwmin = CFG_EDCA_PARAM_CWMIN; 7975 ep->edca_pifs_param.eparam.acvo_cwmax = CFG_EDCA_PARAM_CWMAX; 7976 ep->edca_pifs_param.eparam.acvo_txoplimit = CFG_EDCA_PARAM_TXOP; 7977 } else if (type == HOST_EDCA_PARAM_TYPE_PIFS) { 7978 ep->edca_pifs_param.pparam.sap_pifs_offset = 7979 CFG_PIFS_PARAM_SAP_OFFSET; 7980 ep->edca_pifs_param.pparam.leb_pifs_offset = 7981 CFG_PIFS_PARAM_LEB_OFFSET; 7982 ep->edca_pifs_param.pparam.reb_pifs_offset = 7983 CFG_PIFS_PARAM_REB_OFFSET; 7984 } 7985 } 7986 7987 QDF_STATUS 7988 wlan_mlme_stats_get_periodic_display_time(struct wlan_objmgr_psoc *psoc, 7989 uint32_t *periodic_display_time) 7990 { 7991 struct wlan_mlme_psoc_ext_obj *mlme_obj; 7992 7993 mlme_obj = mlme_get_psoc_ext_obj(psoc); 7994 if (!mlme_obj) { 7995 *periodic_display_time = 7996 cfg_default(CFG_PERIODIC_STATS_DISPLAY_TIME); 7997 return QDF_STATUS_E_INVAL; 7998 } 7999 8000 *periodic_display_time = 8001 mlme_obj->cfg.stats.stats_periodic_display_time; 8002 8003 return QDF_STATUS_SUCCESS; 8004 } 8005 8006 bool 8007 wlan_mlme_is_bcn_prot_disabled_for_sap(struct wlan_objmgr_psoc *psoc) 8008 { 8009 struct wlan_mlme_psoc_ext_obj *mlme_obj; 8010 8011 mlme_obj = mlme_get_psoc_ext_obj(psoc); 8012 if (!mlme_obj) 8013 return cfg_default(CFG_DISABLE_SAP_BCN_PROT); 8014 8015 return mlme_obj->cfg.sap_cfg.disable_bcn_prot; 8016 } 8017 8018 uint8_t *wlan_mlme_get_src_addr_from_frame(struct element_info *frame) 8019 { 8020 struct wlan_frame_hdr *hdr; 8021 8022 if (!frame || !frame->len || frame->len < WLAN_MAC_HDR_LEN_3A) 8023 return NULL; 8024 8025 hdr = (struct wlan_frame_hdr *)frame->ptr; 8026 8027 return hdr->i_addr2; 8028 } 8029 8030 bool 8031 wlan_mlme_get_sap_ps_with_twt(struct wlan_objmgr_psoc *psoc) 8032 { 8033 struct wlan_mlme_psoc_ext_obj *mlme_obj; 8034 8035 mlme_obj = mlme_get_psoc_ext_obj(psoc); 8036 if (!mlme_obj) 8037 return cfg_default(CFG_SAP_PS_WITH_TWT); 8038 8039 return mlme_obj->cfg.sap_cfg.sap_ps_with_twt_enable; 8040 } 8041 8042 /** 8043 * set_omi_ch_width() - set OMI ch_bw/eht_ch_bw_ext bit value from channel width 8044 * @ch_width: channel width 8045 * @omi_data: Pointer to omi_data object 8046 * 8047 * If the channel width is 20Mhz, 40Mhz, 80Mhz, 160Mhz and 80+80Mhz ch_bw set 8048 * to 0, 1, 2, 3 accordingly, if channel width is 320Mhz then eht_ch_bw_ext 8049 * set to 1 8050 * 8051 * Return: QDF_STATUS_SUCCESS on success or QDF_STATUS_E_INVAL on failure 8052 */ 8053 static QDF_STATUS 8054 set_omi_ch_width(enum phy_ch_width ch_width, struct omi_ctrl_tx *omi_data) 8055 { 8056 switch (ch_width) { 8057 case CH_WIDTH_20MHZ: 8058 omi_data->ch_bw = 0; 8059 break; 8060 case CH_WIDTH_40MHZ: 8061 omi_data->ch_bw = 1; 8062 break; 8063 case CH_WIDTH_80MHZ: 8064 omi_data->ch_bw = 2; 8065 break; 8066 case CH_WIDTH_160MHZ: 8067 case CH_WIDTH_80P80MHZ: 8068 omi_data->ch_bw = 3; 8069 break; 8070 case CH_WIDTH_320MHZ: 8071 omi_data->eht_ch_bw_ext = 1; 8072 break; 8073 default: 8074 return QDF_STATUS_E_INVAL; 8075 } 8076 8077 return QDF_STATUS_SUCCESS; 8078 } 8079 8080 QDF_STATUS 8081 wlan_mlme_set_ul_mu_config(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, 8082 uint8_t ulmu_disable) 8083 { 8084 struct omi_ctrl_tx omi_data = {0}; 8085 uint32_t param_val = 0; 8086 struct wlan_objmgr_pdev *pdev; 8087 struct wlan_objmgr_vdev *vdev; 8088 enum phy_ch_width ch_width; 8089 uint8_t rx_nss, tx_nsts; 8090 struct qdf_mac_addr macaddr = {0}; 8091 enum wlan_phymode peer_phymode; 8092 qdf_freq_t op_chan_freq; 8093 qdf_freq_t freq_seg_0; 8094 QDF_STATUS status = QDF_STATUS_SUCCESS; 8095 8096 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, 8097 WLAN_MLME_OBJMGR_ID); 8098 if (!vdev) { 8099 mlme_err("vdev %d: vdev is NULL", vdev_id); 8100 return QDF_STATUS_E_INVAL; 8101 } 8102 8103 pdev = wlan_vdev_get_pdev(vdev); 8104 if (!pdev) { 8105 mlme_err("pdev is NULL"); 8106 status = QDF_STATUS_E_INVAL; 8107 goto err; 8108 } 8109 8110 if (!cm_is_vdevid_connected(pdev, vdev_id)) { 8111 mlme_err("STA is not connected, Session_id: %d", vdev_id); 8112 status = QDF_STATUS_E_INVAL; 8113 goto err; 8114 } 8115 8116 status = wlan_vdev_get_bss_peer_mac(vdev, &macaddr); 8117 if (QDF_STATUS_SUCCESS != status) { 8118 mlme_err("Failed to get bss peer mac, Err : %d", status); 8119 goto err; 8120 } 8121 8122 status = mlme_get_peer_phymode(psoc, macaddr.bytes, &peer_phymode); 8123 if (QDF_STATUS_SUCCESS != status) { 8124 mlme_err("Failed to get peer phymode, Err : %d", status); 8125 goto err; 8126 } 8127 8128 if (!(IS_WLAN_PHYMODE_HE(peer_phymode) || 8129 IS_WLAN_PHYMODE_EHT(peer_phymode))) { 8130 mlme_err("Invalid mode"); 8131 status = QDF_STATUS_E_INVAL; 8132 goto err; 8133 } 8134 8135 status = wlan_mlme_get_sta_rx_nss(psoc, vdev, &rx_nss); 8136 if (QDF_STATUS_SUCCESS != status) { 8137 mlme_err("Failed to get sta_rx_nss, Err : %d", status); 8138 goto err; 8139 } 8140 8141 status = wlan_mlme_get_sta_tx_nss(psoc, vdev, &tx_nsts); 8142 if (QDF_STATUS_SUCCESS != status) { 8143 mlme_err("Failed to get sta_tx_nss, Err : %d", status); 8144 goto err; 8145 } 8146 8147 status = wlan_get_op_chan_freq_info_vdev_id(pdev, vdev_id, 8148 &op_chan_freq, 8149 &freq_seg_0, &ch_width); 8150 if (QDF_STATUS_SUCCESS != status) { 8151 mlme_err("Failed to get bw, Err : %d", status); 8152 goto err; 8153 } 8154 8155 omi_data.omi_in_vht = 0x1; 8156 omi_data.omi_in_he = 0x1; 8157 omi_data.a_ctrl_id = 0x1; 8158 8159 status = set_omi_ch_width(ch_width, &omi_data); 8160 if (QDF_STATUS_SUCCESS != status) { 8161 mlme_err("Failed to set bw, Err : %d", status); 8162 goto err; 8163 } 8164 8165 omi_data.rx_nss = rx_nss - 1; 8166 omi_data.tx_nsts = tx_nsts - 1; 8167 omi_data.ul_mu_dis = ulmu_disable; 8168 omi_data.ul_mu_data_dis = 0; 8169 8170 qdf_mem_copy(¶m_val, &omi_data, sizeof(omi_data)); 8171 8172 mlme_debug("OMI: BW %d TxNSTS %d RxNSS %d ULMU %d OMI_VHT %d OMI_HE %d, EHT OMI: BW %d RxNSS %d TxNSS %d, param val: %08X, bssid:" QDF_MAC_ADDR_FMT, 8173 omi_data.ch_bw, omi_data.tx_nsts, omi_data.rx_nss, 8174 omi_data.ul_mu_dis, omi_data.omi_in_vht, omi_data.omi_in_he, 8175 omi_data.eht_ch_bw_ext, omi_data.eht_rx_nss_ext, 8176 omi_data.eht_tx_nss_ext, param_val, 8177 QDF_MAC_ADDR_REF(macaddr.bytes)); 8178 8179 status = wlan_util_vdev_peer_set_param_send(vdev, macaddr.bytes, 8180 WMI_PEER_PARAM_XMIT_OMI, 8181 param_val); 8182 if (QDF_STATUS_SUCCESS != status) 8183 mlme_err("set_peer_param_cmd returned %d", status); 8184 8185 err: 8186 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID); 8187 return status; 8188 } 8189 8190 uint32_t 8191 wlan_mlme_assemble_rate_code(uint8_t preamble, uint8_t nss, uint8_t rate) 8192 { 8193 uint32_t set_value; 8194 8195 if (wma_get_fw_wlan_feat_caps(DOT11AX)) 8196 set_value = ASSEMBLE_RATECODE_V1(preamble, nss, rate); 8197 else 8198 set_value = (preamble << 6) | (nss << 4) | rate; 8199 8200 return set_value; 8201 } 8202 8203 QDF_STATUS 8204 wlan_mlme_set_ap_oper_ch_width(struct wlan_objmgr_vdev *vdev, 8205 enum phy_ch_width ch_width) 8206 8207 { 8208 struct mlme_legacy_priv *mlme_priv; 8209 8210 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 8211 if (!mlme_priv) { 8212 mlme_legacy_err("vdev %d legacy private object is NULL", 8213 wlan_vdev_get_id(vdev)); 8214 return QDF_STATUS_E_FAILURE; 8215 } 8216 8217 mlme_priv->mlme_ap.oper_ch_width = ch_width; 8218 mlme_debug("SAP oper ch_width: %d, vdev %d", 8219 mlme_priv->mlme_ap.oper_ch_width, wlan_vdev_get_id(vdev)); 8220 8221 return QDF_STATUS_SUCCESS; 8222 } 8223 8224 enum phy_ch_width 8225 wlan_mlme_get_ap_oper_ch_width(struct wlan_objmgr_vdev *vdev) 8226 { 8227 struct mlme_legacy_priv *mlme_priv; 8228 8229 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 8230 if (!mlme_priv) { 8231 mlme_legacy_err("vdev %d legacy private object is NULL", 8232 wlan_vdev_get_id(vdev)); 8233 return CH_WIDTH_INVALID; 8234 } 8235 8236 return mlme_priv->mlme_ap.oper_ch_width; 8237 } 8238 8239 QDF_STATUS 8240 wlan_mlme_send_csa_event_status_ind(struct wlan_objmgr_vdev *vdev, 8241 uint8_t csa_status) 8242 { 8243 return wlan_mlme_send_csa_event_status_ind_cmd(vdev, csa_status); 8244 } 8245 8246 #ifdef WLAN_FEATURE_11BE 8247 QDF_STATUS 8248 wlan_mlme_get_bw_no_punct(struct wlan_objmgr_psoc *psoc, 8249 struct wlan_objmgr_vdev *vdev, 8250 struct wlan_channel *bss_chan, 8251 enum phy_ch_width *new_ch_width) 8252 { 8253 uint16_t new_punct_bitmap = 0; 8254 enum phy_ch_width ch_width; 8255 QDF_STATUS status = QDF_STATUS_E_FAILURE; 8256 uint8_t country[REG_ALPHA2_LEN + 1]; 8257 8258 if (!wlan_mlme_get_eht_disable_punct_in_us_lpi(psoc)) 8259 return status; 8260 8261 wlan_reg_read_current_country(psoc, country); 8262 8263 if (!wlan_reg_is_6ghz_chan_freq(bss_chan->ch_freq) || 8264 !bss_chan->puncture_bitmap || 8265 qdf_mem_cmp(country, "US", REG_ALPHA2_LEN) || 8266 mlme_get_best_6g_power_type(vdev) != REG_INDOOR_AP || 8267 !IS_WLAN_PHYMODE_EHT(bss_chan->ch_phymode)) 8268 goto err; 8269 8270 ch_width = bss_chan->ch_width; 8271 8272 while (ch_width != CH_WIDTH_INVALID) { 8273 status = wlan_reg_extract_puncture_by_bw(bss_chan->ch_width, 8274 bss_chan->puncture_bitmap, 8275 bss_chan->ch_freq, 8276 bss_chan->ch_cfreq2, 8277 ch_width, 8278 &new_punct_bitmap); 8279 if (QDF_IS_STATUS_SUCCESS(status) && new_punct_bitmap) 8280 ch_width = wlan_get_next_lower_bandwidth(ch_width); 8281 else 8282 break; 8283 } 8284 8285 if (ch_width == bss_chan->ch_width) 8286 return QDF_STATUS_E_FAILURE; 8287 8288 mlme_debug("freq %d ccfs2 %d punct 0x%x BW old %d, new %d", 8289 bss_chan->ch_freq, bss_chan->ch_cfreq2, bss_chan->puncture_bitmap, 8290 bss_chan->ch_width, ch_width); 8291 8292 *new_ch_width = ch_width; 8293 bss_chan->puncture_bitmap = 0; 8294 err: 8295 return status; 8296 } 8297 8298 QDF_STATUS 8299 wlan_mlme_update_bw_no_punct(struct wlan_objmgr_psoc *psoc, 8300 uint8_t vdev_id) 8301 { 8302 struct wlan_objmgr_vdev *vdev; 8303 QDF_STATUS status = QDF_STATUS_E_FAILURE; 8304 enum phy_ch_width new_ch_width; 8305 struct wlan_objmgr_pdev *pdev; 8306 8307 if (!wlan_mlme_get_eht_disable_punct_in_us_lpi(psoc)) 8308 return status; 8309 8310 pdev = wlan_objmgr_get_pdev_by_id(psoc, 0, 8311 WLAN_MLME_NB_ID); 8312 if (!pdev) { 8313 sme_err("pdev is NULL"); 8314 return QDF_STATUS_E_FAILURE; 8315 } 8316 vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id, 8317 WLAN_MLME_NB_ID); 8318 if (!vdev) { 8319 mlme_err("VDEV not found for vdev id : %d", vdev_id); 8320 goto rel_pdev; 8321 } 8322 8323 status = wlan_mlme_get_bw_no_punct(psoc, vdev, 8324 wlan_vdev_mlme_get_des_chan(vdev), 8325 &new_ch_width); 8326 if (QDF_IS_STATUS_ERROR(status)) 8327 goto rel_vdev; 8328 8329 status = wlan_mlme_send_ch_width_update_with_notify(psoc, 8330 vdev, 8331 vdev_id, 8332 new_ch_width); 8333 rel_vdev: 8334 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID); 8335 rel_pdev: 8336 wlan_objmgr_pdev_release_ref(pdev, WLAN_MLME_NB_ID); 8337 8338 return status; 8339 } 8340 #endif 8341