From f54b85555f2a46efc0094e266e742b57ad398b18 Mon Sep 17 00:00:00 2001 From: Kiran Kumar Lokere Date: Tue, 10 Jul 2018 00:53:38 -0700 Subject: [PATCH] qcacld-3.0: Add support to configure HE trigger frame MAC padding Add support to configure HE trigger frame MAC padding and disable the MU EDCA param update when user configures the padding. Change-Id: Ief928c5421366b03ee6e1d6253963b10fd3b87b6 CRs-Fixed: 2265331 --- core/hdd/src/wlan_hdd_cfg80211.c | 29 +++++++++++++++++ core/mac/inc/ani_global.h | 1 + .../src/pe/lim/lim_process_assoc_rsp_frame.c | 31 +++++++++++++------ core/sme/inc/sme_api.h | 30 ++++++++++++++++++ core/sme/src/common/sme_api.c | 14 +++++++++ 5 files changed, 96 insertions(+), 9 deletions(-) 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) {