@@ 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 也就先不管他了