em0: EEPROM 체크섬이 잘못되었습니다.

em0: EEPROM 체크섬이 잘못되었습니다.

방금 Intel I219-V 네트워크 어댑터가 있는 시스템에 FreeBSD(11.0-RELEASE-p1)를 설치했습니다. 이 FreeBSD 버전에는 em v7.6.1이 있습니다. (제 생각에는... 아마도 EEPROM 체크섬 오류일까요? 계속 읽으세요...) 이 네트워크 칩셋을 지원하지 않으므로 v7.6.2 업데이트 버전을 찾았습니다.인텔 웹사이트에서.

Readme에 따라 다음과 같이 설치했습니다.

  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

그리고 시스템에서 어댑터를 인식하지 못합니다.

여기서 주목해야 할 두 가지 사항은 나중에 다시 설명할 잘못된 체크섬과 방금 v7.6.2를 설치했는데도 v.7.6.1이 로드된다는 사실입니다!

각 버전의 위치를 ​​찾으려고 합니다.

$ 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.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 체크섬 문제가 있지만 또 다른 질문은 왜 kldloadv7.6.2(명시적으로 가리키는 파일) 전에 v7.6.1을 로드하려고 합니까?입니다.

마지막으로 패치가 필요한 체크섬 검사를 무시하고 드라이버 코드에 "EEPROM 체크섬 유효하지 않음"이라는 문자열이 존재하는 두 곳이 있으면 어떤 일이 발생하는지 알아보기로 결정 if_em.c했습니다 if_lem.c.

이와 같이

--- 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;*/
        }
    }

이제 make; make install; restartdmesg.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것이 정상입니다.

제 질문은 다음과 같습니다.

  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. 기본 설정은시스템/부팅/공통/module.c. 또는 module_path에서 제거 하면 /boot/defaults/loader.conf이해하기가 더 쉬울 것입니다 .컨퍼런스/73535구현되었습니다. 저도 이것 때문에 헷갈렸어요.

를 사용하여 변경할 수 있습니다 kldconfig.

/boot/kernel시스템에 의해 업데이트되고 FreeBSD 기본 시스템의 일부이므로 그대로 두는 것이 가장 좋습니다 . 반면에 경로 순서를 변경하면 예상치 못한 일이 발생할 수도 있습니다. 나는 다른 사람들이 소프트 링크를 만드는 것부터 시작하는 것을 권장하는 것을 보았습니다 /boot/kernel.

관련 정보