summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHong Shi <hongsh@codeaurora.org>2017-01-12 02:31:14 +0800
committerqcabuildsw <qcabuildsw@localhost>2017-02-28 11:47:29 -0800
commit75c470094cb07d3ad94fab6cbfa6f4526ce1adc4 (patch)
tree67776754e727b0fd863cf422cfc0fb7683341108
parent33955f7637051396bc9f4cfebb275f933d6970a4 (diff)
qcacld-3.0: add ini to configure HT max mcs
qcacld-2.0 to qcacld-3.0 propagation Add support for configure host init HT rate upper bound. CRs-Fixed: 1105357 Change-Id: Ic69a2d19ad1b3b835c83c7d666fb7821e42e8442
-rw-r--r--core/hdd/inc/wlan_hdd_cfg.h23
-rw-r--r--core/hdd/src/wlan_hdd_cfg.c15
-rw-r--r--core/mac/inc/wni_cfg.h7
-rw-r--r--core/mac/src/cfg/cfg_param_name.c11
-rw-r--r--core/mac/src/cfg/cfg_proc_msg.c9
-rw-r--r--core/wma/src/wma_mgmt.c54
6 files changed, 115 insertions, 4 deletions
diff --git a/core/hdd/inc/wlan_hdd_cfg.h b/core/hdd/inc/wlan_hdd_cfg.h
index 42552d518fb5..19af0a33ede6 100644
--- a/core/hdd/inc/wlan_hdd_cfg.h
+++ b/core/hdd/inc/wlan_hdd_cfg.h
@@ -5668,6 +5668,28 @@ typedef enum {
/*
* <ini>
+ * gMaxHTMCSForTxData - max HT mcs for TX
+ * @Min: 0
+ * @Max: 383
+ * @Default: 0
+ *
+ * This ini is used to configure the max HT mcs
+ * for tx data.
+ *
+ * Usage: External
+ *
+ * bits 0-15: max HT mcs
+ * bits 16-31: zero to disable, otherwise enable.
+ *
+ * </ini>
+ */
+#define CFG_MAX_HT_MCS_FOR_TX_DATA "gMaxHTMCSForTxData"
+#define CFG_MAX_HT_MCS_FOR_TX_DATA_MIN (WNI_CFG_MAX_HT_MCS_TX_DATA_STAMIN)
+#define CFG_MAX_HT_MCS_FOR_TX_DATA_MAX (WNI_CFG_MAX_HT_MCS_TX_DATA_STAMAX)
+#define CFG_MAX_HT_MCS_FOR_TX_DATA_DEFAULT (WNI_CFG_MAX_HT_MCS_TX_DATA_STADEF)
+
+/*
+ * <ini>
* gTDLSTxPacketThreshold - Tx/Rx Packet threshold for initiating TDLS.
* @Min: 0
* @Max: 4294967295
@@ -10072,6 +10094,7 @@ struct hdd_config {
uint8_t gDisableDfsJapanW53;
bool gEnableOverLapCh;
bool fRegChangeDefCountry;
+ uint16_t max_ht_mcs_txdata;
#ifdef QCA_LL_LEGACY_TX_FLOW_CONTROL
uint32_t TxFlowLowWaterMark;
uint32_t TxFlowHighWaterMarkOffset;
diff --git a/core/hdd/src/wlan_hdd_cfg.c b/core/hdd/src/wlan_hdd_cfg.c
index 91ec80b5c791..e9caba5537fa 100644
--- a/core/hdd/src/wlan_hdd_cfg.c
+++ b/core/hdd/src/wlan_hdd_cfg.c
@@ -2171,6 +2171,14 @@ REG_TABLE_ENTRY g_registry_table[] = {
CFG_DISABLE_DFS_JAPAN_W53_MIN,
CFG_DISABLE_DFS_JAPAN_W53_MAX,
ch_notify_set_g_disable_dfs_japan_w53, 0),
+
+ REG_VARIABLE(CFG_MAX_HT_MCS_FOR_TX_DATA, WLAN_PARAM_HexInteger,
+ struct hdd_config, max_ht_mcs_txdata,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_MAX_HT_MCS_FOR_TX_DATA_DEFAULT,
+ CFG_MAX_HT_MCS_FOR_TX_DATA_MIN,
+ CFG_MAX_HT_MCS_FOR_TX_DATA_MAX),
+
REG_VARIABLE(CFG_ENABLE_FIRST_SCAN_2G_ONLY_NAME, WLAN_PARAM_Integer,
struct hdd_config, enableFirstScan2GOnly,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@@ -6895,6 +6903,13 @@ bool hdd_update_config_cfg(hdd_context_t *hdd_ctx)
status = false;
hdd_err("Couldn't pass on WNI_CFG_TGT_GTX_USR_CFG to CCM");
}
+
+ if (sme_cfg_set_int(hdd_ctx->hHal, WNI_CFG_MAX_HT_MCS_TX_DATA,
+ config->max_ht_mcs_txdata) ==
+ QDF_STATUS_E_FAILURE) {
+ status = false;
+ hdd_err("Couldn't pass on WNI_CFG_MAX_HT_MCS_TX_DATA to CCM");
+ }
return status;
}
#ifdef FEATURE_WLAN_SCAN_PNO
diff --git a/core/mac/inc/wni_cfg.h b/core/mac/inc/wni_cfg.h
index 297bce90ea0b..c2c5785e71cb 100644
--- a/core/mac/inc/wni_cfg.h
+++ b/core/mac/inc/wni_cfg.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -251,6 +251,7 @@ enum {
WNI_CFG_OBSS_HT40_WIDTH_CH_TRANSITION_DELAY,
WNI_CFG_OBSS_HT40_SCAN_ACTIVITY_THRESHOLD,
WNI_CFG_TGT_GTX_USR_CFG,
+ WNI_CFG_MAX_HT_MCS_TX_DATA,
/* Any new items to be added should be above this strictly */
CFG_PARAM_MAX_NUM
};
@@ -1260,6 +1261,10 @@ enum {
#define WNI_CFG_TGT_GTX_USR_CFG_STAMAX 32
#define WNI_CFG_TGT_GTX_USR_CFG_STADEF 32
+#define WNI_CFG_MAX_HT_MCS_TX_DATA_STAMIN 0x0
+#define WNI_CFG_MAX_HT_MCS_TX_DATA_STAMAX 0x17f
+#define WNI_CFG_MAX_HT_MCS_TX_DATA_STADEF 0x0
+
#define CFG_STA_MAGIC_DWORD 0xbeefbeef
#endif
diff --git a/core/mac/src/cfg/cfg_param_name.c b/core/mac/src/cfg/cfg_param_name.c
index c724f10c1763..2ad7c69e0be2 100644
--- a/core/mac/src/cfg/cfg_param_name.c
+++ b/core/mac/src/cfg/cfg_param_name.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -315,4 +315,13 @@ unsigned char *g_cfg_param_name[] = {
(unsigned char *)"DFS_MASTER_ENABLED",
(unsigned char *)"VHT_ENABLE_TXBF_20MHZ",
(unsigned char *)"TDLS_WMM_MODE_ENABLED",
+ (unsigned char *)"OBSS_HT40_SCAN_PASSIVE_DWELL_TIME",
+ (unsigned char *)"OBSS_HT40_SCAN_ACTIVE_DWELL_TIME",
+ (unsigned char *)"OBSS_HT40_SCAN_WIDTH_TRIGGER_INTERVAL",
+ (unsigned char *)"OBSS_HT40_SCAN_PASSIVE_TOTAL_PER_CHANNEL",
+ (unsigned char *)"OBSS_HT40_SCAN_ACTIVE_TOTAL_PER_CHANNEL",
+ (unsigned char *)"OBSS_HT40_WIDTH_CH_TRANSITION_DELAY",
+ (unsigned char *)"OBSS_HT40_SCAN_ACTIVITY_THRESHOLD",
+ (unsigned char *)"TGT_GTX_USR_CFG",
+ (unsigned char *)"MAX_HT_MCS_TX_DATA",
};
diff --git a/core/mac/src/cfg/cfg_proc_msg.c b/core/mac/src/cfg/cfg_proc_msg.c
index 8be379c932cc..ff60742fad4b 100644
--- a/core/mac/src/cfg/cfg_proc_msg.c
+++ b/core/mac/src/cfg/cfg_proc_msg.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -1178,7 +1178,12 @@ cgstatic cfg_static[CFG_PARAM_MAX_NUM] = {
CFG_CTL_VALID | CFG_CTL_RE | CFG_CTL_WE | CFG_CTL_INT,
WNI_CFG_TGT_GTX_USR_CFG_STAMIN,
WNI_CFG_TGT_GTX_USR_CFG_STAMAX,
- WNI_CFG_TGT_GTX_USR_CFG_STADEF}
+ WNI_CFG_TGT_GTX_USR_CFG_STADEF},
+ {WNI_CFG_MAX_HT_MCS_TX_DATA,
+ CFG_CTL_VALID | CFG_CTL_RE | CFG_CTL_WE | CFG_CTL_INT,
+ WNI_CFG_MAX_HT_MCS_TX_DATA_STAMIN,
+ WNI_CFG_MAX_HT_MCS_TX_DATA_STAMAX,
+ WNI_CFG_MAX_HT_MCS_TX_DATA_STADEF}
};
diff --git a/core/wma/src/wma_mgmt.c b/core/wma/src/wma_mgmt.c
index 489c57e61c79..373f4450feda 100644
--- a/core/wma/src/wma_mgmt.c
+++ b/core/wma/src/wma_mgmt.c
@@ -818,6 +818,58 @@ wma_unified_peer_state_update(
}
#endif
+#define CFG_CTRL_MASK 0xFF00
+#define CFG_DATA_MASK 0x00FF
+
+/**
+ * wma_mask_tx_ht_rate() - mask tx ht rate based on config
+ * @wma: wma handle
+ * @mcs_set mcs set buffer
+ *
+ * Return: None
+ */
+static void wma_mask_tx_ht_rate(tp_wma_handle wma, uint8_t *mcs_set)
+{
+ uint32_t mcs_limit, i, j;
+ uint8_t *rate_pos = mcs_set;
+
+ /*
+ * Get MCS limit from ini configure, and map it to rate parameters
+ * This will limit HT rate upper bound. CFG_CTRL_MASK is used to
+ * check whether ini config is enabled and CFG_DATA_MASK to get the
+ * MCS value.
+ */
+ if (wlan_cfg_get_int(wma->mac_context, WNI_CFG_MAX_HT_MCS_TX_DATA,
+ &mcs_limit) != eSIR_SUCCESS) {
+ mcs_limit = WNI_CFG_MAX_HT_MCS_TX_DATA_STADEF;
+ }
+
+ if (mcs_limit & CFG_CTRL_MASK) {
+ WMA_LOGD("%s: set mcs_limit %x", __func__, mcs_limit);
+
+ mcs_limit &= CFG_DATA_MASK;
+ for (i = 0, j = 0; i < MAX_SUPPORTED_RATES;) {
+ if (j < mcs_limit / 8) {
+ rate_pos[j] = 0xff;
+ j++;
+ i += 8;
+ } else if (j < mcs_limit / 8 + 1) {
+ if (i <= mcs_limit)
+ rate_pos[i / 8] |= 1 << (i % 8);
+ else
+ rate_pos[i / 8] &= ~(1 << (i % 8));
+ i++;
+
+ if (i >= (j + 1) * 8)
+ j++;
+ } else {
+ rate_pos[j++] = 0;
+ i += 8;
+ }
+ }
+ }
+}
+
/**
* wmi_unified_send_peer_assoc() - send peer assoc command to fw
* @wma: wma handle
@@ -862,6 +914,8 @@ QDF_STATUS wma_send_peer_assoc(tp_wma_handle wma,
return QDF_STATUS_E_INVAL;
}
+ wma_mask_tx_ht_rate(wma, params->supportedRates.supportedMCSSet);
+
qdf_mem_zero(&peer_legacy_rates, sizeof(wmi_rate_set));
qdf_mem_zero(&peer_ht_rates, sizeof(wmi_rate_set));
qdf_mem_zero(cmd, sizeof(struct peer_assoc_params));