~xdavidwu/xdavidwu.link

9027d7276dc61bf847ed1805c9c70b5d38ac0113 — xdavidwu 5 years ago 947fa5d
add 2019-09-11-hp-dock
1 files changed, 147 insertions(+), 0 deletions(-)

A _posts/2019-09-11-hp-dock.md
A _posts/2019-09-11-hp-dock.md => _posts/2019-09-11-hp-dock.md +147 -0
@@ 0,0 1,147 @@
---
title: "HP Thunderbolt 3 Dock NIC 魔改"
categories:
  - Misc
tags:
  - linux
---

看便宜又好用就託朋友幫忙在淘寶上買了顆二手 HP Thunderbolt 3 Dock

走 Thunderbolt 3, 能 Power Delivery 供電給 host, 網卡是博通的 GbE 直接掛 PCIe,
兩顆 DisplayPort, 一顆 VGA, 一個背後是 USB Audio 的耳麥孔, 四個 USB 3.0 Type-A,
其中一個供電應該有 2A 兼充電孔沒連 host 也會供電, 還有一個 Thunderbolt 3 可以做 daisy chain

整體做成一條寬扁型, 很適合放在螢幕前下方之類的位置, 唯一美中不足的是兼充電的孔設計在後方

一切看起來很美好, 但在到貨時, 悲劇發生了

_網路插上去沒有動_

根據淘寶其他賣家頁面的註明, 存在給企業使用網卡被屏蔽的版本, 我懷疑我踩到雷了

我選擇的賣家頁面上完全沒提到屏蔽版的事, 他也其實是最便宜的一家, 賣的比其他家標明屏蔽版還便宜,
而且拿到這顆成色的也比其他家的風評好, 想說是屏蔽版也就直接認了

但就算是屏蔽版網路孔也還在, 甚至開機時還燈會閃一下, 開始懷疑他硬體上是能用的

於是我就開始著手研究

首先在 Linux 下嘗試, network interface 沒有出來, 但 lspci 表示有一顆 controller

```text
Ethernet controller: Broadcom Inc. and subsidiaries NetXtreme BCM57786 Gigabit Ethernet PCIe (rev 01)
```

然而這顆 controller lspci 卻缺了 Kernel driver in use 和 Kernel modules 兩項

心想奇怪, PCI ID Repository 裡都有這麼詳細的名稱, 長的還就像一般博通網卡, 怎麼會驅動沒有 map 到?

我先是對這項 entry 產生懷疑, 找了一下發現有兩筆紀錄都是這個名字, 一個是我的 device id 16a3, 另一個是 16b3

兩筆紀錄分別是不同人在不同時間提交的, 其中 16b3 比較早

在 Linux kernel source 裡搜尋 0x16a3 和 0x16b3 的值, 只有 0x16b3 在博通的 tg3 driver 裡以 macro `TG3PCI_DEVICE_TIGON3_57786` 出現

看來 16b3 是正統的 BCM57786 不用懷疑了, 但 16a3 呢?

以碰運氣的心態到 Windows 下試試

果不其然的, Windows 10 自帶驅動內也沒有任何一個 map 到他

嘗試直接手動強制安裝名稱像的驅動, 全部都失敗, 有些甚至會藍屏

上網找驅動, 後來一個 Dell 支援網站給的博通系列驅動包裡成功自動識別了, 安裝後名稱為 `Broadcom Simple Communications Device`

然而 interface 仍然沒有出現, 看這名稱越想越不對勁

找到成功自動識別的驅動 `b57ports` 的 inf 檔, 看他的註解更不對勁

```inf
; INF for PID_160A - Simple serial communications device
; INF for PID_16A3 - Broadcom Simple Communications Device
; INF for PID_16B9 - Broadcom Simple Communications Device
;
; This device is a Simple Communications Controller intended for use by
; BIOS code to allow remote access to the BIOS setup functions from a
; telnet connection running over the Ethernet port.  It will not be active
; when an operating system is running, but the function might remain exposed
; until the chip undergoes a power off reset or the telnet connection requests
; it be deactivated.
```

這讓我更相信我拿到的是屏蔽版的了

第一個 id 160a 在 Linux kernel source 裡搜索找到了

