mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-25 03:46:17 +00:00
usb: dwc3: gadget: Ignore End Transfer delay on teardown
commitc4e3ef5685
upstream. If we delay sending End Transfer for Setup TRB to be prepared, we need to check if the End Transfer was in preparation for a driver teardown/soft-disconnect. In those cases, just send the End Transfer command without delay. In the case of soft-disconnect, there's a very small chance the command may not go through immediately. But should it happen, the Setup TRB will be prepared during the polling of the controller halted state, allowing the command to go through then. In the case of disabling endpoint due to reconfiguration (e.g. set_interface(alt-setting) or usb reset), then it's driven by the host. Typically the host wouldn't immediately cancel the control request and send another control transfer to trigger the End Transfer command timeout. Fixes:4db0fbb601
("usb: dwc3: gadget: Don't delay End Transfer on delayed_status") Cc: stable@vger.kernel.org Signed-off-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com> Link: https://lore.kernel.org/r/f1617a323e190b9cc408fb8b65456e32b5814113.1670546756.git.Thinh.Nguyen@synopsys.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
94d0e33c5f
commit
acbf70d7f9
1 changed files with 4 additions and 1 deletions
|
@ -1717,6 +1717,7 @@ static int __dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force, bool int
|
||||||
else if (!ret)
|
else if (!ret)
|
||||||
dep->flags |= DWC3_EP_END_TRANSFER_PENDING;
|
dep->flags |= DWC3_EP_END_TRANSFER_PENDING;
|
||||||
|
|
||||||
|
dep->flags &= ~DWC3_EP_DELAY_STOP;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3722,8 +3723,10 @@ void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force,
|
||||||
if (dep->number <= 1 && dwc->ep0state != EP0_DATA_PHASE)
|
if (dep->number <= 1 && dwc->ep0state != EP0_DATA_PHASE)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (interrupt && (dep->flags & DWC3_EP_DELAY_STOP))
|
||||||
|
return;
|
||||||
|
|
||||||
if (!(dep->flags & DWC3_EP_TRANSFER_STARTED) ||
|
if (!(dep->flags & DWC3_EP_TRANSFER_STARTED) ||
|
||||||
(dep->flags & DWC3_EP_DELAY_STOP) ||
|
|
||||||
(dep->flags & DWC3_EP_END_TRANSFER_PENDING))
|
(dep->flags & DWC3_EP_END_TRANSFER_PENDING))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue