Ubuntu 16.10 драйвер Intel e1000e не может быть скомпилирована. Ошибка: ‘структура net_device’ имеет названный ‘trans_start’ участника

Встроенный e1000e драйвер для контроллера Intel Gigabit Ethernet не работает в Ubuntu, это - известная проблема с известным решением: загрузите драйвер с веб-сайта Intel, скомпилируйте его и установите модуль ядра как обычно инструкции по установке модуля ядра.

Я загрузил драйвер Intel e1000e-3.3.4 с https://downloadcenter.intel.com/download/15817/Intel-Network-Adapter-Driver-for-PCI-E-Gigabit-Network-Connections-under-Linux-? product=70831

После того, чтобы несмолить я получаю эту ошибку, когда я работаю 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.

Согласно кому-то на SourceForge, я должен удалить gcc из репозитория Ubuntu (sudo apt remove gcc), и переустановите его от, он - источник. Это, конечно, не может быть сделано, потому что это также удалило бы bbswitch-dkms build-essential dkms g++ gcc libcuda1-367 nvidia-367 nvidia-opencl-icd-367 nvidia-prime.

Я нашел ссылку на эту страницу о КРУГЕ, но это не содержит простые copy&paste инструкции включить или отключить КРУГ, или независимо от того, что ад должен быть сделан, чтобы скомпилировать этот модуль сетевого драйвера.

На Exchange Стопки Unix я нашел вопрос, который может или не может быть связан, и он также не содержит четкие указания исправить безотносительно потребностей, которые будут исправлены: https://unix.stackexchange.com/questions/320470/apply-kernel-patch-to-support-pic-mode

Мой 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

ОБНОВЛЕНИЕ 02.12.2016

Мне рекомендовали установить gcc-4.8, rm gcc от /usr/bin и сделайте новую символьную ссылку. Упрямый, как я, я сделал это вместо этого (которому я верю, рекомендуемая "Ubuntu Способ" выполнения вещей):

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

Когда я работал make снова, я получил другую ошибку. Прогрессируйте!

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

Если Вы Google для "gcc: ошибка: нераспознанный параметр командной строки ‘-fstack-protector-strong’", затем Вы найдете, что Вам не нужно gcc-4.8 но gcc-4.9. Таким образом, я сделал:

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

Когда я работал make снова, я получил еще одну ошибку:

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

Теперь это становится интересным, потому что я думаю, что нашел что-то, что изменило запуск с 4,7 ядер. Поиск с помощью Google для error: ‘struct net_device’ has no member named ‘trans_start’ сказанный меня, что я должен был изменить строку 6545:

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

Действительно, это удалило ошибку в строке 6545. Это все еще оставляет меня с ошибкой в строке 249-250. Это - текущий код:

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

Я знаю, что должен заменить netdev->trans_start с чем-то еще, но я не знаю что. Используя netif_trans_update(netdev) как 4-й параметр pr_info не будет работать, потому что это дает мне

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

Таким образом, что я должен поместить там вместо этого?

По-видимому, pr_info используется для входа целей, таким образом, я думал, что, если я поместил строки 249-250 в комментарии? Результат состоял в том, что драйвер наконец создает (yay!), но чувствует себя неправильным закомментировать код, если Вы не знаете то, что это - функция. Код особенно драйвера ядра.

И даже с драйвером, который компилирует, у меня все еще нет сети после того, как я делаю

sudo rmmod e1000e
sudo modprobe e1000e

ОБНОВЛЕНИЕ: решение для системы двойной загрузки состоит в том, чтобы загрузиться в Windows, перейдите к настройкам драйвера сетевой платы и отключите все связанное с управлением питанием. Затем начальная загрузка в Linux, перезагрузка в Linux (да, дважды!) и использование драйвер по умолчанию, обеспеченный ядром.

1
задан 13 April 2017 в 15:37

3 ответа

Поиск с помощью Google netif_trans_update дает следующий код:

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

, который предлагает, чтобы хороший способ вернуть trans_start в pr_info состоял бы в том, чтобы заменить

netdev->trans_start

с

netdev_get_tx_queue(netdev,0)->trans_start.

, но Вы правы, это - функция журнала, устранение его, вероятно, не починит Ваш драйвер.

1
ответ дан 7 December 2019 в 15:44
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

соединенный с 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

сборки и установки, превосходные без модификаций на Ubuntu 16.10 с ядром 4.8.0-37-generic.

не забывают добавлять e1000e к/etc/modules для создания этого постоянным:

sudo echo e1000e>>/etc/modules
0
ответ дан 7 December 2019 в 15:44

В зависимости от Вашей материнской платы при использовании именованного e1000e-3.3.5.3 источника Вы, возможно, должны изменить netdev.c исходный код при использовании версии 4.4 ядер.* или 4.8.* путем удаления CRC NVM проверяют функцию.

0
ответ дан 7 December 2019 в 15:44

Другие вопросы по тегам:

Похожие вопросы: