Как стать автором
Поиск
Написать публикацию
Обновить

Установка драйвера для NIC Realtek RTL8101E в Linux

Может кому пригодится решение проблемы с низкой производительностью сетевой карты Realtek RTL8101E.
Установил Fedora 19 на ноутбук Samsung X120. В ноутбуке установлена сетевая карта
04:00.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. RTL8101E/RTL8102E PCI Express Fast Ethernet controller [10ec:8136] (rev 02).
Драйвер для нее встал вот такой:
Kernel driver in use: [b]r8169[/b]
Имя файла: /lib/modules/3.11.3-201.fc19.x86_64/kernel/drivers/net/ethernet/realtek/r8169.ko
kernel-3.11.3-201.fc19.x86_64: The Linux kernel
Источник: updates
iperf показывает трансфер порядка полутора мегабит:
[ 3] 0.0-11.9 sec 2.38 MBytes 1.68 Mbits/sec

На сайте производителя ( http://www.realtek.com )
есть исходники родного драйвера ( r8101-1.024.00.tar.bz2 ), который не собирается в новых ядрах из-за двух проблем:
1) константа
NETIF_F_HW_VLAN_RX

теперь называется
NETIF_F_HW_VLAN_CTAG_RX

2) в функцию
__vlan_hwaccel_put_tag(skb, swab16(opts2 & 0xffff))

добавлен новый (средний) параметр
__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), swab16(opts2 & 0xffff))

решение было найдено в патчах для модуля r8169.ko
после установки нового модуля iperf показывает трансфер почти 100 Мбит/сек
0.0-10.0 sec 113 MBytes 94.1 Mbits/sec
ну и сформируем новый initramfs ( в fedor'е )
# dracut -f

К сожалению модуль приходится пересобирать после каждого апдейта пакета с ядром.
patch прилагаю:
--- r8101-1.024.00.not-patched/src/r8101_n.c	2013-06-14 10:45:47.000000000 +0400
+++ r8101-1.024.00/src/r8101_n.c	2013-09-25 15:52:22.000000000 +0400
@@ -1906,7 +1906,7 @@
     }
 #else
     if (opts2 & RxVlanTag)
-        __vlan_hwaccel_put_tag(skb, swab16(opts2 & 0xffff));
+        __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), swab16(opts2 & 0xffff));
 #endif
 
     desc->opts2 = 0;
@@ -1967,7 +1967,7 @@
     else
         tp->cp_cmd &= ~RxChkSum;
 
-    if (dev->features & NETIF_F_HW_VLAN_RX)
+    if (dev->features & NETIF_F_HW_VLAN_CTAG_RX)
         tp->cp_cmd |= RxVlan;
     else
         tp->cp_cmd &= ~RxVlan;
@@ -7292,7 +7292,7 @@
 #endif
 
 #ifdef CONFIG_R8101_VLAN
-    dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
+    dev->features |= NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX;
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)
     dev->vlan_rx_kill_vid = rtl8101_vlan_rx_kill_vid;
 #endif//LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)
@@ -7305,7 +7305,7 @@
 #else
     dev->features |= NETIF_F_RXCSUM | NETIF_F_SG;
     dev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO |
-                       NETIF_F_RXCSUM | NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
+                       NETIF_F_RXCSUM | NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX;
     dev->vlan_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO |
                          NETIF_F_HIGHDMA;
 #endif

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.