I built usbmon.ko earlier today to take a look at it. While testing it I thought of your problem and following is a method for capturing a USB bus trace on Thor. Linux_for_Tegra/source/kernel/kernel-noble/Documentation/usb/usbmon.rst
usbmon is a software tap in the Linux USB host stack. It records URBs submitted to and completed by the host-controller driver. It is useful for determining how far enumeration progressed and whether a device reappeared on the USB2 or USB3 root hub.
It is not equivalent to a hardware USB protocol analyzer. It does not capture Type-C CC/PD signaling, LFPS, electrical/link-training behavior, or the individual USB packets on the wire.
For your case, it can show:
- The root-hub bus the device enumerated on. On my Thor Bus 2 is the SuperSpeed root hub and Bus 1 is the USB2 high-speed root hub. This makes an SS/SS+ → HS fallback immediately visible.
- The complete host-side control-transfer sequence during enumeration.
- Device, configuration, string, and BOS descriptor requests/responses, if enumeration progresses far enough to retrieve them.
- SuperSpeed/SuperSpeedPlus capability descriptors returned in the BOS descriptor.
- URB completion status, including stalls, timeouts, disconnects, and other errors reported by the host stack.
- The exact sequence of retries and enumeration attempts.
On my JetPack 7.2.1 kernel CONFIG_USB_MON is not set. For a diagnostic kernel, I started with the running kernel configuration and changed only CONFIG_USB_MON to a module.
Native build on Thor using GCC 13.2.0:
cd Linux_for_Tegra/source
# Sync the kernel source to the exact JetPack/L4T release being tested.
./source_sync.sh -k -t # jetson_39.2.1, jetson_39.2_GA, or jetson_38.4
export ARCH=arm64
# Adjust this path for your GCC 13 13.2.0 installation.
export TCBIN="/path/to/gcc-13/bin"
export PATH="$TCBIN:$PATH"
unset CROSS_COMPILE
export CC="$TCBIN/gcc-13"
export HOSTCC="$TCBIN/gcc-13"
export CXX="$TCBIN/g++-13"
export HOSTCXX="$TCBIN/g++-13"
KERNEL_SRC="$PWD/kernel/kernel-noble"
# Start with the configuration of the running JetPack kernel.
zcat /proc/config.gz > "$KERNEL_SRC/.config"
make -C "$KERNEL_SRC" ARCH=arm64 olddefconfig
# Enable CONFIG_USB_MON=m.
"$KERNEL_SRC/scripts/config" \
--file "$KERNEL_SRC/.config" \
--module USB_MON
make -C "$KERNEL_SRC" ARCH=arm64 olddefconfig
grep CONFIG_USB_MON "$KERNEL_SRC/.config"
# Build the kernel and in-tree modules.
make -C kernel -j"$(nproc)"
Install the new usbmon module and test kernel Image:
sudo install -D -m 0644 \
"$KERNEL_SRC/drivers/usb/mon/usbmon.ko" \
"/lib/modules/$RUNREL/updates/drivers/usb/mon/usbmon.ko"
sudo install -m 0644 "$KERNEL_SRC/arch/arm64/boot/Image" /boot/Image-usbmon
sudo depmod -a
Add an extlinux.conf test entry
cat /boot/extlinux/extlinux.conf.
copy the existing primary boot entry
sudo nano /boot/extlinux/extlinux.conf
Paste copied text. Change the label/menu name and kernel Image, for example:
LABEL usbmon
MENU LABEL USBMON test kernel
LINUX /boot/Image-usbmon
INITRD /boot/initrd
APPEND <copy the complete APPEND line from the primary entry>
Reboot and select USBMON test kernel from the extlinux boot menu.
Once booted:
sudo modprobe usbmon
Then:
sudo ls /sys/kernel/debug/usb/usbmon
If needed identify the buses
Linux_for_Tegra/source/kernel/kernel-noble/Documentation/usb/usbmon.rst
usbmon2 records SuperSpeed.
usbmon1 records USB2.
usbmon0 records all usb devices.
Capture the problem. Start the kernel log and leave it running in another terminal:
sudo dmesg -wT | tee usbdmesg.txt
Start the USB capture:
sudo tcpdump \
-i usbmon0 \
-s 0 \
-U \
-w typec_fallback_diagnostic.pcap
While the captures are running, run your USB problem creation sequence.
After the failure has occurred stop tcpdump and the dmesg capture.
Analysis in Wireshark
wireshark typec_fallback_diagnostic.pcap &
A display filter that shows control transfers, including the enumeration sequence:
usb.transfer_type == 2
To show descriptor requests use:
usb.setup.bRequest == 6
usb.transfer_type == 2 || (usb.urb_type == 0x43 && usb.urb_status < 0)
For Nvidia @WayneWWW you could attach:
typec_fallback_diagnostic.pcap
usbdmesg.txt