Ubuntu 16.10 O driver Intel e1000e não pode ser compilado. Erro: "struct net_device" não tem um membro chamado "trans_start"

1

O driver interno e1000e para um controlador Intel Gigabit Ethernet não funciona no Ubuntu, isso é um problema conhecido, com uma solução conhecida: baixe o driver do site da Intel, compile-o e instale o módulo do kernel conforme instruções de instalação do módulo kernel.

Eu baixei o driver Intel e1000e-3.3.4 de

Após a untarring, recebo este erro quando executo 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.

De acordo com alguém no sourceforge , eu devo remover gcc do repositório do Ubuntu ( sudo apt remove gcc ) , e reinstalá-lo de sua fonte. Isso, é claro, não pode ser feito, porque isso também desinstala o bbswitch-dkms build-essential dkms g++ gcc libcuda1-367 nvidia-367 nvidia-opencl-icd-367 nvidia-prime .

Encontrei um link para esta página sobre o PIE , mas ele não contém instruções simples de copiar e colar para ativar ou desativar TORTA, ou o que diabos precisa ser feito para obter este módulo de driver de rede compilado.

No Unix Stack Exchange, encontrei uma pergunta que pode ou não estar relacionada, e também não contém instruções claras para corrigir o que precisa ser corrigido: link

Meu 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

ATUALIZAÇÃO 2016-12-02

Fui aconselhado a instalar o gcc-4.8, rm gcc de /usr/bin e fazer um novo symlink. Teimoso como eu sou, eu fiz isso em vez disso (que eu acredito que é o "Modo Ubuntu" recomendado de fazer as coisas):

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

Quando eu executei make novamente, recebi outro erro. Progresso!

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

Se você usar o Google para "gcc: erro: opção de linha de comando não reconhecida '-fstack-protector-strong'", você descobrirá que não precisa de gcc-4.8 mas gcc-4.9 . Então eu fiz:

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

Quando eu executei make novamente, recebi outro erro:

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

Agora está ficando interessante porque acho que encontrei algo que mudou a partir dos kernels 4.7. Pesquisando por error: ‘struct net_device’ has no member named ‘trans_start’ me disse que eu tinha que mudar de linha 6545 :

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

Na verdade, isso removeu o erro na linha 6545. Isso ainda me deixa com um erro na linha 249-250. Este é o código atual:

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

Eu sei que preciso substituir netdev->trans_start por outra coisa, mas não sei o quê. Usar netif_trans_update(netdev) como o quarto parâmetro de pr_info não funcionará porque isso me dá

/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,
   ^

Então, o que preciso colocar lá?

Aparentemente pr_info é usado para fins de registro, então pensei, e se eu colocar as linhas 249-250 nos comentários? O resultado foi que o driver finalmente constrói (yay!), Mas parece errado comentar o código se você não sabe qual é sua função . Especialmente o código do driver do kernel.

E mesmo com um driver que compila, ainda não tenho rede depois de fazer

sudo rmmod e1000e
sudo modprobe e1000e

ATUALIZAÇÃO: A solução para um sistema de inicialização dupla é inicializar no Windows, ir para as configurações do driver da placa de rede e desativar tudo relacionado ao gerenciamento de energia. Em seguida, inicialize no Linux, reinicialize no Linux (sim, duas vezes!) E use o driver padrão fornecido pelo kernel.

    
por Amedee Van Gasse 21.11.2016 / 01:11

3 respostas

1

pesquisando netif_trans_update fornece o seguinte código:

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

que sugere que uma boa maneira de obter o trans_start de volta em pr_info seria substituir

netdev->trans_start

com

netdev_get_tx_queue(netdev,0)->trans_start.

mas você está certo, esta é uma função de log, consertar provavelmente não consertará o seu driver.

    
por Bill Reynolds 09.04.2017 / 15:09
0
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

emparelhado com 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

cria e instala perfeitamente sem modificações no Ubuntu 16.10 com kernel 4.8.0-37-generic .

não se esqueça de adicionar e1000e a / etc / modules para torná-lo permanente:

sudo echo e1000e>>/etc/modules
    
por rootw0rm 07.02.2017 / 12:00
0

Dependendo da sua placa-mãe, ao usar a fonte nomeada e1000e-3.3.5.3, você pode precisar modificar o código-fonte do netdev.c ao usar os kernels versão 4.4. * ou 4.8. * removendo a função de verificação do NVM CRC.

    
por brain 05.04.2017 / 05:05