GNU/Linux >> Tutoriels Linux >  >> Linux

Comment réparer la somme de contrôle de la mémoire non volatile (NVM) du contrôleur Ethernet Intel I219-V d'un ordinateur portable ASUS ?

Avant d'essayer ma solution, pensez d'abord à essayer celle de ppparadox.

Avec l'aimable aide de e1000-devel liste de diffusion, voici comment j'ai corrigé le mot de somme de contrôle NVM en utilisant ethtool .

tl;dr : En gros, j'ai d'abord patché e1000e pour avoir accès à la puce Ethernet sous Linux, puis j'ai utilisé ethtool pour lire une valeur de la région "checksummed" de la NVM de mon I219-V, puis pour la réécrire. L'opération d'écriture a fixé la somme de contrôle.

Pour avoir accès à ma puce Ethernet depuis Linux, j'ai dû patcher e1000e pour ignorer la validation de la somme de contrôle NVM. Dans le fichier src/netdev.c , j'ai changé la première ligne 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;
    }
}

dans

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

(Le bloc entier peut également être simplement supprimé ou commenté.)

Ensuite, j'ai installé le module patché. A partir du /src répertoire que j'ai fait :

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

Maintenant, la validation de la somme de contrôle a été ignorée et l'Ethernet a commencé à fonctionner.

Avant de fixer le mot Checksum, j'ai examiné les grandes lignes de la NVM de I219 présentées dans la section 10 de la fiche technique d'Intel. L'utilisation du mot Checksum est expliquée dans la section 10.3.2.2.

J'ai noté le mot Checksum avant d'écrire à la NVM :

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

(enp0s31f6 est le nom de mon interface Ethernet.) Ainsi, la valeur erronée du mot Checksum était 0x1360 .

J'ai regardé le dump de NVM avec sudo ethtool -e enp0s31f6 puis regarda à nouveau l'octet à l'offset 0x10 :

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

(Apparemment, n'importe quel emplacement ferait l'affaire, mais on m'a dit que dans mon cas, la valeur au décalage 0x10 n'était pas du tout utilisée, donc cela semblait "plus sûr".)

Pour écrire dans la NVM (EEPROM) avec ethtool , j'avais besoin d'une "clé magique". J'ai lu Débriquer une interface réseau Intel Pro/1000 (e1000) et j'ai compris que ma clé magique était 0x15708086 en utilisant lspci -nn :

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

Puis j'ai écrit 0xff retour au décalage 0x10 dans la NVM :

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

Après avoir comparé les dumps de la NVM avant et après l'écriture, j'ai pu voir que, comme prévu, la seule chose qui changeait était le mot Checksum :

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

La nouvelle valeur était donc 0x9360 .

J'ai démarré un noyau avec un e1000e non corrigé , et le port Ethernet fonctionnait correctement.

PS Je trouve un peu inquiétant que seul le bit le plus élevé du mot Checksum soit erroné.


J'ai utilisé bootutil pour Linux d'Intel (comme suggéré dans le post de 2011) sur une carte réseau Intel intégrée sur mon Asus Z270-A pour corriger cette erreur, sans la recompilation et les clés magiques décrites dans la réponse votée. Cela a très bien fonctionné. J'ai téléchargé l'outil depuis le site de téléchargement d'Intel

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

J'obtenais la même erreur sur Fedora 24 à partir de e1000e pilote avec carte mère ASUS ROG MAXIMUS IX HERO dotée d'un adaptateur NIC Intel I219-V.

Je trouve la solution acceptée, qui nécessite de patcher la NVM, trop risquée. Cela peut rendre votre matériel inutile.

Une solution sûre consiste à appliquer la configuration par défaut à la carte réseau à l'aide de l'utilitaire de démarrage Intel Ethernet Connections. Il fonctionne sous Linux prêt à l'emploi, pas besoin de créer une disquette de démarrage :

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

C'est ça. Redémarrez (ou rechargez e1000e pilote manuellement).


Linux
  1. Comment vérifier l'intégrité d'un fichier avec la somme de contrôle md5

  2. Comment puis-je mesurer l'utilisation réelle de la mémoire d'une application ou d'un processus ?

  3. Comment libérer des pages énormes de l'application en panne

  4. Comment trouver la version du contrôleur SATA sur un ordinateur portable Ubuntu. Est-ce que j'ai SATA 1, 2 ou 3 ? I, II ou III ?

  5. Comment surveiller l'utilisation de la mémoire dédiée au noyau ?

Qu'est-ce que la NVM (mémoire non volatile) ?

Comment Remplir 90% De La Mémoire Libre ?

Debian – Comment réparer le grub sur Debian ?

Comment réparer l'installation ?

Comment enregistrer la consommation de mémoire sous Linux ?

Comment puis-je afficher l'utilisation de la mémoire de chaque processus si je fais un 'ps -ef' ?