On Friday 09 January 2004 02:10, David Brownell wrote:
> Duncan Sands wrote:
> > Thanks a lot.  This is extremely problematic then: in
> > usb_set_configuration, an interface's device structure will not be
> > completely initialized until we do device_add (&intf->dev);
> > ...
> > What to do?
>
> Hmm, good catch!  Looks to me like usb_driver_claim_interface() will
> need to check whether the device has been added yet.  Something like
> this should do it:
>
>     intf->dev.driver = &driver->driver;
>     intf->dev.driver_data = priv;
>     if (!list_empty (&intf->dev.bus_list))
>          device_bind_driver (&intf->dev);
>
> Then let usb_set_configuration() do the device_add(), which will
> automatically device_bind_driver() when dev->driver is set.  (And
> will probe() otherwise.)

Hi Dave, I guess the same check is needed in usb_driver_release_interface,
in case someone claims and releases an interface before it has been
device_add()ed.  This leads to the following behaviour though: if in your
probe() method you claim and release another interface that has been
device_add()ed, then disconnect() is called on it; but if you claim and release
an interface that has not yet been device_add()ed, then disconnect is not called.
Some might say this is inconsistent, but I think it is OK: it can be interpreted
as: disconnect() will only be called on interfaces that have been probe()ed.
On the other hand, there is the following variation: suppose interface 0
claims interface 1 when interface 0 is probe()ed.  When interface 1 is
device_add()ed then it is not probe()ed because it was claimed.  Suppose
now interface 2 releases interface 1 when interface 2 is probe()ed.  Then
disconnect will be called on interface 1, even though its probe method
was not called.  Oh well!

Duncan.

PS: It seems to work: (on top of my previous patch)

===== drivers/usb/core/usb.c 1.148 vs edited =====
--- 1.148/drivers/usb/core/usb.c        Tue Jan  6 10:36:08 2004
+++ edited/drivers/usb/core/usb.c       Sat Jan 10 00:30:46 2004
@@ -272,7 +272,12 @@

        dev->driver = &driver->driver;
        usb_set_intfdata(iface, priv);
-       device_bind_driver(dev);
+
+       if (!list_empty (&dev->bus_list))
+               /* dev added to bus - safe to bind */
+               device_bind_driver(dev);
+       /* else pending device_add() will bind (without probe()) */
+
        return 0;
 }

@@ -299,7 +304,11 @@
        if (!dev->driver || dev->driver != &driver->driver)
                return;

-       device_release_driver(dev);
+       if (!list_empty (&dev->bus_list))
+               device_release_driver(dev);
+
+       dev->driver = NULL;
+       usb_set_intfdata(iface, NULL);
 }

 /**


-------------------------------------------------------
This SF.net email is sponsored by: Perforce Software.
Perforce is the Fast Software Configuration Management System offering
advanced branching capabilities and atomic changes on 50+ platforms.
Free Eval! http://www.perforce.com/perforce/loadprog.html
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to