r8168/r8169誤認識問題(Kernel 4.11.0以降編)

RTL8111/8168を使用しているNICは本来はドライバにr8168が使用されるところ、誤ってr8169が使用される問題があります。

本件の対処はREALTEKからドライバをダウンロードしてきてコンパイルすることになるのですが、Kernel4.11でコンパイルが通らない問題が発生しました…!
なお、現状の最新版の8.044.02を使用しています。

$ make modules
make -C src/ modules
make[1]: ディレクトリ `/r8168-8.044.02.org/src' に入ります
make -C /lib/modules/4.11.3-1.el7.elrepo.x86_64/build M=/r8168-8.044.02.org/src modules
make[2]: ディレクトリ `/usr/src/kernels/4.11.3-1.el7.elrepo.x86_64' に入ります
CC [M] /r8168-8.044.02.org/src/r8168_n.o
/r8168-8.044.02.org/src/r8168_n.c: 関数 ‘rtl8168_rx_interrupt’ 内:
/r8168-8.044.02.org/src/r8168_n.c:25735:28: エラー: ‘struct net_device’ は ‘last_rx’ という名前のメンバを持っていません
dev->last_rx = jiffies;
^
make[3]: *** [/r8168-8.044.02.org/src/r8168_n.o] エラー 1
make[2]: *** [_module_/r8168-8.044.02.org/src] エラー 2
make[2]: ディレクトリ `/usr/src/kernels/4.11.3-1.el7.elrepo.x86_64' から出ます
make[1]: *** [modules] エラー 2
make[1]: ディレクトリ `/r8168-8.044.02.org/src' から出ます
make: *** [modules] エラー 2

どうやらKernel4.11でnet_device構造体からlast_rxがなくなったのが原因の様子。
ということでr8168_n.cのlast_rx前後に#ifを入れる対応をします。

#if LINUX_VERSION_CODE < KERNEL_VERSION(4,11,0)
dev->last_rx = jiffies;
#endif

これでコンパイルが通るようになります。

カテゴリー: linux パーマリンク