> Unlinking is tricky, and my understanding of the current rules are: > > - For a successful synchronous unlink, the completion handler did fire > before the unlink call returned. Easily proven for HCDs that go through > the "hcd.c" logic (*), otherwise you have to take it on faith. (And > some older HCD code might bugs here, like not reporting completions.)
Good. > - For a successful asynchronous unlink, the only rule is that the > completion handler _will_ be called with urb->status == -ECONNRESET. > Maybe before usb_unlink_urb() returns, maybe after. (I've certainly > seen "before" in certain fault recovery scenarios, and SMP ought to > allow it too, although "after" is more usual.) Best we can do. > - For _un_successful unlinks of either type, look at the returned status > to figure out what's up. For example, "-EBUSY" (now) says that the > urb was going through a normal (including non-cancellation fault) > return process, -EINVAL and -ENODEV also give useful status. > > The "devio.c" code quoted didn't handle the unsuccessful unlink case, > which I suspect is pretty typical. Sadly yes. We could avoid this bug if we waited. Now for something related. From usb_submit_urb(): if (!(op = dev->bus->op) || !op->submit_urb) return -ENODEV; urb->status = -EINPROGRESS; <--- here begins the window urb->actual_length = 0; urb->bandwidth = 0; What happens if usb_unlink_urb() is called right there? Nothing good it seems to me. One nasty failure mode might be khubd stuck in state D, if the endpoint is stalled. Regards Oliver ------------------------------------------------------- This SF.NET email is sponsored by: SourceForge Enterprise Edition + IBM + LinuxWorld = Something 2 See! http://www.vasoftware.com _______________________________________________ [EMAIL PROTECTED] To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel