web-dev-qa-db-fra.com

Le pilote Ubuntu 16.10 Intel e1000e ne peut pas être compilé. Erreur: "struct net_device" n'a pas de membre nommé "trans_start"

Le pilote intégré e1000e pour un contrôleur Intel Gigabit Ethernet ne fonctionne pas sous Ubuntu. Il s'agit d'un problème connu avec une solution connue: téléchargez le pilote sur le site Web d'Intel, compilez-le et installez le module du noyau conformément au module du noyau habituel. instructions d'installation.

J'ai téléchargé le pilote Intel e1000e-3.3.4 à partir de https://downloadcenter.intel.com/download/15817/Intel-Network-Adapter-Driver-for-PCI-E-Gigabit-Network-Connections-under -Linux-? Product = 70831

Après avoir annulé la conversation, je reçois cette erreur lorsque je lance make:

cc1: error: code model kernel does not support PIC mode /bin/sh: 1: [:
-ge: unexpected operator
Makefile:181: *** *** Aborting the build. *** This driver is not supported on kernel versions older than 2.4.0.  Stop.

Selon quelqu'un sur sourceforge , je devrais retirer gcc du référentiel d'Ubuntu (Sudo apt remove gcc), et le réinstaller à partir de sa source. Cela ne peut évidemment pas être fait car cela désinstallerait également bbswitch-dkms build-essential dkms g++ gcc libcuda1-367 nvidia-367 nvidia-opencl-icd-367 nvidia-prime.

J'ai trouvé un lien vers cette page à propos de PIE , mais il ne contient pas d'instructions simples de copier-coller pour activer ou désactiver PIE, ou quoi que ce soit d'autre qui doit être fait pour compiler ce module de pilote réseau.

Sur Unix Stack Exchange, j’ai trouvé une question qui n’était peut-être pas liée, et elle ne contient pas non plus d'instructions claires pour corriger les problèmes à corriger: https://unix.stackexchange.com/questions/320470/apply-kernel-patch-to-support-pic-mode

Mon uname -a:

Linux kerbol 4.8.0-27-generic #29-Ubuntu SMP Thu Oct 20 21:03:13 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

UPDATE 2016-12-02

On m'a conseillé d'installer gcc-4.8, rmgcc à partir de /usr/bin et de créer un nouveau lien symbolique. Têtu comme je le suis, je l’ai fait à la place (ce qui, à mon avis, est la "méthode à suivre Ubuntu" recommandée):

Sudo apt install gcc-4.8
Sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50
Sudo update-alternatives --config gcc

Lorsque j'ai exécuté à nouveau make, une autre erreur s'est produite. Le progrès!

make -C /lib/modules/4.8.0-27-generic/build SUBDIRS=/home/amedee/e1000e-3.3.4/src modules
make[1]: Entering directory '/usr/src/linux-headers-4.8.0-27-generic'
  CC [M]  /home/amedee/e1000e-3.3.4/src/netdev.o
gcc: error: unrecognized command line option ‘-fstack-protector-strong’
scripts/Makefile.build:289: recipe for target '/home/amedee/e1000e-3.3.4/src/netdev.o' failed
make[2]: *** [/home/amedee/e1000e-3.3.4/src/netdev.o] Error 1
Makefile:1489: recipe for target '_module_/home/amedee/e1000e-3.3.4/src' failed
make[1]: *** [_module_/home/amedee/e1000e-3.3.4/src] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-4.8.0-27-generic'
Makefile:247: recipe for target 'default' failed
make: *** [default] Error 2

Si vous recherchez Google "gcc: erreur: option de ligne de commande non reconnue" -fstack-protector-strong "", vous constaterez que vous n’avez pas besoin de gcc-4.8 mais de gcc-4.9. Alors j'ai fait:

Sudo apt install gcc-4.9
Sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 50
Sudo update-alternatives --config gcc

Quand j'ai de nouveau exécuté make, j'ai encore une autre erreur:

make -C /lib/modules/4.8.0-27-generic/build SUBDIRS=/home/amedee/e1000e-3.3.4/src modules
make[1]: Entering directory '/usr/src/linux-headers-4.8.0-27-generic'
  CC [M]  /home/amedee/e1000e-3.3.4/src/netdev.o
In file included from ./include/linux/kernel.h:13:0,
                 from ./include/linux/list.h:8,
                 from ./include/linux/module.h:9,
                 from /home/amedee/e1000e-3.3.4/src/netdev.c:24:
/home/amedee/e1000e-3.3.4/src/netdev.c: In function ‘e1000e_dump’:
/home/amedee/e1000e-3.3.4/src/netdev.c:250:25: error: ‘struct net_device’ has no member named ‘trans_start’
    netdev->state, netdev->trans_start, netdev->last_rx);
                         ^
