USB notes

USB-C device on a Thunderbolt port

On the Thinkpad T480 the USB-C port is a Thunderbolt 3 port as well. If there is nothing plugged in at boot you will not notice. If you later plug in a USB-C device (I have an external multi-Hub-device with USB3/USB2/Audio/Ethernet) I get 4 PCI Bridge devices and an XHCI device (as can be observed in pciconf -l).

The problem is on unplug: all the devices and hubs detach, but the uhub0 (the root hub) comes back as the XHCI device does not vanish. The T480's UEFI firmware does not allow us to manage PCIe HotPlug (by default or any UEFI menu settings I could find) so that is no help. Further the PCI XHCI device is no longer fully functional. Capabilities are no longer listed and the BAR seems to return all-0xff. This means that a root-HUB remaining with 4 ports on a not really working controllers somehow survives and keeps a tight enumeration loop of locking and sleeping over all 4 ports, also keeping one of the USB locks held rendering the rest of the USB semi-unusable (usbconfig will hang forever, etc). See some trace below after applying the patch I submitted to https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=237666.

Possible workaround. The only thing I found which mostly works is tho use devctl detach xhci0 (xhci0 in my case) before unplugging.

There is some hope that with the Thunderbolt work this problem will vanish.

Trace

Later end of the detach (from unplugging based on memory) with a slightly instrumented kernel. I ran the output through uniq to save us most duplicate lines. I also broke the sequence up with empty lines below to show the various stages.

   1 ...
   1 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 ugen0.2: <GenesysLogic USB2.1 Hub> at usbus0 (disconnected)
   1 uhub1: at uhub0, port 1, addr 1 (disconnected)
   1 ugen0.3: <vendor 0x1a40 USB 2.0 Hub> at usbus0 (disconnected)
   1 uhub2: at uhub1, port 3, addr 2 (disconnected)
   1 ugen0.4: <Fresco Logic, Inc Generic Billboard Device> at usbus0 (disconnected)
   1 ugen0.5: <vendor 0x1a40 USB 2.0 Hub> at usbus0 (disconnected)
   1 uhub3: at uhub2, port 2, addr 4 (disconnected)
   1 ugen0.6: <CT EarPodsTC01K3L> at usbus0 (disconnected)
   1 uaudio0: at uhub3, port 2, addr 5 (disconnected)
   1 pcm3: detached
   1 uaudio0: detached
   1 uhub3: detached
   1 xhci0: Resetting controller
   1 uhub2: detached
   1 uhub1: detached
   6 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 XXX-BZ usbd_req_reset_port:810: udev 0xfffff800066d2000 mtx 0 port 1 timo 49
   4 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 XXX-BZ usbd_req_reset_port:853: udev 0xfffff800066d2000 mtx 0 port 1 timo 245
  10 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 XXX-BZ usbd_req_reset_port:810: udev 0xfffff800066d2000 mtx 0 port 1 timo 49
   4 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 XXX-BZ usbd_req_reset_port:853: udev 0xfffff800066d2000 mtx 0 port 1 timo 245
  22 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 XXX-BZ usbd_req_reset_port:810: udev 0xfffff800066d2000 mtx 0 port 2 timo 49
   4 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 XXX-BZ usbd_req_reset_port:853: udev 0xfffff800066d2000 mtx 0 port 2 timo 245
  10 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 XXX-BZ usbd_req_reset_port:810: udev 0xfffff800066d2000 mtx 0 port 2 timo 49
   4 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 XXX-BZ usbd_req_reset_port:853: udev 0xfffff800066d2000 mtx 0 port 2 timo 245
  16 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 ugen0.7: <GenesysLogic USB3.1 Hub> at usbus0 (disconnected)
   1 uhub4: at uhub0, port 3, addr 6 (disconnected)
   1 ugen0.8: <Realtek USB 10/100/1000 LAN> at usbus0 (disconnected)
   1 ure0: at uhub4, port 4, addr 7 (disconnected)
   1 rgephy0: detached
   1 miibus0: detached
   1 ure0: detached
   1 uhub4: detached
   6 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 XXX-BZ usbd_req_reset_port:810: udev 0xfffff800066d2000 mtx 0 port 3 timo 49
   4 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 XXX-BZ usbd_req_reset_port:853: udev 0xfffff800066d2000 mtx 0 port 3 timo 245
  10 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 XXX-BZ usbd_req_reset_port:810: udev 0xfffff800066d2000 mtx 0 port 3 timo 49
   4 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 XXX-BZ usbd_req_reset_port:853: udev 0xfffff800066d2000 mtx 0 port 3 timo 245
  22 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 XXX-BZ usbd_req_reset_port:810: udev 0xfffff800066d2000 mtx 0 port 4 timo 49
   4 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 XXX-BZ usbd_req_reset_port:853: udev 0xfffff800066d2000 mtx 0 port 4 timo 245
  10 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 XXX-BZ usbd_req_reset_port:810: udev 0xfffff800066d2000 mtx 0 port 4 timo 49
   4 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 XXX-BZ usbd_req_reset_port:853: udev 0xfffff800066d2000 mtx 0 port 4 timo 245
   8 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   2 usbd_enum_lock:2900 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 uhub0: at usbus0, port 1, addr 1 (disconnected)
   1 uhub0: detached


   2 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 xhci0: Controller reset timeout: 0x802 (0x2 | 0x800) called from xhci_set_hw_power_sleep:722
   1 KDB: stack backtrace:
   1 db_trace_self_wrapper() at db_trace_self_wrapper+0x2b/frame 0xfffffe013d1719e0
   1 _xhci_reset_controller() at _xhci_reset_controller+0x10b/frame 0xfffffe013d171a20
   1 usb_bus_suspend() at usb_bus_suspend+0x13c/frame 0xfffffe013d171a50
   1 usb_bus_reset() at usb_bus_reset+0x2c/frame 0xfffffe013d171a70
   1 usb_process() at usb_process+0x106/frame 0xfffffe013d171ab0
   1 fork_exit() at fork_exit+0x7e/frame 0xfffffe013d171af0
   1 fork_trampoline() at fork_trampoline+0xe/frame 0xfffffe013d171af0
   1 --- trap 0, rip = 0, rsp = 0, rbp = 0 ---
   1 xhci0: Controller reset timeout: 0x802 (0x2 | 0x800) called from xhci_start_controller:375
   1 KDB: stack backtrace:
   1 db_trace_self_wrapper() at db_trace_self_wrapper+0x2b/frame 0xfffffe013d171990
   1 _xhci_reset_controller() at _xhci_reset_controller+0x10b/frame 0xfffffe013d1719d0
   1 xhci_start_controller() at xhci_start_controller+0x38/frame 0xfffffe013d171a40
   1 usb_bus_resume() at usb_bus_resume+0x14a/frame 0xfffffe013d171a70
   1 usb_process() at usb_process+0x106/frame 0xfffffe013d171ab0
   1 fork_exit() at fork_exit+0x7e/frame 0xfffffe013d171af0
   1 fork_trampoline() at fork_trampoline+0xe/frame 0xfffffe013d171af0
   1 --- trap 0, rip = 0, rsp = 0, rbp = 0 ---
   2 usbd_enum_lock:2900 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   6 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 usbd_enum_lock:2900 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1


   1 uhub0 on usbus0
   2 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 uhub0: <0x8086 XHCI root HUB, class 9/0, rev 3.00/1.00, addr 1> on usbus0
  10 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 uhub0: 4 ports with 0 removable, self powered


  14 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 XXX-BZ usbd_req_reset_port:810: udev 0xfffff800066d2000 mtx 0 port 1 timo 49
   4 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 XXX-BZ usbd_req_reset_port:853: udev 0xfffff800066d2000 mtx 0 port 1 timo 245
  10 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 XXX-BZ usbd_req_reset_port:810: udev 0xfffff800066d2000 mtx 0 port 1 timo 49
   4 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 XXX-BZ usbd_req_reset_port:853: udev 0xfffff800066d2000 mtx 0 port 1 timo 245
  22 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 XXX-BZ usbd_req_reset_port:810: udev 0xfffff800066d2000 mtx 0 port 2 timo 49
   4 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 XXX-BZ usbd_req_reset_port:853: udev 0xfffff800066d2000 mtx 0 port 2 timo 245
  10 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 XXX-BZ usbd_req_reset_port:810: udev 0xfffff800066d2000 mtx 0 port 2 timo 49
   4 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 XXX-BZ usbd_req_reset_port:853: udev 0xfffff800066d2000 mtx 0 port 2 timo 245
  22 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 XXX-BZ usbd_req_reset_port:810: udev 0xfffff800066d2000 mtx 0 port 3 timo 49
   4 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 XXX-BZ usbd_req_reset_port:853: udev 0xfffff800066d2000 mtx 0 port 3 timo 245
  10 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 XXX-BZ usbd_req_reset_port:810: udev 0xfffff800066d2000 mtx 0 port 3 timo 49
   4 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 XXX-BZ usbd_req_reset_port:853: udev 0xfffff800066d2000 mtx 0 port 3 timo 245
  22 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 XXX-BZ usbd_req_reset_port:810: udev 0xfffff800066d2000 mtx 0 port 4 timo 49
   4 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 XXX-BZ usbd_req_reset_port:853: udev 0xfffff800066d2000 mtx 0 port 4 timo 245
  10 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 XXX-BZ usbd_req_reset_port:810: udev 0xfffff800066d2000 mtx 0 port 4 timo 49
   4 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1
   1 XXX-BZ usbd_req_reset_port:853: udev 0xfffff800066d2000 mtx 0 port 4 timo 245
  12 usbd_enum_is_locked:2992 td 0xfffffe013e24a1e0 (usbus0) udev 0xfffff800066d2000 name ugen0.1

BjoernZeeb/USB (last edited 2021-05-19T15:35:17+0000 by BjoernZeeb)