qcacld-3.0: Propagate config parameters to datapath

Provide an interface to propagate the feature
specific config parameters to Lithium datapath.

Change-Id: Iec6f2205a87a02806933abf7538a95bddd82d5a0
CRs-Fixed: 2097229
This commit is contained in:
Venkata Sharath Chandra Manchala 2017-07-10 11:59:19 -07:00 • committed by snandini
commit 4aaae0f586
4 changed files with 137 additions and 33 deletions

View file

@ -323,6 +323,17 @@ QDF_STATUS cds_pre_enable(void);
QDF_STATUS cds_open(struct wlan_objmgr_psoc *psoc);
/**
* cds_dp_open() - Open datapath module
* @psoc - object manager soc handle
*
* API to map the datapath rings to interrupts
* and also open the datapath pdev module.
*
* Return: QDF status
*/
QDF_STATUS cds_dp_open(struct wlan_objmgr_psoc *psoc);
QDF_STATUS cds_enable(struct wlan_objmgr_psoc *psoc);
QDF_STATUS cds_disable(struct wlan_objmgr_psoc *psoc);
@ -331,6 +342,17 @@ QDF_STATUS cds_post_disable(void);
QDF_STATUS cds_close(struct wlan_objmgr_psoc *psoc);
/**
* cds_dp_close() - Close datapath module
* @psoc: Object manager soc handle
*
* API used to detach interrupts assigned to service
* datapath rings and close pdev module
*
* Return: Status
*/
QDF_STATUS cds_dp_close(struct wlan_objmgr_psoc *psoc);
void *cds_get_context(QDF_MODULE_ID moduleId);
uint8_t cds_get_datapath_handles(void **soc, struct cdp_pdev **pdev,

View file

@ -587,9 +587,6 @@ QDF_STATUS cds_open(struct wlan_objmgr_psoc *psoc)
if (!gp_cds_context->dp_soc)
goto err_wma_close;
if (cdp_txrx_intr_attach(gp_cds_context->dp_soc) != QDF_STATUS_SUCCESS)
goto err_wma_close;
pmo_ucfg_psoc_update_dp_handle(psoc, gp_cds_context->dp_soc);
if (gp_cds_context->dp_soc == NULL)
@ -621,29 +618,11 @@ QDF_STATUS cds_open(struct wlan_objmgr_psoc *psoc)
QDF_ASSERT(0);
goto err_mac_close;
}
cds_set_context(QDF_MODULE_ID_TXRX,
cdp_pdev_attach(cds_get_context(QDF_MODULE_ID_SOC),
gp_cds_context->cfg_ctx,
gp_cds_context->htc_ctx,
gp_cds_context->qdf_ctx, 0));
if (!gp_cds_context->pdev_txrx_ctx) {
/* Critical Error ... Cannot proceed further */
QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_FATAL,
"%s: Failed to open TXRX", __func__);
QDF_ASSERT(0);
goto err_sme_close;
}
pmo_ucfg_psoc_set_txrx_handle(psoc, gp_cds_context->pdev_txrx_ctx);
QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_INFO_HIGH,
"%s: CDS successfully Opened", __func__);
cds_register_all_modules();
return dispatcher_psoc_open(psoc);
err_sme_close:
sme_close(gp_cds_context->pMACContext);
err_mac_close:
mac_close(gp_cds_context->pMACContext);
@ -685,6 +664,41 @@ err_probe_event:
return qdf_status;
} /* cds_open() */
QDF_STATUS cds_dp_open(struct wlan_objmgr_psoc *psoc)
{
if (cdp_txrx_intr_attach(gp_cds_context->dp_soc)
!= QDF_STATUS_SUCCESS) {
QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_FATAL,
"%s: Failed to attach interrupts", __func__);
goto close;
}
cds_set_context(QDF_MODULE_ID_TXRX,
cdp_pdev_attach(cds_get_context(QDF_MODULE_ID_SOC),
gp_cds_context->cfg_ctx,
gp_cds_context->htc_ctx,
gp_cds_context->qdf_ctx, 0));
if (!gp_cds_context->pdev_txrx_ctx) {
/* Critical Error ... Cannot proceed further */
QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_FATAL,
"%s: Failed to open TXRX", __func__);
QDF_ASSERT(0);
goto intr_close;
}
pmo_ucfg_psoc_set_txrx_handle(psoc, gp_cds_context->pdev_txrx_ctx);
QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_INFO_HIGH,
"%s: CDS successfully Opened", __func__);
return 0;
intr_close:
cdp_txrx_intr_detach(gp_cds_context->dp_soc);
close:
return QDF_STATUS_E_FAILURE;
}
/**
* cds_pre_enable() - pre enable cds
*
@ -1074,7 +1088,6 @@ QDF_STATUS cds_post_disable(void)
QDF_STATUS cds_close(struct wlan_objmgr_psoc *psoc)
{
QDF_STATUS qdf_status;
void *ctx;
dispatcher_psoc_close(psoc);
@ -1085,19 +1098,12 @@ QDF_STATUS cds_close(struct wlan_objmgr_psoc *psoc)
QDF_ASSERT(0);
}
cdp_txrx_intr_detach(gp_cds_context->dp_soc);
if (gp_cds_context->htc_ctx) {
htc_destroy(gp_cds_context->htc_ctx);
pmo_ucfg_psoc_update_htc_handle(psoc, NULL);
gp_cds_context->htc_ctx = NULL;
}
ctx = cds_get_context(QDF_MODULE_ID_TXRX);
cds_set_context(QDF_MODULE_ID_TXRX, NULL);
pmo_ucfg_psoc_set_txrx_handle(psoc, NULL);
cdp_pdev_detach(cds_get_context(QDF_MODULE_ID_SOC),
(struct cdp_pdev *)ctx, 1);
qdf_status = sme_close(gp_cds_context->pMACContext);
if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR,
@ -1160,6 +1166,21 @@ QDF_STATUS cds_close(struct wlan_objmgr_psoc *psoc)
return QDF_STATUS_SUCCESS;
}
QDF_STATUS cds_dp_close(struct wlan_objmgr_psoc *psoc)
{
void *ctx;
cdp_txrx_intr_detach(gp_cds_context->dp_soc);
ctx = cds_get_context(QDF_MODULE_ID_TXRX);
cds_set_context(QDF_MODULE_ID_TXRX, NULL);
pmo_ucfg_psoc_set_txrx_handle(psoc, NULL);
cdp_pdev_detach(cds_get_context(QDF_MODULE_ID_SOC),
(struct cdp_pdev *)ctx, 1);
return QDF_STATUS_SUCCESS;
}
/**
* cds_get_context() - get context data area
*

View file

@ -6550,6 +6550,8 @@ void hdd_cfg_print(struct hdd_context *hdd_ctx)
hdd_ctx->config->max_msdus_per_rxinorderind);
hdd_debug("Name = [active_mode_offload] value = [%d]",
hdd_ctx->config->active_mode_offload);
hdd_debug("Name = [gEnableNAPI] value = [%d]",
hdd_ctx->napi_enable);
hdd_debug("Name = [gfine_time_meas_cap] value = [%u]",
hdd_ctx->config->fine_time_meas_cap);
#ifdef WLAN_FEATURE_FASTPATH

View file

@ -124,6 +124,7 @@
#include "wlan_hdd_rx_monitor.h"
#include "sme_power_save_api.h"
#include "enet.h"
#include <cdp_txrx_cmn_struct.h>
#ifdef CNSS_GENL
#include <net/cnss_nl.h>
@ -2365,7 +2366,7 @@ int hdd_wlan_start_modules(struct hdd_context *hdd_ctx,
ret = hdd_update_config(hdd_ctx);
if (ret) {
hdd_err("Failed to update configuration :%d", ret);
goto ol_cds_free;
goto cds_free;
}
hdd_update_cds_ac_specs_params(hdd_ctx);
@ -2374,7 +2375,7 @@ int hdd_wlan_start_modules(struct hdd_context *hdd_ctx,
if (!QDF_IS_STATUS_SUCCESS(status)) {
hdd_err("Failed to Open CDS: %d", status);
ret = (status == QDF_STATUS_E_NOMEM) ? -ENOMEM : -EINVAL;
goto ol_cds_free;
goto cds_free;
}
/* initalize components configurations after psoc open */
@ -2384,6 +2385,11 @@ int hdd_wlan_start_modules(struct hdd_context *hdd_ctx,
ret);
goto close;
}
status = cds_dp_open(hdd_ctx->hdd_psoc);
if (!QDF_IS_STATUS_SUCCESS(status)) {
hdd_err("Failed to Open cds post open: %d", status);
goto close;
}
/*
* NAN compoenet requires certian operations like, open adapter,
@ -2398,7 +2404,7 @@ int hdd_wlan_start_modules(struct hdd_context *hdd_ctx,
if (!QDF_IS_STATUS_SUCCESS(status)) {
hdd_err("Failed to pre-enable CDS: %d", status);
ret = (status == QDF_STATUS_E_NOMEM) ? -ENOMEM : -EINVAL;
goto close;
goto cds_txrx_free;
}
hdd_register_policy_manager_callback(
@ -2458,11 +2464,13 @@ int hdd_wlan_start_modules(struct hdd_context *hdd_ctx,
post_disable:
cds_post_disable();
cds_txrx_free:
cds_dp_close(hdd_ctx->hdd_psoc);
close:
hdd_ctx->driver_status = DRIVER_MODULES_CLOSED;
cds_close(hdd_ctx->hdd_psoc);
ol_cds_free:
cds_free:
ol_cds_free();
hif_close:
@ -9561,6 +9569,14 @@ int hdd_wlan_stop_modules(struct hdd_context *hdd_ctx, bool ftm_mode)
ret = -EINVAL;
QDF_ASSERT(0);
}
qdf_status = cds_dp_close(hdd_ctx->hdd_psoc);
if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
hdd_warn("Failed to stop CDS DP: %d", qdf_status);
ret = -EINVAL;
QDF_ASSERT(0);
}
qdf_status = cds_close(hdd_ctx->hdd_psoc);
if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
hdd_warn("Failed to stop CDS: %d", qdf_status);
@ -11881,6 +11897,43 @@ static void hdd_update_hif_config(struct hdd_context *hdd_ctx)
hif_vote_link_up(scn);
}
/**
* hdd_update_dp_config() - Propagate config parameters to Lithium
* datapath
* @hdd_ctx: HDD Context
*
* Return: 0 for success/errno for failure
*/
static int hdd_update_dp_config(struct hdd_context *hdd_ctx)
{
struct cdp_config_params params;
QDF_STATUS status;
params.tso_enable = hdd_ctx->config->tso_enable;
params.lro_enable = hdd_ctx->config->lro_enable;
#ifdef QCA_LL_TX_FLOW_CONTROL_V2
params.tx_flow_stop_queue_threshold =
hdd_ctx->config->TxFlowStopQueueThreshold;
params.tx_flow_start_queue_offset =
hdd_ctx->config->TxFlowStartQueueOffset;
#endif
params.flow_steering_enable = hdd_ctx->config->flow_steering_enable;
params.napi_enable = hdd_ctx->napi_enable;
params.tcp_udp_checksumoffload =
hdd_ctx->config->enable_ip_tcp_udp_checksum_offload;
status = cdp_update_config_parameters(
cds_get_context(QDF_MODULE_ID_SOC),
&params);
if (status) {
QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_ERROR,
"%s: Failed to attach config parameters", __func__);
return status;
}
return 0;
}
/**
* hdd_update_config() - Initialize driver per module ini parameters
* @hdd_ctx: HDD Context
@ -12151,10 +12204,16 @@ int hdd_update_components_config(struct hdd_context *hdd_ctx)
ret = hdd_update_pmo_config(hdd_ctx);
if (ret)
return ret;
ret = hdd_update_scan_config(hdd_ctx);
if (ret)
return ret;
ret = hdd_update_tdls_config(hdd_ctx);
if (ret)
return ret;
ret = hdd_update_dp_config(hdd_ctx);
return ret;
}