diff -Nru a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c
--- a/drivers/usb/host/ehci-sched.c	2004-12-21 18:02:48.921708256 -0500
+++ b/drivers/usb/host/ehci-sched.c	2004-12-21 18:25:41.130100872 -0500
@@ -1796,6 +1796,7 @@
 {
 	unsigned	frame, clock, now_uframe, mod;
 	unsigned	modified;
+	u8		uncompleted_td = 0;
 
 	mod = ehci->periodic_size << 3;
 
@@ -1874,8 +1875,10 @@
 					q = *q_p;
 					break;
 				}
-				if (uf != 8)
+				if (uf != 8) {
+					uncompleted_td = 1;
 					break;
+				}
 
 				/* this one's ready ... HC won't cache the
 				 * pointer for much longer, if at all.
@@ -1894,6 +1897,7 @@
 					hw_p = &q.sitd->hw_next;
 					type = Q_NEXT_TYPE (q.sitd->hw_next);
 					q = *q_p;
+					uncompleted_td = 1;
 					break;
 				}
 				*q_p = q.sitd->sitd_next;
@@ -1925,12 +1929,17 @@
 
 		// FIXME:  likewise assumes HC doesn't halt mid-scan
 
+		/* We must start the next scan cycle at the first
+		 * uncompleted TD so that TDs are not lost.
+		 */
+		if ((!uncompleted_td) && (HCD_IS_RUNNING (ehci->hcd.state)))
+			ehci->next_uframe = now_uframe;
+                                                                                
 		if (now_uframe == clock) {
 			unsigned	now;
 
 			if (!HCD_IS_RUNNING (ehci->hcd.state))
 				break;
-			ehci->next_uframe = now_uframe;
 			now = readl (&ehci->regs->frame_index) % mod;
 			if (now_uframe == now)
 				break;
