# 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;