```c
#define PCI_DEVICE_ID_BROADCOM_TRUMANAGE 0x160a
```

在一個 serial 的 driver 內出現

搜尋了一下, 發現博通 TruManage 是企業遠端管理用的, 但有趣的是他貌似是基於一般 NIC 也能用的晶片

於是我懷疑這些賣家口中屏蔽版的 dock 是不是 HP 直接用個不同的 firmware 之類的讓他變成企業管理專用,
但硬體上兩者是一樣的

網路上也找到的有人買新品買到跟我一樣狀況的產品, 解決方法是直接跟 HP RMA 回來一個能用的, 我懷疑這是 HP 出錯貨給成企業管理版

但我不是買新品, 而是在淘寶買了個二手貨, 恐怕只能跟賣家吵架或自己研究, 但那賣家也早已屢次證明了他不懂他賣的東西
(例如在私訊以 "高端的都有芯片限制" 為由斬釘截鐵的說在 Dell XPS 上不能用, 還舉了 "三星手機裝蘋果系統那蘋果幾年前不破產啊" 的完全不相干的怪例子,
但卻同時有在產品頁面表示這個 dock 在 Macbook 舊版 OS X "魔改" (下幾個指令) 後能用這件事實 (當然這所謂魔改並沒有把屏蔽版網卡打開) )

於是我只能自己繼續研究

回到 Linux, 在 lspci 那塊 controller 看到了有趣的東西

```text
	Capabilities: [50] Vital Product Data
		Product Name: Broadcom NetXtreme Gigabit Ethernet Controller
		Read-only fields:
			[PN] Part number: BCM957762
			[EC] Engineering changes: 106679-15
			[SN] Serial number: 0123456789
			[MN] Manufacture ID: 14e4
			[RV] Reserved: checksum good, 27 byte(s) reserved
		Read/write fields:
			[YA] Asset tag: XYZ01234567
			[RW] Read-write area: 107 byte(s) free
		End
```

以 BCM957762 搜尋, 找到了類似的紀錄, 是顆 device id 為 1682 的 BCM57762, 紀錄內容大部分都相符, 但是是在一顆蘋果的 Thunderbolt device 上

詢問了也有這顆 HP dock (但是網卡直接能用) 的另一個朋友, 果不其然他的 device id 就是 1682

在 Linux kernel source 裡找了找, 大略讀了一下 1682 所用的 tg3 driver 源碼, 於是動了手腳

```diff
diff --git a/drivers/net/ethernet/broadcom/tg3.h b/drivers/net/ethernet/broadcom/tg3.h
index 6953d0546..e20892d21 100644
--- a/drivers/net/ethernet/broadcom/tg3.h
+++ b/drivers/net/ethernet/broadcom/tg3.h
@@ -65,7 +65,7 @@
 #define  TG3PCI_DEVICE_TIGON3_57795	 0x16b6
 #define  TG3PCI_DEVICE_TIGON3_5719	 0x1657
 #define  TG3PCI_DEVICE_TIGON3_5720	 0x165f
-#define  TG3PCI_DEVICE_TIGON3_57762	 0x1682
+#define  TG3PCI_DEVICE_TIGON3_57762	 0x16a3 /* modified from 1682 */
 #define  TG3PCI_DEVICE_TIGON3_57766	 0x1686
 #define  TG3PCI_DEVICE_TIGON3_57786	 0x16b3
 #define  TG3PCI_DEVICE_TIGON3_57782	 0x16b7
```

編譯安裝後重新啟動, 原本開機閃一下就開始沉默的燈竟然亮了起來

network interface 也出來了, 手動 up 他, 看了一下 kernel message, Link is up at 1000 Mbps, full duplex, 莫非真的能用了?

跑跑看 DHCP, 成功拿到 lease 了, 再跑個測速, 也很明顯的有 GbE 的實力

看來我真的自己原創 "魔改" 成功了

感覺就像開核似的

不過當然這個魔改反而讓原本 1682 的正統 BCM57762 不能用了, 如果要同時能用要稍微更認真的去改 tg3 的源碼

Windows 可能純粹改個 1682 用的 b57nd60a 的 inf 也會能用, 但那會有簽名問題更不漂亮, 不常用 Windows 也就先不管他了