Re: [PATCH] usb: dwc3: gadget: Avoid starting DWC3 gadget during UDC unbind

From: Felipe Balbi
Date: Fri Sep 17 2021 - 01:25:53 EST



Hi,

Wesley Cheng <wcheng@xxxxxxxxxxxxxx> writes:

> There is a race present where the DWC3 runtime resume runs in parallel
> to the UDC unbind sequence. This will eventually lead to a possible
> scenario where we are enabling the run/stop bit, without a valid
> composition defined.
>
> Thread#1 (handling UDC unbind):
> usb_gadget_remove_driver()
> -->usb_gadget_disconnect()
> -->dwc3_gadget_pullup(0)
> --> continue UDC unbind sequence
> -->Thread#2 is running in parallel here
>
> Thread#2 (handing next cable connect)
> __dwc3_set_mode()
> -->pm_runtime_get_sync()
> -->dwc3_gadget_resume()
> -->dwc->gadget_driver is NOT NULL yet
> -->dwc3_gadget_run_stop(1)
> --> _dwc3gadget_start()
> ...
>
> Fix this by tracking the pullup disable routine, and avoiding resuming
> of the DWC3 gadget. Once the UDC is re-binded, that will trigger the
> pullup enable routine, which would handle enabling the DWC3 gadget.
>
> Signed-off-by: Wesley Cheng <wcheng@xxxxxxxxxxxxxx>

This looks okay to me, but needs to be tested by a few folks ;-)

Acked-by: Felipe Balbi <balbi@xxxxxxxxxx>

--
balbi