From 9027d7276dc61bf847ed1805c9c70b5d38ac0113 Mon Sep 17 00:00:00 2001 From: xdavidwu Date: Wed, 11 Sep 2019 22:36:35 +0800 Subject: [PATCH] add 2019-09-11-hp-dock --- _posts/2019-09-11-hp-dock.md | 147 +++++++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 _posts/2019-09-11-hp-dock.md diff --git a/_posts/2019-09-11-hp-dock.md b/_posts/2019-09-11-hp-dock.md new file mode 100644 index 0000000..086f975 --- /dev/null +++ b/_posts/2019-09-11-hp-dock.md @@ -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 也就先不管他了 -- 2.45.2