USB: EHCI: fix divide-by-zero bug

This patch (as1164) fixes a bug in the EHCI scheduler.  The interval
value it uses is already in linear format, not logarithmically coded.
The existing code can sometimes crash the system by trying to divide
by zero.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Cc: David Brownell <david-b@pacbell.net>
Cc: Stable <stable@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
Alan Stern 2008-11-12 17:02:57 -05:00 committed by Greg Kroah-Hartman
parent 67b2e02974
commit 372dd6e8ed

View File

@ -918,7 +918,7 @@ iso_stream_init (
*/ */
stream->usecs = HS_USECS_ISO (maxp); stream->usecs = HS_USECS_ISO (maxp);
bandwidth = stream->usecs * 8; bandwidth = stream->usecs * 8;
bandwidth /= 1 << (interval - 1); bandwidth /= interval;
} else { } else {
u32 addr; u32 addr;
@ -951,7 +951,7 @@ iso_stream_init (
} else } else
stream->raw_mask = smask_out [hs_transfers - 1]; stream->raw_mask = smask_out [hs_transfers - 1];
bandwidth = stream->usecs + stream->c_usecs; bandwidth = stream->usecs + stream->c_usecs;
bandwidth /= 1 << (interval + 2); bandwidth /= interval << 3;
/* stream->splits gets created from raw_mask later */ /* stream->splits gets created from raw_mask later */
stream->address = cpu_to_hc32(ehci, addr); stream->address = cpu_to_hc32(ehci, addr);