在NanoPi R2S的Armbian系统中(本文编写时,基于Buster的内核版本5.10.35),新版本的r8152驱动导致在lan0网口处于千兆时极易出现网卡丢失的情况(实际体验中,平均每天一次)。然而在之前使用FriendWRT工作了一年从未出现这个情况,而FriendWRT仍在使用老版本驱动。本文记录从FriendWRT里内核中的老版本内核模块的源码提取出,放入新版本编译的过程。

(注:基于5.15内核和Debian Bullseye的Armbian已经将r8152降级到v1.12.12,已无需手动编译内核模块)

首先,需要确保Armbian上有模块编译的环境。通过运行sudo armbian-config打开armbian附带的管理软件,在Software选项中运行Headers_install以安装内核模块的头文件,以便于编译内核模块。之后使用apt安装build-essential以安装编译内核所需要的相关软件包:

sudo apt-get update && sudo apt-get install build-essential -y

然后到https://github.com/friendlyarm/kernel-rockchip仓库中找到所需的r8152.c文件。先切换branch到合适的分支(当前分支为nanopi-r2-v5.10.y-opp1,r8152文件版本仍为v1.11.11,而Armbian自带的内核版本为存在问题的v2.14.0)。然后到drivers/net/usb/中找到r8152.c文件,将其下载到NanoPi R2S上。
之后编写Makefile文件,将该文件编译为.ko格式的内核模块。参考Makefile如下:

KERDIR = /lib/modules/$(shell uname -r)/build
obj-m += r8152.o
build:
    make -C $(KERDIR) M=$(CURDIR) modules
clean:
    make -C $(KERDIR) M=$(CURDIR) clean 

之后运行make,即可得到r8152.ko文件。
该模块的正常工作需要/lib/firmware中的rtl_nic/rtl8153b-2.fw文件,该文件可以从官方提供的friendwrt镜像中找到。经过测试,在官方提供的rk3328-sd-friendlywrt-5.10-20210618.img中/lib/firmware/rtl_nic/rtl8153b-2.fw拷贝到Armbian中可以正常工作。(官方的FriendWRT镜像可以在官方的Wiki中找到:https://wiki.friendlyarm.com/wiki/index.php/NanoPi_R2S
在替换内核相应文件之前,可以先卸载内核模块,再安装新模块,查看该编译的模块是否正常工作,注意,运行前需要确保目前不是通过lan0接口连接到R2S的,因为卸载该模块后lan0会直接消失:

rmmod r8152
insmod ./r8152.ko

之后通过dmesg查看输出信息,或结合grep过滤出r8152的信息:

dmesg | grep r8152

在Armbian中,默认的r8152驱动在dmesg输出的相关信息如下:

[    9.815503] r8152 5-1:1.0 eth1: v2.14.0 (2020/09/24)
[    9.815518] r8152 5-1:1.0 eth1: This product is covered by one or more of the following patents:
                        US6,570,884, US6,115,776, and US6,327,625.
[    9.815722] usbcore: registered new interface driver r8152
[    9.841607] r8152 5-1:1.0 lan0: renamed from eth1

在该编译后的模块,可以看到内核信息为:

[ 1034.055662] r8152 5-1:1.0: Direct firmware load for rtl_nic/rtl8153b-2.fw failed with error -2
[ 1034.055698] r8152 5-1:1.0: unable to load firmware patch rtl_nic/rtl8153b-2.fw (-2)
[ 1034.055711] r8152 5-1:1.0 (unnamed net_device) (uninitialized): DT mac addr
[ 1034.105315] r8152 5-1:1.0 eth1: v1.11.11
[ 1034.105630] usbcore: registered new interface driver r8152
[ 1034.134686] r8152 5-1:1.0 lan0: renamed from eth1

将r8152.ko替换到/lib/modules/5.10.35-rockchip64/kernel/drivers/net/usb/r8152.ko中。注意对应的内核版本号,并备份原本的文件。重启后则会默认加载该老版本的内核模块。在没有rtl8153b-2.fw文件时,内核模块会输出上述内核信息中的前两行,提示没有找到文件,且网卡也无法正常启用。拷入了rtl8153b-2.fw文件后网卡才能完全正常工作,且dmesg不会提示无法加载rtl8153b-2.fw文件。另外需要注意,通过apt命令升级内核以后,内核模块仍会被替换为官方版本,需要重新编译和替换该内核模块。此外,网卡mac地址会发生变化,如果有绑定mac地址的服务需要手动做出修改。

标签: Linux, ARM

添加新评论