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

Reply via email to