diff options
| author | Linux Build Service Account <lnxbuild@quicinc.com> | 2017-05-02 03:08:12 -0700 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-05-02 03:08:12 -0700 |
| commit | 1b28889bb6eefd83e78de626be72a16882ffb050 (patch) | |
| tree | 6f501d6bfc445942398cc5ce33b0ed5245e756e7 | |
| parent | 54cd92679493de6afee63acf12d5f7d455524eac (diff) | |
| parent | c55a67233263699236df46c4b8315e3de48c74ab (diff) | |
Merge "qcacld-2.0: Add ini to configure per band mgmt rate" into wlan-cld2.driver.lnx.1.0-dev
| -rw-r--r-- | CORE/HDD/inc/wlan_hdd_cfg.h | 44 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_cfg.c | 29 | ||||
| -rw-r--r-- | CORE/MAC/inc/wni_cfg.h | 12 | ||||
| -rw-r--r-- | CORE/MAC/src/cfg/cfgParamName.c | 2 | ||||
| -rw-r--r-- | CORE/MAC/src/cfg/cfgProcMsg.c | 13 | ||||
| -rw-r--r-- | CORE/SERVICES/WMA/wma.c | 92 |
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); } } } |
