diff options
author | Thinh Nguyen <Thinh.Nguyen@synopsys.com> | 2020-09-29 09:18:48 +0200 |
---|---|---|
committer | Felipe Balbi <balbi@kernel.org> | 2020-10-02 08:57:46 +0200 |
commit | d72ecc08dee49cc0b032a74c7efabab877f5c3fa (patch) | |
tree | f9a5aea41c61362988e83b18396ae97a145ab9c4 /drivers/usb/dwc3 | |
parent | usb: bdc: remove duplicated error message (diff) | |
download | linux-d72ecc08dee49cc0b032a74c7efabab877f5c3fa.tar.xz linux-d72ecc08dee49cc0b032a74c7efabab877f5c3fa.zip |
usb: dwc3: gadget: Allow restarting a transfer
It's possible that there's no new TRBs prepared when kicking a transfer.
This happens when we need to stop and restart a transfer such as in the
case of reinitiating a stream or retrying isoc transfer. For streams,
sometime host may reject a stream and the device may need to reinitiate
that stream by stopping and restarting a transfer. In this case, all the
TRBs may have already been prepared. Allow the function
__dwc3_gadget_kick_transfer() to go through even though there's no new
TRB.
Signed-off-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
Signed-off-by: Felipe Balbi <balbi@kernel.org>
Diffstat (limited to 'drivers/usb/dwc3')
-rw-r--r-- | drivers/usb/dwc3/gadget.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 359824c871cd..76c383eecfd3 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -1326,8 +1326,13 @@ static int __dwc3_gadget_kick_transfer(struct dwc3_ep *dep) int ret; u32 cmd; + /* + * Note that it's normal to have no new TRBs prepared (i.e. ret == 0). + * This happens when we need to stop and restart a transfer such as in + * the case of reinitiating a stream or retrying an isoc transfer. + */ ret = dwc3_prepare_trbs(dep); - if (ret <= 0) + if (ret < 0) return ret; starting = !(dep->flags & DWC3_EP_TRANSFER_STARTED); |