mirror of
https://github.com/torvalds/linux.git
synced 2024-12-02 09:01:34 +00:00
usb: dwc3: gadget: Delay starting transfer
If the END_TRANSFER command hasn't completed yet, then don't send the START_TRANSFER command. The controller may not be able to start if that's the case. Some controller revisions depend on this. See commit76a638f8ac
("usb: dwc3: gadget: wait for End Transfer to complete"). Let's only send START_TRANSFER command after the END_TRANSFER command had completed. Fixes:3aec99154d
("usb: dwc3: gadget: remove DWC3_EP_END_TRANSFER_PENDING") Signed-off-by: Thinh Nguyen <thinhn@synopsys.com> Signed-off-by: Felipe Balbi <balbi@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
c58d8bfc77
commit
da10bcdd6f
@ -690,6 +690,7 @@ struct dwc3_ep {
|
||||
#define DWC3_EP_TRANSFER_STARTED BIT(3)
|
||||
#define DWC3_EP_END_TRANSFER_PENDING BIT(4)
|
||||
#define DWC3_EP_PENDING_REQUEST BIT(5)
|
||||
#define DWC3_EP_DELAY_START BIT(6)
|
||||
|
||||
/* This last one is specific to EP0 */
|
||||
#define DWC3_EP0_DIR_IN BIT(31)
|
||||
|
@ -1450,6 +1450,12 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req)
|
||||
list_add_tail(&req->list, &dep->pending_list);
|
||||
req->status = DWC3_REQUEST_STATUS_QUEUED;
|
||||
|
||||
/* Start the transfer only after the END_TRANSFER is completed */
|
||||
if (dep->flags & DWC3_EP_END_TRANSFER_PENDING) {
|
||||
dep->flags |= DWC3_EP_DELAY_START;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* NOTICE: Isochronous endpoints should NEVER be prestarted. We must
|
||||
* wait for a XferNotReady event so we will know what's the current
|
||||
@ -2631,6 +2637,11 @@ static void dwc3_endpoint_interrupt(struct dwc3 *dwc,
|
||||
dep->flags &= ~DWC3_EP_END_TRANSFER_PENDING;
|
||||
dep->flags &= ~DWC3_EP_TRANSFER_STARTED;
|
||||
dwc3_gadget_ep_cleanup_cancelled_requests(dep);
|
||||
if ((dep->flags & DWC3_EP_DELAY_START) &&
|
||||
!usb_endpoint_xfer_isoc(dep->endpoint.desc))
|
||||
__dwc3_gadget_kick_transfer(dep);
|
||||
|
||||
dep->flags &= ~DWC3_EP_DELAY_START;
|
||||
}
|
||||
break;
|
||||
case DWC3_DEPEVT_STREAMEVT:
|
||||
|
Loading…
Reference in New Issue
Block a user