From 411e8fc3e0c7ea0eeaeca16242ba1f208db1e2e1 Mon Sep 17 00:00:00 2001 From: Devender Kumar Date: Tue, 26 Apr 2022 18:43:56 +0530 Subject: [PATCH] qcacmn: Fix for IPA init path After enable and disable of both radio, If second radio is enabled then the instance_id from wlan driver is passed wrongly to IPA driver which is in leading to initializion of first radio on IPA driver side. Fix is to take the instace id based on psoc id and set the prod and cons pipes based on instance_id instead of IPA given handle. Change-Id: I26f4f3fbd23284e79a380d212ad07aceac50f053 CRs-Fixed: 3179306 --- dp/inc/cdp_txrx_ipa.h | 5 +- dp/inc/cdp_txrx_ops.h | 3 +- dp/wifi3.0/dp_ipa.c | 6 +- dp/wifi3.0/dp_ipa.h | 4 +- ipa/core/src/wlan_ipa_core.c | 5 +- ipa/dispatcher/src/wlan_ipa_obj_mgmt_api.c | 107 ++++++++------------- 6 files changed, 55 insertions(+), 75 deletions(-) diff --git a/dp/inc/cdp_txrx_ipa.h b/dp/inc/cdp_txrx_ipa.h index aaaa3808cf..9135db5353 100644 --- a/dp/inc/cdp_txrx_ipa.h +++ b/dp/inc/cdp_txrx_ipa.h @@ -405,6 +405,7 @@ cdp_ipa_disable_autonomy(ol_txrx_soc_handle soc, uint8_t pdev_id) * @sys_in: parameters to setup sys pipe in mcc mode * @over_gsi: Is IPA using GSI * @hdl: IPA handle + * @id: IPA instance id * * Return: QDF_STATUS */ @@ -414,7 +415,7 @@ cdp_ipa_setup(ol_txrx_soc_handle soc, uint8_t pdev_id, void *ipa_i2w_cb, uint32_t ipa_desc_size, void *ipa_priv, bool is_rm_enabled, uint32_t *tx_pipe_handle, uint32_t *rx_pipe_handle, bool is_smmu_enabled, qdf_ipa_sys_connect_params_t *sys_in, - bool over_gsi, qdf_ipa_wdi_hdl_t hdl) + bool over_gsi, qdf_ipa_wdi_hdl_t hdl, qdf_ipa_wdi_hdl_t id) { if (!soc || !soc->ops || !soc->ops->ipa_ops) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, @@ -431,7 +432,7 @@ cdp_ipa_setup(ol_txrx_soc_handle soc, uint8_t pdev_id, void *ipa_i2w_cb, tx_pipe_handle, rx_pipe_handle, is_smmu_enabled, - sys_in, over_gsi, hdl); + sys_in, over_gsi, hdl, id); return QDF_STATUS_SUCCESS; } diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index dd8f272353..36213cf737 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/dp/inc/cdp_txrx_ops.h @@ -1832,7 +1832,8 @@ struct cdp_ipa_ops { bool is_rm_enabled, uint32_t *tx_pipe_handle, uint32_t *rx_pipe_handle, bool is_smmu_enabled, qdf_ipa_sys_connect_params_t *sys_in, - bool over_gsi, qdf_ipa_wdi_hdl_t hdl); + bool over_gsi, qdf_ipa_wdi_hdl_t hdl, + qdf_ipa_wdi_hdl_t id); #else /* CONFIG_IPA_WDI_UNIFIED_API */ QDF_STATUS (*ipa_setup)(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, void *ipa_i2w_cb, void *ipa_w2i_cb, diff --git a/dp/wifi3.0/dp_ipa.c b/dp/wifi3.0/dp_ipa.c index bc74ac38d6..15efb830b4 100644 --- a/dp/wifi3.0/dp_ipa.c +++ b/dp/wifi3.0/dp_ipa.c @@ -2121,7 +2121,7 @@ QDF_STATUS dp_ipa_setup(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, bool is_rm_enabled, uint32_t *tx_pipe_handle, uint32_t *rx_pipe_handle, bool is_smmu_enabled, qdf_ipa_sys_connect_params_t *sys_in, bool over_gsi, - qdf_ipa_wdi_hdl_t hdl) + qdf_ipa_wdi_hdl_t hdl, qdf_ipa_wdi_hdl_t id) { struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl); struct dp_pdev *pdev = @@ -2183,7 +2183,7 @@ QDF_STATUS dp_ipa_setup(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, * Event Ring Doorbell PA: TCL Head Pointer Address */ if (is_smmu_enabled) - dp_ipa_wdi_tx_smmu_params(soc, ipa_res, tx_smmu, over_gsi, hdl); + dp_ipa_wdi_tx_smmu_params(soc, ipa_res, tx_smmu, over_gsi, id); else dp_ipa_wdi_tx_params(soc, ipa_res, tx, over_gsi); @@ -2215,7 +2215,7 @@ QDF_STATUS dp_ipa_setup(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, * Event Ring Doorbell PA: FW Head Pointer Address */ if (is_smmu_enabled) - dp_ipa_wdi_rx_smmu_params(soc, ipa_res, rx_smmu, over_gsi, hdl); + dp_ipa_wdi_rx_smmu_params(soc, ipa_res, rx_smmu, over_gsi, id); else dp_ipa_wdi_rx_params(soc, ipa_res, rx, over_gsi); diff --git a/dp/wifi3.0/dp_ipa.h b/dp/wifi3.0/dp_ipa.h index b56847e957..7245128444 100644 --- a/dp/wifi3.0/dp_ipa.h +++ b/dp/wifi3.0/dp_ipa.h @@ -204,6 +204,7 @@ QDF_STATUS dp_ipa_disable_autonomy(struct cdp_soc_t *soc_hdl, uint8_t pdev_id); * @is_smmu_enabled: Is SMMU enabled or not * @sys_in: parameters to setup sys pipe in mcc mode * @hdl: IPA handle + * @id: IPA instance id * * Return: QDF_STATUS */ @@ -215,7 +216,8 @@ QDF_STATUS dp_ipa_setup(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, uint32_t *rx_pipe_handle, bool is_smmu_enabled, qdf_ipa_sys_connect_params_t *sys_in, bool over_gsi, - qdf_ipa_wdi_hdl_t hdl); + qdf_ipa_wdi_hdl_t hdl, + qdf_ipa_wdi_hdl_t id); #else /* CONFIG_IPA_WDI_UNIFIED_API */ /** * dp_ipa_setup() - Setup and connect IPA pipes diff --git a/ipa/core/src/wlan_ipa_core.c b/ipa/core/src/wlan_ipa_core.c index ba4ef16cf4..e187459d9c 100644 --- a/ipa/core/src/wlan_ipa_core.c +++ b/ipa/core/src/wlan_ipa_core.c @@ -544,7 +544,9 @@ wlan_ipa_wdi_setup(struct wlan_ipa_priv *ipa_ctx, &ipa_ctx->tx_pipe_handle, &ipa_ctx->rx_pipe_handle, wlan_ipa_wdi_is_smmu_enabled(ipa_ctx, osdev), - sys_in, ipa_ctx->over_gsi, ipa_ctx->hdl); + sys_in, ipa_ctx->over_gsi, + ipa_ctx->hdl, + (qdf_ipa_wdi_hdl_t)ipa_ctx->instance_id); qdf_mem_free(sys_in); @@ -3837,7 +3839,6 @@ QDF_STATUS wlan_ipa_cleanup(struct wlan_ipa_priv *ipa_ctx) if (!ipa_cb_is_ready()) return QDF_STATUS_SUCCESS; - qdf_event_destroy(&ipa_ctx->ipa_resource_comp); if (!wlan_ipa_uc_is_enabled(ipa_ctx->config)) wlan_ipa_teardown_sys_pipe(ipa_ctx); diff --git a/ipa/dispatcher/src/wlan_ipa_obj_mgmt_api.c b/ipa/dispatcher/src/wlan_ipa_obj_mgmt_api.c index 5655625fd8..e5f1804697 100644 --- a/ipa/dispatcher/src/wlan_ipa_obj_mgmt_api.c +++ b/ipa/dispatcher/src/wlan_ipa_obj_mgmt_api.c @@ -147,11 +147,7 @@ static void ipa_register_ready_cb(void *user_data) struct wlan_objmgr_psoc *psoc; qdf_device_t qdf_dev; qdf_ipa_wdi_capabilities_out_params_t out_param; - uint8_t obj_id; uint8_t pdev_id; - uint8_t pdev_count; - uint8_t instances_supported = 0; - uint8_t instances_processed = 0; if (!ipa_config_is_enabled()) { ipa_info("IPA config is disabled"); @@ -185,71 +181,50 @@ static void ipa_register_ready_cb(void *user_data) /* Make call to get num_instances supported by IPA */ qdf_ipa_wdi_get_capabilities(&out_param); - instances_supported = - QDF_IPA_WDI_CAPABILITIES_OUT_PARAMS_NUM_INSTANCES(&out_param); - ipa_info("Max instances supported by IPA is %d", instances_supported); - for (obj_id = 0; obj_id < WLAN_OBJMGR_MAX_DEVICES; obj_id++) { - /* Get Psoc from global umac obj */ - psoc = g_umac_glb_obj->psoc[obj_id]; - if (!psoc) - continue; + ipa_obj = (struct wlan_ipa_priv *)user_data; - pdev_count = psoc->soc_objmgr.wlan_pdev_count; - for (pdev_id = 0; pdev_id < pdev_count && - instances_processed < instances_supported && - instances_processed < g_instances_added; - pdev_id++, instances_processed++) { - pdev = wlan_objmgr_get_pdev_by_id(psoc, pdev_id, - WLAN_IPA_ID); - - if (!pdev) { - qdf_err("Pdev is NULL for pdev_id[%d]", pdev_id); - continue; - } - - /* Get IPA obj from pdev obj */ - ipa_obj = ipa_pdev_get_priv_obj(pdev); - - if (!ipa_obj) { - ipa_err("ipa_obj is NULL for pdev_id[%d]", - pdev_id); - wlan_objmgr_pdev_release_ref(pdev, WLAN_IPA_ID); - continue; - } - - if (ipa_obj->handle_initialized) { - ipa_info("ipa_obj hdl is true for pdev_id %d", pdev_id); - wlan_objmgr_pdev_release_ref(pdev, WLAN_IPA_ID); - continue; - } - /* Update instace_id for current pdev */ - ipa_obj->instance_id = instances_processed; - qdf_dev = wlan_psoc_get_qdf_dev(psoc); - if (!qdf_dev) { - ipa_err("QDF device context is NULL"); - wlan_objmgr_pdev_release_ref(pdev, WLAN_IPA_ID); - continue; - } - - status = ipa_obj_setup(ipa_obj); - if (QDF_IS_STATUS_ERROR(status)) { - ipa_err("Failed to setup ipa component"); - wlan_objmgr_pdev_component_obj_detach(pdev, WLAN_UMAC_COMP_IPA, - ipa_obj); - qdf_mem_free(ipa_obj); - wlan_objmgr_pdev_release_ref(pdev, WLAN_IPA_ID); - continue; - } - if (ucfg_ipa_uc_ol_init(pdev, qdf_dev)) { - ipa_err("IPA ucfg_ipa_uc_ol_init failed"); - wlan_objmgr_pdev_release_ref(pdev, WLAN_IPA_ID); - continue; - } - ipa_obj->handle_initialized = true; - wlan_objmgr_pdev_release_ref(pdev, WLAN_IPA_ID); - } + pdev = ipa_priv_obj_get_pdev(ipa_obj); + if (!pdev) { + qdf_err("Pdev is NULL for"); + goto out; } + + pdev_id = pdev->pdev_objmgr.wlan_pdev_id; + psoc = wlan_pdev_get_psoc(pdev); + if (!psoc) { + qdf_err("Psoc is NULL for pdev_id %d", pdev_id); + goto out; + } + + if (ipa_obj->handle_initialized) { + ipa_info("ipa_obj hdl is true for pdev_id %d", pdev_id); + goto out; + } + + /* Update instace_id for current pdev */ + ipa_obj->instance_id = psoc->soc_objmgr.psoc_id; + + qdf_dev = wlan_psoc_get_qdf_dev(psoc); + if (!qdf_dev) { + ipa_err("QDF device context is NULL"); + goto out; + } + + status = ipa_obj_setup(ipa_obj); + if (QDF_IS_STATUS_ERROR(status)) { + ipa_err("Failed to setup ipa component"); + wlan_objmgr_pdev_component_obj_detach(pdev, WLAN_UMAC_COMP_IPA, + ipa_obj); + qdf_mem_free(ipa_obj); + goto out; + } + if (ucfg_ipa_uc_ol_init(pdev, qdf_dev)) { + ipa_err("IPA ucfg_ipa_uc_ol_init failed"); + goto out; + } + + ipa_obj->handle_initialized = true; out: ipa_init_deinit_unlock(); }