I got a HP Thunderbolt 3 Dock off Taobao the other day for around S$50. It’s a nice little dock, but with one little problem – Ethernet wouldn’t come up at all in Linux or Windows.
The Ethernet NIC in the dock was recognized as a “Broadcom NetXtreme BCM57786 Gigabit Ethernet PCIe” (it’s actually a BCM57762 though1), which uses the
tg3 driver. I tried feeding the PCI ID of the BCM57762 in the dock (
14e4:16a3) to the module, but that just wreaked havoc upon my iGPU and WiFi card for
Windows didn’t give any promising results either – updating the dock firmware and installing the Broadcom drivers provided by HP didn’t help, or I wouldn’t be here writing this now.
I went back into Linux and recompiled
tg3.ko, replacing the BCM57762 PCI ID defined in there with the PCI ID of the BCM57762 in my dock.2 It worked
fine, but I would have to do that with every computer I wanted to use the dock with. Not a very optimal solution, really.
Luckily, it seemed like the PCI ID of the BCM57762 was stored in the NIC EEPROM, and
ethtool lets you modify it:
tg3.koto include the PCI ID of your BCM57762.
Create a folder with this Makefile:
KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: $(MAKE) -C $(KDIR) M=$(PWD) modules
tg3.hfor your Linux version into that folder, run
make(you’ll probably need kernel headers installed for this), and load the module with
sudo insmod tg3.ko.
Dump the EEPROM.
$ ethtool -e enp7s0 raw on > eeprom.bin
enp7s0with the interface name of your NIC. This dump also serves as a backup in case we mess something else up later.
Find the PCI ID within the EEPROM dump.
$ xxd -u eeprom.bin | grep 16A3 000000a0: 16A3 14E4 1682 14E4 0042 0000 0000 0000 .........B...... 00000d90: 8F42 00D8 3C02 16A3 2442 14E4 AFA2 0028 .B..<...$B.....(
I’m not particularly sure what that second match was about, but the first match has the PCI ID (
14e4:16a3) and subsystem ID (
14e4:1682) of the NIC so I assumed that was the right one.
Change the PCI ID to that of a normal BCM57762.
$ sudo ethtool -E enp7s0 magic 0x669955aa offset 0xa1 length 1 value 0x82
enp7s0and the offset with the appropriate values, if it differs from mine. This changes the byte at offset
82, which changes the PCI ID to
The magic key is device-specific to prevent accidental writes to the EEPROM, but can be found in
#define TG3_EEPROM_MAGIC 0x669955aa
Check that the PCI ID has actually changed. Unload the
sudo rmmod tg3, then reconnect the dock. The original
tg3module should load automatically, but you can also check the (hopefully changed) PCI ID with
You may also have to reauthorize the dock if it doesn’t show up.
With this, your bargain bin HP Thunderbolt 3 Dock should now have functional Ethernet without having to recompile kernel modules.
lspci -vvvwill tell you that the part number is BCM957762. The
lspcidump in this bug report also shows that the proper PCI ID should be
This guy here also had a similar idea; he elaborates more on this issue ↩︎