7

I have a Dell Precision M3800 and an OWC Thunderbolt 2 Dock. They both work together beautifully and everything seems to just work.

I haven't tried the FireWire yet, but the Ethernet, USB3, DisplayPort and sound work great out of the box.

My system isn't completely happy with just yanking out the Thunderbolt cable and has occasionally hung when I've removed the dock; other times it has been fine. I would like to find a safer way and was hoping there might a mechanism where I could tell my system I was going to unplug and to gracefully take down the interfaces first.

I've tried searching for packages and info on Thunderbolt support in Linux and have only found Greg KH's blog saying that it will just work, but not mentioning any tools.

I haven't found any Thunderbolt-related packages in the Ubuntu repos for my 15.10 install.

Are there tools or /proc or /sys nodes I could use for this?

Giacomo1968
  • 58,727
Amias
  • 268
  • 1
  • 3
  • 9

6 Answers6

6

Thunderbolt is basically a PCIe bus exposed in the form of a user-friendly, pluggable interface. As you can imagine, hot-plugging a PCIe card in any machine isn't something you can expect to consistently do without problems - unless extreme care has been taken by the manufacturers of the host and removable devices as well as the developers of the mainboard firmware, device firmware, OS kernel, and device drivers.

All that is to say, there's a huge surface area of potential bugs and issues that would prevent this hot-plug from working the way we'd want it to. My recommendation would be to use a debug kernel and try to break into the debugger when it freezes - if you can, then it's probably not a hardware or firmware issue. Instructions on doing that are probably a little beyond the scope of the question or my reply here, but resources are available online that make this a bit easier.

Now if you want a means by which you can manually eject the device prior to yanking it, you can try the following:

After identifying the device address in the system in the output of lspci command, where DDDD:BB:DD.F is the Domain:Bus:Device.Function of the thunderbolt peripheral in question:

05:00.0 PCI bridge: Intel Corporation DSL3510 Thunderbolt Port [Cactus Ridge] (rev 03)
06:00.0 PCI bridge: Intel Corporation DSL3510 Thunderbolt Port [Cactus Ridge] (rev 03)
06:03.0 PCI bridge: Intel Corporation DSL3510 Thunderbolt Port [Cactus Ridge] (rev 03)
06:04.0 PCI bridge: Intel Corporation DSL3510 Thunderbolt Port [Cactus Ridge] (rev 03)
06:05.0 PCI bridge: Intel Corporation DSL3510 Thunderbolt Port [Cactus Ridge] (rev 03)
06:06.0 PCI bridge: Intel Corporation DSL3510 Thunderbolt Port [Cactus Ridge] (rev 03)
07:00.0 System peripheral: Intel Corporation DSL3510 Thunderbolt Port [Cactus Ridge] (rev 03)
08:00.0 PCI bridge: Intel Corporation DSL3510 Thunderbolt Controller [Cactus Ridge]
09:00.0 PCI bridge: Intel Corporation DSL3510 Thunderbolt Controller [Cactus Ridge]

you can execute the following:

echo "1" | sudo tee /sys/bus/pci/devices/DDDD\:BB\:DD.F/remove > /dev/null

Which should trigger the unload routines in the kernel and the driver (and possibly even in the device firmware), after which you might be able to eject it more-safely. (A grep in a subshell can obviously take the place of the DDDD:BB:DD.F for ease-of-use in the future).

Upon replugging the device, it might become necessary to manually rescan:

echo "1" | sudo tee /sys/bus/pci/rescan > /dev/null

(Or it might not be needed.)

I haven't used Linux in a while as I'm almost exclusively FreeBSD and OS X these days, so please forgive me if I'm off the mark on anything here.

3

It seems that if you lspci -vt you get a tree diagram that makes it a lot easier to spot the Thunderbolt controller.

Here’s my output:

amias@rome:~$ lspci -vt

