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