[PATCH] Use driver_for_each_device() instead of manually walking list.
authormochel@digitalimplant.org <mochel@digitalimplant.org>
Mon, 21 Mar 2005 19:09:40 +0000 (11:09 -0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Mon, 20 Jun 2005 22:15:13 +0000 (15:15 -0700)
Signed-off-by: Patrick Mochel <mochel@digitalimplant.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Index: gregkh-2.6/drivers/usb/core/usb.c
===================================================================

drivers/usb/core/usb.c

index 25cf7e9eccfaadab58c4eb596494cec910cfbdbb..4453cce7eb2435cb8c8f537bff2f78bfc4c54d9a 100644 (file)
@@ -462,6 +462,25 @@ usb_match_id(struct usb_interface *interface, const struct usb_device_id *id)
        return NULL;
 }
 
+
+static int __find_interface(struct device * dev, void * data)
+{
+       struct usb_interface ** ret = (struct usb_interface **)data;
+       struct usb_interface * intf = *ret;
+       int *minor = (int *)data;
+
+       /* can't look at usb devices, only interfaces */
+       if (dev->driver == &usb_generic_driver)
+               return 0;
+
+       intf = to_usb_interface(dev);
+       if (intf->minor != -1 && intf->minor == *minor) {
+               *ret = intf;
+               return 1;
+       }
+       return 0;
+}
+
 /**
  * usb_find_interface - find usb_interface pointer for driver and device
  * @drv: the driver whose current configuration is considered
@@ -473,26 +492,12 @@ usb_match_id(struct usb_interface *interface, const struct usb_device_id *id)
  */
 struct usb_interface *usb_find_interface(struct usb_driver *drv, int minor)
 {
-       struct list_head *entry;
-       struct device *dev;
-       struct usb_interface *intf;
-
-       list_for_each(entry, &drv->driver.devices) {
-               dev = container_of(entry, struct device, driver_list);
+       struct usb_interface *intf = (struct usb_interface *)minor;
+       int ret;
 
-               /* can't look at usb devices, only interfaces */
-               if (dev->driver == &usb_generic_driver)
-                       continue;
-
-               intf = to_usb_interface(dev);
-               if (intf->minor == -1)
-                       continue;
-               if (intf->minor == minor)
-                       return intf;
-       }
+       ret = driver_for_each_device(&drv->driver, NULL, &intf, __find_interface);
 
-       /* no device found that matches */
-       return NULL;    
+       return ret ? intf : NULL;
 }
 
 static int usb_device_match (struct device *dev, struct device_driver *drv)