# 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.474   -> 1.475  
#	drivers/usb/media/pwc-if.c	1.20    -> 1.21   
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/06/08	devik@cdi.cz	1.475
# [PATCH] USB pwc webcam patch
# 
# thanks to suggestions from David Brownell I modified
# pwc driver to compile and work under 2.5.18.
# Also it fixes mas ISO transfer sizes which could
# potentionaly affect older kernels too.
# With these changes it works - I'll test stability and
# post results later.
# --------------------------------------------
#
diff -Nru a/drivers/usb/media/pwc-if.c b/drivers/usb/media/pwc-if.c
--- a/drivers/usb/media/pwc-if.c	Sat Jun  8 15:15:49 2002
+++ b/drivers/usb/media/pwc-if.c	Sat Jun  8 15:15:49 2002
@@ -749,6 +749,9 @@
 	}
 	if (awake)
 		wake_up_interruptible(&pdev->frameq);
+
+	urb->dev = pdev->udev;
+	usb_submit_urb(urb, GFP_ATOMIC);
 }
 
 
@@ -784,7 +787,7 @@
 			break;
 		}
 	
-	if (pdev->vmax_packet_size < 0) {
+	if (pdev->vmax_packet_size < 0 || pdev->vmax_packet_size > ISO_MAX_FRAME_SIZE) {
 		Err("Failed to find packet size for video endpoint in current alternate setting.\n");
 		return -ENFILE; /* Odd error, that should be noticable */
 	}
@@ -815,7 +818,7 @@
 	for (i = 0; i < MAX_ISO_BUFS; i++) {
 		urb = pdev->sbuf[i].urb;
 
-		urb->next = pdev->sbuf[(i + 1) % MAX_ISO_BUFS].urb;
+		urb->interval = 1; // devik
 		urb->dev = udev;
 	        urb->pipe = usb_rcvisocpipe(udev, pdev->vendpoint);
 		urb->transfer_flags = USB_ISO_ASAP;
@@ -826,8 +829,8 @@
 		urb->start_frame = 0;
 		urb->number_of_packets = ISO_FRAMES_PER_DESC;
 		for (j = 0; j < ISO_FRAMES_PER_DESC; j++) {
-			urb->iso_frame_desc[j].offset = j * ISO_MAX_FRAME_SIZE;
-			urb->iso_frame_desc[j].length = ISO_MAX_FRAME_SIZE;
+			urb->iso_frame_desc[j].offset = j * pdev->vmax_packet_size;
+			urb->iso_frame_desc[j].length = pdev->vmax_packet_size;
 		}
 	}
 
@@ -858,7 +861,7 @@
 		usb_set_interface(pdev->udev, 0, 0);
 	/* Unlinking ISOC buffers one by one */
 	for (i = MAX_ISO_BUFS - 1; i >= 0; i--) {
-		pdev->sbuf[i].urb->next = NULL;
+		//pdev->sbuf[i].urb->next = NULL;
 		usb_unlink_urb(pdev->sbuf[i].urb);
 		usb_free_urb(pdev->sbuf[i].urb);
 		pdev->sbuf[i].urb = NULL;