From: Alan Stern <[email protected]>

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 <[email protected]>
Cc: stable <[email protected]>
Tested-by: Glynn Farrow <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>

 drivers/usb/host/ehci-q.c |   11 ++++++++---
 1 files changed, 8 insertions(+), 3 deletions(-)

---

http://git.linuxtv.org/v4l-dvb.git?a=commitdiff;h=1b9a38bfa6e664ff02511314f5586d711c83cc91

diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c
index a427d3b..8952177 100644
--- a/drivers/usb/host/ehci-q.c
+++ b/drivers/usb/host/ehci-q.c
@@ -849,9 +849,10 @@ qh_make (
                                 * But interval 1 scheduling is simpler, and
                                 * includes high bandwidth.
                                 */
-                               dbg ("intr period %d uframes, NYET!",
-                                               urb->interval);
-                               goto done;
+                               urb->interval = 1;
+                       } else if (qh->period > ehci->periodic_size) {
+                               qh->period = ehci->periodic_size;
+                               urb->interval = qh->period << 3;
                        }
                } else {
                        int             think_time;
@@ -874,6 +875,10 @@ qh_make (
                                        usb_calc_bus_time (urb->dev->speed,
                                        is_input, 0, max_packet (maxp)));
                        qh->period = urb->interval;
+                       if (qh->period > ehci->periodic_size) {
+                               qh->period = ehci->periodic_size;
+                               urb->interval = qh->period;
+                       }
                }
        }
 

_______________________________________________
linuxtv-commits mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to