Thread (7 messages) 7 messages, 3 authors, 2022-09-29

Re: [PATCH 1/2] usb: mtu3: fix ep0's stall of out data stage

From: Chunfeng Yun <chunfeng.yun@mediatek.com>
Date: 2022-09-29 06:30:59
Also in: linux-arm-kernel, linux-mediatek, lkml, stable

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:
quoted
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
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help