diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c b/drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c index 582779dd99..6734987d33 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c @@ -1560,7 +1560,8 @@ static ssize_t ipa3_read_stats(struct file *file, char __user *ubuf, "num_buff_above_thresh_for_def_pipe_notified=%u\n" "num_buff_below_thresh_for_def_pipe_notified=%u\n" "num_buff_above_thresh_for_coal_pipe_notified=%u\n" - "num_buff_below_thresh_for_coal_pipe_notified=%u\n", + "num_buff_below_thresh_for_coal_pipe_notified=%u\n" + "pipe_setup_fail_cnt=%u\n", ipa3_ctx->stats.tx_sw_pkts, ipa3_ctx->stats.tx_hw_pkts, ipa3_ctx->stats.tx_non_linear, @@ -1586,7 +1587,9 @@ static ssize_t ipa3_read_stats(struct file *file, char __user *ubuf, atomic_read(&ipa3_ctx->stats.num_buff_above_thresh_for_def_pipe_notified), atomic_read(&ipa3_ctx->stats.num_buff_below_thresh_for_def_pipe_notified), atomic_read(&ipa3_ctx->stats.num_buff_above_thresh_for_coal_pipe_notified), - atomic_read(&ipa3_ctx->stats.num_buff_below_thresh_for_coal_pipe_notified)); + atomic_read(&ipa3_ctx->stats.num_buff_below_thresh_for_coal_pipe_notified), + ipa3_ctx->stats.pipe_setup_fail_cnt + ); cnt += nbytes; for (i = 0; i < IPAHAL_PKT_STATUS_EXCEPTION_MAX; i++) { diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c b/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c index 3de0c2f7dd..00ae2c522e 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c @@ -1589,6 +1589,9 @@ int ipa3_setup_sys_pipe(struct ipa_sys_connect_params *sys_in, u32 *clnt_hdl) fail_gen3: ipa3_disable_data_path(ipa_ep_idx); fail_repl: + if (IPA_CLIENT_IS_CONS(ep->client) && !ep->sys->common_buff_pool) + ipa3_cleanup_rx(ep->sys); + ep->sys->repl_hdlr = ipa3_replenish_rx_cache; if (ep->sys->repl && !ep->sys->common_buff_pool) { kfree(ep->sys->repl); @@ -1620,6 +1623,7 @@ fail_wq: fail_and_disable_clocks: IPA_ACTIVE_CLIENTS_DEC_EP(sys_in->client); fail_gen: + IPA_STATS_INC_CNT(ipa3_ctx->stats.pipe_setup_fail_cnt); return result; } diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h index 197d3fdcdf..676095c813 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h @@ -1550,6 +1550,7 @@ struct ipa3_stats { u32 tx_non_linear; u32 rx_page_drop_cnt; u64 lower_order; + u32 pipe_setup_fail_cnt; struct ipa3_page_recycle_stats page_recycle_stats[3]; u64 page_recycle_cnt[3][IPA_PAGE_POLL_THRESHOLD_MAX]; atomic_t num_buff_above_thresh_for_def_pipe_notified; diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c b/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c index 51b69195d2..38a56aed4c 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c @@ -9821,6 +9821,10 @@ retry_alloc: WARN_ON(1); if (atomic_dec_return(&comp->cnt) == 0) kfree(comp); + if (cmd.base) { + dma_free_coherent(ipa3_ctx->pdev, cmd.size, + cmd.base, cmd.phys_base); + } return -ETIME; } @@ -9828,6 +9832,11 @@ retry_alloc: if (atomic_dec_return(&comp->cnt) == 0) kfree(comp); + if (cmd.base) { + dma_free_coherent(ipa3_ctx->pdev, cmd.size, + cmd.base, cmd.phys_base); + } + /* * sleep for short period to ensure IPA wrote all packets to * the transport @@ -9855,7 +9864,7 @@ fail_free_desc: tag_desc[i].callback(tag_desc[i].user1, tag_desc[i].user2); if (cmd.base) { - dma_free_coherent(ipa3_ctx->uc_pdev, cmd.size, + dma_free_coherent(ipa3_ctx->pdev, cmd.size, cmd.base, cmd.phys_base); } fail_free_tag_desc: