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

Reply via email to