On a Laptop 16 equipped with an AMD Ryzen 9 7940HS processor and running Zorin OS 18 (Ubuntu/Debian-based), I encountered significant difficulties getting my Dell WD19TBS Thunderbolt dock to work.
Kernel 6.14.0-35-generic
It was recognized only sporadically. I spent my time unplugging/replugging, power-cycling the dock, and rebooting the laptop.
Even when it was listed by boltctl list (which happened randomly), it was shown as “not connected.”
All USB peripherals connected to the monitors—which were themselves plugged into the dock—worked fine (mouse and keyboard via dongle, external webcam, soundbar, etc.).
However, the monitors connected via Mini DP were hit-or-miss. And even when they did manage to work, the behavior when waking from sleep was even more unpredictable.
Searching through the forums yielded no results.
After extensive investigation, I believe I have found the cause. I started, of course, by updating the dock’s firmware using fwupdmgr. But most importantly, what changed everything was a specific BIOS setting.
“USB4 device measured boot” is enabled by default. I disabled it, and since then, I haven’t had a single issue. The dock is stable and operating at full capacity.
After a long investigation, I understood the cause of the random behavior.
The Ryzen “pinksardine” controller that manages the USB4 ports can operate in one of the following four modes: (1) USB4, (2) Thunderbolt Legacy, (3) DisplayPort Alt Mode + USB 3.2, and (4) USB 2 “billboard.”
This controller is a PCIe controller directly connected to the system’s PCIe bus, and it implements USB4 port management. The dock itself also contains PCIe controllers.
Which mode is activated depends on the negotiation phase between the controller and the dock. If you are lucky, Thunderbolt Legacy mode is enabled and provides access to the full potential of the hardware. However, more often, as a safety measure to avoid a kernel panic, DisplayPort Alt Mode + USB 3.2 is selected. This mode is sufficient to drive the displays and the other peripherals of the dock (Ethernet controller, keyboard, mouse), but it does not allow high-throughput operation of storage devices connected directly to the dock. Sometimes, the “last-resort” USB2 mode is selected: in that case there are no displays, only Ethernet/keyboard/mouse.
What determines the selected mode is therefore the handshake phase at boot or when resuming from sleep. On resume from sleep, success or failure is linked to the fact that the pinksardine PCIe controller has been put into deep sleep by the PCI bus power-saving mechanisms (ASPM). As a result, it stops communicating with the dock’s PCIe controllers, which themselves go to sleep and do not wake up quickly enough, causing the handshake to fail and modes 3 or 4 to be activated.
It is possible to disable PCIe controller power saving at the kernel level, but that is too drastic. I am investigating the use of udev rules to disable power saving only for the pinksardine PCIe controller.
I find that to work in USB4 / Thunderbolt mode requires much higher quality cables.
My guess is the stability problem is caused by the cable. Even if the cable came with the Dock.
The bios setting " “USB4 device measured boot” is only needed if you wish the BIOS to boot from the USB4/Thunderbolt device in PCIe tunnel/passthru mode and not USB3.
The cable could be a factor, but in my case I don’t think so, because this dock was fairly stable under Windows 10 on a Dell PC. From time to time I had to reboot the dock, but other than that the behavior was consistent.
After adding udev rules to prevent the pinksardine controller from going to sleep, I do successfully switch to Thunderbolt 3 Legacy mode.
But then I have another problem: only one of the two external monitors is detected.
I’m going to remove the udev rules. DisplayPort Alt Mode + USB 3.2 is sufficient, as I don’t have any storage devices connected to the dock.
There doesn’t seem to be a perfect solution for now. In the future, I’ll consider investing in a USB4 dock (if any are available on the market), or perhaps upgrading the kernel version.