From stern@rowland.harvard.edu Sat Jul 1 19:13:52 2006 Date: Sat, 1 Jul 2006 22:13:50 -0400 (EDT) From: Alan Stern To: Greg KH Subject: [PATCH 13/15] usbcore: suspending devices with no driver Message-ID: 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 Signed-off-by: Greg Kroah-Hartman --- drivers/usb/core/driver.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) --- gregkh-2.6.orig/drivers/usb/core/driver.c +++ gregkh-2.6/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) {