usb: gadget: ffs: Let setup() return USB_GADGET_DELAYED_STATUS
Hi,
Quoted 8 lines · Lars-Peter Clausen
Quoted 5 lines
Quoted 1 line · Lars-Peter Clausen
Some UDC drivers (like the DWC3) expect that the response to a
setup()not some, but *all*. You can only queue a response later IFF you return
USB_GADGET_DELAYED_STATUS.Yeah, but most drivers don't care. DWC3 is one of two which handles
USB_GADGET_DELAYED_STATUS.
those drivers probably wouldn't work with g_mass_storage ;-)
Quoted 9 lines
Quoted 5 lines
Quoted 2 lines
This fixed random occasional failures that were previously observed on a DWC3 based system under high system load.
I need to see tracepoint capture from the failure ;-) Care to send them to me for analysis?
I've attached the full trace up to the point where the failure occurs. (The tracing infrastructure in the DWC3 driver was very helpful in tracking this down btw.).
yeah, that was the idea. I see, however, that you're using an older kernel based on the your trace format. Just to make sure, did you try with v4.14? I see the problem is pretty clear and we will take the patch, but just to make sure, can you try v4.14?
Quoted 11 lines
The important parts are around:
125.504109:
dwc3_complete_trb: ep0out: ...
125.504111:dwc3_prepare_trb: ep0out: ...Then a few moments later
125.508529:
dwc3_ep0: queueing requestffffffc8787b6d00to ep0out ...Usually the queuing would happen before the
dwc3_complete_trband this function would remove the URB from the queue. But now it will just sit on
correct :-)
Quoted 6 lines
the pending list waiting for something to happen since the original transfer is already over.
When the next control request comes in and we try to queue something for EP0 the '
list_empty(&dep->pending_list)' check will fail, we return an error and the endpoint is stalled and the host will observe an error.
right :-)
btw, you can enable only some events from dwc3 if you want. Usually I enable all (echo 1 > /.../events/dwc3/enable) and disable read/writel (echo 0 > /.../events/dwc3/dwc3_readl/enable && echo 0 > /.../events/dwc3/dwc3_writel/enable), that helps a lot :-)