On Wed, 2022-09-28 at 11:30 -0400, Alan Stern wrote: > On Wed, Sep 28, 2022 at 05:17:20PM +0800, Chunfeng Yun wrote: > > It happens when enable uvc function, the flow as below: > > the controller switch to data stage, then call > > -> foward_to_driver() -> composite_setup() -> > > uvc_function_setup(), > > it send out an event to user layer to notify it call > > -> ioctl() -> uvc_send_response() -> usb_ep_queue(), > > but before the user call ioctl to queue ep0's buffer, the host > > already send > > out data, but the controller find that no buffer is queued to > > receive data, > > it send out STALL handshake. > > > > To fix the issue, don't send out ACK of setup stage to switch to > > out data > > stage until the buffer is available. > > You might find it is better to use the delayed_status routines > already > present in the Gadget core. Instead of delaying the response to the > Setup packet of the second control transfer, delay the status > response > to the first control transfer. Ok, I'll try to use delayed_status to handle this issue. Thanks a lot. > > This approach has the advantage of working even when the second > transfer > is not control but something else, such as bulk. > > Also it agrees better with the way the USB spec intends control > transfers to work. The UDC is not supposed to complete the status > stage > of a control transfer until the gadget has fully processed the > transfer's information and is ready to go forward. > > Alan Stern