qcacld-3.0: Add ini to configure per band mgmt rate

qcacld-2.0 to qcacld-3.0 propagation

Current ini setting doesn't support configuring per band mgmt rate.
Add ini to configure per band mgmt rate.

Change-Id: I340b09324fc16b15846598b17de9976f92b93252
CRs-Fixed: 2038854
This commit is contained in:
Hong Shi
2017-05-22 18:38:41 +08:00
committed by snandini
parent ee6770181e
commit 2d384fdaf8
6 changed files with 181 additions and 1 deletions

View File

@@ -5668,6 +5668,48 @@ enum hdd_link_speed_rpt_type {
#define CFG_RATE_FOR_TX_MGMT_MAX (WNI_CFG_RATE_FOR_TX_MGMT_STAMAX) #define CFG_RATE_FOR_TX_MGMT_MAX (WNI_CFG_RATE_FOR_TX_MGMT_STAMAX)
#define CFG_RATE_FOR_TX_MGMT_DEFAULT (WNI_CFG_RATE_FOR_TX_MGMT_STADEF) #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)
#ifdef FEATURE_WLAN_TDLS #ifdef FEATURE_WLAN_TDLS
/* /*
* <ini> * <ini>
@@ -10617,6 +10659,8 @@ struct hdd_config {
uint16_t max_ht_mcs_txdata; uint16_t max_ht_mcs_txdata;
bool disable_abg_rate_txdata; bool disable_abg_rate_txdata;
uint8_t rate_for_tx_mgmt; uint8_t rate_for_tx_mgmt;
uint8_t rate_for_tx_mgmt_2g;
uint8_t rate_for_tx_mgmt_5g;
#ifdef QCA_LL_LEGACY_TX_FLOW_CONTROL #ifdef QCA_LL_LEGACY_TX_FLOW_CONTROL
uint32_t TxFlowLowWaterMark; uint32_t TxFlowLowWaterMark;
uint32_t TxFlowHighWaterMarkOffset; uint32_t TxFlowHighWaterMarkOffset;

View File

@@ -2130,6 +2130,20 @@ struct reg_table_entry g_registry_table[] = {
CFG_RATE_FOR_TX_MGMT_MIN, CFG_RATE_FOR_TX_MGMT_MIN,
CFG_RATE_FOR_TX_MGMT_MAX), CFG_RATE_FOR_TX_MGMT_MAX),
REG_VARIABLE(CFG_RATE_FOR_TX_MGMT_2G, WLAN_PARAM_HexInteger,
struct hdd_config, 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,
struct hdd_config, 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, REG_VARIABLE(CFG_ENABLE_FIRST_SCAN_2G_ONLY_NAME, WLAN_PARAM_Integer,
struct hdd_config, enableFirstScan2GOnly, struct hdd_config, enableFirstScan2GOnly,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@@ -7044,6 +7058,20 @@ bool hdd_update_config_cfg(hdd_context_t *hdd_ctx)
hdd_err("Could not pass on WNI_CFG_SAP_MAX_MCS_DATA to CCM"); hdd_err("Could not pass on WNI_CFG_SAP_MAX_MCS_DATA to CCM");
} }
if (sme_cfg_set_int(hdd_ctx->hHal, WNI_CFG_RATE_FOR_TX_MGMT_2G,
config->rate_for_tx_mgmt_2g) ==
QDF_STATUS_E_FAILURE) {
status = false;
hdd_err("Couldn't pass on WNI_CFG_RATE_FOR_TX_MGMT_2G to CCM");
}
if (sme_cfg_set_int(hdd_ctx->hHal, WNI_CFG_RATE_FOR_TX_MGMT_5G,
config->rate_for_tx_mgmt_5g) ==
QDF_STATUS_E_FAILURE) {
status = false;
hdd_err("Couldn't pass on WNI_CFG_RATE_FOR_TX_MGMT_5G to CCM");
}
return status; return status;
} }

View File

@@ -318,6 +318,8 @@ enum {
WNI_CFG_PS_WOW_DATA_INACTIVITY_TIMEOUT, WNI_CFG_PS_WOW_DATA_INACTIVITY_TIMEOUT,
WNI_CFG_HE_STA_OBSSPD, WNI_CFG_HE_STA_OBSSPD,
WNI_CFG_SAP_MAX_MCS_DATA, WNI_CFG_SAP_MAX_MCS_DATA,
WNI_CFG_RATE_FOR_TX_MGMT_2G,
WNI_CFG_RATE_FOR_TX_MGMT_5G,
/* Any new items to be added should be above this strictly */ /* Any new items to be added should be above this strictly */
CFG_PARAM_MAX_NUM CFG_PARAM_MAX_NUM
}; };
@@ -1603,6 +1605,14 @@ enum {
#define WNI_CFG_SAP_MAX_MCS_DATA_STAMAX 0x17f #define WNI_CFG_SAP_MAX_MCS_DATA_STAMAX 0x17f
#define WNI_CFG_SAP_MAX_MCS_DATA_STADEF 0x0 #define WNI_CFG_SAP_MAX_MCS_DATA_STADEF 0x0
#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_MAGIC_DWORD 0xbeefbeef #define CFG_STA_MAGIC_DWORD 0xbeefbeef
#endif #endif

View File

@@ -330,4 +330,6 @@ unsigned char *g_cfg_param_name[] = {
(unsigned char *)"ASSOC_STA_LIMIT_GO", (unsigned char *)"ASSOC_STA_LIMIT_GO",
(unsigned char *)"ASSOC_STA_LIMIT_AP", (unsigned char *)"ASSOC_STA_LIMIT_AP",
(unsigned char *)"SAP_MAX_MCS_DATA", (unsigned char *)"SAP_MAX_MCS_DATA",
(unsigned char *)"RATE_FOR_TX_MGMT_2G",
(unsigned char *)"RATE_FOR_TX_MGMT_5G",
}; };

