ChangeSet 1.1119.1.7, 2003/08/06 15:51:29-07:00, [EMAIL PROTECTED]

[PATCH] USB: usb_new_device() updates

Changes a handful of things in enumeration error paths.

Bugfixes:
  - consistent cleanup, and consistent return of -Ewhatever/0;
  - a usb_put_dev() gets rid of the extra refcount; this
    one's in bugzilla at osdl.

Diagnostics:
  - new diagnostic for when there's a choice of configurations;
  - merges some diagnostics, for slight rodata reduction.


 drivers/usb/core/usb.c |   56 +++++++++++++++++++++----------------------------
 1 files changed, 25 insertions(+), 31 deletions(-)


diff -Nru a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
--- a/drivers/usb/core/usb.c    Fri Aug  8 17:05:42 2003
+++ b/drivers/usb/core/usb.c    Fri Aug  8 17:05:42 2003
@@ -994,7 +994,7 @@
 #define SET_ADDRESS_RETRYS     2
 int usb_new_device(struct usb_device *dev, struct device *parent)
 {
-       int err = 0;
+       int err = -EINVAL;
        int i;
        int j;
 
@@ -1036,7 +1036,7 @@
                i = 8;
                break;
        default:
-               return -EINVAL;
+               goto fail;
        }
        dev->epmaxpacketin [0] = i;
        dev->epmaxpacketout[0] = i;
@@ -1050,12 +1050,10 @@
                        wait_ms(200);
                }
                if (err < 0) {
-                       dev_err(&dev->dev, "USB device not accepting new address=%d 
(error=%d)\n",
+                       dev_err(&dev->dev,
+                               "device not accepting address %d, error %d\n",
                                dev->devnum, err);
-                       dev->state = USB_STATE_DEFAULT;
-                       clear_bit(dev->devnum, dev->bus->devmap.devicemap);
-                       dev->devnum = -1;
-                       return 1;
+                       goto fail;
                }
 
                wait_ms(10);    /* Let the SET_ADDRESS settle */
@@ -1068,13 +1066,8 @@
        }
 
        if (err < 8) {
-               if (err < 0)
-                       dev_err(&dev->dev, "USB device not responding, giving up 
(error=%d)\n", err);
-               else
-                       dev_err(&dev->dev, "USB device descriptor short read (expected 
%i, got %i)\n", 8, err);
-               clear_bit(dev->devnum, dev->bus->devmap.devicemap);
-               dev->devnum = -1;
-               return 1;
+               dev_err(&dev->dev, "device descriptor read/8, error %d\n", err);
+               goto fail;
        }
        if (dev->speed == USB_SPEED_FULL) {
                dev->epmaxpacketin [0] = dev->descriptor.bMaxPacketSize0;
@@ -1085,34 +1078,29 @@
 
        err = usb_get_device_descriptor(dev);
        if (err < (signed)sizeof(dev->descriptor)) {
-               if (err < 0)
-                       dev_err(&dev->dev, "unable to get device descriptor 
(error=%d)\n", err);
-               else
-                       dev_err(&dev->dev, "USB device descriptor short read (expected 
%Zi, got %i)\n",
-                               sizeof(dev->descriptor), err);
-       
-               clear_bit(dev->devnum, dev->bus->devmap.devicemap);
-               dev->devnum = -1;
-               return 1;
+               dev_err(&dev->dev, "device descriptor read/all, error %d\n", err);
+               goto fail;
        }
 
        err = usb_get_configuration(dev);
        if (err < 0) {
                dev_err(&dev->dev, "unable to get device %d configuration 
(error=%d)\n",
                        dev->devnum, err);
-               clear_bit(dev->devnum, dev->bus->devmap.devicemap);
-               dev->devnum = -1;
-               return 1;
+               goto fail;
        }
 
-       /* we set the default configuration here */
+       /* choose and set the configuration here */
+       if (dev->descriptor.bNumConfigurations != 1) {
+               dev_info(&dev->dev,
+                       "configuration #%d chosen from %d choices\n",
+                       dev->config[0].desc.bConfigurationValue,
+                       dev->descriptor.bNumConfigurations);
+       }
        err = usb_set_configuration(dev, dev->config[0].desc.bConfigurationValue);
        if (err) {
                dev_err(&dev->dev, "failed to set device %d default configuration 
(error=%d)\n",
                        dev->devnum, err);
-               clear_bit(dev->devnum, dev->bus->devmap.devicemap);
-               dev->devnum = -1;
-               return 1;
+               goto fail;
        }
 
        /* USB device state == configured ... tell the world! */
@@ -1132,7 +1120,7 @@
        /* put into sysfs, with device and config specific files */
        err = device_add (&dev->dev);
        if (err)
-               return err;
+               goto fail;
        usb_create_driverfs_dev_files (dev);
 
        /* Register all of the interfaces for this device with the driver core.
@@ -1158,6 +1146,12 @@
        usbfs_add_device(dev);
 
        return 0;
+fail:
+       dev->state = USB_STATE_DEFAULT;
+       clear_bit(dev->devnum, dev->bus->devmap.devicemap);
+       dev->devnum = -1;
+       usb_put_dev(dev);
+       return err;
 }
 
 /**



-------------------------------------------------------
This SF.Net email sponsored by: Free pre-built ASP.NET sites including
Data Reports, E-commerce, Portals, and Forums are available now.
Download today and enter to win an XBOX or Visual Studio .NET.
http://aspnet.click-url.com/go/psa00100003ave/direct;at.aspnet_072303_01/01
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to