]> git.hungrycats.org Git - linux/commitdiff
[PATCH] fix urb->next removal in usbvideo
authorSimon Evans <spse@secret.org.uk>
Sat, 8 Jun 2002 08:06:52 +0000 (01:06 -0700)
committerGreg Kroah-Hartman <greg@kroah.com>
Sat, 8 Jun 2002 08:06:52 +0000 (01:06 -0700)
This patch removes the use of urb->next in usbvideo.c and resubmits
the URB in the completion handler.

drivers/usb/media/usbvideo.c

index 76583a5d59e9ba44a7ac7445607ce4a540ee74e2..f2ad752d6090e4c4c0eab5a04a027d1b23cf317f 100644 (file)
@@ -1802,7 +1802,7 @@ static int usbvideo_CompressIsochronous(uvd_t *uvd, struct urb *urb)
 
 static void usbvideo_IsocIrq(struct urb *urb)
 {
-       int i, len;
+       int i, ret, len;
        uvd_t *uvd = urb->context;
 
        /* We don't want to do anything if we are about to be removed! */
@@ -1844,6 +1844,11 @@ urb_done_with:
                urb->iso_frame_desc[i].status = 0;
                urb->iso_frame_desc[i].actual_length = 0;
        }
+       urb->status = 0;
+       urb->dev = uvd->dev;
+       ret = usb_submit_urb (urb, GFP_KERNEL);
+       if(ret)
+               err("usb_submit_urb error (%d)", ret);
        return;
 }
 
@@ -1889,6 +1894,7 @@ static int usbvideo_StartDataPump(uvd_t *uvd)
                urb->dev = dev;
                urb->context = uvd;
                urb->pipe = usb_rcvisocpipe(dev, uvd->video_endp);
+               urb->interval = 1;
                urb->transfer_flags = USB_ISO_ASAP;
                urb->transfer_buffer = uvd->sbuf[i].data;
                urb->complete = usbvideo_IsocIrq;
@@ -1900,14 +1906,6 @@ static int usbvideo_StartDataPump(uvd_t *uvd)
                }
        }
 
-       /* Link URBs into a ring so that they invoke each other infinitely */
-       for (i=0; i < USBVIDEO_NUMSBUF; i++) {
-               if ((i+1) < USBVIDEO_NUMSBUF)
-                       uvd->sbuf[i].urb->next = uvd->sbuf[i+1].urb;
-               else
-                       uvd->sbuf[i].urb->next = uvd->sbuf[0].urb;
-       }
-
        /* Submit all URBs */
        for (i=0; i < USBVIDEO_NUMSBUF; i++) {
                errFlag = usb_submit_urb(uvd->sbuf[i].urb, GFP_KERNEL);