Drivers

I219 網路適配器和 em 7.6.2 的問題

  • May 16, 2017

我剛剛在帶有 Intel I219-V 網路適配器的系統上安裝了 FreeBSD (11.0-RELEASE-p1)。這個版本的 FreeBSD 有 em v7.6.1,它(我相信……也許只是 EEPROM 校驗和錯誤?繼續閱讀……)不支持這個網路晶片組,所以我找到了更新版本,v7.6.2 ,來自英特爾的網站

按照自述文件,我安裝如下:

  1. 解壓/解壓
  2. make
  3. make install
  4. 添加if_em_load="YES"到 /boot/loader.conf
  5. 添加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.2kldload /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;*/
       }
   }

現在,amake; 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

有用!我可以通過獲得 IPdhclient em0並且ping 8.8.8.8一切正常。

所以,這是我的問題:

  1. 為什麼我的 EEPROM 校驗和錯誤?我沒有做任何可能弄亂韌體或其他任何事情的事情。我能做些什麼來解決這個問題(就像我找到的所有答案一樣,它沒有以“這不適用於集成適配器”的免責聲明開頭——例如這個)?
  2. 為什麼當我明確告訴它載入 v7.6.2 時核心仍在載入 v7.6.1 kldload /boot/modules/if_em.ko
  3. 為什麼核心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.

引用自:https://unix.stackexchange.com/questions/365345