On Tue, Aug 19, 2003 at 01:45:18PM -0700, David Brownell wrote: > On the other hand, I can imagine some of Alan's updates might > turn up bugs with drivers accessing endpoints that don't exist
This could well be it; adding the hunk below causes a change from success to failure. An strace -f of the pppoa3 shows that it's doing : 596 ioctl(7, USBDEVFS_SUBMITURB, 0x4048bc7c) = -1 EPIPE (Broken pipe) and 639 ioctl(7, USBDEVFS_BULK, 0x4028c9ac) = -1 EINVAL (Invalid argument) I don't know which EINVAL this is though, there are lots of causes in the kernel paths for the ioctl ... I suppose I should talk to the pppoa3 authors. regards john diff -Nru a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c --- a/drivers/usb/core/usb.c Fri Aug 8 21:44:12 2003 +++ b/drivers/usb/core/usb.c Fri Aug 8 21:44:12 2003 @@ -325,24 +304,31 @@ * usb_driver_release_interface - unbind a driver from an interface * @driver: the driver to be unbound * @iface: the interface from which it will be unbound + * + * In addition to unbinding the driver, this re-initializes the interface + * by selecting altsetting 0, the default alternate setting. * - * This should be used by drivers to release their claimed interfaces. - * It is normally called in their disconnect() methods, and only for - * drivers that bound to more than one interface in their probe(). + * This can be used by drivers to release an interface without waiting + * for their disconnect() methods to be called. * * When the USB subsystem disconnect()s a driver from some interface, * it automatically invokes this method for that interface. That * means that even drivers that used usb_driver_claim_interface() * usually won't need to call this. + * + * This call is synchronous, and may not be used in an interrupt context. */ void usb_driver_release_interface(struct usb_driver *driver, struct usb_interface *iface) { /* this should never happen, don't release something that's not ours */ - if (!iface || iface->driver != driver) + if (iface->driver && iface->driver != driver) return; iface->driver = NULL; usb_set_intfdata(iface, NULL); + usb_set_interface(interface_to_usbdev(iface), + iface->altsetting[0].desc.bInterfaceNumber, + 0); } /** -- Khendon's Law: If the same point is made twice by the same person, the thread is over. ------------------------------------------------------- This SF.net email is sponsored by Dice.com. Did you know that Dice has over 25,000 tech jobs available today? From careers in IT to Engineering to Tech Sales, Dice has tech jobs from the best hiring companies. http://www.dice.com/index.epl?rel_code=104 _______________________________________________ [EMAIL PROTECTED] To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel