usb: dwc3: gadget: never pre-start Isochronous endpoints
We cannot pre-start isochronous endpoints because we
rely on the micro-frame number passed via
XferNotReady command for proper Isochronous
scheduling.
Fixes: 08a36b5438
("usb: dwc3: gadget: simplify __dwc3_gadget_ep_queue()")
Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
This commit is contained in:
parent
a9c3ca5fae
commit
d889c23ce4
|
@ -1073,9 +1073,17 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req)
|
|||
|
||||
list_add_tail(&req->list, &dep->pending_list);
|
||||
|
||||
if (usb_endpoint_xfer_isoc(dep->endpoint.desc) &&
|
||||
dep->flags & DWC3_EP_PENDING_REQUEST) {
|
||||
if (list_empty(&dep->started_list)) {
|
||||
/*
|
||||
* NOTICE: Isochronous endpoints should NEVER be prestarted. We must
|
||||
* wait for a XferNotReady event so we will know what's the current
|
||||
* (micro-)frame number.
|
||||
*
|
||||
* Without this trick, we are very, very likely gonna get Bus Expiry
|
||||
* errors which will force us issue EndTransfer command.
|
||||
*/
|
||||
if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
|
||||
if ((dep->flags & DWC3_EP_PENDING_REQUEST) &&
|
||||
list_empty(&dep->started_list)) {
|
||||
dwc3_stop_active_transfer(dwc, dep->number, true);
|
||||
dep->flags = DWC3_EP_ENABLED;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue