From: Alan Stern <[EMAIL PROTECTED]>

Since usb_generic can be unbound from a USB device, we need to be able
to handle the possibility that a suspend or resume request arrives for a
device with no driver.  This patch (as735) arranges things so that
resume requests will fail and suspend requests will use the standard USB
port-suspend code.  Attempts to suspend or resume an unbound interface
are handled similarly (although the error caused by trying to resume an
unbound interface is dropped by the calling routine).


Signed-off-by: Alan Stern <[EMAIL PROTECTED]>
Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]>
---
 drivers/usb/core/driver.c |   19 +++++++++++++++----
 1 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c
index affbfb5..a5d1146 100644
--- a/drivers/usb/core/driver.c
+++ b/drivers/usb/core/driver.c
@@ -761,8 +761,12 @@ static int suspend_device(struct usb_dev
                        udev->state == USB_STATE_SUSPENDED)
                goto done;
 
-       if (udev->dev.driver == NULL)
+       /* For devices that don't have a driver, we do a standard suspend. */
+       if (udev->dev.driver == NULL) {
+               status = usb_port_suspend(udev);
                goto done;
+       }
+
        udriver = to_usb_device_driver(udev->dev.driver);
        status = udriver->suspend(udev, msg);
 
@@ -782,8 +786,12 @@ static int resume_device(struct usb_devi
                        udev->state != USB_STATE_SUSPENDED)
                goto done;
 
-       if (udev->dev.driver == NULL)
+       /* Can't resume it if it doesn't have a driver. */
+       if (udev->dev.driver == NULL) {
+               status = -ENOTCONN;
                goto done;
+       }
+
        udriver = to_usb_device_driver(udev->dev.driver);
        status = udriver->resume(udev);
 
@@ -804,7 +812,7 @@ static int suspend_interface(struct usb_
                        !is_active(intf))
                goto done;
 
-       if (intf->dev.driver == NULL)
+       if (intf->dev.driver == NULL)           /* This can't happen */
                goto done;
        driver = to_usb_driver(intf->dev.driver);
 
@@ -838,8 +846,11 @@ static int resume_interface(struct usb_i
                        is_active(intf))
                goto done;
 
-       if (intf->dev.driver == NULL)
+       /* Can't resume it if it doesn't have a driver. */
+       if (intf->dev.driver == NULL) {
+               status = -ENOTCONN;
                goto done;
+       }
        driver = to_usb_driver(intf->dev.driver);
 
        if (driver->resume) {
-- 
1.4.2.1


-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
linux-usb-devel@lists.sourceforge.net
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to