uas: Add a uas_find_uas_alt_setting helper function
authorHans de Goede <hdegoede@redhat.com>
Mon, 21 Oct 2013 07:00:58 +0000 (08:00 +0100)
committerSarah Sharp <sarah.a.sharp@linux.intel.com>
Tue, 4 Mar 2014 23:38:12 +0000 (15:38 -0800)
This is a preparation patch for teaching usb-storage to not bind to
uas devices.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
drivers/usb/storage/uas.c

index 3f021f2fafdf4e3c2dc586995273d6e257e07b5f..54db36541b933bc17ccc5f467456d2103f9c6bee 100644 (file)
@@ -892,10 +892,10 @@ static int uas_isnt_supported(struct usb_device *udev)
        return -ENODEV;
 }
 
-static int uas_switch_interface(struct usb_device *udev,
-                                               struct usb_interface *intf)
+static int uas_find_uas_alt_setting(struct usb_interface *intf)
 {
        int i;
+       struct usb_device *udev = interface_to_usbdev(intf);
        int sg_supported = udev->bus->sg_tablesize != 0;
 
        for (i = 0; i < intf->num_altsetting; i++) {
@@ -904,15 +904,26 @@ static int uas_switch_interface(struct usb_device *udev,
                if (uas_is_interface(alt)) {
                        if (!sg_supported)
                                return uas_isnt_supported(udev);
-                       return usb_set_interface(udev,
-                                               alt->desc.bInterfaceNumber,
-                                               alt->desc.bAlternateSetting);
+                       return alt->desc.bAlternateSetting;
                }
        }
 
        return -ENODEV;
 }
 
+static int uas_switch_interface(struct usb_device *udev,
+                               struct usb_interface *intf)
+{
+       int alt;
+
+       alt = uas_find_uas_alt_setting(intf);
+       if (alt < 0)
+               return alt;
+
+       return usb_set_interface(udev,
+                       intf->altsetting[0].desc.bInterfaceNumber, alt);
+}
+
 static void uas_configure_endpoints(struct uas_dev_info *devinfo)
 {
        struct usb_host_endpoint *eps[4] = { };