From 69a7ef0f48c24f0acb35970b0237c8e71f6b822f Mon Sep 17 00:00:00 2001 From: Alan Stern Date: Thu, 19 Jul 2007 20:44:51 -0700 Subject: [PATCH] [PATCH] USB: fix warning caused by autosuspend counter going negative This patch (as937) fixes a minor bug in the autosuspend usage-counting code. Each hub's usage counter keeps track of the number of unsuspended children. However the current driver increments the counter after registering a new child, by which time the child may already have been suspended and caused the counter to go negative. The obvious solution is to increment the counter before registering the child. Signed-off-by: Alan Stern Signed-off-by: Greg Kroah-Hartman Signed-off-by: Willy Tarreau --- drivers/usb/core/hub.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 8ddeed37daec5..d5890d57862b4 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -1356,6 +1356,10 @@ static int __usb_new_device(void *void_data) } #endif + /* Increment the parent's count of unsuspended children */ + if (udev->parent) + usb_autoresume_device(udev->parent); + /* Register the device. The device driver is responsible * for adding the device files to usbfs and sysfs and for * configuring the device. @@ -1363,13 +1367,11 @@ static int __usb_new_device(void *void_data) err = device_add (&udev->dev); if (err) { dev_err(&udev->dev, "can't device_add, error %d\n", err); + if (udev->parent) + usb_autosuspend_device(udev->parent); goto fail; } - /* Increment the parent's count of unsuspended children */ - if (udev->parent) - usb_autoresume_device(udev->parent); - exit: module_put(THIS_MODULE); return err; -- 2.47.2