1 /* 2 * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved. 3 * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for 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_usr_disable_sta_eht(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 true; 1406 1407 return mlme_obj->cfg.sta.usr_disable_eht; 1408 } 1409 1410 void wlan_mlme_set_usr_disable_sta_eht(struct wlan_objmgr_psoc *psoc, 1411 bool disable) 1412 { 1413 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 1414 1415 if (!mlme_obj) 1416 return; 1417 1418 mlme_debug("set usr_disable_eht from %d to %d", 1419 mlme_obj->cfg.sta.usr_disable_eht, disable); 1420 mlme_obj->cfg.sta.usr_disable_eht = disable; 1421 } 1422 1423 enum phy_ch_width wlan_mlme_get_max_bw(void) 1424 { 1425 uint32_t max_bw = wma_get_eht_ch_width(); 1426 1427 if (max_bw == WNI_CFG_EHT_CHANNEL_WIDTH_320MHZ) 1428 return CH_WIDTH_320MHZ; 1429 else if (max_bw == WNI_CFG_VHT_CHANNEL_WIDTH_160MHZ) 1430 return CH_WIDTH_160MHZ; 1431 else if (max_bw == WNI_CFG_VHT_CHANNEL_WIDTH_80_PLUS_80MHZ) 1432 return CH_WIDTH_80P80MHZ; 1433 else if (max_bw == WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ) 1434 return CH_WIDTH_80MHZ; 1435 else 1436 return CH_WIDTH_40MHZ; 1437 } 1438 #else 1439 enum phy_ch_width wlan_mlme_get_max_bw(void) 1440 { 1441 uint32_t max_bw = wma_get_vht_ch_width(); 1442 1443 if (max_bw == WNI_CFG_VHT_CHANNEL_WIDTH_160MHZ) 1444 return CH_WIDTH_160MHZ; 1445 else if (max_bw == WNI_CFG_VHT_CHANNEL_WIDTH_80_PLUS_80MHZ) 1446 return CH_WIDTH_80P80MHZ; 1447 else if (max_bw == WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ) 1448 return CH_WIDTH_80MHZ; 1449 else 1450 return CH_WIDTH_40MHZ; 1451 } 1452 #endif 1453 1454 QDF_STATUS wlan_mlme_get_sta_ch_width(struct wlan_objmgr_vdev *vdev, 1455 enum phy_ch_width *ch_width) 1456 { 1457 QDF_STATUS status = QDF_STATUS_E_INVAL; 1458 struct wlan_objmgr_peer *peer; 1459 enum wlan_phymode phymode; 1460 enum QDF_OPMODE op_mode; 1461 1462 peer = wlan_vdev_get_bsspeer(vdev); 1463 op_mode = wlan_vdev_mlme_get_opmode(vdev); 1464 1465 if (ch_width && peer && 1466 (op_mode == QDF_STA_MODE || 1467 op_mode == QDF_P2P_CLIENT_MODE)) { 1468 wlan_peer_obj_lock(peer); 1469 phymode = wlan_peer_get_phymode(peer); 1470 wlan_peer_obj_unlock(peer); 1471 *ch_width = wlan_mlme_get_ch_width_from_phymode(phymode); 1472 } 1473 1474 return status; 1475 } 1476 1477 void 1478 wlan_mlme_set_bt_profile_con(struct wlan_objmgr_psoc *psoc, 1479 bool bt_profile_con) 1480 { 1481 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1482 1483 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1484 if (!mlme_obj) 1485 return; 1486 1487 mlme_obj->cfg.gen.bt_profile_con = bt_profile_con; 1488 } 1489 1490 bool 1491 wlan_mlme_get_bt_profile_con(struct wlan_objmgr_psoc *psoc) 1492 { 1493 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1494 1495 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1496 if (!mlme_obj) 1497 return false; 1498 1499 return mlme_obj->cfg.gen.bt_profile_con; 1500 } 1501 1502 #ifdef WLAN_FEATURE_11BE_MLO 1503 uint8_t wlan_mlme_get_sta_mlo_simultaneous_links(struct wlan_objmgr_psoc *psoc) 1504 { 1505 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1506 1507 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1508 if (!mlme_obj) 1509 return 0; 1510 1511 return mlme_obj->cfg.sta.mlo_max_simultaneous_links; 1512 } 1513 1514 QDF_STATUS 1515 wlan_mlme_set_sta_mlo_simultaneous_links(struct wlan_objmgr_psoc *psoc, 1516 uint8_t value) 1517 { 1518 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1519 1520 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1521 if (!mlme_obj) 1522 return QDF_STATUS_E_FAILURE; 1523 1524 mlme_obj->cfg.sta.mlo_max_simultaneous_links = value; 1525 mlme_legacy_debug("mlo_max_simultaneous_links %d", value); 1526 1527 return QDF_STATUS_SUCCESS; 1528 } 1529 1530 uint8_t wlan_mlme_get_sta_mlo_conn_max_num(struct wlan_objmgr_psoc *psoc) 1531 { 1532 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1533 1534 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1535 if (!mlme_obj) 1536 return 0; 1537 1538 return mlme_obj->cfg.sta.mlo_support_link_num; 1539 } 1540 1541 QDF_STATUS wlan_mlme_set_sta_mlo_conn_max_num(struct wlan_objmgr_psoc *psoc, 1542 uint8_t value) 1543 { 1544 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1545 1546 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1547 if (!mlme_obj) 1548 return QDF_STATUS_E_FAILURE; 1549 1550 if (!value) 1551 mlme_obj->cfg.sta.mlo_support_link_num = 1552 cfg_default(CFG_MLO_SUPPORT_LINK_NUM); 1553 else 1554 mlme_obj->cfg.sta.mlo_support_link_num = value; 1555 1556 mlme_legacy_debug("mlo_support_link_num %d", value); 1557 1558 return QDF_STATUS_SUCCESS; 1559 } 1560 1561 QDF_STATUS wlan_mlme_set_user_set_link_num(struct wlan_objmgr_psoc *psoc, 1562 uint8_t value) 1563 { 1564 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1565 1566 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1567 if (!mlme_obj) 1568 return QDF_STATUS_E_FAILURE; 1569 1570 mlme_obj->cfg.sta.user_set_link_num = value; 1571 mlme_legacy_debug("user_set_link_num %d", value); 1572 1573 return QDF_STATUS_SUCCESS; 1574 } 1575 1576 void wlan_mlme_set_ml_link_control_mode(struct wlan_objmgr_psoc *psoc, 1577 uint8_t vdev_id, uint8_t value) 1578 { 1579 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1580 struct wlan_objmgr_vdev *vdev; 1581 1582 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1583 if (!mlme_obj) 1584 return; 1585 1586 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, 1587 WLAN_MLME_SB_ID); 1588 if (!vdev) 1589 return; 1590 1591 if (!wlan_vdev_mlme_is_mlo_vdev(vdev)) { 1592 mlme_legacy_debug("not mlo vdev"); 1593 goto release_ref; 1594 } 1595 1596 if (!vdev->mlo_dev_ctx || !vdev->mlo_dev_ctx->sta_ctx) { 1597 mlme_legacy_debug("mlo dev/sta ctx is null"); 1598 goto release_ref; 1599 } 1600 1601 vdev->mlo_dev_ctx->sta_ctx->ml_link_control_mode = value; 1602 mlme_legacy_debug("set ml_link_control_mode %d", value); 1603 1604 release_ref: 1605 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_SB_ID); 1606 return; 1607 } 1608 1609 uint8_t wlan_mlme_get_ml_link_control_mode(struct wlan_objmgr_psoc *psoc, 1610 uint8_t vdev_id) 1611 { 1612 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1613 struct wlan_objmgr_vdev *vdev; 1614 uint8_t value = 0; 1615 1616 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1617 if (!mlme_obj) 1618 return 0; 1619 1620 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, 1621 WLAN_MLME_SB_ID); 1622 if (!vdev) 1623 return 0; 1624 1625 if (!wlan_vdev_mlme_is_mlo_vdev(vdev)) { 1626 mlme_legacy_debug("not mlo vdev"); 1627 goto release_ref; 1628 } 1629 1630 if (!vdev->mlo_dev_ctx || !vdev->mlo_dev_ctx->sta_ctx) { 1631 mlme_legacy_debug("mlo dev/sta ctx is null"); 1632 goto release_ref; 1633 } 1634 1635 value = vdev->mlo_dev_ctx->sta_ctx->ml_link_control_mode; 1636 mlme_legacy_debug("get ml_link_control_mode %d", value); 1637 release_ref: 1638 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_SB_ID); 1639 return value; 1640 } 1641 1642 void wlan_mlme_restore_user_set_link_num(struct wlan_objmgr_psoc *psoc) 1643 { 1644 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1645 1646 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1647 if (!mlme_obj) 1648 return; 1649 1650 if (!mlme_obj->cfg.sta.user_set_link_num) 1651 return; 1652 1653 mlme_obj->cfg.sta.mlo_support_link_num = 1654 mlme_obj->cfg.sta.user_set_link_num; 1655 mlme_legacy_debug("restore mlo_support_link_num %d", 1656 mlme_obj->cfg.sta.user_set_link_num); 1657 } 1658 1659 void wlan_mlme_clear_user_set_link_num(struct wlan_objmgr_psoc *psoc) 1660 { 1661 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1662 1663 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1664 if (!mlme_obj) 1665 return; 1666 1667 mlme_obj->cfg.sta.user_set_link_num = 0; 1668 } 1669 1670 uint8_t wlan_mlme_get_sta_mlo_conn_band_bmp(struct wlan_objmgr_psoc *psoc) 1671 { 1672 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1673 1674 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1675 if (!mlme_obj) 1676 return 0; 1677 1678 return mlme_obj->cfg.sta.mlo_support_link_band; 1679 } 1680 1681 QDF_STATUS wlan_mlme_set_sta_mlo_conn_band_bmp(struct wlan_objmgr_psoc *psoc, 1682 uint8_t value) 1683 { 1684 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1685 1686 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1687 if (!mlme_obj) 1688 return QDF_STATUS_E_FAILURE; 1689 1690 mlme_obj->cfg.sta.mlo_support_link_band = value; 1691 mlme_legacy_debug("mlo_support_link_conn band %d", value); 1692 1693 return QDF_STATUS_SUCCESS; 1694 } 1695 1696 void 1697 wlan_mlme_get_mlo_prefer_percentage(struct wlan_objmgr_psoc *psoc, 1698 int8_t *mlo_prefer_percentage) 1699 { 1700 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1701 1702 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1703 if (!mlme_obj) { 1704 mlme_legacy_err("invalid mlo object"); 1705 return; 1706 } 1707 1708 *mlo_prefer_percentage = mlme_obj->cfg.sta.mlo_prefer_percentage; 1709 mlme_legacy_debug("mlo_prefer_percentage %d", *mlo_prefer_percentage); 1710 } 1711 1712 bool wlan_mlme_get_sta_same_link_mld_addr(struct wlan_objmgr_psoc *psoc) 1713 { 1714 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1715 1716 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1717 if (!mlme_obj) 1718 return false; 1719 1720 return mlme_obj->cfg.sta.mlo_same_link_mld_address; 1721 } 1722 #endif 1723 1724 QDF_STATUS wlan_mlme_get_num_11b_tx_chains(struct wlan_objmgr_psoc *psoc, 1725 uint16_t *value) 1726 { 1727 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 1728 1729 if (!mlme_obj) 1730 return QDF_STATUS_E_FAILURE; 1731 1732 *value = mlme_obj->cfg.chainmask_cfg.num_11b_tx_chains; 1733 return QDF_STATUS_SUCCESS; 1734 } 1735 1736 QDF_STATUS wlan_mlme_get_bt_chain_separation_flag(struct wlan_objmgr_psoc *psoc, 1737 bool *value) 1738 { 1739 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 1740 1741 if (!mlme_obj) 1742 return QDF_STATUS_E_FAILURE; 1743 1744 *value = mlme_obj->cfg.chainmask_cfg.enable_bt_chain_separation; 1745 return QDF_STATUS_SUCCESS; 1746 } 1747 1748 QDF_STATUS wlan_mlme_get_num_11ag_tx_chains(struct wlan_objmgr_psoc *psoc, 1749 uint16_t *value) 1750 { 1751 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 1752 1753 if (!mlme_obj) 1754 return QDF_STATUS_E_FAILURE; 1755 1756 *value = mlme_obj->cfg.chainmask_cfg.num_11ag_tx_chains; 1757 return QDF_STATUS_SUCCESS; 1758 } 1759 1760 1761 static 1762 bool wlan_mlme_configure_chain_mask_supported(struct wlan_objmgr_psoc *psoc) 1763 { 1764 struct wma_caps_per_phy non_dbs_phy_cap = {0}; 1765 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 1766 QDF_STATUS status; 1767 bool as_enabled, enable_bt_chain_sep, enable2x2; 1768 uint8_t dual_mac_feature; 1769 bool hw_dbs_2x2_cap; 1770 1771 if (!mlme_obj) 1772 return false; 1773 1774 status = wma_get_caps_for_phyidx_hwmode(&non_dbs_phy_cap, 1775 HW_MODE_DBS_NONE, 1776 CDS_BAND_ALL); 1777 if (QDF_IS_STATUS_ERROR(status)) { 1778 mlme_legacy_err("couldn't get phy caps. skip chain mask programming"); 1779 return false; 1780 } 1781 1782 if (non_dbs_phy_cap.tx_chain_mask_2G < 3 || 1783 non_dbs_phy_cap.rx_chain_mask_2G < 3 || 1784 non_dbs_phy_cap.tx_chain_mask_5G < 3 || 1785 non_dbs_phy_cap.rx_chain_mask_5G < 3) { 1786 mlme_legacy_debug("firmware not capable. skip chain mask programming"); 1787 return false; 1788 } 1789 1790 enable_bt_chain_sep = 1791 mlme_obj->cfg.chainmask_cfg.enable_bt_chain_separation; 1792 as_enabled = mlme_obj->cfg.gen.as_enabled; 1793 ucfg_policy_mgr_get_dual_mac_feature(psoc, &dual_mac_feature); 1794 1795 hw_dbs_2x2_cap = policy_mgr_is_hw_dbs_2x2_capable(psoc); 1796 enable2x2 = mlme_obj->cfg.vht_caps.vht_cap_info.enable2x2; 1797 1798 if ((enable2x2 && !enable_bt_chain_sep) || as_enabled || 1799 (!hw_dbs_2x2_cap && (dual_mac_feature != DISABLE_DBS_CXN_AND_SCAN) && 1800 enable2x2)) { 1801 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", 1802 enable_bt_chain_sep, as_enabled, enable2x2, 1803 hw_dbs_2x2_cap, dual_mac_feature); 1804 return false; 1805 } 1806 1807 return true; 1808 } 1809 1810 bool wlan_mlme_is_chain_mask_supported(struct wlan_objmgr_psoc *psoc) 1811 1812 { 1813 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 1814 1815 if (!mlme_obj) 1816 return false; 1817 1818 if (!wlan_mlme_configure_chain_mask_supported(psoc)) 1819 return false; 1820 1821 /* If user has configured 1x1 from INI */ 1822 if (mlme_obj->cfg.chainmask_cfg.txchainmask1x1 != 3 || 1823 mlme_obj->cfg.chainmask_cfg.rxchainmask1x1 != 3) { 1824 mlme_legacy_debug("txchainmask1x1 %d rxchainmask1x1 %d", 1825 mlme_obj->cfg.chainmask_cfg.txchainmask1x1, 1826 mlme_obj->cfg.chainmask_cfg.rxchainmask1x1); 1827 return false; 1828 } 1829 1830 return true; 1831 1832 } 1833 1834 #define MAX_PDEV_CHAIN_MASK_PARAMS 6 1835 /* params being sent: 1836 * wmi_pdev_param_tx_chain_mask 1837 * wmi_pdev_param_rx_chain_mask 1838 * wmi_pdev_param_tx_chain_mask_2g 1839 * wmi_pdev_param_rx_chain_mask_2g 1840 * wmi_pdev_param_tx_chain_mask_5g 1841 * wmi_pdev_param_rx_chain_mask_5g 1842 */ 1843 QDF_STATUS wlan_mlme_configure_chain_mask(struct wlan_objmgr_psoc *psoc, 1844 uint8_t session_id) 1845 { 1846 QDF_STATUS ret_val = QDF_STATUS_E_FAILURE; 1847 uint8_t ch_msk_val; 1848 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 1849 bool mrc_disabled_2g_rx, mrc_disabled_2g_tx; 1850 bool mrc_disabled_5g_rx, mrc_disabled_5g_tx; 1851 struct dev_set_param setparam[MAX_PDEV_CHAIN_MASK_PARAMS]; 1852 uint8_t index = 0; 1853 1854 if (!mlme_obj) 1855 return QDF_STATUS_E_FAILURE; 1856 1857 mlme_legacy_debug("txchainmask1x1: %d rxchainmask1x1: %d", 1858 mlme_obj->cfg.chainmask_cfg.txchainmask1x1, 1859 mlme_obj->cfg.chainmask_cfg.rxchainmask1x1); 1860 mlme_legacy_debug("tx_chain_mask_2g: %d, rx_chain_mask_2g: %d", 1861 mlme_obj->cfg.chainmask_cfg.tx_chain_mask_2g, 1862 mlme_obj->cfg.chainmask_cfg.rx_chain_mask_2g); 1863 mlme_legacy_debug("tx_chain_mask_5g: %d, rx_chain_mask_5g: %d", 1864 mlme_obj->cfg.chainmask_cfg.tx_chain_mask_5g, 1865 mlme_obj->cfg.chainmask_cfg.rx_chain_mask_5g); 1866 1867 mrc_disabled_2g_rx = 1868 mlme_obj->cfg.nss_chains_ini_cfg.disable_rx_mrc[NSS_CHAINS_BAND_2GHZ]; 1869 mrc_disabled_2g_tx = 1870 mlme_obj->cfg.nss_chains_ini_cfg.disable_tx_mrc[NSS_CHAINS_BAND_2GHZ]; 1871 mrc_disabled_5g_rx = 1872 mlme_obj->cfg.nss_chains_ini_cfg.disable_rx_mrc[NSS_CHAINS_BAND_5GHZ]; 1873 mrc_disabled_5g_tx = 1874 mlme_obj->cfg.nss_chains_ini_cfg.disable_tx_mrc[NSS_CHAINS_BAND_5GHZ]; 1875 1876 mlme_legacy_debug("MRC values TX:- 2g %d 5g %d RX:- 2g %d 5g %d", 1877 mrc_disabled_2g_tx, mrc_disabled_5g_tx, 1878 mrc_disabled_2g_rx, mrc_disabled_5g_rx); 1879 1880 if (!wlan_mlme_configure_chain_mask_supported(psoc)) 1881 return QDF_STATUS_E_FAILURE; 1882 1883 if (mlme_obj->cfg.chainmask_cfg.txchainmask1x1) { 1884 ch_msk_val = mlme_obj->cfg.chainmask_cfg.txchainmask1x1; 1885 if (wma_validate_txrx_chain_mask(wmi_pdev_param_tx_chain_mask, 1886 ch_msk_val)) { 1887 goto error; 1888 } 1889 ret_val = mlme_check_index_setparam( 1890 setparam, 1891 wmi_pdev_param_tx_chain_mask, 1892 ch_msk_val, index++, 1893 MAX_PDEV_CHAIN_MASK_PARAMS); 1894 if (QDF_IS_STATUS_ERROR(ret_val)) { 1895 mlme_err("failed at wmi_pdev_param_tx_chain_mask"); 1896 goto error; 1897 } 1898 } 1899 1900 if (mlme_obj->cfg.chainmask_cfg.rxchainmask1x1) { 1901 ch_msk_val = mlme_obj->cfg.chainmask_cfg.rxchainmask1x1; 1902 if (wma_validate_txrx_chain_mask(wmi_pdev_param_rx_chain_mask, 1903 ch_msk_val)) { 1904 goto error; 1905 } 1906 ret_val = mlme_check_index_setparam( 1907 setparam, 1908 wmi_pdev_param_rx_chain_mask, 1909 ch_msk_val, index++, 1910 MAX_PDEV_CHAIN_MASK_PARAMS); 1911 if (QDF_IS_STATUS_ERROR(ret_val)) { 1912 mlme_err("failed at wmi_pdev_param_rx_chain_mask"); 1913 goto error; 1914 } 1915 } 1916 1917 if (mlme_obj->cfg.chainmask_cfg.txchainmask1x1 || 1918 mlme_obj->cfg.chainmask_cfg.rxchainmask1x1) { 1919 mlme_legacy_debug("band agnostic tx/rx chain mask set. skip per band chain mask"); 1920 goto sendparam; 1921 } 1922 1923 if (mlme_obj->cfg.chainmask_cfg.tx_chain_mask_2g && 1924 mrc_disabled_2g_tx) { 1925 ch_msk_val = mlme_obj->cfg.chainmask_cfg.tx_chain_mask_2g; 1926 ret_val = mlme_check_index_setparam( 1927 setparam, 1928 wmi_pdev_param_tx_chain_mask_2g, 1929 ch_msk_val, index++, 1930 MAX_PDEV_CHAIN_MASK_PARAMS); 1931 if (QDF_IS_STATUS_ERROR(ret_val)) { 1932 mlme_err("failed at wmi_pdev_param_tx_chain_mask_2g"); 1933 goto error; 1934 } 1935 } 1936 1937 if (mlme_obj->cfg.chainmask_cfg.rx_chain_mask_2g && 1938 mrc_disabled_2g_rx) { 1939 ch_msk_val = mlme_obj->cfg.chainmask_cfg.rx_chain_mask_2g; 1940 ret_val = mlme_check_index_setparam( 1941 setparam, 1942 wmi_pdev_param_rx_chain_mask_2g, 1943 ch_msk_val, index++, 1944 MAX_PDEV_CHAIN_MASK_PARAMS); 1945 if (QDF_IS_STATUS_ERROR(ret_val)) { 1946 mlme_err("failed at wmi_pdev_param_rx_chain_mask_2g"); 1947 goto error; 1948 } 1949 } 1950 1951 if (mlme_obj->cfg.chainmask_cfg.tx_chain_mask_5g && 1952 mrc_disabled_5g_tx) { 1953 ch_msk_val = mlme_obj->cfg.chainmask_cfg.tx_chain_mask_5g; 1954 ret_val = mlme_check_index_setparam( 1955 setparam, 1956 wmi_pdev_param_tx_chain_mask_5g, 1957 ch_msk_val, index++, 1958 MAX_PDEV_CHAIN_MASK_PARAMS); 1959 if (QDF_IS_STATUS_ERROR(ret_val)) { 1960 mlme_err("failed at wmi_pdev_param_tx_chain_mask_5g"); 1961 goto error; 1962 } 1963 } 1964 1965 if (mlme_obj->cfg.chainmask_cfg.rx_chain_mask_5g && 1966 mrc_disabled_5g_rx) { 1967 ch_msk_val = mlme_obj->cfg.chainmask_cfg.rx_chain_mask_5g; 1968 ret_val = mlme_check_index_setparam( 1969 setparam, 1970 wmi_pdev_param_rx_chain_mask_5g, 1971 ch_msk_val, index++, 1972 MAX_PDEV_CHAIN_MASK_PARAMS); 1973 if (QDF_IS_STATUS_ERROR(ret_val)) { 1974 mlme_err("failed at wmi_pdev_param_rx_chain_mask_5g"); 1975 goto error; 1976 } 1977 } 1978 sendparam: 1979 ret_val = wma_send_multi_pdev_vdev_set_params(MLME_PDEV_SETPARAM, 1980 WMI_PDEV_ID_SOC, setparam, 1981 index); 1982 if (QDF_IS_STATUS_ERROR(ret_val)) 1983 mlme_err("failed to send chainmask params"); 1984 error: 1985 return ret_val; 1986 } 1987 1988 QDF_STATUS 1989 wlan_mlme_get_manufacturer_name(struct wlan_objmgr_psoc *psoc, 1990 uint8_t *pbuf, uint32_t *plen) 1991 { 1992 struct wlan_mlme_psoc_ext_obj *mlme_obj; 1993 1994 mlme_obj = mlme_get_psoc_ext_obj(psoc); 1995 if (!mlme_obj) 1996 return QDF_STATUS_E_FAILURE; 1997 1998 *plen = qdf_str_lcopy(pbuf, 1999 mlme_obj->cfg.product_details.manufacturer_name, 2000 *plen); 2001 return QDF_STATUS_SUCCESS; 2002 } 2003 2004 QDF_STATUS 2005 wlan_mlme_get_model_number(struct wlan_objmgr_psoc *psoc, 2006 uint8_t *pbuf, uint32_t *plen) 2007 { 2008 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2009 2010 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2011 if (!mlme_obj) 2012 return QDF_STATUS_E_FAILURE; 2013 2014 *plen = qdf_str_lcopy(pbuf, 2015 mlme_obj->cfg.product_details.model_number, 2016 *plen); 2017 2018 return QDF_STATUS_SUCCESS; 2019 } 2020 2021 QDF_STATUS 2022 wlan_mlme_get_model_name(struct wlan_objmgr_psoc *psoc, 2023 uint8_t *pbuf, uint32_t *plen) 2024 { 2025 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2026 2027 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2028 if (!mlme_obj) 2029 return QDF_STATUS_E_FAILURE; 2030 2031 *plen = qdf_str_lcopy(pbuf, 2032 mlme_obj->cfg.product_details.model_name, 2033 *plen); 2034 return QDF_STATUS_SUCCESS; 2035 } 2036 2037 QDF_STATUS 2038 wlan_mlme_get_manufacture_product_version(struct wlan_objmgr_psoc *psoc, 2039 uint8_t *pbuf, uint32_t *plen) 2040 { 2041 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2042 2043 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2044 if (!mlme_obj) 2045 return QDF_STATUS_E_FAILURE; 2046 2047 *plen = qdf_str_lcopy(pbuf, 2048 mlme_obj->cfg.product_details.manufacture_product_version, 2049 *plen); 2050 return QDF_STATUS_SUCCESS; 2051 } 2052 2053 QDF_STATUS 2054 wlan_mlme_get_manufacture_product_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.manufacture_product_name, 2065 *plen); 2066 return QDF_STATUS_SUCCESS; 2067 } 2068 2069 2070 void wlan_mlme_get_tl_delayed_trgr_frm_int(struct wlan_objmgr_psoc *psoc, 2071 uint32_t *value) 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 *value = cfg_default(CFG_TL_DELAYED_TRGR_FRM_INTERVAL); 2078 return; 2079 } 2080 2081 *value = mlme_obj->cfg.wmm_params.delayed_trigger_frm_int; 2082 } 2083 2084 2085 QDF_STATUS wlan_mlme_get_wmm_dir_ac_vo(struct wlan_objmgr_psoc *psoc, 2086 uint8_t *value) 2087 { 2088 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2089 2090 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2091 if (!mlme_obj) 2092 return QDF_STATUS_E_FAILURE; 2093 2094 *value = mlme_obj->cfg.wmm_params.ac_vo.dir_ac_vo; 2095 2096 return QDF_STATUS_SUCCESS; 2097 } 2098 2099 2100 QDF_STATUS wlan_mlme_get_wmm_nom_msdu_size_ac_vo(struct wlan_objmgr_psoc *psoc, 2101 uint16_t *value) 2102 { 2103 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2104 2105 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2106 if (!mlme_obj) 2107 return QDF_STATUS_E_FAILURE; 2108 2109 *value = mlme_obj->cfg.wmm_params.ac_vo.nom_msdu_size_ac_vo; 2110 return QDF_STATUS_SUCCESS; 2111 } 2112 2113 QDF_STATUS 2114 wlan_mlme_get_wmm_mean_data_rate_ac_vo(struct wlan_objmgr_psoc *psoc, 2115 uint32_t *value) 2116 { 2117 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2118 2119 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2120 if (!mlme_obj) 2121 return QDF_STATUS_E_FAILURE; 2122 2123 *value = mlme_obj->cfg.wmm_params.ac_vo.mean_data_rate_ac_vo; 2124 2125 return QDF_STATUS_SUCCESS; 2126 } 2127 2128 QDF_STATUS wlan_mlme_get_wmm_min_phy_rate_ac_vo(struct wlan_objmgr_psoc *psoc, 2129 uint32_t *value) 2130 { 2131 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2132 2133 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2134 if (!mlme_obj) 2135 return QDF_STATUS_E_FAILURE; 2136 2137 *value = mlme_obj->cfg.wmm_params.ac_vo.min_phy_rate_ac_vo; 2138 return QDF_STATUS_SUCCESS; 2139 } 2140 2141 QDF_STATUS 2142 wlan_mlme_get_wmm_sba_ac_vo(struct wlan_objmgr_psoc *psoc, uint16_t *value) 2143 { 2144 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2145 2146 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2147 if (!mlme_obj) { 2148 return QDF_STATUS_E_FAILURE; 2149 } 2150 2151 *value = mlme_obj->cfg.wmm_params.ac_vo.sba_ac_vo; 2152 2153 return QDF_STATUS_SUCCESS; 2154 } 2155 2156 QDF_STATUS wlan_mlme_get_wmm_uapsd_vo_srv_intv(struct wlan_objmgr_psoc *psoc, 2157 uint32_t *value) 2158 { 2159 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2160 2161 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2162 if (!mlme_obj) 2163 return QDF_STATUS_E_FAILURE; 2164 2165 *value = mlme_obj->cfg.wmm_params.ac_vo.uapsd_vo_srv_intv; 2166 2167 return QDF_STATUS_SUCCESS; 2168 } 2169 2170 QDF_STATUS wlan_mlme_get_wmm_uapsd_vo_sus_intv(struct wlan_objmgr_psoc *psoc, 2171 uint32_t *value) 2172 { 2173 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2174 2175 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2176 if (!mlme_obj) 2177 return QDF_STATUS_E_FAILURE; 2178 2179 *value = mlme_obj->cfg.wmm_params.ac_vo.uapsd_vo_sus_intv; 2180 2181 return QDF_STATUS_SUCCESS; 2182 } 2183 2184 QDF_STATUS wlan_mlme_cfg_get_vht_ampdu_len_exp(struct wlan_objmgr_psoc *psoc, 2185 uint8_t *value) 2186 { 2187 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2188 2189 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2190 if (!mlme_obj) 2191 return QDF_STATUS_E_FAILURE; 2192 2193 *value = mlme_obj->cfg.vht_caps.vht_cap_info.ampdu_len_exponent; 2194 2195 return QDF_STATUS_SUCCESS; 2196 } 2197 2198 QDF_STATUS wlan_mlme_cfg_get_vht_max_mpdu_len(struct wlan_objmgr_psoc *psoc, 2199 uint8_t *value) 2200 { 2201 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2202 2203 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2204 if (!mlme_obj) 2205 return QDF_STATUS_E_FAILURE; 2206 2207 *value = mlme_obj->cfg.vht_caps.vht_cap_info.ampdu_len; 2208 2209 return QDF_STATUS_SUCCESS; 2210 } 2211 2212 QDF_STATUS wlan_mlme_cfg_get_ht_smps(struct wlan_objmgr_psoc *psoc, 2213 uint8_t *value) 2214 { 2215 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2216 2217 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2218 if (!mlme_obj) 2219 return QDF_STATUS_E_FAILURE; 2220 2221 *value = mlme_obj->cfg.ht_caps.smps; 2222 2223 return QDF_STATUS_SUCCESS; 2224 } 2225 2226 QDF_STATUS 2227 wlan_mlme_get_wmm_dir_ac_vi(struct wlan_objmgr_psoc *psoc, uint8_t *value) 2228 { 2229 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2230 2231 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2232 if (!mlme_obj) 2233 return QDF_STATUS_E_FAILURE; 2234 2235 *value = mlme_obj->cfg.wmm_params.ac_vi.dir_ac_vi; 2236 2237 return QDF_STATUS_SUCCESS; 2238 } 2239 2240 QDF_STATUS wlan_mlme_get_wmm_nom_msdu_size_ac_vi(struct wlan_objmgr_psoc *psoc, 2241 uint16_t *value) 2242 { 2243 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2244 2245 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2246 if (!mlme_obj) 2247 return QDF_STATUS_E_FAILURE; 2248 2249 *value = 2250 mlme_obj->cfg.wmm_params.ac_vi.nom_msdu_size_ac_vi; 2251 2252 return QDF_STATUS_SUCCESS; 2253 } 2254 2255 QDF_STATUS 2256 wlan_mlme_get_wmm_mean_data_rate_ac_vi(struct wlan_objmgr_psoc *psoc, 2257 uint32_t *value) 2258 { 2259 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2260 2261 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2262 if (!mlme_obj) 2263 return QDF_STATUS_E_FAILURE; 2264 2265 *value = mlme_obj->cfg.wmm_params.ac_vi.mean_data_rate_ac_vi; 2266 2267 return QDF_STATUS_SUCCESS; 2268 } 2269 2270 QDF_STATUS wlan_mlme_get_wmm_min_phy_rate_ac_vi(struct wlan_objmgr_psoc *psoc, 2271 uint32_t *value) 2272 { 2273 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2274 2275 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2276 if (!mlme_obj) 2277 return QDF_STATUS_E_FAILURE; 2278 2279 *value = mlme_obj->cfg.wmm_params.ac_vi.min_phy_rate_ac_vi; 2280 2281 return QDF_STATUS_SUCCESS; 2282 } 2283 2284 QDF_STATUS wlan_mlme_get_wmm_sba_ac_vi(struct wlan_objmgr_psoc *psoc, 2285 uint16_t *value) 2286 { 2287 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2288 2289 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2290 if (!mlme_obj) 2291 return QDF_STATUS_E_FAILURE; 2292 2293 *value = mlme_obj->cfg.wmm_params.ac_vi.sba_ac_vi; 2294 2295 return QDF_STATUS_SUCCESS; 2296 } 2297 2298 QDF_STATUS 2299 wlan_mlme_get_wmm_uapsd_vi_srv_intv(struct wlan_objmgr_psoc *psoc, 2300 uint32_t *value) 2301 { 2302 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2303 2304 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2305 if (!mlme_obj) 2306 return QDF_STATUS_E_FAILURE; 2307 2308 *value = mlme_obj->cfg.wmm_params.ac_vi.uapsd_vi_srv_intv; 2309 2310 return QDF_STATUS_SUCCESS; 2311 } 2312 2313 QDF_STATUS wlan_mlme_get_wmm_uapsd_vi_sus_intv(struct wlan_objmgr_psoc *psoc, 2314 uint32_t *value) 2315 { 2316 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2317 2318 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2319 if (!mlme_obj) 2320 return QDF_STATUS_E_FAILURE; 2321 2322 *value = mlme_obj->cfg.wmm_params.ac_vi.uapsd_vi_sus_intv; 2323 2324 return QDF_STATUS_SUCCESS; 2325 } 2326 2327 QDF_STATUS 2328 wlan_mlme_get_wmm_dir_ac_be(struct wlan_objmgr_psoc *psoc, uint8_t *value) 2329 { 2330 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2331 2332 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2333 if (!mlme_obj) 2334 return QDF_STATUS_E_FAILURE; 2335 2336 *value = mlme_obj->cfg.wmm_params.ac_be.dir_ac_be; 2337 2338 return QDF_STATUS_SUCCESS; 2339 } 2340 2341 QDF_STATUS wlan_mlme_get_wmm_nom_msdu_size_ac_be(struct wlan_objmgr_psoc *psoc, 2342 uint16_t *value) 2343 { 2344 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2345 2346 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2347 if (!mlme_obj) 2348 return QDF_STATUS_E_FAILURE; 2349 2350 *value = mlme_obj->cfg.wmm_params.ac_be.nom_msdu_size_ac_be; 2351 2352 return QDF_STATUS_SUCCESS; 2353 } 2354 2355 QDF_STATUS 2356 wlan_mlme_get_wmm_mean_data_rate_ac_be(struct wlan_objmgr_psoc *psoc, 2357 uint32_t *value) 2358 { 2359 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2360 2361 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2362 if (!mlme_obj) 2363 return QDF_STATUS_E_FAILURE; 2364 2365 *value = mlme_obj->cfg.wmm_params.ac_be.mean_data_rate_ac_be; 2366 2367 return QDF_STATUS_SUCCESS; 2368 } 2369 2370 QDF_STATUS wlan_mlme_get_wmm_min_phy_rate_ac_be(struct wlan_objmgr_psoc *psoc, 2371 uint32_t *value) 2372 { 2373 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2374 2375 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2376 if (!mlme_obj) 2377 return QDF_STATUS_E_FAILURE; 2378 2379 *value = mlme_obj->cfg.wmm_params.ac_be.min_phy_rate_ac_be; 2380 2381 return QDF_STATUS_SUCCESS; 2382 } 2383 2384 QDF_STATUS 2385 wlan_mlme_get_wmm_sba_ac_be(struct wlan_objmgr_psoc *psoc, uint16_t *value) 2386 { 2387 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2388 2389 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2390 if (!mlme_obj) 2391 return QDF_STATUS_E_FAILURE; 2392 2393 *value = mlme_obj->cfg.wmm_params.ac_be.sba_ac_be; 2394 2395 return QDF_STATUS_SUCCESS; 2396 } 2397 2398 QDF_STATUS wlan_mlme_get_wmm_uapsd_be_srv_intv(struct wlan_objmgr_psoc *psoc, 2399 uint32_t *value) 2400 { 2401 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2402 2403 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2404 if (!mlme_obj) 2405 return QDF_STATUS_E_FAILURE; 2406 2407 *value = mlme_obj->cfg.wmm_params.ac_be.uapsd_be_srv_intv; 2408 2409 return QDF_STATUS_SUCCESS; 2410 } 2411 2412 QDF_STATUS wlan_mlme_get_wmm_uapsd_be_sus_intv(struct wlan_objmgr_psoc *psoc, 2413 uint32_t *value) 2414 { 2415 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2416 2417 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2418 if (!mlme_obj) 2419 return QDF_STATUS_E_FAILURE; 2420 2421 *value = mlme_obj->cfg.wmm_params.ac_be.uapsd_be_sus_intv; 2422 2423 return QDF_STATUS_SUCCESS; 2424 } 2425 2426 QDF_STATUS 2427 wlan_mlme_get_wmm_dir_ac_bk(struct wlan_objmgr_psoc *psoc, uint8_t *value) 2428 { 2429 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2430 2431 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2432 if (!mlme_obj) 2433 return QDF_STATUS_E_FAILURE; 2434 2435 *value = mlme_obj->cfg.wmm_params.ac_bk.dir_ac_bk; 2436 2437 return QDF_STATUS_SUCCESS; 2438 } 2439 2440 QDF_STATUS wlan_mlme_get_wmm_nom_msdu_size_ac_bk(struct wlan_objmgr_psoc *psoc, 2441 uint16_t *value) 2442 { 2443 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2444 2445 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2446 if (!mlme_obj) 2447 return QDF_STATUS_E_FAILURE; 2448 2449 *value = mlme_obj->cfg.wmm_params.ac_bk.nom_msdu_size_ac_bk; 2450 2451 return QDF_STATUS_SUCCESS; 2452 } 2453 2454 QDF_STATUS 2455 wlan_mlme_get_wmm_mean_data_rate_ac_bk(struct wlan_objmgr_psoc *psoc, 2456 uint32_t *value) 2457 { 2458 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2459 2460 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2461 if (!mlme_obj) 2462 return QDF_STATUS_E_FAILURE; 2463 2464 *value = mlme_obj->cfg.wmm_params.ac_bk.mean_data_rate_ac_bk; 2465 2466 return QDF_STATUS_SUCCESS; 2467 } 2468 2469 QDF_STATUS wlan_mlme_get_wmm_min_phy_rate_ac_bk(struct wlan_objmgr_psoc *psoc, 2470 uint32_t *value) 2471 { 2472 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2473 2474 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2475 if (!mlme_obj) 2476 return QDF_STATUS_E_FAILURE; 2477 2478 *value = mlme_obj->cfg.wmm_params.ac_bk.min_phy_rate_ac_bk; 2479 2480 return QDF_STATUS_SUCCESS; 2481 } 2482 2483 QDF_STATUS 2484 wlan_mlme_get_wmm_sba_ac_bk(struct wlan_objmgr_psoc *psoc, uint16_t *value) 2485 { 2486 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2487 2488 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2489 if (!mlme_obj) 2490 return QDF_STATUS_E_FAILURE; 2491 2492 *value = mlme_obj->cfg.wmm_params.ac_bk.sba_ac_bk; 2493 2494 return QDF_STATUS_SUCCESS; 2495 } 2496 2497 QDF_STATUS 2498 wlan_mlme_get_wmm_uapsd_bk_srv_intv(struct wlan_objmgr_psoc *psoc, 2499 uint32_t *value) 2500 { 2501 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2502 2503 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2504 if (!mlme_obj) 2505 return QDF_STATUS_E_FAILURE; 2506 2507 *value = mlme_obj->cfg.wmm_params.ac_bk.uapsd_bk_srv_intv; 2508 2509 return QDF_STATUS_SUCCESS; 2510 } 2511 2512 QDF_STATUS 2513 wlan_mlme_get_wmm_uapsd_bk_sus_intv(struct wlan_objmgr_psoc *psoc, 2514 uint32_t *value) 2515 { 2516 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2517 2518 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2519 if (!mlme_obj) 2520 return QDF_STATUS_E_FAILURE; 2521 2522 *value = mlme_obj->cfg.wmm_params.ac_bk.uapsd_bk_sus_intv; 2523 2524 return QDF_STATUS_SUCCESS; 2525 } 2526 2527 QDF_STATUS 2528 wlan_mlme_get_wmm_mode(struct wlan_objmgr_psoc *psoc, uint8_t *value) 2529 { 2530 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2531 2532 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2533 if (!mlme_obj) 2534 return QDF_STATUS_E_FAILURE; 2535 2536 *value = mlme_obj->cfg.wmm_params.wmm_config.wmm_mode; 2537 2538 return QDF_STATUS_SUCCESS; 2539 } 2540 2541 QDF_STATUS 2542 wlan_mlme_get_80211e_is_enabled(struct wlan_objmgr_psoc *psoc, bool *value) 2543 { 2544 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2545 2546 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2547 if (!mlme_obj) 2548 return QDF_STATUS_E_FAILURE; 2549 2550 *value = mlme_obj->cfg.wmm_params.wmm_config.b80211e_is_enabled; 2551 2552 return QDF_STATUS_SUCCESS; 2553 } 2554 2555 QDF_STATUS 2556 wlan_mlme_get_wmm_uapsd_mask(struct wlan_objmgr_psoc *psoc, uint8_t *value) 2557 { 2558 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2559 2560 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2561 if (!mlme_obj) 2562 return QDF_STATUS_E_FAILURE; 2563 2564 *value = mlme_obj->cfg.wmm_params.wmm_config.uapsd_mask; 2565 2566 return QDF_STATUS_SUCCESS; 2567 } 2568 2569 #ifdef FEATURE_WLAN_ESE 2570 void wlan_mlme_get_inactivity_interval(struct wlan_objmgr_psoc *psoc, 2571 uint32_t *value) 2572 { 2573 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2574 2575 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2576 if (!mlme_obj) { 2577 *value = cfg_default(CFG_QOS_WMM_INACTIVITY_INTERVAL); 2578 return; 2579 } 2580 2581 *value = mlme_obj->cfg.wmm_params.wmm_tspec_element.inactivity_intv; 2582 } 2583 #endif 2584 2585 void wlan_mlme_get_is_ts_burst_size_enable(struct wlan_objmgr_psoc *psoc, 2586 bool *value) 2587 { 2588 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2589 2590 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2591 if (!mlme_obj) { 2592 *value = cfg_default(CFG_QOS_WMM_BURST_SIZE_DEFN); 2593 return; 2594 } 2595 2596 *value = mlme_obj->cfg.wmm_params.wmm_tspec_element.burst_size_def; 2597 } 2598 2599 void wlan_mlme_get_ts_info_ack_policy(struct wlan_objmgr_psoc *psoc, 2600 enum mlme_ts_info_ack_policy *value) 2601 { 2602 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2603 2604 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2605 if (!mlme_obj) { 2606 *value = cfg_default(CFG_QOS_WMM_TS_INFO_ACK_POLICY); 2607 return; 2608 } 2609 2610 *value = mlme_obj->cfg.wmm_params.wmm_tspec_element.ts_ack_policy; 2611 2612 } 2613 2614 QDF_STATUS 2615 wlan_mlme_get_ts_acm_value_for_ac(struct wlan_objmgr_psoc *psoc, bool *value) 2616 { 2617 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2618 2619 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2620 if (!mlme_obj) 2621 return QDF_STATUS_E_FAILURE; 2622 2623 *value = mlme_obj->cfg.wmm_params.wmm_tspec_element.ts_acm_is_off; 2624 2625 return QDF_STATUS_SUCCESS; 2626 } 2627 2628 QDF_STATUS wlan_mlme_get_listen_interval(struct wlan_objmgr_psoc *psoc, 2629 int *value) 2630 { 2631 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2632 2633 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2634 if (!mlme_obj) 2635 return QDF_STATUS_E_FAILURE; 2636 2637 *value = mlme_obj->cfg.sap_cfg.listen_interval; 2638 2639 return QDF_STATUS_SUCCESS; 2640 } 2641 2642 QDF_STATUS wlan_mlme_set_sap_listen_interval(struct wlan_objmgr_psoc *psoc, 2643 int value) 2644 { 2645 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2646 2647 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2648 if (!mlme_obj) 2649 return QDF_STATUS_E_FAILURE; 2650 2651 if (cfg_in_range(CFG_LISTEN_INTERVAL, value)) 2652 mlme_obj->cfg.sap_cfg.listen_interval = value; 2653 else 2654 return QDF_STATUS_E_FAILURE; 2655 2656 return QDF_STATUS_SUCCESS; 2657 } 2658 2659 QDF_STATUS wlan_mlme_set_assoc_sta_limit(struct wlan_objmgr_psoc *psoc, 2660 int value) 2661 { 2662 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2663 2664 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2665 if (!mlme_obj) 2666 return QDF_STATUS_E_FAILURE; 2667 2668 if (cfg_in_range(CFG_ASSOC_STA_LIMIT, value) && 2669 (value <= mlme_obj->cfg.sap_cfg.sap_max_no_peers)) 2670 mlme_obj->cfg.sap_cfg.assoc_sta_limit = value; 2671 else 2672 return QDF_STATUS_E_FAILURE; 2673 2674 return QDF_STATUS_SUCCESS; 2675 } 2676 2677 QDF_STATUS wlan_mlme_get_assoc_sta_limit(struct wlan_objmgr_psoc *psoc, 2678 int *value) 2679 { 2680 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2681 2682 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2683 if (!mlme_obj) 2684 return QDF_STATUS_E_FAILURE; 2685 2686 *value = mlme_obj->cfg.sap_cfg.assoc_sta_limit; 2687 2688 return QDF_STATUS_SUCCESS; 2689 } 2690 2691 QDF_STATUS wlan_mlme_get_sap_get_peer_info(struct wlan_objmgr_psoc *psoc, 2692 bool *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 *value = mlme_obj->cfg.sap_cfg.sap_get_peer_info; 2701 2702 return QDF_STATUS_SUCCESS; 2703 } 2704 2705 QDF_STATUS wlan_mlme_set_sap_get_peer_info(struct wlan_objmgr_psoc *psoc, 2706 bool value) 2707 { 2708 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2709 2710 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2711 if (!mlme_obj) 2712 return QDF_STATUS_E_FAILURE; 2713 2714 mlme_obj->cfg.sap_cfg.sap_get_peer_info = value; 2715 2716 return QDF_STATUS_SUCCESS; 2717 } 2718 2719 QDF_STATUS 2720 wlan_mlme_get_sap_bcast_deauth_enabled(struct wlan_objmgr_psoc *psoc, 2721 bool *value) 2722 { 2723 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2724 2725 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2726 if (!mlme_obj) 2727 return QDF_STATUS_E_FAILURE; 2728 2729 *value = mlme_obj->cfg.sap_cfg.is_sap_bcast_deauth_enabled; 2730 2731 return QDF_STATUS_SUCCESS; 2732 } 2733 2734 QDF_STATUS 2735 wlan_mlme_is_6g_sap_fd_enabled(struct wlan_objmgr_psoc *psoc, 2736 bool *value) 2737 { 2738 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2739 2740 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2741 if (!mlme_obj) 2742 return QDF_STATUS_E_FAILURE; 2743 2744 *value = mlme_obj->cfg.sap_cfg.is_6g_sap_fd_enabled; 2745 2746 return QDF_STATUS_SUCCESS; 2747 } 2748 2749 QDF_STATUS wlan_mlme_get_sap_allow_all_channels(struct wlan_objmgr_psoc *psoc, 2750 bool *value) 2751 { 2752 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2753 2754 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2755 if (!mlme_obj) 2756 return QDF_STATUS_E_FAILURE; 2757 2758 *value = mlme_obj->cfg.sap_cfg.sap_allow_all_chan_param_name; 2759 2760 return QDF_STATUS_SUCCESS; 2761 } 2762 2763 QDF_STATUS wlan_mlme_get_sap_max_peers(struct wlan_objmgr_psoc *psoc, 2764 int *value) 2765 { 2766 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2767 2768 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2769 if (!mlme_obj) 2770 return QDF_STATUS_E_FAILURE; 2771 2772 *value = mlme_obj->cfg.sap_cfg.sap_max_no_peers; 2773 2774 return QDF_STATUS_SUCCESS; 2775 } 2776 2777 QDF_STATUS wlan_mlme_set_sap_max_peers(struct wlan_objmgr_psoc *psoc, 2778 int value) 2779 { 2780 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2781 2782 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2783 if (!mlme_obj) 2784 return QDF_STATUS_E_FAILURE; 2785 2786 if (cfg_in_range(CFG_SAP_MAX_NO_PEERS, value)) 2787 mlme_obj->cfg.sap_cfg.sap_max_no_peers = value; 2788 else 2789 return QDF_STATUS_E_FAILURE; 2790 2791 return QDF_STATUS_SUCCESS; 2792 } 2793 2794 QDF_STATUS wlan_mlme_get_sap_max_offload_peers(struct wlan_objmgr_psoc *psoc, 2795 int *value) 2796 { 2797 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2798 2799 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2800 if (!mlme_obj) 2801 return QDF_STATUS_E_FAILURE; 2802 2803 *value = mlme_obj->cfg.sap_cfg.sap_max_offload_peers; 2804 2805 return QDF_STATUS_SUCCESS; 2806 } 2807 2808 QDF_STATUS wlan_mlme_get_sap_max_offload_reorder_buffs(struct wlan_objmgr_psoc 2809 *psoc, int *value) 2810 { 2811 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2812 2813 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2814 if (!mlme_obj) 2815 return QDF_STATUS_E_FAILURE; 2816 2817 *value = mlme_obj->cfg.sap_cfg.sap_max_offload_reorder_buffs; 2818 2819 return QDF_STATUS_SUCCESS; 2820 } 2821 2822 QDF_STATUS wlan_mlme_get_sap_chn_switch_bcn_count(struct wlan_objmgr_psoc *psoc, 2823 int *value) 2824 { 2825 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2826 2827 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2828 if (!mlme_obj) 2829 return QDF_STATUS_E_FAILURE; 2830 2831 *value = mlme_obj->cfg.sap_cfg.sap_ch_switch_beacon_cnt; 2832 2833 return QDF_STATUS_SUCCESS; 2834 } 2835 2836 QDF_STATUS wlan_mlme_get_sap_chn_switch_mode(struct wlan_objmgr_psoc *psoc, 2837 bool *value) 2838 { 2839 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2840 2841 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2842 if (!mlme_obj) 2843 return QDF_STATUS_E_FAILURE; 2844 2845 *value = mlme_obj->cfg.sap_cfg.sap_ch_switch_mode; 2846 2847 return QDF_STATUS_SUCCESS; 2848 } 2849 2850 QDF_STATUS wlan_mlme_get_sap_internal_restart(struct wlan_objmgr_psoc *psoc, 2851 bool *value) 2852 { 2853 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2854 2855 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2856 if (!mlme_obj) 2857 return QDF_STATUS_E_FAILURE; 2858 2859 *value = mlme_obj->cfg.sap_cfg.sap_internal_restart; 2860 2861 return QDF_STATUS_SUCCESS; 2862 } 2863 2864 QDF_STATUS wlan_mlme_get_sap_max_modulated_dtim(struct wlan_objmgr_psoc *psoc, 2865 uint8_t *value) 2866 { 2867 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2868 2869 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2870 if (!mlme_obj) 2871 return QDF_STATUS_E_FAILURE; 2872 2873 *value = mlme_obj->cfg.sap_cfg.max_li_modulated_dtim_time; 2874 2875 return QDF_STATUS_SUCCESS; 2876 } 2877 2878 QDF_STATUS wlan_mlme_get_sap_chan_pref_location(struct wlan_objmgr_psoc *psoc, 2879 uint8_t *value) 2880 { 2881 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2882 2883 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2884 if (!mlme_obj) 2885 return QDF_STATUS_E_FAILURE; 2886 2887 *value = mlme_obj->cfg.sap_cfg.sap_pref_chan_location; 2888 2889 return QDF_STATUS_SUCCESS; 2890 } 2891 2892 QDF_STATUS wlan_mlme_get_sap_country_priority(struct wlan_objmgr_psoc *psoc, 2893 bool *value) 2894 { 2895 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2896 2897 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2898 if (!mlme_obj) 2899 return QDF_STATUS_E_FAILURE; 2900 2901 *value = mlme_obj->cfg.sap_cfg.country_code_priority; 2902 2903 return QDF_STATUS_SUCCESS; 2904 } 2905 2906 QDF_STATUS wlan_mlme_get_sap_reduced_beacon_interval(struct wlan_objmgr_psoc 2907 *psoc, int *value) 2908 { 2909 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2910 2911 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2912 if (!mlme_obj) { 2913 *value = cfg_default(CFG_REDUCED_BEACON_INTERVAL); 2914 return QDF_STATUS_E_FAILURE; 2915 } 2916 2917 *value = mlme_obj->cfg.sap_cfg.reduced_beacon_interval; 2918 2919 return QDF_STATUS_SUCCESS; 2920 } 2921 2922 QDF_STATUS wlan_mlme_get_sap_chan_switch_rate_enabled(struct wlan_objmgr_psoc 2923 *psoc, bool *value) 2924 { 2925 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2926 2927 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2928 if (!mlme_obj) 2929 return QDF_STATUS_E_FAILURE; 2930 2931 *value = mlme_obj->cfg.sap_cfg.chan_switch_hostapd_rate_enabled_name; 2932 2933 return QDF_STATUS_SUCCESS; 2934 } 2935 2936 QDF_STATUS wlan_mlme_get_sap_force_11n_for_11ac(struct wlan_objmgr_psoc 2937 *psoc, bool *value) 2938 { 2939 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2940 2941 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2942 if (!mlme_obj) 2943 return QDF_STATUS_E_FAILURE; 2944 2945 *value = mlme_obj->cfg.sap_cfg.sap_force_11n_for_11ac; 2946 2947 return QDF_STATUS_SUCCESS; 2948 } 2949 2950 QDF_STATUS wlan_mlme_get_go_force_11n_for_11ac(struct wlan_objmgr_psoc 2951 *psoc, bool *value) 2952 { 2953 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2954 2955 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2956 if (!mlme_obj) 2957 return QDF_STATUS_E_FAILURE; 2958 2959 *value = mlme_obj->cfg.sap_cfg.go_force_11n_for_11ac; 2960 2961 return QDF_STATUS_SUCCESS; 2962 } 2963 2964 QDF_STATUS wlan_mlme_is_sap_11ac_override(struct wlan_objmgr_psoc *psoc, 2965 bool *value) 2966 { 2967 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2968 2969 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2970 if (!mlme_obj) { 2971 *value = cfg_default(CFG_SAP_11AC_OVERRIDE); 2972 return QDF_STATUS_E_FAILURE; 2973 } 2974 *value = mlme_obj->cfg.sap_cfg.sap_11ac_override; 2975 2976 return QDF_STATUS_SUCCESS; 2977 } 2978 2979 QDF_STATUS wlan_mlme_is_go_11ac_override(struct wlan_objmgr_psoc *psoc, 2980 bool *value) 2981 { 2982 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2983 2984 mlme_obj = mlme_get_psoc_ext_obj(psoc); 2985 if (!mlme_obj) { 2986 *value = cfg_default(CFG_GO_11AC_OVERRIDE); 2987 return QDF_STATUS_E_FAILURE; 2988 } 2989 *value = mlme_obj->cfg.sap_cfg.go_11ac_override; 2990 2991 return QDF_STATUS_SUCCESS; 2992 } 2993 2994 QDF_STATUS wlan_mlme_set_sap_11ac_override(struct wlan_objmgr_psoc *psoc, 2995 bool value) 2996 { 2997 struct wlan_mlme_psoc_ext_obj *mlme_obj; 2998 2999 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3000 if (!mlme_obj) 3001 return QDF_STATUS_E_FAILURE; 3002 mlme_obj->cfg.sap_cfg.sap_11ac_override = value; 3003 3004 return QDF_STATUS_SUCCESS; 3005 } 3006 3007 QDF_STATUS wlan_mlme_set_go_11ac_override(struct wlan_objmgr_psoc *psoc, 3008 bool value) 3009 { 3010 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3011 3012 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3013 if (!mlme_obj) 3014 return QDF_STATUS_E_FAILURE; 3015 mlme_obj->cfg.sap_cfg.go_11ac_override = value; 3016 3017 return QDF_STATUS_SUCCESS; 3018 } 3019 3020 QDF_STATUS wlan_mlme_get_bigtk_support(struct wlan_objmgr_psoc *psoc, 3021 bool *value) 3022 { 3023 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 3024 3025 if (!mlme_obj) 3026 return QDF_STATUS_E_FAILURE; 3027 3028 *value = mlme_obj->cfg.gen.bigtk_support; 3029 3030 return QDF_STATUS_SUCCESS; 3031 } 3032 3033 QDF_STATUS wlan_mlme_get_ocv_support(struct wlan_objmgr_psoc *psoc, 3034 bool *value) 3035 { 3036 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 3037 3038 if (!mlme_obj) 3039 return QDF_STATUS_E_FAILURE; 3040 3041 *value = mlme_obj->cfg.gen.ocv_support; 3042 3043 return QDF_STATUS_SUCCESS; 3044 } 3045 3046 bool wlan_mlme_get_host_scan_abort_support(struct wlan_objmgr_psoc *psoc) 3047 { 3048 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 3049 3050 if (!mlme_obj) 3051 return false; 3052 3053 return mlme_obj->cfg.gen.stop_all_host_scan_support; 3054 } 3055 3056 bool wlan_mlme_get_dual_sta_roam_support(struct wlan_objmgr_psoc *psoc) 3057 { 3058 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 3059 3060 if (!mlme_obj) 3061 return false; 3062 3063 return mlme_obj->cfg.gen.dual_sta_roam_fw_support; 3064 } 3065 3066 QDF_STATUS wlan_mlme_get_oce_sta_enabled_info(struct wlan_objmgr_psoc *psoc, 3067 bool *value) 3068 { 3069 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 3070 3071 if (!mlme_obj) 3072 return QDF_STATUS_E_FAILURE; 3073 3074 *value = mlme_obj->cfg.oce.oce_sta_enabled; 3075 return QDF_STATUS_SUCCESS; 3076 } 3077 3078 QDF_STATUS wlan_mlme_get_oce_sap_enabled_info(struct wlan_objmgr_psoc *psoc, 3079 bool *value) 3080 { 3081 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 3082 3083 if (!mlme_obj) 3084 return QDF_STATUS_E_FAILURE; 3085 3086 *value = mlme_obj->cfg.oce.oce_sap_enabled; 3087 return QDF_STATUS_SUCCESS; 3088 } 3089 3090 /** 3091 * wlan_mlme_send_oce_flags_fw() - Send the oce flags to FW 3092 * @pdev: pointer to pdev object 3093 * @object: vdev object 3094 * @arg: Arguments to the handler 3095 * 3096 * Return: void 3097 */ 3098 static void wlan_mlme_send_oce_flags_fw(struct wlan_objmgr_pdev *pdev, 3099 void *object, void *arg) 3100 { 3101 struct wlan_objmgr_vdev *vdev = object; 3102 uint8_t *updated_fw_value = arg; 3103 uint8_t *dynamic_fw_value = 0; 3104 uint8_t vdev_id; 3105 3106 if (wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE) { 3107 dynamic_fw_value = mlme_get_dynamic_oce_flags(vdev); 3108 if (!dynamic_fw_value) 3109 return; 3110 if (*updated_fw_value == *dynamic_fw_value) { 3111 mlme_legacy_debug("Current FW flags matches with updated value."); 3112 return; 3113 } 3114 *dynamic_fw_value = *updated_fw_value; 3115 vdev_id = wlan_vdev_get_id(vdev); 3116 if (wma_cli_set_command(vdev_id, 3117 wmi_vdev_param_enable_disable_oce_features, 3118 *updated_fw_value, VDEV_CMD)) 3119 mlme_legacy_err("Failed to send OCE update to FW"); 3120 } 3121 } 3122 3123 void wlan_mlme_update_oce_flags(struct wlan_objmgr_pdev *pdev) 3124 { 3125 uint16_t sap_connected_peer, go_connected_peer; 3126 struct wlan_objmgr_psoc *psoc = NULL; 3127 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3128 uint8_t updated_fw_value = 0; 3129 3130 psoc = wlan_pdev_get_psoc(pdev); 3131 if (!psoc) 3132 return; 3133 3134 sap_connected_peer = 3135 wlan_util_get_peer_count_for_mode(pdev, QDF_SAP_MODE); 3136 go_connected_peer = 3137 wlan_util_get_peer_count_for_mode(pdev, QDF_P2P_GO_MODE); 3138 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3139 3140 if (!mlme_obj) 3141 return; 3142 3143 if (sap_connected_peer || go_connected_peer) { 3144 updated_fw_value = mlme_obj->cfg.oce.feature_bitmap; 3145 updated_fw_value &= 3146 ~(WMI_VDEV_OCE_PROBE_REQUEST_RATE_FEATURE_BITMAP); 3147 updated_fw_value &= 3148 ~(WMI_VDEV_OCE_PROBE_REQUEST_DEFERRAL_FEATURE_BITMAP); 3149 mlme_legacy_debug("Disable STA OCE probe req rate and defferal updated_fw_value :%d", 3150 updated_fw_value); 3151 } else { 3152 updated_fw_value = mlme_obj->cfg.oce.feature_bitmap; 3153 mlme_legacy_debug("Update the STA OCE flags to default INI updated_fw_value :%d", 3154 updated_fw_value); 3155 } 3156 3157 wlan_objmgr_pdev_iterate_obj_list(pdev, WLAN_VDEV_OP, 3158 wlan_mlme_send_oce_flags_fw, 3159 &updated_fw_value, 0, WLAN_MLME_NB_ID); 3160 } 3161 3162 bool wlan_mlme_is_ap_prot_enabled(struct wlan_objmgr_psoc *psoc) 3163 { 3164 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3165 3166 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3167 if (!mlme_obj) 3168 return false; 3169 3170 return mlme_obj->cfg.sap_protection_cfg.is_ap_prot_enabled; 3171 } 3172 3173 QDF_STATUS wlan_mlme_get_ap_protection_mode(struct wlan_objmgr_psoc *psoc, 3174 uint16_t *value) 3175 { 3176 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3177 3178 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3179 if (!mlme_obj) 3180 return QDF_STATUS_E_FAILURE; 3181 3182 *value = mlme_obj->cfg.sap_protection_cfg.ap_protection_mode; 3183 3184 return QDF_STATUS_SUCCESS; 3185 } 3186 3187 QDF_STATUS wlan_mlme_is_ap_obss_prot_enabled(struct wlan_objmgr_psoc *psoc, 3188 bool *value) 3189 { 3190 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3191 3192 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3193 if (!mlme_obj) 3194 return QDF_STATUS_E_FAILURE; 3195 3196 *value = mlme_obj->cfg.sap_protection_cfg.enable_ap_obss_protection; 3197 3198 return QDF_STATUS_SUCCESS; 3199 } 3200 3201 QDF_STATUS wlan_mlme_get_rts_threshold(struct wlan_objmgr_psoc *psoc, 3202 uint32_t *value) 3203 { 3204 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3205 3206 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3207 if (!mlme_obj) 3208 return QDF_STATUS_E_FAILURE; 3209 3210 *value = mlme_obj->cfg.threshold.rts_threshold; 3211 3212 return QDF_STATUS_SUCCESS; 3213 } 3214 3215 QDF_STATUS wlan_mlme_set_rts_threshold(struct wlan_objmgr_psoc *psoc, 3216 uint32_t value) 3217 { 3218 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3219 tp_wma_handle wma_handle; 3220 3221 wma_handle = cds_get_context(QDF_MODULE_ID_WMA); 3222 3223 if (!wma_handle) 3224 return QDF_STATUS_E_INVAL; 3225 3226 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3227 3228 if (!mlme_obj) 3229 return QDF_STATUS_E_FAILURE; 3230 3231 mlme_obj->cfg.threshold.rts_threshold = value; 3232 wma_update_rts_params(wma_handle, value); 3233 3234 return QDF_STATUS_SUCCESS; 3235 } 3236 3237 QDF_STATUS wlan_mlme_get_frag_threshold(struct wlan_objmgr_psoc *psoc, 3238 uint32_t *value) 3239 { 3240 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3241 3242 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3243 if (!mlme_obj) 3244 return QDF_STATUS_E_FAILURE; 3245 3246 *value = mlme_obj->cfg.threshold.frag_threshold; 3247 3248 return QDF_STATUS_SUCCESS; 3249 } 3250 3251 QDF_STATUS wlan_mlme_set_frag_threshold(struct wlan_objmgr_psoc *psoc, 3252 uint32_t value) 3253 { 3254 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3255 tp_wma_handle wma_handle; 3256 3257 wma_handle = cds_get_context(QDF_MODULE_ID_WMA); 3258 3259 if (!wma_handle) 3260 return QDF_STATUS_E_INVAL; 3261 3262 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3263 3264 if (!mlme_obj) 3265 return QDF_STATUS_E_FAILURE; 3266 3267 mlme_obj->cfg.threshold.frag_threshold = value; 3268 wma_update_frag_params(wma_handle, 3269 value); 3270 3271 return QDF_STATUS_SUCCESS; 3272 } 3273 3274 QDF_STATUS wlan_mlme_get_fils_enabled_info(struct wlan_objmgr_psoc *psoc, 3275 bool *value) 3276 { 3277 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 3278 3279 if (!mlme_obj) 3280 return QDF_STATUS_E_FAILURE; 3281 3282 *value = mlme_obj->cfg.oce.fils_enabled; 3283 return QDF_STATUS_SUCCESS; 3284 } 3285 3286 QDF_STATUS wlan_mlme_set_fils_enabled_info(struct wlan_objmgr_psoc *psoc, 3287 bool value) 3288 { 3289 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 3290 3291 if (!mlme_obj) 3292 return QDF_STATUS_E_FAILURE; 3293 3294 mlme_obj->cfg.oce.fils_enabled = value; 3295 return QDF_STATUS_SUCCESS; 3296 } 3297 3298 QDF_STATUS wlan_mlme_set_primary_interface(struct wlan_objmgr_psoc *psoc, 3299 uint8_t value) 3300 { 3301 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 3302 3303 if (!mlme_obj) 3304 return QDF_STATUS_E_FAILURE; 3305 3306 mlme_obj->cfg.gen.dual_sta_policy.primary_vdev_id = value; 3307 mlme_debug("Set primary iface to :%d", value); 3308 3309 return QDF_STATUS_SUCCESS; 3310 } 3311 3312 bool wlan_mlme_is_primary_interface_configured(struct wlan_objmgr_psoc *psoc) 3313 { 3314 return wlan_cm_same_band_sta_allowed(psoc); 3315 } 3316 3317 QDF_STATUS wlan_mlme_peer_get_assoc_rsp_ies(struct wlan_objmgr_peer *peer, 3318 const uint8_t **ie_buf, 3319 size_t *ie_len) 3320 { 3321 struct peer_mlme_priv_obj *peer_priv; 3322 3323 if (!peer || !ie_buf || !ie_len) 3324 return QDF_STATUS_E_INVAL; 3325 3326 *ie_buf = NULL; 3327 *ie_len = 0; 3328 3329 peer_priv = wlan_objmgr_peer_get_comp_private_obj(peer, 3330 WLAN_UMAC_COMP_MLME); 3331 3332 if (!peer_priv || peer_priv->assoc_rsp.len == 0) 3333 return QDF_STATUS_SUCCESS; 3334 3335 *ie_buf = peer_priv->assoc_rsp.ptr; 3336 *ie_len = peer_priv->assoc_rsp.len; 3337 3338 return QDF_STATUS_SUCCESS; 3339 } 3340 3341 int wlan_mlme_get_mcc_duty_cycle_percentage(struct wlan_objmgr_pdev *pdev) 3342 { 3343 struct wlan_objmgr_psoc *psoc = NULL; 3344 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3345 uint32_t op_ch_freq_list[MAX_NUMBER_OF_CONC_CONNECTIONS]; 3346 uint8_t vdev_id_list[MAX_NUMBER_OF_CONC_CONNECTIONS]; 3347 uint32_t i, operating_channel, quota_value = MCC_DUTY_CYCLE; 3348 struct dual_sta_policy *dual_sta_policy; 3349 uint32_t count, primary_sta_freq = 0, secondary_sta_freq = 0; 3350 3351 psoc = wlan_pdev_get_psoc(pdev); 3352 if (!psoc) 3353 return -EINVAL; 3354 3355 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3356 if (!mlme_obj) 3357 return -EINVAL; 3358 dual_sta_policy = &mlme_obj->cfg.gen.dual_sta_policy; 3359 3360 if (dual_sta_policy->primary_vdev_id == WLAN_INVALID_VDEV_ID || 3361 (dual_sta_policy->concurrent_sta_policy == 3362 QCA_WLAN_CONCURRENT_STA_POLICY_UNBIASED)) { 3363 mlme_debug("Invalid primary vdev id or policy is unbaised :%d", 3364 dual_sta_policy->concurrent_sta_policy); 3365 return -EINVAL; 3366 } 3367 3368 count = policy_mgr_get_mode_specific_conn_info(psoc, op_ch_freq_list, 3369 vdev_id_list, 3370 PM_STA_MODE); 3371 3372 /* Proceed only in case of STA+STA */ 3373 if (count != 2) { 3374 mlme_debug("STA+STA concurrency is not present"); 3375 return -EINVAL; 3376 } 3377 3378 for (i = 0; i < count; i++) { 3379 if (vdev_id_list[i] == dual_sta_policy->primary_vdev_id) { 3380 primary_sta_freq = op_ch_freq_list[i]; 3381 mlme_debug("primary sta vdev:%d at inxex:%d, freq:%d", 3382 i, vdev_id_list[i], op_ch_freq_list[i]); 3383 } else { 3384 secondary_sta_freq = op_ch_freq_list[i]; 3385 mlme_debug("secondary sta vdev:%d at inxex:%d, freq:%d", 3386 i, vdev_id_list[i], op_ch_freq_list[i]); 3387 } 3388 } 3389 3390 if (!primary_sta_freq || !secondary_sta_freq) { 3391 mlme_debug("Invalid primary or secondary sta freq"); 3392 return -EINVAL; 3393 } 3394 3395 operating_channel = wlan_freq_to_chan(primary_sta_freq); 3396 3397 /* 3398 * The channel numbers for both adapters and the time 3399 * quota for the 1st adapter, i.e., one specified in cmd 3400 * are formatted as a bit vector 3401 * ****************************************************** 3402 * |bit 31-24 | bit 23-16 | bits 15-8 |bits 7-0 | 3403 * | Unused | Quota for | chan. # for |chan. # for| 3404 * | | 1st chan | 1st chan. |2nd chan. | 3405 * ****************************************************** 3406 */ 3407 mlme_debug("First connection channel No.:%d and quota:%dms", 3408 operating_channel, quota_value); 3409 /* Move the time quota for first channel to bits 15-8 */ 3410 quota_value = quota_value << 8; 3411 /* 3412 * Store the channel number of 1st channel at bits 7-0 3413 * of the bit vector 3414 */ 3415 quota_value |= operating_channel; 3416 /* Second STA Connection */ 3417 operating_channel = wlan_freq_to_chan(secondary_sta_freq); 3418 if (!operating_channel) 3419 mlme_debug("Secondary adapter op channel is invalid"); 3420 /* 3421 * Now move the time quota and channel number of the 3422 * 1st adapter to bits 23-16 and bits 15-8 of the bit 3423 * vector, respectively. 3424 */ 3425 quota_value = quota_value << 8; 3426 /* 3427 * Set the channel number for 2nd MCC vdev at bits 3428 * 7-0 of set_value 3429 */ 3430 quota_value |= operating_channel; 3431 mlme_debug("quota value:%x", quota_value); 3432 3433 return quota_value; 3434 } 3435 3436 QDF_STATUS wlan_mlme_set_enable_bcast_probe_rsp(struct wlan_objmgr_psoc *psoc, 3437 bool value) 3438 { 3439 struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc); 3440 3441 if (!mlme_obj) 3442 return QDF_STATUS_E_FAILURE; 3443 3444 mlme_obj->cfg.oce.enable_bcast_probe_rsp = value; 3445 return QDF_STATUS_SUCCESS; 3446 } 3447 3448 QDF_STATUS 3449 wlan_mlme_get_sta_miracast_mcc_rest_time(struct wlan_objmgr_psoc *psoc, 3450 uint32_t *value) 3451 { 3452 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3453 3454 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3455 if (!mlme_obj) 3456 return QDF_STATUS_E_FAILURE; 3457 3458 *value = mlme_obj->cfg.sta.sta_miracast_mcc_rest_time; 3459 3460 return QDF_STATUS_SUCCESS; 3461 } 3462 3463 QDF_STATUS 3464 wlan_mlme_get_max_modulated_dtim_ms(struct wlan_objmgr_psoc *psoc, 3465 uint16_t *value) 3466 { 3467 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3468 3469 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3470 if (!mlme_obj) 3471 return QDF_STATUS_E_FAILURE; 3472 3473 *value = mlme_obj->cfg.sta.max_li_modulated_dtim_time_ms; 3474 3475 return QDF_STATUS_SUCCESS; 3476 } 3477 3478 QDF_STATUS 3479 wlan_mlme_get_scan_probe_unicast_ra(struct wlan_objmgr_psoc *psoc, 3480 bool *value) 3481 { 3482 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3483 3484 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3485 if (!mlme_obj) 3486 return QDF_STATUS_E_FAILURE; 3487 3488 *value = mlme_obj->cfg.sta.usr_scan_probe_unicast_ra; 3489 3490 mlme_legacy_debug("scan_probe_unicast_ra %d", *value); 3491 3492 return QDF_STATUS_SUCCESS; 3493 } 3494 3495 QDF_STATUS 3496 wlan_mlme_set_scan_probe_unicast_ra(struct wlan_objmgr_psoc *psoc, 3497 bool 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 mlme_legacy_debug("scan_probe_unicast_ra %d", value); 3506 mlme_obj->cfg.sta.usr_scan_probe_unicast_ra = value; 3507 3508 return QDF_STATUS_SUCCESS; 3509 } 3510 3511 QDF_STATUS 3512 wlan_mlme_get_sap_mcc_chnl_avoid(struct wlan_objmgr_psoc *psoc, 3513 uint8_t *value) 3514 { 3515 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3516 3517 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3518 if (!mlme_obj) 3519 return QDF_STATUS_E_FAILURE; 3520 3521 *value = mlme_obj->cfg.sap_cfg.sap_mcc_chnl_avoid; 3522 3523 return QDF_STATUS_SUCCESS; 3524 } 3525 3526 QDF_STATUS 3527 wlan_mlme_get_mcc_bcast_prob_resp(struct wlan_objmgr_psoc *psoc, 3528 uint8_t *value) 3529 { 3530 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3531 3532 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3533 if (!mlme_obj) 3534 return QDF_STATUS_E_FAILURE; 3535 3536 *value = mlme_obj->cfg.feature_flags.mcc_bcast_prob_rsp; 3537 3538 return QDF_STATUS_SUCCESS; 3539 } 3540 3541 QDF_STATUS 3542 wlan_mlme_get_mcc_rts_cts_prot(struct wlan_objmgr_psoc *psoc, 3543 uint8_t *value) 3544 { 3545 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3546 3547 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3548 if (!mlme_obj) 3549 return QDF_STATUS_E_FAILURE; 3550 3551 *value = mlme_obj->cfg.feature_flags.mcc_rts_cts_prot; 3552 3553 return QDF_STATUS_SUCCESS; 3554 } 3555 3556 QDF_STATUS 3557 wlan_mlme_get_mcc_feature(struct wlan_objmgr_psoc *psoc, 3558 uint8_t *value) 3559 { 3560 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3561 3562 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3563 if (!mlme_obj) 3564 return QDF_STATUS_E_FAILURE; 3565 3566 *value = mlme_obj->cfg.feature_flags.enable_mcc; 3567 3568 return QDF_STATUS_SUCCESS; 3569 } 3570 3571 QDF_STATUS wlan_mlme_get_edca_params(struct wlan_mlme_edca_params *edca_params, 3572 uint8_t *data, enum e_edca_type edca_ac) 3573 { 3574 qdf_size_t len; 3575 3576 switch (edca_ac) { 3577 case edca_ani_acbe_local: 3578 len = edca_params->ani_acbe_l.len; 3579 wlan_mlme_get_cfg_str(data, &edca_params->ani_acbe_l, &len); 3580 break; 3581 3582 case edca_ani_acbk_local: 3583 len = edca_params->ani_acbk_l.len; 3584 wlan_mlme_get_cfg_str(data, &edca_params->ani_acbk_l, &len); 3585 break; 3586 3587 case edca_ani_acvi_local: 3588 len = edca_params->ani_acvi_l.len; 3589 wlan_mlme_get_cfg_str(data, &edca_params->ani_acvi_l, &len); 3590 break; 3591 3592 case edca_ani_acvo_local: 3593 len = edca_params->ani_acvo_l.len; 3594 wlan_mlme_get_cfg_str(data, &edca_params->ani_acvo_l, &len); 3595 break; 3596 3597 case edca_ani_acbk_bcast: 3598 len = edca_params->ani_acbk_b.len; 3599 wlan_mlme_get_cfg_str(data, &edca_params->ani_acbk_b, &len); 3600 break; 3601 3602 case edca_ani_acbe_bcast: 3603 len = edca_params->ani_acbe_b.len; 3604 wlan_mlme_get_cfg_str(data, &edca_params->ani_acbe_b, &len); 3605 break; 3606 3607 case edca_ani_acvi_bcast: 3608 len = edca_params->ani_acvi_b.len; 3609 wlan_mlme_get_cfg_str(data, &edca_params->ani_acvi_b, &len); 3610 break; 3611 3612 case edca_ani_acvo_bcast: 3613 len = edca_params->ani_acvo_b.len; 3614 wlan_mlme_get_cfg_str(data, &edca_params->ani_acvo_b, &len); 3615 break; 3616 3617 case edca_wme_acbe_local: 3618 len = edca_params->wme_acbe_l.len; 3619 wlan_mlme_get_cfg_str(data, &edca_params->wme_acbe_l, &len); 3620 break; 3621 3622 case edca_wme_acbk_local: 3623 len = edca_params->wme_acbk_l.len; 3624 wlan_mlme_get_cfg_str(data, &edca_params->wme_acbk_l, &len); 3625 break; 3626 3627 case edca_wme_acvi_local: 3628 len = edca_params->wme_acvi_l.len; 3629 wlan_mlme_get_cfg_str(data, &edca_params->wme_acvi_l, &len); 3630 break; 3631 3632 case edca_wme_acvo_local: 3633 len = edca_params->wme_acvo_l.len; 3634 wlan_mlme_get_cfg_str(data, &edca_params->wme_acvo_l, &len); 3635 break; 3636 3637 case edca_wme_acbe_bcast: 3638 len = edca_params->wme_acbe_b.len; 3639 wlan_mlme_get_cfg_str(data, &edca_params->wme_acbe_b, &len); 3640 break; 3641 3642 case edca_wme_acbk_bcast: 3643 len = edca_params->wme_acbk_b.len; 3644 wlan_mlme_get_cfg_str(data, &edca_params->wme_acbk_b, &len); 3645 break; 3646 3647 case edca_wme_acvi_bcast: 3648 len = edca_params->wme_acvi_b.len; 3649 wlan_mlme_get_cfg_str(data, &edca_params->wme_acvi_b, &len); 3650 break; 3651 3652 case edca_wme_acvo_bcast: 3653 len = edca_params->wme_acvo_b.len; 3654 wlan_mlme_get_cfg_str(data, &edca_params->wme_acvo_b, &len); 3655 break; 3656 3657 case edca_etsi_acbe_local: 3658 len = edca_params->etsi_acbe_l.len; 3659 wlan_mlme_get_cfg_str(data, &edca_params->etsi_acbe_l, &len); 3660 break; 3661 3662 case edca_etsi_acbk_local: 3663 len = edca_params->etsi_acbk_l.len; 3664 wlan_mlme_get_cfg_str(data, &edca_params->etsi_acbk_l, &len); 3665 break; 3666 3667 case edca_etsi_acvi_local: 3668 len = edca_params->etsi_acvi_l.len; 3669 wlan_mlme_get_cfg_str(data, &edca_params->etsi_acvi_l, &len); 3670 break; 3671 3672 case edca_etsi_acvo_local: 3673 len = edca_params->etsi_acvo_l.len; 3674 wlan_mlme_get_cfg_str(data, &edca_params->etsi_acvo_l, &len); 3675 break; 3676 3677 case edca_etsi_acbe_bcast: 3678 len = edca_params->etsi_acbe_b.len; 3679 wlan_mlme_get_cfg_str(data, &edca_params->etsi_acbe_b, &len); 3680 break; 3681 3682 case edca_etsi_acbk_bcast: 3683 len = edca_params->etsi_acbk_b.len; 3684 wlan_mlme_get_cfg_str(data, &edca_params->etsi_acbk_b, &len); 3685 break; 3686 3687 case edca_etsi_acvi_bcast: 3688 len = edca_params->etsi_acvi_b.len; 3689 wlan_mlme_get_cfg_str(data, &edca_params->etsi_acvi_b, &len); 3690 break; 3691 3692 case edca_etsi_acvo_bcast: 3693 len = edca_params->etsi_acvo_b.len; 3694 wlan_mlme_get_cfg_str(data, &edca_params->etsi_acvo_b, &len); 3695 break; 3696 default: 3697 mlme_legacy_err("Invalid edca access category"); 3698 return QDF_STATUS_E_INVAL; 3699 } 3700 return QDF_STATUS_SUCCESS; 3701 } 3702 3703 QDF_STATUS mlme_get_wep_key(struct wlan_objmgr_vdev *vdev, 3704 struct wlan_mlme_wep_cfg *wep_params, 3705 enum wep_key_id wep_keyid, uint8_t *default_key, 3706 qdf_size_t *key_len) 3707 { 3708 struct wlan_crypto_key *crypto_key = NULL; 3709 3710 if (wep_keyid >= WLAN_CRYPTO_MAXKEYIDX) { 3711 mlme_legacy_err("Incorrect wep key index %d", wep_keyid); 3712 return QDF_STATUS_E_INVAL; 3713 } 3714 crypto_key = wlan_crypto_get_key(vdev, wep_keyid); 3715 if (!crypto_key) { 3716 mlme_legacy_err("Crypto KEY not present"); 3717 return QDF_STATUS_E_INVAL; 3718 } 3719 3720 if (crypto_key->keylen > WLAN_CRYPTO_KEY_WEP104_LEN) { 3721 mlme_legacy_err("Key too large to hold"); 3722 return QDF_STATUS_E_INVAL; 3723 } 3724 *key_len = crypto_key->keylen; 3725 qdf_mem_copy(default_key, &crypto_key->keyval, crypto_key->keylen); 3726 3727 return QDF_STATUS_SUCCESS; 3728 } 3729 3730 QDF_STATUS 3731 wlan_mlme_is_11h_enabled(struct wlan_objmgr_psoc *psoc, bool *value) 3732 { 3733 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3734 3735 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3736 if (!mlme_obj) 3737 return QDF_STATUS_E_FAILURE; 3738 3739 *value = mlme_obj->cfg.gen.enabled_11h; 3740 3741 return QDF_STATUS_SUCCESS; 3742 } 3743 3744 QDF_STATUS 3745 wlan_mlme_set_11h_enabled(struct wlan_objmgr_psoc *psoc, bool value) 3746 { 3747 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3748 3749 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3750 if (!mlme_obj) 3751 return QDF_STATUS_E_FAILURE; 3752 3753 mlme_obj->cfg.gen.enabled_11h = value; 3754 3755 return QDF_STATUS_SUCCESS; 3756 } 3757 3758 QDF_STATUS 3759 wlan_mlme_is_11d_enabled(struct wlan_objmgr_psoc *psoc, bool *value) 3760 { 3761 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3762 3763 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3764 if (!mlme_obj) 3765 return QDF_STATUS_E_FAILURE; 3766 3767 *value = mlme_obj->cfg.gen.enabled_11d; 3768 3769 return QDF_STATUS_SUCCESS; 3770 } 3771 3772 QDF_STATUS 3773 wlan_mlme_set_11d_enabled(struct wlan_objmgr_psoc *psoc, bool value) 3774 { 3775 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3776 3777 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3778 if (!mlme_obj) 3779 return QDF_STATUS_E_FAILURE; 3780 3781 mlme_obj->cfg.gen.enabled_11d = value; 3782 3783 return QDF_STATUS_SUCCESS; 3784 } 3785 3786 QDF_STATUS 3787 wlan_mlme_is_rf_test_mode_enabled(struct wlan_objmgr_psoc *psoc, bool *value) 3788 { 3789 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3790 3791 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3792 if (!mlme_obj) { 3793 *value = false; 3794 return QDF_STATUS_E_FAILURE; 3795 } 3796 3797 *value = mlme_obj->cfg.gen.enabled_rf_test_mode; 3798 3799 return QDF_STATUS_SUCCESS; 3800 } 3801 3802 QDF_STATUS 3803 wlan_mlme_set_rf_test_mode_enabled(struct wlan_objmgr_psoc *psoc, bool value) 3804 { 3805 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3806 3807 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3808 if (!mlme_obj) 3809 return QDF_STATUS_E_FAILURE; 3810 3811 mlme_obj->cfg.gen.enabled_rf_test_mode = value; 3812 3813 return QDF_STATUS_SUCCESS; 3814 } 3815 3816 #ifdef CONFIG_BAND_6GHZ 3817 QDF_STATUS 3818 wlan_mlme_is_standard_6ghz_conn_policy_enabled(struct wlan_objmgr_psoc *psoc, 3819 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 return QDF_STATUS_E_FAILURE; 3826 3827 *value = mlme_obj->cfg.gen.std_6ghz_conn_policy; 3828 3829 return QDF_STATUS_SUCCESS; 3830 } 3831 3832 QDF_STATUS 3833 wlan_mlme_is_disable_vlp_sta_conn_to_sp_ap_enabled( 3834 struct wlan_objmgr_psoc *psoc, 3835 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 *value = mlme_obj->cfg.gen.disable_vlp_sta_conn_to_sp_ap; 3844 3845 return QDF_STATUS_SUCCESS; 3846 } 3847 #endif 3848 3849 #ifdef WLAN_FEATURE_11BE_MLO 3850 QDF_STATUS 3851 wlan_mlme_get_eht_mode(struct wlan_objmgr_psoc *psoc, enum wlan_eht_mode *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.eht_mode; 3860 3861 return QDF_STATUS_SUCCESS; 3862 } 3863 3864 QDF_STATUS 3865 wlan_mlme_get_emlsr_mode_enabled(struct wlan_objmgr_psoc *psoc, bool *value) 3866 { 3867 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3868 3869 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3870 if (!mlme_obj) 3871 return QDF_STATUS_E_FAILURE; 3872 3873 *value = mlme_obj->cfg.gen.enable_emlsr_mode; 3874 3875 return QDF_STATUS_SUCCESS; 3876 } 3877 3878 QDF_STATUS 3879 wlan_mlme_set_eht_mode(struct wlan_objmgr_psoc *psoc, enum wlan_eht_mode value) 3880 { 3881 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3882 3883 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3884 if (!mlme_obj) 3885 return QDF_STATUS_E_FAILURE; 3886 3887 mlme_obj->cfg.gen.eht_mode = value; 3888 3889 return QDF_STATUS_SUCCESS; 3890 } 3891 3892 QDF_STATUS 3893 wlan_mlme_set_emlsr_mode_enabled(struct wlan_objmgr_psoc *psoc, bool value) 3894 { 3895 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3896 3897 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3898 if (!mlme_obj) 3899 return QDF_STATUS_E_FAILURE; 3900 3901 mlme_obj->cfg.gen.enable_emlsr_mode = value; 3902 3903 return QDF_STATUS_SUCCESS; 3904 } 3905 3906 void 3907 wlan_mlme_set_eml_params(struct wlan_objmgr_psoc *psoc, 3908 struct wlan_psoc_host_mac_phy_caps_ext2 *cap) 3909 { 3910 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3911 3912 if (!cap->emlcap.emlsr_supp) { 3913 mlme_legacy_debug("EMLSR supp: %d", cap->emlcap.emlsr_supp); 3914 return; 3915 } 3916 3917 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3918 if (!mlme_obj) { 3919 mlme_legacy_err("No psoc object"); 3920 return; 3921 } 3922 mlme_obj->cfg.eml_cap.emlsr_supp = cap->emlcap.emlsr_supp; 3923 mlme_obj->cfg.eml_cap.emlsr_pad_delay = cap->emlcap.emlsr_pad_delay; 3924 mlme_obj->cfg.eml_cap.emlsr_trans_delay = cap->emlcap.emlsr_trans_delay; 3925 mlme_obj->cfg.eml_cap.emlmr_supp = cap->emlcap.emlmr_supp; 3926 } 3927 3928 void 3929 wlan_mlme_get_eml_params(struct wlan_objmgr_psoc *psoc, 3930 struct wlan_mlo_eml_cap *cap) 3931 { 3932 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3933 3934 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3935 if (!mlme_obj) { 3936 mlme_legacy_err("No psoc object"); 3937 return; 3938 } 3939 cap->emlsr_supp = mlme_obj->cfg.eml_cap.emlsr_supp; 3940 cap->emlsr_pad_delay = mlme_obj->cfg.eml_cap.emlsr_pad_delay; 3941 cap->emlsr_trans_delay = mlme_obj->cfg.eml_cap.emlsr_trans_delay; 3942 cap->emlmr_supp = mlme_obj->cfg.eml_cap.emlmr_supp; 3943 } 3944 3945 void 3946 wlan_mlme_cfg_set_emlsr_pad_delay(struct wlan_objmgr_psoc *psoc, uint8_t val) 3947 { 3948 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3949 3950 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3951 if (!mlme_obj) { 3952 mlme_legacy_err("No psoc object"); 3953 return; 3954 } 3955 3956 if (val > mlme_obj->cfg.eml_cap.emlsr_pad_delay && 3957 val <= WLAN_ML_BV_CINFO_EMLCAP_EMLSRDELAY_256US) { 3958 mlme_obj->cfg.eml_cap.emlsr_pad_delay = val; 3959 mlme_debug("EMLSR padding delay configured to %d", val); 3960 } 3961 } 3962 3963 enum t2lm_negotiation_support 3964 wlan_mlme_get_t2lm_negotiation_supported(struct wlan_objmgr_psoc *psoc) 3965 { 3966 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3967 3968 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3969 if (!mlme_obj) 3970 return T2LM_NEGOTIATION_DISABLED; 3971 3972 return mlme_obj->cfg.gen.t2lm_negotiation_support; 3973 } 3974 3975 QDF_STATUS 3976 wlan_mlme_set_t2lm_negotiation_supported(struct wlan_objmgr_psoc *psoc, 3977 uint8_t value) 3978 { 3979 struct wlan_mlme_psoc_ext_obj *mlme_obj; 3980 3981 mlme_obj = mlme_get_psoc_ext_obj(psoc); 3982 if (!mlme_obj) 3983 return QDF_STATUS_E_FAILURE; 3984 3985 if (value > T2LM_NEGOTIATION_MAX) { 3986 mlme_err("Invalid value %d", value); 3987 return QDF_STATUS_E_INVAL; 3988 } 3989 3990 mlme_obj->cfg.gen.t2lm_negotiation_support = value; 3991 3992 return QDF_STATUS_SUCCESS; 3993 } 3994 3995 uint8_t 3996 wlan_mlme_get_eht_mld_id(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 0; 4003 4004 return mlme_obj->cfg.gen.mld_id; 4005 } 4006 4007 QDF_STATUS 4008 wlan_mlme_set_eht_mld_id(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 mlme_obj->cfg.gen.mld_id = value; 4018 4019 return QDF_STATUS_SUCCESS; 4020 } 4021 #endif 4022 4023 QDF_STATUS 4024 wlan_mlme_set_btm_abridge_flag(struct wlan_objmgr_psoc *psoc, 4025 bool value) 4026 { 4027 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4028 4029 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4030 if (!mlme_obj) 4031 return QDF_STATUS_E_FAILURE; 4032 4033 mlme_obj->cfg.btm.abridge_flag = value; 4034 4035 return QDF_STATUS_SUCCESS; 4036 } 4037 4038 bool 4039 wlan_mlme_get_btm_abridge_flag(struct wlan_objmgr_psoc *psoc) 4040 { 4041 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4042 4043 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4044 if (!mlme_obj) 4045 return false; 4046 4047 return mlme_obj->cfg.btm.abridge_flag; 4048 } 4049 4050 QDF_STATUS 4051 wlan_mlme_cfg_set_vht_chan_width(struct wlan_objmgr_psoc *psoc, uint8_t value) 4052 { 4053 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4054 4055 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4056 if (!mlme_obj) 4057 return QDF_STATUS_E_FAILURE; 4058 4059 mlme_obj->cfg.vht_caps.vht_cap_info.supp_chan_width = value; 4060 if (value == VHT_CAP_160_AND_80P80_SUPP || 4061 value == VHT_CAP_160_SUPP) { 4062 mlme_obj->cfg.vht_caps.vht_cap_info.vht_extended_nss_bw_cap = 1; 4063 mlme_obj->cfg.vht_caps.vht_cap_info.extended_nss_bw_supp = 0; 4064 } 4065 4066 return QDF_STATUS_SUCCESS; 4067 } 4068 4069 QDF_STATUS 4070 wlan_mlme_cfg_get_vht_chan_width(struct wlan_objmgr_psoc *psoc, uint8_t *value) 4071 { 4072 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4073 4074 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4075 if (!mlme_obj) 4076 return QDF_STATUS_E_FAILURE; 4077 4078 *value = mlme_obj->cfg.vht_caps.vht_cap_info.supp_chan_width; 4079 4080 return QDF_STATUS_SUCCESS; 4081 } 4082 4083 QDF_STATUS wlan_mlme_cfg_set_vht_ldpc_coding_cap(struct wlan_objmgr_psoc *psoc, 4084 bool value) 4085 { 4086 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4087 4088 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4089 if (!mlme_obj) 4090 return QDF_STATUS_E_FAILURE; 4091 4092 mlme_obj->cfg.vht_caps.vht_cap_info.ldpc_coding_cap = value; 4093 4094 return QDF_STATUS_SUCCESS; 4095 } 4096 4097 QDF_STATUS 4098 wlan_mlme_cfg_set_short_gi_160_mhz(struct wlan_objmgr_psoc *psoc, 4099 bool value) 4100 { 4101 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4102 4103 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4104 if (!mlme_obj) 4105 return QDF_STATUS_E_FAILURE; 4106 4107 mlme_obj->cfg.vht_caps.vht_cap_info.short_gi_160mhz = value; 4108 4109 return QDF_STATUS_SUCCESS; 4110 } 4111 4112 QDF_STATUS 4113 wlan_mlme_cfg_get_short_gi_160_mhz(struct wlan_objmgr_psoc *psoc, bool *value) 4114 { 4115 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4116 4117 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4118 if (!mlme_obj) 4119 return QDF_STATUS_E_FAILURE; 4120 4121 *value = mlme_obj->cfg.vht_caps.vht_cap_info.short_gi_160mhz; 4122 4123 return QDF_STATUS_SUCCESS; 4124 } 4125 4126 QDF_STATUS 4127 wlan_mlme_cfg_get_vht_tx_stbc(struct wlan_objmgr_psoc *psoc, bool *value) 4128 { 4129 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4130 4131 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4132 if (!mlme_obj) 4133 return QDF_STATUS_E_FAILURE; 4134 4135 *value = mlme_obj->cfg.vht_caps.vht_cap_info.tx_stbc; 4136 4137 return QDF_STATUS_SUCCESS; 4138 } 4139 4140 QDF_STATUS 4141 wlan_mlme_cfg_get_vht_rx_stbc(struct wlan_objmgr_psoc *psoc, bool *value) 4142 { 4143 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4144 4145 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4146 if (!mlme_obj) 4147 return QDF_STATUS_E_FAILURE; 4148 4149 *value = mlme_obj->cfg.vht_caps.vht_cap_info.rx_stbc; 4150 4151 return QDF_STATUS_SUCCESS; 4152 } 4153 4154 QDF_STATUS 4155 wlan_mlme_cfg_set_vht_tx_bfee_ant_supp(struct wlan_objmgr_psoc *psoc, 4156 uint8_t value) 4157 { 4158 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4159 4160 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4161 if (!mlme_obj) 4162 return QDF_STATUS_E_FAILURE; 4163 4164 mlme_obj->cfg.vht_caps.vht_cap_info.tx_bfee_ant_supp = value; 4165 4166 return QDF_STATUS_SUCCESS; 4167 } 4168 4169 QDF_STATUS 4170 wlan_mlme_cfg_get_vht_tx_bfee_ant_supp(struct wlan_objmgr_psoc *psoc, 4171 uint8_t *value) 4172 { 4173 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4174 4175 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4176 if (!mlme_obj) 4177 return QDF_STATUS_E_FAILURE; 4178 4179 *value = mlme_obj->cfg.vht_caps.vht_cap_info.tx_bfee_ant_supp; 4180 4181 return QDF_STATUS_SUCCESS; 4182 } 4183 4184 QDF_STATUS wlan_mlme_cfg_get_vht_rx_mcs_map(struct wlan_objmgr_psoc *psoc, 4185 uint32_t *value) 4186 { 4187 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4188 4189 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4190 if (!mlme_obj) 4191 return QDF_STATUS_E_FAILURE; 4192 4193 *value = mlme_obj->cfg.vht_caps.vht_cap_info.rx_mcs_map; 4194 4195 return QDF_STATUS_SUCCESS; 4196 } 4197 4198 QDF_STATUS wlan_mlme_cfg_set_vht_rx_mcs_map(struct wlan_objmgr_psoc *psoc, 4199 uint32_t value) 4200 { 4201 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4202 4203 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4204 if (!mlme_obj) 4205 return QDF_STATUS_E_FAILURE; 4206 4207 mlme_obj->cfg.vht_caps.vht_cap_info.rx_mcs_map = value; 4208 4209 return QDF_STATUS_SUCCESS; 4210 } 4211 4212 QDF_STATUS wlan_mlme_cfg_get_vht_tx_mcs_map(struct wlan_objmgr_psoc *psoc, 4213 uint32_t *value) 4214 { 4215 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4216 4217 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4218 if (!mlme_obj) 4219 return QDF_STATUS_E_FAILURE; 4220 4221 *value = mlme_obj->cfg.vht_caps.vht_cap_info.tx_mcs_map; 4222 4223 return QDF_STATUS_SUCCESS; 4224 } 4225 4226 QDF_STATUS wlan_mlme_cfg_set_vht_tx_mcs_map(struct wlan_objmgr_psoc *psoc, 4227 uint32_t value) 4228 { 4229 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4230 4231 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4232 if (!mlme_obj) 4233 return QDF_STATUS_E_FAILURE; 4234 4235 mlme_obj->cfg.vht_caps.vht_cap_info.tx_mcs_map = value; 4236 4237 return QDF_STATUS_SUCCESS; 4238 } 4239 4240 QDF_STATUS 4241 wlan_mlme_cfg_set_vht_rx_supp_data_rate(struct wlan_objmgr_psoc *psoc, 4242 uint32_t value) 4243 { 4244 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4245 4246 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4247 if (!mlme_obj) 4248 return QDF_STATUS_E_FAILURE; 4249 4250 mlme_obj->cfg.vht_caps.vht_cap_info.rx_supp_data_rate = value; 4251 4252 return QDF_STATUS_SUCCESS; 4253 } 4254 4255 QDF_STATUS 4256 wlan_mlme_cfg_set_vht_tx_supp_data_rate(struct wlan_objmgr_psoc *psoc, 4257 uint32_t value) 4258 { 4259 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4260 4261 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4262 if (!mlme_obj) 4263 return QDF_STATUS_E_FAILURE; 4264 4265 mlme_obj->cfg.vht_caps.vht_cap_info.tx_supp_data_rate = value; 4266 4267 return QDF_STATUS_SUCCESS; 4268 } 4269 4270 QDF_STATUS 4271 wlan_mlme_cfg_get_vht_basic_mcs_set(struct wlan_objmgr_psoc *psoc, 4272 uint32_t *value) 4273 { 4274 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4275 4276 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4277 if (!mlme_obj) 4278 return QDF_STATUS_E_FAILURE; 4279 4280 *value = mlme_obj->cfg.vht_caps.vht_cap_info.basic_mcs_set; 4281 4282 return QDF_STATUS_SUCCESS; 4283 } 4284 4285 QDF_STATUS 4286 wlan_mlme_cfg_set_vht_basic_mcs_set(struct wlan_objmgr_psoc *psoc, 4287 uint32_t value) 4288 { 4289 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4290 4291 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4292 if (!mlme_obj) 4293 return QDF_STATUS_E_FAILURE; 4294 4295 mlme_obj->cfg.vht_caps.vht_cap_info.basic_mcs_set = value; 4296 4297 return QDF_STATUS_SUCCESS; 4298 } 4299 4300 QDF_STATUS 4301 wlan_mlme_get_vht_enable_tx_bf(struct wlan_objmgr_psoc *psoc, bool *value) 4302 { 4303 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4304 4305 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4306 if (!mlme_obj) 4307 return QDF_STATUS_E_FAILURE; 4308 4309 *value = mlme_obj->cfg.vht_caps.vht_cap_info.su_bformee; 4310 4311 return QDF_STATUS_SUCCESS; 4312 } 4313 4314 QDF_STATUS 4315 wlan_mlme_get_vht_tx_su_beamformer(struct wlan_objmgr_psoc *psoc, bool *value) 4316 { 4317 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4318 4319 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4320 if (!mlme_obj) 4321 return QDF_STATUS_E_FAILURE; 4322 4323 *value = mlme_obj->cfg.vht_caps.vht_cap_info.su_bformer; 4324 4325 return QDF_STATUS_SUCCESS; 4326 } 4327 4328 QDF_STATUS 4329 wlan_mlme_get_vht_channel_width(struct wlan_objmgr_psoc *psoc, uint8_t *value) 4330 { 4331 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4332 4333 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4334 if (!mlme_obj) 4335 return QDF_STATUS_E_FAILURE; 4336 4337 *value = mlme_obj->cfg.vht_caps.vht_cap_info.channel_width; 4338 4339 return QDF_STATUS_SUCCESS; 4340 } 4341 4342 4343 QDF_STATUS 4344 wlan_mlme_get_vht_rx_mcs_8_9(struct wlan_objmgr_psoc *psoc, uint8_t *value) 4345 { 4346 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4347 4348 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4349 if (!mlme_obj) 4350 return QDF_STATUS_E_FAILURE; 4351 4352 *value = mlme_obj->cfg.vht_caps.vht_cap_info.rx_mcs; 4353 4354 return QDF_STATUS_SUCCESS; 4355 } 4356 4357 QDF_STATUS 4358 wlan_mlme_get_vht_tx_mcs_8_9(struct wlan_objmgr_psoc *psoc, uint8_t *value) 4359 { 4360 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4361 4362 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4363 if (!mlme_obj) 4364 return QDF_STATUS_E_FAILURE; 4365 4366 *value = mlme_obj->cfg.vht_caps.vht_cap_info.tx_mcs; 4367 4368 return QDF_STATUS_SUCCESS; 4369 } 4370 4371 QDF_STATUS 4372 wlan_mlme_get_vht_rx_mcs_2x2(struct wlan_objmgr_psoc *psoc, uint8_t *value) 4373 { 4374 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4375 4376 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4377 if (!mlme_obj) 4378 return QDF_STATUS_E_FAILURE; 4379 4380 *value = mlme_obj->cfg.vht_caps.vht_cap_info.rx_mcs2x2; 4381 4382 return QDF_STATUS_SUCCESS; 4383 } 4384 4385 QDF_STATUS 4386 wlan_mlme_get_vht_tx_mcs_2x2(struct wlan_objmgr_psoc *psoc, uint8_t *value) 4387 { 4388 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4389 4390 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4391 if (!mlme_obj) 4392 return QDF_STATUS_E_FAILURE; 4393 4394 *value = mlme_obj->cfg.vht_caps.vht_cap_info.tx_mcs2x2; 4395 4396 return QDF_STATUS_SUCCESS; 4397 } 4398 4399 QDF_STATUS 4400 wlan_mlme_get_vht20_mcs9(struct wlan_objmgr_psoc *psoc, bool *value) 4401 { 4402 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4403 4404 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4405 if (!mlme_obj) 4406 return QDF_STATUS_E_FAILURE; 4407 4408 *value = mlme_obj->cfg.vht_caps.vht_cap_info.enable_vht20_mcs9; 4409 4410 return QDF_STATUS_SUCCESS; 4411 } 4412 4413 QDF_STATUS 4414 wlan_mlme_get_indoor_support_for_nan(struct wlan_objmgr_psoc *psoc, 4415 bool *value) 4416 { 4417 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4418 4419 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4420 if (!mlme_obj) { 4421 *value = false; 4422 mlme_legacy_err("Failed to get MLME Obj"); 4423 return QDF_STATUS_E_INVAL; 4424 } 4425 4426 *value = mlme_obj->cfg.reg.enable_nan_on_indoor_channels; 4427 4428 return QDF_STATUS_SUCCESS; 4429 } 4430 4431 QDF_STATUS 4432 wlan_mlme_get_srd_master_mode_for_vdev(struct wlan_objmgr_psoc *psoc, 4433 enum QDF_OPMODE vdev_opmode, 4434 bool *value) 4435 { 4436 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4437 4438 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4439 if (!mlme_obj) { 4440 *value = false; 4441 mlme_legacy_err("Failed to get MLME Obj"); 4442 return QDF_STATUS_E_INVAL; 4443 } 4444 4445 switch (vdev_opmode) { 4446 case QDF_SAP_MODE: 4447 *value = mlme_obj->cfg.reg.etsi_srd_chan_in_master_mode & 4448 MLME_SRD_MASTER_MODE_SAP; 4449 break; 4450 case QDF_P2P_GO_MODE: 4451 *value = mlme_obj->cfg.reg.etsi_srd_chan_in_master_mode & 4452 MLME_SRD_MASTER_MODE_P2P_GO; 4453 break; 4454 case QDF_NAN_DISC_MODE: 4455 *value = mlme_obj->cfg.reg.etsi_srd_chan_in_master_mode & 4456 MLME_SRD_MASTER_MODE_NAN; 4457 break; 4458 default: 4459 mlme_legacy_err("Unexpected opmode %d", vdev_opmode); 4460 *value = false; 4461 } 4462 4463 return QDF_STATUS_SUCCESS; 4464 } 4465 4466 QDF_STATUS 4467 wlan_mlme_get_enable_dynamic_nss_chains_cfg(struct wlan_objmgr_psoc *psoc, 4468 bool *value) 4469 { 4470 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4471 4472 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4473 if (!mlme_obj) 4474 return QDF_STATUS_E_FAILURE; 4475 4476 *value = mlme_obj->cfg.nss_chains_ini_cfg.enable_dynamic_nss_chains_cfg; 4477 4478 return QDF_STATUS_SUCCESS; 4479 } 4480 4481 QDF_STATUS 4482 wlan_mlme_get_restart_sap_on_dynamic_nss_chains_cfg( 4483 struct wlan_objmgr_psoc *psoc, 4484 bool *value) 4485 { 4486 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4487 4488 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4489 if (!mlme_obj) 4490 return QDF_STATUS_E_FAILURE; 4491 4492 *value = 4493 mlme_obj->cfg.nss_chains_ini_cfg.restart_sap_on_dyn_nss_chains_cfg; 4494 4495 return QDF_STATUS_SUCCESS; 4496 } 4497 4498 QDF_STATUS 4499 wlan_mlme_cfg_get_dynamic_nss_chains_support(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.dynamic_nss_chains_support; 4509 4510 return QDF_STATUS_SUCCESS; 4511 } 4512 4513 QDF_STATUS 4514 wlan_mlme_cfg_set_dynamic_nss_chains_support(struct wlan_objmgr_psoc *psoc, 4515 bool value) 4516 { 4517 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4518 4519 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4520 if (!mlme_obj) 4521 return QDF_STATUS_E_FAILURE; 4522 4523 mlme_obj->cfg.dynamic_nss_chains_support = value; 4524 4525 return QDF_STATUS_SUCCESS; 4526 } 4527 4528 QDF_STATUS 4529 wlan_mlme_get_vht_enable2x2(struct wlan_objmgr_psoc *psoc, bool *value) 4530 { 4531 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4532 4533 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4534 if (!mlme_obj) 4535 return QDF_STATUS_E_FAILURE; 4536 4537 *value = mlme_obj->cfg.vht_caps.vht_cap_info.enable2x2; 4538 4539 return QDF_STATUS_SUCCESS; 4540 } 4541 4542 QDF_STATUS 4543 wlan_mlme_get_force_sap_enabled(struct wlan_objmgr_psoc *psoc, bool *value) 4544 { 4545 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4546 4547 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4548 if (!mlme_obj) 4549 return QDF_STATUS_E_FAILURE; 4550 4551 *value = mlme_obj->cfg.acs.force_sap_start; 4552 4553 return QDF_STATUS_SUCCESS; 4554 } 4555 4556 QDF_STATUS 4557 wlan_mlme_set_vht_enable2x2(struct wlan_objmgr_psoc *psoc, bool value) 4558 { 4559 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4560 4561 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4562 if (!mlme_obj) 4563 return QDF_STATUS_E_FAILURE; 4564 4565 mlme_obj->cfg.vht_caps.vht_cap_info.enable2x2 = value; 4566 4567 return QDF_STATUS_SUCCESS; 4568 } 4569 4570 QDF_STATUS 4571 wlan_mlme_get_vht_enable_paid(struct wlan_objmgr_psoc *psoc, bool *value) 4572 { 4573 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4574 4575 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4576 if (!mlme_obj) 4577 return QDF_STATUS_E_FAILURE; 4578 4579 *value = mlme_obj->cfg.vht_caps.vht_cap_info.enable_paid; 4580 4581 return QDF_STATUS_SUCCESS; 4582 } 4583 4584 QDF_STATUS 4585 wlan_mlme_get_vht_enable_gid(struct wlan_objmgr_psoc *psoc, bool *value) 4586 { 4587 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4588 4589 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4590 if (!mlme_obj) 4591 return QDF_STATUS_E_FAILURE; 4592 4593 *value = mlme_obj->cfg.vht_caps.vht_cap_info.enable_gid; 4594 4595 return QDF_STATUS_SUCCESS; 4596 } 4597 4598 QDF_STATUS 4599 wlan_mlme_get_vht_for_24ghz(struct wlan_objmgr_psoc *psoc, bool *value) 4600 { 4601 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4602 4603 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4604 if (!mlme_obj) 4605 return QDF_STATUS_E_FAILURE; 4606 4607 *value = mlme_obj->cfg.vht_caps.vht_cap_info.b24ghz_band; 4608 4609 return QDF_STATUS_SUCCESS; 4610 } 4611 4612 QDF_STATUS 4613 wlan_mlme_set_vht_for_24ghz(struct wlan_objmgr_psoc *psoc, bool value) 4614 { 4615 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4616 4617 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4618 if (!mlme_obj) 4619 return QDF_STATUS_E_FAILURE; 4620 4621 mlme_obj->cfg.vht_caps.vht_cap_info.b24ghz_band = value; 4622 4623 return QDF_STATUS_SUCCESS; 4624 } 4625 4626 QDF_STATUS 4627 wlan_mlme_get_vendor_vht_for_24ghz(struct wlan_objmgr_psoc *psoc, bool *value) 4628 { 4629 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4630 4631 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4632 if (!mlme_obj) 4633 return QDF_STATUS_E_FAILURE; 4634 4635 *value = mlme_obj->cfg.vht_caps.vht_cap_info.vendor_24ghz_band; 4636 4637 return QDF_STATUS_SUCCESS; 4638 } 4639 4640 QDF_STATUS 4641 mlme_update_vht_cap(struct wlan_objmgr_psoc *psoc, struct wma_tgt_vht_cap *cfg) 4642 { 4643 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4644 struct mlme_vht_capabilities_info *vht_cap_info; 4645 uint32_t value = 0; 4646 bool hw_rx_ldpc_enabled; 4647 4648 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4649 if (!mlme_obj) 4650 return QDF_STATUS_E_FAILURE; 4651 4652 vht_cap_info = &mlme_obj->cfg.vht_caps.vht_cap_info; 4653 4654 /* 4655 * VHT max MPDU length: 4656 * override if user configured value is too high 4657 * that the target cannot support 4658 */ 4659 if (vht_cap_info->ampdu_len > cfg->vht_max_mpdu) 4660 vht_cap_info->ampdu_len = cfg->vht_max_mpdu; 4661 if (vht_cap_info->ampdu_len >= 1) 4662 mlme_obj->cfg.ht_caps.ht_cap_info.maximal_amsdu_size = 1; 4663 value = (CFG_VHT_BASIC_MCS_SET_STADEF & VHT_MCS_1x1) | 4664 vht_cap_info->basic_mcs_set; 4665 if (vht_cap_info->enable2x2) 4666 value = (value & VHT_MCS_2x2) | (vht_cap_info->rx_mcs2x2 << 2); 4667 vht_cap_info->basic_mcs_set = value; 4668 4669 value = (CFG_VHT_RX_MCS_MAP_STADEF & VHT_MCS_1x1) | 4670 vht_cap_info->rx_mcs; 4671 4672 if (vht_cap_info->enable2x2) 4673 value = (value & VHT_MCS_2x2) | (vht_cap_info->rx_mcs2x2 << 2); 4674 vht_cap_info->rx_mcs_map = value; 4675 4676 value = (CFG_VHT_TX_MCS_MAP_STADEF & VHT_MCS_1x1) | 4677 vht_cap_info->tx_mcs; 4678 if (vht_cap_info->enable2x2) 4679 value = (value & VHT_MCS_2x2) | (vht_cap_info->tx_mcs2x2 << 2); 4680 vht_cap_info->tx_mcs_map = value; 4681 4682 /* Set HW RX LDPC capability */ 4683 hw_rx_ldpc_enabled = !!cfg->vht_rx_ldpc; 4684 if (vht_cap_info->ldpc_coding_cap && !hw_rx_ldpc_enabled) 4685 vht_cap_info->ldpc_coding_cap = hw_rx_ldpc_enabled; 4686 4687 /* set the Guard interval 80MHz */ 4688 if (vht_cap_info->short_gi_80mhz && !cfg->vht_short_gi_80) 4689 vht_cap_info->short_gi_80mhz = cfg->vht_short_gi_80; 4690 4691 /* Set VHT TX/RX STBC cap */ 4692 if (vht_cap_info->enable2x2) { 4693 if (vht_cap_info->tx_stbc && !cfg->vht_tx_stbc) 4694 vht_cap_info->tx_stbc = cfg->vht_tx_stbc; 4695 4696 if (vht_cap_info->rx_stbc && !cfg->vht_rx_stbc) 4697 vht_cap_info->rx_stbc = cfg->vht_rx_stbc; 4698 } else { 4699 vht_cap_info->tx_stbc = 0; 4700 vht_cap_info->rx_stbc = 0; 4701 } 4702 4703 /* Set VHT SU Beamformer cap */ 4704 if (vht_cap_info->su_bformer && !cfg->vht_su_bformer) 4705 vht_cap_info->su_bformer = cfg->vht_su_bformer; 4706 4707 /* check and update SU BEAMFORMEE capabality */ 4708 if (vht_cap_info->su_bformee && !cfg->vht_su_bformee) 4709 vht_cap_info->su_bformee = cfg->vht_su_bformee; 4710 4711 /* Set VHT MU Beamformer cap */ 4712 if (vht_cap_info->mu_bformer && !cfg->vht_mu_bformer) 4713 vht_cap_info->mu_bformer = cfg->vht_mu_bformer; 4714 4715 /* Set VHT MU Beamformee cap */ 4716 if (vht_cap_info->enable_mu_bformee && !cfg->vht_mu_bformee) 4717 vht_cap_info->enable_mu_bformee = cfg->vht_mu_bformee; 4718 4719 /* 4720 * VHT max AMPDU len exp: 4721 * override if user configured value is too high 4722 * that the target cannot support. 4723 * Even though Rome publish ampdu_len=7, it can 4724 * only support 4 because of some h/w bug. 4725 */ 4726 if (vht_cap_info->ampdu_len_exponent > cfg->vht_max_ampdu_len_exp) 4727 vht_cap_info->ampdu_len_exponent = cfg->vht_max_ampdu_len_exp; 4728 4729 /* Set VHT TXOP PS CAP */ 4730 if (vht_cap_info->txop_ps && !cfg->vht_txop_ps) 4731 vht_cap_info->txop_ps = cfg->vht_txop_ps; 4732 4733 /* set the Guard interval 160MHz */ 4734 if (vht_cap_info->short_gi_160mhz && !cfg->vht_short_gi_160) 4735 vht_cap_info->short_gi_160mhz = cfg->vht_short_gi_160; 4736 4737 if (cfg_get(psoc, CFG_ENABLE_VHT_MCS_10_11)) 4738 vht_cap_info->vht_mcs_10_11_supp = cfg->vht_mcs_10_11_supp; 4739 4740 mlme_legacy_debug("vht_mcs_10_11_supp %d", 4741 vht_cap_info->vht_mcs_10_11_supp); 4742 4743 return QDF_STATUS_SUCCESS; 4744 } 4745 4746 QDF_STATUS mlme_update_nss_vht_cap(struct wlan_objmgr_psoc *psoc) 4747 { 4748 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4749 struct mlme_vht_capabilities_info *vht_cap_info; 4750 uint32_t temp = 0; 4751 4752 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4753 if (!mlme_obj) 4754 return QDF_STATUS_E_FAILURE; 4755 4756 vht_cap_info = &mlme_obj->cfg.vht_caps.vht_cap_info; 4757 4758 temp = vht_cap_info->basic_mcs_set; 4759 temp = (temp & 0xFFFC) | vht_cap_info->rx_mcs; 4760 if (vht_cap_info->enable2x2) 4761 temp = (temp & 0xFFF3) | (vht_cap_info->rx_mcs2x2 << 2); 4762 else 4763 temp |= 0x000C; 4764 4765 vht_cap_info->basic_mcs_set = temp; 4766 4767 temp = vht_cap_info->rx_mcs_map; 4768 temp = (temp & 0xFFFC) | vht_cap_info->rx_mcs; 4769 if (vht_cap_info->enable2x2) 4770 temp = (temp & 0xFFF3) | (vht_cap_info->rx_mcs2x2 << 2); 4771 else 4772 temp |= 0x000C; 4773 4774 vht_cap_info->rx_mcs_map = temp; 4775 4776 temp = vht_cap_info->tx_mcs_map; 4777 temp = (temp & 0xFFFC) | vht_cap_info->tx_mcs; 4778 if (vht_cap_info->enable2x2) 4779 temp = (temp & 0xFFF3) | (vht_cap_info->tx_mcs2x2 << 2); 4780 else 4781 temp |= 0x000C; 4782 4783 vht_cap_info->tx_mcs_map = temp; 4784 4785 return QDF_STATUS_SUCCESS; 4786 } 4787 4788 #ifdef WLAN_FEATURE_11BE 4789 bool mlme_get_bss_11be_allowed(struct wlan_objmgr_psoc *psoc, 4790 struct qdf_mac_addr *bssid, 4791 uint8_t *ie_data, 4792 uint32_t ie_length) 4793 { 4794 struct action_oui_search_attr search_attr; 4795 4796 if (wlan_action_oui_is_empty(psoc, ACTION_OUI_11BE_OUI_ALLOW)) 4797 return true; 4798 4799 qdf_mem_zero(&search_attr, sizeof(search_attr)); 4800 search_attr.ie_data = ie_data; 4801 search_attr.ie_length = ie_length; 4802 if (wlan_action_oui_search(psoc, &search_attr, 4803 ACTION_OUI_11BE_OUI_ALLOW)) 4804 return true; 4805 4806 mlme_legacy_debug("AP not in 11be oui allow list "QDF_MAC_ADDR_FMT, 4807 QDF_MAC_ADDR_REF(bssid->bytes)); 4808 4809 return false; 4810 } 4811 #endif 4812 4813 QDF_STATUS wlan_mlme_is_sap_uapsd_enabled(struct wlan_objmgr_psoc *psoc, 4814 bool *value) 4815 { 4816 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4817 4818 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4819 if (!mlme_obj) 4820 return QDF_STATUS_E_FAILURE; 4821 4822 *value = mlme_obj->cfg.qos_mlme_params.sap_uapsd_enabled; 4823 4824 return QDF_STATUS_SUCCESS; 4825 } 4826 4827 QDF_STATUS wlan_mlme_get_dtim_selection_diversity(struct wlan_objmgr_psoc *psoc, 4828 uint32_t *dtim_selection_div) 4829 { 4830 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4831 4832 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4833 if (!mlme_obj) { 4834 *dtim_selection_div = cfg_default(CFG_DTIM_SELECTION_DIVERSITY); 4835 return QDF_STATUS_E_FAILURE; 4836 } 4837 4838 *dtim_selection_div = mlme_obj->cfg.ps_params.dtim_selection_diversity; 4839 4840 return QDF_STATUS_SUCCESS; 4841 } 4842 4843 QDF_STATUS wlan_mlme_get_bmps_min_listen_interval(struct wlan_objmgr_psoc *psoc, 4844 uint32_t *value) 4845 { 4846 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4847 4848 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4849 if (!mlme_obj) { 4850 *value = cfg_default(CFG_BMPS_MINIMUM_LI); 4851 return QDF_STATUS_E_FAILURE; 4852 } 4853 4854 *value = mlme_obj->cfg.ps_params.bmps_min_listen_interval; 4855 4856 return QDF_STATUS_SUCCESS; 4857 } 4858 4859 QDF_STATUS wlan_mlme_get_bmps_max_listen_interval(struct wlan_objmgr_psoc *psoc, 4860 uint32_t *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 *value = cfg_default(CFG_BMPS_MAXIMUM_LI); 4867 return QDF_STATUS_E_FAILURE; 4868 } 4869 4870 *value = mlme_obj->cfg.ps_params.bmps_max_listen_interval; 4871 4872 return QDF_STATUS_SUCCESS; 4873 } 4874 4875 QDF_STATUS wlan_mlme_set_sap_uapsd_flag(struct wlan_objmgr_psoc *psoc, 4876 bool value) 4877 { 4878 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4879 4880 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4881 if (!mlme_obj) 4882 return QDF_STATUS_E_FAILURE; 4883 4884 mlme_obj->cfg.qos_mlme_params.sap_uapsd_enabled &= value; 4885 4886 return QDF_STATUS_SUCCESS; 4887 } 4888 4889 QDF_STATUS wlan_mlme_get_rrm_enabled(struct wlan_objmgr_psoc *psoc, 4890 bool *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 return QDF_STATUS_E_FAILURE; 4897 4898 *value = mlme_obj->cfg.rrm_config.rrm_enabled; 4899 return QDF_STATUS_SUCCESS; 4900 } 4901 4902 QDF_STATUS wlan_mlme_get_auto_bmps_timer_value(struct wlan_objmgr_psoc *psoc, 4903 uint32_t *value) 4904 { 4905 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4906 4907 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4908 if (!mlme_obj) { 4909 *value = cfg_default(CFG_AUTO_BMPS_ENABLE_TIMER); 4910 return QDF_STATUS_E_FAILURE; 4911 } 4912 4913 *value = mlme_obj->cfg.ps_params.auto_bmps_timer_val; 4914 4915 return QDF_STATUS_SUCCESS; 4916 } 4917 4918 QDF_STATUS wlan_mlme_is_bmps_enabled(struct wlan_objmgr_psoc *psoc, 4919 bool *value) 4920 { 4921 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4922 4923 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4924 if (!mlme_obj) { 4925 *value = cfg_default(CFG_ENABLE_PS); 4926 return QDF_STATUS_E_FAILURE; 4927 } 4928 4929 *value = mlme_obj->cfg.ps_params.is_bmps_enabled; 4930 4931 return QDF_STATUS_SUCCESS; 4932 } 4933 4934 QDF_STATUS wlan_mlme_is_imps_enabled(struct wlan_objmgr_psoc *psoc, 4935 bool *value) 4936 { 4937 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4938 4939 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4940 if (!mlme_obj) { 4941 *value = cfg_default(CFG_ENABLE_IMPS); 4942 return QDF_STATUS_E_FAILURE; 4943 } 4944 4945 *value = mlme_obj->cfg.ps_params.is_imps_enabled; 4946 4947 return QDF_STATUS_SUCCESS; 4948 } 4949 4950 QDF_STATUS wlan_mlme_override_bmps_imps(struct wlan_objmgr_psoc *psoc) 4951 { 4952 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4953 4954 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4955 if (!mlme_obj) 4956 return QDF_STATUS_E_FAILURE; 4957 4958 mlme_obj->cfg.ps_params.is_imps_enabled = 0; 4959 mlme_obj->cfg.ps_params.is_bmps_enabled = 0; 4960 4961 return QDF_STATUS_SUCCESS; 4962 } 4963 4964 void wlan_mlme_get_wps_uuid(struct wlan_mlme_wps_params *wps_params, 4965 uint8_t *data) 4966 { 4967 qdf_size_t len = wps_params->wps_uuid.len; 4968 4969 wlan_mlme_get_cfg_str(data, &wps_params->wps_uuid, &len); 4970 } 4971 4972 QDF_STATUS 4973 wlan_mlme_get_self_gen_frm_pwr(struct wlan_objmgr_psoc *psoc, 4974 uint32_t *value) 4975 { 4976 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4977 4978 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4979 if (!mlme_obj) { 4980 *value = cfg_default(CFG_SELF_GEN_FRM_PWR); 4981 mlme_legacy_err("Failed to get MLME Obj"); 4982 return QDF_STATUS_E_FAILURE; 4983 } 4984 4985 *value = mlme_obj->cfg.reg.self_gen_frm_pwr; 4986 4987 return QDF_STATUS_SUCCESS; 4988 } 4989 4990 QDF_STATUS 4991 wlan_mlme_get_4way_hs_offload(struct wlan_objmgr_psoc *psoc, uint32_t *value) 4992 { 4993 struct wlan_mlme_psoc_ext_obj *mlme_obj; 4994 4995 mlme_obj = mlme_get_psoc_ext_obj(psoc); 4996 if (!mlme_obj) { 4997 *value = cfg_default(CFG_DISABLE_4WAY_HS_OFFLOAD); 4998 mlme_legacy_err("Failed to get MLME Obj"); 4999 return QDF_STATUS_E_FAILURE; 5000 } 5001 5002 *value = mlme_obj->cfg.gen.disable_4way_hs_offload; 5003 5004 return QDF_STATUS_SUCCESS; 5005 } 5006 5007 QDF_STATUS 5008 wlan_mlme_get_bmiss_skip_full_scan_value(struct wlan_objmgr_psoc *psoc, 5009 bool *value) 5010 { 5011 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5012 5013 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5014 if (!mlme_obj) { 5015 *value = cfg_default(CFG_BMISS_SKIP_FULL_SCAN); 5016 mlme_legacy_err("Failed to get MLME Obj"); 5017 return QDF_STATUS_E_FAILURE; 5018 } 5019 5020 *value = mlme_obj->cfg.gen.bmiss_skip_full_scan; 5021 5022 return QDF_STATUS_SUCCESS; 5023 } 5024 5025 QDF_STATUS mlme_get_peer_phymode(struct wlan_objmgr_psoc *psoc, uint8_t *mac, 5026 enum wlan_phymode *peer_phymode) 5027 { 5028 struct wlan_objmgr_peer *peer; 5029 5030 peer = wlan_objmgr_get_peer_by_mac(psoc, mac, WLAN_MLME_NB_ID); 5031 if (!peer) { 5032 mlme_legacy_err("peer object is null"); 5033 return QDF_STATUS_E_NULL_VALUE; 5034 } 5035 5036 *peer_phymode = wlan_peer_get_phymode(peer); 5037 wlan_objmgr_peer_release_ref(peer, WLAN_MLME_NB_ID); 5038 5039 return QDF_STATUS_SUCCESS; 5040 } 5041 5042 QDF_STATUS mlme_set_tgt_wpa3_roam_cap(struct wlan_objmgr_psoc *psoc, 5043 uint32_t akm_bitmap) 5044 { 5045 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5046 5047 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5048 if (!mlme_obj) 5049 return QDF_STATUS_E_FAILURE; 5050 5051 mlme_obj->cfg.lfr.fw_akm_bitmap |= akm_bitmap; 5052 5053 return QDF_STATUS_SUCCESS; 5054 } 5055 5056 QDF_STATUS 5057 wlan_mlme_get_ignore_fw_reg_offload_ind(struct wlan_objmgr_psoc *psoc, 5058 bool *disabled) 5059 { 5060 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5061 5062 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5063 5064 if (!mlme_obj) 5065 return QDF_STATUS_E_FAILURE; 5066 5067 *disabled = mlme_obj->cfg.reg.ignore_fw_reg_offload_ind; 5068 return QDF_STATUS_SUCCESS; 5069 } 5070 5071 char *mlme_get_roam_status_str(uint32_t roam_status) 5072 { 5073 switch (roam_status) { 5074 case 0: 5075 return "SUCCESS"; 5076 case 1: 5077 return "FAILED"; 5078 case 2: 5079 return "NO ROAM"; 5080 default: 5081 return "UNKNOWN"; 5082 } 5083 } 5084 5085 char *mlme_get_roam_trigger_str(uint32_t roam_scan_trigger) 5086 { 5087 switch (roam_scan_trigger) { 5088 case WMI_ROAM_TRIGGER_REASON_PER: 5089 return "PER"; 5090 case WMI_ROAM_TRIGGER_REASON_BMISS: 5091 return "BEACON MISS"; 5092 case WMI_ROAM_TRIGGER_REASON_LOW_RSSI: 5093 return "LOW RSSI"; 5094 case WMI_ROAM_TRIGGER_REASON_HIGH_RSSI: 5095 return "HIGH RSSI"; 5096 case WMI_ROAM_TRIGGER_REASON_PERIODIC: 5097 return "PERIODIC SCAN"; 5098 case WMI_ROAM_TRIGGER_REASON_MAWC: 5099 return "MAWC"; 5100 case WMI_ROAM_TRIGGER_REASON_DENSE: 5101 return "DENSE ENVIRONMENT"; 5102 case WMI_ROAM_TRIGGER_REASON_BACKGROUND: 5103 return "BACKGROUND SCAN"; 5104 case WMI_ROAM_TRIGGER_REASON_FORCED: 5105 return "FORCED SCAN"; 5106 case WMI_ROAM_TRIGGER_REASON_BTM: 5107 return "BTM TRIGGER"; 5108 case WMI_ROAM_TRIGGER_REASON_UNIT_TEST: 5109 return "TEST COMMAND"; 5110 case WMI_ROAM_TRIGGER_REASON_BSS_LOAD: 5111 return "HIGH BSS LOAD"; 5112 case WMI_ROAM_TRIGGER_REASON_DEAUTH: 5113 return "DEAUTH RECEIVED"; 5114 case WMI_ROAM_TRIGGER_REASON_IDLE: 5115 return "IDLE STATE SCAN"; 5116 case WMI_ROAM_TRIGGER_REASON_STA_KICKOUT: 5117 return "STA KICKOUT"; 5118 case WMI_ROAM_TRIGGER_REASON_ESS_RSSI: 5119 return "ESS RSSI"; 5120 case WMI_ROAM_TRIGGER_REASON_WTC_BTM: 5121 return "WTC BTM"; 5122 case WMI_ROAM_TRIGGER_REASON_NONE: 5123 return "NONE"; 5124 case WMI_ROAM_TRIGGER_REASON_PMK_TIMEOUT: 5125 return "PMK Expired"; 5126 case WMI_ROAM_TRIGGER_REASON_BTC: 5127 return "BTC TRIGGER"; 5128 default: 5129 return "UNKNOWN"; 5130 } 5131 } 5132 5133 void mlme_get_converted_timestamp(uint32_t timestamp, char *time) 5134 { 5135 uint32_t hr, mins, secs; 5136 5137 secs = timestamp / 1000; 5138 mins = secs / 60; 5139 hr = mins / 60; 5140 qdf_snprint(time, TIME_STRING_LEN, "[%02d:%02d:%02d.%06u]", 5141 (hr % 24), (mins % 60), (secs % 60), 5142 (timestamp % 1000) * 1000); 5143 } 5144 5145 #if defined(WLAN_SAE_SINGLE_PMK) && defined(WLAN_FEATURE_ROAM_OFFLOAD) 5146 void wlan_mlme_set_sae_single_pmk_bss_cap(struct wlan_objmgr_psoc *psoc, 5147 uint8_t vdev_id, bool val) 5148 { 5149 struct mlme_legacy_priv *mlme_priv; 5150 struct wlan_objmgr_vdev *vdev; 5151 5152 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, 5153 WLAN_MLME_OBJMGR_ID); 5154 5155 if (!vdev) { 5156 mlme_err("get vdev failed"); 5157 return; 5158 } 5159 5160 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 5161 if (!mlme_priv) { 5162 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID); 5163 mlme_legacy_err("vdev legacy private object is NULL"); 5164 return; 5165 } 5166 5167 mlme_priv->mlme_roam.sae_single_pmk.sae_single_pmk_ap = val; 5168 5169 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID); 5170 } 5171 5172 void wlan_mlme_update_sae_single_pmk(struct wlan_objmgr_vdev *vdev, 5173 struct mlme_pmk_info *sae_single_pmk) 5174 { 5175 struct mlme_legacy_priv *mlme_priv; 5176 int32_t keymgmt; 5177 bool is_sae_connection = false; 5178 5179 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 5180 if (!mlme_priv) { 5181 mlme_legacy_err("vdev legacy private object is NULL"); 5182 return; 5183 } 5184 5185 keymgmt = wlan_crypto_get_param(vdev, WLAN_CRYPTO_PARAM_KEY_MGMT); 5186 if (keymgmt < 0) { 5187 mlme_legacy_err("Invalid mgmt cipher"); 5188 return; 5189 } 5190 5191 if (keymgmt & (1 << WLAN_CRYPTO_KEY_MGMT_SAE)) 5192 is_sae_connection = true; 5193 5194 mlme_legacy_debug("SAE_SPMK: single_pmk_ap:%d, is_sae_connection:%d, pmk_len:%d", 5195 mlme_priv->mlme_roam.sae_single_pmk.sae_single_pmk_ap, 5196 is_sae_connection, sae_single_pmk->pmk_len); 5197 5198 if (mlme_priv->mlme_roam.sae_single_pmk.sae_single_pmk_ap && 5199 is_sae_connection) 5200 mlme_priv->mlme_roam.sae_single_pmk.pmk_info = *sae_single_pmk; 5201 } 5202 5203 bool wlan_mlme_is_sae_single_pmk_enabled(struct wlan_objmgr_psoc *psoc) 5204 { 5205 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5206 5207 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5208 if (!mlme_obj) 5209 return cfg_default(CFG_SAE_SINGLE_PMK); 5210 5211 return mlme_obj->cfg.lfr.sae_single_pmk_feature_enabled; 5212 } 5213 5214 void wlan_mlme_get_sae_single_pmk_info(struct wlan_objmgr_vdev *vdev, 5215 struct wlan_mlme_sae_single_pmk *pmksa) 5216 { 5217 struct mlme_legacy_priv *mlme_priv; 5218 struct mlme_pmk_info *pmk_info; 5219 5220 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 5221 if (!mlme_priv) { 5222 mlme_legacy_err("vdev legacy private object is NULL"); 5223 return; 5224 } 5225 5226 pmk_info = &mlme_priv->mlme_roam.sae_single_pmk.pmk_info; 5227 5228 pmksa->sae_single_pmk_ap = 5229 mlme_priv->mlme_roam.sae_single_pmk.sae_single_pmk_ap; 5230 pmksa->pmk_info.spmk_timeout_period = pmk_info->spmk_timeout_period; 5231 pmksa->pmk_info.spmk_timestamp = pmk_info->spmk_timestamp; 5232 5233 if (pmk_info->pmk_len) { 5234 qdf_mem_copy(pmksa->pmk_info.pmk, pmk_info->pmk, 5235 pmk_info->pmk_len); 5236 pmksa->pmk_info.pmk_len = pmk_info->pmk_len; 5237 return; 5238 } 5239 5240 qdf_mem_zero(pmksa->pmk_info.pmk, sizeof(*pmksa->pmk_info.pmk)); 5241 pmksa->pmk_info.pmk_len = 0; 5242 } 5243 5244 void wlan_mlme_clear_sae_single_pmk_info(struct wlan_objmgr_vdev *vdev, 5245 struct mlme_pmk_info *pmk_recv) 5246 { 5247 struct mlme_legacy_priv *mlme_priv; 5248 struct wlan_mlme_sae_single_pmk *sae_single_pmk; 5249 5250 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 5251 if (!mlme_priv) { 5252 mlme_legacy_err("vdev legacy private object is NULL"); 5253 return; 5254 } 5255 5256 sae_single_pmk = &mlme_priv->mlme_roam.sae_single_pmk; 5257 5258 if (!pmk_recv) { 5259 /* Process flush pmk cmd */ 5260 mlme_legacy_debug("Flush sae_single_pmk info"); 5261 qdf_mem_zero(&sae_single_pmk->pmk_info, 5262 sizeof(sae_single_pmk->pmk_info)); 5263 } else if (pmk_recv->pmk_len != sae_single_pmk->pmk_info.pmk_len) { 5264 mlme_legacy_debug("Invalid pmk len"); 5265 return; 5266 } else if (!qdf_mem_cmp(&sae_single_pmk->pmk_info.pmk, pmk_recv->pmk, 5267 pmk_recv->pmk_len)) { 5268 /* Process delete pmk cmd */ 5269 mlme_legacy_debug("Clear sae_single_pmk info"); 5270 qdf_mem_zero(&sae_single_pmk->pmk_info, 5271 sizeof(sae_single_pmk->pmk_info)); 5272 } 5273 } 5274 #endif 5275 5276 char *mlme_get_roam_fail_reason_str(enum wlan_roam_failure_reason_code result) 5277 { 5278 switch (result) { 5279 case ROAM_FAIL_REASON_NO_SCAN_START: 5280 return "SCAN NOT STARTED"; 5281 case ROAM_FAIL_REASON_NO_AP_FOUND: 5282 return "NO AP FOUND"; 5283 case ROAM_FAIL_REASON_NO_CAND_AP_FOUND: 5284 return "NO CANDIDATE FOUND"; 5285 case ROAM_FAIL_REASON_HOST: 5286 return "HOST ABORTED"; 5287 case ROAM_FAIL_REASON_AUTH_SEND: 5288 return "Send AUTH Failed"; 5289 case ROAM_FAIL_REASON_AUTH_RECV: 5290 return "Received AUTH with FAILURE Status"; 5291 case ROAM_FAIL_REASON_NO_AUTH_RESP: 5292 return "No Auth response from AP"; 5293 case ROAM_FAIL_REASON_REASSOC_SEND: 5294 return "Send Re-assoc request failed"; 5295 case ROAM_FAIL_REASON_REASSOC_RECV: 5296 return "Received Re-Assoc resp with Failure status"; 5297 case ROAM_FAIL_REASON_NO_REASSOC_RESP: 5298 return "No Re-assoc response from AP"; 5299 case ROAM_FAIL_REASON_EAPOL_TIMEOUT: 5300 return "EAPOL M1 timed out"; 5301 case ROAM_FAIL_REASON_MLME: 5302 return "MLME error"; 5303 case ROAM_FAIL_REASON_INTERNAL_ABORT: 5304 return "Fw aborted roam"; 5305 case ROAM_FAIL_REASON_SCAN_START: 5306 return "Unable to start roam scan"; 5307 case ROAM_FAIL_REASON_AUTH_NO_ACK: 5308 return "No ACK for Auth req"; 5309 case ROAM_FAIL_REASON_AUTH_INTERNAL_DROP: 5310 return "Auth req dropped internally"; 5311 case ROAM_FAIL_REASON_REASSOC_NO_ACK: 5312 return "No ACK for Re-assoc req"; 5313 case ROAM_FAIL_REASON_REASSOC_INTERNAL_DROP: 5314 return "Re-assoc dropped internally"; 5315 case ROAM_FAIL_REASON_EAPOL_M2_SEND: 5316 return "Unable to send M2 frame"; 5317 case ROAM_FAIL_REASON_EAPOL_M2_INTERNAL_DROP: 5318 return "M2 Frame dropped internally"; 5319 case ROAM_FAIL_REASON_EAPOL_M2_NO_ACK: 5320 return "No ACK for M2 frame"; 5321 case ROAM_FAIL_REASON_EAPOL_M3_TIMEOUT: 5322 return "EAPOL M3 timed out"; 5323 case ROAM_FAIL_REASON_EAPOL_M4_SEND: 5324 return "Unable to send M4 frame"; 5325 case ROAM_FAIL_REASON_EAPOL_M4_INTERNAL_DROP: 5326 return "M4 frame dropped internally"; 5327 case ROAM_FAIL_REASON_EAPOL_M4_NO_ACK: 5328 return "No ACK for M4 frame"; 5329 case ROAM_FAIL_REASON_NO_SCAN_FOR_FINAL_BMISS: 5330 return "No scan on final BMISS"; 5331 case ROAM_FAIL_REASON_DISCONNECT: 5332 return "Disconnect received during handoff"; 5333 case ROAM_FAIL_REASON_SYNC: 5334 return "Previous roam sync pending"; 5335 case ROAM_FAIL_REASON_SAE_INVALID_PMKID: 5336 return "Reason assoc reject - invalid PMKID"; 5337 case ROAM_FAIL_REASON_SAE_PREAUTH_TIMEOUT: 5338 return "SAE preauth timed out"; 5339 case ROAM_FAIL_REASON_SAE_PREAUTH_FAIL: 5340 return "SAE preauth failed"; 5341 case ROAM_FAIL_REASON_UNABLE_TO_START_ROAM_HO: 5342 return "Start handoff failed- internal error"; 5343 case ROAM_FAIL_REASON_NO_AP_FOUND_AND_FINAL_BMISS_SENT: 5344 return "No AP found on final BMISS"; 5345 case ROAM_FAIL_REASON_NO_CAND_AP_FOUND_AND_FINAL_BMISS_SENT: 5346 return "No Candidate AP found on final BMISS"; 5347 case ROAM_FAIL_REASON_CURR_AP_STILL_OK: 5348 return "CURRENT AP STILL OK"; 5349 default: 5350 return "UNKNOWN"; 5351 } 5352 } 5353 5354 char *mlme_get_sub_reason_str(enum roam_trigger_sub_reason sub_reason) 5355 { 5356 switch (sub_reason) { 5357 case ROAM_TRIGGER_SUB_REASON_PERIODIC_TIMER: 5358 return "PERIODIC TIMER"; 5359 case ROAM_TRIGGER_SUB_REASON_LOW_RSSI_PERIODIC: 5360 return "LOW RSSI PERIODIC TIMER1"; 5361 case ROAM_TRIGGER_SUB_REASON_BTM_DI_TIMER: 5362 return "BTM DISASSOC IMMINENT TIMER"; 5363 case ROAM_TRIGGER_SUB_REASON_FULL_SCAN: 5364 return "FULL SCAN"; 5365 case ROAM_TRIGGER_SUB_REASON_CU_PERIODIC: 5366 return "CU PERIODIC Timer1"; 5367 case ROAM_TRIGGER_SUB_REASON_INACTIVITY_TIMER_LOW_RSSI: 5368 return "LOW RSSI INACTIVE TIMER"; 5369 case ROAM_TRIGGER_SUB_REASON_PERIODIC_TIMER_AFTER_INACTIVITY_CU: 5370 return "CU PERIODIC TIMER2"; 5371 case ROAM_TRIGGER_SUB_REASON_PERIODIC_TIMER_AFTER_INACTIVITY: 5372 return "LOW RSSI PERIODIC TIMER2"; 5373 case ROAM_TRIGGER_SUB_REASON_INACTIVITY_TIMER_CU: 5374 return "CU INACTIVITY TIMER"; 5375 default: 5376 return "NONE"; 5377 } 5378 } 5379 5380 QDF_STATUS 5381 wlan_mlme_get_mgmt_max_retry(struct wlan_objmgr_psoc *psoc, 5382 uint8_t *max_retry) 5383 { 5384 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5385 5386 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5387 5388 if (!mlme_obj) { 5389 *max_retry = cfg_default(CFG_MGMT_RETRY_MAX); 5390 return QDF_STATUS_E_FAILURE; 5391 } 5392 5393 *max_retry = mlme_obj->cfg.gen.mgmt_retry_max; 5394 return QDF_STATUS_SUCCESS; 5395 } 5396 5397 QDF_STATUS 5398 wlan_mlme_get_mgmt_6ghz_rate_support(struct wlan_objmgr_psoc *psoc, 5399 bool *enable_he_mcs0_for_6ghz_mgmt) 5400 { 5401 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5402 5403 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5404 5405 if (!mlme_obj) { 5406 *enable_he_mcs0_for_6ghz_mgmt = 5407 cfg_default(CFG_ENABLE_HE_MCS0_MGMT_6GHZ); 5408 return QDF_STATUS_E_FAILURE; 5409 } 5410 5411 *enable_he_mcs0_for_6ghz_mgmt = 5412 mlme_obj->cfg.gen.enable_he_mcs0_for_6ghz_mgmt; 5413 return QDF_STATUS_SUCCESS; 5414 } 5415 5416 QDF_STATUS 5417 wlan_mlme_get_status_ring_buffer(struct wlan_objmgr_psoc *psoc, 5418 bool *enable_ring_buffer) 5419 { 5420 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5421 5422 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5423 5424 if (!mlme_obj) { 5425 *enable_ring_buffer = cfg_default(CFG_ENABLE_RING_BUFFER); 5426 return QDF_STATUS_E_FAILURE; 5427 } 5428 5429 *enable_ring_buffer = mlme_obj->cfg.gen.enable_ring_buffer; 5430 return QDF_STATUS_SUCCESS; 5431 } 5432 5433 bool wlan_mlme_get_peer_unmap_conf(struct wlan_objmgr_psoc *psoc) 5434 { 5435 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5436 5437 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5438 if (!mlme_obj) 5439 return false; 5440 5441 return mlme_obj->cfg.gen.enable_peer_unmap_conf_support; 5442 } 5443 5444 #ifdef WLAN_FEATURE_ROAM_OFFLOAD 5445 QDF_STATUS 5446 wlan_mlme_get_roam_reason_vsie_status(struct wlan_objmgr_psoc *psoc, 5447 uint8_t *roam_reason_vsie_enable) 5448 { 5449 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5450 5451 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5452 if (!mlme_obj) { 5453 *roam_reason_vsie_enable = 5454 cfg_default(CFG_ENABLE_ROAM_REASON_VSIE); 5455 return QDF_STATUS_E_FAILURE; 5456 } 5457 5458 *roam_reason_vsie_enable = mlme_obj->cfg.lfr.enable_roam_reason_vsie; 5459 return QDF_STATUS_SUCCESS; 5460 } 5461 5462 QDF_STATUS 5463 wlan_mlme_set_roam_reason_vsie_status(struct wlan_objmgr_psoc *psoc, 5464 uint8_t roam_reason_vsie_enable) 5465 { 5466 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5467 5468 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5469 if (!mlme_obj) 5470 return QDF_STATUS_E_FAILURE; 5471 5472 mlme_obj->cfg.lfr.enable_roam_reason_vsie = roam_reason_vsie_enable; 5473 return QDF_STATUS_SUCCESS; 5474 } 5475 5476 uint32_t wlan_mlme_get_roaming_triggers(struct wlan_objmgr_psoc *psoc) 5477 { 5478 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5479 5480 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5481 if (!mlme_obj) 5482 return cfg_default(CFG_ROAM_TRIGGER_BITMAP); 5483 5484 return mlme_obj->cfg.lfr.roam_trigger_bitmap; 5485 } 5486 5487 void wlan_mlme_set_roaming_triggers(struct wlan_objmgr_psoc *psoc, 5488 uint32_t trigger_bitmap) 5489 { 5490 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5491 5492 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5493 if (!mlme_obj) 5494 return; 5495 5496 mlme_obj->cfg.lfr.roam_trigger_bitmap = trigger_bitmap; 5497 } 5498 5499 QDF_STATUS 5500 wlan_mlme_get_roaming_offload(struct wlan_objmgr_psoc *psoc, 5501 bool *val) 5502 { 5503 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5504 5505 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5506 if (!mlme_obj) { 5507 *val = cfg_default(CFG_LFR3_ROAMING_OFFLOAD); 5508 return QDF_STATUS_E_INVAL; 5509 } 5510 5511 *val = mlme_obj->cfg.lfr.lfr3_roaming_offload; 5512 5513 return QDF_STATUS_SUCCESS; 5514 } 5515 5516 QDF_STATUS 5517 wlan_mlme_get_enable_disconnect_roam_offload(struct wlan_objmgr_psoc *psoc, 5518 bool *val) 5519 { 5520 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5521 5522 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5523 if (!mlme_obj) { 5524 *val = cfg_default(CFG_LFR_ENABLE_DISCONNECT_ROAM); 5525 return QDF_STATUS_E_INVAL; 5526 } 5527 5528 *val = mlme_obj->cfg.lfr.enable_disconnect_roam_offload; 5529 5530 return QDF_STATUS_SUCCESS; 5531 } 5532 5533 QDF_STATUS 5534 wlan_mlme_get_enable_idle_roam(struct wlan_objmgr_psoc *psoc, bool *val) 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 *val = cfg_default(CFG_LFR_ENABLE_IDLE_ROAM); 5541 return QDF_STATUS_E_INVAL; 5542 } 5543 5544 *val = mlme_obj->cfg.lfr.enable_idle_roam; 5545 5546 return QDF_STATUS_SUCCESS; 5547 } 5548 5549 QDF_STATUS 5550 wlan_mlme_get_idle_roam_rssi_delta(struct wlan_objmgr_psoc *psoc, uint32_t *val) 5551 { 5552 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5553 5554 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5555 if (!mlme_obj) { 5556 *val = cfg_default(CFG_LFR_IDLE_ROAM_RSSI_DELTA); 5557 return QDF_STATUS_E_INVAL; 5558 } 5559 5560 *val = mlme_obj->cfg.lfr.idle_roam_rssi_delta; 5561 5562 return QDF_STATUS_SUCCESS; 5563 } 5564 5565 QDF_STATUS 5566 wlan_mlme_get_roam_info_stats_num(struct wlan_objmgr_psoc *psoc, uint32_t *val) 5567 { 5568 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5569 5570 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5571 if (!mlme_obj) { 5572 *val = cfg_default(CFG_LFR3_ROAM_INFO_STATS_NUM); 5573 return QDF_STATUS_E_INVAL; 5574 } 5575 5576 *val = mlme_obj->cfg.lfr.roam_info_stats_num; 5577 5578 return QDF_STATUS_SUCCESS; 5579 } 5580 5581 QDF_STATUS 5582 wlan_mlme_get_idle_roam_inactive_time(struct wlan_objmgr_psoc *psoc, 5583 uint32_t *val) 5584 { 5585 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5586 5587 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5588 if (!mlme_obj) { 5589 *val = cfg_default(CFG_LFR_IDLE_ROAM_INACTIVE_TIME); 5590 return QDF_STATUS_E_INVAL; 5591 } 5592 5593 *val = mlme_obj->cfg.lfr.idle_roam_inactive_time; 5594 5595 return QDF_STATUS_SUCCESS; 5596 } 5597 5598 QDF_STATUS 5599 wlan_mlme_get_idle_data_packet_count(struct wlan_objmgr_psoc *psoc, 5600 uint32_t *val) 5601 { 5602 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5603 5604 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5605 if (!mlme_obj) { 5606 *val = cfg_default(CFG_LFR_IDLE_ROAM_PACKET_COUNT); 5607 return QDF_STATUS_E_INVAL; 5608 } 5609 5610 *val = mlme_obj->cfg.lfr.idle_data_packet_count; 5611 5612 return QDF_STATUS_SUCCESS; 5613 } 5614 5615 QDF_STATUS 5616 wlan_mlme_get_idle_roam_min_rssi(struct wlan_objmgr_psoc *psoc, uint32_t *val) 5617 { 5618 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5619 5620 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5621 if (!mlme_obj) { 5622 *val = cfg_default(CFG_LFR_IDLE_ROAM_MIN_RSSI); 5623 return QDF_STATUS_E_INVAL; 5624 } 5625 5626 *val = mlme_obj->cfg.lfr.idle_roam_min_rssi; 5627 5628 return QDF_STATUS_SUCCESS; 5629 } 5630 5631 QDF_STATUS 5632 wlan_mlme_get_idle_roam_band(struct wlan_objmgr_psoc *psoc, uint32_t *val) 5633 { 5634 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5635 5636 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5637 if (!mlme_obj) { 5638 *val = cfg_default(CFG_LFR_IDLE_ROAM_BAND); 5639 return QDF_STATUS_E_INVAL; 5640 } 5641 5642 *val = mlme_obj->cfg.lfr.idle_roam_band; 5643 5644 return QDF_STATUS_SUCCESS; 5645 } 5646 5647 QDF_STATUS 5648 wlan_mlme_get_self_bss_roam(struct wlan_objmgr_psoc *psoc, 5649 uint8_t *enable_self_bss_roam) 5650 { 5651 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5652 5653 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5654 5655 if (!mlme_obj) { 5656 *enable_self_bss_roam = 5657 cfg_get(psoc, CFG_LFR3_ENABLE_SELF_BSS_ROAM); 5658 return QDF_STATUS_E_FAILURE; 5659 } 5660 5661 *enable_self_bss_roam = mlme_obj->cfg.lfr.enable_self_bss_roam; 5662 5663 return QDF_STATUS_SUCCESS; 5664 } 5665 #endif 5666 5667 QDF_STATUS 5668 wlan_mlme_get_peer_indicated_ch_width(struct wlan_objmgr_psoc *psoc, 5669 struct peer_oper_mode_event *data) 5670 { 5671 struct wlan_objmgr_peer *peer; 5672 struct peer_mlme_priv_obj *peer_priv; 5673 QDF_STATUS status = QDF_STATUS_SUCCESS; 5674 5675 if (!data) { 5676 mlme_err("Data params is NULL"); 5677 return QDF_STATUS_E_INVAL; 5678 } 5679 5680 peer = wlan_objmgr_get_peer_by_mac(psoc, data->peer_mac_address.bytes, 5681 WLAN_MLME_NB_ID); 5682 if (!peer) { 5683 mlme_err("peer not found for mac: " QDF_MAC_ADDR_FMT, 5684 QDF_MAC_ADDR_REF(data->peer_mac_address.bytes)); 5685 return QDF_STATUS_E_NULL_VALUE; 5686 } 5687 5688 peer_priv = wlan_objmgr_peer_get_comp_private_obj(peer, 5689 WLAN_UMAC_COMP_MLME); 5690 if (!peer_priv) { 5691 mlme_err("peer priv not found for mac: " QDF_MAC_ADDR_FMT, 5692 QDF_MAC_ADDR_REF(peer->macaddr)); 5693 status = QDF_STATUS_E_NULL_VALUE; 5694 goto done; 5695 } 5696 5697 if (peer_priv->peer_ind_bw == CH_WIDTH_INVALID) { 5698 status = QDF_STATUS_E_INVAL; 5699 goto done; 5700 } 5701 5702 data->new_bw = peer_priv->peer_ind_bw; 5703 5704 done: 5705 wlan_objmgr_peer_release_ref(peer, WLAN_MLME_NB_ID); 5706 5707 return status; 5708 } 5709 5710 QDF_STATUS 5711 wlan_mlme_set_peer_indicated_ch_width(struct wlan_objmgr_psoc *psoc, 5712 struct peer_oper_mode_event *data) 5713 { 5714 struct wlan_objmgr_peer *peer; 5715 struct peer_mlme_priv_obj *peer_priv; 5716 QDF_STATUS status = QDF_STATUS_SUCCESS; 5717 5718 if (!data) { 5719 mlme_err("Data params is NULL"); 5720 return QDF_STATUS_E_INVAL; 5721 } 5722 5723 peer = wlan_objmgr_get_peer_by_mac(psoc, data->peer_mac_address.bytes, 5724 WLAN_MLME_NB_ID); 5725 if (!peer) { 5726 mlme_err("peer not found for mac: " QDF_MAC_ADDR_FMT, 5727 QDF_MAC_ADDR_REF(data->peer_mac_address.bytes)); 5728 return QDF_STATUS_E_NULL_VALUE; 5729 } 5730 5731 peer_priv = wlan_objmgr_peer_get_comp_private_obj(peer, 5732 WLAN_UMAC_COMP_MLME); 5733 if (!peer_priv) { 5734 mlme_err("peer priv not found for mac: " QDF_MAC_ADDR_FMT, 5735 QDF_MAC_ADDR_REF(peer->macaddr)); 5736 status = QDF_STATUS_E_NULL_VALUE; 5737 goto done; 5738 } 5739 5740 peer_priv->peer_ind_bw = 5741 target_if_wmi_chan_width_to_phy_ch_width(data->new_bw); 5742 5743 done: 5744 wlan_objmgr_peer_release_ref(peer, WLAN_MLME_NB_ID); 5745 5746 return status; 5747 } 5748 5749 QDF_STATUS 5750 wlan_mlme_set_ft_over_ds(struct wlan_objmgr_psoc *psoc, 5751 uint8_t ft_over_ds_enable) 5752 { 5753 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5754 5755 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5756 if (!mlme_obj) 5757 return QDF_STATUS_E_FAILURE; 5758 5759 mlme_obj->cfg.lfr.enable_ft_over_ds = ft_over_ds_enable; 5760 return QDF_STATUS_SUCCESS; 5761 } 5762 5763 QDF_STATUS 5764 wlan_mlme_get_dfs_chan_ageout_time(struct wlan_objmgr_psoc *psoc, 5765 uint8_t *dfs_chan_ageout_time) 5766 { 5767 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5768 5769 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5770 5771 if (!mlme_obj) { 5772 *dfs_chan_ageout_time = 5773 cfg_default(CFG_DFS_CHAN_AGEOUT_TIME); 5774 return QDF_STATUS_E_FAILURE; 5775 } 5776 5777 *dfs_chan_ageout_time = mlme_obj->cfg.gen.dfs_chan_ageout_time; 5778 5779 return QDF_STATUS_SUCCESS; 5780 } 5781 5782 #ifdef WLAN_FEATURE_SAE 5783 5784 #define NUM_RETRY_BITS 3 5785 #define ROAM_AUTH_INDEX 2 5786 #define ASSOC_INDEX 1 5787 #define AUTH_INDEX 0 5788 #define MAX_RETRIES 2 5789 #define MAX_ROAM_AUTH_RETRIES 1 5790 #define MAX_AUTH_RETRIES 3 5791 5792 QDF_STATUS 5793 wlan_mlme_get_sae_assoc_retry_count(struct wlan_objmgr_psoc *psoc, 5794 uint8_t *retry_count) 5795 { 5796 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5797 5798 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5799 5800 if (!mlme_obj) { 5801 *retry_count = 0; 5802 return QDF_STATUS_E_FAILURE; 5803 } 5804 5805 *retry_count = 5806 QDF_GET_BITS(mlme_obj->cfg.gen.sae_connect_retries, 5807 ASSOC_INDEX * NUM_RETRY_BITS, NUM_RETRY_BITS); 5808 5809 *retry_count = QDF_MIN(MAX_RETRIES, *retry_count); 5810 5811 return QDF_STATUS_SUCCESS; 5812 } 5813 5814 QDF_STATUS 5815 wlan_mlme_get_sae_auth_retry_count(struct wlan_objmgr_psoc *psoc, 5816 uint8_t *retry_count) 5817 { 5818 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5819 5820 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5821 5822 if (!mlme_obj) { 5823 *retry_count = 0; 5824 return QDF_STATUS_E_FAILURE; 5825 } 5826 5827 *retry_count = 5828 QDF_GET_BITS(mlme_obj->cfg.gen.sae_connect_retries, 5829 AUTH_INDEX * NUM_RETRY_BITS, NUM_RETRY_BITS); 5830 5831 *retry_count = QDF_MIN(MAX_AUTH_RETRIES, *retry_count); 5832 5833 return QDF_STATUS_SUCCESS; 5834 } 5835 5836 QDF_STATUS 5837 wlan_mlme_get_sae_roam_auth_retry_count(struct wlan_objmgr_psoc *psoc, 5838 uint8_t *retry_count) 5839 { 5840 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5841 5842 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5843 5844 if (!mlme_obj) { 5845 *retry_count = 0; 5846 return QDF_STATUS_E_FAILURE; 5847 } 5848 5849 *retry_count = 5850 QDF_GET_BITS(mlme_obj->cfg.gen.sae_connect_retries, 5851 ROAM_AUTH_INDEX * NUM_RETRY_BITS, NUM_RETRY_BITS); 5852 5853 *retry_count = QDF_MIN(MAX_ROAM_AUTH_RETRIES, *retry_count); 5854 5855 return QDF_STATUS_SUCCESS; 5856 } 5857 5858 #endif 5859 5860 #ifdef WLAN_FEATURE_ROAM_OFFLOAD 5861 bool 5862 wlan_mlme_get_dual_sta_roaming_enabled(struct wlan_objmgr_psoc *psoc) 5863 { 5864 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5865 bool dual_sta_roaming_enabled; 5866 5867 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5868 5869 if (!mlme_obj) 5870 return cfg_default(CFG_ENABLE_DUAL_STA_ROAM_OFFLOAD); 5871 5872 dual_sta_roaming_enabled = 5873 mlme_obj->cfg.lfr.lfr3_roaming_offload && 5874 mlme_obj->cfg.lfr.lfr3_dual_sta_roaming_enabled && 5875 wlan_mlme_get_dual_sta_roam_support(psoc) && 5876 policy_mgr_is_hw_dbs_capable(psoc); 5877 5878 return dual_sta_roaming_enabled; 5879 } 5880 #endif 5881 5882 QDF_STATUS 5883 wlan_mlme_get_roam_scan_offload_enabled(struct wlan_objmgr_psoc *psoc, 5884 bool *val) 5885 { 5886 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5887 5888 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5889 if (!mlme_obj) { 5890 *val = cfg_default(CFG_LFR_ROAM_SCAN_OFFLOAD_ENABLED); 5891 return QDF_STATUS_E_INVAL; 5892 } 5893 5894 *val = mlme_obj->cfg.lfr.roam_scan_offload_enabled; 5895 5896 return QDF_STATUS_SUCCESS; 5897 } 5898 5899 QDF_STATUS 5900 wlan_mlme_get_roam_bmiss_final_bcnt(struct wlan_objmgr_psoc *psoc, 5901 uint8_t *val) 5902 { 5903 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5904 5905 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5906 if (!mlme_obj) { 5907 *val = cfg_default(CFG_LFR_ROAM_BMISS_FINAL_BCNT); 5908 return QDF_STATUS_E_INVAL; 5909 } 5910 5911 *val = mlme_obj->cfg.lfr.roam_bmiss_final_bcnt; 5912 5913 return QDF_STATUS_SUCCESS; 5914 } 5915 5916 QDF_STATUS 5917 wlan_mlme_get_bmiss_timeout_on_wakeup(struct wlan_objmgr_psoc *psoc, 5918 uint8_t *val) 5919 { 5920 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5921 5922 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5923 if (!mlme_obj) { 5924 *val = cfg_default(CFG_LFR_BEACONLOSS_TIMEOUT_ON_WAKEUP); 5925 return QDF_STATUS_E_INVAL; 5926 } 5927 5928 *val = mlme_obj->cfg.lfr.beaconloss_timeout_onwakeup; 5929 5930 return QDF_STATUS_SUCCESS; 5931 } 5932 5933 QDF_STATUS 5934 wlan_mlme_get_bmiss_timeout_on_sleep(struct wlan_objmgr_psoc *psoc, 5935 uint8_t *val) 5936 { 5937 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5938 5939 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5940 if (!mlme_obj) { 5941 *val = cfg_default(CFG_LFR_BEACONLOSS_TIMEOUT_ON_SLEEP); 5942 return QDF_STATUS_E_INVAL; 5943 } 5944 5945 *val = mlme_obj->cfg.lfr.beaconloss_timeout_onsleep; 5946 5947 return QDF_STATUS_SUCCESS; 5948 } 5949 5950 QDF_STATUS 5951 wlan_mlme_get_roam_bmiss_first_bcnt(struct wlan_objmgr_psoc *psoc, 5952 uint8_t *val) 5953 { 5954 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5955 5956 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5957 if (!mlme_obj) { 5958 *val = cfg_default(CFG_LFR_ROAM_BMISS_FIRST_BCNT); 5959 return QDF_STATUS_E_INVAL; 5960 } 5961 5962 *val = mlme_obj->cfg.lfr.roam_bmiss_first_bcnt; 5963 5964 return QDF_STATUS_SUCCESS; 5965 } 5966 5967 #ifdef WLAN_ADAPTIVE_11R 5968 bool wlan_mlme_adaptive_11r_enabled(struct wlan_objmgr_psoc *psoc) 5969 { 5970 struct wlan_mlme_psoc_ext_obj *mlme_obj; 5971 5972 mlme_obj = mlme_get_psoc_ext_obj(psoc); 5973 if (!mlme_obj) 5974 return cfg_default(CFG_ADAPTIVE_11R); 5975 5976 return mlme_obj->cfg.lfr.enable_adaptive_11r; 5977 } 5978 #endif 5979 5980 QDF_STATUS 5981 wlan_mlme_get_mawc_enabled(struct wlan_objmgr_psoc *psoc, bool *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_MAWC_FEATURE_ENABLED); 5988 return QDF_STATUS_E_INVAL; 5989 } 5990 5991 *val = mlme_obj->cfg.lfr.mawc_enabled; 5992 5993 return QDF_STATUS_SUCCESS; 5994 } 5995 5996 QDF_STATUS 5997 wlan_mlme_get_mawc_roam_enabled(struct wlan_objmgr_psoc *psoc, bool *val) 5998 { 5999 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6000 6001 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6002 if (!mlme_obj) { 6003 *val = cfg_default(CFG_LFR_MAWC_ROAM_ENABLED); 6004 return QDF_STATUS_E_INVAL; 6005 } 6006 6007 *val = mlme_obj->cfg.lfr.mawc_roam_enabled; 6008 6009 return QDF_STATUS_SUCCESS; 6010 } 6011 6012 QDF_STATUS 6013 wlan_mlme_get_mawc_roam_traffic_threshold(struct wlan_objmgr_psoc *psoc, 6014 uint32_t *val) 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 *val = cfg_default(CFG_LFR_MAWC_ROAM_TRAFFIC_THRESHOLD); 6021 return QDF_STATUS_E_INVAL; 6022 } 6023 6024 *val = mlme_obj->cfg.lfr.mawc_roam_traffic_threshold; 6025 6026 return QDF_STATUS_SUCCESS; 6027 } 6028 6029 QDF_STATUS 6030 wlan_mlme_get_mawc_roam_ap_rssi_threshold(struct wlan_objmgr_psoc *psoc, 6031 uint32_t *val) 6032 { 6033 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6034 6035 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6036 if (!mlme_obj) { 6037 *val = cfg_default(CFG_LFR_MAWC_ROAM_AP_RSSI_THRESHOLD); 6038 return QDF_STATUS_E_INVAL; 6039 } 6040 6041 *val = mlme_obj->cfg.lfr.mawc_roam_ap_rssi_threshold; 6042 6043 return QDF_STATUS_SUCCESS; 6044 } 6045 6046 QDF_STATUS 6047 wlan_mlme_get_mawc_roam_rssi_high_adjust(struct wlan_objmgr_psoc *psoc, 6048 uint8_t *val) 6049 { 6050 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6051 6052 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6053 if (!mlme_obj) { 6054 *val = cfg_default(CFG_LFR_MAWC_ROAM_RSSI_HIGH_ADJUST); 6055 return QDF_STATUS_E_INVAL; 6056 } 6057 6058 *val = mlme_obj->cfg.lfr.mawc_roam_rssi_high_adjust; 6059 6060 return QDF_STATUS_SUCCESS; 6061 } 6062 6063 QDF_STATUS 6064 wlan_mlme_get_mawc_roam_rssi_low_adjust(struct wlan_objmgr_psoc *psoc, 6065 uint8_t *val) 6066 { 6067 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6068 6069 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6070 if (!mlme_obj) { 6071 *val = cfg_default(CFG_LFR_MAWC_ROAM_RSSI_LOW_ADJUST); 6072 return QDF_STATUS_E_INVAL; 6073 } 6074 6075 *val = mlme_obj->cfg.lfr.mawc_roam_rssi_low_adjust; 6076 6077 return QDF_STATUS_SUCCESS; 6078 } 6079 6080 QDF_STATUS 6081 wlan_mlme_get_bss_load_enabled(struct wlan_objmgr_psoc *psoc, bool *val) 6082 { 6083 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6084 6085 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6086 if (!mlme_obj) { 6087 *val = cfg_default(CFG_ENABLE_BSS_LOAD_TRIGGERED_ROAM); 6088 return QDF_STATUS_E_INVAL; 6089 } 6090 6091 *val = mlme_obj->cfg.lfr.bss_load_trig.enabled; 6092 6093 return QDF_STATUS_SUCCESS; 6094 } 6095 6096 QDF_STATUS 6097 wlan_mlme_get_bss_load_threshold(struct wlan_objmgr_psoc *psoc, uint32_t *val) 6098 { 6099 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6100 6101 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6102 if (!mlme_obj) { 6103 *val = cfg_default(CFG_BSS_LOAD_THRESHOLD); 6104 return QDF_STATUS_E_INVAL; 6105 } 6106 6107 *val = mlme_obj->cfg.lfr.bss_load_trig.threshold; 6108 6109 return QDF_STATUS_SUCCESS; 6110 } 6111 6112 QDF_STATUS 6113 wlan_mlme_get_bss_load_sample_time(struct wlan_objmgr_psoc *psoc, 6114 uint32_t *val) 6115 { 6116 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6117 6118 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6119 if (!mlme_obj) { 6120 *val = cfg_default(CFG_BSS_LOAD_SAMPLE_TIME); 6121 return QDF_STATUS_E_INVAL; 6122 } 6123 6124 *val = mlme_obj->cfg.lfr.bss_load_trig.sample_time; 6125 6126 return QDF_STATUS_SUCCESS; 6127 } 6128 6129 QDF_STATUS 6130 wlan_mlme_get_bss_load_rssi_threshold_6ghz(struct wlan_objmgr_psoc *psoc, 6131 int32_t *val) 6132 { 6133 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6134 6135 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6136 if (!mlme_obj) { 6137 *val = cfg_default(CFG_BSS_LOAD_TRIG_6G_RSSI_THRES); 6138 return QDF_STATUS_E_INVAL; 6139 } 6140 6141 *val = mlme_obj->cfg.lfr.bss_load_trig.rssi_threshold_6ghz; 6142 6143 return QDF_STATUS_SUCCESS; 6144 } 6145 6146 QDF_STATUS 6147 wlan_mlme_get_bss_load_rssi_threshold_5ghz(struct wlan_objmgr_psoc *psoc, 6148 int32_t *val) 6149 { 6150 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6151 6152 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6153 if (!mlme_obj) { 6154 *val = cfg_default(CFG_BSS_LOAD_TRIG_5G_RSSI_THRES); 6155 return QDF_STATUS_E_INVAL; 6156 } 6157 6158 *val = mlme_obj->cfg.lfr.bss_load_trig.rssi_threshold_5ghz; 6159 6160 return QDF_STATUS_SUCCESS; 6161 } 6162 6163 QDF_STATUS 6164 wlan_mlme_get_bss_load_rssi_threshold_24ghz(struct wlan_objmgr_psoc *psoc, 6165 int32_t *val) 6166 { 6167 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6168 6169 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6170 if (!mlme_obj) { 6171 *val = cfg_default(CFG_BSS_LOAD_TRIG_2G_RSSI_THRES); 6172 return QDF_STATUS_E_INVAL; 6173 } 6174 6175 *val = mlme_obj->cfg.lfr.bss_load_trig.rssi_threshold_24ghz; 6176 6177 return QDF_STATUS_SUCCESS; 6178 } 6179 6180 bool 6181 wlan_mlme_check_chan_param_has_dfs(struct wlan_objmgr_pdev *pdev, 6182 struct ch_params *ch_params, 6183 uint32_t chan_freq) 6184 { 6185 bool is_dfs = false; 6186 6187 if (ch_params->ch_width == CH_WIDTH_160MHZ) { 6188 wlan_reg_set_create_punc_bitmap(ch_params, true); 6189 if (wlan_reg_get_5g_bonded_channel_state_for_pwrmode(pdev, 6190 chan_freq, 6191 ch_params, 6192 REG_CURRENT_PWR_MODE) == 6193 CHANNEL_STATE_DFS) 6194 is_dfs = true; 6195 } else if (ch_params->ch_width == CH_WIDTH_80P80MHZ) { 6196 if (wlan_reg_get_channel_state_for_pwrmode( 6197 pdev, 6198 chan_freq, 6199 REG_CURRENT_PWR_MODE) == CHANNEL_STATE_DFS || 6200 wlan_reg_get_channel_state_for_pwrmode( 6201 pdev, 6202 ch_params->mhz_freq_seg1, 6203 REG_CURRENT_PWR_MODE) == CHANNEL_STATE_DFS) 6204 is_dfs = true; 6205 } else if (wlan_reg_is_dfs_for_freq(pdev, chan_freq)) { 6206 /*Indoor channels are also marked DFS, therefore 6207 * check if the channel has REGULATORY_CHAN_RADAR 6208 * channel flag to identify if the channel is DFS 6209 */ 6210 is_dfs = true; 6211 } 6212 6213 if (WLAN_REG_IS_6GHZ_CHAN_FREQ(chan_freq) || 6214 WLAN_REG_IS_24GHZ_CH_FREQ(chan_freq)) 6215 is_dfs = false; 6216 6217 return is_dfs; 6218 } 6219 6220 QDF_STATUS 6221 wlan_mlme_set_usr_disabled_roaming(struct wlan_objmgr_psoc *psoc, bool val) 6222 { 6223 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6224 6225 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6226 if (!mlme_obj) 6227 return QDF_STATUS_E_FAILURE; 6228 6229 mlme_obj->cfg.sta.usr_disabled_roaming = val; 6230 6231 return QDF_STATUS_SUCCESS; 6232 } 6233 6234 QDF_STATUS 6235 wlan_mlme_get_usr_disabled_roaming(struct wlan_objmgr_psoc *psoc, bool *val) 6236 { 6237 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6238 6239 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6240 if (!mlme_obj) 6241 return QDF_STATUS_E_INVAL; 6242 6243 *val = mlme_obj->cfg.sta.usr_disabled_roaming; 6244 6245 return QDF_STATUS_SUCCESS; 6246 } 6247 6248 qdf_size_t mlme_get_opr_rate(struct wlan_objmgr_vdev *vdev, uint8_t *dst, 6249 qdf_size_t len) 6250 { 6251 struct mlme_legacy_priv *mlme_priv; 6252 6253 if (!vdev || !dst || !len) { 6254 mlme_legacy_err("invalid params"); 6255 return 0; 6256 } 6257 6258 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 6259 if (!mlme_priv) { 6260 mlme_legacy_err("vdev legacy private object is NULL"); 6261 return 0; 6262 } 6263 6264 if (len < mlme_priv->opr_rate_set.len) { 6265 mlme_legacy_err("Invalid length %zd (<%zd)", len, 6266 mlme_priv->opr_rate_set.len); 6267 return 0; 6268 } 6269 6270 qdf_mem_copy(dst, mlme_priv->opr_rate_set.data, 6271 mlme_priv->opr_rate_set.len); 6272 6273 return mlme_priv->opr_rate_set.len; 6274 } 6275 6276 QDF_STATUS mlme_set_opr_rate(struct wlan_objmgr_vdev *vdev, uint8_t *src, 6277 qdf_size_t len) 6278 { 6279 struct mlme_legacy_priv *mlme_priv; 6280 6281 if (!vdev || !src) { 6282 mlme_legacy_err("invalid params"); 6283 return QDF_STATUS_E_INVAL; 6284 } 6285 6286 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 6287 if (!mlme_priv) { 6288 mlme_legacy_err("vdev legacy private object is NULL"); 6289 return QDF_STATUS_E_FAILURE; 6290 } 6291 6292 if (len > mlme_priv->opr_rate_set.max_len) { 6293 mlme_legacy_err("Invalid len %zd (>%zd)", len, 6294 mlme_priv->opr_rate_set.max_len); 6295 return QDF_STATUS_E_INVAL; 6296 } 6297 6298 mlme_priv->opr_rate_set.len = len; 6299 qdf_mem_copy(mlme_priv->opr_rate_set.data, src, len); 6300 6301 return QDF_STATUS_SUCCESS; 6302 } 6303 6304 qdf_size_t mlme_get_ext_opr_rate(struct wlan_objmgr_vdev *vdev, uint8_t *dst, 6305 qdf_size_t len) 6306 { 6307 struct mlme_legacy_priv *mlme_priv; 6308 6309 if (!vdev || !dst || !len) { 6310 mlme_legacy_err("invalid params"); 6311 return 0; 6312 } 6313 6314 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 6315 if (!mlme_priv) { 6316 mlme_legacy_err("vdev legacy private object is NULL"); 6317 return 0; 6318 } 6319 6320 if (len < mlme_priv->ext_opr_rate_set.len) { 6321 mlme_legacy_err("Invalid length %zd (<%zd)", len, 6322 mlme_priv->ext_opr_rate_set.len); 6323 return 0; 6324 } 6325 6326 qdf_mem_copy(dst, mlme_priv->ext_opr_rate_set.data, 6327 mlme_priv->ext_opr_rate_set.len); 6328 6329 return mlme_priv->ext_opr_rate_set.len; 6330 } 6331 6332 QDF_STATUS mlme_set_ext_opr_rate(struct wlan_objmgr_vdev *vdev, uint8_t *src, 6333 qdf_size_t len) 6334 { 6335 struct mlme_legacy_priv *mlme_priv; 6336 6337 if (!vdev || !src) { 6338 mlme_legacy_err("invalid params"); 6339 return QDF_STATUS_E_INVAL; 6340 } 6341 6342 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 6343 if (!mlme_priv) { 6344 mlme_legacy_err("vdev legacy private object is NULL"); 6345 return QDF_STATUS_E_FAILURE; 6346 } 6347 6348 if (len > mlme_priv->ext_opr_rate_set.max_len) { 6349 mlme_legacy_err("Invalid len %zd (>%zd)", len, 6350 mlme_priv->ext_opr_rate_set.max_len); 6351 return QDF_STATUS_E_INVAL; 6352 } 6353 6354 mlme_priv->ext_opr_rate_set.len = len; 6355 qdf_mem_copy(mlme_priv->ext_opr_rate_set.data, src, len); 6356 6357 return QDF_STATUS_SUCCESS; 6358 } 6359 6360 QDF_STATUS mlme_clear_ext_opr_rate(struct wlan_objmgr_vdev *vdev) 6361 { 6362 struct mlme_legacy_priv *mlme_priv; 6363 6364 if (!vdev) { 6365 mlme_legacy_err("invalid params"); 6366 return QDF_STATUS_E_INVAL; 6367 } 6368 6369 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 6370 if (!mlme_priv) { 6371 mlme_legacy_err("vdev legacy private object is NULL"); 6372 return QDF_STATUS_E_FAILURE; 6373 } 6374 6375 mlme_priv->ext_opr_rate_set.len = 0; 6376 qdf_mem_set(mlme_priv->ext_opr_rate_set.data, CFG_STR_DATA_LEN, 0); 6377 6378 return QDF_STATUS_SUCCESS; 6379 } 6380 6381 qdf_size_t mlme_get_mcs_rate(struct wlan_objmgr_vdev *vdev, uint8_t *dst, 6382 qdf_size_t len) 6383 { 6384 struct mlme_legacy_priv *mlme_priv; 6385 6386 if (!vdev || !dst || !len) { 6387 mlme_legacy_err("invalid params"); 6388 return 0; 6389 } 6390 6391 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 6392 if (!mlme_priv) { 6393 mlme_legacy_err("vdev legacy private object is NULL"); 6394 return 0; 6395 } 6396 6397 if (len < mlme_priv->mcs_rate_set.len) { 6398 mlme_legacy_err("Invalid length %zd (<%zd)", len, 6399 mlme_priv->mcs_rate_set.len); 6400 return 0; 6401 } 6402 6403 qdf_mem_copy(dst, mlme_priv->mcs_rate_set.data, 6404 mlme_priv->mcs_rate_set.len); 6405 6406 return mlme_priv->mcs_rate_set.len; 6407 } 6408 6409 QDF_STATUS mlme_set_mcs_rate(struct wlan_objmgr_vdev *vdev, uint8_t *src, 6410 qdf_size_t len) 6411 { 6412 struct mlme_legacy_priv *mlme_priv; 6413 6414 if (!vdev || !src) { 6415 mlme_legacy_err("invalid params"); 6416 return QDF_STATUS_E_INVAL; 6417 } 6418 6419 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 6420 if (!mlme_priv) { 6421 mlme_legacy_err("vdev legacy private object is NULL"); 6422 return QDF_STATUS_E_FAILURE; 6423 } 6424 6425 if (len > mlme_priv->mcs_rate_set.max_len) { 6426 mlme_legacy_err("Invalid len %zd (>%zd)", len, 6427 mlme_priv->mcs_rate_set.max_len); 6428 return QDF_STATUS_E_INVAL; 6429 } 6430 6431 mlme_priv->mcs_rate_set.len = len; 6432 qdf_mem_copy(mlme_priv->mcs_rate_set.data, src, len); 6433 6434 return QDF_STATUS_SUCCESS; 6435 } 6436 6437 QDF_STATUS mlme_clear_mcs_rate(struct wlan_objmgr_vdev *vdev) 6438 { 6439 struct mlme_legacy_priv *mlme_priv; 6440 6441 if (!vdev) { 6442 mlme_legacy_err("invalid params"); 6443 return QDF_STATUS_E_INVAL; 6444 } 6445 6446 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 6447 if (!mlme_priv) { 6448 mlme_legacy_err("vdev legacy private object is NULL"); 6449 return QDF_STATUS_E_FAILURE; 6450 } 6451 6452 mlme_priv->mcs_rate_set.len = 0; 6453 qdf_mem_set(mlme_priv->mcs_rate_set.data, CFG_STR_DATA_LEN, 0); 6454 6455 return QDF_STATUS_SUCCESS; 6456 } 6457 6458 static enum monitor_mode_concurrency 6459 wlan_mlme_get_monitor_mode_concurrency(struct wlan_objmgr_psoc *psoc) 6460 { 6461 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6462 6463 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6464 if (!mlme_obj) 6465 return cfg_default(CFG_MONITOR_MODE_CONCURRENCY); 6466 6467 return mlme_obj->cfg.gen.monitor_mode_concurrency; 6468 } 6469 6470 #ifdef FEATURE_WDS 6471 enum wlan_wds_mode 6472 wlan_mlme_get_wds_mode(struct wlan_objmgr_psoc *psoc) 6473 { 6474 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6475 6476 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6477 if (!mlme_obj) 6478 return cfg_default(CFG_WDS_MODE); 6479 6480 return mlme_obj->cfg.gen.wds_mode; 6481 } 6482 6483 void wlan_mlme_set_wds_mode(struct wlan_objmgr_psoc *psoc, 6484 enum wlan_wds_mode mode) 6485 { 6486 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6487 6488 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6489 if (!mlme_obj) 6490 return; 6491 if (mode <= WLAN_WDS_MODE_MAX) 6492 mlme_obj->cfg.gen.wds_mode = mode; 6493 } 6494 #endif 6495 6496 bool wlan_mlme_is_sta_mon_conc_supported(struct wlan_objmgr_psoc *psoc) 6497 { 6498 if (wlan_mlme_get_monitor_mode_concurrency(psoc) == 6499 MONITOR_MODE_CONC_STA_SCAN_MON) 6500 return true; 6501 6502 return false; 6503 } 6504 6505 bool wlan_mlme_skip_tpe(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 false; 6512 6513 return mlme_obj->cfg.power.skip_tpe; 6514 } 6515 6516 #ifdef WLAN_FEATURE_11BE 6517 QDF_STATUS mlme_cfg_get_orig_eht_caps(struct wlan_objmgr_psoc *psoc, 6518 tDot11fIEeht_cap *eht_cap) 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 QDF_STATUS_E_FAILURE; 6525 6526 *eht_cap = mlme_obj->cfg.eht_caps.eht_cap_orig; 6527 6528 return QDF_STATUS_SUCCESS; 6529 } 6530 6531 QDF_STATUS mlme_cfg_get_eht_caps(struct wlan_objmgr_psoc *psoc, 6532 tDot11fIEeht_cap *eht_cap) 6533 { 6534 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6535 6536 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6537 if (!mlme_obj) 6538 return QDF_STATUS_E_FAILURE; 6539 6540 *eht_cap = mlme_obj->cfg.eht_caps.dot11_eht_cap; 6541 6542 return QDF_STATUS_SUCCESS; 6543 } 6544 #endif 6545 6546 QDF_STATUS 6547 wlan_mlme_set_ba_2k_jump_iot_ap(struct wlan_objmgr_vdev *vdev, bool found) 6548 { 6549 struct mlme_legacy_priv *mlme_priv; 6550 6551 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 6552 if (!mlme_priv) { 6553 mlme_legacy_err("vdev legacy private object is NULL"); 6554 return QDF_STATUS_E_FAILURE; 6555 } 6556 6557 mlme_priv->ba_2k_jump_iot_ap = found; 6558 6559 return QDF_STATUS_SUCCESS; 6560 } 6561 6562 bool wlan_mlme_is_ba_2k_jump_iot_ap(struct wlan_objmgr_vdev *vdev) 6563 { 6564 struct mlme_legacy_priv *mlme_priv; 6565 6566 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 6567 if (!mlme_priv) { 6568 mlme_legacy_err("vdev legacy private object is NULL"); 6569 return false; 6570 } 6571 6572 return mlme_priv->ba_2k_jump_iot_ap; 6573 } 6574 6575 QDF_STATUS 6576 wlan_mlme_set_last_delba_sent_time(struct wlan_objmgr_vdev *vdev, 6577 qdf_time_t delba_sent_time) 6578 { 6579 struct mlme_legacy_priv *mlme_priv; 6580 6581 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 6582 if (!mlme_priv) { 6583 mlme_legacy_err("vdev legacy private object is NULL"); 6584 return QDF_STATUS_E_FAILURE; 6585 } 6586 6587 mlme_priv->last_delba_sent_time = delba_sent_time; 6588 6589 return QDF_STATUS_SUCCESS; 6590 } 6591 6592 qdf_time_t 6593 wlan_mlme_get_last_delba_sent_time(struct wlan_objmgr_vdev *vdev) 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 0; 6601 } 6602 6603 return mlme_priv->last_delba_sent_time; 6604 } 6605 6606 QDF_STATUS mlme_set_user_ps(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, 6607 bool ps_enable) 6608 { 6609 struct wlan_objmgr_vdev *vdev; 6610 struct mlme_legacy_priv *mlme_priv; 6611 QDF_STATUS status = QDF_STATUS_E_FAILURE; 6612 6613 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, 6614 WLAN_MLME_OBJMGR_ID); 6615 if (!vdev) 6616 return status; 6617 6618 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 6619 if (mlme_priv) { 6620 mlme_priv->is_usr_ps_enabled = ps_enable; 6621 status = QDF_STATUS_SUCCESS; 6622 mlme_legacy_debug("vdev:%d user PS:%d", vdev_id, 6623 mlme_priv->is_usr_ps_enabled); 6624 } 6625 6626 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID); 6627 6628 return status; 6629 } 6630 6631 bool mlme_get_user_ps(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id) 6632 { 6633 struct wlan_objmgr_vdev *vdev; 6634 struct mlme_legacy_priv *mlme_priv; 6635 bool usr_ps_enable = false; 6636 6637 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, 6638 WLAN_MLME_OBJMGR_ID); 6639 if (!vdev) 6640 return false; 6641 6642 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 6643 if (mlme_priv) 6644 usr_ps_enable = mlme_priv->is_usr_ps_enabled; 6645 6646 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID); 6647 6648 return usr_ps_enable; 6649 } 6650 6651 bool wlan_mlme_is_multipass_sap(struct wlan_objmgr_psoc *psoc) 6652 { 6653 struct target_psoc_info *info; 6654 6655 info = wlan_psoc_get_tgt_if_handle(psoc); 6656 if (!info) { 6657 mlme_legacy_err("target_psoc_info is null"); 6658 return QDF_STATUS_E_FAILURE; 6659 } 6660 6661 return target_is_multipass_sap(info); 6662 } 6663 6664 QDF_STATUS wlan_mlme_get_phy_max_freq_range(struct wlan_objmgr_psoc *psoc, 6665 uint32_t *low_2ghz_chan, 6666 uint32_t *high_2ghz_chan, 6667 uint32_t *low_5ghz_chan, 6668 uint32_t *high_5ghz_chan) 6669 { 6670 uint32_t i; 6671 uint32_t reg_low_2ghz_chan; 6672 uint32_t reg_high_2ghz_chan; 6673 uint32_t reg_low_5ghz_chan; 6674 uint32_t reg_high_5ghz_chan; 6675 struct target_psoc_info *info; 6676 struct wlan_psoc_host_mac_phy_caps *mac_phy_cap; 6677 struct wlan_psoc_host_hal_reg_cap_ext *reg_cap_ext; 6678 6679 info = wlan_psoc_get_tgt_if_handle(psoc); 6680 if (!info) { 6681 mlme_legacy_err("target_psoc_info is null"); 6682 return QDF_STATUS_E_FAILURE; 6683 } 6684 mac_phy_cap = info->info.mac_phy_cap; 6685 reg_cap_ext = &mac_phy_cap->reg_cap_ext; 6686 reg_low_2ghz_chan = reg_cap_ext->low_2ghz_chan; 6687 reg_high_2ghz_chan = reg_cap_ext->high_2ghz_chan; 6688 reg_low_5ghz_chan = reg_cap_ext->low_5ghz_chan; 6689 reg_high_5ghz_chan = reg_cap_ext->high_5ghz_chan; 6690 for (i = 1; i < PSOC_MAX_MAC_PHY_CAP; i++) { 6691 mac_phy_cap = &info->info.mac_phy_cap[i]; 6692 reg_cap_ext = &mac_phy_cap->reg_cap_ext; 6693 6694 if (reg_cap_ext->low_2ghz_chan) { 6695 reg_low_2ghz_chan = reg_low_2ghz_chan ? 6696 QDF_MIN(reg_cap_ext->low_2ghz_chan, 6697 reg_low_2ghz_chan) : 6698 reg_cap_ext->low_2ghz_chan; 6699 } 6700 if (reg_cap_ext->high_2ghz_chan) { 6701 reg_high_2ghz_chan = reg_high_2ghz_chan ? 6702 QDF_MAX(reg_cap_ext->high_2ghz_chan, 6703 reg_high_2ghz_chan) : 6704 reg_cap_ext->high_2ghz_chan; 6705 } 6706 if (reg_cap_ext->low_5ghz_chan) { 6707 reg_low_5ghz_chan = reg_low_5ghz_chan ? 6708 QDF_MIN(reg_cap_ext->low_5ghz_chan, 6709 reg_low_5ghz_chan) : 6710 reg_cap_ext->low_5ghz_chan; 6711 } 6712 if (reg_cap_ext->high_5ghz_chan) { 6713 reg_high_5ghz_chan = reg_high_5ghz_chan ? 6714 QDF_MAX(reg_cap_ext->high_5ghz_chan, 6715 reg_high_5ghz_chan) : 6716 reg_cap_ext->high_5ghz_chan; 6717 } 6718 } 6719 /* For old hw, no reg_cap_ext reported from service ready ext, 6720 * fill the low/high with default of regulatory. 6721 */ 6722 if (!reg_low_2ghz_chan && !reg_high_2ghz_chan && 6723 !reg_low_5ghz_chan && !reg_high_5ghz_chan) { 6724 mlme_legacy_debug("no reg_cap_ext in mac_phy_cap"); 6725 reg_low_2ghz_chan = TWOG_STARTING_FREQ - 10; 6726 reg_high_2ghz_chan = TWOG_CHAN_14_IN_MHZ + 10; 6727 reg_low_5ghz_chan = FIVEG_STARTING_FREQ - 10; 6728 reg_high_5ghz_chan = SIXG_CHAN_233_IN_MHZ + 10; 6729 } 6730 if (!wlan_reg_is_6ghz_supported(psoc)) { 6731 mlme_legacy_debug("disabling 6ghz channels"); 6732 reg_high_5ghz_chan = FIVEG_CHAN_177_IN_MHZ + 10; 6733 } 6734 mlme_legacy_debug("%d %d %d %d", reg_low_2ghz_chan, reg_high_2ghz_chan, 6735 reg_low_5ghz_chan, reg_high_5ghz_chan); 6736 *low_2ghz_chan = reg_low_2ghz_chan; 6737 *high_2ghz_chan = reg_high_2ghz_chan; 6738 *low_5ghz_chan = reg_low_5ghz_chan; 6739 *high_5ghz_chan = reg_high_5ghz_chan; 6740 6741 return QDF_STATUS_SUCCESS; 6742 } 6743 6744 #ifdef WLAN_FEATURE_P2P_P2P_STA 6745 bool 6746 wlan_mlme_get_p2p_p2p_conc_support(struct wlan_objmgr_psoc *psoc) 6747 { 6748 return wlan_psoc_nif_fw_ext_cap_get(psoc, 6749 WLAN_SOC_EXT_P2P_P2P_CONC_SUPPORT); 6750 } 6751 #endif 6752 6753 enum phy_ch_width mlme_get_vht_ch_width(void) 6754 { 6755 enum phy_ch_width bandwidth = CH_WIDTH_INVALID; 6756 uint32_t fw_ch_wd = wma_get_vht_ch_width(); 6757 6758 if (fw_ch_wd == WNI_CFG_VHT_CHANNEL_WIDTH_80_PLUS_80MHZ) 6759 bandwidth = CH_WIDTH_80P80MHZ; 6760 else if (fw_ch_wd == WNI_CFG_VHT_CHANNEL_WIDTH_160MHZ) 6761 bandwidth = CH_WIDTH_160MHZ; 6762 else 6763 bandwidth = CH_WIDTH_80MHZ; 6764 6765 return bandwidth; 6766 } 6767 6768 uint8_t 6769 wlan_mlme_get_mgmt_hw_tx_retry_count(struct wlan_objmgr_psoc *psoc, 6770 enum mlme_cfg_frame_type frm_type) 6771 { 6772 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6773 6774 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6775 6776 if (!mlme_obj) 6777 return 0; 6778 6779 if (frm_type >= CFG_FRAME_TYPE_MAX) 6780 return 0; 6781 6782 return mlme_obj->cfg.gen.mgmt_hw_tx_retry_count[frm_type]; 6783 } 6784 6785 QDF_STATUS 6786 wlan_mlme_get_tx_retry_multiplier(struct wlan_objmgr_psoc *psoc, 6787 uint32_t *tx_retry_multiplier) 6788 { 6789 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6790 6791 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6792 6793 if (!mlme_obj) { 6794 *tx_retry_multiplier = 6795 cfg_default(CFG_TX_RETRY_MULTIPLIER); 6796 return QDF_STATUS_E_FAILURE; 6797 } 6798 6799 *tx_retry_multiplier = mlme_obj->cfg.gen.tx_retry_multiplier; 6800 return QDF_STATUS_SUCCESS; 6801 } 6802 6803 QDF_STATUS 6804 wlan_mlme_get_channel_bonding_5ghz(struct wlan_objmgr_psoc *psoc, 6805 uint32_t *value) 6806 { 6807 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6808 6809 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6810 if (!mlme_obj) { 6811 *value = cfg_default(CFG_CHANNEL_BONDING_MODE_5GHZ); 6812 return QDF_STATUS_E_INVAL; 6813 } 6814 6815 *value = mlme_obj->cfg.feature_flags.channel_bonding_mode_5ghz; 6816 6817 return QDF_STATUS_SUCCESS; 6818 } 6819 6820 QDF_STATUS 6821 wlan_mlme_update_ratemask_params(struct wlan_objmgr_vdev *vdev, 6822 uint8_t num_ratemask, 6823 struct config_ratemask_params *rate_params) 6824 { 6825 struct vdev_mlme_obj *vdev_mlme; 6826 struct vdev_mlme_rate_info *rate_info; 6827 QDF_STATUS ret; 6828 uint8_t i = 0; 6829 uint8_t index; 6830 6831 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 6832 if (!vdev_mlme) 6833 return QDF_STATUS_E_FAILURE; 6834 6835 rate_info = &vdev_mlme->mgmt.rate_info; 6836 while (i < num_ratemask) { 6837 index = rate_params[i].type; 6838 if (index >= WLAN_VDEV_RATEMASK_TYPE_MAX) { 6839 mlme_legacy_err("Invalid ratemask type"); 6840 ++i; 6841 continue; 6842 } 6843 6844 if (rate_info->ratemask_params[index].lower32 != 6845 rate_params[i].lower32 || 6846 rate_info->ratemask_params[index].lower32_2 != 6847 rate_params[i].lower32_2 || 6848 rate_info->ratemask_params[index].higher32 != 6849 rate_params[i].higher32 || 6850 rate_info->ratemask_params[index].higher32_2 != 6851 rate_params[i].higher32_2) { 6852 rate_info->ratemask_params[index].lower32 = 6853 rate_params[i].lower32; 6854 rate_info->ratemask_params[index].higher32 = 6855 rate_params[i].higher32; 6856 rate_info->ratemask_params[index].lower32_2 = 6857 rate_params[i].lower32_2; 6858 rate_info->ratemask_params[index].higher32_2 = 6859 rate_params[i].higher32_2; 6860 ret = wlan_util_vdev_mlme_set_ratemask_config(vdev_mlme, 6861 index); 6862 if (ret != QDF_STATUS_SUCCESS) 6863 mlme_legacy_err("ratemask config failed"); 6864 } else { 6865 mlme_legacy_debug("Ratemask same as configured mask"); 6866 } 6867 ++i; 6868 } 6869 return QDF_STATUS_SUCCESS; 6870 } 6871 6872 bool wlan_mlme_is_channel_valid(struct wlan_objmgr_psoc *psoc, 6873 uint32_t chan_freq) 6874 { 6875 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6876 6877 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6878 if (!mlme_obj) 6879 return false; 6880 6881 return wlan_roam_is_channel_valid(&mlme_obj->cfg.reg, 6882 chan_freq); 6883 } 6884 6885 #ifdef WLAN_FEATURE_MCC_QUOTA 6886 #define WLAN_MCC_MIN_QUOTA 10 /* in %age */ 6887 #define WLAN_MCC_MAX_QUOTA 90 /* in %age */ 6888 QDF_STATUS wlan_mlme_set_user_mcc_quota(struct wlan_objmgr_psoc *psoc, 6889 struct wlan_user_mcc_quota *quota) 6890 6891 { 6892 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6893 6894 if (!quota) 6895 return QDF_STATUS_E_NULL_VALUE; 6896 6897 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6898 if (!mlme_obj) 6899 return QDF_STATUS_E_FAILURE; 6900 6901 if (quota->quota < WLAN_MCC_MIN_QUOTA) 6902 quota->quota = WLAN_MCC_MIN_QUOTA; 6903 else if (quota->quota > WLAN_MCC_MAX_QUOTA) 6904 quota->quota = WLAN_MCC_MAX_QUOTA; 6905 6906 mlme_obj->cfg.gen.user_mcc_quota.quota = quota->quota; 6907 mlme_obj->cfg.gen.user_mcc_quota.op_mode = quota->op_mode; 6908 mlme_obj->cfg.gen.user_mcc_quota.vdev_id = quota->vdev_id; 6909 6910 mlme_debug("quota : %u, op_mode : %d, vdev_id : %u", 6911 quota->quota, quota->op_mode, quota->vdev_id); 6912 6913 return QDF_STATUS_SUCCESS; 6914 } 6915 6916 QDF_STATUS wlan_mlme_get_user_mcc_quota(struct wlan_objmgr_psoc *psoc, 6917 struct wlan_user_mcc_quota *quota) 6918 { 6919 struct wlan_mlme_psoc_ext_obj *mlme_obj; 6920 6921 if (!quota) 6922 return QDF_STATUS_E_NULL_VALUE; 6923 6924 mlme_obj = mlme_get_psoc_ext_obj(psoc); 6925 if (!mlme_obj) 6926 return QDF_STATUS_E_FAILURE; 6927 6928 quota->quota = mlme_obj->cfg.gen.user_mcc_quota.quota; 6929 quota->op_mode = mlme_obj->cfg.gen.user_mcc_quota.op_mode; 6930 quota->vdev_id = mlme_obj->cfg.gen.user_mcc_quota.vdev_id; 6931 6932 return QDF_STATUS_SUCCESS; 6933 } 6934 6935 uint32_t 6936 wlan_mlme_get_user_mcc_duty_cycle_percentage(struct wlan_objmgr_psoc *psoc) 6937 { 6938 uint32_t mcc_freq, ch_freq, quota_value; 6939 struct wlan_user_mcc_quota quota; 6940 uint8_t operating_channel; 6941 int status; 6942 6943 quota.vdev_id = WLAN_UMAC_VDEV_ID_MAX; 6944 quota.quota = 0; 6945 if (QDF_IS_STATUS_ERROR(wlan_mlme_get_user_mcc_quota(psoc, "a))) { 6946 mlme_debug("Error getting user quota set"); 6947 return 0; 6948 } 6949 6950 if (quota.vdev_id == WLAN_UMAC_VDEV_ID_MAX || quota.quota == 0) { 6951 mlme_debug("Invalid quota : vdev %u, quota %u", 6952 quota.vdev_id, quota.quota); 6953 return 0; 6954 } 6955 status = policy_mgr_get_chan_by_session_id(psoc, quota.vdev_id, 6956 &ch_freq); 6957 if (QDF_IS_STATUS_ERROR(status)) { 6958 mlme_debug("Could not get vdev %u chan", quota.vdev_id); 6959 return 0; 6960 } 6961 mcc_freq = policy_mgr_get_mcc_operating_channel(psoc, quota.vdev_id); 6962 if (mcc_freq == INVALID_CHANNEL_ID) 6963 return 0; 6964 6965 operating_channel = wlan_freq_to_chan(ch_freq); 6966 if (!operating_channel) { 6967 mlme_debug("Primary op channel is invalid"); 6968 return 0; 6969 } 6970 /* 6971 * The channel numbers for both adapters and the time 6972 * quota for the 1st adapter, i.e., one specified in cmd 6973 * are formatted as a bit vector 6974 * ****************************************************** 6975 * |bit 31-24 | bit 23-16 | bits 15-8 |bits 7-0 | 6976 * | Unused | Quota for | chan. # for |chan. # for| 6977 * | | 1st chan | 1st chan. |2nd chan. | 6978 * ****************************************************** 6979 */ 6980 mlme_debug("Opmode (%d) vdev (%u) channel %u and quota %u", 6981 quota.op_mode, quota.vdev_id, 6982 operating_channel, quota.quota); 6983 quota_value = quota.quota; 6984 /* Move the time quota for first channel to bits 15-8 */ 6985 quota_value = quota_value << 8; 6986 /* 6987 * Store the channel number of 1st channel at bits 7-0 6988 * of the bit vector 6989 */ 6990 quota_value |= operating_channel; 6991 6992 operating_channel = wlan_freq_to_chan(mcc_freq); 6993 if (!operating_channel) { 6994 mlme_debug("Secondary op channel is invalid"); 6995 return 0; 6996 } 6997 6998 /* 6999 * Now move the time quota and channel number of the 7000 * 1st adapter to bits 23-16 and bits 15-8 of the bit 7001 * vector, respectively. 7002 */ 7003 quota_value = quota_value << 8; 7004 /* 7005 * Set the channel number for 2nd MCC vdev at bits 7006 * 7-0 of set_value 7007 */ 7008 quota_value |= operating_channel; 7009 mlme_debug("quota value:%x", quota_value); 7010 7011 return quota_value; 7012 } 7013 #endif /* WLAN_FEATURE_MCC_QUOTA */ 7014 7015 uint8_t mlme_get_max_he_mcs_idx(enum phy_ch_width mcs_ch_width, 7016 u_int16_t *hecap_rxmcsnssmap, 7017 u_int16_t *hecap_txmcsnssmap) 7018 { 7019 uint8_t rx_max_mcs, tx_max_mcs, max_mcs = INVALID_MCS_NSS_INDEX; 7020 7021 switch (mcs_ch_width) { 7022 case CH_WIDTH_80P80MHZ: 7023 if (hecap_rxmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_80_80] && 7024 hecap_txmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_80_80]) { 7025 rx_max_mcs = hecap_rxmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_80_80] & 0x03; 7026 tx_max_mcs = hecap_txmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_80_80] & 0x03; 7027 max_mcs = rx_max_mcs < tx_max_mcs ? rx_max_mcs : tx_max_mcs; 7028 if (max_mcs < 0x03) 7029 max_mcs = 7 + 2 * max_mcs; 7030 } 7031 fallthrough; 7032 case CH_WIDTH_160MHZ: 7033 if (hecap_rxmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_160] && 7034 hecap_txmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_160]) { 7035 rx_max_mcs = hecap_rxmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_160] & 0x03; 7036 tx_max_mcs = hecap_txmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_160] & 0x03; 7037 max_mcs = rx_max_mcs < tx_max_mcs ? rx_max_mcs : tx_max_mcs; 7038 if (max_mcs < 0x03) 7039 max_mcs = 7 + 2 * max_mcs; 7040 } 7041 fallthrough; 7042 default: 7043 if (hecap_rxmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_80] && 7044 hecap_txmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_80]) { 7045 rx_max_mcs = hecap_rxmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_80] & 0x03; 7046 tx_max_mcs = hecap_txmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_80] & 0x03; 7047 max_mcs = rx_max_mcs < tx_max_mcs ? rx_max_mcs : tx_max_mcs; 7048 if (max_mcs < 0x03) 7049 max_mcs = 7 + 2 * max_mcs; 7050 } 7051 } 7052 7053 return max_mcs; 7054 } 7055 7056 uint8_t mlme_get_max_vht_mcs_idx(u_int16_t rx_vht_mcs_map, 7057 u_int16_t tx_vht_mcs_map) 7058 { 7059 uint8_t rx_max_mcs, tx_max_mcs, max_mcs = INVALID_MCS_NSS_INDEX; 7060 7061 if (rx_vht_mcs_map && tx_vht_mcs_map) { 7062 rx_max_mcs = rx_vht_mcs_map & 0x03; 7063 tx_max_mcs = tx_vht_mcs_map & 0x03; 7064 max_mcs = rx_max_mcs < tx_max_mcs ? rx_max_mcs : tx_max_mcs; 7065 if (max_mcs < 0x03) 7066 return 7 + max_mcs; 7067 } 7068 7069 return max_mcs; 7070 } 7071 7072 #ifdef WLAN_FEATURE_SON 7073 QDF_STATUS mlme_save_vdev_max_mcs_idx(struct wlan_objmgr_vdev *vdev, 7074 uint8_t max_mcs_idx) 7075 { 7076 struct mlme_legacy_priv *mlme_priv; 7077 7078 if (!vdev) { 7079 mlme_legacy_err("invalid vdev"); 7080 return QDF_STATUS_E_INVAL; 7081 } 7082 7083 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 7084 if (!mlme_priv) { 7085 mlme_legacy_err("vdev legacy private object is NULL"); 7086 return QDF_STATUS_E_FAILURE; 7087 } 7088 7089 mlme_priv->max_mcs_index = max_mcs_idx; 7090 7091 return QDF_STATUS_SUCCESS; 7092 } 7093 7094 uint8_t mlme_get_vdev_max_mcs_idx(struct wlan_objmgr_vdev *vdev) 7095 { 7096 struct mlme_legacy_priv *mlme_priv; 7097 7098 if (!vdev) { 7099 mlme_legacy_err("invalid vdev"); 7100 return INVALID_MCS_NSS_INDEX; 7101 } 7102 7103 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 7104 if (!mlme_priv) { 7105 mlme_legacy_err("vdev legacy private object is NULL"); 7106 return INVALID_MCS_NSS_INDEX; 7107 } 7108 7109 return mlme_priv->max_mcs_index; 7110 } 7111 #endif /* WLAN_FEATURE_SON */ 7112 7113 void wlan_mlme_get_safe_mode_enable(struct wlan_objmgr_psoc *psoc, 7114 bool *safe_mode_enable) 7115 { 7116 struct wlan_mlme_psoc_ext_obj *mlme_obj; 7117 7118 mlme_obj = mlme_get_psoc_ext_obj(psoc); 7119 if (!mlme_obj) { 7120 mlme_legacy_err("invalid mlme obj"); 7121 *safe_mode_enable = false; 7122 return; 7123 } 7124 7125 *safe_mode_enable = mlme_obj->cfg.gen.safe_mode_enable; 7126 } 7127 7128 void wlan_mlme_set_safe_mode_enable(struct wlan_objmgr_psoc *psoc, 7129 bool safe_mode_enable) 7130 { 7131 struct wlan_mlme_psoc_ext_obj *mlme_obj; 7132 7133 mlme_obj = mlme_get_psoc_ext_obj(psoc); 7134 if (!mlme_obj) { 7135 mlme_legacy_err("invalid mlme obj"); 7136 return; 7137 } 7138 7139 mlme_obj->cfg.gen.safe_mode_enable = safe_mode_enable; 7140 } 7141 7142 uint32_t wlan_mlme_get_6g_ap_power_type(struct wlan_objmgr_vdev *vdev) 7143 { 7144 struct vdev_mlme_obj *mlme_obj; 7145 7146 mlme_obj = wlan_vdev_mlme_get_cmpt_obj(vdev); 7147 7148 if (!mlme_obj) { 7149 mlme_legacy_err("vdev component object is NULL"); 7150 return REG_MAX_AP_TYPE; 7151 } 7152 7153 return mlme_obj->reg_tpc_obj.power_type_6g; 7154 } 7155 7156 QDF_STATUS wlan_connect_hw_mode_change_resp(struct wlan_objmgr_pdev *pdev, 7157 uint8_t vdev_id, 7158 wlan_cm_id cm_id, QDF_STATUS status) 7159 { 7160 return wlan_cm_handle_hw_mode_change_resp(pdev, vdev_id, cm_id, 7161 status); 7162 } 7163 7164 enum phy_ch_width 7165 wlan_mlme_get_ch_width_from_phymode(enum wlan_phymode phy_mode) 7166 { 7167 enum phy_ch_width ch_width; 7168 7169 if (IS_WLAN_PHYMODE_320MHZ(phy_mode)) 7170 ch_width = CH_WIDTH_320MHZ; 7171 else if (IS_WLAN_PHYMODE_160MHZ(phy_mode)) 7172 ch_width = CH_WIDTH_160MHZ; 7173 else if (IS_WLAN_PHYMODE_80MHZ(phy_mode)) 7174 ch_width = CH_WIDTH_80MHZ; 7175 else if (IS_WLAN_PHYMODE_40MHZ(phy_mode)) 7176 ch_width = CH_WIDTH_40MHZ; 7177 else 7178 ch_width = CH_WIDTH_20MHZ; 7179 7180 mlme_legacy_debug("phymode: %d, ch_width: %d ", phy_mode, ch_width); 7181 7182 return ch_width; 7183 } 7184 7185 enum phy_ch_width 7186 wlan_mlme_get_peer_ch_width(struct wlan_objmgr_psoc *psoc, uint8_t *mac) 7187 { 7188 enum wlan_phymode phy_mode; 7189 QDF_STATUS status; 7190 7191 status = mlme_get_peer_phymode(psoc, mac, &phy_mode); 7192 if (QDF_IS_STATUS_ERROR(status)) { 7193 mlme_legacy_err("failed to fetch phy_mode status: %d for mac: " QDF_MAC_ADDR_FMT, 7194 status, QDF_MAC_ADDR_REF(mac)); 7195 return CH_WIDTH_20MHZ; 7196 } 7197 7198 return wlan_mlme_get_ch_width_from_phymode(phy_mode); 7199 } 7200 7201 #ifdef FEATURE_SET 7202 7203 /** 7204 * wlan_mlme_get_latency_enable() - get wlm latency cfg value 7205 * @psoc: psoc context 7206 * @value: Pointer in which wlam latency cfg value needs to be filled 7207 * 7208 * Return: QDF_STATUS_SUCCESS on success or QDF_STATUS_E_INVAL on failure 7209 */ 7210 static QDF_STATUS 7211 wlan_mlme_get_latency_enable(struct wlan_objmgr_psoc *psoc, bool *value) 7212 { 7213 struct wlan_mlme_psoc_ext_obj *mlme_obj; 7214 7215 mlme_obj = mlme_get_psoc_ext_obj(psoc); 7216 if (!mlme_obj) { 7217 mlme_legacy_err("mlme obj null"); 7218 return QDF_STATUS_E_INVAL; 7219 } 7220 7221 *value = mlme_obj->cfg.wlm_config.latency_enable; 7222 return QDF_STATUS_SUCCESS; 7223 } 7224 7225 #ifdef WLAN_ADAPTIVE_11R 7226 /** 7227 * wlan_mlme_get_adaptive11r_enabled() - get adaptive 11r cfg value 7228 * @psoc: psoc context 7229 * @val: Pointer in which adaptive 11r cfg value needs to be filled 7230 * 7231 * Return: QDF_STATUS_SUCCESS on success or QDF_STATUS_E_INVAL on failure 7232 */ 7233 static QDF_STATUS 7234 wlan_mlme_get_adaptive11r_enabled(struct wlan_objmgr_psoc *psoc, bool *val) 7235 { 7236 struct wlan_mlme_psoc_ext_obj *mlme_obj; 7237 7238 mlme_obj = mlme_get_psoc_ext_obj(psoc); 7239 if (!mlme_obj) { 7240 *val = cfg_default(CFG_ADAPTIVE_11R); 7241 return QDF_STATUS_E_INVAL; 7242 } 7243 7244 *val = mlme_obj->cfg.lfr.enable_adaptive_11r; 7245 7246 return QDF_STATUS_SUCCESS; 7247 } 7248 #else 7249 static inline QDF_STATUS 7250 wlan_mlme_get_adaptive11r_enabled(struct wlan_objmgr_psoc *psoc, bool *val) 7251 { 7252 *val = false; 7253 return QDF_STATUS_SUCCESS; 7254 } 7255 #endif 7256 7257 #ifdef WLAN_FEATURE_P2P_P2P_STA 7258 static bool 7259 wlan_mlme_get_p2p_p2p_host_conc_support(void) 7260 { 7261 return true; 7262 } 7263 #else 7264 static bool 7265 wlan_mlme_get_p2p_p2p_host_conc_support(void) 7266 { 7267 return false; 7268 } 7269 #endif 7270 7271 void wlan_mlme_get_feature_info(struct wlan_objmgr_psoc *psoc, 7272 struct wlan_mlme_features *mlme_feature_set) 7273 { 7274 uint32_t roam_triggers; 7275 int sap_max_num_clients = 0; 7276 bool is_enable_idle_roam = false, is_bss_load_enabled = false; 7277 7278 wlan_mlme_get_latency_enable(psoc, 7279 &mlme_feature_set->enable_wifi_optimizer); 7280 wlan_mlme_get_sap_max_peers(psoc, &sap_max_num_clients); 7281 mlme_feature_set->sap_max_num_clients = sap_max_num_clients; 7282 mlme_feature_set->vendor_req_1_version = 7283 WMI_HOST_VENDOR1_REQ1_VERSION_4_00; 7284 roam_triggers = wlan_mlme_get_roaming_triggers(psoc); 7285 7286 wlan_mlme_get_bss_load_enabled(psoc, &is_bss_load_enabled); 7287 mlme_feature_set->roaming_high_cu_roam_trigger = 7288 (roam_triggers & BIT(ROAM_TRIGGER_REASON_BSS_LOAD)) && 7289 is_bss_load_enabled; 7290 7291 mlme_feature_set->roaming_emergency_trigger = 7292 roam_triggers & BIT(ROAM_TRIGGER_REASON_FORCED); 7293 mlme_feature_set->roaming_btm_trihgger = 7294 roam_triggers & BIT(ROAM_TRIGGER_REASON_BTM); 7295 7296 wlan_mlme_get_enable_idle_roam(psoc, &is_enable_idle_roam); 7297 mlme_feature_set->roaming_idle_trigger = 7298 (roam_triggers & BIT(ROAM_TRIGGER_REASON_IDLE)) && 7299 is_enable_idle_roam; 7300 7301 mlme_feature_set->roaming_wtc_trigger = 7302 roam_triggers & BIT(ROAM_TRIGGER_REASON_WTC_BTM); 7303 mlme_feature_set->roaming_btcoex_trigger = 7304 roam_triggers & BIT(ROAM_TRIGGER_REASON_BTC); 7305 mlme_feature_set->roaming_btw_wpa_wpa2 = true; 7306 mlme_feature_set->roaming_manage_chan_list_api = true; 7307 7308 wlan_mlme_get_adaptive11r_enabled( 7309 psoc, 7310 &mlme_feature_set->roaming_adaptive_11r); 7311 mlme_feature_set->roaming_ctrl_api_get_set = true; 7312 mlme_feature_set->roaming_ctrl_api_reassoc = true; 7313 mlme_feature_set->roaming_ctrl_get_cu = true; 7314 7315 mlme_feature_set->vendor_req_2_version = 7316 WMI_HOST_VENDOR1_REQ2_VERSION_3_50; 7317 mlme_feature_set->sta_dual_p2p_support = 7318 wlan_mlme_get_p2p_p2p_host_conc_support(); 7319 wlan_mlme_get_vht_enable2x2(psoc, &mlme_feature_set->enable2x2); 7320 } 7321 #endif 7322 7323 void wlan_mlme_chan_stats_scan_event_cb(struct wlan_objmgr_vdev *vdev, 7324 struct scan_event *event, void *arg) 7325 { 7326 bool success = false; 7327 7328 if (!util_is_scan_completed(event, &success)) 7329 return; 7330 7331 mlme_send_scan_done_complete_cb(event->vdev_id); 7332 } 7333 7334 static QDF_STATUS 7335 wlan_mlme_update_vdev_chwidth_with_notify(struct wlan_objmgr_psoc *psoc, 7336 struct wlan_objmgr_vdev *vdev, 7337 uint8_t vdev_id, 7338 wmi_host_channel_width ch_width) 7339 { 7340 struct vdev_mlme_obj *vdev_mlme; 7341 struct vdev_set_params param = {0}; 7342 QDF_STATUS status; 7343 7344 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 7345 if (!vdev_mlme) 7346 return QDF_STATUS_E_FAILURE; 7347 7348 param.param_id = wmi_vdev_param_chwidth_with_notify; 7349 param.vdev_id = vdev_id; 7350 param.param_value = ch_width; 7351 status = tgt_vdev_mgr_set_param_send(vdev_mlme, ¶m); 7352 policy_mgr_handle_ml_sta_link_on_traffic_type_change(psoc, vdev); 7353 7354 return status; 7355 } 7356 7357 #ifdef WLAN_FEATURE_11BE 7358 static 7359 void wlan_mlme_set_puncture(struct wlan_channel *des_chan, 7360 uint16_t puncture_bitmap) 7361 { 7362 des_chan->puncture_bitmap = puncture_bitmap; 7363 } 7364 #else 7365 static 7366 void wlan_mlme_set_puncture(struct wlan_channel *des_chan, 7367 uint16_t puncture_bitmap) 7368 { 7369 } 7370 #endif 7371 7372 static QDF_STATUS wlan_mlme_update_ch_width(struct wlan_objmgr_vdev *vdev, 7373 uint8_t vdev_id, 7374 enum phy_ch_width ch_width, 7375 uint16_t puncture_bitmap, 7376 qdf_freq_t sec_2g_freq) 7377 { 7378 struct wlan_channel *des_chan; 7379 struct wlan_channel *bss_chan; 7380 uint16_t curr_op_freq; 7381 struct ch_params ch_params = {0}; 7382 struct wlan_objmgr_pdev *pdev; 7383 QDF_STATUS status; 7384 7385 des_chan = wlan_vdev_mlme_get_des_chan(vdev); 7386 if (!des_chan) 7387 return QDF_STATUS_E_FAILURE; 7388 7389 bss_chan = wlan_vdev_mlme_get_bss_chan(vdev); 7390 if (!bss_chan) 7391 return QDF_STATUS_E_FAILURE; 7392 7393 pdev = wlan_vdev_get_pdev(vdev); 7394 if (!pdev) { 7395 mlme_err("vdev %d: Pdev is NULL", vdev_id); 7396 return QDF_STATUS_E_INVAL; 7397 } 7398 7399 ch_params.ch_width = ch_width; 7400 curr_op_freq = des_chan->ch_freq; 7401 7402 wlan_reg_set_channel_params_for_pwrmode(pdev, curr_op_freq, 7403 sec_2g_freq, &ch_params, 7404 REG_CURRENT_PWR_MODE); 7405 7406 des_chan->ch_width = ch_width; 7407 des_chan->ch_freq_seg1 = ch_params.center_freq_seg0; 7408 des_chan->ch_freq_seg2 = ch_params.center_freq_seg1; 7409 des_chan->ch_cfreq1 = ch_params.mhz_freq_seg0; 7410 des_chan->ch_cfreq2 = ch_params.mhz_freq_seg1; 7411 wlan_mlme_set_puncture(des_chan, puncture_bitmap); 7412 7413 status = wlan_update_peer_phy_mode(des_chan, vdev); 7414 if (QDF_IS_STATUS_ERROR(status)) { 7415 mlme_err("Failed to update phymode"); 7416 return QDF_STATUS_E_INVAL; 7417 } 7418 7419 qdf_mem_copy(bss_chan, des_chan, sizeof(struct wlan_channel)); 7420 7421 mlme_legacy_debug("vdev id %d freq %d seg0 %d seg1 %d ch_width %d mhz seg0 %d mhz seg1 %d", 7422 vdev_id, curr_op_freq, ch_params.center_freq_seg0, 7423 ch_params.center_freq_seg1, ch_params.ch_width, 7424 ch_params.mhz_freq_seg0, ch_params.mhz_freq_seg1); 7425 7426 return QDF_STATUS_SUCCESS; 7427 } 7428 7429 static uint32_t 7430 wlan_mlme_get_vht_rate_flags(enum phy_ch_width ch_width) 7431 { 7432 uint32_t rate_flags = 0; 7433 7434 if (ch_width == CH_WIDTH_80P80MHZ || ch_width == CH_WIDTH_160MHZ) 7435 rate_flags |= TX_RATE_VHT160 | TX_RATE_VHT80 | TX_RATE_VHT40 | 7436 TX_RATE_VHT20; 7437 if (ch_width == CH_WIDTH_80MHZ) 7438 rate_flags |= TX_RATE_VHT80 | TX_RATE_VHT40 | TX_RATE_VHT20; 7439 else if (ch_width) 7440 rate_flags |= TX_RATE_VHT40 | TX_RATE_VHT20; 7441 else 7442 rate_flags |= TX_RATE_VHT20; 7443 return rate_flags; 7444 } 7445 7446 static uint32_t wlan_mlme_get_ht_rate_flags(enum phy_ch_width ch_width) 7447 { 7448 uint32_t rate_flags = 0; 7449 7450 if (ch_width) 7451 rate_flags |= TX_RATE_HT40 | TX_RATE_HT20; 7452 else 7453 rate_flags |= TX_RATE_HT20; 7454 7455 return rate_flags; 7456 } 7457 7458 #ifdef WLAN_FEATURE_11BE 7459 static uint32_t 7460 wlan_mlme_get_eht_rate_flags(enum phy_ch_width ch_width) 7461 { 7462 uint32_t rate_flags = 0; 7463 7464 if (ch_width == CH_WIDTH_320MHZ) 7465 rate_flags |= TX_RATE_EHT320 | TX_RATE_EHT160 | 7466 TX_RATE_EHT80 | TX_RATE_EHT40 | TX_RATE_EHT20; 7467 else if (ch_width == CH_WIDTH_160MHZ || ch_width == CH_WIDTH_80P80MHZ) 7468 rate_flags |= TX_RATE_EHT160 | TX_RATE_EHT80 | TX_RATE_EHT40 | 7469 TX_RATE_EHT20; 7470 else if (ch_width == CH_WIDTH_80MHZ) 7471 rate_flags |= TX_RATE_EHT80 | TX_RATE_EHT40 | TX_RATE_EHT20; 7472 else if (ch_width) 7473 rate_flags |= TX_RATE_EHT40 | TX_RATE_EHT20; 7474 else 7475 rate_flags |= TX_RATE_EHT20; 7476 7477 return rate_flags; 7478 } 7479 7480 static QDF_STATUS 7481 wlan_mlme_set_bss_rate_flags_eht(uint32_t *rate_flags, uint8_t eht_present, 7482 enum phy_ch_width ch_width) 7483 { 7484 if (!eht_present) 7485 return QDF_STATUS_E_NOSUPPORT; 7486 7487 *rate_flags |= wlan_mlme_get_eht_rate_flags(ch_width); 7488 7489 return QDF_STATUS_SUCCESS; 7490 } 7491 #else 7492 static inline QDF_STATUS 7493 wlan_mlme_set_bss_rate_flags_eht(uint32_t *rate_flags, uint8_t eht_present, 7494 enum phy_ch_width ch_width) 7495 { 7496 return QDF_STATUS_E_NOSUPPORT; 7497 } 7498 #endif 7499 7500 #ifdef WLAN_FEATURE_11AX 7501 static uint32_t wlan_mlme_get_he_rate_flags(enum phy_ch_width ch_width) 7502 { 7503 uint32_t rate_flags = 0; 7504 7505 if (ch_width == CH_WIDTH_160MHZ || 7506 ch_width == CH_WIDTH_80P80MHZ) 7507 rate_flags |= TX_RATE_HE160 | TX_RATE_HE80 | TX_RATE_HE40 | 7508 TX_RATE_HE20; 7509 else if (ch_width == CH_WIDTH_80MHZ) 7510 rate_flags |= TX_RATE_HE80 | TX_RATE_HE40 | TX_RATE_HE20; 7511 else if (ch_width) 7512 rate_flags |= TX_RATE_HE40 | TX_RATE_HE20; 7513 else 7514 rate_flags |= TX_RATE_HE20; 7515 7516 return rate_flags; 7517 } 7518 7519 static QDF_STATUS wlan_mlme_set_bss_rate_flags_he(uint32_t *rate_flags, 7520 uint8_t he_present, 7521 enum phy_ch_width ch_width) 7522 { 7523 if (!he_present) 7524 return QDF_STATUS_E_NOSUPPORT; 7525 7526 *rate_flags |= wlan_mlme_get_he_rate_flags(ch_width); 7527 7528 return QDF_STATUS_SUCCESS; 7529 } 7530 7531 #else 7532 static inline QDF_STATUS 7533 wlan_mlme_set_bss_rate_flags_he(uint32_t *rate_flags, 7534 uint8_t he_present, 7535 enum phy_ch_width ch_width) 7536 { 7537 return QDF_STATUS_E_NOSUPPORT; 7538 } 7539 #endif 7540 7541 static QDF_STATUS 7542 wlan_mlme_cp_stats_set_rate_flags(struct wlan_objmgr_vdev *vdev, 7543 uint32_t flags) 7544 { 7545 struct vdev_mc_cp_stats *vdev_mc_stats; 7546 struct vdev_cp_stats *vdev_cp_stats_priv; 7547 7548 vdev_cp_stats_priv = wlan_cp_stats_get_vdev_stats_obj(vdev); 7549 if (!vdev_cp_stats_priv) { 7550 cp_stats_err("vdev cp stats object is null"); 7551 return QDF_STATUS_E_NULL_VALUE; 7552 } 7553 7554 wlan_cp_stats_vdev_obj_lock(vdev_cp_stats_priv); 7555 vdev_mc_stats = vdev_cp_stats_priv->vdev_stats; 7556 vdev_mc_stats->tx_rate_flags = flags; 7557 wlan_cp_stats_vdev_obj_unlock(vdev_cp_stats_priv); 7558 7559 return QDF_STATUS_SUCCESS; 7560 } 7561 7562 QDF_STATUS 7563 wlan_mlme_update_bss_rate_flags(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, 7564 enum phy_ch_width cw, uint8_t eht_present, 7565 uint8_t he_present, uint8_t vht_present, 7566 uint8_t ht_present) 7567 { 7568 uint32_t *rate_flags; 7569 struct vdev_mlme_obj *vdev_mlme; 7570 struct wlan_objmgr_vdev *vdev; 7571 QDF_STATUS status; 7572 7573 if (!eht_present && !he_present && !vht_present && !ht_present) 7574 return QDF_STATUS_E_INVAL; 7575 7576 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, 7577 WLAN_HDD_ID_OBJ_MGR); 7578 if (!vdev) { 7579 mlme_debug("vdev: %d vdev not found", vdev_id); 7580 return QDF_STATUS_E_INVAL; 7581 } 7582 7583 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 7584 if (!vdev_mlme) { 7585 mlme_debug("vdev: %d mlme obj not found", vdev_id); 7586 wlan_objmgr_vdev_release_ref(vdev, WLAN_HDD_ID_OBJ_MGR); 7587 return QDF_STATUS_E_INVAL; 7588 } 7589 7590 rate_flags = &vdev_mlme->mgmt.rate_info.rate_flags; 7591 *rate_flags = 0; 7592 7593 status = wlan_mlme_set_bss_rate_flags_eht(rate_flags, eht_present, cw); 7594 if (QDF_IS_STATUS_ERROR(status)) { 7595 status = wlan_mlme_set_bss_rate_flags_he(rate_flags, 7596 he_present, cw); 7597 if (QDF_IS_STATUS_ERROR(status)) { 7598 if (vht_present) 7599 *rate_flags = wlan_mlme_get_vht_rate_flags(cw); 7600 else if (ht_present) 7601 *rate_flags |= wlan_mlme_get_ht_rate_flags(cw); 7602 } 7603 } 7604 7605 mlme_debug("vdev:%d, eht:%u, he:%u, vht:%u, ht:%u, flag:%x, cw:%d", 7606 vdev_id, eht_present, he_present, vht_present, ht_present, 7607 *rate_flags, cw); 7608 7609 status = wlan_mlme_cp_stats_set_rate_flags(vdev, *rate_flags); 7610 7611 wlan_objmgr_vdev_release_ref(vdev, WLAN_HDD_ID_OBJ_MGR); 7612 return status; 7613 } 7614 7615 QDF_STATUS 7616 wlan_mlme_send_ch_width_update_with_notify(struct wlan_objmgr_psoc *psoc, 7617 struct wlan_objmgr_vdev *vdev, 7618 uint8_t vdev_id, 7619 enum phy_ch_width ch_width) 7620 { 7621 QDF_STATUS status; 7622 wmi_host_channel_width wmi_chan_width; 7623 enum phy_ch_width associated_ch_width; 7624 struct wlan_channel *des_chan; 7625 struct mlme_legacy_priv *mlme_priv; 7626 qdf_freq_t sec_2g_freq = 0; 7627 7628 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 7629 if (!mlme_priv) 7630 return QDF_STATUS_E_INVAL; 7631 7632 des_chan = wlan_vdev_mlme_get_des_chan(vdev); 7633 if (!des_chan) 7634 return QDF_STATUS_E_INVAL; 7635 7636 associated_ch_width = 7637 mlme_priv->connect_info.assoc_chan_info.assoc_ch_width; 7638 if (associated_ch_width == CH_WIDTH_INVALID || 7639 ch_width > associated_ch_width) { 7640 mlme_debug("vdev %d: Invalid new chwidth:%d, assoc ch_width:%d", 7641 vdev_id, ch_width, associated_ch_width); 7642 return QDF_STATUS_E_INVAL; 7643 } 7644 7645 if (wlan_reg_is_24ghz_ch_freq(des_chan->ch_freq)) { 7646 if (ch_width == CH_WIDTH_40MHZ && 7647 mlme_priv->connect_info.assoc_chan_info.sec_2g_freq) { 7648 sec_2g_freq = 7649 mlme_priv->connect_info.assoc_chan_info.sec_2g_freq; 7650 } else if (ch_width != CH_WIDTH_20MHZ) { 7651 mlme_debug("vdev %d: CW:%d update not supported for freq:%d sec_2g_freq %d", 7652 vdev_id, ch_width, des_chan->ch_freq, 7653 mlme_priv->connect_info.assoc_chan_info.sec_2g_freq); 7654 return QDF_STATUS_E_NOSUPPORT; 7655 } 7656 } 7657 7658 /* update ch width to internal host structure */ 7659 status = wlan_mlme_update_ch_width(vdev, vdev_id, ch_width, 0, 7660 sec_2g_freq); 7661 if (QDF_IS_STATUS_ERROR(status)) { 7662 mlme_err("vdev %d: Failed to update CW:%d to host, status:%d", 7663 vdev_id, ch_width, status); 7664 return status; 7665 } 7666 7667 wmi_chan_width = target_if_phy_ch_width_to_wmi_chan_width(ch_width); 7668 7669 /* update ch width to fw */ 7670 status = wlan_mlme_update_vdev_chwidth_with_notify(psoc, vdev, vdev_id, 7671 wmi_chan_width); 7672 if (QDF_IS_STATUS_ERROR(status)) 7673 mlme_err("vdev %d: Failed to update CW:%d to fw, status:%d", 7674 vdev_id, ch_width, status); 7675 7676 return status; 7677 } 7678 7679 enum phy_ch_width 7680 wlan_mlme_convert_vht_op_bw_to_phy_ch_width(uint8_t channel_width, 7681 uint8_t chan_id, 7682 uint8_t ccfs0, 7683 uint8_t ccfs1) 7684 { 7685 /** channel_width in vht op from 802.11-2020 7686 * Set to 0 for 20 MHz or 40 MHz BSS bandwidth. 7687 * Set to 1 for 80 MHz, 160 MHz or 80+80 MHz BSS 7688 * bandwidth. 7689 * Set to 2 for 160 MHz BSS bandwidth (deprecated). 7690 * Set to 3 for noncontiguous 80+80 MHz BSS 7691 * bandwidth (deprecated). 7692 * Values in the range 4 to 255 are reserved 7693 * 7694 * 80+80 not supported by MCC platform, so downgrade to 80 7695 */ 7696 enum phy_ch_width phy_bw = CH_WIDTH_20MHZ; 7697 7698 if (channel_width == WLAN_VHTOP_CHWIDTH_2040) { 7699 phy_bw = CH_WIDTH_20MHZ; 7700 if (abs(ccfs0 - chan_id) == 2) 7701 phy_bw = CH_WIDTH_40MHZ; 7702 } else if (channel_width == WLAN_VHTOP_CHWIDTH_80) { 7703 if (ccfs1 && (abs(ccfs1 - ccfs0) == 8)) 7704 phy_bw = CH_WIDTH_160MHZ; 7705 else 7706 phy_bw = CH_WIDTH_80MHZ; 7707 } else if (channel_width == WLAN_VHTOP_CHWIDTH_160) { 7708 phy_bw = CH_WIDTH_160MHZ; 7709 } else if (channel_width == WLAN_VHTOP_CHWIDTH_80_80) { 7710 phy_bw = WLAN_VHTOP_CHWIDTH_80; 7711 } 7712 7713 return phy_bw; 7714 } 7715 7716 enum phy_ch_width 7717 wlan_mlme_convert_he_6ghz_op_bw_to_phy_ch_width(uint8_t channel_width, 7718 uint8_t chan_id, 7719 uint8_t ccfs0, 7720 uint8_t ccfs1) 7721 { 7722 enum phy_ch_width phy_bw = CH_WIDTH_20MHZ; 7723 7724 if (channel_width == WLAN_HE_6GHZ_CHWIDTH_20) { 7725 phy_bw = CH_WIDTH_20MHZ; 7726 } else if (channel_width == WLAN_HE_6GHZ_CHWIDTH_40) { 7727 phy_bw = CH_WIDTH_40MHZ; 7728 } else if (channel_width == WLAN_HE_6GHZ_CHWIDTH_80) { 7729 phy_bw = CH_WIDTH_80MHZ; 7730 } else if (channel_width == WLAN_HE_6GHZ_CHWIDTH_160_80_80) { 7731 phy_bw = CH_WIDTH_160MHZ; 7732 /* 80+80 not supported */ 7733 if (ccfs1 && abs(ccfs0 - ccfs1) > 8) 7734 phy_bw = CH_WIDTH_80MHZ; 7735 } 7736 7737 return phy_bw; 7738 } 7739 7740 void 7741 wlan_mlme_set_edca_pifs_param(struct wlan_edca_pifs_param_ie *ep, 7742 enum host_edca_param_type type) 7743 { 7744 ep->edca_param_type = type; 7745 7746 if (type == HOST_EDCA_PARAM_TYPE_AGGRESSIVE) { 7747 ep->edca_pifs_param.eparam.acvo_aifsn = CFG_EDCA_PARAM_AIFSN; 7748 ep->edca_pifs_param.eparam.acvo_acm = CFG_EDCA_PARAM_ACM; 7749 ep->edca_pifs_param.eparam.acvo_aci = CFG_EDCA_PARAM_ACI; 7750 ep->edca_pifs_param.eparam.acvo_cwmin = CFG_EDCA_PARAM_CWMIN; 7751 ep->edca_pifs_param.eparam.acvo_cwmax = CFG_EDCA_PARAM_CWMAX; 7752 ep->edca_pifs_param.eparam.acvo_txoplimit = CFG_EDCA_PARAM_TXOP; 7753 } else if (type == HOST_EDCA_PARAM_TYPE_PIFS) { 7754 ep->edca_pifs_param.pparam.sap_pifs_offset = 7755 CFG_PIFS_PARAM_SAP_OFFSET; 7756 ep->edca_pifs_param.pparam.leb_pifs_offset = 7757 CFG_PIFS_PARAM_LEB_OFFSET; 7758 ep->edca_pifs_param.pparam.reb_pifs_offset = 7759 CFG_PIFS_PARAM_REB_OFFSET; 7760 } 7761 } 7762 7763 QDF_STATUS 7764 wlan_mlme_stats_get_periodic_display_time(struct wlan_objmgr_psoc *psoc, 7765 uint32_t *periodic_display_time) 7766 { 7767 struct wlan_mlme_psoc_ext_obj *mlme_obj; 7768 7769 mlme_obj = mlme_get_psoc_ext_obj(psoc); 7770 if (!mlme_obj) { 7771 *periodic_display_time = 7772 cfg_default(CFG_PERIODIC_STATS_DISPLAY_TIME); 7773 return QDF_STATUS_E_INVAL; 7774 } 7775 7776 *periodic_display_time = 7777 mlme_obj->cfg.stats.stats_periodic_display_time; 7778 7779 return QDF_STATUS_SUCCESS; 7780 } 7781 7782 bool 7783 wlan_mlme_is_bcn_prot_disabled_for_sap(struct wlan_objmgr_psoc *psoc) 7784 { 7785 struct wlan_mlme_psoc_ext_obj *mlme_obj; 7786 7787 mlme_obj = mlme_get_psoc_ext_obj(psoc); 7788 if (!mlme_obj) 7789 return cfg_default(CFG_DISABLE_SAP_BCN_PROT); 7790 7791 return mlme_obj->cfg.sap_cfg.disable_bcn_prot; 7792 } 7793 7794 uint8_t *wlan_mlme_get_src_addr_from_frame(struct element_info *frame) 7795 { 7796 struct wlan_frame_hdr *hdr; 7797 7798 if (!frame || !frame->len || frame->len < WLAN_MAC_HDR_LEN_3A) 7799 return NULL; 7800 7801 hdr = (struct wlan_frame_hdr *)frame->ptr; 7802 7803 return hdr->i_addr2; 7804 } 7805 7806 bool 7807 wlan_mlme_get_sap_ps_with_twt(struct wlan_objmgr_psoc *psoc) 7808 { 7809 struct wlan_mlme_psoc_ext_obj *mlme_obj; 7810 7811 mlme_obj = mlme_get_psoc_ext_obj(psoc); 7812 if (!mlme_obj) 7813 return cfg_default(CFG_SAP_PS_WITH_TWT); 7814 7815 return mlme_obj->cfg.sap_cfg.sap_ps_with_twt_enable; 7816 } 7817 7818 /** 7819 * set_omi_ch_width() - set OMI ch_bw/eht_ch_bw_ext bit value from channel width 7820 * @ch_width: channel width 7821 * @omi_data: Pointer to omi_data object 7822 * 7823 * If the channel width is 20Mhz, 40Mhz, 80Mhz, 160Mhz and 80+80Mhz ch_bw set 7824 * to 0, 1, 2, 3 accordingly, if channel width is 320Mhz then eht_ch_bw_ext 7825 * set to 1 7826 * 7827 * Return: QDF_STATUS_SUCCESS on success or QDF_STATUS_E_INVAL on failure 7828 */ 7829 static QDF_STATUS 7830 set_omi_ch_width(enum phy_ch_width ch_width, struct omi_ctrl_tx *omi_data) 7831 { 7832 switch (ch_width) { 7833 case CH_WIDTH_20MHZ: 7834 omi_data->ch_bw = 0; 7835 break; 7836 case CH_WIDTH_40MHZ: 7837 omi_data->ch_bw = 1; 7838 break; 7839 case CH_WIDTH_80MHZ: 7840 omi_data->ch_bw = 2; 7841 break; 7842 case CH_WIDTH_160MHZ: 7843 case CH_WIDTH_80P80MHZ: 7844 omi_data->ch_bw = 3; 7845 break; 7846 case CH_WIDTH_320MHZ: 7847 omi_data->eht_ch_bw_ext = 1; 7848 break; 7849 default: 7850 return QDF_STATUS_E_INVAL; 7851 } 7852 7853 return QDF_STATUS_SUCCESS; 7854 } 7855 7856 QDF_STATUS 7857 wlan_mlme_set_ul_mu_config(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, 7858 uint8_t ulmu_disable) 7859 { 7860 struct omi_ctrl_tx omi_data = {0}; 7861 uint32_t param_val = 0; 7862 struct wlan_objmgr_pdev *pdev; 7863 struct wlan_objmgr_vdev *vdev; 7864 enum phy_ch_width ch_width; 7865 uint8_t rx_nss, tx_nsts; 7866 struct qdf_mac_addr macaddr = {0}; 7867 enum wlan_phymode peer_phymode; 7868 qdf_freq_t op_chan_freq; 7869 qdf_freq_t freq_seg_0; 7870 QDF_STATUS status = QDF_STATUS_SUCCESS; 7871 7872 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, 7873 WLAN_MLME_OBJMGR_ID); 7874 if (!vdev) { 7875 mlme_err("vdev %d: vdev is NULL", vdev_id); 7876 return QDF_STATUS_E_INVAL; 7877 } 7878 7879 pdev = wlan_vdev_get_pdev(vdev); 7880 if (!pdev) { 7881 mlme_err("pdev is NULL"); 7882 status = QDF_STATUS_E_INVAL; 7883 goto err; 7884 } 7885 7886 if (!cm_is_vdevid_connected(pdev, vdev_id)) { 7887 mlme_err("STA is not connected, Session_id: %d", vdev_id); 7888 status = QDF_STATUS_E_INVAL; 7889 goto err; 7890 } 7891 7892 status = wlan_vdev_get_bss_peer_mac(vdev, &macaddr); 7893 if (QDF_STATUS_SUCCESS != status) { 7894 mlme_err("Failed to get bss peer mac, Err : %d", status); 7895 goto err; 7896 } 7897 7898 status = mlme_get_peer_phymode(psoc, macaddr.bytes, &peer_phymode); 7899 if (QDF_STATUS_SUCCESS != status) { 7900 mlme_err("Failed to get peer phymode, Err : %d", status); 7901 goto err; 7902 } 7903 7904 if (!(IS_WLAN_PHYMODE_HE(peer_phymode) || 7905 IS_WLAN_PHYMODE_EHT(peer_phymode))) { 7906 mlme_err("Invalid mode"); 7907 status = QDF_STATUS_E_INVAL; 7908 goto err; 7909 } 7910 7911 status = wlan_mlme_get_sta_rx_nss(psoc, vdev, &rx_nss); 7912 if (QDF_STATUS_SUCCESS != status) { 7913 mlme_err("Failed to get sta_rx_nss, Err : %d", status); 7914 goto err; 7915 } 7916 7917 status = wlan_mlme_get_sta_tx_nss(psoc, vdev, &tx_nsts); 7918 if (QDF_STATUS_SUCCESS != status) { 7919 mlme_err("Failed to get sta_tx_nss, Err : %d", status); 7920 goto err; 7921 } 7922 7923 status = wlan_get_op_chan_freq_info_vdev_id(pdev, vdev_id, 7924 &op_chan_freq, 7925 &freq_seg_0, &ch_width); 7926 if (QDF_STATUS_SUCCESS != status) { 7927 mlme_err("Failed to get bw, Err : %d", status); 7928 goto err; 7929 } 7930 7931 omi_data.omi_in_vht = 0x1; 7932 omi_data.omi_in_he = 0x1; 7933 omi_data.a_ctrl_id = 0x1; 7934 7935 status = set_omi_ch_width(ch_width, &omi_data); 7936 if (QDF_STATUS_SUCCESS != status) { 7937 mlme_err("Failed to set bw, Err : %d", status); 7938 goto err; 7939 } 7940 7941 omi_data.rx_nss = rx_nss - 1; 7942 omi_data.tx_nsts = tx_nsts - 1; 7943 omi_data.ul_mu_dis = ulmu_disable; 7944 omi_data.ul_mu_data_dis = 0; 7945 7946 qdf_mem_copy(¶m_val, &omi_data, sizeof(omi_data)); 7947 7948 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, 7949 omi_data.ch_bw, omi_data.tx_nsts, omi_data.rx_nss, 7950 omi_data.ul_mu_dis, omi_data.omi_in_vht, omi_data.omi_in_he, 7951 omi_data.eht_ch_bw_ext, omi_data.eht_rx_nss_ext, 7952 omi_data.eht_tx_nss_ext, param_val, 7953 QDF_MAC_ADDR_REF(macaddr.bytes)); 7954 7955 status = wlan_util_vdev_peer_set_param_send(vdev, macaddr.bytes, 7956 WMI_PEER_PARAM_XMIT_OMI, 7957 param_val); 7958 if (QDF_STATUS_SUCCESS != status) 7959 mlme_err("set_peer_param_cmd returned %d", status); 7960 7961 err: 7962 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID); 7963 return status; 7964 } 7965 7966 uint32_t 7967 wlan_mlme_assemble_rate_code(uint8_t preamble, uint8_t nss, uint8_t rate) 7968 { 7969 uint32_t set_value; 7970 7971 if (wma_get_fw_wlan_feat_caps(DOT11AX)) 7972 set_value = ASSEMBLE_RATECODE_V1(preamble, nss, rate); 7973 else 7974 set_value = (preamble << 6) | (nss << 4) | rate; 7975 7976 return set_value; 7977 } 7978 7979 QDF_STATUS 7980 wlan_mlme_set_ap_oper_ch_width(struct wlan_objmgr_vdev *vdev, 7981 enum phy_ch_width ch_width) 7982 7983 { 7984 struct mlme_legacy_priv *mlme_priv; 7985 7986 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 7987 if (!mlme_priv) { 7988 mlme_legacy_err("vdev %d legacy private object is NULL", 7989 wlan_vdev_get_id(vdev)); 7990 return QDF_STATUS_E_FAILURE; 7991 } 7992 7993 mlme_priv->mlme_ap.oper_ch_width = ch_width; 7994 mlme_debug("SAP oper ch_width: %d, vdev %d", 7995 mlme_priv->mlme_ap.oper_ch_width, wlan_vdev_get_id(vdev)); 7996 7997 return QDF_STATUS_SUCCESS; 7998 } 7999 8000 enum phy_ch_width 8001 wlan_mlme_get_ap_oper_ch_width(struct wlan_objmgr_vdev *vdev) 8002 { 8003 struct mlme_legacy_priv *mlme_priv; 8004 8005 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev); 8006 if (!mlme_priv) { 8007 mlme_legacy_err("vdev %d legacy private object is NULL", 8008 wlan_vdev_get_id(vdev)); 8009 return CH_WIDTH_INVALID; 8010 } 8011 8012 return mlme_priv->mlme_ap.oper_ch_width; 8013 } 8014 8015 QDF_STATUS 8016 wlan_mlme_send_csa_event_status_ind(struct wlan_objmgr_vdev *vdev, 8017 uint8_t csa_status) 8018 { 8019 return wlan_mlme_send_csa_event_status_ind_cmd(vdev, csa_status); 8020 } 8021 8022 #ifdef WLAN_FEATURE_11BE 8023 QDF_STATUS 8024 wlan_mlme_get_bw_no_punct(struct wlan_objmgr_psoc *psoc, 8025 struct wlan_objmgr_vdev *vdev, 8026 struct wlan_channel *bss_chan, 8027 enum phy_ch_width *new_ch_width) 8028 { 8029 uint16_t new_punct_bitmap = 0; 8030 enum phy_ch_width ch_width; 8031 QDF_STATUS status = QDF_STATUS_E_FAILURE; 8032 uint8_t country[REG_ALPHA2_LEN + 1]; 8033 8034 wlan_reg_read_current_country(psoc, country); 8035 8036 if (!wlan_reg_is_6ghz_chan_freq(bss_chan->ch_freq) || 8037 !bss_chan->puncture_bitmap || 8038 qdf_mem_cmp(country, "US", REG_ALPHA2_LEN) || 8039 mlme_get_best_6g_power_type(vdev) != REG_INDOOR_AP || 8040 !IS_WLAN_PHYMODE_EHT(bss_chan->ch_phymode)) 8041 goto err; 8042 8043 ch_width = bss_chan->ch_width; 8044 8045 while (ch_width != CH_WIDTH_INVALID) { 8046 status = wlan_reg_extract_puncture_by_bw(bss_chan->ch_width, 8047 bss_chan->puncture_bitmap, 8048 bss_chan->ch_freq, 8049 bss_chan->ch_cfreq2, 8050 ch_width, 8051 &new_punct_bitmap); 8052 if (QDF_IS_STATUS_SUCCESS(status) && new_punct_bitmap) 8053 ch_width = wlan_get_next_lower_bandwidth(ch_width); 8054 else 8055 break; 8056 } 8057 8058 if (ch_width == bss_chan->ch_width) 8059 return QDF_STATUS_E_FAILURE; 8060 8061 mlme_debug("freq %d ccfs2 %d punct 0x%x BW old %d, new %d", 8062 bss_chan->ch_freq, bss_chan->ch_cfreq2, bss_chan->puncture_bitmap, 8063 bss_chan->ch_width, ch_width); 8064 8065 *new_ch_width = ch_width; 8066 bss_chan->puncture_bitmap = 0; 8067 err: 8068 return status; 8069 } 8070 8071 QDF_STATUS 8072 wlan_mlme_update_bw_no_punct(struct wlan_objmgr_psoc *psoc, 8073 uint8_t vdev_id) 8074 { 8075 struct wlan_objmgr_vdev *vdev; 8076 QDF_STATUS status = QDF_STATUS_E_FAILURE; 8077 enum phy_ch_width new_ch_width; 8078 struct wlan_objmgr_pdev *pdev; 8079 8080 pdev = wlan_objmgr_get_pdev_by_id(psoc, 0, 8081 WLAN_MLME_NB_ID); 8082 if (!pdev) { 8083 sme_err("pdev is NULL"); 8084 return QDF_STATUS_E_FAILURE; 8085 } 8086 vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id, 8087 WLAN_MLME_NB_ID); 8088 if (!vdev) { 8089 mlme_err("VDEV not found for vdev id : %d", vdev_id); 8090 goto rel_pdev; 8091 } 8092 8093 status = wlan_mlme_get_bw_no_punct(psoc, vdev, 8094 wlan_vdev_mlme_get_des_chan(vdev), 8095 &new_ch_width); 8096 if (QDF_IS_STATUS_ERROR(status)) 8097 goto rel_vdev; 8098 8099 status = wlan_mlme_send_ch_width_update_with_notify(psoc, 8100 vdev, 8101 vdev_id, 8102 new_ch_width); 8103 rel_vdev: 8104 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID); 8105 rel_pdev: 8106 wlan_objmgr_pdev_release_ref(pdev, WLAN_MLME_NB_ID); 8107 8108 return status; 8109 } 8110 #endif 8111