Дисклеймер

Внимание: в этом блоге могут описываться события, явления и факты при помощи ненормативной лексики. Убедитесь, что Вы готовы к этому.

пятница, 8 августа 2014 г.

Realtek r8168 и Linux 3.15, 3.16

С выходом ядра Linux 3.15 появились проблемы с компиляцией "ядерного" модуля r8168 для некоторых сетевых карт Realtek. Поскольку разработчики Realtek никогда особой оперативностью не отличались, то те люди, которые решили использовать r8168 вместо встроенного в ядро (и безупречно собирающегося) r8169 столкнулись с невозможностью полноценно пользоваться новым ядром. И в самом деле, как так, без доступа к интернету? :-)

Ниже решение с использованием отзывов и патчей, найденных на просторах сети.
Для ядра 3.15 достаточно было поменять в файле r8168_n.c (устаревшую?) функцию PREPARE_DELAYED_WORK на INIT_DELAYED_WORK и проблема решалась. В случае с ядром 3.16 потребовалось искать патч.

Собственно, вот и он, delayed_work_ethtool_ops_fix2.patch:
--- r8168-8.038.00/src/r8168_n.c.orig
+++ r8168-8.038.00/src/r8168_n.c
@@ -17542,7 +17542,11 @@ rtl8168_init_one(struct pci_dev *pdev,

     RTL_NET_DEVICE_OPS(rtl8168_netdev_ops);

+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,16,0)
     SET_ETHTOOL_OPS(dev, &rtl8168_ethtool_ops);
+#else
+    dev->ethtool_ops = &rtl8168_ethtool_ops;
+#endif

     dev->watchdog_timeo = RTL8168_TX_TIMEOUT;
     dev->irq = pdev->irq;
@@ -19119,7 +19123,11 @@ static void rtl8168_schedule_work(struct
 {
     struct rtl8168_private *tp = netdev_priv(dev);

+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,15,0)
     PREPARE_DELAYED_WORK(&tp->task, task);
+#else
+    INIT_DELAYED_WORK(&tp->task, task);
+#endif
     schedule_delayed_work(&tp->task, 4);
 }
 #endif
Для Gentoo проблема решается так:
  • Кладём патчик в /etc/portage/patches/net-misc/r8168/. Название файла особого значения, вроде бы, не имеет. Если субдиректории net-misc и r8168 не созданы - самое время их создать, mkdir -p в помощь.
  • В ebuild r8168 (в моём случае находится по адресу /usr/portage/net-misc/r8168/r8168-8.038.00.ebuild, в Вашем может быть иным, если Вы используете другую версию r8168) добавляем возможность использовать пользовательские патчи из /etc/portage/patches - вставляем перед секцией pkg_setup следующее:
src_prepare() {
        epatch_user
}
  • После этого сохраняем ebuild и делаем digest, чтобы portage "ознакомился" с размером нового ebuild'а с помощью 
ebuild /usr/portage/net-misc/r8168/r8168-8.038.00.ebuild digest
После этого модуль можно компилировать. Проверено на ядрах 3.15.8 и 3.16.0, всё работает :-)

Комментариев нет:

Отправить комментарий