From 5cc2f0da1fee844ae4e2f7c9ea5c1732aaee9ed9 Mon Sep 17 00:00:00 2001 From: Kiran Kumar Lokere Date: Thu, 8 Feb 2018 17:10:05 -0800 Subject: [PATCH] qcacld-3.0: Add support to configure HE fragmentaion Add support to configure HE fragmentation support using NL command. Change-Id: I49b81df96a9c8199a1cc5994762aeba0ed9676b0 CRs-Fixed: 2166782 --- core/hdd/inc/wlan_hdd_cfg.h | 2 +- core/hdd/src/wlan_hdd_cfg80211.c | 16 ++++++++++++++++ core/sme/inc/sme_api.h | 17 +++++++++++++++++ core/sme/src/common/sme_api.c | 25 ++++++++++++++++++------- 4 files changed, 52 insertions(+), 8 deletions(-) diff --git a/core/hdd/inc/wlan_hdd_cfg.h b/core/hdd/inc/wlan_hdd_cfg.h index bcc008506f73..f32432f941b0 100644 --- a/core/hdd/inc/wlan_hdd_cfg.h +++ b/core/hdd/inc/wlan_hdd_cfg.h @@ -15120,11 +15120,11 @@ struct hdd_config { enum active_bpf_mode active_uc_bpf_mode; enum active_bpf_mode active_mc_bc_bpf_mode; bool enable_bcast_probe_rsp; + uint8_t he_dynamic_frag_support; #ifdef WLAN_FEATURE_11AX bool enable_ul_mimo; bool enable_ul_ofdma; uint32_t he_sta_obsspd; - uint8_t he_dynamic_frag_support; #endif enum l1ss_sleep_allowed l1ss_sleep_allowed; uint32_t arp_ac_category; diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index b7114fcc18ff..8f2cca1c827b 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -6272,6 +6272,8 @@ wlan_hdd_wifi_test_config_policy[ .type = NLA_U8}, [QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_SEND_ADDBA_REQ] = { .type = NLA_U8}, + [QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_FRAGMENTATION] = { + .type = NLA_U8}, }; /** @@ -7336,6 +7338,20 @@ __wlan_hdd_cfg80211_set_wifi_test_config(struct wiphy *wiphy, WMI_VDEV_PARAM_BA_MODE, set_val, VDEV_CMD); } + if (tb[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_FRAGMENTATION]) { + cfg_val = nla_get_u8(tb[ + QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_FRAGMENTATION] + ); + if (cfg_val > HE_FRAG_LEVEL1) + set_val = HE_FRAG_LEVEL1; + else + set_val = cfg_val; + + hdd_debug("set HE fragmention to %d", set_val); + ret_val = sme_update_he_frag_supp(hdd_ctx->hHal, + adapter->session_id, set_val); + } + return ret_val; } diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h index cce366824a72..6cb6188f02bb 100644 --- a/core/sme/inc/sme_api.h +++ b/core/sme/inc/sme_api.h @@ -2145,6 +2145,17 @@ int sme_update_he_tx_stbc_cap(tHalHandle hal, uint8_t session_id, int value); * Return: 0 on success else err code */ int sme_update_he_rx_stbc_cap(tHalHandle hal, uint8_t session_id, int value); + +/** + * sme_update_he_frag_supp() - sets the HE fragmentation support + * @hal: Pointer to HAL + * @session_id: SME session id + * @he_frag: HE fragmention support value + * + * Return: 0 on success else err code + */ +int sme_update_he_frag_supp(tHalHandle hal, uint8_t session_id, + uint16_t he_frag); #else static inline void sme_update_he_cap_nss(tHalHandle hal, uint8_t session_id, uint8_t nss) @@ -2165,6 +2176,12 @@ static inline int sme_update_he_rx_stbc_cap(tHalHandle hal, uint8_t session_id, { return 0; } + +static inline int sme_update_he_frag_supp(tHalHandle hal, uint8_t session_id, + uint16_t he_frag) +{ + return 0; +} #endif /** diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index ce05979c539f..6be100d17c3f 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -13235,15 +13235,13 @@ static int sme_update_he_cap(tHalHandle hal, uint8_t session_id, { tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal); struct csr_roam_session *session; - uint32_t he_cap_val = 0; session = CSR_GET_SESSION(mac_ctx, session_id); if (!session) { sme_err("No session for id %d", session_id); return -EINVAL; } - he_cap_val = value ? 1 : 0; - sme_cfg_set_int(mac_ctx, he_cap, he_cap_val); + sme_cfg_set_int(mac_ctx, he_cap, value); csr_update_session_he_cap(mac_ctx, session); return 0; @@ -13252,27 +13250,40 @@ static int sme_update_he_cap(tHalHandle hal, uint8_t session_id, int sme_update_he_tx_stbc_cap(tHalHandle hal, uint8_t session_id, int value) { int ret; + uint32_t he_cap_val = 0; + + he_cap_val = value ? 1 : 0; ret = sme_update_he_cap(hal, session_id, - WNI_CFG_HE_TX_STBC_LT80, value); + WNI_CFG_HE_TX_STBC_LT80, he_cap_val); if (ret) return ret; return sme_update_he_cap(hal, session_id, - WNI_CFG_HE_TX_STBC_GT80, value); + WNI_CFG_HE_TX_STBC_GT80, he_cap_val); } int sme_update_he_rx_stbc_cap(tHalHandle hal, uint8_t session_id, int value) { int ret; + uint32_t he_cap_val = 0; + + he_cap_val = value ? 1 : 0; ret = sme_update_he_cap(hal, session_id, - WNI_CFG_HE_RX_STBC_LT80, value); + WNI_CFG_HE_RX_STBC_LT80, he_cap_val); if (ret) return ret; return sme_update_he_cap(hal, session_id, - WNI_CFG_HE_RX_STBC_GT80, value); + WNI_CFG_HE_RX_STBC_GT80, he_cap_val); +} + +int sme_update_he_frag_supp(tHalHandle hal, uint8_t session_id, + uint16_t he_frag) +{ + return sme_update_he_cap(hal, session_id, + WNI_CFG_HE_FRAGMENTATION, he_frag); } #endif