💬
Linux の Intel I219 の NICドライバ問題
貧乏人に優しいオンボード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