View File

@@ -1454,6 +1454,16 @@ cgstatic cfg_static[CFG_PARAM_MAX_NUM] = {
WNI_CFG_SAP_MAX_MCS_DATA_STAMIN, WNI_CFG_SAP_MAX_MCS_DATA_STAMIN,
WNI_CFG_SAP_MAX_MCS_DATA_STAMAX, WNI_CFG_SAP_MAX_MCS_DATA_STAMAX,
WNI_CFG_SAP_MAX_MCS_DATA_STADEF}, WNI_CFG_SAP_MAX_MCS_DATA_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}
}; };

View File

@@ -583,6 +583,49 @@ static inline void wma_get_link_probe_timeout(struct sAniSirGlobal *mac,
*max_unresponsive_time = *max_inactive_time + keep_alive; *max_unresponsive_time = *max_inactive_time + keep_alive;
} }
/**
* 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_set_mgmt_rate() - set vdev mgmt rate.
* @wma: wma handle * @wma: wma handle
@@ -594,6 +637,7 @@ void wma_set_vdev_mgmt_rate(tp_wma_handle wma, uint8_t vdev_id)
{ {
uint32_t cfg_val; uint32_t cfg_val;
int ret; int ret;
uint32_t per_band_mgmt_tx_rate = 0;
struct sAniSirGlobal *mac = cds_get_context(QDF_MODULE_ID_PE); struct sAniSirGlobal *mac = cds_get_context(QDF_MODULE_ID_PE);
if (NULL == mac) { if (NULL == mac) {
@@ -603,7 +647,8 @@ void wma_set_vdev_mgmt_rate(tp_wma_handle wma, uint8_t vdev_id)
if (wlan_cfg_get_int(mac, WNI_CFG_RATE_FOR_TX_MGMT, if (wlan_cfg_get_int(mac, WNI_CFG_RATE_FOR_TX_MGMT,
&cfg_val) == eSIR_SUCCESS) { &cfg_val) == eSIR_SUCCESS) {
if (cfg_val == WNI_CFG_RATE_FOR_TX_MGMT_STADEF) { if ((cfg_val == WNI_CFG_RATE_FOR_TX_MGMT_STADEF) ||
!wma_verify_rate_code(cfg_val)) {
WMA_LOGD("default WNI_CFG_RATE_FOR_TX_MGMT, ignore"); WMA_LOGD("default WNI_CFG_RATE_FOR_TX_MGMT, ignore");
} else { } else {
ret = wma_vdev_set_param( ret = wma_vdev_set_param(
@@ -619,6 +664,47 @@ void wma_set_vdev_mgmt_rate(tp_wma_handle wma, uint8_t vdev_id)
} else { } else {
WMA_LOGE("Failed to get value of WNI_CFG_RATE_FOR_TX_MGMT"); WMA_LOGE("Failed to get value of WNI_CFG_RATE_FOR_TX_MGMT");
} }
if (wlan_cfg_get_int(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_cfg_get_int(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 = wma_vdev_set_param(
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");
} }
/** /**