R8168ドライバをkernel3.10で認識させる

R8168ドライバを継続して認識させる Fedora18編の半分続きです。

さらに言うならR8168ドライバをkernel3.8で認識させるの続きです。

kernel3.10になったときにドライバがまたもや作成されない事態に。

yumでのアップデートでkernel更新時には毎回ドライバが生成されるかどうか確認していたので今回は旧kernelが動いているうちに処理ができました。

偶数のバージョンアップだと定義の変更はよくあるのかな?

さすがに飽きてきました。今回の場合はまだ時間もたっていなかったのか日本語の記事はほぼなく、その代わりGoogleのr8168に関するサイトにこのことが書いてあったので対応は簡単でした。

kernel3.10系でNETIF_F_HW_VLAN_TXやNETIF_F_HW_VLAN_RXが微妙に表記変更されたほか、定義されるヘッダーファイルの変更、微妙な関数仕様の変更があったようです。

今回はリンクを張らずに直接差分コードを書きます。

で、patchがこれ

一応8.035.00系と8.036.00系の両方のpatchを示しておきます。ドライバのアーカイブファイルからの変更点です。

8.036.00系のファイルはGoogleのr8168に関するサイトにあったパッチファイルとほぼ同じもの(行数が違うだけ)です。

8.035.00系の場合、kernel3.8の部分に関する変更も行う必要があるためパッチファイルがちょっと長くなっています。

変更そのものはそこまで多くないのですが、この辺が大変なところですね。

linux-3.10_r8168_8.035.00.patch

--- r8168_n.c.orig	2012-12-19 19:38:56.000000000 +0900
+++ r8168_n.c	2013-08-12 09:30:00.000000000 +0900
@@ -53,6 +53,10 @@
#include 
#include 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
+#include 
+#endif
+
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)
#include 
#endif
@@ -2072,6 +2076,9 @@
	   swab16(opts2 & 0xffff));
ret = 0;
}
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
+	if (opts2 & RxVlanTag)
+		__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), swab16(opts2 & 0xffff));
#else
if (opts2 & RxVlanTag)
__vlan_hwaccel_put_tag(skb, swab16(opts2 & 0xffff));
@@ -2133,7 +2140,11 @@
else
tp->cp_cmd &= ~RxChkSum;
-	if (dev->features & NETIF_F_HW_VLAN_RX)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
+	if (dev->features & NETIF_F_HW_VLAN_CTAG_RX)
+#else
+	if (dev->features & NETIF_F_HW_VLAN_RX)
+#endif
tp->cp_cmd |= RxVlan;
else
tp->cp_cmd &= ~RxVlan;
@@ -14541,7 +14552,11 @@
spin_unlock_irqrestore(&tp->phy_lock, flags);
}
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)
static int __devinit
+#else
+static int
+#endif
rtl8168_init_board(struct pci_dev *pdev,
struct net_device **dev_out,
void __iomem **ioaddr_out)
@@ -14711,7 +14726,11 @@
goto out;
}
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)
static void __devinit
+#else
+static void
+#endif
rtl8168_init_sequence(struct rtl8168_private *tp)
{
void __iomem *ioaddr = tp->mmio_addr;
@@ -14964,7 +14983,11 @@
};
#endif
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)
static int __devinit
+#else
+static int
+#endif
rtl8168_init_one(struct pci_dev *pdev,
const struct pci_device_id *ent)
{
@@ -15054,7 +15077,11 @@
#ifdef CONFIG_R8168_VLAN
if (tp->mcfg != CFG_METHOD_DEFAULT) {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
+		dev->features |= NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX;
+#else
dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
+#endif
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)
dev->vlan_rx_kill_vid = rtl8168_vlan_rx_kill_vid;
#endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)
@@ -15069,7 +15096,11 @@
#else
dev->features |= NETIF_F_RXCSUM;
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;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
+			NETIF_F_RXCSUM | NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX;
+#else
+			NETIF_F_RXCSUM | NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
+#endif
dev->vlan_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO |
NETIF_F_HIGHDMA;
#endif
@@ -15128,7 +15159,12 @@
return 0;
}
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)
static void __devexit
+#else
+static void
+#endif
rtl8168_remove_one(struct pci_dev *pdev)
{
struct net_device *dev = pci_get_drvdata(pdev);
@@ -17649,7 +17685,11 @@
.name		= MODULENAME,
.id_table	= rtl8168_pci_tbl,
.probe		= rtl8168_init_one,
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)
.remove		= __devexit_p(rtl8168_remove_one),
+#else
+	.remove		= rtl8168_remove_one,
+#endif
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,11)
.shutdown	= rtl8168_shutdown,
#endif

linux-3.10_r8168_8.036.00.patch

--- r8168_n.c.orig	2013-06-17 20:42:48.000000000 +0900
+++ r8168_n.c	2013-08-12 09:30:00.000000000 +0900
@@ -52,6 +52,10 @@
#include 
#include 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
+#include 
+#endif
+
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)
#include 
#endif
@@ -2232,6 +2236,9 @@
								swab16(opts2 & 0xffff));
		 ret = 0;
	 }
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
+	if (opts2 & RxVlanTag)
+		__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), swab16(opts2 & 0xffff));
#else
	 if (opts2 & RxVlanTag)
		 __vlan_hwaccel_put_tag(skb, swab16(opts2 & 0xffff));
@@ -2295,7 +2302,11 @@
	 else
		 tp->cp_cmd &= ~RxChkSum;
-	if (dev->features & NETIF_F_HW_VLAN_RX)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
+	if (dev->features & NETIF_F_HW_VLAN_CTAG_RX)
+#else
+ 	if (dev->features & NETIF_F_HW_VLAN_RX)
+#endif
		 tp->cp_cmd |= RxVlan;
	 else
		 tp->cp_cmd &= ~RxVlan;
@@ -16195,7 +16206,11 @@
#ifdef CONFIG_R8168_VLAN
	 if (tp->mcfg != CFG_METHOD_DEFAULT) {
-		dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
+		dev->features |= NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX;
+#else
+ 		dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
+#endif
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)
		 dev->vlan_rx_kill_vid = rtl8168_vlan_rx_kill_vid;
#endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)
@@ -16210,7 +16225,11 @@
#else
		 dev->features |= NETIF_F_RXCSUM;
		 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;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
+			NETIF_F_RXCSUM | NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX;
+#else
+ 			NETIF_F_RXCSUM | NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
+#endif
		 dev->vlan_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO |
							  NETIF_F_HIGHDMA;
#endif

なお、8.035.00系のパッチについては自サーバーにて動作を確認したコードですが、8.036.00系のパッチコードは完全に確認されていません。

たぶん大丈夫だとは思いますが、その辺は自己責任にてお願いします。

やっぱりkernelを入れ替える前に気がつけばもうけ物

今回はちゃんと気がつけたので本当にもうけものでした。

さすがにr8168系を使っている人がだいぶ少なくなってきているとは思いますが、こういうところには気をつけていきましょう。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

この記事のトラックバック用URL