# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
#	           ChangeSet	1.587   -> 1.588  
#	drivers/media/video/cpia_usb.c	1.7     -> 1.8    
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/05/22	david-b@pacbell.net	1.588
# [PATCH] cpia_usb, remove urb->next
# 
# This is the 2.5 version of the sample driver patch I sent around
# last week.  It updates one video driver to work with the updated
# ISO API:  no urb->next (explicit resubmit, with error detection)
# and explicit transfer interval (HCs must remove 1 msec limit).
# 
# The 2.4 version is known to work, but usb video in 2.5 seems to
# be a bit ill so this just fixes the compilation problem created
# by the first of these patches.
# --------------------------------------------
#
diff -Nru a/drivers/media/video/cpia_usb.c b/drivers/media/video/cpia_usb.c
--- a/drivers/media/video/cpia_usb.c	Wed May 22 13:52:18 2002
+++ b/drivers/media/video/cpia_usb.c	Wed May 22 13:52:18 2002
@@ -163,6 +163,11 @@
 			}
 		}
 	}
+
+	/* resubmit */
+	urb->dev = ucpia->dev;
+	if ((i = usb_submit_urb(urb, GFP_ATOMIC)) != 0)
+		printk(KERN_ERR __FUNCTION__ ": usb_submit_urb ret %d\n", i);
 }
 
 static int cpia_usb_open(void *privdata)
@@ -200,7 +205,9 @@
 	ucpia->curbuff = ucpia->buffers[0];
 	ucpia->workbuff = ucpia->buffers[1];
 
-	/* We double buffer the Iso lists */
+	/* We double buffer the Iso lists, and also know the polling
+	 * interval is every frame (1 == (1 << (bInterval -1))).
+	 */
 	urb = usb_alloc_urb(FRAMES_PER_DESC, GFP_KERNEL);
 	if (!urb) {
 		printk(KERN_ERR "cpia_init_isoc: usb_alloc_urb 0\n");
@@ -216,6 +223,7 @@
 	urb->transfer_buffer = ucpia->sbuf[0].data;
 	urb->complete = cpia_usb_complete;
 	urb->number_of_packets = FRAMES_PER_DESC;
+	urb->interval = 1;
 	urb->transfer_buffer_length = FRAME_SIZE_PER_DESC * FRAMES_PER_DESC;
 	for (fx = 0; fx < FRAMES_PER_DESC; fx++) {
 		urb->iso_frame_desc[fx].offset = FRAME_SIZE_PER_DESC * fx;
@@ -237,15 +245,14 @@
 	urb->transfer_buffer = ucpia->sbuf[1].data;
 	urb->complete = cpia_usb_complete;
 	urb->number_of_packets = FRAMES_PER_DESC;
+	urb->interval = 1;
 	urb->transfer_buffer_length = FRAME_SIZE_PER_DESC * FRAMES_PER_DESC;
 	for (fx = 0; fx < FRAMES_PER_DESC; fx++) {
 		urb->iso_frame_desc[fx].offset = FRAME_SIZE_PER_DESC * fx;
 		urb->iso_frame_desc[fx].length = FRAME_SIZE_PER_DESC;
 	}
 
-	ucpia->sbuf[1].urb->next = ucpia->sbuf[0].urb;
-	ucpia->sbuf[0].urb->next = ucpia->sbuf[1].urb;
-	
+	/* queue the ISO urbs, and resubmit in the completion handler */
 	err = usb_submit_urb(ucpia->sbuf[0].urb, GFP_KERNEL);
 	if (err) {
 		printk(KERN_ERR "cpia_init_isoc: usb_submit_urb 0 ret %d\n",
