Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0a056f4c authored by Ashok Vuyyuru's avatar Ashok Vuyyuru
Browse files

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: default avatarAshok Vuyyuru <avuyyuru@codeaurora.org>
parent 0defd832
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -2019,7 +2019,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,
@@ -2057,6 +2056,7 @@ static void ipa3_replenish_rx_page_recycle(struct ipa3_sys_context *sys)
	if (likely(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 {
@@ -4976,13 +4976,20 @@ int ipa3_rx_poll(u32 clnt_hdl, int weight)
	/* 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;
}