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: Sriharsha Allenki <sallenki@codeaurora.org>
Signed-off-by: UtsavBalar1231 <utsavbalar1231@gmail.com>
Signed-off-by: Forenche <prahul2003@gmail.com>
Signed-off-by: azrim <mirzaspc@gmail.com>
This commit is contained in:
Sriharsha Allenki 2020-12-23 15:38:03 +05:30 committed by azrim
parent 940cd6e121
commit e112c0491c
No known key found for this signature in database
GPG Key ID: 497F8FB059B45D1C

View File

@ -875,6 +875,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,