Wednesday, 15 December 2021

Dell TB16 docking station with Dell XPS/Fedora 35

With the Thunderbolt enabled laptop there are now more options available to integrate with your different workspaces; a docking station is one that has been a business staple for a long time but a lot of enterprise solutions are pricey but legacy and decontinued solutions exist, such as the Dell TB16 but do they perform?

Using a Dell XPS 9305 we have already seen options for expanding connectivity and connecting to peripherals that we take for granted: wired networks, usb mice and external monitors. We have seen that a Dell DA310 and other hdmi-enabled multi mini UGreen are successful partners.

Whilst these mini adapters and hubs work and very portable, there are messy. Using a dedicated docking station like the Dell TB16 is still a good option for a stable desk environment where monitors and network ports are consistent.

The TB16 works fine with Fedora 35/5.15.6 kernel - the network adptor is the same chipset (RTL8153) as the DA310, the displayport (full and mini) as well as hdmi ports are recognised and can drive 1980x monitors happily and the USB 3.1 hub works for connecting various devices, incl mice, keyboards, webcams and 2.5" HDD.

However, its fair to say that the TB16 isn't a well loved product with many reported issues with network and USB dropouts, monitor connectivity problems. For my device, it appears to already be on the 1.0.2 firmware and thus my experiences are based on this.
$ fwupdmgr get-devices ... ├─Thunderbolt Cable: │ Device ID: 2315cbb258f43caf4677117e8dfbb6ce68f60f88 │ Current version: 16.00 │ Vendor: Dell (THUNDERBOLT:0x00D4, TBT:0x00D4) │ GUIDs: 99102381-23e8-5ff5-9767-8bcda2aaa864 ← THUNDERBOLT\VEN_00D4&DEV_B051&REV_00 │ 6634407c-6706-5fe9-907e-37efcbc8098a ← THUNDERBOLT\VEN_00D4&DEV_B051 │ b4fd3cdf-4e3a-5090-a583-45367cfd6421 ← TBT-00d4b051 │ 8564922d-2c7a-5169-9cff-d3e73f0bd807 ← TBT-00d4b051-controller0-1 │ Device Flags: • Updatable │ • System requires external power source │ • Device stages updates │ ├─Thunderbolt Dock: │ Device ID: c9f174d381c66aab3dea447decfe5df418a2d22f │ Current version: 16.00 │ Vendor: Dell (THUNDERBOLT:0x00D4, TBT:0x00D4) │ GUIDs: 8e801c01-c7bf-5de2-85e3-185b2afe3b10 ← THUNDERBOLT\VEN_00D4&DEV_B054&REV_00 │ 1fa96dfa-7407-50b2-87d4-4ae4351c3867 ← THUNDERBOLT\VEN_00D4&DEV_B054 │ 76cc74d4-f062-5b93-a11c-8d2a58a25848 ← TBT-00d4b054 │ f5a71973-58f2-5638-9c9a-d9c7538d6772 ← TBT-00d4b054-controller0-301 │ Device Flags: • Updatable │ • System requires external power source │ • Device stages updates
Checking firmware updates for the TB16 dock with fwupdmgr get-updates c9f174d381c66aab3dea447decfe5df418a2d22f reports there is nothing available from LVFS, although others report version 27 is available.

Network

I use the TB16's network port as my primary connection with the XPS 9305 - the interface is bonded with the internal wifi; this does mean that I do not notice network dropouts as much as I could but I have noticed on some odd occassions that the wired connection will be lost and at some point come back. The desktop switch that is the other end shows a solid green (1000M) link at this point.

