Hi Tim, dl_done_list() with
++(urb_priv->td_cnt) == urb_priv->length) is just for the special case where the URB would have been finished at the same time we have request the usb_unlink_urb(). Normally dl_del_list() should do the work. - Roman Tim Connors wrote: >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 > > _______________________________________________ [EMAIL PROTECTED] To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel