Commit 1c5df7e7 authored by Alan Stern's avatar Alan Stern Committed by Greg Kroah-Hartman

usbcore: suspending devices with no driver

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: default avatarAlan Stern <stern@rowland.harvard.edu>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 114b368c
...@@ -761,8 +761,12 @@ static int suspend_device(struct usb_device *udev, pm_message_t msg) ...@@ -761,8 +761,12 @@ static int suspend_device(struct usb_device *udev, pm_message_t msg)
udev->state == USB_STATE_SUSPENDED) udev->state == USB_STATE_SUSPENDED)
goto done; 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; goto done;
}
udriver = to_usb_device_driver(udev->dev.driver); udriver = to_usb_device_driver(udev->dev.driver);
status = udriver->suspend(udev, msg); status = udriver->suspend(udev, msg);
...@@ -782,8 +786,12 @@ static int resume_device(struct usb_device *udev) ...@@ -782,8 +786,12 @@ static int resume_device(struct usb_device *udev)
udev->state != USB_STATE_SUSPENDED) udev->state != USB_STATE_SUSPENDED)
goto done; 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; goto done;
}
udriver = to_usb_device_driver(udev->dev.driver); udriver = to_usb_device_driver(udev->dev.driver);
status = udriver->resume(udev); status = udriver->resume(udev);
...@@ -804,7 +812,7 @@ static int suspend_interface(struct usb_interface *intf, pm_message_t msg) ...@@ -804,7 +812,7 @@ static int suspend_interface(struct usb_interface *intf, pm_message_t msg)
!is_active(intf)) !is_active(intf))
goto done; goto done;
if (intf->dev.driver == NULL) if (intf->dev.driver == NULL) /* This can't happen */
goto done; goto done;
driver = to_usb_driver(intf->dev.driver); driver = to_usb_driver(intf->dev.driver);
...@@ -838,8 +846,11 @@ static int resume_interface(struct usb_interface *intf) ...@@ -838,8 +846,11 @@ static int resume_interface(struct usb_interface *intf)
is_active(intf)) is_active(intf))
goto done; 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; goto done;
}
driver = to_usb_driver(intf->dev.driver); driver = to_usb_driver(intf->dev.driver);
if (driver->resume) { if (driver->resume) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment