if (mask & ~0xffff)
                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
         * suffer when the schedule data isn't cached.
         */
-
-       /* check bandwidth */
-       uframe %= period_uframes;
        do {
                u32             max_used;
 
                frame = uframe >> 3;
                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) */
                max_used = ehci->uframe_periodic_max - stream->usecs;
                for (tmp = stream->raw_mask & 0xff; tmp; tmp >>= 1, uf++) {