USB: Refactor code to find alternate interface settings.
authorSarah Sharp <sarah.a.sharp@linux.intel.com>
Thu, 3 Dec 2009 17:44:34 +0000 (09:44 -0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 11 Dec 2009 19:55:27 +0000 (11:55 -0800)
Refactor out the code to find alternate interface settings into
usb_find_alt_setting().  Print a debugging message and return null if the
alt setting is not found.

While we're at it, correct a bug in the refactored code.  The interfaces
in the configuration's interface cache are not necessarily in numerical
order, so we can't just use the interface number as an array index.  Loop
through the interface caches, looking for the correct interface.

Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/core/hcd.c
drivers/usb/core/usb.c
include/linux/usb.h

index daac0427bfd55e2d9b9f56501e0f9575fe0e7914..fc235b02ff2795e210c7210aae9418fbd1976233 100644 (file)
@@ -1606,7 +1606,6 @@ int usb_hcd_check_bandwidth(struct usb_device *udev,
                struct usb_interface *new_intf)
 {
        int num_intfs, i, j;
-       struct usb_interface_cache *intf_cache;
        struct usb_host_interface *alt = NULL;
        int ret = 0;
        struct usb_hcd *hcd;
@@ -1654,15 +1653,8 @@ int usb_hcd_check_bandwidth(struct usb_device *udev,
                        }
                }
                for (i = 0; i < num_intfs; ++i) {
-
-                       /* Dig the endpoints for alt setting 0 out of the
-                        * interface cache for this interface
-                        */
-                       intf_cache = new_config->intf_cache[i];
-                       for (j = 0; j < intf_cache->num_altsetting; j++) {
-                               if (intf_cache->altsetting[j].desc.bAlternateSetting == 0)
-                                       alt = &intf_cache->altsetting[j];
-                       }
+                       /* Set up endpoints for alternate interface setting 0 */
+                       alt = usb_find_alt_setting(new_config, i, 0);
                        if (!alt) {
                                printk(KERN_DEBUG "Did not find alt setting 0 for intf %d\n", i);
                                continue;
index d1e9440799de1a90a6b91339cba4e468b66ef89d..99e54586a5450c9a25cc790543e29f627e8ddaba 100644 (file)
@@ -63,6 +63,43 @@ MODULE_PARM_DESC(autosuspend, "default autosuspend delay");
 #endif
 
 
+/**
+ * usb_find_alt_setting() - Given a configuration, find the alternate setting
+ * for the given interface.
+ * @config - the configuration to search (not necessarily the current config).
+ * @iface_num - interface number to search in
+ * @alt_num - alternate interface setting number to search for.
+ *
+ * Search the configuration's interface cache for the given alt setting.
+ */
+struct usb_host_interface *usb_find_alt_setting(
+               struct usb_host_config *config,
+               unsigned int iface_num,
+               unsigned int alt_num)
+{
+       struct usb_interface_cache *intf_cache = NULL;
+       int i;
+
+       for (i = 0; i < config->desc.bNumInterfaces; i++) {
+               if (config->intf_cache[i]->altsetting[0].desc.bInterfaceNumber
+                               == iface_num) {
+                       intf_cache = config->intf_cache[i];
+                       break;
+               }
+       }
+       if (!intf_cache)
+               return NULL;
+       for (i = 0; i < intf_cache->num_altsetting; i++)
+               if (intf_cache->altsetting[i].desc.bAlternateSetting == alt_num)
+                       return &intf_cache->altsetting[i];
+
+       printk(KERN_DEBUG "Did not find alt setting %u for intf %u, "
+                       "config %u\n", alt_num, iface_num,
+                       config->desc.bConfigurationValue);
+       return NULL;
+}
+EXPORT_SYMBOL_GPL(usb_find_alt_setting);
+
 /**
  * usb_ifnum_to_if - get the interface object with a given interface number
  * @dev: the device whose current configuration is considered
index 6af3581e1114e71e1a26aec81c36b5e9447e57f8..e101a2d04d7588843083bfd466831e4fb807347e 100644 (file)
@@ -619,6 +619,10 @@ extern struct usb_interface *usb_ifnum_to_if(const struct usb_device *dev,
                unsigned ifnum);
 extern struct usb_host_interface *usb_altnum_to_altsetting(
                const struct usb_interface *intf, unsigned int altnum);
+extern struct usb_host_interface *usb_find_alt_setting(
+               struct usb_host_config *config,
+               unsigned int iface_num,
+               unsigned int alt_num);
 
 
 /**