From ee09f8eefdc769f00f70d2059c4237f96f6b897c Mon Sep 17 00:00:00 2001 From: Paul Zhang Date: Mon, 23 Apr 2018 16:11:32 +0800 Subject: [PATCH] qcacld-3.0: Configure the A-MPDU subframe per AC Video/audio wireless application needs to tune parameters per AC based. Configure A-MPDU subframe parameter per AC via driver ini configuration file. Change-Id: Id63be7aacf6465edee08f7a2f4c8a119f9bd6346 CRs-Fixed: 2212932 --- core/hdd/inc/wlan_hdd_cfg.h | 108 ++++++++++++++++++ core/hdd/src/wlan_hdd_cfg.c | 46 +++++++- core/mac/inc/sir_api.h | 8 ++ .../src/pe/lim/lim_process_mlm_req_messages.c | 8 ++ core/sme/inc/csr_api.h | 4 + core/sme/inc/csr_internal.h | 4 + core/sme/src/csr/csr_api_roam.c | 24 ++++ core/wma/inc/wma_api.h | 10 ++ core/wma/inc/wma_if.h | 8 ++ core/wma/src/wma_dev_if.c | 15 +++ core/wma/src/wma_features.c | 74 ++++++++++++ 11 files changed, 304 insertions(+), 5 deletions(-) diff --git a/core/hdd/inc/wlan_hdd_cfg.h b/core/hdd/inc/wlan_hdd_cfg.h index 0adf918f0e05..4e0a67abaf65 100644 --- a/core/hdd/inc/wlan_hdd_cfg.h +++ b/core/hdd/inc/wlan_hdd_cfg.h @@ -8823,6 +8823,110 @@ enum hdd_link_speed_rpt_type { #define CFG_TX_AGGREGATION_SIZE_MAX (64) #define CFG_TX_AGGREGATION_SIZE_DEFAULT (64) +/* + * + * gTxAggregationSizeBE - To configure Tx aggregation size for BE queue + * in no of MPDUs + * @Min: 0 + * @Max: 64 + * @Default: 0 + * + * gTxAggregationSizeBE gives an option to configure Tx aggregation size + * for BE queue in no of MPDUs.This can be useful in debugging + * throughput issues + * + * Related: None + * + * Supported Feature: STA + * + * Usage: Internal/External + * + * + */ + +#define CFG_TX_AGGREGATION_SIZEBE "gTxAggregationSizeBE" +#define CFG_TX_AGGREGATION_SIZEBE_MIN (0) +#define CFG_TX_AGGREGATION_SIZEBE_MAX (64) +#define CFG_TX_AGGREGATION_SIZEBE_DEFAULT (0) + +/* + * + * gTxAggregationSizeBK - To configure Tx aggregation size for BK queue + * in no of MPDUs + * @Min: 0 + * @Max: 64 + * @Default: 0 + * + * gTxAggregationSizeBK gives an option to configure Tx aggregation size + * for BK queue in no of MPDUs.This can be useful in debugging + * throughput issues + * + * Related: None + * + * Supported Feature: STA + * + * Usage: Internal/External + * + * + */ + +#define CFG_TX_AGGREGATION_SIZEBK "gTxAggregationSizeBK" +#define CFG_TX_AGGREGATION_SIZEBK_MIN (0) +#define CFG_TX_AGGREGATION_SIZEBK_MAX (64) +#define CFG_TX_AGGREGATION_SIZEBK_DEFAULT (0) + +/* + * + * gTxAggregationSizeVI - To configure Tx aggregation size for VI queue + * in no of MPDUs + * @Min: 0 + * @Max: 64 + * @Default: 0 + * + * gTxAggregationSizeVI gives an option to configure Tx aggregation size + * for VI queue in no of MPDUs.This can be useful in debugging + * throughput issues + * + * Related: None + * + * Supported Feature: STA + * + * Usage: Internal/External + * + * + */ + +#define CFG_TX_AGGREGATION_SIZEVI "gTxAggregationSizeVI" +#define CFG_TX_AGGREGATION_SIZEVI_MIN (0) +#define CFG_TX_AGGREGATION_SIZEVI_MAX (64) +#define CFG_TX_AGGREGATION_SIZEVI_DEFAULT (0) + +/* + * + * gTxAggregationSizeVO - To configure Tx aggregation size for VO queue + * in no of MPDUs + * @Min: 0 + * @Max: 64 + * @Default: 0 + * + * gTxAggregationSizeVO gives an option to configure Tx aggregation size + * for BE queue in no of MPDUs.This can be useful in debugging + * throughput issues + * + * Related: None + * + * Supported Feature: STA + * + * Usage: Internal/External + * + * + */ + +#define CFG_TX_AGGREGATION_SIZEVO "gTxAggregationSizeVO" +#define CFG_TX_AGGREGATION_SIZEVO_MIN (0) +#define CFG_TX_AGGREGATION_SIZEVO_MAX (64) +#define CFG_TX_AGGREGATION_SIZEVO_DEFAULT (0) + /* * * gRxAggregationSize - Gives an option to configure Rx aggregation size @@ -14686,6 +14790,10 @@ struct hdd_config { bool goptimize_chan_avoid_event; bool enable_go_cts2self_for_sta; uint32_t tx_aggregation_size; + uint32_t tx_aggregation_size_be; + uint32_t tx_aggregation_size_bk; + uint32_t tx_aggregation_size_vi; + uint32_t tx_aggregation_size_vo; uint32_t rx_aggregation_size; bool sta_prefer_80MHz_over_160MHz; uint8_t sap_max_inactivity_override; diff --git a/core/hdd/src/wlan_hdd_cfg.c b/core/hdd/src/wlan_hdd_cfg.c index 4e1c8f44dcae..21624ae500c3 100644 --- a/core/hdd/src/wlan_hdd_cfg.c +++ b/core/hdd/src/wlan_hdd_cfg.c @@ -4243,11 +4243,39 @@ struct reg_table_entry g_registry_table[] = { CFG_OPTIMIZE_CA_EVENT_ENABLE), REG_VARIABLE(CFG_TX_AGGREGATION_SIZE, WLAN_PARAM_Integer, - struct hdd_config, tx_aggregation_size, - VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, - CFG_TX_AGGREGATION_SIZE_DEFAULT, - CFG_TX_AGGREGATION_SIZE_MIN, - CFG_TX_AGGREGATION_SIZE_MAX), + struct hdd_config, tx_aggregation_size, + VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, + CFG_TX_AGGREGATION_SIZE_DEFAULT, + CFG_TX_AGGREGATION_SIZE_MIN, + CFG_TX_AGGREGATION_SIZE_MAX), + + REG_VARIABLE(CFG_TX_AGGREGATION_SIZEBE, WLAN_PARAM_Integer, + struct hdd_config, tx_aggregation_size_be, + VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, + CFG_TX_AGGREGATION_SIZEBE_DEFAULT, + CFG_TX_AGGREGATION_SIZEBE_MIN, + CFG_TX_AGGREGATION_SIZEBE_MAX), + + REG_VARIABLE(CFG_TX_AGGREGATION_SIZEBK, WLAN_PARAM_Integer, + struct hdd_config, tx_aggregation_size_bk, + VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, + CFG_TX_AGGREGATION_SIZEBK_DEFAULT, + CFG_TX_AGGREGATION_SIZEBK_MIN, + CFG_TX_AGGREGATION_SIZEBK_MAX), + + REG_VARIABLE(CFG_TX_AGGREGATION_SIZEVI, WLAN_PARAM_Integer, + struct hdd_config, tx_aggregation_size_vi, + VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, + CFG_TX_AGGREGATION_SIZEVI_DEFAULT, + CFG_TX_AGGREGATION_SIZEVI_MIN, + CFG_TX_AGGREGATION_SIZEVI_MAX), + + REG_VARIABLE(CFG_TX_AGGREGATION_SIZEVO, WLAN_PARAM_Integer, + struct hdd_config, tx_aggregation_size_vo, + VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, + CFG_TX_AGGREGATION_SIZEVO_DEFAULT, + CFG_TX_AGGREGATION_SIZEVO_MIN, + CFG_TX_AGGREGATION_SIZEVO_MAX), REG_VARIABLE(CFG_RX_AGGREGATION_SIZE, WLAN_PARAM_Integer, struct hdd_config, rx_aggregation_size, @@ -8885,6 +8913,14 @@ QDF_STATUS hdd_set_sme_config(struct hdd_context *hdd_ctx) smeConfig->csrConfig.tx_aggregation_size = hdd_ctx->config->tx_aggregation_size; + smeConfig->csrConfig.tx_aggregation_size_be = + hdd_ctx->config->tx_aggregation_size_be; + smeConfig->csrConfig.tx_aggregation_size_bk = + hdd_ctx->config->tx_aggregation_size_bk; + smeConfig->csrConfig.tx_aggregation_size_vi = + hdd_ctx->config->tx_aggregation_size_vi; + smeConfig->csrConfig.tx_aggregation_size_vo = + hdd_ctx->config->tx_aggregation_size_vo; smeConfig->csrConfig.rx_aggregation_size = hdd_ctx->config->rx_aggregation_size; smeConfig->csrConfig.enable_bcast_probe_rsp = diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h index 32ada43d7855..7c1f3140bbfb 100644 --- a/core/mac/inc/sir_api.h +++ b/core/mac/inc/sir_api.h @@ -6763,11 +6763,19 @@ struct sme_ndp_peer_ind { * struct sir_set_tx_rx_aggregation_size - sets tx rx aggregation size * @vdev_id: vdev id of the session * @tx_aggregation_size: Tx aggregation size + * @tx_aggregation_size_be: Tx aggregation size for be queue + * @tx_aggregation_size_bk: Tx aggregation size for bk queue + * @tx_aggregation_size_vi: Tx aggregation size for vi queue + * @tx_aggregation_size_vo: Tx aggregation size for vo queue * @rx_aggregation_size: Rx aggregation size */ struct sir_set_tx_rx_aggregation_size { uint8_t vdev_id; uint32_t tx_aggregation_size; + uint32_t tx_aggregation_size_be; + uint32_t tx_aggregation_size_bk; + uint32_t tx_aggregation_size_vi; + uint32_t tx_aggregation_size_vo; uint32_t rx_aggregation_size; }; diff --git a/core/mac/src/pe/lim/lim_process_mlm_req_messages.c b/core/mac/src/pe/lim/lim_process_mlm_req_messages.c index 8849f72e9bbc..db73b5ef7717 100644 --- a/core/mac/src/pe/lim/lim_process_mlm_req_messages.c +++ b/core/mac/src/pe/lim/lim_process_mlm_req_messages.c @@ -642,6 +642,14 @@ lim_mlm_add_bss(tpAniSirGlobal mac_ctx, addbss_param->nss_5g = mac_ctx->vdev_type_nss_5g.ibss; addbss_param->tx_aggregation_size = mac_ctx->roam.configParam.tx_aggregation_size; + addbss_param->tx_aggregation_size_be = + mac_ctx->roam.configParam.tx_aggregation_size_be; + addbss_param->tx_aggregation_size_bk = + mac_ctx->roam.configParam.tx_aggregation_size_bk; + addbss_param->tx_aggregation_size_vi = + mac_ctx->roam.configParam.tx_aggregation_size_vi; + addbss_param->tx_aggregation_size_vo = + mac_ctx->roam.configParam.tx_aggregation_size_vo; addbss_param->rx_aggregation_size = mac_ctx->roam.configParam.rx_aggregation_size; } diff --git a/core/sme/inc/csr_api.h b/core/sme/inc/csr_api.h index 9497209fa668..05a73f84e05a 100644 --- a/core/sme/inc/csr_api.h +++ b/core/sme/inc/csr_api.h @@ -1278,6 +1278,10 @@ typedef struct tagCsrConfigParam { enum scan_dwelltime_adaptive_mode roamscan_adaptive_dwell_mode; struct csr_sta_roam_policy_params sta_roam_policy_params; uint32_t tx_aggregation_size; + uint32_t tx_aggregation_size_be; + uint32_t tx_aggregation_size_bk; + uint32_t tx_aggregation_size_vi; + uint32_t tx_aggregation_size_vo; uint32_t rx_aggregation_size; struct wmi_per_roam_config per_roam_config; bool enable_bcast_probe_rsp; diff --git a/core/sme/inc/csr_internal.h b/core/sme/inc/csr_internal.h index 25b00de13eee..09e0cd3f9332 100644 --- a/core/sme/inc/csr_internal.h +++ b/core/sme/inc/csr_internal.h @@ -582,6 +582,10 @@ struct csr_config { enum scan_dwelltime_adaptive_mode roamscan_adaptive_dwell_mode; struct csr_sta_roam_policy_params sta_roam_policy; uint32_t tx_aggregation_size; + uint32_t tx_aggregation_size_be; + uint32_t tx_aggregation_size_bk; + uint32_t tx_aggregation_size_vi; + uint32_t tx_aggregation_size_vo; uint32_t rx_aggregation_size; struct wmi_per_roam_config per_roam_config; bool enable_bcast_probe_rsp; diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index f495fc34bfe7..568b3cc3375a 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -3089,6 +3089,14 @@ QDF_STATUS csr_change_default_config_param(tpAniSirGlobal pMac, pMac->roam.configParam.tx_aggregation_size = pParam->tx_aggregation_size; + pMac->roam.configParam.tx_aggregation_size_be = + pParam->tx_aggregation_size_be; + pMac->roam.configParam.tx_aggregation_size_bk = + pParam->tx_aggregation_size_bk; + pMac->roam.configParam.tx_aggregation_size_vi = + pParam->tx_aggregation_size_vi; + pMac->roam.configParam.tx_aggregation_size_vo = + pParam->tx_aggregation_size_vo; pMac->roam.configParam.rx_aggregation_size = pParam->rx_aggregation_size; pMac->roam.configParam.enable_bcast_probe_rsp = @@ -3418,6 +3426,14 @@ QDF_STATUS csr_get_config_param(tpAniSirGlobal pMac, tCsrConfigParam *pParam) pMac->roam.configParam.sta_roam_policy.skip_unsafe_channels; pParam->tx_aggregation_size = pMac->roam.configParam.tx_aggregation_size; + pParam->tx_aggregation_size_be = + pMac->roam.configParam.tx_aggregation_size_be; + pParam->tx_aggregation_size_bk = + pMac->roam.configParam.tx_aggregation_size_bk; + pParam->tx_aggregation_size_vi = + pMac->roam.configParam.tx_aggregation_size_vi; + pParam->tx_aggregation_size_vo = + pMac->roam.configParam.tx_aggregation_size_vo; pParam->rx_aggregation_size = pMac->roam.configParam.rx_aggregation_size; pParam->enable_bcast_probe_rsp = @@ -16723,6 +16739,14 @@ QDF_STATUS csr_issue_add_sta_for_session_req(tpAniSirGlobal pMac, add_sta_self_req->nss_5g = nss_5g; add_sta_self_req->tx_aggregation_size = pMac->roam.configParam.tx_aggregation_size; + add_sta_self_req->tx_aggregation_size_be = + pMac->roam.configParam.tx_aggregation_size_be; + add_sta_self_req->tx_aggregation_size_bk = + pMac->roam.configParam.tx_aggregation_size_bk; + add_sta_self_req->tx_aggregation_size_vi = + pMac->roam.configParam.tx_aggregation_size_vi; + add_sta_self_req->tx_aggregation_size_vo = + pMac->roam.configParam.tx_aggregation_size_vo; add_sta_self_req->rx_aggregation_size = pMac->roam.configParam.rx_aggregation_size; add_sta_self_req->enable_bcast_probe_rsp = diff --git a/core/wma/inc/wma_api.h b/core/wma/inc/wma_api.h index 38bed6013c67..a458b0737c23 100644 --- a/core/wma/inc/wma_api.h +++ b/core/wma/inc/wma_api.h @@ -252,6 +252,16 @@ QDF_STATUS wma_set_cts2self_for_p2p_go(void *wma_handle, QDF_STATUS wma_set_tx_rx_aggregation_size (struct sir_set_tx_rx_aggregation_size *tx_rx_aggregation_size); +/** + * wma_set_tx_rx_aggregation_size_per_ac() - set aggregation size per ac + * @tx_rx_aggregation_size: the parameter for aggregation size + * + * This function try to set the aggregation size per AC. + * + * Return: QDF_STATUS enumeration + */ +QDF_STATUS wma_set_tx_rx_aggregation_size_per_ac + (struct sir_set_tx_rx_aggregation_size *tx_rx_aggregation_size); /** * wma_get_sar_limit() - get SAR limits from the target * @handle: wma handle diff --git a/core/wma/inc/wma_if.h b/core/wma/inc/wma_if.h index 88f799bb750d..b5ff7ff0a31f 100644 --- a/core/wma/inc/wma_if.h +++ b/core/wma/inc/wma_if.h @@ -509,6 +509,10 @@ typedef struct { uint8_t nss_5g; uint16_t beacon_tx_rate; uint32_t tx_aggregation_size; + uint32_t tx_aggregation_size_be; + uint32_t tx_aggregation_size_bk; + uint32_t tx_aggregation_size_vi; + uint32_t tx_aggregation_size_vo; uint32_t rx_aggregation_size; #ifdef WLAN_FEATURE_11AX bool he_capable; @@ -1174,6 +1178,10 @@ struct add_sta_self_params { uint8_t nss_5g; uint32_t status; uint32_t tx_aggregation_size; + uint32_t tx_aggregation_size_be; + uint32_t tx_aggregation_size_bk; + uint32_t tx_aggregation_size_vi; + uint32_t tx_aggregation_size_vo; uint32_t rx_aggregation_size; bool enable_bcast_probe_rsp; uint8_t fils_max_chan_guard_time; diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c index 8bcf88ef11a2..8b9c9658e9ed 100644 --- a/core/wma/src/wma_dev_if.c +++ b/core/wma/src/wma_dev_if.c @@ -2297,8 +2297,23 @@ struct cdp_vdev *wma_vdev_attach(tp_wma_handle wma_handle, if (status != QDF_STATUS_SUCCESS) WMA_LOGE("failed to set aggregation sizes(err=%d)", status); + tx_rx_aggregation_size.tx_aggregation_size_be = + self_sta_req->tx_aggregation_size_be; + tx_rx_aggregation_size.tx_aggregation_size_bk = + self_sta_req->tx_aggregation_size_bk; + tx_rx_aggregation_size.tx_aggregation_size_vi = + self_sta_req->tx_aggregation_size_vi; + tx_rx_aggregation_size.tx_aggregation_size_vo = + self_sta_req->tx_aggregation_size_vo; + switch (self_sta_req->type) { case WMI_VDEV_TYPE_STA: + status = wma_set_tx_rx_aggregation_size_per_ac( + &tx_rx_aggregation_size); + if (status != QDF_STATUS_SUCCESS) + WMA_LOGE("failed to set aggr sizes per ac(err=%d)", + status); + if (wlan_cfg_get_int(mac, WNI_CFG_INFRA_STA_KEEP_ALIVE_PERIOD, &cfg_val) != eSIR_SUCCESS) { WMA_LOGE("Failed to get value for WNI_CFG_INFRA_STA_KEEP_ALIVE_PERIOD"); diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c index 6d5077b84ca4..85d789d9ec3f 100644 --- a/core/wma/src/wma_features.c +++ b/core/wma/src/wma_features.c @@ -4596,6 +4596,80 @@ QDF_STATUS wma_set_tx_rx_aggregation_size( return QDF_STATUS_SUCCESS; } +QDF_STATUS wma_set_tx_rx_aggregation_size_per_ac( + struct sir_set_tx_rx_aggregation_size *tx_rx_aggregation_size) +{ + tp_wma_handle wma_handle; + wmi_vdev_set_custom_aggr_size_cmd_fixed_param *cmd; + int32_t len; + wmi_buf_t buf; + u_int8_t *buf_ptr; + int ret; + int queue_num; + uint32_t tx_aggr_size[4]; + + wma_handle = cds_get_context(QDF_MODULE_ID_WMA); + + if (!tx_rx_aggregation_size) { + WMA_LOGE("%s: invalid pointer", __func__); + return QDF_STATUS_E_INVAL; + } + + if (!wma_handle) { + WMA_LOGE("%s: WMA context is invald!", __func__); + return QDF_STATUS_E_INVAL; + } + + tx_aggr_size[0] = tx_rx_aggregation_size->tx_aggregation_size_be; + tx_aggr_size[1] = tx_rx_aggregation_size->tx_aggregation_size_bk; + tx_aggr_size[2] = tx_rx_aggregation_size->tx_aggregation_size_vi; + tx_aggr_size[3] = tx_rx_aggregation_size->tx_aggregation_size_vo; + + for (queue_num = 0; queue_num < 4; queue_num++) { + if (tx_aggr_size[queue_num] == 0) + continue; + + len = sizeof(*cmd); + buf = wmi_buf_alloc(wma_handle->wmi_handle, len); + + if (!buf) { + WMA_LOGE("%s: Failed allocate wmi buffer", __func__); + return QDF_STATUS_E_NOMEM; + } + + buf_ptr = (u_int8_t *)wmi_buf_data(buf); + cmd = (wmi_vdev_set_custom_aggr_size_cmd_fixed_param *)buf_ptr; + + WMITLV_SET_HDR(&cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_vdev_set_custom_aggr_size_cmd_fixed_param, + WMITLV_GET_STRUCT_TLVLEN( + wmi_vdev_set_custom_aggr_size_cmd_fixed_param)); + + cmd->vdev_id = tx_rx_aggregation_size->vdev_id; + cmd->rx_aggr_size = + tx_rx_aggregation_size->rx_aggregation_size; + + cmd->tx_aggr_size = tx_aggr_size[queue_num]; + /* bit 5: tx_ac_enable, if set, ac bitmap is valid. */ + cmd->enable_bitmap = 0x20 | queue_num; + + WMA_LOGD("queue_num: %d, tx aggr: %d rx aggr: %d vdev: %d", + queue_num, cmd->tx_aggr_size, + cmd->rx_aggr_size, cmd->vdev_id); + + ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len, + WMI_VDEV_SET_CUSTOM_AGGR_SIZE_CMDID); + if (ret) { + WMA_LOGE("%s: Failed to send aggregation size command", + __func__); + wmi_buf_free(buf); + return QDF_STATUS_E_FAILURE; + } + } + + return QDF_STATUS_SUCCESS; +} + /** * wma_p2p_lo_start() - P2P listen offload start * @params: p2p listen offload parameters