diff --git a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h index 3a2c8a055395..8f68044c5f53 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h @@ -823,6 +823,7 @@ struct wlan_mlme_qos { */ struct wlan_mlme_he_caps { tDot11fIEhe_cap dot11_he_cap; + tDot11fIEhe_cap he_cap_orig; uint8_t he_ppet_2g[MLME_HE_PPET_LEN]; uint8_t he_ppet_5g[MLME_HE_PPET_LEN]; uint32_t he_ops_basic_mcs_nss; diff --git a/components/mlme/dispatcher/src/wlan_mlme_api.c b/components/mlme/dispatcher/src/wlan_mlme_api.c index 955aa647bd4b..296eabb0225f 100644 --- a/components/mlme/dispatcher/src/wlan_mlme_api.c +++ b/components/mlme/dispatcher/src/wlan_mlme_api.c @@ -776,6 +776,7 @@ QDF_STATUS mlme_update_tgt_he_caps_in_cfg(struct wlan_objmgr_psoc *psoc, qdf_mem_copy(mlme_obj->cfg.he_caps.he_ppet_5g, wma_cfg->ppet_5g, HE_MAX_PPET_SIZE); + mlme_obj->cfg.he_caps.he_cap_orig = mlme_obj->cfg.he_caps.dot11_he_cap; return status; } #endif diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 9445d7fdea79..3c5549add158 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -5359,6 +5359,8 @@ wlan_hdd_wifi_test_config_policy[ .type = NLA_NESTED}, [QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_ACTION_TX_TB_PPDU] = { .type = NLA_U8}, + [QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_SET_HE_TESTBED_DEFAULTS] + = {.type = NLA_U8}, }; /** @@ -7142,6 +7144,18 @@ __wlan_hdd_cfg80211_set_wifi_test_config(struct wiphy *wiphy, (cfg_val ? true : false)); } + cmd_id = QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_SET_HE_TESTBED_DEFAULTS; + if (tb[cmd_id]) { + cfg_val = nla_get_u8(tb[cmd_id]); + hdd_debug("Configure HE testbed defaults %d", cfg_val); + if (!cfg_val) + sme_reset_he_caps(hdd_ctx->mac_handle, + adapter->vdev_id); + else + sme_set_he_testbed_def(hdd_ctx->mac_handle, + adapter->vdev_id); + } + cmd_id = QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_ACTION_TX_TB_PPDU; if (tb[cmd_id]) { cfg_val = nla_get_u8(tb[cmd_id]); diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h index 51feea26d115..c10ed07d3607 100644 --- a/core/sme/inc/sme_api.h +++ b/core/sme/inc/sme_api.h @@ -2988,6 +2988,19 @@ bool sme_validate_channel_list(mac_handle_t mac_handle, */ void sme_set_amsdu(mac_handle_t mac_handle, bool enable); +#ifdef WLAN_FEATURE_11AX +void sme_set_he_testbed_def(mac_handle_t mac_handle, uint8_t vdev_id); +void sme_reset_he_caps(mac_handle_t mac_handle, uint8_t vdev_id); +#else +static inline void sme_set_he_testbed_def(mac_handle_t mac_handle, + uint8_t vdev_id) +{ +} +static inline void sme_reset_he_caps(mac_handle_t mac_handle, uint8_t vdev_id) +{ +} +#endif + /** * sme_get_mcs_idx() - gets mcs index * @max_rate: max rate diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index a109aa7f0ab3..d21ccdd04231 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -14625,6 +14625,51 @@ void sme_set_amsdu(mac_handle_t mac_handle, bool enable) mac_ctx->is_usr_cfg_amsdu_enabled = enable; } +#ifdef WLAN_FEATURE_11AX +void sme_set_he_testbed_def(mac_handle_t mac_handle, uint8_t vdev_id) +{ + struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle); + struct csr_roam_session *session; + + session = CSR_GET_SESSION(mac_ctx, vdev_id); + + if (!session) { + sme_debug("No session for id %d", vdev_id); + return; + } + sme_debug("set HE testbed defaults"); + mac_ctx->mlme_cfg->he_caps.dot11_he_cap.amsdu_in_ampdu = 0; + mac_ctx->mlme_cfg->he_caps.dot11_he_cap.twt_request = 0; + mac_ctx->mlme_cfg->he_caps.dot11_he_cap.omi_a_ctrl = 0; + mac_ctx->mlme_cfg->he_caps.dot11_he_cap.he_ppdu_20_in_160_80p80Mhz = 0; + mac_ctx->mlme_cfg->he_caps.dot11_he_cap.he_ppdu_20_in_40Mhz_2G = 0; + mac_ctx->mlme_cfg->he_caps.dot11_he_cap.he_ppdu_80_in_160_80p80Mhz = 0; + mac_ctx->mlme_cfg->he_caps.dot11_he_cap.dcm_enc_tx = 0; + mac_ctx->mlme_cfg->he_caps.dot11_he_cap.dcm_enc_rx = 0; + mac_ctx->mlme_cfg->he_caps.dot11_he_cap.max_nc = 0; + mac_ctx->mlme_cfg->he_caps.dot11_he_cap.trigger_frm_mac_pad = + QCA_WLAN_HE_16US_OF_PROCESS_TIME; + csr_update_session_he_cap(mac_ctx, session); +} + +void sme_reset_he_caps(mac_handle_t mac_handle, uint8_t vdev_id) +{ + struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle); + struct csr_roam_session *session; + + session = CSR_GET_SESSION(mac_ctx, vdev_id); + + if (!session) { + sme_err("No session for id %d", vdev_id); + return; + } + sme_debug("reset HE caps"); + mac_ctx->mlme_cfg->he_caps.dot11_he_cap = + mac_ctx->mlme_cfg->he_caps.he_cap_orig; + csr_update_session_he_cap(mac_ctx, session); +} +#endif + uint8_t sme_get_mcs_idx(uint16_t max_rate, uint8_t rate_flags, uint8_t *nss, uint8_t *mcs_rate_flags) {