./include/linux/printk.h:283:34: note: in definition of macro ‘pr_info’
  printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)
                                  ^
/home/amedee/e1000e-3.3.4/src/netdev.c: In function ‘e1000_xmit_frame’:
/home/amedee/e1000e-3.3.4/src/netdev.c:6545:8: error: ‘struct net_device’ has no member named ‘trans_start’
  netdev->trans_start = jiffies;
        ^
scripts/Makefile.build:289: recipe for target '/home/amedee/e1000e-3.3.4/src/netdev.o' failed
make[2]: *** [/home/amedee/e1000e-3.3.4/src/netdev.o] Error 1
Makefile:1489: recipe for target '_module_/home/amedee/e1000e-3.3.4/src' failed
make[1]: *** [_module_/home/amedee/e1000e-3.3.4/src] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-4.8.0-27-generic'
Makefile:247: recipe for target 'default' failed
make: *** [default] Error 2

Maintenant cela devient intéressant parce que je pense avoir trouvé quelque chose qui a changé à partir des noyaux 4.7. Googler pour error: ‘struct net_device’ has no member named ‘trans_start’ m'a dit que je devais changer de ligne 6545 :

-netdev->trans_start = jiffies;
+netif_trans_update(netdev);

En effet, cela a supprimé l'erreur à la ligne 6545. Cela me laisse toujours une erreur à la ligne 249-250. C'est le code actuel:

pr_info("%-15s %016lX %016lX %016lX\n", netdev->name,
  netdev->state, netdev->trans_start, netdev->last_rx);

Je sais que je dois remplacer netdev->trans_start par quelque chose d'autre, mais je ne sais pas quoi. Utiliser netif_trans_update(netdev) comme 4ème paramètre de pr_info ne fonctionnera pas car cela me donne

/home/amedee/e1000e-3.3.4/src/netdev.c: In function ‘e1000e_dump’:
/home/amedee/e1000e-3.3.4/src/netdev.c:249:3: error: invalid use of void expression
   pr_info("%-15s %016lX %016lX %016lX\n", netdev->name,
   ^

Alors, que dois-je y mettre à la place?

Apparemment pr_info est utilisé à des fins de journalisation. Je me suis donc demandé si je mettais les lignes 249 à 250 dans les commentaires. Le résultat est que le pilote construit enfin (yay!) Mais il est inacceptable de commenter le code si vous ne savez pas quelle est sa fonction . Surtout le code du pilote du noyau.

Et même avec un pilote qui compile, je n'ai toujours pas de réseau après.

Sudo rmmod e1000e
Sudo modprobe e1000e

MISE À JOUR: La solution pour un système à double démarrage consiste à démarrer Windows, accéder aux paramètres de pilote de la carte réseau et désactiver tout ce qui concerne la gestion de l'alimentation. Ensuite, démarrez sous Linux, redémarrez sous Linux (oui, deux fois!) Et utilisez le pilote par défaut fourni par le noyau.

1
Amedee Van Gasse

Googling netif_trans_update donne le code suivant:

/* legacy drivers only, netdev_start_xmit() sets txq->trans_start */
 static inline void netif_trans_update(struct net_device *dev)
 {
         struct netdev_queue *txq = netdev_get_tx_queue(dev, 0);

        if (txq->trans_start != jiffies)
                 txq->trans_start = jiffies;
 }

ce qui suggère qu'un bon moyen de récupérer le trans_start dans pr_info serait de remplacer

netdev->trans_start

avec

netdev_get_tx_queue(netdev,0)->trans_start.

mais vous avez raison, il s’agit d’une fonction de journalisation, sa résolution ne réglera probablement pas votre pilote.

1
Bill Reynolds
Sudo apt install gcc-4.9
Sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 50
Sudo update-alternatives --config gcc

couplé avec e1000e-3.3.5.3.tar.gz :

tar -xzvf e1000e-3.3.5.3.tar.gz
cd e1000e-3.3.5.3/src
Sudo make install
Sudo rmmod e1000e;Sudo modprobe e1000e

construit et installe parfaitement sans aucune modification sous Ubuntu 16.10 avec le noyau 4.8.0-37-generic.

n'oubliez pas d'ajouter e1000e à/etc/modules pour le rendre permanent:

Sudo echo e1000e>>/etc/modules
0
rootw0rm

Selon votre carte mère, lorsque vous utilisez la source nommée e1000e-3.3.5.3, vous devrez peut-être modifier le code source netdev.c lorsque vous utilisez la version 4.4. * Ou 4.8. * Du noyau en supprimant la fonction de contrôle CRC de NVM.

0
brain