usb: core: get config and string descriptors for unauthorized devices
authorThomas Pugliese <thomas.pugliese@gmail.com>
Mon, 9 Dec 2013 19:40:29 +0000 (13:40 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 9 Dec 2013 21:27:32 +0000 (13:27 -0800)
There is no need to skip querying the config and string descriptors for
unauthorized WUSB devices when usb_new_device is called.  It is allowed
by WUSB spec.  The only action that needs to be delayed until
authorization time is the set config.  This change allows user mode
tools to see the config and string descriptors earlier in enumeration
which is needed for some WUSB devices to function properly on Android
systems.  It also reduces the amount of divergent code paths needed
for WUSB devices.

Signed-off-by: Thomas Pugliese <thomas.pugliese@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/core/config.c
drivers/usb/core/hub.c

index a6b2cabe7930eff53504448ab36d48b8786f3f98..548d1996590f38d8bd1f192c9000cd3dab3eaf9a 100644 (file)
@@ -651,10 +651,6 @@ void usb_destroy_configuration(struct usb_device *dev)
  *
  * hub-only!! ... and only in reset path, or usb_new_device()
  * (used by real hubs and virtual root hubs)
- *
- * NOTE: if this is a WUSB device and is not authorized, we skip the
- *       whole thing. A non-authorized USB device has no
- *       configurations.
  */
 int usb_get_configuration(struct usb_device *dev)
 {
@@ -666,8 +662,6 @@ int usb_get_configuration(struct usb_device *dev)
        struct usb_config_descriptor *desc;
 
        cfgno = 0;
-       if (dev->authorized == 0)       /* Not really an error */
-               goto out_not_authorized;
        result = -ENOMEM;
        if (ncfg > USB_MAXCONFIG) {
                dev_warn(ddev, "too many configurations: %d, "
@@ -751,7 +745,6 @@ int usb_get_configuration(struct usb_device *dev)
 
 err:
        kfree(desc);
-out_not_authorized:
        dev->descriptor.bNumConfigurations = cfgno;
 err2:
        if (result == -ENOMEM)
index a7c04e24ca484deb233db5dcfd995b73427c4cc0..32e1035d4f59d68437b1e529d483198cc4db2018 100644 (file)
@@ -2235,17 +2235,13 @@ static int usb_enumerate_device(struct usb_device *udev)
                        return err;
                }
        }
-       if (udev->wusb == 1 && udev->authorized == 0) {
-               udev->product = kstrdup("n/a (unauthorized)", GFP_KERNEL);
-               udev->manufacturer = kstrdup("n/a (unauthorized)", GFP_KERNEL);
-               udev->serial = kstrdup("n/a (unauthorized)", GFP_KERNEL);
-       } else {
-               /* read the standard strings and cache them if present */
-               udev->product = usb_cache_string(udev, udev->descriptor.iProduct);
-               udev->manufacturer = usb_cache_string(udev,
-                                                     udev->descriptor.iManufacturer);
-               udev->serial = usb_cache_string(udev, udev->descriptor.iSerialNumber);
-       }
+
+       /* read the standard strings and cache them if present */
+       udev->product = usb_cache_string(udev, udev->descriptor.iProduct);
+       udev->manufacturer = usb_cache_string(udev,
+                                             udev->descriptor.iManufacturer);
+       udev->serial = usb_cache_string(udev, udev->descriptor.iSerialNumber);
+
        err = usb_enumerate_device_otg(udev);
        if (err < 0)
                return err;
@@ -2427,16 +2423,6 @@ int usb_deauthorize_device(struct usb_device *usb_dev)
        usb_dev->authorized = 0;
        usb_set_configuration(usb_dev, -1);
 
-       kfree(usb_dev->product);
-       usb_dev->product = kstrdup("n/a (unauthorized)", GFP_KERNEL);
-       kfree(usb_dev->manufacturer);
-       usb_dev->manufacturer = kstrdup("n/a (unauthorized)", GFP_KERNEL);
-       kfree(usb_dev->serial);
-       usb_dev->serial = kstrdup("n/a (unauthorized)", GFP_KERNEL);
-
-       usb_destroy_configuration(usb_dev);
-       usb_dev->descriptor.bNumConfigurations = 0;
-
 out_unauthorized:
        usb_unlock_device(usb_dev);
        return 0;
@@ -2464,17 +2450,7 @@ int usb_authorize_device(struct usb_device *usb_dev)
                goto error_device_descriptor;
        }
 
-       kfree(usb_dev->product);
-       usb_dev->product = NULL;
-       kfree(usb_dev->manufacturer);
-       usb_dev->manufacturer = NULL;
-       kfree(usb_dev->serial);
-       usb_dev->serial = NULL;
-
        usb_dev->authorized = 1;
-       result = usb_enumerate_device(usb_dev);
-       if (result < 0)
-               goto error_enumerate;
        /* Choose and set the configuration.  This registers the interfaces
         * with the driver core and lets interface drivers bind to them.
         */
@@ -2490,7 +2466,6 @@ int usb_authorize_device(struct usb_device *usb_dev)
        }
        dev_info(&usb_dev->dev, "authorized to connect\n");
 
-error_enumerate:
 error_device_descriptor:
        usb_autosuspend_device(usb_dev);
 error_autoresume:
This page took 0.03186 seconds and 5 git commands to generate.