Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 03 Jun 2014 18:58:16 +0200
From:      Hans Petter Selasky <hps@selasky.org>
To:        sbruno@freebsd.org
Cc:        freebsd-usb@freebsd.org
Subject:   Re: Lenovo T61, USB fails to power on after resume
Message-ID:  <538DFEA8.3090607@selasky.org>
In-Reply-To: <1401813374.1114.0.camel@bruno>
References:  <1401807398.96874.3.camel@bruno> <538DEFD3.2010406@selasky.org> <1401813374.1114.0.camel@bruno>

next in thread | previous in thread | raw e-mail | index | archive | help
On 06/03/14 18:36, Sean Bruno wrote:
> On Tue, 2014-06-03 at 17:54 +0200, Hans Petter Selasky wrote:
>> On 06/03/14 16:56, Sean Bruno wrote:
>>> Noted that on resume, the USB ports on my T61 don't seem to be active.
>>>
>>> How should I go about debugging this?
>>>
>>> sean
>>
>> Hi,
>>
>> The USB stack performs the same EHCI/OHCI/UHCI/XHCI reset which is does
>> during power on, when it resumes. Ensure the ports are powered.  +5V.
>> Might be a BIOS/PCI/ACPI issue.
>>
>> --HPS
>>
>
>
> Is there something in the output of usbconfig that I can poke at to see
> if the hardware *thinks* it is powered on?
>
> sean
>
>

Yes, there is the port status.

struct usb_port_status {
         uWord   wPortStatus;
#define UPS_CURRENT_CONNECT_STATUS      0x0001
#define UPS_PORT_ENABLED                0x0002
#define UPS_SUSPEND                     0x0004
#define UPS_OVERCURRENT_INDICATOR       0x0008
#define UPS_RESET                       0x0010
#define UPS_PORT_L1                     0x0020  /* USB 2.0 only */
/* The link-state bits are valid for Super-Speed USB HUBs */
#define UPS_PORT_LINK_STATE_GET(x)      (((x) >> 5) & 0xF)
#define UPS_PORT_LINK_STATE_SET(x)      (((x) & 0xF) << 5)
#define UPS_PORT_LS_U0          0x00
#define UPS_PORT_LS_U1          0x01
#define UPS_PORT_LS_U2          0x02
#define UPS_PORT_LS_U3          0x03
#define UPS_PORT_LS_SS_DIS      0x04
#define UPS_PORT_LS_RX_DET      0x05
#define UPS_PORT_LS_SS_INA      0x06
#define UPS_PORT_LS_POLL        0x07
#define UPS_PORT_LS_RECOVER     0x08
#define UPS_PORT_LS_HOT_RST     0x09
#define UPS_PORT_LS_COMP_MODE   0x0A
#define UPS_PORT_LS_LOOPBACK    0x0B
#define UPS_PORT_LS_RESUME      0x0F
#define UPS_PORT_POWER                  0x0100
#define UPS_PORT_POWER_SS               0x0200  /* super-speed only */
#define UPS_LOW_SPEED                   0x0200
#define UPS_HIGH_SPEED                  0x0400
#define UPS_OTHER_SPEED                 0x0600  /* currently FreeBSD 
specific */
#define UPS_PORT_TEST                   0x0800
#define UPS_PORT_INDICATOR              0x1000
#define UPS_PORT_MODE_DEVICE            0x8000  /* currently FreeBSD 
specific */
         uWord   wPortChange;
#define UPS_C_CONNECT_STATUS            0x0001
#define UPS_C_PORT_ENABLED              0x0002
#define UPS_C_SUSPEND                   0x0004
#define UPS_C_OVERCURRENT_INDICATOR     0x0008
#define UPS_C_PORT_RESET                0x0010
#define UPS_C_PORT_L1                   0x0020  /* USB 2.0 only */
#define UPS_C_BH_PORT_RESET             0x0020  /* USB 3.0 only */
#define UPS_C_PORT_LINK_STATE           0x0040
#define UPS_C_PORT_CONFIG_ERROR         0x0080
} __packed;

It is probed regularly by the UHUB driver and the port status is printed 
in dmesg.

Turn on like this:

sysctl hw.usb.uhub.debug=16

By resetting the root HUB, you can write new power on bits:

usbconfig -d X.1 set_config 255
usbconfig -d X.1 set_config 0

--HPS



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?538DFEA8.3090607>