diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 8e3a5c1824..d069b62434 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -6206,6 +6206,8 @@ wlan_hdd_wifi_test_config_policy[ .type = NLA_U8}, [QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_LTF] = { .type = NLA_U8}, + [QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_ENABLE_TX_BEAMFORMEE] = { + .type = NLA_U8}, }; /** @@ -7400,6 +7402,18 @@ __wlan_hdd_cfg80211_set_wifi_test_config(struct wiphy *wiphy, goto send_err; } + if (tb[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_ENABLE_TX_BEAMFORMEE]) { + cfg_val = nla_get_u8(tb[ + QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_ENABLE_TX_BEAMFORMEE]); + hdd_debug("Set Tx beamformee to %d", cfg_val); + ret_val = sme_update_tx_bfee_supp(hdd_ctx->hHal, + adapter->session_id, + cfg_val); + if (ret_val) + sme_err("Failed to set Tx beamformee cap"); + + } + if (update_sme_cfg) sme_update_config(hdd_ctx->hHal, sme_config); diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h index b57f06972c..cd63e6914d 100644 --- a/core/sme/inc/sme_api.h +++ b/core/sme/inc/sme_api.h @@ -1058,6 +1058,17 @@ QDF_STATUS sme_update_roam_scan_hi_rssi_scan_params(tHalHandle hal_handle, uint32_t notify_id, int32_t val); +/** + * sme_update_tx_bfee_supp() - sets the Tx Bfee support + * @hal: Pointer to HAL + * @session_id: SME session id + * @cfg_val: Tx Bfee config value + * + * Return: 0 on success else err code + */ +int sme_update_tx_bfee_supp(tHalHandle hal, uint8_t session_id, + uint8_t cfg_val); + void wlan_sap_enable_phy_error_logs(tHalHandle hal, uint32_t enable_log); #ifdef WLAN_FEATURE_DSRC void sme_set_dot11p_config(tHalHandle hal, bool enable_dot11p); @@ -2118,6 +2129,16 @@ int sme_set_auto_rate_he_ltf(tHalHandle hal, uint8_t session_id, void sme_update_he_cap_nss(tHalHandle hal, uint8_t session_id, uint8_t nss); +/** + * sme_update_he_tx_bfee_supp() - sets the HE Tx Bfee support + * @hal: Pointer to HAL + * @session_id: SME session id + * @cfg_val: Tx Bfee config value + * + * Return: 0 on success else err code + */ +int sme_update_he_tx_bfee_supp(tHalHandle hal, uint8_t session_id, + uint8_t cfg_val); /** * sme_update_he_mcs() - sets the HE MCS based on user request * @hal: Pointer to HAL @@ -2194,11 +2215,18 @@ static inline int sme_update_he_frag_supp(tHalHandle hal, uint8_t session_id, { return 0; } + static inline int sme_update_he_ldpc_supp(tHalHandle hal, uint8_t session_id, uint16_t he_ldpc) { return 0; } + +static inline int sme_update_he_tx_bfee_supp(tHalHandle hal, uint8_t session_id, + uint8_t cfg_val) +{ + return 0; +} #endif /** diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index d44d15d0da..d7b5b43cdb 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -12934,6 +12934,20 @@ void sme_update_user_configured_nss(tHalHandle hal, uint8_t nss) mac_ctx->user_configured_nss = nss; } +int sme_update_tx_bfee_supp(tHalHandle hal, uint8_t session_id, + uint8_t cfg_val) +{ + tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal); + QDF_STATUS status = QDF_STATUS_SUCCESS; + status = sme_cfg_set_int(mac_ctx, WNI_CFG_VHT_SU_BEAMFORMEE_CAP, + cfg_val); + if (status != QDF_STATUS_SUCCESS) { + sme_err("Failed to set SU BFEE CFG"); + return -EFAULT; + } + + return sme_update_he_tx_bfee_supp(hal, session_id, cfg_val); +} #ifdef WLAN_FEATURE_11AX void sme_update_he_cap_nss(tHalHandle hal, uint8_t session_id, uint8_t nss) @@ -13043,6 +13057,13 @@ static int sme_update_he_cap(tHalHandle hal, uint8_t session_id, return 0; } +int sme_update_he_tx_bfee_supp(tHalHandle hal, uint8_t session_id, + uint8_t cfg_val) +{ + return sme_update_he_cap(hal, session_id, WNI_CFG_HE_SU_BEAMFORMEE, + cfg_val); +} + int sme_update_he_tx_stbc_cap(tHalHandle hal, uint8_t session_id, int value) { int ret; diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index 8272825edd..bfb0119047 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -2502,20 +2502,31 @@ void csr_update_session_he_cap(tpAniSirGlobal mac_ctx, he_cap->dcm_enc_rx = value; sme_cfg_get_int(mac_ctx, WNI_CFG_HE_MU_PPDU, &value); he_cap->ul_he_mu = value; - sme_cfg_get_int(mac_ctx, WNI_CFG_HE_SU_BEAMFORMER, &value); - he_cap->su_beamformer = value; sme_cfg_get_int(mac_ctx, WNI_CFG_HE_SU_BEAMFORMEE, &value); he_cap->su_beamformee = value; - sme_cfg_get_int(mac_ctx, WNI_CFG_HE_MU_BEAMFORMER, &value); - he_cap->mu_beamformer = value; - sme_cfg_get_int(mac_ctx, WNI_CFG_HE_BFEE_STS_LT80, &value); - he_cap->bfee_sts_lt_80 = value; - sme_cfg_get_int(mac_ctx, WNI_CFG_HE_BFEE_STS_GT80, &value); - he_cap->bfee_sts_gt_80 = value; - sme_cfg_get_int(mac_ctx, WNI_CFG_HE_NUM_SOUND_LT80, &value); - he_cap->num_sounding_lt_80 = value; - sme_cfg_get_int(mac_ctx, WNI_CFG_HE_NUM_SOUND_GT80, &value); - he_cap->num_sounding_gt_80 = value; + if (he_cap->su_beamformee) { + sme_cfg_get_int(mac_ctx, WNI_CFG_HE_BFEE_STS_LT80, &value); + he_cap->bfee_sts_lt_80 = value; + sme_cfg_get_int(mac_ctx, WNI_CFG_HE_BFEE_STS_GT80, &value); + he_cap->bfee_sts_gt_80 = value; + } else { + he_cap->bfee_sts_lt_80 = 0; + he_cap->bfee_sts_gt_80 = 0; + } + sme_cfg_get_int(mac_ctx, WNI_CFG_HE_SU_BEAMFORMER, &value); + he_cap->su_beamformer = value; + if (he_cap->su_beamformer) { + sme_cfg_get_int(mac_ctx, WNI_CFG_HE_MU_BEAMFORMER, &value); + he_cap->mu_beamformer = value; + sme_cfg_get_int(mac_ctx, WNI_CFG_HE_NUM_SOUND_LT80, &value); + he_cap->num_sounding_lt_80 = value; + sme_cfg_get_int(mac_ctx, WNI_CFG_HE_NUM_SOUND_GT80, &value); + he_cap->num_sounding_gt_80 = value; + } else { + he_cap->mu_beamformer = 0; + he_cap->num_sounding_lt_80 = 0; + he_cap->num_sounding_gt_80 = 0; + } sme_cfg_get_int(mac_ctx, WNI_CFG_HE_SU_FEED_TONE16, &value); he_cap->su_feedback_tone16 = value; sme_cfg_get_int(mac_ctx, WNI_CFG_HE_MU_FEED_TONE16, &value);