Skip to content

Commit

Permalink
usbcore: suspending devices with no driver
Browse files Browse the repository at this point in the history
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 <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
Alan Stern authored and Greg Kroah-Hartman committed Sep 27, 2006
1 parent 114b368 commit 1c5df7e
Showing 1 changed file with 15 additions and 4 deletions.
19 changes: 15 additions & 4 deletions drivers/usb/core/driver.c
Original file line number Diff line number Diff line change
Expand Up @@ -761,8 +761,12 @@ static int suspend_device(struct usb_device *udev, pm_message_t msg)
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);

Expand All @@ -782,8 +786,12 @@ static int resume_device(struct usb_device *udev)
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);

Expand All @@ -804,7 +812,7 @@ static int suspend_interface(struct usb_interface *intf, pm_message_t msg)
!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);

Expand Down Expand Up @@ -838,8 +846,11 @@ static int resume_interface(struct usb_interface *intf)
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) {
Expand Down

0 comments on commit 1c5df7e

Please sign in to comment.