USB: improved error handling in usb_port_suspend()
authorOliver Neukum <oliver@neukum.org>
Mon, 19 Oct 2009 11:19:41 +0000 (13:19 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 11 Dec 2009 19:55:17 +0000 (11:55 -0800)
usb: better error handling in usb_port_suspend

- disable remote wakeup only if it was enabled
- refuse to autosuspend if remote wakeup fails to be enabled

Signed-off-by: Oliver Neukum <oliver@neukum.org>
Cc: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/core/hub.c

index 0f857e6450581159a261fc59d0403b7300fc8b24..2ac115015229620655687507337548151170313f 100644 (file)
@@ -2123,9 +2123,13 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg)
                                USB_DEVICE_REMOTE_WAKEUP, 0,
                                NULL, 0,
                                USB_CTRL_SET_TIMEOUT);
-               if (status)
+               if (status) {
                        dev_dbg(&udev->dev, "won't remote wakeup, status %d\n",
                                        status);
+                       /* bail if autosuspend is requested */
+                       if (msg.event & PM_EVENT_AUTO)
+                               return status;
+               }
        }
 
        /* see 7.1.7.6 */
@@ -2134,7 +2138,8 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg)
                dev_dbg(hub->intfdev, "can't suspend port %d, status %d\n",
                                port1, status);
                /* paranoia:  "should not happen" */
-               (void) usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
+               if (udev->do_remote_wakeup)
+                       (void) usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
                                USB_REQ_CLEAR_FEATURE, USB_RECIP_DEVICE,
                                USB_DEVICE_REMOTE_WAKEUP, 0,
                                NULL, 0,