broadcom Ethernet BCM57412 驱动更新记录(dkms方式)

科技资讯 投稿 5400 0 评论

broadcom Ethernet BCM57412 驱动更新记录(dkms方式)

一 背景

本文主要是记录一些操作步骤,后续出现类似驱动过旧的问题可以快速解决。

二 临时解决

    现场通过下载Broadcom官方提供的tar包在生产节点上直接make编译出新的bnxt_en.ko
  1. 替换/lib/modules/$(uname -r/kernel/drivers/net/ethernet/broadcom/bnxt/bnxt_en.ko
  2. 通过modprobe -r bnxt_enmodprobe bnxt_en重新加载新的模块,可以通过modinfo bnxt_en查看module的信息
  3. 使用depmod -a更新module加载的依赖
  4. bnxt_en.ko是网络驱动,在内核init on initramfs 阶段就需要加载,因此还要执行update-initramfs -u来更新initramfs image。

三 长久解决

3.1 backport内核代码(失败)

    1.10.2的驱动在linux内核6.1中才有支持,而我们的内核版本是4.14,尝试直接cherry-pick,冲突过多失败。
  1. 下载并解压红帽4.10内核的iso,替换broadcom/bnxt_en目录下相关文件进行编译。这里记录下编译方式,整体编译内核速度过慢,我们可以在编译环境编译某一个modules:
    1. 复制/usr/src/$(uname -r/Module.symvers到编译的内核目录drivers/net/ethernet/broadcom/bnxt/下面
    2. 执行make modules SUBDIRS=drivers/net/ethernet/broadcom/bnxt就可以编译啦

3.2 dkms(成功)

既然使用源码包可以直接在4.14内核环境上进行编译,那使用dkms(Dynamic Kernel Module Support)来在需要的时候编译安装是一个不错的选择,而且bnxt_en体量小,编译很快,安装系统时不会占用太多时间。

制作dkms的deb包

drwxrwxr-x  4 18896 dialout 4096 Mar 29 11:59 ./
drwxr-xr-x 18 root  root    4096 Mar 27 18:03 ../
lrwxrwxrwx  1 18896 dialout   27 Nov  3 04:25 bnxt_en -> bnxt_en-1.10.2-224.0.157.0//
drwxrwxr-x  5 18896 dialout 4096 Mar 30 10:01 bnxt_en-1.10.2-224.0.157.0/
lrwxrwxrwx  1 18896 dialout   20 Nov  3 04:25 bnxt_re -> bnxt_re-224.0.157.0//
drwxrwxr-x  2 18896 dialout 4096 Mar 27 19:08 bnxt_re-224.0.157.0/
-rw-r--r--  1 root  root     309 Mar 27 19:12 dkms.conf
-rw-rw-r--  1 18896 dialout  537 Mar 27 17:18 Makefile

其中dkms.conf是我们创建并加入的,内容如下:

PACKAGE_NAME="netxtreme-bnxt_en"
PACKAGE_VERSION="1.10.2"
CLEAN="make clean"
MAKE="make"
BUILT_MODULE_NAME[0]="bnxt_en"
BUILT_MODULE_NAME[1]="bnxt_re"
BUILT_MODULE_LOCATION[0]="bnxt_en"
BUILT_MODULE_LOCATION[1]="bnxt_re"
DEST_MODULE_LOCATION[0]="/updates"
DEST_MODULE_LOCATION[1]="/updates"
AUTOINSTALL="yes"

根据dkms的要求,我们需要将源码包移到/usr/src目录下,即当前源码包路径/usr/src/netxtreme-bnxt_en-1.10.2

    PACKAGE_NAME:指定要编译和安装的模块的名称
  • PACKAGE_VERSION:模块版本
  • CLEAN:删除先前编译生成的内核模块文件和相关构建文件
  • MAKE:根据Makefile编译
  • BUILT_MODULE_NAME:模块名,也就是编译出来的bnxt_en.ko
  • BUILT_MODULE_LOCATION:存放的位置,这里是/usr/src/netxtreme-bnxt_en-1.10.2/bnxt_en/
  • DEST_MODULE_LOCATION:将模块放到内核目录的哪个文件夹下,这里是/lib/modules/$(uname -r/updates
  • AUTOINSTALL:安装完毕后自动加载该模块

接下来就可以验证dkms是否可以使用了,以下指令:

# 可以查看当前的dkms模块的情况
dkms status

# 添加到dkms树,此时是added状态
dkms add -m netxtreme-bnxt_en -v 1.10.2
# 编译,成功是built状态
dkms build -m netxtreme-bnxt_en -v 1.10.2
# 安装,成功是installed状态
dkms install -m netxtr

编程笔记 » broadcom Ethernet BCM57412 驱动更新记录(dkms方式)

赞同 (27) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