Very occassionally the network interface comes up at 100mbit rather than the 1000mbit; forcing ethtool -s enp87s0u1u2 speed 1000 duplex full fixes this as a one off but there are other options (see below).
Previously the 4.x kernel had problems which resulted in packet corruption but this was resolved and does not appear to the cause of the very occassional network drop outs. Limited testing shows that the drop outs tend to be clustered together:
Dec 14 09:44:31 xps kernel: bond0: (slave enp87s0u1u2): link status definitely down, disabling slave Dec 14 09:44:31 xps kernel: bond0: (slave wlp164s0): making interface the new active one Dec 14 09:44:34 xps kernel: bond0: (slave enp87s0u1u2): link status up, enabling it in 200 ms Dec 14 09:44:34 xps kernel: bond0: (slave enp87s0u1u2): invalid new link 3 on slave Dec 14 09:44:35 xps kernel: bond0: (slave enp87s0u1u2): link status definitely up, 1000 Mbps full duplex Dec 14 09:44:35 xps kernel: bond0: (slave enp87s0u1u2): making interface the new active one Dec 14 09:44:35 xps kernel: bond0: (slave enp87s0u1u2): link status definitely down, disabling slave Dec 14 09:44:35 xps kernel: bond0: (slave wlp164s0): making interface the new active one Dec 14 09:44:38 xps kernel: bond0: (slave enp87s0u1u2): link status up, enabling it in 200 ms Dec 14 09:44:38 xps kernel: bond0: (slave enp87s0u1u2): invalid new link 3 on slave Dec 14 09:44:39 xps kernel: bond0: (slave enp87s0u1u2): link status definitely up, 1000 Mbps full duplex Dec 14 09:44:39 xps kernel: bond0: (slave enp87s0u1u2): making interface the new active one Dec 14 09:44:39 xps kernel: bond0: (slave enp87s0u1u2): link status definitely down, disabling slave Dec 14 09:44:39 xps kernel: bond0: (slave wlp164s0): making interface the new active one Dec 14 09:44:42 xps kernel: bond0: (slave enp87s0u1u2): link status up, enabling it in 200 ms Dec 14 09:44:42 xps kernel: bond0: (slave enp87s0u1u2): invalid new link 3 on slave Dec 14 09:44:42 xps kernel: bond0: (slave enp87s0u1u2): link status definitely up, 1000 Mbps full duplex Dec 14 09:44:42 xps kernel: bond0: (slave enp87s0u1u2): making interface the new active one ... Dec 14 10:13:05 xps kernel: bond0: (slave enp87s0u1u2): link status definitely down, disabling slave Dec 14 10:13:05 xps kernel: bond0: (slave wlp164s0): making interface the new active one Dec 14 10:13:13 xps kernel: bond0: (slave enp87s0u1u2): link status up, enabling it in 200 ms Dec 14 10:13:13 xps kernel: bond0: (slave enp87s0u1u2): invalid new link 3 on slave Dec 14 10:13:13 xps kernel: bond0: (slave enp87s0u1u2): link status definitely up, 1000 Mbps full duplex Dec 14 10:13:13 xps kernel: bond0: (slave enp87s0u1u2): making interface the new active one Dec 14 10:13:13 xps kernel: bond0: (slave enp87s0u1u2): link status definitely down, disabling slave Dec 14 10:13:13 xps kernel: bond0: (slave wlp164s0): making interface the new active one Dec 14 10:13:21 xps kernel: bond0: (slave enp87s0u1u2): link status up, enabling it in 200 ms Dec 14 10:13:21 xps kernel: bond0: (slave enp87s0u1u2): invalid new link 3 on slave Dec 14 10:13:21 xps kernel: bond0: (slave enp87s0u1u2): link status definitely up, 1000 Mbps full duplex Dec 14 10:13:21 xps kernel: bond0: (slave enp87s0u1u2): making interface the new active one Dec 14 10:13:22 xps kernel: bond0: (slave enp87s0u1u2): link status definitely down, disabling slave Dec 14 10:13:22 xps kernel: bond0: (slave wlp164s0): making interface the new active one Dec 14 10:13:38 xps kernel: bond0: (slave enp87s0u1u2): link status up, enabling it in 200 ms Dec 14 10:13:38 xps kernel: bond0: (slave enp87s0u1u2): link status up, enabling it in 200 ms Dec 14 10:13:38 xps kernel: bond0: (slave enp87s0u1u2): invalid new link 3 on slave Dec 14 10:13:39 xps kernel: bond0: (slave enp87s0u1u2): link status definitely up, 100 Mbps full duplex Dec 14 10:13:39 xps kernel: bond0: (slave enp87s0u1u2): making interface the new active one
The network chipset is the same as the DA310 but I've not seen dropouts in the same fashion.

Bonding

Following systemd.link we can override systemd's persistent device naming scheme; this is particularly useful given that the same USB ethernet device plugged into a different port will present as a different ethernet device. Prior to this, we need to ensure that the Dell BIOS is not performing MAC address pass through.
$ lsusb | grep Ethernet Bus 006 Device 004: ID 0bda:8153 Realtek Semiconductor Corp. RTL8153 Gigabit Ethernet Adapter $ lsusb -v -s 006:004 | grep iMac iMacAddress 3 8CEC4Bxxxxxx # setup persistent name for TB16 $ cat > /etc/systemd/network/10-eth-tb16.link << EOF [Match] MACAddress=8c:ec:4b:xx:xx:xx [Link] Name=ethtb16 # force full 1gbit connection for sometimes the autoneg getting this wrong against a tplink gbit desktop switch Duplex=full BitsPerSecond=1000M EOF $ dmesg ... [ 2183.450846] r8152 2-1.1:1.0 (unnamed net_device) (uninitialized): Invalid header when reading pass-thru MAC addr [ 2183.469019] r8152 2-1.1:1.0: load rtl8153b-2 v1 10/23/19 successfully [ 2183.497741] r8152 2-1.1:1.0 eth0: v1.12.11 [ 2183.522662] r8152 2-1.1:1.0 ethtb16: renamed from eth0
Now we have a consistent name for this device regardless of port this the TB16 is attached - this one consistent device name can be used for the bond interface instead of adding multiple devices to a bond even though they refer to the same physical device (just plugged in on different ports).

Monitors

