diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index abd739b6fb23..842537923555 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -6338,6 +6338,8 @@ wlan_hdd_wifi_test_config_policy[ .type = NLA_U8}, [QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_ENABLE_TX_BEAMFORMEE] = { .type = NLA_U8}, + [QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_TX_BEAMFORMEE_NSTS] = { + .type = NLA_U8}, }; /** @@ -7574,6 +7576,26 @@ __wlan_hdd_cfg80211_set_wifi_test_config(struct wiphy *wiphy, } + if (tb[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_TX_BEAMFORMEE_NSTS]) { + cfg_val = nla_get_u8(tb[ + QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_TX_BEAMFORMEE_NSTS]); + if (cfg_val > hdd_ctx->config->txBFCsnValue) { + hdd_err("NSTS %d not supported, supp_val %d", cfg_val, + hdd_ctx->config->txBFCsnValue); + ret_val = -ENOTSUPP; + goto send_err; + } + hdd_debug("Set Tx beamformee NSTS to %d", cfg_val); + ret_val = sme_update_tx_bfee_nsts(hdd_ctx->mac_handle, + adapter->session_id, + cfg_val, + hdd_ctx->config->txBFCsnValue + ); + if (ret_val) + sme_err("Failed to set Tx beamformee cap"); + + } + if (update_sme_cfg) sme_update_config(mac_handle, sme_config); diff --git a/core/mac/inc/ani_global.h b/core/mac/inc/ani_global.h index 19ac8cc21544..a6ffa1287678 100644 --- a/core/mac/inc/ani_global.h +++ b/core/mac/inc/ani_global.h @@ -922,6 +922,7 @@ typedef struct sAniSirGlobal { bool is_usr_cfg_amsdu_enabled; uint8_t no_ack_policy_cfg[MAX_NUM_AC]; uint32_t he_sgi_ltf_cfg_bit_mask; + uint8_t usr_cfg_tx_bfee_nsts; struct mgmt_beacon_probe_filter bcn_filter; #ifdef WLAN_FEATURE_11AX tDot11fIEhe_cap he_cap_2g; diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h index 485bd0fcb700..3ee7a1ddcd29 100644 --- a/core/sme/inc/sme_api.h +++ b/core/sme/inc/sme_api.h @@ -1158,6 +1158,18 @@ QDF_STATUS sme_update_roam_scan_hi_rssi_scan_params(tHalHandle hal_handle, int sme_update_tx_bfee_supp(tHalHandle hal, uint8_t session_id, uint8_t cfg_val); +/** + * sme_update_tx_bfee_nsts() - sets the Tx Bfee nsts + * @hal: MAC handle + * @session_id: SME session id + * @usr_cfg_val: user config value + * @nsts_val: Tx Bfee nsts config value + * + * Return: 0 on success else err code + */ +int sme_update_tx_bfee_nsts(mac_handle_t hal, uint8_t session_id, + uint8_t usr_cfg_val, uint8_t nsts_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); @@ -2311,6 +2323,17 @@ void sme_update_he_cap_nss(tHalHandle hal, uint8_t session_id, */ int sme_update_he_tx_bfee_supp(tHalHandle hal, uint8_t session_id, uint8_t cfg_val); + +/** + * sme_update_he_tx_bfee_nsts() - sets the HE Tx Bfee NSTS + * @hal: MAC handle + * @session_id: SME session id + * @cfg_val: Tx Bfee NSTS value + * + * Return: 0 on success else err code + */ +int sme_update_he_tx_bfee_nsts(mac_handle_t 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 @@ -2402,6 +2425,11 @@ static inline int sme_update_he_tx_bfee_supp(tHalHandle hal, uint8_t session_id, { return 0; } +static inline int sme_update_he_tx_bfee_nsts(mac_handle_t 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 4eabd1f6bab4..849a88617dd8 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -12787,6 +12787,29 @@ int sme_update_tx_bfee_supp(tHalHandle hal, uint8_t session_id, return sme_update_he_tx_bfee_supp(hal, session_id, cfg_val); } + +int sme_update_tx_bfee_nsts(mac_handle_t hal, uint8_t session_id, + uint8_t usr_cfg_val, uint8_t nsts_val) +{ + tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal); + QDF_STATUS status = QDF_STATUS_SUCCESS; + uint8_t nsts_set_val; + + mac_ctx->usr_cfg_tx_bfee_nsts = usr_cfg_val; + if (usr_cfg_val) + nsts_set_val = usr_cfg_val; + else + nsts_set_val = nsts_val; + status = sme_cfg_set_int(hal, + WNI_CFG_VHT_CSN_BEAMFORMEE_ANT_SUPPORTED, + nsts_set_val); + if (status != QDF_STATUS_SUCCESS) { + sme_err("Failed to set SU BFEE NSTS CFG"); + return -EFAULT; + } + + return sme_update_he_tx_bfee_nsts(hal, session_id, nsts_set_val); +} #ifdef WLAN_FEATURE_11AX void sme_update_tgt_he_cap(mac_handle_t mac_handle, struct wma_tgt_cfg *cfg) { @@ -12916,6 +12939,13 @@ int sme_update_he_tx_bfee_supp(tHalHandle hal, uint8_t session_id, cfg_val); } +int sme_update_he_tx_bfee_nsts(mac_handle_t hal, uint8_t session_id, + uint8_t cfg_val) +{ + return sme_update_he_cap(hal, session_id, WNI_CFG_HE_BFEE_STS_LT80, + 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 9913139fdb72..0c45a04a0cdc 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -15836,9 +15836,11 @@ QDF_STATUS csr_send_join_req_msg(tpAniSirGlobal pMac, uint32_t sessionId, if (IS_DOT11_MODE_HE(csr_join_req->dot11mode)) { csr_join_req_copy_he_cap(csr_join_req, pSession); /* change the HE caps like sts per band */ - CSR_REVISE_REQ_HE_CAP_PER_BAND(csr_join_req, pMac, - pBssDescription-> - channelId); + if (!pMac->usr_cfg_tx_bfee_nsts) + CSR_REVISE_REQ_HE_CAP_PER_BAND(csr_join_req, + pMac, + pBssDescription-> + channelId); } if (wlan_cfg_get_int(pMac, WNI_CFG_VHT_SU_BEAMFORMEE_CAP,