From cb14b113248ea284547085005c8caa1986e3ccfe Mon Sep 17 00:00:00 2001 From: Ashish Kumar Dhanotiya Date: Fri, 19 Jan 2018 19:26:44 +0530 Subject: [PATCH] qcacld-3.0: Add host support to configure GCMP Add an ini parameter for GCMP support. Send an indication to FW with the ini value. Change-Id: Ib24747ddb35593373ecc83d6c7f89866571c2421 CRs-Fixed: 2175104 --- core/hdd/inc/wlan_hdd_cfg.h | 26 ++++++++++++++++++- core/hdd/src/wlan_hdd_cfg.c | 10 ++++++++ core/hdd/src/wlan_hdd_cfg80211.c | 43 ++++++++++++++++++++++++++++---- core/hdd/src/wlan_hdd_main.c | 2 ++ 4 files changed, 75 insertions(+), 6 deletions(-) diff --git a/core/hdd/inc/wlan_hdd_cfg.h b/core/hdd/inc/wlan_hdd_cfg.h index 9c0cdcdce4b4..4aa661372a07 100644 --- a/core/hdd/inc/wlan_hdd_cfg.h +++ b/core/hdd/inc/wlan_hdd_cfg.h @@ -14110,9 +14110,32 @@ enum hdd_external_acs_freq_band { #define CFG_BTM_STICKY_TIME_DEFAULT (300) /* - * Type declarations + * + * gcmp_enabled - ini to enable/disable GCMP + * @Min: 0 + * @Max: 1 + * @Default: 0 + * + * Currently Firmware update the sequence number for each TID with 2^3 + * because of security issues. But with this PN mechanism, throughput drop + * is observed. With this ini FW takes the decision to trade off between + * security and throughput + * + * Supported Feature: STA/SAP/P2P + * + * Usage: External + * + * */ +#define CFG_ENABLE_GCMP_NAME "gcmp_enabled" +#define CFG_ENABLE_GCMP_MIN (0) +#define CFG_ENABLE_GCMP_MAX (1) +#define CFG_ENABLE_GCMP_DEFAULT (0) + +/* + * Type declarations + */ struct hdd_config { /* Bitmap to track what is explicitly configured */ DECLARE_BITMAP(bExplicitCfg, MAX_CFG_INI_ITEMS); @@ -15009,6 +15032,7 @@ struct hdd_config { uint32_t btm_solicited_timeout; uint32_t btm_max_attempt_cnt; uint32_t btm_sticky_time; + bool gcmp_enabled; }; #define VAR_OFFSET(_Struct, _Var) (offsetof(_Struct, _Var)) diff --git a/core/hdd/src/wlan_hdd_cfg.c b/core/hdd/src/wlan_hdd_cfg.c index 7312cdb417fc..19c5c28352d5 100644 --- a/core/hdd/src/wlan_hdd_cfg.c +++ b/core/hdd/src/wlan_hdd_cfg.c @@ -5446,6 +5446,13 @@ struct reg_table_entry g_registry_table[] = { CFG_BTM_STICKY_TIME_DEFAULT, CFG_BTM_STICKY_TIME_MIN, CFG_BTM_STICKY_TIME_MAX), + + REG_VARIABLE(CFG_ENABLE_GCMP_NAME, WLAN_PARAM_Integer, + struct hdd_config, gcmp_enabled, + VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, + CFG_ENABLE_GCMP_DEFAULT, + CFG_ENABLE_GCMP_MIN, + CFG_ENABLE_GCMP_MAX), }; @@ -7297,6 +7304,9 @@ void hdd_cfg_print(struct hdd_context *hdd_ctx) hdd_ctx->config->btm_max_attempt_cnt); hdd_debug("Name = [btm_sticky_time] value = [0x%x]", hdd_ctx->config->btm_sticky_time); + hdd_debug("Name = [%s] value = [%d]", + CFG_ENABLE_GCMP_NAME, + hdd_ctx->config->gcmp_enabled); } diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 03f96c071d35..8223ad7031c2 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -182,6 +182,11 @@ #define WLAN_CIPHER_SUITE_GCMP_256 0x000FAC09 #endif +static const u32 hdd_gcmp_cipher_suits[] = { + WLAN_CIPHER_SUITE_GCMP, + WLAN_CIPHER_SUITE_GCMP_256, +}; + static const u32 hdd_cipher_suites[] = { WLAN_CIPHER_SUITE_WEP40, WLAN_CIPHER_SUITE_WEP104, @@ -205,8 +210,6 @@ static const u32 hdd_cipher_suites[] = { WLAN_CIPHER_SUITE_BIP_GMAC_256, #endif #endif - WLAN_CIPHER_SUITE_GCMP, - WLAN_CIPHER_SUITE_GCMP_256, }; static const struct ieee80211_channel hdd_channels_2_4_ghz[] = { @@ -14098,6 +14101,7 @@ int wlan_hdd_cfg80211_init(struct device *dev, int i, j; struct hdd_context *hdd_ctx = wiphy_priv(wiphy); int len = 0; + uint32_t *cipher_suites; ENTER(); @@ -14287,9 +14291,32 @@ int wlan_hdd_cfg80211_init(struct device *dev, } } /*Initialise the supported cipher suite details */ - wiphy->cipher_suites = hdd_cipher_suites; - wiphy->n_cipher_suites = ARRAY_SIZE(hdd_cipher_suites); - + if (pCfg->gcmp_enabled) { + cipher_suites = qdf_mem_malloc(sizeof(hdd_cipher_suites) + + sizeof(hdd_gcmp_cipher_suits)); + if (cipher_suites == NULL) { + hdd_err("Not enough memory for cipher suites"); + return -ENOMEM; + } + wiphy->n_cipher_suites = QDF_ARRAY_SIZE(hdd_cipher_suites) + + QDF_ARRAY_SIZE(hdd_gcmp_cipher_suits); + qdf_mem_copy(cipher_suites, &hdd_cipher_suites, + sizeof(hdd_cipher_suites)); + qdf_mem_copy(cipher_suites + QDF_ARRAY_SIZE(hdd_cipher_suites), + &hdd_gcmp_cipher_suits, + sizeof(hdd_gcmp_cipher_suits)); + } else { + cipher_suites = qdf_mem_malloc(sizeof(hdd_cipher_suites)); + if (cipher_suites == NULL) { + hdd_err("Not enough memory for cipher suites"); + return -ENOMEM; + } + wiphy->n_cipher_suites = QDF_ARRAY_SIZE(hdd_cipher_suites); + qdf_mem_copy(cipher_suites, &hdd_cipher_suites, + sizeof(hdd_cipher_suites)); + } + wiphy->cipher_suites = cipher_suites; + cipher_suites = NULL; /*signal strength in mBm (100*dBm) */ wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM; wiphy->max_remain_on_channel_duration = MAX_REMAIN_ON_CHANNEL_DURATION; @@ -14351,6 +14378,7 @@ mem_fail: void wlan_hdd_cfg80211_deinit(struct wiphy *wiphy) { int i; + const uint32_t *cipher_suites; for (i = 0; i < HDD_NUM_NL80211_BANDS; i++) { if (NULL != wiphy->bands[i] && @@ -14360,6 +14388,11 @@ void wlan_hdd_cfg80211_deinit(struct wiphy *wiphy) } } + cipher_suites = wiphy->cipher_suites; + wiphy->cipher_suites = NULL; + wiphy->n_cipher_suites = 0; + qdf_mem_free((uint32_t *)cipher_suites); + cipher_suites = NULL; hdd_reset_global_reg_params(); } diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 0f13adadef06..51d20e161de3 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -9949,6 +9949,8 @@ int hdd_configure_cds(struct hdd_context *hdd_ctx, struct hdd_adapter *adapter) if (0 != wlan_hdd_set_wow_pulse(hdd_ctx, true)) hdd_debug("Failed to set wow pulse"); + sme_cli_set_command(0, WMI_PDEV_PARAM_GCMP_SUPPORT_ENABLE, + hdd_ctx->config->gcmp_enabled, PDEV_CMD); sme_cli_set_command(0, WMI_PDEV_AUTO_DETECT_POWER_FAILURE, hdd_ctx->config->auto_pwr_save_fail_mode, PDEV_CMD);