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
This commit is contained in:
Devender Kumar
2022-04-26 18:43:56 +05:30
committed by Madan Koyyalamudi
parent b6a3e8642c
commit 411e8fc3e0
6 changed files with 55 additions and 75 deletions

View File

@@ -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;
}

View File

@@ -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,

View File

@@ -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);

View File

@@ -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

View File

@@ -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);

View File

@@ -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,51 +181,34 @@ 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;
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);
ipa_obj = (struct wlan_ipa_priv *)user_data;
pdev = ipa_priv_obj_get_pdev(ipa_obj);
if (!pdev) {
qdf_err("Pdev is NULL for pdev_id[%d]", pdev_id);
continue;
qdf_err("Pdev is NULL for");
goto out;
}
/* 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;
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);
wlan_objmgr_pdev_release_ref(pdev, WLAN_IPA_ID);
continue;
goto out;
}
/* Update instace_id for current pdev */
ipa_obj->instance_id = instances_processed;
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");
wlan_objmgr_pdev_release_ref(pdev, WLAN_IPA_ID);
continue;
goto out;
}
status = ipa_obj_setup(ipa_obj);
@@ -238,18 +217,14 @@ static void ipa_register_ready_cb(void *user_data)
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;
goto out;
}
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;
goto out;
}
ipa_obj->handle_initialized = true;
wlan_objmgr_pdev_release_ref(pdev, WLAN_IPA_ID);
}
}
out:
ipa_init_deinit_unlock();
}