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