GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo reparar el checksum de la memoria no volátil (NVM) de Intel Ethernet Controller I219-V de una laptop ASUS?

Antes de probar mi solución, considere probar primero la de ppparadox.

Con la amable ayuda de e1000-devel lista de correo, así es como arreglé la NVM Palabra de suma de verificación usando ethtool .

tl;dr: Básicamente, primero parcheé e1000e para tener acceso al chip Ethernet en Linux y luego usé ethtool para leer un valor de la región "checksummed" de la NVM de mi I219-V y luego volver a escribirlo. La operación de escritura arregló la suma de verificación.

Para tener acceso a mi chip Ethernet desde Linux, tuve que parchear e1000e para omitir la validación de la suma de comprobación de NVM. En archivo src/netdev.c , cambié la primera línea de

for (i = 0;; i++) {
    if (e1000_validate_nvm_checksum(&adapter->hw) >= 0)
        break;
    if (i == 2) {
        dev_err(pci_dev_to_dev(pdev),
            "The NVM Checksum Is Not Valid\n");
        err = -EIO;
        goto err_eeprom;
    }
}

en

for (i = 0; false; i++) {

(Todo el bloque también podría eliminarse o comentarse).

Luego instalé el módulo parcheado. Desde el /src directorio que hice:

sudo make install
sudo modprobe -r e1000e
sudo modprobe e1000e
sudo update-initramfs -u
reboot

Ahora se omitió la validación de la suma de verificación y Ethernet comenzó a funcionar.

Antes de corregir la palabra Checksum, examiné el esquema de NVM de I219 presentado en la Sección 10 de la hoja de datos de Intel. El uso de la palabra Checksum se explica en la Sección 10.3.2.2.

Anoté la palabra Checksum antes de escribir a la NVM:

$ sudo ethtool -e enp0s31f6 offset 0x7e length 2
Offset      Values
------      ------
0x007e:     60 13 

(enp0s31f6 es el nombre de mi interfaz Ethernet). Por lo tanto, el valor erróneo de la palabra Checksum fue 0x1360 .

Miré el volcado de NVM con sudo ethtool -e enp0s31f6 y luego miró de nuevo el byte en el desplazamiento 0x10:

$ sudo ethtool -e enp0s31f6 offset 0x10 length 1
Offset      Values
------      ------
0x0010:     ff 

(Aparentemente, cualquier ubicación funcionaría, pero me dijeron que en mi caso el valor en el desplazamiento 0x10 no se usó en absoluto, por lo que parecía "más seguro").

Para escribir en la NVM (EEPROM) con ethtool , necesitaba una "llave mágica". Leí Desbloqueo de una interfaz de red Intel Pro/1000 (e1000) y descubrí que mi llave mágica era 0x15708086 usando lspci -nn :

$ lspci -nn | grep Ethernet
00:1f.6 Ethernet controller [0200]: Intel Corporation Ethernet Connection I219-V [8086:1570] (rev 21)

Luego escribí 0xff volver al desplazamiento 0x10 en la NVM:

$ sudo ethtool -E enp0s31f6 magic 0x15708086 offset 0x10 value 0xff

Después de comparar los volcados de la NVM antes y después de la escritura, pude ver que, como era de esperar, lo único que cambió fue la palabra Checksum:

$ sudo ethtool -e enp0s31f6 offset 0x7e length 2
Offset      Values
------      ------
0x007e:     60 93 

El nuevo valor por lo tanto fue 0x9360 .

Arranqué un kernel con un e1000e sin parchear y el puerto Ethernet funcionó bien.

PD Me parece un poco preocupante que solo el bit más alto en la palabra Checksum esté mal.


Usé bootutil para Linux de Intel (como se sugirió en la publicación de 2011) en una NIC Intel integrada en mi Asus Z270-A para corregir este error, sin las claves mágicas y de recompilación discutidas en la respuesta votada. Funcionó muy bien. Descargué la herramienta del sitio de descargas de Intel

chmod +x ./bootutil64e
sudo ./bootutil64e -NIC 1 -defcfg

Estaba recibiendo el mismo error en Fedora 24 de e1000e controlador con placa base ASUS ROG MAXIMUS IX HERO que tiene adaptador NIC Intel I219-V.

Considero que la solución aceptada, que requiere parchear la NVM, es demasiado arriesgada. Puede inutilizar su hardware.

Una solución segura es aplicar la configuración predeterminada a la NIC mediante la Utilidad de arranque de conexiones Intel Ethernet. Funciona en Linux desde el primer momento, no es necesario crear un disco de arranque:

$ chmod +x bootutil64e
$ sudo ./bootutil64e -NIC=1 -DEFAULTCONFIG

Eso es. Simplemente reinicie (o vuelva a cargar e1000e controlador manualmente).


Linux
  1. ¿Cómo llenar el 90% de la memoria libre?

  2. ¿Cómo reparar la instalación?

  3. Cómo verificar la integridad de un archivo con md5 checksum

  4. ¿Cómo puedo mostrar el uso de memoria de cada proceso si hago un 'ps -ef'?

  5. ¿Cómo puedo reservar un bloque de memoria del kernel de Linux?

¿Qué es NVM (memoria no volátil)?

Linux:¿cómo obtener la cantidad de memoria disponible de forma portátil en todas las distribuciones?

Debian – ¿Cómo reparar Grub en Debian?

¿Cómo monitorear el uso de la memoria dedicada al kernel?

¿Cómo puedo probar la memoria RAM para detectar daños en los datos en un sistema basado en ARM?

¿Cuánta RAM usa el kernel?