问题

问题

问题

我已经在 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 驱动程序。我在笔记本电脑上使用它。

相关内容