On Tue, 7 Jan 2025 14:29:35 +0200, Mathias Nyman wrote:
Does disabling USB2 hardware LPM for the device make it work again?
Adding USB_QUIRK_NO_LPM quirk "k" for your device vid:pid should do it. i.e. add "usbcore.quirks=0fce:0dde:k" parameter to your kernel cmdline.
That fixed my test case on Debian kernel 6.12.8-amd64, which is among those that have been failing.
Or alternatively disable usb2 lpm during runtime via sysfs (after enumeration, assuming device is "1-3" as in the log): # echo 0 > /sys/bus/usb/devices/1-3/power/usb2_hardware_lpm
That did not fix it. Maybe it's too late once the device is connected and enumerated?
If those work then we need to figure out if we incorrectly try to enable USB2 hardware LPM, or if device just can't handle LPM even if it claims to be LPM capable.
Host hardware LPM capability can be checked from xhci reg-ext-protocol fields from debugfs. cat /sys/kernel/debug/usb/xhci/0000:0c:00.0/reg-ext-protocol:* (please print content of _all_ reg_ext_protocol* files, LPM capability is bit 19 of EXTCAP_PORTINFO)
# cd /sys/kernel/debug/usb/xhci/0000:0c:00.0/ # grep . reg-ext-protocol:* reg-ext-protocol:00:EXTCAP_REVISION = 0x03200802 reg-ext-protocol:00:EXTCAP_NAME = 0x20425355 reg-ext-protocol:00:EXTCAP_PORTINFO = 0x40000101 reg-ext-protocol:00:EXTCAP_PORTTYPE = 0x00000000 reg-ext-protocol:00:EXTCAP_MANTISSA1 = 0x00050134 reg-ext-protocol:00:EXTCAP_MANTISSA2 = 0x000a4135 reg-ext-protocol:00:EXTCAP_MANTISSA3 = 0x000a4136 reg-ext-protocol:00:EXTCAP_MANTISSA4 = 0x00144137 reg-ext-protocol:01:EXTCAP_REVISION = 0x03100802 reg-ext-protocol:01:EXTCAP_NAME = 0x20425355 reg-ext-protocol:01:EXTCAP_PORTINFO = 0x20000402 reg-ext-protocol:01:EXTCAP_PORTTYPE = 0x00000000 reg-ext-protocol:01:EXTCAP_MANTISSA1 = 0x00050134 reg-ext-protocol:01:EXTCAP_MANTISSA2 = 0x000a4135 reg-ext-protocol:02:EXTCAP_REVISION = 0x02000802 reg-ext-protocol:02:EXTCAP_NAME = 0x20425355 reg-ext-protocol:02:EXTCAP_PORTINFO = 0x00190c06 reg-ext-protocol:02:EXTCAP_PORTTYPE = 0x00000000
# grep EXTCAP_PORTINFO reg-ext-protocol:* reg-ext-protocol:00:EXTCAP_PORTINFO = 0x40000101 reg-ext-protocol:01:EXTCAP_PORTINFO = 0x20000402 reg-ext-protocol:02:EXTCAP_PORTINFO = 0x00190c06
bool(0x40000101 & 1 << 19)
False
bool(0x20000402 & 1 << 19)
False
bool(0x00190c06 & 1 << 19)
True
Device USB2 LPM capability can be checked from the devices BOS descriptor, visible (as sudo/root) with lsusb -v -d 0fce:0dde
# lsusb -v -d 0fce:0dde |grep -B 5 LPM USB 2.0 Extension Device Capability: bLength 7 bDescriptorType 16 bDevCapabilityType 2 bmAttributes 0x00000006 BESL Link Power Management (LPM) Supported
I think that says the device claims support for LPM, yes?
Maybe relevant: The failing test and lsusb were both run with the device in fastboot mode, which allows talking to the bootloader. Is it possible that a device would support LPM in normal operating modes, but not in bootloader mode, yet present the same capabilities data structure in both modes?