diff mbox series

[v3,1/2] usb: dwc3: gadget: Bail out in pullup if soft reset timeout happens

Message ID 20230510075252.31023-2-quic_kriskura@quicinc.com (mailing list archive)
State Accepted
Commit 813f44d57e19ccaa7330e829bd913515be42719d
Headers show
Series Handle core soft reset failure in pullup | expand

Commit Message

Krishna Kurapati May 10, 2023, 7:52 a.m. UTC
If the core soft reset timeout happens, avoid setting up event
buffers and starting gadget as the writes to these registers
may not reflect when in reset and setting the run stop bit
can lead the controller to access wrong event buffer address
resulting in a crash.

Signed-off-by: Krishna Kurapati <quic_kriskura@quicinc.com>
Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
---
changes in v3: Rebase on top of usb-next

 drivers/usb/dwc3/gadget.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)
diff mbox series

Patch

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index c0ca4d12f95d..9ab5161881bd 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -2746,13 +2746,16 @@  static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on)
 		 * device-initiated disconnect requires a core soft reset
 		 * (DCTL.CSftRst) before enabling the run/stop bit.
 		 */
-		dwc3_core_soft_reset(dwc);
+		ret = dwc3_core_soft_reset(dwc);
+		if (ret)
+			goto done;
 
 		dwc3_event_buffers_setup(dwc);
 		__dwc3_gadget_start(dwc);
 		ret = dwc3_gadget_run_stop(dwc, true);
 	}
 
+done:
 	pm_runtime_put(dwc->dev);
 
 	return ret;