Commit bef073b0 authored by Alan Stern's avatar Alan Stern Committed by Greg Kroah-Hartman

USB: UHCI: accept very late isochronous URBs

Commit 24f53137 (USB: EHCI: accept very late isochronous URBs)
changed the isochronous API provided by ehci-hcd.  URBs submitted too
late, so that the time slots for all their packets have already
expired, are no longer rejected outright.  Instead the submission is
accepted, and the URB completes normally with a -EXDEV error for each
packet.  This is what client drivers expect.

This patch implements the same policy in uhci-hcd.  It should be
applied to all kernels containing commit c44b2250 (UHCI: implement
new semantics for URB_ISO_ASAP).
Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
CC: <stable@vger.kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 8937669f
...@@ -1303,7 +1303,7 @@ static int uhci_submit_isochronous(struct uhci_hcd *uhci, struct urb *urb, ...@@ -1303,7 +1303,7 @@ static int uhci_submit_isochronous(struct uhci_hcd *uhci, struct urb *urb,
} }
/* Fell behind? */ /* Fell behind? */
if (uhci_frame_before_eq(frame, next)) { if (!uhci_frame_before_eq(next, frame)) {
/* USB_ISO_ASAP: Round up to the first available slot */ /* USB_ISO_ASAP: Round up to the first available slot */
if (urb->transfer_flags & URB_ISO_ASAP) if (urb->transfer_flags & URB_ISO_ASAP)
...@@ -1311,13 +1311,17 @@ static int uhci_submit_isochronous(struct uhci_hcd *uhci, struct urb *urb, ...@@ -1311,13 +1311,17 @@ static int uhci_submit_isochronous(struct uhci_hcd *uhci, struct urb *urb,
-qh->period; -qh->period;
/* /*
* Not ASAP: Use the next slot in the stream. If * Not ASAP: Use the next slot in the stream,
* the entire URB falls before the threshold, fail. * no matter what.
*/ */
else if (!uhci_frame_before_eq(next, else if (!uhci_frame_before_eq(next,
frame + (urb->number_of_packets - 1) * frame + (urb->number_of_packets - 1) *
qh->period)) qh->period))
return -EXDEV; dev_dbg(uhci_dev(uhci), "iso underrun %p (%u+%u < %u)\n",
urb, frame,
(urb->number_of_packets - 1) *
qh->period,
next);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment