CentOS7にRealtek 8125のドライバをインストール

# 導入
CentOS7のサーバーにPlanexの2.5GbE NIC、GPE-2500Tを導入したところデフォルトではドライバが当たらなかったので、どれどれ手動で入れようかとサポートから落としたドライバを入れようとしたらエラーで動かなかった。
明らかにドライバのソースがコンパイルエラーを起こしており、目の前が真っ暗になる。

```shell
In file included from /usr/local/src/r8125-9.005.06/src/r8125_n.c:83:0:
/usr/local/src/r8125-9.005.06/src/r8125.h:69:20: エラー: ‘ether_addr_copy’ が再定義されました
 static inline void ether_addr_copy(u8 *dst, const u8 *src)
                    ^
In file included from /usr/local/src/r8125-9.005.06/src/r8125_n.c:43:0:
include/linux/etherdevice.h:246:20: 備考: 前の ‘ether_addr_copy’ の宣言はここです
 static inline void ether_addr_copy(u8 *dst, const u8 *src)
                    ^
/usr/local/src/r8125-9.005.06/src/r8125_n.c:11573:9: エラー: 初期化子内で不明なフィールド ‘ndo_change_mtu’ が指定されています
         .ndo_change_mtu     = rtl8125_change_mtu,
         ^
/usr/local/src/r8125-9.005.06/src/r8125_n.c:11573:9: 警告: 初期化子の周りに中括弧がありません [-Wmissing-braces]
/usr/local/src/r8125-9.005.06/src/r8125_n.c:11573:9: 警告: (‘rtl8125_netdev_ops.<無名>’ 用の初期化付近) [-Wmissing-braces]
/usr/local/src/r8125-9.005.06/src/r8125_n.c:11573:9: 警告: 互換性のないポインタ型からの初期化です [デフォルトで有効]
/usr/local/src/r8125-9.005.06/src/r8125_n.c:11573:9: 警告: (‘rtl8125_netdev_ops.<無名>.ndo_get_stats64’ 用の初期化付近) [デフォルトで有効]
/usr/local/src/r8125-9.005.06/src/r8125_n.c: 関数 ‘rtl8125_poll_msix_other’ 内:
/usr/local/src/r8125-9.005.06/src/r8125_n.c:11742:22: 警告: 使用されない変数 ‘work_to_do’ です [-Wunused-variable]
         unsigned int work_to_do = RTL_NAPI_QUOTA(budget, dev);
                      ^
/usr/local/src/r8125-9.005.06/src/r8125_n.c: 関数 ‘rtl8125_rx_interrupt’ 内:
/usr/local/src/r8125-9.005.06/src/r8125_n.c:14337:28: エラー: ‘struct net_device’ は ‘last_rx’ という名前のメンバを持っていません
                         dev->last_rx = jiffies;
                            ^

```

# 対処
見るからに根が深そうな問題に絶望しかけていたところ、偉大なる先人が同様のエラーを解決してくれている記事を発見。
https://kusoneko.blogspot.com/2018/05/change-centos-7.5-r8168-driver.html
Realtek 8168について書かれた内容であったものの、Realtek 8125でもほぼ同じ対応で解決することができた。（ドライバは同じなので当然といえば当然）

# 手順
Planexが配布していたドライバはRealtek公式ドライバの再配布だった（おまけに少し古い）ので、本家の方から最新版を取得。
（一番上の2.5G Ethernet LINUX driver r8125 for kernel up to 5.19）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295330/6f656b82-f19f-7fb5-5128-43ead641691c.png)
落としてきた圧縮ファイルを /usr/local/src/ 辺りの適当なディレクトリに解凍。
```sh
> cd /usr/local/src/
> tar -jxvf r8125-9.009.02.tar.bz2
> cd r8125-9.009.02/
```
そして元記事を参考にソースを編集する。
### ■ src/r8125.h
```c:src/r8125.h
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0)
```
KERNEL_VERSION(3,14,0)で検索し、最初に引っかかった行を以下のように書き換える。ドライバv9.005.06では68行目にあった。
```c
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
```
これでether_addr_copyの多重定義エラーは消える。
### ■ src/r8125_n.c
```c:src/r8125_n.c
.ndo_change_mtu     = rtl8125_change_mtu,
```
.ndo_change_mtuで検索し、該当行（1箇所しかないはず）を以下のように書き換える。v9.005.06では11573行目にあった。
```c
.ndo_change_mtu_rh74     = rtl8125_change_mtu,
```
これで不明なフィールド'ndo_change_mtu'のエラーが解消。
同じソースをさらに編集する。
```c:src/r8125_n.c
#if LINUX_VERSION_CODE < KERNEL_VERSION(4,11,0)
  dev->last_rx = jiffies;
#endif //LINUX_VERSION_CODE < KERNEL_VERSION(4,11,0)
```
dev->last_rxで検索し、該当行（これも1箇所）を前後の行ごとコメントアウトする。v9.005.06では14336～14338行にあった。
```c
//#if LINUX_VERSION_CODE < KERNEL_VERSION(4,11,0)
//  dev->last_rx = jiffies;
//#endif //LINUX_VERSION_CODE < KERNEL_VERSION(4,11,0)
```
これで'last_rx'メンバが無いよエラーも解消。

# インストール
これでエラーは出なくなったはずなので、既定のインストールコマンドを叩けば無事ドライバが導入される。
```sh
> ./autorun.sh
```
なおこれを実行すると既存のネットワークインターフェースが消され接続が切れてしまったので、SSH経由ではなくマシン上で直接操作した方が良さげ。（古いドライバを消す処理が入ってたので、蟹じゃないNIC積んでれば関係ない？）

# その他
最初に載せたエラーではなく、/lib/modules/xxxxxxxxxxxxx.x86_64/build がウンタラ～と言われた場合はkernel-develが入っていないのが悪いので、yumから入れる。
```sh
> yum install kernel-devel
```