summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CORE/HDD/inc/wlan_hdd_cfg.h44
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg.c29
-rw-r--r--CORE/MAC/inc/wni_cfg.h12
-rw-r--r--CORE/MAC/src/cfg/cfgParamName.c2
-rw-r--r--CORE/MAC/src/cfg/cfgProcMsg.c13
-rw-r--r--CORE/SERVICES/WMA/wma.c92
6 files changed, 186 insertions, 6 deletions
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index 9b9100ffc2b4..43ad9d16d0a3 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -1598,6 +1598,48 @@ typedef enum
#define CFG_RATE_FOR_TX_MGMT_DEFAULT (WNI_CFG_RATE_FOR_TX_MGMT_STADEF)
/*
+ * <ini>
+ * gRateForTxMgmt2G - rate for tx mgmt frame on 2G
+ * @Min: 0x0
+ * @Max: 0xFF
+ * @Default: 0xFF
+ *
+ * This ini is used to configure the rate for tx
+ * mgmt frame on 2G Band. Default 0xFF means disable.
+ * It has higher priority and will overwrite gRateForTxMgmt
+ * setting.
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+#define CFG_RATE_FOR_TX_MGMT_2G "gRateForTxMgmt2G"
+#define CFG_RATE_FOR_TX_MGMT_2G_MIN (WNI_CFG_RATE_FOR_TX_MGMT_2G_STAMIN)
+#define CFG_RATE_FOR_TX_MGMT_2G_MAX (WNI_CFG_RATE_FOR_TX_MGMT_2G_STAMAX)
+#define CFG_RATE_FOR_TX_MGMT_2G_DEFAULT (WNI_CFG_RATE_FOR_TX_MGMT_2G_STADEF)
+
+/*
+ * <ini>
+ * gRateForTxMgmt5G - rate for tx mgmt frame on 5G
+ * @Min: 0x0
+ * @Max: 0xFF
+ * @Default: 0xFF
+ *
+ * This ini is used to configure the rate for tx
+ * mgmt frame on 5G Band. Default 0xFF means disable.
+ * It has higher priority and will overwrite gRateForTxMgmt
+ * setting.
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+#define CFG_RATE_FOR_TX_MGMT_5G "gRateForTxMgmt5G"
+#define CFG_RATE_FOR_TX_MGMT_5G_MIN (WNI_CFG_RATE_FOR_TX_MGMT_5G_STAMIN)
+#define CFG_RATE_FOR_TX_MGMT_5G_MAX (WNI_CFG_RATE_FOR_TX_MGMT_5G_STAMAX)
+#define CFG_RATE_FOR_TX_MGMT_5G_DEFAULT (WNI_CFG_RATE_FOR_TX_MGMT_5G_STADEF)
+
+/*
* RSSI Thresholds
* Used when eHDD_LINK_SPEED_REPORT_SCALED is selected
*/
@@ -5074,6 +5116,8 @@ struct hdd_config {
bool sap_get_peer_info;
bool disable_abg_rate_txdata;
uint8_t rate_for_tx_mgmt;
+ uint8_t rate_for_tx_mgmt_2g;
+ uint8_t rate_for_tx_mgmt_5g;
#ifdef QCA_LL_TX_FLOW_CT
v_U32_t TxFlowLowWaterMark;
v_U32_t TxFlowHighWaterMarkOffset;
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index 7c4e0257f1ad..5856cd39b3bf 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -2414,6 +2414,20 @@ REG_TABLE_ENTRY g_registry_table[] =
CFG_RATE_FOR_TX_MGMT_MIN,
CFG_RATE_FOR_TX_MGMT_MAX),
+ REG_VARIABLE(CFG_RATE_FOR_TX_MGMT_2G, WLAN_PARAM_HexInteger,
+ hdd_config_t, rate_for_tx_mgmt_2g,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_RATE_FOR_TX_MGMT_2G_DEFAULT,
+ CFG_RATE_FOR_TX_MGMT_2G_MIN,
+ CFG_RATE_FOR_TX_MGMT_2G_MAX),
+
+ REG_VARIABLE(CFG_RATE_FOR_TX_MGMT_5G, WLAN_PARAM_HexInteger,
+ hdd_config_t, rate_for_tx_mgmt_5g,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_RATE_FOR_TX_MGMT_5G_DEFAULT,
+ CFG_RATE_FOR_TX_MGMT_5G_MIN,
+ CFG_RATE_FOR_TX_MGMT_5G_MAX),
+
REG_VARIABLE( CFG_ENABLE_FIRST_SCAN_2G_ONLY_NAME, WLAN_PARAM_Integer,
hdd_config_t, enableFirstScan2GOnly,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@@ -7565,6 +7579,21 @@ v_BOOL_t hdd_update_config_dat( hdd_context_t *pHddCtx )
fStatus = FALSE;
hddLog(LOGE, "Could not pass on WNI_CFG_RATE_FOR_TX_MGMT to CCM");
}
+
+ if (ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_RATE_FOR_TX_MGMT_2G,
+ pConfig->rate_for_tx_mgmt_2g, NULL,
+ eANI_BOOLEAN_FALSE) == eHAL_STATUS_FAILURE) {
+ fStatus = FALSE;
+ hddLog(LOGE, "Could not pass on WNI_CFG_RATE_FOR_TX_MGMT_2G to CCM");
+ }
+
+ if (ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_RATE_FOR_TX_MGMT_5G,
+ pConfig->rate_for_tx_mgmt_5g, NULL,
+ eANI_BOOLEAN_FALSE) == eHAL_STATUS_FAILURE) {
+ fStatus = FALSE;
+ hddLog(LOGE, "Could not pass on WNI_CFG_RATE_FOR_TX_MGMT_5G to CCM");
+ }
+
return fStatus;
}
diff --git a/CORE/MAC/inc/wni_cfg.h b/CORE/MAC/inc/wni_cfg.h
index 35cacf664e62..e7cecbab360d 100644
--- a/CORE/MAC/inc/wni_cfg.h
+++ b/CORE/MAC/inc/wni_cfg.h
@@ -331,6 +331,8 @@ enum {
WNI_CFG_MAX_HT_MCS_TX_DATA,
WNI_CFG_DISABLE_ABG_RATE_FOR_TX_DATA,
WNI_CFG_RATE_FOR_TX_MGMT,
+ WNI_CFG_RATE_FOR_TX_MGMT_2G,
+ WNI_CFG_RATE_FOR_TX_MGMT_5G,
WNI_CFG_MAX,
};
@@ -1626,7 +1628,15 @@ enum {
#define WNI_CFG_RATE_FOR_TX_MGMT_STAMAX 0xFF
#define WNI_CFG_RATE_FOR_TX_MGMT_STADEF 0xFF
-#define CFG_STA_IBUF_MAX_SIZE 247
+#define WNI_CFG_RATE_FOR_TX_MGMT_2G_STAMIN 0x0
+#define WNI_CFG_RATE_FOR_TX_MGMT_2G_STAMAX 0xFF
+#define WNI_CFG_RATE_FOR_TX_MGMT_2G_STADEF 0xFF
+
+#define WNI_CFG_RATE_FOR_TX_MGMT_5G_STAMIN 0x0
+#define WNI_CFG_RATE_FOR_TX_MGMT_5G_STAMAX 0xFF
+#define WNI_CFG_RATE_FOR_TX_MGMT_5G_STADEF 0xFF
+
+#define CFG_STA_IBUF_MAX_SIZE 249
#define CFG_STA_SBUF_MAX_SIZE 3199
#define CFG_STA_MAGIC_DWORD 0xbeefbeef
diff --git a/CORE/MAC/src/cfg/cfgParamName.c b/CORE/MAC/src/cfg/cfgParamName.c
index 2cc879b1f87a..b117b2d67aae 100644
--- a/CORE/MAC/src/cfg/cfgParamName.c
+++ b/CORE/MAC/src/cfg/cfgParamName.c
@@ -339,4 +339,6 @@ unsigned char *gCfgParamName[] = {
(unsigned char *)"MAX_HT_MCS_TX_DATA",
(unsigned char *)"DISABLE_ABG_RATE_TX_DATA",
(unsigned char *)"RATE_FOR_TX_MGMT",
+ (unsigned char *)"RATE_FOR_TX_MGMT_2G",
+ (unsigned char *)"RATE_FOR_TX_MGMT_5G",
};
diff --git a/CORE/MAC/src/cfg/cfgProcMsg.c b/CORE/MAC/src/cfg/cfgProcMsg.c
index be88a377cabb..a0ab42bdde97 100644
--- a/CORE/MAC/src/cfg/cfgProcMsg.c
+++ b/CORE/MAC/src/cfg/cfgProcMsg.c
@@ -1914,6 +1914,19 @@ struct cgstatic cfg_static[WNI_CFG_MAX] = {
WNI_CFG_RATE_FOR_TX_MGMT_STAMIN,
WNI_CFG_RATE_FOR_TX_MGMT_STAMAX,
WNI_CFG_RATE_FOR_TX_MGMT_STADEF},
+
+ {WNI_CFG_RATE_FOR_TX_MGMT_2G,
+ CFG_CTL_VALID | CFG_CTL_RE | CFG_CTL_WE | CFG_CTL_INT,
+ WNI_CFG_RATE_FOR_TX_MGMT_2G_STAMIN,
+ WNI_CFG_RATE_FOR_TX_MGMT_2G_STAMAX,
+ WNI_CFG_RATE_FOR_TX_MGMT_2G_STADEF},
+
+ {WNI_CFG_RATE_FOR_TX_MGMT_5G,
+ CFG_CTL_VALID | CFG_CTL_RE | CFG_CTL_WE | CFG_CTL_INT,
+ WNI_CFG_RATE_FOR_TX_MGMT_5G_STAMIN,
+ WNI_CFG_RATE_FOR_TX_MGMT_5G_STAMAX,
+ WNI_CFG_RATE_FOR_TX_MGMT_5G_STADEF},
+
};
struct cfgstatic_string cfg_static_string[CFG_MAX_STATIC_STRING] = {
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index a83ff41c214f..214752596c19 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -9864,6 +9864,49 @@ static inline void wma_get_link_probe_timeout(struct sAniSirGlobal *mac,
}
/**
+ * wma_verify_rate_code() - verify if rate code is valid.
+ * @rate_code: rate code
+ *
+ * Return: verify result
+ */
+static bool wma_verify_rate_code(u_int32_t rate_code)
+{
+ uint8_t preamble, nss, rate;
+ bool valid = true;
+
+ preamble = (rate_code & 0xc0) >> 6;
+ nss = (rate_code & 0x30) >> 4;
+ rate = rate_code & 0xf;
+
+ switch (preamble) {
+ case WMI_RATE_PREAMBLE_CCK:
+ if (nss != 0 || rate > 3)
+ valid = false;
+ break;
+ case WMI_RATE_PREAMBLE_OFDM:
+ if (nss != 0 || rate > 7)
+ valid = false;
+ break;
+ case WMI_RATE_PREAMBLE_HT:
+ if (nss > 1 || rate > 7)
+ valid = false;
+ break;
+ case WMI_RATE_PREAMBLE_VHT:
+ if (nss > 1 || rate > 9)
+ valid = false;
+ break;
+ default:
+ break;
+ }
+ return valid;
+}
+
+#define TX_MGMT_RATE_2G_ENABLE_OFFSET 30
+#define TX_MGMT_RATE_5G_ENABLE_OFFSET 31
+#define TX_MGMT_RATE_2G_OFFSET 0
+#define TX_MGMT_RATE_5G_OFFSET 12
+
+/**
* wma_set_mgmt_rate() - set vdev mgmt rate.
* @wma: wma handle
* @vdev_id: vdev id
@@ -9874,6 +9917,7 @@ static void wma_set_vdev_mgmt_rate(tp_wma_handle wma, u_int8_t vdev_id)
{
uint32_t cfg_val;
int ret;
+ uint32_t per_band_mgmt_tx_rate = 0;
struct sAniSirGlobal *mac =
(struct sAniSirGlobal*)vos_get_context(VOS_MODULE_ID_PE,
wma->vos_context);
@@ -9885,9 +9929,9 @@ static void wma_set_vdev_mgmt_rate(tp_wma_handle wma, u_int8_t vdev_id)
if (wlan_cfgGetInt(mac, WNI_CFG_RATE_FOR_TX_MGMT,
&cfg_val) == eSIR_SUCCESS) {
- if (cfg_val == WNI_CFG_RATE_FOR_TX_MGMT_STADEF) {
- WMA_LOGD("WNI_CFG_RATE_FOR_TX_MGMT "
- "is default, ignore");
+ if ((cfg_val == WNI_CFG_RATE_FOR_TX_MGMT_STADEF) ||
+ !wma_verify_rate_code(cfg_val)) {
+ WMA_LOGE("invalid rate code, ignore.");
} else {
ret = wmi_unified_vdev_set_param_send(
wma->wmi_handle,
@@ -9902,6 +9946,46 @@ static void wma_set_vdev_mgmt_rate(tp_wma_handle wma, u_int8_t vdev_id)
WMA_LOGE("Failed to get value of "
"WNI_CFG_RATE_FOR_TX_MGMT");
}
+
+ if (wlan_cfgGetInt(mac, WNI_CFG_RATE_FOR_TX_MGMT_2G,
+ &cfg_val) == eSIR_SUCCESS) {
+ if ((cfg_val == WNI_CFG_RATE_FOR_TX_MGMT_2G_STADEF) ||
+ !wma_verify_rate_code(cfg_val)) {
+ per_band_mgmt_tx_rate &=
+ ~(1 << TX_MGMT_RATE_2G_ENABLE_OFFSET);
+ } else {
+ per_band_mgmt_tx_rate |=
+ (1 << TX_MGMT_RATE_2G_ENABLE_OFFSET);
+ per_band_mgmt_tx_rate |=
+ ((cfg_val & 0x7FF) << TX_MGMT_RATE_2G_OFFSET);
+ }
+ } else {
+ WMA_LOGE("Failed to get value of WNI_CFG_RATE_FOR_TX_MGMT_2G");
+ }
+
+ if (wlan_cfgGetInt(mac, WNI_CFG_RATE_FOR_TX_MGMT_5G,
+ &cfg_val) == eSIR_SUCCESS) {
+ if ((cfg_val == WNI_CFG_RATE_FOR_TX_MGMT_5G_STADEF) ||
+ !wma_verify_rate_code(cfg_val)) {
+ per_band_mgmt_tx_rate &=
+ ~(1 << TX_MGMT_RATE_5G_ENABLE_OFFSET);
+ } else {
+ per_band_mgmt_tx_rate |=
+ (1 << TX_MGMT_RATE_5G_ENABLE_OFFSET);
+ per_band_mgmt_tx_rate |=
+ ((cfg_val & 0x7FF) << TX_MGMT_RATE_5G_OFFSET);
+ }
+ } else {
+ WMA_LOGE("Failed to get value of WNI_CFG_RATE_FOR_TX_MGMT_5G");
+ }
+
+ ret = wmi_unified_vdev_set_param_send(
+ wma->wmi_handle,
+ vdev_id,
+ WMI_VDEV_PARAM_PER_BAND_MGMT_TX_RATE,
+ per_band_mgmt_tx_rate);
+ if (ret)
+ WMA_LOGE("Failed to set WMI_VDEV_PARAM_PER_BAND_MGMT_TX_RATE");
}
static void wma_set_sap_keepalive(tp_wma_handle wma, u_int8_t vdev_id)
@@ -18925,7 +19009,6 @@ static void wma_add_sta_req_sta_mode(tp_wma_handle wma, tpAddStaParams params)
}
else {
wma->interfaces[params->smesessionId].vdev_up = TRUE;
- wma_set_vdev_mgmt_rate(wma, params->smesessionId);
}
adf_os_atomic_set(&iface->bss_status, WMA_BSS_STATUS_STARTED);
@@ -20750,7 +20833,6 @@ static void wma_send_beacon(tp_wma_handle wma, tpSendbeaconParams bcn_info)
}
wma->interfaces[vdev_id].vdev_up = TRUE;
wma_set_sap_keepalive(wma, vdev_id);
- wma_set_vdev_mgmt_rate(wma, vdev_id);
}
}
}