Re: [RFT] usbcore: Bug fix: system can't suspend with USB3.0 device

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Alan,

I am trying to dig up an old thread and see what happened to the patch.  I
don't have it archived, so I apologize if it doesn't thread correctly.

Cheers,
Don


On Mon, 11 Apr 2011, Sarah Sharp wrote:

> On Sun, Apr 10, 2011 at 08:52:13PM -0400, CAI Qian wrote:
> > Hi Sarah,
> > 
> > The following was output from the serial console during the second
> > hibernate/resume. Does it help?
> > 
> > # echo disk >/sys/power/state 
> > PM: Syncing filesystems ... done.
> > Freezing user space processes ... Apr 10 20:46:36 ibm-x3550m3-03 kernel: PM: Syncing filesystems ... done.
> > (elapsed 0.01 seconds) done.
> > Freezing remaining freezable tasks ... (elapsed 0.01 seconds) done.
> > PM: Preallocating image memory... done (allocated 313188 pages)
> > PM: Allocated 1252752 kbytes in 0.60 seconds (2087.92 MB/s)
> > hub 9-1:1.0: suspend error -16
> 
> I think Alan said that usb9 or hub 9-0 would be the roothub, so hub 9-1 is
> most likely your VIA hub.  The xHCI host was showing up as bus 8 before,
> according to your lsusb output, so on 2.6.39-rc2, the xHCI USB 2.0
> roothub would still be bus8, and the xHCI USB 3.0 roothub would be bus9.
> So the device that is failing is probably the USB 3.0 portion of your
> VIA hub.  Specifically the interface driver is refusing to suspend.
> 
> > pm_op(): usb_dev_freeze+0x0/0x20 returns -16
> 
> usb_dev_freeze() attempts to suspend the USB device, eventually calling
> into khubd's suspend method, hub_suspend().  That looks at all the
> children of the hub, making sure that udev->can_submit isn't set for
> each valid usb_device.  That will return -EBUSY (-16) if a device is
> active.

This resembles a problem reported by Dirk Hohndel back around the time
of LinuxConf-Australia.  There was no follow-up and the proposed patch
was never submitted.  I have included it below so that it can be
tested.

The idea is that when a device is marked as disconnected, the
can_submit flag doesn't get set to 0.  Therefore the test in
hub_suspend() fails, when it ought to succeed.  Since that test hasn't 
found any serious problems in a long time, the easiest solution was to 
remove it.

Alan Stern



Index: usb-2.6/drivers/usb/core/hub.c
===================================================================
--- usb-2.6.orig/drivers/usb/core/hub.c
+++ usb-2.6/drivers/usb/core/hub.c
@@ -2478,21 +2478,6 @@ int usb_port_resume(struct usb_device *u
 static int hub_suspend(struct usb_interface *intf, pm_message_t msg)
 {
 	struct usb_hub		*hub = usb_get_intfdata (intf);
-	struct usb_device	*hdev = hub->hdev;
-	unsigned		port1;
-
-	/* fail if children aren't already suspended */
-	for (port1 = 1; port1 <= hdev->maxchild; port1++) {
-		struct usb_device	*udev;
-
-		udev = hdev->children [port1-1];
-		if (udev && udev->can_submit) {
-			if (!(msg.event & PM_EVENT_AUTO))
-				dev_dbg(&intf->dev, "port %d nyet suspended\n",
-						port1);
-			return -EBUSY;
-		}
-	}
 
 	dev_dbg(&intf->dev, "%s\n", __func__);
 


--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux