aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/usb/gadget/udc/dummy_hcd.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/usb/gadget/udc/dummy_hcd.c b/drivers/usb/gadget/udc/dummy_hcd.c
index d515ec31afe4..b2ab9cc33fec 100644
--- a/drivers/usb/gadget/udc/dummy_hcd.c
+++ b/drivers/usb/gadget/udc/dummy_hcd.c
@@ -237,6 +237,8 @@ struct dummy_hcd {
237 237
238 struct usb_device *udev; 238 struct usb_device *udev;
239 struct list_head urbp_list; 239 struct list_head urbp_list;
240 struct urbp *next_frame_urbp;
241
240 u32 stream_en_ep; 242 u32 stream_en_ep;
241 u8 num_stream[30 / 2]; 243 u8 num_stream[30 / 2];
242 244
@@ -1250,6 +1252,8 @@ static int dummy_urb_enqueue(
1250 1252
1251 list_add_tail(&urbp->urbp_list, &dum_hcd->urbp_list); 1253 list_add_tail(&urbp->urbp_list, &dum_hcd->urbp_list);
1252 urb->hcpriv = urbp; 1254 urb->hcpriv = urbp;
1255 if (!dum_hcd->next_frame_urbp)
1256 dum_hcd->next_frame_urbp = urbp;
1253 if (usb_pipetype(urb->pipe) == PIPE_CONTROL) 1257 if (usb_pipetype(urb->pipe) == PIPE_CONTROL)
1254 urb->error_count = 1; /* mark as a new urb */ 1258 urb->error_count = 1; /* mark as a new urb */
1255 1259
@@ -1766,6 +1770,7 @@ static void dummy_timer(unsigned long _dum_hcd)
1766 spin_unlock_irqrestore(&dum->lock, flags); 1770 spin_unlock_irqrestore(&dum->lock, flags);
1767 return; 1771 return;
1768 } 1772 }
1773 dum_hcd->next_frame_urbp = NULL;
1769 1774
1770 for (i = 0; i < DUMMY_ENDPOINTS; i++) { 1775 for (i = 0; i < DUMMY_ENDPOINTS; i++) {
1771 if (!ep_info[i].name) 1776 if (!ep_info[i].name)
@@ -1782,6 +1787,10 @@ restart:
1782 int type; 1787 int type;
1783 int status = -EINPROGRESS; 1788 int status = -EINPROGRESS;
1784 1789
1790 /* stop when we reach URBs queued after the timer interrupt */
1791 if (urbp == dum_hcd->next_frame_urbp)
1792 break;
1793
1785 urb = urbp->urb; 1794 urb = urbp->urb;
1786 if (urb->unlinked) 1795 if (urb->unlinked)
1787 goto return_urb; 1796 goto return_urb;