From 5dfa9644c38bd3d74f6fb682559fd66a96c82710 Mon Sep 17 00:00:00 2001 From: Ashok Vuyyuru Date: Wed, 27 Nov 2019 14:38:56 +0530 Subject: [PATCH] msm: ipa3: Fix to hold the clock until replenish the descriptors When CPU load is high IPA buffer replenish WQ scheduling got delayed because of that not able to replenish the descriptors. Add changes to hold the clock until replenish the minimum number of descriptors. Change-Id: Iea79dcaa90d12fc4324522ba2c63dfcdfded2f90 Signed-off-by: Ashok Vuyyuru --- drivers/platform/msm/ipa/ipa_v3/ipa_dp.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c b/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c index 72b2df6a8dbf..54a700eeb4d3 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c @@ -2013,7 +2013,6 @@ static void ipa3_replenish_rx_page_recycle(struct ipa3_sys_context *sys) rx_pkt = sys->repl->cache[curr_wq]; curr_wq = (++curr_wq == sys->repl->capacity) ? 0 : curr_wq; - atomic_set(&sys->repl->head_idx, curr_wq); } dma_sync_single_for_device(ipa3_ctx->pdev, @@ -2051,6 +2050,7 @@ static void ipa3_replenish_rx_page_recycle(struct ipa3_sys_context *sys) if (ret == GSI_STATUS_SUCCESS) { /* ensure write is done before setting head index */ mb(); + atomic_set(&sys->repl->head_idx, curr_wq); atomic_set(&sys->page_recycle_repl->head_idx, curr); sys->len = rx_len_cached; } else { @@ -4970,13 +4970,20 @@ start_poll: /* call repl_hdlr before napi_reschedule / napi_complete */ if (cnt) ep->sys->repl_hdlr(ep->sys); - if (cnt < weight) { + /* When not able to replenish enough descriptors pipe wait + * until minimum number descripotrs to replish. + */ + if (cnt < weight && ep->sys->len > IPA_DEFAULT_SYS_YELLOW_WM) { napi_complete(ep->sys->napi_obj); ret = ipa3_rx_switch_to_intr_mode(ep->sys); if (ret == -GSI_STATUS_PENDING_IRQ && napi_reschedule(ep->sys->napi_obj)) goto start_poll; ipa_pm_deferred_deactivate(ep->sys->pm_hdl); + } else { + cnt = weight; + IPADBG("Client = %d not replenished free descripotrs\n", + ep->client); } return cnt; }