问题
我已经在 CentOS 7 中成功使用 Broadcom 4352 无线适配器,使用有关如何在 CentOS wiki 中编译适用于 Linux 的 Broadcom STA 驱动程序的说明。
自从 3.10.0-693 的内核更新(我认为是 7.4?)出来后,我可以编译驱动程序,但无法让它工作。安装后,它冻结系统:
[root]# depmod $(uname -r)
[root]# sudo modprobe wl
[root]#
之后,鼠标输入工作了几秒钟,然后一切都冻结了:时钟没有改变,系统停止接受任何类型的输入,不得不断电。
wl.ko 文件在这里:
$ ls -alZ /lib/modules/3.10.0-693.21.1.el7.x86_64/extra/wl.ko
-rw-r--r--. root root unconfined_u:object_r:modules_object_t:s0 /lib/modules/3.10.0-693.21.1.el7.x86_64/extra/wl.ko
重新启动也不会启动适配器,但系统不会冻结;它只是表现得好像它不存在一样。如果我随后打开终端并发出modprobe wl
命令,它会如上所述冻结。
不知道还能做什么,我尝试了这个:
insmod /lib/modules/`uname -r`/extra/wl.ko
这也立即冻结了系统。
我没有/var/log/messages
从这些冻结事件中看到任何内容 - 那些时间的日志中几乎没有任何内容,尽管我不确切知道我在寻找什么。
如果我回滚到以前的 (3.10.0-514) 内核(以类似的方式安装了驱动程序),我就可以使用我的无线网络。有一个在这里使用source-RPM方式安装驱动,但我更喜欢这种简单的自行编译方法,并且希望获得有关如何调试此方法的提示。
我应该做类似的事情strace modprobe wl > /tmp/modprobe_log
吗?
我是如何安装驱动程序的
这可能是多余的,但是 CentOS wiki 页面上的说明已经失控(在我看来,他们需要为每个点发布单独的部分),因此为了澄清我所做的事情并可能帮助其他一些不幸的灵魂,以下是我理解的他们的建议对于 7.4 内核:
yum install kernel-devel kernel-headers gcc
tar xzf hybrid-v35_64-nodebug-pcoem-6_30_223_271.tar.gz
patch -p1 < wl-kmod-fix-ioctl-handling.patch
patch -p1 < wl-kmod-kernel_4.7_IEEE80211_BAND_to_NL80211_BAND.patch
sed -i 's/ >= KERNEL_VERSION(3, 11, 0)/ >= KERNEL_VERSION(3, 10, 0)/' src/wl/sys/wl_cfg80211_hybrid.c
sed -i 's/ >= KERNEL_VERSION(3, 15, 0)/ >= KERNEL_VERSION(3, 10, 0)/' src/wl/sys/wl_cfg80211_hybrid.c
sed -i 's/ < KERNEL_VERSION(3, 18, 0)/ < KERNEL_VERSION(3, 9, 0)/' src/wl/sys/wl_cfg80211_hybrid.c
sed -i 's/ >= KERNEL_VERSION(4, 0, 0)/ >= KERNEL_VERSION(3, 10, 0)/' src/wl/sys/wl_cfg80211_hybrid.c
sed -i 's/ < KERNEL_VERSION(4,2,0)/ < KERNEL_VERSION(3, 9, 0)/' src/wl/sys/wl_cfg80211_hybrid.c
sed -i 's/ >= KERNEL_VERSION(4, 7, 0)/ >= KERNEL_VERSION(3, 10, 0)/' src/wl/sys/wl_cfg80211_hybrid.c
make -C /lib/modules/`uname -r`/build/ M=`pwd`
strip --strip-debug wl.ko
cp -vi wl.ko /lib/modules/`uname -r`/extra/
创建文件/etc/modprobe.d/blacklist.conf
:
blacklist bcm43xx
blacklist b43
blacklist b43legacy
blacklist bcma
blacklist brcmsmac
blacklist ssb
blacklist ndiswrapper
创建文件/etc/sysconfig/modules/kmod-wl.modules
#!/bin/bash
for M in lib80211 cfg80211 wl; do
modprobe $M &>/dev/null
done
chown root:root /etc/sysconfig/modules/kmod-wl.modules
chmod 744 /etc/sysconfig/modules/kmod-wl.modules
哦,看起来 Broadcom 已经改变了 STA 驱动程序的位置。它已经几年没有更新了,所以我使用了我已有的,但我认为可以在这里下载。这些补丁可以从上面链接的 CentOS wiki 页面下载。
如果查看补丁和编译输出有帮助,这里是:
$ patch -p1 < wl-kmod-fix-ioctl-handling.patch
patching file src/wl/sys/wl_cfg80211_hybrid.c
Hunk #1 succeeded at 1467 (offset 17 lines).
patching file src/wl/sys/wl_linux.c
Hunk #1 succeeded at 1659 (offset 8 lines).
$ patch -p1 < wl-kmod-kernel_4.7_IEEE80211_BAND_to_NL80211_BAND.patch
patching file src/wl/sys/wl_cfg80211_hybrid.c
Hunk #6 succeeded at 1911 (offset 3 lines).
Hunk #7 succeeded at 2040 (offset 3 lines).
Hunk #8 succeeded at 2160 (offset 3 lines).
Hunk #9 succeeded at 2298 (offset 3 lines).
Hunk #10 succeeded at 2941 (offset 3 lines).
<sed commands ran with no errors>
$ make -C /lib/modules/`uname -r`/build/ M=`pwd`
make: Entering directory `/usr/src/kernels/3.10.0-693.21.1.el7.x86_64'
CFG80211 API is prefered for this kernel version
Using CFG80211 API
LD /usr/local/src/hybrid-wl/built-in.o
CC [M] /usr/local/src/hybrid-wl/src/shared/linux_osl.o
CC [M] /usr/local/src/hybrid-wl/src/wl/sys/wl_linux.o
CC [M] /usr/local/src/hybrid-wl/src/wl/sys/wl_iw.o
CC [M] /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.o
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1834:2: warning: initialization from incompatible pointer type [enabled by default]
.get_station = wl_cfg80211_get_station,
^
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1834:2: warning: (near initialization for ‘wl_cfg80211_ops.get_station’) [enabled by default]
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c: In function ‘wl_bss_connect_done’:
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2446:3: warning: passing argument 2 of ‘cfg80211_scan_done’ makes pointer from integer without a cast [enabled by default]
cfg80211_scan_done(wl->scan_request, true);
^
In file included from /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:33:0:
include/net/cfg80211.h:4496:6: note: expected ‘struct cfg80211_scan_info *’ but argument is of type ‘int’
void cfg80211_scan_done(struct cfg80211_scan_request *request,
^
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c: In function ‘wl_cfg80211_down’:
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2976:3: warning: passing argument 2 of ‘cfg80211_scan_done’ makes pointer from integer without a cast [enabled by default]
cfg80211_scan_done(wl->scan_request, true);
^
In file included from /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:33:0:
include/net/cfg80211.h:4496:6: note: expected ‘struct cfg80211_scan_info *’ but argument is of type ‘int’
void cfg80211_scan_done(struct cfg80211_scan_request *request,
^
LD [M] /usr/local/src/hybrid-wl/wl.o
Building modules, stage 2.
CFG80211 API is prefered for this kernel version
Using CFG80211 API
MODPOST 1 modules
CC /usr/local/src/hybrid-wl/wl.mod.o
LD [M] /usr/local/src/hybrid-wl/wl.ko
make: Leaving directory `/usr/src/kernels/3.10.0-693.21.1.el7.x86_64'
答案1
我不确定,但红帽甚至可以在一个版本之间(在另一个版本中)更改新内核版本中的某些内容。
从7.2更新到7.3时我遇到了一些问题(内核版本仍然是一个,但版本不同):我们公司开发的驱动程序未编译(API已更改)。我向 Red Hat bugzilla tracker 询问此事并得到以下答案:
“因为我们 RedHat 只保证 ABI 保持不变,而不保证 API 保持不变,因此 centos 也是如此。如果您正在编译自己的树外模块,则需要跟上内核中的任何 api 更改或者,您可以将树外代码与上游内核合并,只要进行 api 更改,这项工作就会代表您处理。”
换句话说,如果树外模块未编译或未针对新内核版本工作,那么它是客户端任务。我知道这个答案是关于 API 的,但谁能保证其他变化。
我认为有些补丁没有被新的内核版本采用。另外,您可以将这个问题发布到红帽 bugzilla追踪器。我不建议在 Centos 跟踪器中提问,因为(在内核/模块问题中)它们更有可能重定向到 Red Hat 跟踪器。
关于来源转速 (RPM-s)。这是保持环境清洁的更优选方式。另外,您可以采用源数据管理系统包,您将无法为最新版本的内核构建新模块。
答案2
所有这些都是 centos 内核的严重错误版本,它说它是 3.10 或其他版本,但有时表现得像 4.15。
我已经在以下位置发布了一个回购协议:https://github.com/rohitggarg/broadcom-sta它有适用于 centos 7.5 x64 机器的 wifi 驱动程序。我在笔记本电脑上使用它。