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

Commit b806e9b3 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: ipa3: fix channel stop retry logic"

parents 16401bf5 59d6b20d
Loading
Loading
Loading
Loading
+12 −1
Original line number Diff line number Diff line
@@ -1373,6 +1373,7 @@ int ipa3_teardown_sys_pipe(u32 clnt_hdl)
	struct ipa3_ep_context *ep;
	int empty;
	int result;
	int i;

	if (clnt_hdl >= ipa3_ctx->ipa_num_pipes ||
	    ipa3_ctx->ep[clnt_hdl].valid == 0) {
@@ -1403,7 +1404,17 @@ int ipa3_teardown_sys_pipe(u32 clnt_hdl)
		cancel_delayed_work_sync(&ep->sys->replenish_rx_work);
	flush_workqueue(ep->sys->wq);
	if (ipa3_ctx->transport_prototype == IPA_TRANSPORT_TYPE_GSI) {
		/* channel stop might fail on timeout if IPA is busy */
		for (i = 0; i < IPA_GSI_CHANNEL_STOP_MAX_RETRY; i++) {
			result = ipa3_stop_gsi_channel(clnt_hdl);
			if (result == GSI_STATUS_SUCCESS)
				break;

			if (result != -GSI_STATUS_AGAIN &&
			    result != -GSI_STATUS_TIMED_OUT)
				break;
		}

		if (result != GSI_STATUS_SUCCESS) {
			IPAERR("GSI stop chan err: %d.\n", result);
			BUG();
+19 −10
Original line number Diff line number Diff line
@@ -6122,14 +6122,24 @@ int ipa3_stop_gsi_channel(u32 clnt_hdl)

	memset(&mem, 0, sizeof(mem));

	if (IPA_CLIENT_IS_PROD(ep->client)) {
		IPADBG("Calling gsi_stop_channel ch:%lu\n",
			ep->gsi_chan_hdl);
		res = gsi_stop_channel(ep->gsi_chan_hdl);
		IPADBG("gsi_stop_channel ch: %lu returned %d\n",
			ep->gsi_chan_hdl, res);
		goto end_sequence;
	}

	for (i = 0; i < IPA_GSI_CHANNEL_STOP_MAX_RETRY; i++) {
		IPADBG("Calling gsi_stop_channel\n");
		IPADBG("Calling gsi_stop_channel ch:%lu\n",
			ep->gsi_chan_hdl);
		res = gsi_stop_channel(ep->gsi_chan_hdl);
		IPADBG("gsi_stop_channel returned %d\n", res);
		IPADBG("gsi_stop_channel ch: %lu returned %d\n",
			ep->gsi_chan_hdl, res);
		if (res != -GSI_STATUS_AGAIN && res != -GSI_STATUS_TIMED_OUT)
			goto end_sequence;

		if (IPA_CLIENT_IS_CONS(ep->client)) {
		IPADBG("Inject a DMA_TASK with 1B packet to IPA\n");
		/* Send a 1B packet DMA_TASK to IPA and try again */
		res = ipa3_inject_dma_task_for_gsi();
@@ -6137,7 +6147,6 @@ int ipa3_stop_gsi_channel(u32 clnt_hdl)
			IPAERR("Failed to inject DMA TASk for GSI\n");
			goto end_sequence;
		}
		}

		/* sleep for short period to flush IPA */
		usleep_range(IPA_GSI_CHANNEL_STOP_SLEEP_MIN_USEC,