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系を使っている人がだいぶ少なくなってきているとは思いますが、こういうところには気をつけていきましょう。