💬

Linux の Intel I219 の NICドライバ問題

2022/06/26に公開

貧乏人に優しいオンボードNICには当たりハズレがある。
当たりといっても単にLinuxの標準ドライバが動くか動かないかだけだけど。
しかしある意味当たりのIntel I219を選んでしまうと標準ドライバが動作しないため、めんどくさい。
USBのLANトグル等を持っている金持ちはそれを一旦指して、ドライバを落とせばよい。
高級トグルを持っていない場合は、USBメモリにコピーして持ってくるしかない。
そして、ビルドにはmakeやコンパイラが必要となる。
なので、インストール時に入れておくように。。

Intel I219 の NICドライバのインストール手順は、だいたい以下に記載してくれている。
Intel I219 NICがLinux e1000eドライバで認識されなくなる - Fun Scripting 2.0

ちょっとだけ注意点がある。
Linux kernel 5系には、Intelダウンロードセンターのver.3.8.4は対応していない。
そのため、ver.3.8.7をSourceForgeから持ってくる必要がある。そしてそのページがわかり辛い。
3.8.7にある。

更に以下のpatchを当てる必要がある。

diff -uprN e1000e-3.8.7/src/ethtool.c e1000e-3.8.7-chg/src/ethtool.c
--- e1000e-3.8.7/src/ethtool.c	2020-06-30 19:11:13.596416913 +0900
+++ e1000e-3.8.7-chg/src/ethtool.c	2022-06-26 10:58:19.376447382 +0900
@@ -1009,7 +1009,9 @@ static void e1000_get_drvinfo(struct net
 }
 
 static void e1000_get_ringparam(struct net_device *netdev,
-				struct ethtool_ringparam *ring)
+				struct ethtool_ringparam *ring,
+				struct kernel_ethtool_ringparam *param, 
+				struct netlink_ext_ack *ack)
 {
 	struct e1000_adapter *adapter = netdev_priv(netdev);
 
@@ -1020,7 +1022,9 @@ static void e1000_get_ringparam(struct n
 }
 
 static int e1000_set_ringparam(struct net_device *netdev,
-			       struct ethtool_ringparam *ring)
+			       struct ethtool_ringparam *ring, 
+				struct kernel_ethtool_ringparam *param, 
+				struct netlink_ext_ack *ack)
 {
 	struct e1000_adapter *adapter = netdev_priv(netdev);
 	struct e1000_ring *temp_tx = NULL, *temp_rx = NULL;
@@ -2421,7 +2425,9 @@ static int e1000_phys_id(struct net_devi
 #endif /* HAVE_ETHTOOL_SET_PHYS_ID */
 
 static int e1000_get_coalesce(struct net_device *netdev,
-			      struct ethtool_coalesce *ec)
+			      struct ethtool_coalesce *ec, 
+				struct kernel_ethtool_coalesce *coalesce, 
+				struct netlink_ext_ack *ack)
 {
 	struct e1000_adapter *adapter = netdev_priv(netdev);
 
@@ -2434,7 +2440,9 @@ static int e1000_get_coalesce(struct net
 }
 
 static int e1000_set_coalesce(struct net_device *netdev,
-			      struct ethtool_coalesce *ec)
+			      struct ethtool_coalesce *ec, 
+				struct kernel_ethtool_coalesce *coalesce, 
+				struct netlink_ext_ack *ack)
 {
 	struct e1000_adapter *adapter = netdev_priv(netdev);
 
diff -uprN e1000e-3.8.7/src/kcompat.h e1000e-3.8.7-chg/src/kcompat.h
--- e1000e-3.8.7/src/kcompat.h	2020-06-30 19:11:13.596416913 +0900
+++ e1000e-3.8.7-chg/src/kcompat.h	2022-06-26 10:58:19.380447431 +0900
@@ -822,7 +822,7 @@ struct _kc_ethtool_pauseparam {
 			     UTS_UBUNTU_RELEASE_ABI)
 
 #if UTS_UBUNTU_RELEASE_ABI > 255
-#error UTS_UBUNTU_RELEASE_ABI is too large...
+//#error UTS_UBUNTU_RELEASE_ABI is too large...
 #endif /* UTS_UBUNTU_RELEASE_ABI > 255 */
 
 #if ( LINUX_VERSION_CODE <= KERNEL_VERSION(3,0,0) )
diff -uprN e1000e-3.8.7/src/nvm.c e1000e-3.8.7-chg/src/nvm.c
--- e1000e-3.8.7/src/nvm.c	2020-06-30 19:11:13.596416913 +0900
+++ e1000e-3.8.7-chg/src/nvm.c	2022-06-26 10:58:19.380447431 +0900
@@ -546,24 +546,6 @@ s32 e1000_read_mac_addr_generic(struct e
  **/
 s32 e1000e_validate_nvm_checksum_generic(struct e1000_hw *hw)
 {
-	s32 ret_val;
-	u16 checksum = 0;
-	u16 i, nvm_data;
-
-	for (i = 0; i < (NVM_CHECKSUM_REG + 1); i++) {
-		ret_val = e1000_read_nvm(hw, i, 1, &nvm_data);
-		if (ret_val) {
-			e_dbg("NVM Read Error\n");
-			return ret_val;
-		}
-		checksum += nvm_data;
-	}
-
-	if (checksum != (u16)NVM_SUM) {
-		e_dbg("NVM Checksum Invalid\n");
-		return -E1000_ERR_NVM;
-	}
-
 	return 0;
 }

パッチコマンドは以下。上記パッチをe1000e-3.8.7.patchの名前で保存してあてればよい。

patch -p1 -d e1000e-3.8.7 < e1000e-3.8.7.patch

これで src に入って、make すればよい。

Discussion