diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index b396125872e4..9d3b67f14c3c 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -6329,6 +6329,8 @@ wlan_hdd_wifi_test_config_policy[ .type = NLA_U8}, [QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_TX_BEAMFORMEE_NSTS] = { .type = NLA_U8}, + [QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_MAC_PADDING_DUR] = { + .type = NLA_U8}, }; /** @@ -7585,6 +7587,33 @@ __wlan_hdd_cfg80211_set_wifi_test_config(struct wiphy *wiphy, } + if (tb[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_MAC_PADDING_DUR]) { + cfg_val = nla_get_u8(tb[ + QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_MAC_PADDING_DUR]); + if (cfg_val) { + ret_val = sme_cli_set_command(adapter->session_id, + WMI_VDEV_PARAM_MU_EDCA_FW_UPDATE_EN, + 0, VDEV_CMD); + if (ret_val) + hdd_err("MU_EDCA update disable failed"); + sme_set_usr_cfg_mu_edca(hdd_ctx->mac_handle, true); + sme_set_he_mu_edca_def_cfg(hdd_ctx->mac_handle); + if (sme_update_mu_edca_params(hdd_ctx->mac_handle, + adapter->session_id)) + hdd_err("Failed to send mu edca params"); + } else { + ret_val = sme_cli_set_command(adapter->session_id, + WMI_VDEV_PARAM_MU_EDCA_FW_UPDATE_EN, + 1, VDEV_CMD); + sme_set_usr_cfg_mu_edca(hdd_ctx->mac_handle, false); + } + ret_val = sme_update_he_trigger_frm_mac_pad(hdd_ctx->mac_handle, + adapter->session_id, + cfg_val); + if (ret_val) + hdd_err("Failed to set Trig frame mac padding 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 0d4ef7f92336..d3c8284c954f 100644 --- a/core/mac/inc/ani_global.h +++ b/core/mac/inc/ani_global.h @@ -925,6 +925,7 @@ typedef struct sAniSirGlobal { uint8_t usr_cfg_tx_bfee_nsts; struct mgmt_beacon_probe_filter bcn_filter; tSirMacEdcaParamRecord usr_mu_edca_params[MAX_NUM_AC]; + bool usr_cfg_mu_edca_params; #ifdef WLAN_FEATURE_11AX tDot11fIEhe_cap he_cap_2g; tDot11fIEhe_cap he_cap_5g; diff --git a/core/mac/src/pe/lim/lim_process_assoc_rsp_frame.c b/core/mac/src/pe/lim/lim_process_assoc_rsp_frame.c index 3c7d1dfd5a47..8e3852b2a900 100644 --- a/core/mac/src/pe/lim/lim_process_assoc_rsp_frame.c +++ b/core/mac/src/pe/lim/lim_process_assoc_rsp_frame.c @@ -996,15 +996,28 @@ lim_process_assoc_rsp_frame(tpAniSirGlobal mac_ctx, ie_len, beacon); - if (lim_is_session_he_capable(session_entry) && - assoc_rsp->mu_edca_present) { - pe_debug("Send MU EDCA params to FW"); - mu_edca_set[EDCA_AC_BE] = assoc_rsp->mu_edca.acbe; - mu_edca_set[EDCA_AC_BK] = assoc_rsp->mu_edca.acbk; - mu_edca_set[EDCA_AC_VI] = assoc_rsp->mu_edca.acvi; - mu_edca_set[EDCA_AC_VO] = assoc_rsp->mu_edca.acvo; - lim_send_edca_params(mac_ctx, mu_edca_set, - sta_ds->bssId, true); + if (lim_is_session_he_capable(session_entry)) { + if (mac_ctx->usr_cfg_mu_edca_params) { + pe_debug("Send user cfg MU EDCA params to FW"); + mu_edca_set[EDCA_AC_BE] = + mac_ctx->usr_mu_edca_params[EDCA_AC_BE]; + mu_edca_set[EDCA_AC_BK] = + mac_ctx->usr_mu_edca_params[EDCA_AC_BK]; + mu_edca_set[EDCA_AC_VI] = + mac_ctx->usr_mu_edca_params[EDCA_AC_VI]; + mu_edca_set[EDCA_AC_VO] = + mac_ctx->usr_mu_edca_params[EDCA_AC_VO]; + lim_send_edca_params(mac_ctx, mu_edca_set, + sta_ds->bssId, true); + } else if (assoc_rsp->mu_edca_present) { + pe_debug("Send MU EDCA params to FW"); + mu_edca_set[EDCA_AC_BE] = assoc_rsp->mu_edca.acbe; + mu_edca_set[EDCA_AC_BK] = assoc_rsp->mu_edca.acbk; + mu_edca_set[EDCA_AC_VI] = assoc_rsp->mu_edca.acvi; + mu_edca_set[EDCA_AC_VO] = assoc_rsp->mu_edca.acvo; + lim_send_edca_params(mac_ctx, mu_edca_set, + sta_ds->bssId, true); + } } diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h index 053d979103f2..53c3dfa31944 100644 --- a/core/sme/inc/sme_api.h +++ b/core/sme/inc/sme_api.h @@ -2392,6 +2392,25 @@ int sme_update_he_tx_bfee_nsts(mac_handle_t hal, uint8_t session_id, */ int sme_update_he_mcs(tHalHandle hal, uint8_t session_id, uint16_t he_mcs); +/** + * sme_update_he_trigger_frm_mac_pad() - sets the HE MAC padding capability + * @hal: Pointer to HAL + * @session_id: SME session id + * @cfg_val: HE MAC padding duration value + * + * Return: 0 on success else err code + */ +int sme_update_he_trigger_frm_mac_pad(mac_handle_t hal, uint8_t session_id, + uint8_t cfg_val); +/** + * sme_set_usr_cfg_mu_edca() - sets the user cfg MU EDCA params flag + * @hal: Pointer to HAL + * @val: value to be set + * + * Return: none + */ +void sme_set_usr_cfg_mu_edca(mac_handle_t hal, bool val); + /** * sme_set_he_mu_edca_def_cfg() - sets the default MU EDCA params values * @hal: Pointer to HAL @@ -2472,6 +2491,17 @@ static inline int sme_update_mu_edca_params(mac_handle_t hal, { return 0; } +static inline int sme_update_he_trigger_frm_mac_pad(mac_handle_t hal, + uint8_t session_id, + uint8_t cfg_val) +{ + return 0; +} + +static inline void sme_set_usr_cfg_mu_edca(mac_handle_t hal, bool val) +{ +} + static inline int sme_update_he_tx_stbc_cap(tHalHandle hal, uint8_t session_id, int value) { diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index 563b5009ace9..029da0918ad8 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -12864,6 +12864,13 @@ static int sme_update_he_cap(tHalHandle hal, uint8_t session_id, return 0; } +void sme_set_usr_cfg_mu_edca(mac_handle_t hal, bool val) +{ + tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal); + + mac_ctx->usr_cfg_mu_edca_params = val; +} + int sme_update_mu_edca_params(mac_handle_t hal, uint8_t session_id) { struct scheduler_msg msg = {0}; @@ -12903,6 +12910,13 @@ int sme_update_he_tx_bfee_supp(tHalHandle hal, uint8_t session_id, cfg_val); } +int sme_update_he_trigger_frm_mac_pad(mac_handle_t hal, uint8_t session_id, + uint8_t cfg_val) +{ + return sme_update_he_cap(hal, session_id, WNI_CFG_HE_TRIG_PAD, + cfg_val); +} + int sme_update_he_tx_bfee_nsts(mac_handle_t hal, uint8_t session_id, uint8_t cfg_val) {