|
@@ -237,6 +237,8 @@ struct dummy_hcd {
|
|
|
|
|
|
struct usb_device *udev;
|
|
|
struct list_head urbp_list;
|
|
|
+ struct urbp *next_frame_urbp;
|
|
|
+
|
|
|
u32 stream_en_ep;
|
|
|
u8 num_stream[30 / 2];
|
|
|
|
|
@@ -1250,6 +1252,8 @@ static int dummy_urb_enqueue(
|
|
|
|
|
|
list_add_tail(&urbp->urbp_list, &dum_hcd->urbp_list);
|
|
|
urb->hcpriv = urbp;
|
|
|
+ if (!dum_hcd->next_frame_urbp)
|
|
|
+ dum_hcd->next_frame_urbp = urbp;
|
|
|
if (usb_pipetype(urb->pipe) == PIPE_CONTROL)
|
|
|
urb->error_count = 1; /* mark as a new urb */
|
|
|
|
|
@@ -1766,6 +1770,7 @@ static void dummy_timer(unsigned long _dum_hcd)
|
|
|
spin_unlock_irqrestore(&dum->lock, flags);
|
|
|
return;
|
|
|
}
|
|
|
+ dum_hcd->next_frame_urbp = NULL;
|
|
|
|
|
|
for (i = 0; i < DUMMY_ENDPOINTS; i++) {
|
|
|
if (!ep_info[i].name)
|
|
@@ -1782,6 +1787,10 @@ restart:
|
|
|
int type;
|
|
|
int status = -EINPROGRESS;
|
|
|
|
|
|
+ /* stop when we reach URBs queued after the timer interrupt */
|
|
|
+ if (urbp == dum_hcd->next_frame_urbp)
|
|
|
+ break;
|
|
|
+
|
|
|
urb = urbp->urb;
|
|
|
if (urb->unlinked)
|
|
|
goto return_urb;
|