-[0000:00]-+-00.0 Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor DRAM Controller +-01.0-[02-03]----00.0 NVIDIA Corporation GK107GLM [Quadro K1100M] +-02.0 Intel Corporation 4th Gen Core Processor Integrated Graphics Controller +-03.0 Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor HD Audio Controller +-04.0 Intel Corporation Device 0c03 +-14.0 Intel Corporation 8 Series/C220 Series Chipset Family USB xHCI +-16.0 Intel Corporation 8 Series/C220 Series Chipset Family MEI Controller #1 +-1a.0 Intel Corporation 8 Series/C220 Series Chipset Family USB EHCI #2 +-1b.0 Intel Corporation 8 Series/C220 Series Chipset High Definition Audio Controller +-1c.0-[04]-- +-1c.2-[06]----00.0 Intel Corporation Wireless 7260 +-1c.3-[07]----00.0 Realtek Semiconductor Co., Ltd. RTS5249 PCI Express Card Reader +-1c.4-[08-40]----00.0-[09-40]--+-00.0-[0a]----00.0 Intel Corporation Device 157d | -01.0-[0b-40]----00.0-[0c-40]--+-00.0-[0d]----00.0 Fresco Logic FL1100 USB 3.0 Host Controller | +-01.0-[0e]----00.0 Intel Corporation I210 Gigabit Network Connection | +-02.0-[0f]----00.0 Fresco Logic FL1100 USB 3.0 Host Controller | +-03.0-[10]----00.0 LSI Corporation FW643 [TrueFire] PCIe 1394b Controller | +-04.0-[11]-- | -05.0-[12-40]-- +-1d.0 Intel Corporation 8 Series/C220 Series Chipset Family USB EHCI #1 +-1f.0 Intel Corporation HM87 Express LPC Controller +-1f.2 Intel Corporation 8 Series/C220 Series Chipset Family 6-port SATA Controller 1 [AHCI mode] +-1f.3 Intel Corporation 8 Series/C220 Series Chipset Family SMBus Controller -1f.6 Intel Corporation 8 Series Chipset Family Thermal Management Controller

This allowed me to find 1c.4 which appears to be my thunderbolt controller.

I then used mahmoud's suggestion to hit the remove node, this did seem to disconnect my thunderbolt dock cleanly , however when i reinserted it locked hard. This would suggest that other drivers are not so happy with the hot-plugging or I would need to reset the thunderbolt device.

Either way, it was worse than just pulling it out.

I guess for now I just need to ensure everything is saved before undocking. I would welcome further suggestions if there are any.

Giacomo1968
  • 58,727
Amias
  • 268
  • 1
  • 3
  • 9
2

You can try suspending your system to RAM and then pull out the cable. This seems to be the only way I can unplug my Lenovo Thunderbolt 3 dock without rebooting.

2

I managed to solve the issue for myself as follows. I created a hook in:

/etc/udev/rules.d/99-thunderbolt-dock.rules

With the following content:

ACTION=="remove", SUBSYSTEM=="thunderbolt", RUN+="/path/to/handle_dock_disconnect.sh"

handle_dock_disconnect.sh should include all the actions (maybe the working ones from other answers) that you want to do when docking station is disconnected.

In my case it was enough to turn off the external monitors and run autorandr once (I was too lazy to make it better, to be honest.)

#!/bin/bash

turn off external monitors

xrandr --output DP-1 --off --output DP-2 --off

pause 1 second

sleep 1

run autorandr to automatically detect the suitable setting

autorandr --change

Giacomo1968
  • 58,727
1

One solution is to suspend-on-RAM (pm-suspend) before unplugging / replugging Thunderbolt.

1

I recently used the answer by Mahmoud Al-Qudsi, and also ran boltctl with kernel 5.11 to find the right location of the PCIe bus to disconnect the Thunderbolt2 to Ethernet connection.

I posted an answer here, Ubuntu 18.04 - Ethernet disconnected after suspend, related to disconnecting this way before suspend/hibernate in the case that the thunderbolt port is causing issues with suspend/hibernate.

Here are the relevant sections from the link:

Next I worked on how to disconnect the thunderbolt by command line, since I had found that when the computer was only on W-Fi and the Thunderbolt-Ethernet cable was not physically connected, I was able to suspend and wake the computer.

I found the following commands after a long search were able to disconnect the Thunderbolt, as confirmed with commands boltctl and ifconfig:

pre-2 -> disconnects thunderbolt before suspend/hibernate

### pre-2  ->  disconnects thunderbolt'   
echo "1" | sudo tee /sys/devices/pci0000:00/0000:00:1c.4/remove > /dev/null  
 Note: you must find the `/sys/...` location from `boltctl list` and `boltctl info <uuid>` at the first part of `syspath`

post-2 -> connect thunderbolt, from scanning PCI bus, after suspend/hibernate

### post-2  -> connect thunderbolt, after scanning pci bus
echo "1" | sudo tee /sys/bus/pci/rescan > /dev/null

tests connection before and after thunderbolt disconnect and connect

boltctl list # to find the uuid of the device boltctl info <uuid> to find the 'syspath' ifconfig speedtest-cli

This is using the PCI bus location DDDD:BB:DD.F listed in the command above to disconnect Thunderbolt, where the command to connect and disconnect the PCI device is listed in the kernel.org link below. I also put a link an example at the superuser link:

The concept above is disconnecting the thunderbolt from the sysfs-bus-pci command, since boltctl doesn't have an option to disconnect yet, at least in Linux kernel 5.11

Giacomo1968
  • 58,727