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(); }