To all, Thanks for the reply Dmitri
> The usbvideo module calls usb_unlink_urb() for each of the two urb's ONLY > when it wants to stop the data pump, and that happens only when the device > is being closed. It does NOT happen when "it has enough data" because Yes, that is exactly what is happening - the app (streamer from xawtv) calls close(). (I suppose it is really streamer that "has enough data" so I mis-spoke.) The close() leads to usbvideo_v4l_close() and then on to usbvideo_StopDataPump(). The problems appear after usb_unlink_urb() is called. I believe the two calls to usb_unlink_urb() from usbvideo.c are correct and expected. I think the difficultly is in usb-ohci.c, not usbvideo.c nor ibmcam.c. > If you do the "cat test" (like in `cat < /dev/video0 > /dev/null`) then > the device will be opened and should stay open until you cancel it. If you Thanks for the suggestion. However, `cat < /dev/video0 > /dev/null` invokes (after a few seconds) usbvideo_StopDataPump() and on to usb_unlink_urb() where I again get the "unlink URB timeout" error. BTW, in both the "cat" and "streamer" cases the timeout error leads immediately to a kernel panic. I can still see no way for the code in usb-ohci.c to guarantee that a urb marked for deletion (urb_priv->state = URB_DEL;) will always get its status set to a value other than USB_ST_URB_PENDING. The status USB_ST_URB_PENDING will always result in the timeout error for any urb being "unlinked." To reiterate from my first message: (In usb-ohci.c) Here's the bit of code in dl_done_list() I thought might be in error: if (++(urb_priv->td_cnt) == urb_priv->length) { if ((ed->state & (ED_OPER | ED_UNLINK)) && (urb_priv->state != URB_DEL)) { urb->status = cc_to_error[cc]; sohci_return_urb (ohci, urb); } else { spin_lock_irqsave (&usb_ed_lock, flags); dl_del_urb (urb); spin_unlock_irqrestore (&usb_ed_lock, flags); } } For fun I added else { if (urb_priv->state == URB_DEL) { spin_lock_irqsave (&usb_ed_lock, flags); dl_del_urb (urb); spin_unlock_irqrestore (&usb_ed_lock, flags); } } to cover the case where (urb_priv->state == URB_DEL) is true but (++(urb_priv->td_cnt) == urb_priv->length) was false. This prevented the timeout from occuring for the first urb to be unlinked, but not the second. :-( Any more thoughts would be appreciated. -Tim _______________________________________________ [EMAIL PROTECTED] To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel