On 15/09/2023 15.05, João Paulo Silva Gonçalves wrote: > Hi Marek, > > I was testing fastboot image download over usb for imx8mp (from usb > recovery patch of verdin-imx8mp) and i am having error messages on > endpoint request dequeue function of DWC3 gadget controller. However, > download is working fine, so this message may not be an error. They are > happening because fastboot tx before sending a new usb request dequeue > the same request, maybe to be sure it does not send it twice. Can I > just ignore these messages? Maybe change its log level to dbg instead > of error? What do you think? The messages I am seeing are below and are > the ones with "... was not queued to ep1in-bulk".
We apply this internally (sorry if it's whitespace damaged), but I never fully understood the problem nor how the referenced kernel thread was resolved, which is why I haven't sent it upstream yet. dwc3: gadget: Handle dequeuing of non queued request gracefully Trying to dequeue an request that is currently not queued should be a no-op and be handled gracefully. Checking on list/queue empty indicate whether the request is queue or not. Handling this gracefully allows for race condition free synchronization between the complete callback being called to to a completed transfer and trying to call usb_ep_dequeue() at the same time. Inspired by: https://patchwork.kernel.org/project/linux-usb/patch/20191106144553.16956-1-alexandru.ardel...@analog.com/ diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index eb416b832aa..378d19d8e99 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -1113,6 +1113,9 @@ static int dwc3_gadget_ep_dequeue(struct usb_ep *ep, spin_lock_irqsave(&dwc->lock, flags); + if (list_empty(&dep->request_list) && list_empty(&dep->req_queued)) + goto out0; + list_for_each_entry(r, &dep->request_list, list) { if (r == req) break; Rasmus