You've already forked linux-rockchip
mirror of
https://github.com/armbian/linux-rockchip.git
synced 2026-01-06 11:08:10 -08:00
UPSTREAM: usb: dwc3: gadget: Delay issuing End Transfer
If the controller hasn't DMA'ed the Setup data from its fifo, it won't
process the End Transfer command. Polling for the command completion may
block the driver from servicing the Setup phase and cause a timeout.
Previously we only check and delay issuing End Transfer in the case of
endpoint dequeue. Let's do that for all End Transfer scenarios.
Signed-off-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
Link: https://lore.kernel.org/r/2fcf3b5d90068d549589a57a27a79f76c6769b04.1650593829.git.Thinh.Nguyen@synopsys.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
(cherry picked from commit f66eef8fb8)
Bug: 263189538
Change-Id: I58dc40ff7defdd03f52da900ee0b179ffe55d2cc
Signed-off-by: Krishna Kurapati <quic_kriskura@quicinc.com>
This commit is contained in:
@@ -2045,16 +2045,6 @@ static int dwc3_gadget_ep_dequeue(struct usb_ep *ep,
|
||||
if (r == req) {
|
||||
struct dwc3_request *t;
|
||||
|
||||
/*
|
||||
* If a Setup packet is received but yet to DMA out, the controller will
|
||||
* not process the End Transfer command of any endpoint. Polling of its
|
||||
* DEPCMD.CmdAct may block setting up TRB for Setup packet, causing a
|
||||
* timeout. Delay issuing the End Transfer command until the Setup TRB is
|
||||
* prepared.
|
||||
*/
|
||||
if (dwc->ep0state != EP0_SETUP_PHASE && !dwc->delayed_status)
|
||||
dep->flags |= DWC3_EP_DELAY_STOP;
|
||||
|
||||
/* wait until it is processed */
|
||||
dwc3_stop_active_transfer(dep, true, true);
|
||||
|
||||
@@ -3689,6 +3679,18 @@ void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force,
|
||||
(dep->flags & DWC3_EP_END_TRANSFER_PENDING))
|
||||
return;
|
||||
|
||||
/*
|
||||
* If a Setup packet is received but yet to DMA out, the controller will
|
||||
* not process the End Transfer command of any endpoint. Polling of its
|
||||
* DEPCMD.CmdAct may block setting up TRB for Setup packet, causing a
|
||||
* timeout. Delay issuing the End Transfer command until the Setup TRB is
|
||||
* prepared.
|
||||
*/
|
||||
if (dwc->ep0state != EP0_SETUP_PHASE && !dwc->delayed_status) {
|
||||
dep->flags |= DWC3_EP_DELAY_STOP;
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* NOTICE: We are violating what the Databook says about the
|
||||
* EndTransfer command. Ideally we would _always_ wait for the
|
||||
|
||||
Reference in New Issue
Block a user