USB: EHCI: fix handling of unusual interrupt intervals

This patch (as1320) fixes two problems related to interrupt-URB
scheduling in ehci-hcd.

URBs with an interval of 2 or 4 microframes aren't handled.
For the time being, the patch reduces to interval to 1 uframe.

URBs are constrained to have an interval no larger than 1024
frames by usb_submit_urb(). But some EHCI controllers allow
use of a schedule as short as 256 frames; for these
controllers we may have to decrease the interval to the
actual schedule length.

The second problem isn't very significant since few devices expose
interrupt endpoints with an interval larger than 256 frames. But the
first problem is critical; it will prevent the kernel from working
with devices having interrupt intervals of 2 or 4 uframes.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Cc: stable <stable@kernel.org>
Tested-by: Glynn Farrow <farrowg@sg.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

authored by Alan Stern and committed by Greg Kroah-Hartman 1b9a38bf acbe2feb

+8 -3
+8 -3
drivers/usb/host/ehci-q.c
··· 849 849 * But interval 1 scheduling is simpler, and 850 850 * includes high bandwidth. 851 851 */ 852 - dbg ("intr period %d uframes, NYET!", 853 - urb->interval); 854 - goto done; 852 + urb->interval = 1; 853 + } else if (qh->period > ehci->periodic_size) { 854 + qh->period = ehci->periodic_size; 855 + urb->interval = qh->period << 3; 855 856 } 856 857 } else { 857 858 int think_time; ··· 875 874 usb_calc_bus_time (urb->dev->speed, 876 875 is_input, 0, max_packet (maxp))); 877 876 qh->period = urb->interval; 877 + if (qh->period > ehci->periodic_size) { 878 + qh->period = ehci->periodic_size; 879 + urb->interval = qh->period; 880 + } 878 881 } 879 882 } 880 883