diff --git a/core/dp/txrx/ol_txrx_ipa.c b/core/dp/txrx/ol_txrx_ipa.c index a5e2bc650c..3feea3446d 100644 --- a/core/dp/txrx/ol_txrx_ipa.c +++ b/core/dp/txrx/ol_txrx_ipa.c @@ -584,7 +584,7 @@ QDF_STATUS ol_txrx_ipa_setup(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, qdf_ipa_wdi_pipe_setup_info_t *rx; qdf_ipa_wdi_pipe_setup_info_smmu_t *tx_smmu; qdf_ipa_wdi_pipe_setup_info_smmu_t *rx_smmu; - qdf_ipa_wdi_conn_in_params_t pipe_in; + qdf_ipa_wdi_conn_in_params_t *pipe_in = NULL; qdf_ipa_wdi_conn_out_params_t pipe_out; qdf_device_t osdev = cds_get_context(QDF_MODULE_ID_QDF_DEVICE); uint32_t tx_comp_db_dmaaddr = 0, rx_rdy_db_dmaaddr = 0; @@ -601,20 +601,26 @@ QDF_STATUS ol_txrx_ipa_setup(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, return QDF_STATUS_E_NOENT; } + pipe_in = qdf_mem_malloc(sizeof(*pipe_in)); + if (!pipe_in) { + ol_txrx_err("pipe_in allocation failed"); + return QDF_STATUS_E_NOMEM; + } + ipa_res = &pdev->ipa_resource; - qdf_mem_zero(&pipe_in, sizeof(pipe_in)); + qdf_mem_zero(pipe_in, sizeof(*pipe_in)); qdf_mem_zero(&pipe_out, sizeof(pipe_out)); - ol_txrx_setup_mcc_sys_pipes(sys_in, &pipe_in); + ol_txrx_setup_mcc_sys_pipes(sys_in, pipe_in); /* TX PIPE */ if (is_smmu_enabled) { - QDF_IPA_WDI_CONN_IN_PARAMS_SMMU_ENABLED(&pipe_in) = true; - tx_smmu = &QDF_IPA_WDI_CONN_IN_PARAMS_TX_SMMU(&pipe_in); + QDF_IPA_WDI_CONN_IN_PARAMS_SMMU_ENABLED(pipe_in) = true; + tx_smmu = &QDF_IPA_WDI_CONN_IN_PARAMS_TX_SMMU(pipe_in); tx_cfg = &QDF_IPA_WDI_SETUP_INFO_SMMU_EP_CFG(tx_smmu); } else { - QDF_IPA_WDI_CONN_IN_PARAMS_SMMU_ENABLED(&pipe_in) = false; - tx = &QDF_IPA_WDI_CONN_IN_PARAMS_TX(&pipe_in); + QDF_IPA_WDI_CONN_IN_PARAMS_SMMU_ENABLED(pipe_in) = false; + tx = &QDF_IPA_WDI_CONN_IN_PARAMS_TX(pipe_in); tx_cfg = &QDF_IPA_WDI_SETUP_INFO_EP_CFG(tx); } @@ -635,10 +641,10 @@ QDF_STATUS ol_txrx_ipa_setup(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, /* RX PIPE */ if (is_smmu_enabled) { - rx_smmu = &QDF_IPA_WDI_CONN_IN_PARAMS_RX_SMMU(&pipe_in); + rx_smmu = &QDF_IPA_WDI_CONN_IN_PARAMS_RX_SMMU(pipe_in); rx_cfg = &QDF_IPA_WDI_SETUP_INFO_EP_CFG(rx_smmu); } else { - rx = &QDF_IPA_WDI_CONN_IN_PARAMS_RX(&pipe_in); + rx = &QDF_IPA_WDI_CONN_IN_PARAMS_RX(pipe_in); rx_cfg = &QDF_IPA_WDI_SETUP_INFO_EP_CFG(rx); } @@ -658,15 +664,16 @@ QDF_STATUS ol_txrx_ipa_setup(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, else ol_txrx_ipa_wdi_rx_params(ipa_res, rx, over_gsi); - QDF_IPA_WDI_CONN_IN_PARAMS_NOTIFY(&pipe_in) = ipa_w2i_cb; - QDF_IPA_WDI_CONN_IN_PARAMS_PRIV(&pipe_in) = ipa_priv; + QDF_IPA_WDI_CONN_IN_PARAMS_NOTIFY(pipe_in) = ipa_w2i_cb; + QDF_IPA_WDI_CONN_IN_PARAMS_PRIV(pipe_in) = ipa_priv; /* Connect WDI IPA PIPE */ - ret = qdf_ipa_wdi_conn_pipes(&pipe_in, &pipe_out); + ret = qdf_ipa_wdi_conn_pipes(pipe_in, &pipe_out); if (ret) { QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, "%s: ipa_wdi_conn_pipes: IPA pipe setup failed: ret=%d", __func__, ret); + qdf_mem_free(pipe_in); return QDF_STATUS_E_FAILURE; } @@ -693,6 +700,7 @@ QDF_STATUS ol_txrx_ipa_setup(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, ipa_res->rx_ready_doorbell_dmaaddr = rx_rdy_db_dmaaddr; } + qdf_mem_free(pipe_in); return QDF_STATUS_SUCCESS; }