Вопрос или проблема
У меня есть Intel Dragon Canyon Nuc Extreme с сетевой картой Marvell AQC113C. Когда я установил Ubuntu 24, сетевая карта вызвала 2-минутную задержку при загрузке, поэтому пришлось отключить её в BIOS. Сегодня пришло обновление, но оно не работает. Это Ubuntu 24.04.
Настройка atlantic (1740909920) ...
make -j4 -C /lib/modules/6.11.0-17-generic/build M="/var/build_aq_drv/1740909920/Linux" модули
make[1]: вход в каталог '/usr/src/linux-headers-6.11.0-17-generic'
внимание: компилятор отличается от использованного для сборки ядра
Ядро было собрано с помощью: x86_64-linux-gnu-gcc-13 (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0
Вы используете: gcc-13 (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0
CC [M] /var/build_aq_drv/1740909920/Linux/aq_pci_func.o
CC [M] /var/build_aq_drv/1740909920/Linux/aq_ethtool.o
CC [M] /var/build_aq_drv/1740909920/Linux/hw_atl/hw_atl_fw_hostboot.o
CC [M] /var/build_aq_drv/1740909920/Linux/hw_atl/hw_atl_fw_image.o
/var/build_aq_drv/1740909920/Linux/aq_ethtool.c: В функции ‘aq_ethtool_get_ts_info’:
/var/build_aq_drv/1740909920/Linux/aq_ethtool.c:931:38: ошибка: передача аргумента 2 функции ‘ethtool_op_get_ts_info’ из несовместимого типа указателя [-Werror=incompatib
le-pointer-types]
931 | ethtool_op_get_ts_info(ndev, info);
| ^~~~
| |
| struct ethtool_ts_info *
В файле, включенном из /var/build_aq_drv/1740909920/Linux/aq_common.h:18,
из /var/build_aq_drv/1740909920/Linux/aq_ethtool.h:13,
из /var/build_aq_drv/1740909920/Linux/aq_ethtool.c:12:
./include/linux/ethtool.h:1200:59: замечание: ожидался аргумент ‘struct kernel_ethtool_ts_info *’, но аргумент имеет тип ‘struct ethtool_ts_info *’
1200 | struct kernel_ethtool_ts_info *eti);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
/var/build_aq_drv/1740909920/Linux/aq_ethtool.c: На уровне файла:
/var/build_aq_drv/1740909920/Linux/aq_ethtool.c:1647:32: ошибка: инициализация ‘int (*)(struct net_device *, struct kernel_ethtool_ts_info *)’ из несовместимого указателя типа ‘int (*)(struct net_device *, struct ethtool_ts_info *)’ [-Werror=incompatible-pointer-types]
1647 | .get_ts_info = aq_ethtool_get_ts_info,
| ^~~~~~~~~~~~~~~~~~~~~~
/var/build_aq_drv/1740909920/Linux/aq_ethtool.c:1647:32: замечание: (рядом с инициализацией для ‘aq_ethtool_ops.get_ts_info’)
/var/build_aq_drv/1740909920/Linux/aq_pci_func.c: В функции ‘aq_pci_probe’:
/var/build_aq_drv/1740909920/Linux/aq_pci_func.c:383:37: ошибка: ‘PCI_IRQ_LEGACY’ не объявлено (первое использование в этой функции); возможно, вы имели ввиду ‘NR_IRQS_LEGACY’?
383 | PCI_IRQ_LEGACY);
| ^~~~~~~~~~~~~~
| NR_IRQS_LEGACY
/var/build_aq_drv/1740909920/Linux/aq_pci_func.c:383:37: замечание: каждый не объявленный идентификатор сообщается только один раз для каждой функции, в которой он появляется
make[3]: *** [scripts/Makefile.build:244: /var/build_aq_drv/1740909920/Linux/aq_pci_func.o] Ошибка 1
make[3]: *** Ожидание незавершенных заданий....
cc1: некоторые предупреждения обрабатываются как ошибки
make[3]: *** [scripts/Makefile.build:244: /var/build_aq_drv/1740909920/Linux/aq_ethtool.o] Ошибка 1
make[2]: *** [/usr/src/linux-headers-6.11.0-17-generic/Makefile:1931: /var/build_aq_drv/1740909920/Linux] Ошибка 2
make[1]: *** [Makefile:224: __sub-make] Ошибка 2
make[1]: выход из каталога '/usr/src/linux-headers-6.11.0-17-generic'
make: *** [Makefile:36: all] Ошибка 2
chmod: невозможно получить доступ к ‘atlantic.ko’: Нет такого файла или каталога
cp: невозможно указать ‘atlantic.ko’: Нет такого файла или каталога
insmod: ОШИБКА: не удалось загрузить модуль atlantic.ko: Нет такого файла или каталога
dpkg: ошибка при обработке пакета atlantic (--configure):
установленный пакет atlantic: скрипт пост-установки подпроцесса завершился с кодом ошибки 1
Я тоже проголосовал за это, но мой аккаунт слишком новый, чтобы это засчитывалось. Я тоже столкнулся с этой проблемой с такими же ошибками, как у автора:
make -j4 -C /lib/modules/6.8.0-55-generic/build M=”/home/wpattison/nicgiga/Marvell/aquantia/Linux” модули
make[1]: вход в каталог ‘/usr/src/linux-headers-6.8.0-55-generic’
внимание: компилятор отличается от использованного для сборки ядра
Ядро было собрано с помощью: x86_64-linux-gnu-gcc-13 (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0
Вы используете: gcc-13 (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0
CC [M] /home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_main.o
CC [M] /home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_nic.o
CC [M] /home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_pci_func.o
CC [M] /home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_vec.o
CC [M] /home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_ring.o
CC [M] /home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_ptp.o
CC [M] /home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_filters.o
/home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_ptp.c:534:6: предупреждение: отсутствие предыдущего прототипа для ‘aq_ptp_ts_valid’ [-Wmissing-prototypes]
534 | bool aq_ptp_ts_valid(struct aq_ptp_pid *aq_pid, u64 diff)
| ^~~~~~~~~~~~~~~
CC [M] /home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_hw_utils.o
CC [M] /home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_ethtool.o
CC [M] /home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_drvinfo.o
CC [M] /home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_trace.o
/home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_ethtool.c:989:63: предупреждение: ‘struct ethtool_keee’ объявлен внутри списка параметров и не будет виден за пределами этого определения или объявления
989 | static int aq_ethtool_get_eee(struct net_device *ndev, struct ethtool_keee *eee)
| ^~~~~~~~~~~~
/home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_ethtool.c: В функции ‘aq_ethtool_get_eee’:
/home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_ethtool.c:1005:37: ошибка: недопустимое использование неопределенного типа ‘struct ethtool_keee’
1005 | eee_mask_to_ethtool_mask(eee->supported, supported_rates);
| ^~
/home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_ethtool.c:1008:34: ошибка: недопустимое использование неопределенного типа ‘struct ethtool_keee’
1008 | linkmode_copy(eee->advertised, eee->supported);
| ^~
/home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_ethtool.c:1008:51: ошибка: недопустимое использование неопределенного типа ‘struct ethtool_keee’
1008 | linkmode_copy(eee->advertised, eee->supported);
| ^~
/home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_ethtool.c:1010:37: ошибка: недопустимое использование неопределенного типа ‘struct ethtool_keee’
1010 | eee_mask_to_ethtool_mask(eee->lp_advertised, rate);
| ^~
/home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_ethtool.c:1012:12: ошибка: недопустимое использование неопределенного типа ‘struct ethtool_keee’
1012 | eee->eee_enabled = !linkmode_empty(eee->advertised);
| ^~
/home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_ethtool.c:1012:47: ошибка: недопустимое использование неопределенного типа ‘struct ethtool_keee’
1012 | eee->eee_enabled = !linkmode_empty(eee->advertised);
| ^~
/home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_ethtool.c:1014:12: ошибка: недопустимое использование неопределенного типа ‘struct ethtool_keee’
1014 | eee->tx_lpi_enabled = eee->eee_enabled;
| ^~
/home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_ethtool.c:1014:34: ошибка: недопустимое использование неопределенного типа ‘struct ethtool_keee’
1014 | eee->tx_lpi_enabled = eee->eee_enabled;
| ^~
/home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_ethtool.c:1016:20: ошибка: недопустимое использование неопределенного типа ‘struct ethtool_keee’
1016 | eee->eee_active = true;
| ^~
/home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_ethtool.c: На уровне файла:
/home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_ethtool.c:1056:63: предупреждение: ‘struct ethtool_keee’ объявлен внутри списка параметров и не будет виден за пределами этого определения или объявления
1056 | static int aq_ethtool_set_eee(struct net_device *ndev, struct ethtool_keee eee)
| ^~~~~~~~~~~~
В файле, включенном из ./include/asm-generic/bug.h:22,
from ./arch/x86/include/asm/bug.h:87,
from ./include/linux/bug.h:5,
from ./arch/x86/include/asm/paravirt.h:19,
from ./arch/x86/include/asm/cpuid.h:62,
from ./arch/x86/include/asm/processor.h:19,
from ./include/linux/sched.h:13,
from ./include/linux/ratelimit.h:6,
from ./include/linux/dev_printk.h:16,
from ./include/linux/device.h:15,
from ./include/linux/pm_runtime.h:11,
from /home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_ethtool.c:10:
/home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_ethtool.c: В функции ‘aq_ethtool_set_eee’:
/home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_ethtool.c:1068:70: ошибка: недопустимое использование неопределенного типа ‘struct ethtool_keee’
1068 | aq_pr_verbose(aq_nic, AQ_MSG_DEBUG, “eee_enabled = %d\n”, eee->eee_enabled);
| ^~
./include/linux/printk.h:429:33: заметка: в определении макроса ‘printk_index_wrap’
429 | _p_func(_fmt, ##VA_ARGS);
| ^~~~~~~~~~~
./include/linux/printk.h:520:9: заметка: в расширении макроса ‘printk’
520 | printk(KERN_NOTICE pr_fmt(fmt), ##VA_ARGS)
| ^~~~~~
/home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_hw_utils.h:30:17: заметка: в расширении макроса ‘pr_notice’
30 | pr_notice(“[%s:%d(%s)]” fmt,
| ^~~~~~~~~
/home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_ethtool.c:1068:9: заметка: в расширении макроса ‘aq_pr_verbose’
1068 | aq_pr_verbose(aq_nic, AQ_MSG_DEBUG, “eee_enabled = %d\n”, eee->eee_enabled);
| ^~~~~~~~~~~~~
/home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_ethtool.c:1080:16: ошибка: недопустимое использование неопределенного типа ‘struct ethtool_keee’
1080 | if (eee->eee_enabled) {
| ^~
/home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_ethtool.c: На уровне файла:
/home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_ethtool.c:1612:32: ошибка: инициализация ‘int ()(struct net_device *, struct ethtool_eee )’ из несовместимого указателя типа ‘int ()(struct net_device *, struct ethtool_keee )’ [-Werror=incompatible-pointer-types]
1612 | .get_eee = aq_ethtool_get_eee,
| ^~~~~~~~~~~~~~~~~~
/home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_ethtool.c:1612:32: заметка: (рядом с инициализацией для ‘aq_ethtool_ops.get_eee’)
/home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_ethtool.c:1613:32: ошибка: инициализация ‘int ()(struct net_device *, struct ethtool_eee )’ из несовместимого указателя типа ‘int ()(struct net_device *, struct ethtool_keee *)’ [-Werror=incompatible-pointer-types]
1613 | .set_eee = aq_ethtool_set_eee,
| ^~~~~~~~~~~~~~~~~~
/home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_ethtool.c:1613:32: заметка: (рядом с инициализацией для ‘aq_ethtool_ops.set_eee’)
cc1: некоторые предупреждения обрабатываются как ошибки
make[3]: *** [scripts/Makefile.build:243: /home/wpattison/nicgiga/Marvell/aquantia/Linux/aq_ethtool.o] Ошибка 1
make[3]: *** Ожидание незавершенных заданий….
make[2]: *** [/usr/src/linux-headers-6.8.0-55-generic/Makefile:1925: /home/wpattison/nicgiga/Marvell/aquantia/Linux] Ошибка 2
make[1]: *** [Makefile:240: __sub-make] Ошибка 2
make[1]: выход из каталога ‘/usr/src/linux-headers-6.8.0-55-generic’
make: *** [Makefile:36: all] Ошибка 2
.
Ответ или решение
Проблема с драйвером сетевой карты Marvell AQC113C на Intel Dragon Canyon NUC Extreme, установленной с Ubuntu 24.04, возникает из-за несовместимости и ошибок компиляции. Сетевое устройство (NIC) вызывает задержку загрузки системы на две минуты, и после обновления драйвера возникают ошибки в процессе сборки модуля ядра. Рассмотрим эту проблему с теоретической, практической и прикладной точек зрения.
Теория
Теоретически, драйвера – это программные коды, которые позволяют ОС взаимодействовать с аппаратным обеспечением. Драйвера для сетевых карт часто требуют регулярных обновлений для совместимости с новыми версиями ядра операционной системы. Когда исходный код драйвера не соответствует новому API ядра или когда интерфейсы функций изменяются, это может вызвать ошибки компиляции. Переход на Ubuntu 24.04 подразумевает использование новых версий ядра и компилятора, что может привести к несовместимости с существующими драйверами.
Пример
В вашем случае во время установки пакета ‘atlantic’, который отвечает за драйверы для Marvell AQC113C NIC, выдается предупреждение о различии в компиляторах. Хотя, номинально ваше окружение использует тот же компилятор, что и ядро, конфликты вызывают ошибки в компиляции таких файлов, как aq_ethtool.c
и aq_pci_func.c
. Указывает это на возможные изменения в API или структуре данных, такие как ethtool_ts_info
, которые были модифицированы в новых версиях ядра.
Ошибки:
- incompatible-pointer-types при вызове
ethtool_op_get_ts_info
, где ожидается аргумент типаstruct kernel_ethtool_ts_info *
, но предоставленstruct ethtool_ts_info *
. - ‘PCI_IRQ_LEGACY’ undeclared указывает на изменение или удаление макроса из последней версии ядра.
- warnings treated as errors – компилятор не игнорирует предупреждения, что приводит к сбою всего процесса компиляции.
Применение
Для решения проблемы с Marvell AQC113C NIC на Ubuntu 24.04, выполните следующие шаги:
-
Обновление системы и зависимостей: Убедитесь, что все пакеты и системные файлы обновлены до последних стабильных версий. Для этого выполните:
sudo apt update && sudo apt upgrade
-
Настройка компилятора: Обратитесь к используемому компилятору и его версиям. Убедитесь, что
gcc
версии использующейся для ядра полностью соответствует. Если необходимо, удалите старые версии и установите или перестройте требуемую версию компилятора. -
Загрузка обновленных исходников драйвера: Проверьте на сайте производителя (Marvell или Intel) наличие обновлений драйвера, которые могли быть запущены для поддержки новых Ubuntu версий и ядра. Это может включать в себя модифицированные
.c
файлы, устраняющие текущие ошибки. -
Редактирование исходного кода и устранение ошибок: Если наличие обновлений отсутствует, желательно применить исправления вручную. В случае ошибок, связанных с изменившимися API, выполняем:
- Изучить изменения в структуре данных и функция в последней документации ядра.
- Внести корректировки в проблемные участки
aq_ethtool.c
и другие файлы исходного кода драйвера.
-
Пересборка и установка драйвера: Пересоберите драйвер с учетом задания исправленного кода:
make clean make -j$(nproc) sudo make install
-
Перезагрузка системы: Перезагрузите вашу систему, чтобы изменения вступили в силу.
Эти шаги помогут устранить проблемы с сетевым драйвером Marvell AQC113C после обновления Ubuntu до версии 24.04, обеспечив корректную работу вашей системы без длительных задержек загрузки или ошибок.