[NET]: Transform skb_queue_len() binary tests into skb_queue_empty()
[safe/jmp/linux-2.6] / drivers / usb / core / usb.c
index a649743..a3c4220 100644 (file)
@@ -293,7 +293,7 @@ int usb_driver_claim_interface(struct usb_driver *driver,
        /* if interface was already added, bind now; else let
         * the future device_add() bind it, bypassing probe()
         */
-       if (!klist_node_attached (&dev->knode_bus))
+       if (klist_node_attached(&dev->knode_bus))
                device_bind_driver(dev);
 
        return 0;
@@ -322,9 +322,15 @@ void usb_driver_release_interface(struct usb_driver *driver,
        if (!dev->driver || dev->driver != &driver->driver)
                return;
 
-       /* don't disconnect from disconnect(), or before dev_add() */
-       if (!klist_node_attached(&dev->knode_driver) && !klist_node_attached(&dev->knode_bus))
+       /* don't release from within disconnect() */
+       if (iface->condition != USB_INTERFACE_BOUND)
+               return;
+
+       /* release only after device_add() */
+       if (klist_node_attached(&dev->knode_bus)) {
+               iface->condition = USB_INTERFACE_UNBINDING;
                device_release_driver(dev);
+       }
 
        dev->driver = NULL;
        usb_set_intfdata(iface, NULL);
@@ -492,7 +498,7 @@ static int __find_interface(struct device * dev, void * data)
  */
 struct usb_interface *usb_find_interface(struct usb_driver *drv, int minor)
 {
-       struct usb_interface *intf = (struct usb_interface *)minor;
+       struct usb_interface *intf = (struct usb_interface *)(long)minor;
        int ret;
 
        ret = driver_for_each_device(&drv->driver, NULL, &intf, __find_interface);