]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/usb/host/uhci-q.c
USB: UHCI: improve scheduling of interrupt URBs
[linux-2.6-omap-h63xx.git] / drivers / usb / host / uhci-q.c
index 1f0c2cf26e5d54532ad23a384c1ede813b625b3b..5631d89c87309ce0155287534b77a234f71eba20 100644 (file)
@@ -1065,13 +1065,18 @@ static int uhci_submit_interrupt(struct uhci_hcd *uhci, struct urb *urb,
                }
                if (exponent < 0)
                        return -EINVAL;
-               qh->period = 1 << exponent;
-               qh->skel = SKEL_INDEX(exponent);
 
-               /* For now, interrupt phase is fixed by the layout
-                * of the QH lists. */
-               qh->phase = (qh->period / 2) & (MAX_PHASE - 1);
-               ret = uhci_check_bandwidth(uhci, qh);
+               /* If the slot is full, try a lower period */
+               do {
+                       qh->period = 1 << exponent;
+                       qh->skel = SKEL_INDEX(exponent);
+
+                       /* For now, interrupt phase is fixed by the layout
+                        * of the QH lists.
+                        */
+                       qh->phase = (qh->period / 2) & (MAX_PHASE - 1);
+                       ret = uhci_check_bandwidth(uhci, qh);
+               } while (ret != 0 && --exponent >= 0);
                if (ret)
                        return ret;
        } else if (qh->period > urb->interval)