usb: dwc3: gadget: Bail out in pullup if soft reset timeout happens
authorKrishna Kurapati <quic_kriskura@quicinc.com>
Wed, 10 May 2023 07:52:51 +0000 (13:22 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 13 May 2023 10:00:18 +0000 (19:00 +0900)
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>
Link: https://lore.kernel.org/r/20230510075252.31023-2-quic_kriskura@quicinc.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/dwc3/gadget.c

index 7163d5d0eea02d32ac47185ea0d96fe8ee8ea374..5965796bc5d54d967a3a1d36b5ab2eb4cef85862 100644 (file)
@@ -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;