RE: xhci: suspend/resume issues

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

 



> -----Original Message-----
> From: Don Zickus [mailto:dzickus@xxxxxxxxxx]
> Sent: Wednesday, November 17, 2010 10:29 PM
> To: Sarah Sharp
> Cc: Xu, Andiry; linux-usb@xxxxxxxxxxxxxxx
> Subject: Re: xhci: suspend/resume issues
> 
> On Tue, Nov 16, 2010 at 02:09:10PM -0800, Sarah Sharp wrote:
> > Ok, I think I see what's happening in your log.  It is a software
> > problem.
> >
> > The important bit of information is that if a USB 3.0 device doesn't
> > detect the SuperSpeed terminations, it will switch ports over to the
> > high speed port.  Once it's in High Speed mode, it will only go
looking
> > for SuperSpeed terminations during a device reset.
> >
> > The USB core is used to being able to disable ports, and then later
> > notice a connect change on the disabled port.  But if the USB core
> > attempts to disable a USB 3.0 port, then the SuperSpeed terminations
are
> > turned off, and the device never connects as a SuperSpeed device,
only
> > as a High Speed device.  And that's what happens with your device:
> >
> > I can tell it originally connected on port 1:
> >
> > xhci_hcd 0000:04:00.0: set port reset, actual port 1 status  =
0x1311
> >
> > There's a couple of SCSI commands the device doesn't like during the
PM
> > sync of filesystems, and the device gets reset twice.  But it comes
back
> > fine, so that's not the problem.
> >
> > There's a power loss during suspend (or the BIOS mucked with the
xHCI
> > host controller), and the xHCI host is re-initialized:
> 
> it's a 5 year old Dell box, the BIOS most likely has no idea about the
> xHCI card sitting on its PCIe bus. :-)
> 
> >
> > usb usb6: root hub lost power or was reset
> >
> > At this point, the device has migrated from port 1 (a SuperSpeed
port)
> > to port 3 (a High Speed port):
> >
> > xhci_hcd 0000:04:00.0: get port status, actual port 0 status  =
0x2a0
> > xhci_hcd 0000:04:00.0: Get port status returned 0x100
> > xhci_hcd 0000:04:00.0: get port status, actual port 1 status  =
0x2a0
> > xhci_hcd 0000:04:00.0: Get port status returned 0x100
> > xhci_hcd 0000:04:00.0: get port status, actual port 2 status  =
0x2a0
> > xhci_hcd 0000:04:00.0: Get port status returned 0x100
> > xhci_hcd 0000:04:00.0: get port status, actual port 3 status  =
0x202e1
> > xhci_hcd 0000:04:00.0: Get port status returned 0x10101
> >
> > The USB core is trying to do something sneaky and persist USB
devices
> > across suspend.  But since the original port (port 1) reports a
> > disconnect, it assumes the device isn't there and disables the port:
> >
> > xhci_hcd 0000:04:00.0: disable port, actual port 1 status  = 0x2a0
> >
> > Only then do we get a device disconnect on port 1:
> >
> > xhci_hcd 0000:04:00.0: get port status, actual port 1 status  =
0x280
> > xhci_hcd 0000:04:00.0: Get port status returned 0x100
> > usb 6-2: USB disconnect, address 3
> >
> > The USB core tries to enumerate the device as a High Speed device,
but
> > the device is unresponsive:
> > usb 6-4: device descriptor read/8, error -61
> >
> > The end result is that the USB 3.0 terminations are permanently
> > disabled, and the device is stuck at High Speed.  That would be
> > consistent with your observation that a system reboot is required to
get
> > the device to connect at SuperSpeed again.  I'm not sure if simply
> > unloading the xHCI driver and reloading it would help.
> >
> >
> > The real fix for this is to separate the xHCI roothub into two hubs:
a
> > USB 3.0 hub and a USB 2.0 hub.  This is how an external USB 3.0 hub
> > looks like to the system (two separate devices).  Then on resume, we
can
> > look at the USB 2.0 hub ports first, reset any of the ports that
report
> > a connection, and then deal with USB 3.0 devices that migrated over
from
> > High Speed to SuperSpeed.
> >
> > I've been working on that code, but it's about 700 lines of code
right
> > now, and I'm not done with it, so I don't know if it can make it
into
> > 2.6.37.
> >
> > The simple fix might be to have the xHCI secretly not allow the USB
core
> > to disable ports.  That needs a couple of the patches from my
roothub
> > separation patchset, but it shouldn't be nearly as large.  But I'm
not
> > sure it's going to fix your issue, since the device migrated over to
> > High Speed.  I think that means you'll get the device back at
> > SuperSpeed, but file systems will not persist across suspend.
> >
> > I'll send you the simple patch in a few.
> 
> Ok.  Thanks for all your help.  I'll wait for your patches and try and
> test them quickly.
> 


Don,

Can you specify the model of your Buffalo USB3.0 HDD?
I've tried a Buffalo HD-HXU3 1.0TB USB3.0 HDD, using 2.6.37-rc1 and
force the host controller to re-initialize during S3 resume. Here is the
message of the USB3.0 HDD shows during resume:

[  431.260103] hub 6-0:1.0: port 1: status 8103 change 0005
[  431.370136] usb 6-1: finish reset-resume
[  431.490322] usb 6-1: reset SuperSpeed USB device using xhci_hcd and
address 2

And then it works smoothly. Not sure why it indicates a disconnect in
your case, but if you are using the same HDD with me, then it may not be
the device issue.

Thanks,
Andiry

--
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