centos7.8降级网卡驱动r8168
概述
在外地集中开发临时租赁的window机器,临时组装成centos7.8系统的开发测试机器发现机器很不稳定,时不时宕机根据日志分析是驱动版本太高
因此,降级驱动版本保持和固件版本一致
r8168
fix(修复好的代码传到github)
问题
//01 队列传输超时
Oct 9 07:55:14 fatboy kernel: NETDEV WATCHDOG: p1p1 (bnx2): transmit queue 0 timed out
Oct 31 15:13:27 sy01 systemd: Started Session 83 of user weblogic.
Oct 31 15:25:06 sy01 kernel: ------------[ cut here ]------------
Oct 31 15:25:06 sy01 kernel: WARNING: CPU: 11 PID: 0 at net/sched/sch_generic.c:356 dev_watchdog+0x248/0x260
Oct 31 15:25:06 sy01 kernel: NETDEV WATCHDOG: enp1s0 (r8169): transmit queue 0 timed out
Oct 31 15:25:06 sy01 kernel: Modules linked in: tcp_diag inet_diag hp_wmi sparse_keymap rfkill intel_powerclamp coretemp kvm_intel snd_hda_codec_gen
eric kvm snd_hda_intel snd_hda_codec vfat irqbypass crc32_pclmul fat ghash_clmulni_intel snd_hda_core aesni_intel snd_hwdep lrw gf128mul glue_helper
snd_seq ablk_helper cryptd snd_seq_device pcspkr snd_pcm snd_timer snd soundcore joydev wmi video tpm_crb intel_th_acpi intel_th acpi_pad ip_tables
ext4 mbcache jbd2 ahci libahci libata crct10dif_pclmul crct10dif_common crc32c_intel serio_raw nvme r8169 nvme_core i2c_hid
Oct 31 15:25:06 sy01 kernel: CPU: 11 PID: 0 Comm: swapper/11 Kdump: loaded Not tainted 3.10.0-1127.el7.x86_64 #1
Oct 31 15:25:06 sy01 kernel: Hardware name: HP HP Pro SFF 280 G9 Desktop PC/89B4, BIOS F.02 05/05/2022
Oct 31 15:25:06 sy01 kernel: Call Trace:
Oct 31 15:25:06 sy01 kernel: <IRQ> [<ffffffff8637ff85>] dump_stack+0x19/0x1b
Oct 31 15:25:06 sy01 kernel: [<ffffffff85c9bd18>] __warn+0xd8/0x100
Oct 31 15:25:06 sy01 kernel: [<ffffffff85c9bd9f>] warn_slowpath_fmt+0x5f/0x80
Oct 31 15:25:06 sy01 kernel: [<ffffffff862811e8>] dev_watchdog+0x248/0x260
Oct 31 15:25:06 sy01 kernel: [<ffffffff86280fa0>] ? dev_deactivate_queue.constprop.27+0x60/0x60
Oct 31 15:25:06 sy01 kernel: [<ffffffff85cac7c8>] call_timer_fn+0x38/0x110
Oct 31 15:25:06 sy01 kernel: [<ffffffff86280fa0>] ? dev_deactivate_queue.constprop.27+0x60/0x60
Oct 31 15:25:06 sy01 kernel: [<ffffffff85caec5d>] run_timer_softirq+0x24d/0x300
Oct 31 15:25:06 sy01 kernel: [<ffffffff85ca5695>] __do_softirq+0xf5/0x280
Oct 31 15:25:06 sy01 kernel: [<ffffffff8639642c>] call_softirq+0x1c/0x30
Oct 31 15:25:06 sy01 kernel: [<ffffffff85c2f715>] do_softirq+0x65/0xa0
Oct 31 15:25:06 sy01 kernel: [<ffffffff85ca5a15>] irq_exit+0x105/0x110
Oct 31 15:25:06 sy01 kernel: [<ffffffff863979c8>] smp_apic_timer_interrupt+0x48/0x60
Oct 31 15:25:06 sy01 kernel: [<ffffffff86393efa>] apic_timer_interrupt+0x16a/0x170
Oct 31 15:25:06 sy01 kernel: <EOI> [<ffffffff861c6027>] ? cpuidle_enter_state+0x57/0xd0
Oct 31 15:25:06 sy01 kernel: [<ffffffff861c617e>] cpuidle_idle_call+0xde/0x230
Oct 31 15:25:06 sy01 kernel: [<ffffffff85c37c6e>] arch_cpu_idle+0xe/0xc0
Oct 31 15:25:06 sy01 kernel: [<ffffffff85d01c2a>] cpu_startup_entry+0x14a/0x1e0
//
For the "PCI: Using host bridge windows from ACPI; if necessary, use "pci=nocrs" and report a bug", this is just a kernel information message, which suggests user to file a bug if the current setting doesn't work and boot option "pci=nocrs" is needed.
//查看异常日志
dmesg | grep bug
dmesg | grep fail
Link
env
- centos7.8 x86_64
//当前网卡驱动版本
[root@sy01 ~]# lsmod |grep -e '^r8169'
r8169 84623 0
modinfo r8169 |grep filename
[root@sy01 ~]# ethtool -i enp1s0
driver: r8169 //驱动版本高一个版本,需要降级下来
version:
firmware-version: rtl8168h-2_0.0.2 02/26/15 //固件版本 r8168
expansion-rom-version:
bus-info: 0000:01:00.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: yes
supports-priv-flags: no
//查看网卡信息
[root@sy01 ~]# yum whatprovides */lspci
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
pciutils-3.5.1-3.el7.x86_64 : PCI bus related utilities
Repo : yum_repos_iso
Matched from:
Filename : /usr/sbin/lspci
yum install -y pciutils
[root@sy01 ~]# lspci
00:00.0 Host bridge: Intel Corporation Device 4650 (rev 05)
00:02.0 VGA compatible controller: Intel Corporation Device 4690 (rev 0c)
00:08.0 System peripheral: Intel Corporation Device 464f (rev 05)
00:0a.0 Signal processing controller: Intel Corporation Device 467d (rev 01)
00:14.0 USB controller: Intel Corporation Device 7ae0 (rev 11)
00:14.2 RAM memory: Intel Corporation Device 7aa7 (rev 11)
00:15.0 Serial bus controller [0c80]: Intel Corporation Device 7acc (rev 11)
00:16.0 Communication controller: Intel Corporation Device 7ae8 (rev 11)
00:17.0 SATA controller: Intel Corporation Device 7ae2 (rev 11)
00:1c.0 PCI bridge: Intel Corporation Device 7abe (rev 11)
00:1d.0 PCI bridge: Intel Corporation Device 7ab4 (rev 11)
00:1f.0 ISA bridge: Intel Corporation Device 7a85 (rev 11)
00:1f.3 Audio device: Intel Corporation Device 7ad0 (rev 11)
00:1f.4 SMBus: Intel Corporation Device 7aa3 (rev 11)
00:1f.5 Serial bus controller [0c80]: Intel Corporation Device 7aa4 (rev 11)
01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 15) //型号
02:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd Device a809
01 reuirement
yum install -y gcc gcc-c++ kernel-devel
02 download
- https://github.com/mtorromeo/r8168/releases # mirror
- https://www.realtek.com/en/component/zoo/category/network-interface-controllers-10-100-1000m-gigabit-ethernet-pci-express-software
03 compiler
r8168-8.050.03.tar.gz
[root@sy03 r8168-8.050.03]# make modules
make -C src/ modules
make[1]: Entering directory `/root/tmp/r8168-8.050.03/src'
make -C /lib/modules/3.10.0-1127.el7.x86_64/build M=/root/tmp/r8168-8.050.03/src modules
make[2]: Entering directory `/usr/src/kernels/3.10.0-1127.el7.x86_64'
CC [M] /root/tmp/r8168-8.050.03/src/r8168_n.o
In file included from /root/tmp/r8168-8.050.03/src/r8168_n.c:87:0:
/root/tmp/r8168-8.050.03/src/r8168.h:53:20: error: redefinition of ‘ether_addr_copy’
static inline void ether_addr_copy(u8 *dst, const u8 *src)
^
In file included from /root/tmp/r8168-8.050.03/src/r8168_n.c:47:0:
include/linux/etherdevice.h:246:20: note: previous definition of ‘ether_addr_copy’ was here
static inline void ether_addr_copy(u8 *dst, const u8 *src)
^
/root/tmp/r8168-8.050.03/src/r8168_n.c:26768:9: error: unknown field ‘ndo_change_mtu’ specified in initializer
.ndo_change_mtu = rtl8168_change_mtu,
^
/root/tmp/r8168-8.050.03/src/r8168_n.c:26768:9: warning: missing braces around initializer [-Wmissing-braces]
/root/tmp/r8168-8.050.03/src/r8168_n.c:26768:9: warning: (near initialization for ‘rtl8168_netdev_ops.<anonymous>’) [-Wmissing-braces]
/root/tmp/r8168-8.050.03/src/r8168_n.c:26768:9: warning: initialization from incompatible pointer type [enabled by default]
/root/tmp/r8168-8.050.03/src/r8168_n.c:26768:9: warning: (near initialization for ‘rtl8168_netdev_ops.<anonymous>.ndo_get_stats64’) [enabled by default]
/root/tmp/r8168-8.050.03/src/r8168_n.c: In function ‘rtl8168_rx_interrupt’:
/root/tmp/r8168-8.050.03/src/r8168_n.c:29487:28: error: ‘struct net_device’ has no member named ‘last_rx’
dev->last_rx = jiffies;
^
make[3]: *** [/root/tmp/r8168-8.050.03/src/r8168_n.o] Error 1
make[2]: *** [_module_/root/tmp/r8168-8.050.03/src] Error 2
make[2]: Leaving directory `/usr/src/kernels/3.10.0-1127.el7.x86_64'
make[1]: *** [modules] Error 2
make[1]: Leaving directory `/root/tmp/r8168-8.050.03/src'
make: *** [modules] Error 2
04 resolve makeing error
//01
/root/tmp/r8168-8.050.03/src/r8168.h:53:20: error: redefinition of ‘ether_addr_copy’
vim +53 src/r8168.h
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0)
// 改为
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
//02
/root/tmp/r8168-8.050.03/src/r8168_n.c:26768:9: error: unknown field ‘ndo_change_mtu’ specified in initializer
grep "ndo_change_mtu" src/r8168_n.c
vim +26768 src/r8168_n.c
ndo_change_mtu -> ndo_change_mtu_rh74
// 解决方案
cat /usr/src/kernels/3.10.0-327.el7.x86_64/include/linux/netdevice.h | grep ndo_change_mtu
// 这个文件里面 ndo_change_mtu 定义的是什么名称,centos7.8是 ndo_change_mtu_rh74
// 在r8125_n.c的26768行保持和内核一致ndo_change_mtu -> ndo_change_mtu_rh74
//03
/root/tmp/r8168-8.050.03/src/r8168_n.c:29487:28: error: ‘struct net_device’ has no member named ‘last_rx’
vim +29487 src/r8168_n.c //注释掉
//dev->last_rx = jiffies;
make modules //编译,src/r8168.ko 内核驱动文件
make clean //清理再次编译
05 install ko
//01 mv r8169
[root@sy03 r8168-8.050.03]# find /lib/modules/3.10.0-1127.el7.x86_64/kernel/ -name "*r8169*"
/lib/modules/3.10.0-1127.el7.x86_64/kernel/drivers/net/ethernet/realtek/r8169.ko.xz
mv /lib/modules/3.10.0-1127.el7.x86_64/kernel/drivers/net/ethernet/realtek/r8169.ko.xz{,_bak}
//02 cp install
cp src/r8168.ko /lib/modules/3.10.0-1127.el7.x86_64/kernel/drivers/net/ethernet/realtek/
depmod -a //刷新内核依赖
modprobe r8168 //加载内核驱动r8168.ko
//03 view current support Ethernet ko
[root@sy03 ~]# lspci -v
....
01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 06)
Subsystem: Acer Incorporated [ALI] Device 102a
Flags: bus master, fast devsel, latency 0, IRQ 18
I/O ports at e000 [size=256]
Memory at ef000000 (64-bit, non-prefetchable) [size=4K]
Memory at e0000000 (64-bit, prefetchable) [size=16K]
Capabilities: [40] Power Management version 3
Capabilities: [50] MSI: Enable- Count=1/1 Maskable- 64bit+
Capabilities: [70] Express Endpoint, MSI 01
Capabilities: [b0] MSI-X: Enable+ Count=4 Masked-
Capabilities: [d0] Vital Product Data
Capabilities: [100] Advanced Error Reporting
Capabilities: [140] Virtual Channel
Capabilities: [160] Device Serial Number 01-00-00-00-68-4c-e0-00
Kernel driver in use: r8169 //当前使用的ko
Kernel modules: r8169, r8168 //内核中运行的ko
[root@sy03 ~]#
[root@sy03 ~]# lspci -v |grep r81
Kernel driver in use: r8169
Kernel modules: r8169, r8168
//04 renew img
cp /boot/initramfs-3.10.0-1127.el7.x86_64.img{,_bak}
dracut -f /boot/initramfs-3.10.0-1127.el7.x86_64.img $(uname -r)
reboot
//05 check again
[root@sy03 ~]# ethtool -i enp1s0
driver: r8168 //网卡驱动已切换
version: 8.050.03-NAPI
firmware-version:
expansion-rom-version:
bus-info: 0000:01:00.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: yes
supports-priv-flags: no