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
This commit is contained in:
Ashish Kumar Dhanotiya 2018-01-19 19:26:44 +05:30 • committed by snandini
commit cb14b11324
4 changed files with 75 additions and 6 deletions

View file

@ -14110,9 +14110,32 @@ enum hdd_external_acs_freq_band {
#define CFG_BTM_STICKY_TIME_DEFAULT (300)
/*
* Type declarations
* <ini>
* 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
*
* </ini>
*/
#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))

View file

@ -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);
}

View file

@ -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();
}

View file

@ -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);