diff options
| author | Padma, Santhosh Kumar <skpadma@codeaurora.org> | 2016-08-16 16:05:14 +0530 |
|---|---|---|
| committer | qcabuildsw <qcabuildsw@localhost> | 2016-10-07 12:54:32 -0700 |
| commit | a71196710cedc2d56342b8f06f891aa254d4d8b7 (patch) | |
| tree | dfd1ae44310450923739e282248fa462487f0069 | |
| parent | a89d3b4d800423443c46b70aaa1e4ded851e2eff (diff) | |
qcacld-3.0: Set Tx/Rx aggregation size
qcacld-2.0 to qcacld-3.0 propagation
Add changes to set Tx/Rx aggregation size. Also, add ini parameters
for Tx/Rx aggregation sizes.
Change-Id: Ia5811bf7cf7081989fde5c8cdcca84b42120b90c
CRs-Fixed: 990161
| -rw-r--r-- | core/hdd/inc/wlan_hdd_cfg.h | 20 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_cfg.c | 19 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_cfg80211.c | 42 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_cfg80211.h | 8 | ||||
| -rw-r--r-- | core/mac/inc/sir_api.h | 12 | ||||
| -rw-r--r-- | core/mac/src/pe/lim/lim_process_mlm_req_messages.c | 4 | ||||
| -rw-r--r-- | core/sme/inc/csr_api.h | 2 | ||||
| -rw-r--r-- | core/sme/inc/csr_internal.h | 2 | ||||
| -rw-r--r-- | core/sme/src/csr/csr_api_roam.c | 13 | ||||
| -rw-r--r-- | core/wma/inc/wma_api.h | 2 | ||||
| -rw-r--r-- | core/wma/inc/wma_if.h | 4 | ||||
| -rw-r--r-- | core/wma/src/wma_dev_if.c | 12 | ||||
| -rw-r--r-- | core/wma/src/wma_features.c | 65 |
13 files changed, 205 insertions, 0 deletions
diff --git a/core/hdd/inc/wlan_hdd_cfg.h b/core/hdd/inc/wlan_hdd_cfg.h index c0b065f4b761..a7408810cd73 100644 --- a/core/hdd/inc/wlan_hdd_cfg.h +++ b/core/hdd/inc/wlan_hdd_cfg.h @@ -2823,6 +2823,24 @@ typedef enum { #define CFG_SELF_GEN_FRM_PWR_DEFAULT (0) /* + * gTxAggregationSize gives an option to configure Tx aggregation size + * in no of MPDUs. This can be useful in debugging throughput issues + */ +#define CFG_TX_AGGREGATION_SIZE "gTxAggregationSize" +#define CFG_TX_AGGREGATION_SIZE_MIN (0) +#define CFG_TX_AGGREGATION_SIZE_MAX (64) +#define CFG_TX_AGGREGATION_SIZE_DEFAULT (64) + +/* + * gRxAggregationSize gives an option to configure Rx aggregation size + * in no of MPDUs. This can be useful in debugging throughput issues + */ +#define CFG_RX_AGGREGATION_SIZE "gRxAggregationSize" +#define CFG_RX_AGGREGATION_SIZE_MIN (1) +#define CFG_RX_AGGREGATION_SIZE_MAX (64) +#define CFG_RX_AGGREGATION_SIZE_DEFAULT (64) + +/* * fine timing measurement capability information * * <----- fine_time_meas_cap (in bits) -----> @@ -4163,6 +4181,8 @@ struct hdd_config { uint8_t sifs_burst_duration; bool goptimize_chan_avoid_event; bool enable_go_cts2self_for_sta; + uint32_t tx_aggregation_size; + uint32_t rx_aggregation_size; }; #define VAR_OFFSET(_Struct, _Var) (offsetof(_Struct, _Var)) diff --git a/core/hdd/src/wlan_hdd_cfg.c b/core/hdd/src/wlan_hdd_cfg.c index d22a5f8bde3f..0c017df08a37 100644 --- a/core/hdd/src/wlan_hdd_cfg.c +++ b/core/hdd/src/wlan_hdd_cfg.c @@ -3985,6 +3985,20 @@ REG_TABLE_ENTRY g_registry_table[] = { CFG_OPTIMIZE_CA_EVENT_DEFAULT, CFG_OPTIMIZE_CA_EVENT_DISABLE, 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), + + REG_VARIABLE(CFG_RX_AGGREGATION_SIZE, WLAN_PARAM_Integer, + struct hdd_config, rx_aggregation_size, + VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, + CFG_RX_AGGREGATION_SIZE_DEFAULT, + CFG_RX_AGGREGATION_SIZE_MIN, + CFG_RX_AGGREGATION_SIZE_MAX), }; /** @@ -7154,6 +7168,11 @@ QDF_STATUS hdd_set_sme_config(hdd_context_t *pHddCtx) CSR_STA_ROAM_POLICY_DFS_ENABLED; smeConfig->csrConfig.sta_roam_policy_params.skip_unsafe_channels = 0; + smeConfig->csrConfig.tx_aggregation_size = + pHddCtx->config->tx_aggregation_size; + smeConfig->csrConfig.rx_aggregation_size = + pHddCtx->config->rx_aggregation_size; + status = sme_update_config(pHddCtx->hHal, smeConfig); if (!QDF_IS_STATUS_SUCCESS(status)) { hddLog(LOGE, "sme_update_config() return failure %d", diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 2e6c4af0de56..1d40f77e2804 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -3870,6 +3870,8 @@ wlan_hdd_wifi_config_policy[QCA_WLAN_VENDOR_ATTR_CONFIG_MAX + 1] = { [QCA_WLAN_VENDOR_ATTR_CONFIG_STATS_AVG_FACTOR] = {.type = NLA_U16 }, [QCA_WLAN_VENDOR_ATTR_CONFIG_GUARD_TIME] = {.type = NLA_U32 }, [QCA_WLAN_VENDOR_ATTR_CONFIG_CHANNEL_AVOIDANCE_IND] = {.type = NLA_U8 }, + [QCA_WLAN_VENDOR_ATTR_CONFIG_TX_MPDU_AGGREGATION] = {.type = NLA_U8 }, + [QCA_WLAN_VENDOR_ATTR_CONFIG_RX_MPDU_AGGREGATION] = {.type = NLA_U8 }, }; /** @@ -3938,6 +3940,8 @@ __wlan_hdd_cfg80211_wifi_configuration_set(struct wiphy *wiphy, bool vendor_ie_present = false, access_policy_present = false; uint16_t scan_ie_len = 0; uint8_t *scan_ie; + struct sir_set_tx_rx_aggregation_size request; + QDF_STATUS qdf_status; ENTER_DEV(dev); @@ -4096,6 +4100,44 @@ __wlan_hdd_cfg80211_wifi_configuration_set(struct wiphy *wiphy, } else ret_val = -EPERM; } + + if (tb[QCA_WLAN_VENDOR_ATTR_CONFIG_TX_MPDU_AGGREGATION] || + tb[QCA_WLAN_VENDOR_ATTR_CONFIG_RX_MPDU_AGGREGATION]) { + /* if one is specified, both must be specified */ + if (!tb[QCA_WLAN_VENDOR_ATTR_CONFIG_TX_MPDU_AGGREGATION] || + !tb[QCA_WLAN_VENDOR_ATTR_CONFIG_RX_MPDU_AGGREGATION]) { + hdd_err("Both TX and RX MPDU Aggregation required"); + return -EINVAL; + } + + request.tx_aggregation_size = nla_get_u8( + tb[QCA_WLAN_VENDOR_ATTR_CONFIG_TX_MPDU_AGGREGATION]); + request.rx_aggregation_size = nla_get_u8( + tb[QCA_WLAN_VENDOR_ATTR_CONFIG_RX_MPDU_AGGREGATION]); + request.vdev_id = adapter->sessionId; + + if (request.tx_aggregation_size >= + CFG_TX_AGGREGATION_SIZE_MIN && + request.tx_aggregation_size <= + CFG_TX_AGGREGATION_SIZE_MAX && + request.rx_aggregation_size >= + CFG_RX_AGGREGATION_SIZE_MIN && + request.rx_aggregation_size <= + CFG_RX_AGGREGATION_SIZE_MAX) { + qdf_status = wma_set_tx_rx_aggregation_size(&request); + if (qdf_status != QDF_STATUS_SUCCESS) { + hdd_err("failed to set aggr sizes err %d", + qdf_status); + ret_val = -EPERM; + } + } else { + hdd_err("TX %d RX %d MPDU aggr size not in range", + request.tx_aggregation_size, + request.rx_aggregation_size); + ret_val = -EINVAL; + } + } + return ret_val; } diff --git a/core/hdd/src/wlan_hdd_cfg80211.h b/core/hdd/src/wlan_hdd_cfg80211.h index 80dbc428c50b..37fa4e6ab79a 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.h +++ b/core/hdd/src/wlan_hdd_cfg80211.h @@ -2319,6 +2319,10 @@ enum qca_access_policy { * @QCA_WLAN_VENDOR_ATTR_CONFIG_STATS_AVG_FACTOR: stats avg. factor * @QCA_WLAN_VENDOR_ATTR_CONFIG_GUARD_TIME: guard time * @QCA_WLAN_VENDOR_ATTR_CONFIG_FINE_TIME_MEASUREMENT: fine time measurement + * @QCA_WLAN_VENDOR_ATTR_CONFIG_TX_MPDU_AGGREGATION: + * Tx aggregation size (8-bit unsigned value) + * @QCA_WLAN_VENDOR_ATTR_CONFIG_RX_MPDU_AGGREGATION: + * Rx aggregation size (8-bit unsigned value) * @QCA_WLAN_VENDOR_ATTR_CONFIG_SCAN_DEFAULT_IES: Update the default scan IEs * @QCA_WLAN_VENDOR_ATTR_CONFIG_GENERIC_COMMAND: * Unsigned 32-bit value attribute for generic commands @@ -2349,6 +2353,10 @@ enum qca_wlan_vendor_config { QCA_WLAN_VENDOR_ATTR_CONFIG_FINE_TIME_MEASUREMENT, QCA_WLAN_VENDOR_ATTR_CONFIG_PENALIZE_AFTER_NCONS_BEACON_MISS, QCA_WLAN_VENDOR_ATTR_CONFIG_CHANNEL_AVOIDANCE_IND, + + QCA_WLAN_VENDOR_ATTR_CONFIG_TX_MPDU_AGGREGATION, + QCA_WLAN_VENDOR_ATTR_CONFIG_RX_MPDU_AGGREGATION, + /* Attribute used to set scan default IEs to the driver. * * These IEs can be used by scan operations that will be initiated by diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h index 362275c14bd3..b31a834a5399 100644 --- a/core/mac/inc/sir_api.h +++ b/core/mac/inc/sir_api.h @@ -6451,6 +6451,18 @@ struct sme_ndp_peer_ind { #endif /* WLAN_FEATURE_NAN_DATAPATH */ /** + * 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 + * @rx_aggregation_size: Rx aggregation size + */ +struct sir_set_tx_rx_aggregation_size { + uint8_t vdev_id; + uint32_t tx_aggregation_size; + uint32_t rx_aggregation_size; +}; + +/** * struct sir_p2p_lo_start - p2p listen offload start * @vdev_id: vdev identifier * @ctl_flags: control flag 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 1c914142c3d6..09e5c52f867e 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 @@ -595,6 +595,10 @@ lim_mlm_add_bss(tpAniSirGlobal mac_ctx, if (QDF_IBSS_MODE == addbss_param->halPersona) { addbss_param->nss_2g = mac_ctx->vdev_type_nss_2g.ibss; 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->rx_aggregation_size = + mac_ctx->roam.configParam.rx_aggregation_size; } lim_log(mac_ctx, LOG2, FL("dot11_mode:%d nss value:%d"), addbss_param->dot11_mode, addbss_param->nss); diff --git a/core/sme/inc/csr_api.h b/core/sme/inc/csr_api.h index 47d654b8d06c..105682b6ed65 100644 --- a/core/sme/inc/csr_api.h +++ b/core/sme/inc/csr_api.h @@ -1305,6 +1305,8 @@ typedef struct tagCsrConfigParam { enum wmi_dwelltime_adaptive_mode scan_adaptive_dwell_mode; enum wmi_dwelltime_adaptive_mode roamscan_adaptive_dwell_mode; struct csr_sta_roam_policy_params sta_roam_policy_params; + uint32_t tx_aggregation_size; + uint32_t rx_aggregation_size; } tCsrConfigParam; /* Tush */ diff --git a/core/sme/inc/csr_internal.h b/core/sme/inc/csr_internal.h index dd9dffafea2c..959a1ea019ed 100644 --- a/core/sme/inc/csr_internal.h +++ b/core/sme/inc/csr_internal.h @@ -666,6 +666,8 @@ typedef struct tagCsrConfig { enum wmi_dwelltime_adaptive_mode scan_adaptive_dwell_mode; enum wmi_dwelltime_adaptive_mode roamscan_adaptive_dwell_mode; struct csr_sta_roam_policy_params sta_roam_policy; + uint32_t tx_aggregation_size; + uint32_t rx_aggregation_size; } tCsrConfig; typedef struct tagCsrChannelPowerInfo { diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index 74a0f586f26d..a401224bb099 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -2518,6 +2518,11 @@ QDF_STATUS csr_change_default_config_param(tpAniSirGlobal pMac, pMac->roam.configParam.sta_roam_policy.skip_unsafe_channels = pParam->sta_roam_policy_params.skip_unsafe_channels; + pMac->roam.configParam.tx_aggregation_size = + pParam->tx_aggregation_size; + pMac->roam.configParam.rx_aggregation_size = + pParam->rx_aggregation_size; + } return status; } @@ -2726,6 +2731,10 @@ QDF_STATUS csr_get_config_param(tpAniSirGlobal pMac, tCsrConfigParam *pParam) pMac->roam.configParam.sta_roam_policy.dfs_mode; pParam->sta_roam_policy_params.skip_unsafe_channels = pMac->roam.configParam.sta_roam_policy.skip_unsafe_channels; + pParam->tx_aggregation_size = + pMac->roam.configParam.tx_aggregation_size; + pParam->rx_aggregation_size = + pMac->roam.configParam.rx_aggregation_size; return QDF_STATUS_SUCCESS; } @@ -15300,6 +15309,10 @@ QDF_STATUS csr_process_add_sta_session_command(tpAniSirGlobal pMac, add_sta_self_req->sub_type = pAddStaReq->subType; add_sta_self_req->nss_2g = nss_2g; 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->rx_aggregation_size = + pMac->roam.configParam.rx_aggregation_size; msg.type = WMA_ADD_STA_SELF_REQ; msg.reserved = 0; diff --git a/core/wma/inc/wma_api.h b/core/wma/inc/wma_api.h index 0f2355335324..295973ba2bc7 100644 --- a/core/wma/inc/wma_api.h +++ b/core/wma/inc/wma_api.h @@ -314,4 +314,6 @@ QDF_STATUS wma_encrypt_decrypt_msg(WMA_HANDLE wma, */ QDF_STATUS wma_set_cts2self_for_p2p_go(void *wma_handle, uint32_t cts2self_for_p2p_go); +QDF_STATUS wma_set_tx_rx_aggregation_size + (struct sir_set_tx_rx_aggregation_size *tx_rx_aggregation_size); #endif diff --git a/core/wma/inc/wma_if.h b/core/wma/inc/wma_if.h index 31939b60a393..ac553511ed98 100644 --- a/core/wma/inc/wma_if.h +++ b/core/wma/inc/wma_if.h @@ -514,6 +514,8 @@ typedef struct { uint8_t nss_2g; uint8_t nss_5g; uint8_t beacon_tx_rate; + uint32_t tx_aggregation_size; + uint32_t rx_aggregation_size; } tAddBssParams, *tpAddBssParams; /** @@ -1151,6 +1153,8 @@ struct add_sta_self_params { uint8_t nss_2g; uint8_t nss_5g; uint32_t status; + uint32_t tx_aggregation_size; + uint32_t rx_aggregation_size; }; /** diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c index 8813cbed84d2..6a7d2084b79c 100644 --- a/core/wma/src/wma_dev_if.c +++ b/core/wma/src/wma_dev_if.c @@ -1530,6 +1530,7 @@ ol_txrx_vdev_handle wma_vdev_attach(tp_wma_handle wma_handle, cds_msg_t sme_msg = { 0 }; struct vdev_create_params params = { 0 }; u_int8_t vdev_id; + struct sir_set_tx_rx_aggregation_size tx_rx_aggregation_size; if (NULL == mac) { WMA_LOGE("%s: Failed to get mac", __func__); @@ -1609,6 +1610,17 @@ ol_txrx_vdev_handle wma_vdev_attach(tp_wma_handle wma_handle, self_sta_req->self_mac_addr, sizeof(wma_handle->interfaces[self_sta_req->session_id]. addr)); + + tx_rx_aggregation_size.tx_aggregation_size = + self_sta_req->tx_aggregation_size; + tx_rx_aggregation_size.rx_aggregation_size = + self_sta_req->rx_aggregation_size; + tx_rx_aggregation_size.vdev_id = self_sta_req->session_id; + + status = wma_set_tx_rx_aggregation_size(&tx_rx_aggregation_size); + if (status != QDF_STATUS_SUCCESS) + WMA_LOGE("failed to set aggregation sizes(err=%d)", status); + switch (self_sta_req->type) { case WMI_VDEV_TYPE_STA: if (wlan_cfg_get_int(mac, WNI_CFG_INFRA_STA_KEEP_ALIVE_PERIOD, diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c index 567ed6e7abe4..7bd92da1bd99 100644 --- a/core/wma/src/wma_features.c +++ b/core/wma/src/wma_features.c @@ -7919,6 +7919,71 @@ QDF_STATUS wma_set_bpf_instructions(tp_wma_handle wma, } /** + * wma_set_tx_rx_aggregation_size() - sets tx rx aggregation sizes + * @tx_rx_aggregation_size: aggregation size parameters + * + * This function sets tx rx aggregation sizes + * + * Return: VOS_STATUS_SUCCESS on success, error number otherwise + */ +QDF_STATUS wma_set_tx_rx_aggregation_size( + 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; + + 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; + } + + 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->tx_aggr_size = tx_rx_aggregation_size->tx_aggregation_size; + cmd->rx_aggr_size = tx_rx_aggregation_size->rx_aggregation_size; + + WMA_LOGI("tx aggr: %d rx aggr: %d vdev: %d", + 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 * |
