I219 網路適配器和 em 7.6.2 的問題
我剛剛在帶有 Intel I219-V 網路適配器的系統上安裝了 FreeBSD (11.0-RELEASE-p1)。這個版本的 FreeBSD 有 em v7.6.1,它(我相信……也許只是 EEPROM 校驗和錯誤?繼續閱讀……)不支持這個網路晶片組,所以我找到了更新版本,v7.6.2 ,來自英特爾的網站。
按照自述文件,我安裝如下:
- 解壓/解壓
make
make install
- 添加
if_em_load="YES"
到 /boot/loader.conf- 添加
ifconfig_em0="DHCP"
到 /etc/rc.conf重新啟動後,我仍然收到以下消息
dmesg.boot
:module_register: cannot register pci/em from kernel; already loaded from if_em.ko Module pci/em failed to register: 17 ... em0: <Intel (R) PRO/1000 Network Connection 7.6.1-k> mem 0xdf300000-0xdf31ffff irq 16 at device 31.6 on pci0 em0: Using an MSI interrupt em0: The EEPROM Checksum Is Not Valid device_attach: em0 attach returned 5
並且系統無法辨識適配器。
這裡有兩件事需要注意——錯誤的校驗和,我稍後會回到這個問題,以及 v.7.6.1 正在載入的事實,即使我剛剛安裝了 v7.6.2!
我試圖找出每個版本的位置:
$ strings /boot/kernel/if_em.ko ... 7.6.1-k ... $ strings /boot/modules/if_em.ko ... 7.6.2 ...
因此,
if_em_load="YES"
正在載入/boot/kernel 中的*舊em 驅動程序。*我想這並不奇怪,因為man kldload
它看起來在那裡,但是 /boot/defaults/loader.conf 包含module_path="/boot/modules"
.通過手動載入 v7.6.2
kldload /boot/modules/if_em.ko
會給出以下輸出:em0: <Intel (R) PRO/1000 Network Connection 7.6.1-k> mem 0xdf300000-0xdf31ffff irq 16 at device 31.6 on pci0 em0: Using an MSI interrupt em0: The EEPROM Checksum Is Not Valid device_attach: em0 attach returned 5 em0: <Intel (R) PRO/1000 Network Connection 7.6.2> mem 0xdf300000-0xdf31ffff irq 16 at device 31.6 on pci0 em0: Using an MSI interrupt em0: The EEPROM Checksum Is Not Valid device_attach: em0 attach returned 5
因此,仍然存在 EEPROM 校驗和問題,但另一個問題是為什麼
kldload
嘗試在 v7.6.2 之前載入 v7.6.1,這是它明確指向的文件?最後,我決定看看如果我忽略需要修補的校驗和檢查會發生什麼,
if_em.c
並且if_lem.c
驅動程式碼中存在兩個字元串“The EEPROM Checksum Is Not Valid”。像這樣
--- if_em.c 2017-05-16 01:44:07.189792000 -0700 +++ if_em_patch.c 2017-05-16 01:44:28.885779000 -0700 @@ -730,10 +730,10 @@ ** if it fails a second time its a real issue. */ if (e1000_validate_nvm_checksum(hw) < 0) { - device_printf(dev, + /*device_printf(dev, "The EEPROM Checksum Is Not Valid\n"); error = EIO; - goto err_late; + goto err_late;*/ } }
像這樣
--- if_lem.c 2017-05-16 01:39:27.605399000 -0700 +++ if_lem_patch.c 2017-05-16 01:44:47.661294000 -0700 @@ -641,10 +641,10 @@ ** if it fails a second time its a real issue. */ if (e1000_validate_nvm_checksum(&adapter->hw) < 0) { - device_printf(dev, + /*device_printf(dev, "The EEPROM Checksum Is Not Valid\n"); error = EIO; - goto err_hw_init; + goto err_hw_init;*/ } }
現在,a
make; make install; restart
仍然在 dmesg.boot 中為我提供 v7.6.1,但執行kldunload if_em; kldload /boot/modules/if_em.ko
會給出如下輸出:em0: <Intel (R) PRO/1000 Network Connection 7.6.1-k> mem 0xdf300000-0xdf31ffff irq 16 at device 31.6 on pci0 em0: Using an MSI interrupt em0: The EEPROM Checksum Is Not Valid device_attach: em0 attach returned 5 em0: <Intel (R) PRO/1000 Network Connection 7.6.2> mem 0xdf300000-0xdf31ffff irq 16 at device 31.6 on pci0 em0: Using an MSI interrupt em0: Ethernet address: xx:xx:xx:xx:xx:xx
有用!我可以通過獲得 IP
dhclient em0
並且ping 8.8.8.8
一切正常。所以,這是我的問題:
- 為什麼我的 EEPROM 校驗和錯誤?我沒有做任何可能弄亂韌體或其他任何事情的事情。我能做些什麼來解決這個問題(就像我找到的所有答案一樣,它沒有以“這不適用於集成適配器”的免責聲明開頭——例如這個)?
- 為什麼當我明確告訴它載入 v7.6.2 時核心仍在載入 v7.6.1
kldload /boot/modules/if_em.ko
?- 為什麼核心
module_path="/boot/modules"
在 /boot/defaults/loader.conf 中啟動時會載入 v7.6.1?我該怎麼做才能只載入 v7.6.2?我必須刪除 /boot/kernel/if_em.ko 嗎?這似乎有點不對勁。我知道當我選擇執行 FreeBSD 時,我可以享受讓所有硬體和軟體正常工作的“樂趣”(真的,這很有趣),但這似乎有點過頭了。
編輯:更新到 11.0-RELEASE-p9 後,既然存在網路連接,同樣的問題仍然沒有改變。
em0:EEPROM校驗和無效
在您編寫 EEPROM 校驗和時,它與韌體有關。我相信您自己已經找到了解決方法。免責聲明似乎可以追溯到過去
ibautil
。這個報告成功使用帶有內置 NIC的 Supermicro 板和使用Intel D975XBX2的人。我會下載最新版本並確保我能夠列出我的適配器。如果是這樣 - 我不會那麼害怕嘗試重置 PXE 配置。但是YMMV。
錯誤校驗和的建議修復方法是使用以下命令重置 PXE 預設配置:
bootutil -nic=1 -defcfg
- 或者 -
bootutil -all -defcfg
這些選項可以在bootutil.txt中找到
模組路徑
您應該驗證
module_path
系統上的實際設置方式。您可以使用kenv
.# kenv module_path /boot/kernel;/boot/modules
您還可以使用kldconfig驗證它,它甚至可以提示解決方案:
# kldconfig -r /boot/kernel;/boot/modules
它
module_path
決定了查找.ko
文件的順序和位置。預設設置在sys/boot/common/module.c中。如果從conf/73535module_path
中刪除/boot/defaults/loader.conf
或實施,這將更容易理解。我也對此感到困惑。您可以使用
kldconfig
.由於
/boot/kernel
系統和 FreeBSD 基本系統的一部分已更新,因此最好不要碰它。另一方面,改變路徑順序也可能會帶來驚喜。我看到其他人建議從/boot/kernel
.