|
@@ -1479,10 +1479,15 @@ iso_stream_schedule (
|
|
|
|
|
|
/* NOTE: assumes URB_ISO_ASAP, to limit complexity/bugs */
|
|
|
|
|
|
- /* find a uframe slot with enough bandwidth */
|
|
|
- next = start + period;
|
|
|
- for (; start < next; start++) {
|
|
|
-
|
|
|
+ /* find a uframe slot with enough bandwidth.
|
|
|
+ * Early uframes are more precious because full-speed
|
|
|
+ * iso IN transfers can't use late uframes,
|
|
|
+ * and therefore they should be allocated last.
|
|
|
+ */
|
|
|
+ next = start;
|
|
|
+ start += period;
|
|
|
+ do {
|
|
|
+ start--;
|
|
|
/* check schedule: enough space? */
|
|
|
if (stream->highspeed) {
|
|
|
if (itd_slot_ok(ehci, mod, start,
|
|
@@ -1495,7 +1500,7 @@ iso_stream_schedule (
|
|
|
start, sched, period))
|
|
|
break;
|
|
|
}
|
|
|
- }
|
|
|
+ } while (start > next);
|
|
|
|
|
|
/* no room in the schedule */
|
|
|
if (start == next) {
|