The connectors appear to be in this preference, at least on Linux: full displayPort, mini-displayPort and HDMI (I didn't try the VGA connector). Hotplugging can be hit and miss and what I've noticed on powerup (via the dock's power button) is that the external screens do not receive a signal immediately.

Cold booting by pressing the power button the dock wakes up the Dell laptop but the video output is not sent to the external screens, only on the (closed) laptop screen which is a pain as it will be sat at the grub menu on its countdown timer - the keyboard plugged into the dock works at this time so we know the dock is alive. Once the system starts to boot the connected monitors receive a data signal and things are mostly smooth after that point.

The only way to force the use of external monitor from cold boot is to have the dock connected to the laptop with power supply removed/turned off at the wall - apply power at the wall automatically starts the boot process (no need to press the power button on the dock) and at this point the external monitor displays the POST and grub menus.

Turning off the monitor off and then on responds well with the system believing that display being unavailable and then reappearing which is useful as sometimes the monitor believes there is no signal from the dock (powering off/on monitor re-establishes the dispaly).

USB and Audio

The 3x USB 3.x ports coupled with the 2x USB2.x ports are welcome and I've not encountered any problems with them - I typically use the USB ports to connect a USB 3.x HDD and not suffered any issues. The Dell firemware refers to an ASMedia driver but the system reports a 0424:5807 Microchip Technology, Inc. (formerly SMSC) Hub

Similarly for audio, this works fine on the dock for both headphones and lineout via the dock's 0bda:4014 Realtek audio chip - it is also pretty low on audio noise footprint when there is no audio.

PulseAudio: Combining the dock output

The dock has audio outputs in the form of a front headphone jack and also a rear line out jack - these two outputs will typically be recognised as two seperate outputs but it can useful to combine the two into a logical output; this will let you turn on speakers (rear line out) without having to reselect the output device.

Whilst F35 is shipped with Pipewire it's not clear how to combine logical sinks but with PulseAudio this is relatively simple with default configurations:
# reinstall pulseaudio $ dnf swap --allowerasing pipewire-pulseaudio pulseaudio $ dnf install pulseaudio-utils paprefs $ dnf remove pipewire pipewire-pulseaudio wireplumber # find the pulsedevice device names $ pacmd list-sinks | grep -e 'index:' -e device.string -e 'name:' index: 0 name: <alsa_output.usb-Plantronics_Plantronics_Blackwire_3210_Series_2FC9575B28134CEA815BE1C29F63D5D0-00.mono-fallback> device.string = "hw:0" index: 1 name: <alsa_output.usb-Generic_USB_Audio_200901010001-00.HiFi__hw_Dock_1__sink> device.string = "_ucm0003.hw:Dock,1" index: 2 name: <alsa_output.usb-Generic_USB_Audio_200901010001-00.HiFi__hw_Dock__sink> device.string = "_ucm0003.hw:Dock" ... # can take local user configuration: cp /etc/pulse/default.pa ~/.config/pulse/ # can make systemwide $ cat > /etc/pulse/default.pa.d/dellwd.pa << EOF load-module module-combine-sink slaves=alsa_output.usb-Generic_USB_Audio_200901010001-00.HiFi__hw_Dock_1__sink,alsa_output.usb-Generic_USB_Audio_200901010001-00.HiFi__hw_Dock__sink sink_name=dellwd15 sink_properties="device.description='Dell WD15 Dock' device.icon_name='audio-card-symbolic'" set-default-sink dellwd15 EOF $ systemctl --user restart pulseaudio $ pacmd list-sinks | grep -e 'index:' -e device.string -e 'name:' index: 0 name: <alsa_output.usb-Plantronics_Plantronics_Blackwire_3210_Series_2FC9575B28134CEA815BE1C29F63D5D0-00.mono-fallback> device.string = "hw:0" index: 1 name: <alsa_output.usb-Generic_USB_Audio_200901010001-00.HiFi__hw_Dock_1__sink> device.string = "_ucm0003.hw:Dock,1" index: 2 name: <alsa_output.usb-Generic_USB_Audio_200901010001-00.HiFi__hw_Dock__sink> device.string = "_ucm0003.hw:Dock" ... * index: 4 name: <dellwd15>
Whilst possible to create a simulatenous output device using paprefs, this does not provide fine grained control and will put all output sinks into the combined sink, including the laptop speakers!

Power

With the TB16 plugged into the mains, there is NO way to power down the dock - its simply always on! If your laptop is plugged in (even after initiating shutdown) there is constant power from the dock (and trickle charing the laptop) - we can also see this with the dock's front LED constantly lit as well power going to the external devices such as a USB harddrive that will continue to spin after laptop powerdown.

Fan

This is probably my biggest annoyance with the dock in that it uses active-cooling and the fan is on pretty much ALL of the time in my setup with 2x 1080p monitors and active ethernet port. Upon power, the fan spins up and then down but pretty much after the laptop is powered up and the screens have been in use (even if its just one screen) the fan is whirring away. And its annoying - it measures about 45dB, about 15dB above the ambient noise, although there is also competition from the XPS 9305 own fan that racks in at 50dB for moderate cooling.

Conclusions

Whilst this dock isn't a flawless experience, most of the issues can be tollerated and fixes applied. Furthermore, given that it was released in 2017 and now superceded with the most recent docks (Dell WD19TBS for example) costing upwards of 200GBP, the Dell TB16 can be rescued from the second hand market for as little as 50GBP which is probably a fair trade on functionality vs minor pain.

No comments:

Post a Comment