On Wed, 30 Jan 2008, Peter Korsgaard wrote: > >> +static void c67x00_sched_done(unsigned long __c67x00) > >> +{ > >> + struct c67x00_hcd *c67x00 = (struct c67x00_hcd *)__c67x00; > >> + struct c67x00_urb_priv *urbp, *tmp; > >> + struct urb *urb; > >> + > >> + spin_lock(&c67x00->lock); > >> + > >> + /* Loop over the done list and give back all the urbs */ > >> + list_for_each_entry_safe(urbp, tmp, &c67x00->done_list, hep_node) { > >> + urb = urbp->urb; > >> + c67x00_release_urb(c67x00, urb); > >> + if (!usb_hcd_check_unlink_urb(c67x00_hcd_to_hcd(c67x00), > >> + urb, urbp->status)) { > > Alan> The function call above is completely wrong. It is meant to be used > only > Alan> from within the dequeue method. > > Ahh, so should I just unconditionally do the unlink_urb_from_ep and > giveback_urb?
Yes, that's right. The check_unlink_urb routine merely verifies that an unlink is valid. If you're about to giveback an URB then you already know it's valid to do so. Alan Stern - To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html