Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 338485
b: refs/heads/master
c: 4005ad4
h: refs/heads/master
i:
  338483: 47cc6c9
v: v3
  • Loading branch information
Alan Stern authored and Greg Kroah-Hartman committed Oct 22, 2012
1 parent 6fa35af commit c916271
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 8 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: a03bede5c73a6876fa891cfe82a65460dc9f4698
refs/heads/master: 4005ad4390bf698e3bdae9567e79242ec0584097
33 changes: 26 additions & 7 deletions trunk/drivers/usb/host/ehci-sched.c
Original file line number Diff line number Diff line change
Expand Up @@ -1386,8 +1386,8 @@ iso_stream_schedule (

/* Typical case: reuse current schedule, stream is still active.
* Hopefully there are no gaps from the host falling behind
* (irq delays etc), but if there are we'll take the next
* slot in the schedule, implicitly assuming URB_ISO_ASAP.
* (irq delays etc). If there are, the behavior depends on
* whether URB_ISO_ASAP is set.
*/
if (likely (!list_empty (&stream->td_list))) {

Expand All @@ -1414,9 +1414,25 @@ iso_stream_schedule (
goto fail;
}

/* Behind the scheduling threshold? Assume URB_ISO_ASAP. */
if (unlikely(start < next))
start += (next - start + period - 1) & (- period);
/* Behind the scheduling threshold? */
if (unlikely(start < next)) {

/* USB_ISO_ASAP: Round up to the first available slot */
if (urb->transfer_flags & URB_ISO_ASAP)
start += (next - start + period - 1) & -period;

/*
* Not ASAP: Use the next slot in the stream. If
* the entire URB falls before the threshold, fail.
*/
else if (start + span - period < next) {
ehci_dbg(ehci, "iso urb late %p (%u+%u < %u)\n",
urb, start + base,
span - period, next + base);
status = -EXDEV;
goto fail;
}
}

start += base;
}
Expand Down Expand Up @@ -1699,7 +1715,7 @@ static bool itd_complete(struct ehci_hcd *ehci, struct ehci_itd *itd)
urb->actual_length += desc->actual_length;
} else {
/* URB was too late */
desc->status = -EXDEV;
urb->error_count++;
}
}

Expand Down Expand Up @@ -2072,7 +2088,7 @@ static bool sitd_complete(struct ehci_hcd *ehci, struct ehci_sitd *sitd)
t = hc32_to_cpup(ehci, &sitd->hw_results);

/* report transfer status */
if (t & SITD_ERRS) {
if (unlikely(t & SITD_ERRS)) {
urb->error_count++;
if (t & SITD_STS_DBE)
desc->status = usb_pipein (urb->pipe)
Expand All @@ -2082,6 +2098,9 @@ static bool sitd_complete(struct ehci_hcd *ehci, struct ehci_sitd *sitd)
desc->status = -EOVERFLOW;
else /* XACT, MMF, etc */
desc->status = -EPROTO;
} else if (unlikely(t & SITD_STS_ACTIVE)) {
/* URB was too late */
urb->error_count++;
} else {
desc->status = 0;
desc->actual_length = desc->length - SITD_LENGTH(t);
Expand Down

0 comments on commit c916271

Please sign in to comment.