summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Stern <stern@rowland.harvard.edu>2008-11-13 21:08:30 +0100
committerGreg Kroah-Hartman <gregkh@suse.de>2009-01-07 18:59:54 +0100
commit6cd132015d92356b1287f6f3377a3ad955b6cf2f (patch)
tree17e1f8ebe36aa69f56e80377cd02875dac2296e2
parentUSB: Allow usbmon as a module even if usbcore is builtin (diff)
downloadlinux-6cd132015d92356b1287f6f3377a3ad955b6cf2f.tar.xz
linux-6cd132015d92356b1287f6f3377a3ad955b6cf2f.zip
USB: announce new devices earlier
This patch (as1166) changes usb_new_device(). Now new devices will be announced in the log _prior_ to being registered; this way the "new device" lines will appear before all the output from driver probing, which seems much more logical. Also, the patch adds a call to usb_stop_pm() to the failure pathway, so that the parent's count of unsuspended children will remain correct if registration fails. In order for this to work properly, the code to increment that count has to be moved forward, before the first point where a failure can occur. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--drivers/usb/core/hub.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index e65881899c8f..ff066edf4dca 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -1636,6 +1636,10 @@ int usb_new_device(struct usb_device *udev)
{
int err;
+ /* Increment the parent's count of unsuspended children */
+ if (udev->parent)
+ usb_autoresume_device(udev->parent);
+
usb_detect_quirks(udev); /* Determine quirks */
err = usb_configure_device(udev); /* detect & probe dev/intfs */
if (err < 0)
@@ -1644,9 +1648,8 @@ int usb_new_device(struct usb_device *udev)
udev->dev.devt = MKDEV(USB_DEVICE_MAJOR,
(((udev->bus->busnum-1) * 128) + (udev->devnum-1)));
- /* Increment the parent's count of unsuspended children */
- if (udev->parent)
- usb_autoresume_device(udev->parent);
+ /* Tell the world! */
+ announce_device(udev);
/* Register the device. The device driver is responsible
* for adding the device files to sysfs and for configuring
@@ -1660,13 +1663,11 @@ int usb_new_device(struct usb_device *udev)
/* put device-specific files into sysfs */
usb_create_sysfs_dev_files(udev);
-
- /* Tell the world! */
- announce_device(udev);
return err;
fail:
usb_set_device_state(udev, USB_STATE_NOTATTACHED);
+ usb_stop_pm(udev);
return err;
}