|
@@ -1331,34 +1331,36 @@ sitd_slot_ok (
|
|
if (mask & ~0xffff)
|
|
if (mask & ~0xffff)
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
|
|
+ /* check bandwidth */
|
|
|
|
+ uframe %= period_uframes;
|
|
|
|
+ frame = uframe >> 3;
|
|
|
|
+
|
|
|
|
+#ifdef CONFIG_USB_EHCI_TT_NEWSCHED
|
|
|
|
+ /* The tt's fullspeed bus bandwidth must be available.
|
|
|
|
+ * tt_available scheduling guarantees 10+% for control/bulk.
|
|
|
|
+ */
|
|
|
|
+ uf = uframe & 7;
|
|
|
|
+ if (!tt_available(ehci, period_uframes >> 3,
|
|
|
|
+ stream->udev, frame, uf, stream->tt_usecs))
|
|
|
|
+ return 0;
|
|
|
|
+#else
|
|
|
|
+ /* tt must be idle for start(s), any gap, and csplit.
|
|
|
|
+ * assume scheduling slop leaves 10+% for control/bulk.
|
|
|
|
+ */
|
|
|
|
+ if (!tt_no_collision(ehci, period_uframes >> 3,
|
|
|
|
+ stream->udev, frame, mask))
|
|
|
|
+ return 0;
|
|
|
|
+#endif
|
|
|
|
+
|
|
/* this multi-pass logic is simple, but performance may
|
|
/* this multi-pass logic is simple, but performance may
|
|
* suffer when the schedule data isn't cached.
|
|
* suffer when the schedule data isn't cached.
|
|
*/
|
|
*/
|
|
-
|
|
|
|
- /* check bandwidth */
|
|
|
|
- uframe %= period_uframes;
|
|
|
|
do {
|
|
do {
|
|
u32 max_used;
|
|
u32 max_used;
|
|
|
|
|
|
frame = uframe >> 3;
|
|
frame = uframe >> 3;
|
|
uf = uframe & 7;
|
|
uf = uframe & 7;
|
|
|
|
|
|
-#ifdef CONFIG_USB_EHCI_TT_NEWSCHED
|
|
|
|
- /* The tt's fullspeed bus bandwidth must be available.
|
|
|
|
- * tt_available scheduling guarantees 10+% for control/bulk.
|
|
|
|
- */
|
|
|
|
- if (!tt_available (ehci, period_uframes << 3,
|
|
|
|
- stream->udev, frame, uf, stream->tt_usecs))
|
|
|
|
- return 0;
|
|
|
|
-#else
|
|
|
|
- /* tt must be idle for start(s), any gap, and csplit.
|
|
|
|
- * assume scheduling slop leaves 10+% for control/bulk.
|
|
|
|
- */
|
|
|
|
- if (!tt_no_collision (ehci, period_uframes << 3,
|
|
|
|
- stream->udev, frame, mask))
|
|
|
|
- return 0;
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
/* check starts (OUT uses more than one) */
|
|
/* check starts (OUT uses more than one) */
|
|
max_used = ehci->uframe_periodic_max - stream->usecs;
|
|
max_used = ehci->uframe_periodic_max - stream->usecs;
|
|
for (tmp = stream->raw_mask & 0xff; tmp; tmp >>= 1, uf++) {
|
|
for (tmp = stream->raw_mask & 0xff; tmp; tmp >>= 1, uf++) {
|