em0:EEPROM 校验和无效

em0:EEPROM 校验和无效

我刚刚在带有 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"正在加载老的em 驱动程序在 /boot/kernel 中找到。我想这并不奇怪,因为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驱动程序代码中存在字符串“EEPROM 校验和无效”的两个位置。

像这样

--- 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 后,网络连接已存在,相同的问题仍然存在,没有任何变化。

答案1

em0:EEPROM 校验和无效

写入EEPROM时校验和与固件有关。我相信您自己已经找到了解决办法。这些免责声明似乎可以追溯到过去ibautil。此报告报告了 Supermicro 主板的成功内置网卡和某人英特尔D975XBX2

我会下载最新版本并确保我能够列出我的适配器。如果是这样 - 我就不会那么害怕尝试重置 PXE 配置。但是YMMV。

针对错误校验和的建议修复方法是使用以下命令重置 PXE 默认配置:

bootutil -nic=1 -defcfg

- 或者 -

bootutil -all -defcfg

这些选项可以在以下位置找到bootutil.txt

模块路径

您应该验证module_path系统上的实际设置方式。您可以使用 来执行此操作kenv

# kenv module_path
/boot/kernel;/boot/modules

您还可以使用验证它kld配置这甚至暗示了解决方案:

# kldconfig -r
/boot/kernel;/boot/modules

module_path决定了查找文件的顺序和位置.ko。默认设置为系统/boot/common/module.c。如果module_path/boot/defaults/loader.conf或删除,这会更容易理解会议/73535已实施。我也曾为此困惑过。

您可以使用 来更改它kldconfig

由于它/boot/kernel是由系统更新的,并且是 FreeBSD 基础系统的一部分,所以最好不要碰它。另一方面,改变路径顺序也可能会带来惊喜。我看到其他人建议从 制作软链接/boot/kernel

相关内容