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

Commit 6e7f7276 authored by Sriharsha Allenki's avatar Sriharsha Allenki
Browse files

usb: gadget: gsi: Ensure the doorbell is blocked before suspend



The doorbell is blocked as part of gsi_suspend, but a continuous
resume and suspend calls can cause a race where resume
handling overwrites the blocking of doorbell leading
to the controller accessing IPA doorbell after suspend.
Here are the series of events that is causing the issue.

gsi_resume
	queue_work with EVT_RESUME

gsi_suspend
	Block the doorbell
	queue_work with EVT_SUSPEND

resume_work_handler
	xdci_resume
	Unblock the doorbell

suspend_work_handler
	xdci_suspend

Fix this by ensuring that the doorbell is blocked
before suspend call to IPA as part of suspend handling.

Change-Id: I4d0254c88ed3bec6338d040480b5df2e3f81251e
Signed-off-by: default avatarSriharsha Allenki <sallenki@codeaurora.org>
parent c5535bac
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -785,6 +785,13 @@ static int ipa_suspend_work_handler(struct gsi_data_port *d_port)
		goto done;
	}

	/*
	 * Ensure that the DBL is blocked before suspend.
	 */
	block_db = true;
	usb_gsi_ep_op(gsi->d_port.in_ep, (void *)&block_db,
					GSI_EP_OP_SET_CLR_BLOCK_DBL);

	log_event_dbg("%s: Calling xdci_suspend", __func__);
	ret = ipa_usb_xdci_suspend(gsi->d_port.out_channel_handle,
				gsi->d_port.in_channel_handle, gsi->prot_id,