Skip to content

Commit

Permalink
USB: ehci: Fix IST boundary checking interval math.
Browse files Browse the repository at this point in the history
When the EHCI driver falls behind in its scheduling, the active stream's
first empty microframe may be in the past with respect to the current
microframe.  The code attempts to move the starting microframe ("start") N
number of microframes forward, where N is the interval of endpoint.
However, stream->interval is a copy of the endpoint's bInterval, which is
designated in frames for FS devices, and microframes for HS devices.
Convert stream->interval to microframes before using it to move the
starting microframe forward.

Acked-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
Sarah Sharp authored and Greg Kroah-Hartman committed Oct 14, 2009
1 parent 12148da commit 36f2132
Showing 1 changed file with 6 additions and 6 deletions.
12 changes: 6 additions & 6 deletions drivers/usb/host/ehci-sched.c
Original file line number Diff line number Diff line change
Expand Up @@ -1400,6 +1400,10 @@ iso_stream_schedule (
goto fail;
}

period = urb->interval;
if (!stream->highspeed)
period <<= 3;

now = ehci_readl(ehci, &ehci->regs->frame_index) % mod;

/* when's the last uframe this urb could start? */
Expand All @@ -1417,8 +1421,8 @@ iso_stream_schedule (

/* Fell behind (by up to twice the slop amount)? */
if (start >= max - 2 * 8 * SCHEDULE_SLOP)
start += stream->interval * DIV_ROUND_UP(
max - start, stream->interval) - mod;
start += period * DIV_ROUND_UP(
max - start, period) - mod;

/* Tried to schedule too far into the future? */
if (unlikely((start + sched->span) >= max)) {
Expand All @@ -1441,10 +1445,6 @@ iso_stream_schedule (

/* NOTE: assumes URB_ISO_ASAP, to limit complexity/bugs */

period = urb->interval;
if (!stream->highspeed)
period <<= 3;

/* find a uframe slot with enough bandwidth */
for (; start < (stream->next_uframe + period); start++) {
int enough_space;
Expand Down

0 comments on commit 36f2132

Please sign in to comment.