以 Broadcom Corporation BCM4311, BCM4312, BCM4313, BCM4321, BCM4322, BCM43224, BCM43225, BCM43227 和 BCM43228 为基础的无线网络卡
CentOS 对这些芯片组并没有原生的支持。
这页的英文版本现时由 Miloš Blažević 维护。
|
注:此指南主要针对 EL 6 和 EL 7。假如你采用 EL 5、6 或 7,你可不进行编译,而选择创建兼容 kABI 的 RPM 驱动程序组件,它们在内核升级后仍可重用。进一步数据可参考 ELRepo kmod-wl 页面。另外,有报告指此驱动程序不支持所有芯片组,因此烦请你反馈对 Broadcom 无线产品的经验,好让此指南能保持更新及不断改善。 |
|
|
注:基于这个 Broadcam 驱动程序的极度限制性条款,ELRepo 软件库的开发者放弃以 rpm 组件来提供它 —— 因此这份文件被创建的目的是要提供一个全面的驱动程序安装说明。 |
|
|
注: 请留意此 Wiki 或许不适用于较旧版的内核(及/或驱动程序),这是由于驱动程序及新版内核中的改动。正因如此,我们只能保证在最新版的驱动程序及内核下进行编译。 |
Contents
若要安装以 Broadcom BCM4311、BCM4312、BCM4313、BCM4321、BCM4322、BCM43224、BCM43225、BCM43227 或 BCM43228 为基础的无线网络卡,请遵照以下的步骤:
1. 第 1 步:辨认无线网络芯片及安装时依赖的组件
首先,请确定你是位「拥有 Broadcom BCM43xx 无线网络卡的幸运儿」:
[user@host ~]$ /sbin/lspci | grep Broadcom 0b:00.0 Network controller: Broadcom Corporation BCM4312 802.11a/b/g (rev 01)
辨认完无线网络芯片型号之后,请确定你不会欠缺编译及安装时所需的组件:
[root@host]# yum install kernel-headers kernel-devel gcc
当然,假若你要为 Xen 内核(kernel-xen)编译驱动程序,你必须安装 kernel-xen-devel 而不是 kernel-devel。
2. 第 2 步:下载并解压 Broadcom 驱动程序的压缩档
请从 的官方网站 —— 它会以 Linux® STA 32-bit driver 或 Linux® STA 64-bit driver 出现在寻找结果中 —— 下载 Broadcom BCM43xx 的 linux 驱动程序压缩档到你的机器并将它解压到 /usr/local/src/hybrid-wl,请随你所需将这个目录的拥有者改为无特权的用户:
[root@host ~]# mkdir -p /usr/local/src/hybrid-wl [root@host hybrid-wl]# cd /usr/local/src/hybrid-wl [root@host hybrid-wl]# tar xvzf /path/to/the/tarball/hybrid-v35_64-nodebug-pcoem-6_30_223_271.tar.gz [root@host hybrid-wl]# chown -R someuser.somegroup /usr/local/src/hybrid-wl
|
注:为什么不随便将它解压到一个位置并保留缺省的拥有者? |
3. 第 3 步上:编译 Broadcom 驱动模块 (在 EL6 和 EL7 上)
驱动模块可以这样编译:
[user@host hybrid-wl]$ make -C /lib/modules/`uname -r`/build/ M=`pwd`
请留意引号(即反引号)。
编译现有的驱动程序(6.30.223.271 版)时,你差不多肯定会获得一个错误信息,而不是一个编译好的驱动模块(实际上,本作者仍未遇过这个信息以外的情况)。这则信息的内容随着内核和操作系统版本而变化,但是在 CentOS 6 上它大致上是:
make: Entering directory `/usr/src/kernels/2.6.32-573.7.1.el6.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:83: warning: ‘enum tx_power_setting’ declared inside parameter list /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:83: warning: its scope is only this definition or declaration, <snip> /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c: In function ‘wl_cfg80211_join_ibss’: /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:730: error: ‘struct cfg80211_ibss_params’ has no member named ‘channel’ /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c: At top level: /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1096: warning: ‘enum tx_power_setting’ declared inside parameter list /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1096: error: parameter 2 (‘type’) has incomplete type /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c: In function ‘wl_cfg80211_set_tx_power’: /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1107: error: ‘TX_POWER_AUTOMATIC’ undeclared (first use in this <snip> /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1107: error: (Each undeclared identifier is reported only once /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1107: error: for each function it appears in.) /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1109: error: ‘TX_POWER_LIMITED’ undeclared (first use in this function) /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1115: error: ‘TX_POWER_FIXED’ undeclared (first use in this function) /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c: At top level: /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1774: warning: initialization from incompatible pointer type /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1779: warning: initialization from incompatible pointer type /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1780: warning: initialization from incompatible pointer type /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1781: warning: initialization from incompatible pointer type /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1782: warning: initialization from incompatible pointer type /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1783: warning: initialization from incompatible pointer type /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1784: warning: initialization from incompatible pointer type /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1789: warning: initialization from incompatible pointer type /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c: In function ‘wl_inform_single_bss’: /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1984: error: too few arguments to function <snip> /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2023: warning: passing argument 1 of ‘cfg80211_put_bss’ from <snip> include/net/cfg80211.h:3380: note: expected ‘struct wiphy *’ but argument is of type ‘struct cfg80211_bss *’ /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2023: error: too few arguments to function ‘cfg80211_put_bss’ /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c: In function ‘wl_update_bss_info’: /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2276: error: ‘struct cfg80211_bss’ has no member named <snip> /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2277: error: ‘struct cfg80211_bss’ has no member named <snip> /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2283: warning: passing argument 1 of ‘cfg80211_put_bss’ from <snip> include/net/cfg80211.h:3380: note: expected ‘struct wiphy *’ but argument is of type ‘struct cfg80211_bss *’ /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2283: error: too few arguments to function ‘cfg80211_put_bss’ /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c: In function ‘wl_bss_roaming_done’: /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2322: warning: passing argument 2 of ‘cfg80211_roamed’ from <snip> include/net/cfg80211.h:3726: note: expected ‘struct ieee80211_channel *’ but argument is of type ‘u8 *’ /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2322: warning: passing argument 4 of ‘cfg80211_roamed’ makes <snip> include/net/cfg80211.h:3726: note: expected ‘const u8 *’ but argument is of type ‘s32’ /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2322: warning: passing argument 5 of ‘cfg80211_roamed’ makes <snip> include/net/cfg80211.h:3726: note: expected ‘size_t’ but argument is of type ‘u8 *’ /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2322: warning: passing argument 6 of ‘cfg80211_roamed’ makes <snip> include/net/cfg80211.h:3726: note: expected ‘const u8 *’ but argument is of type ‘s32’ /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2322: error: too few arguments to function ‘cfg80211_roamed’ /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c: In function ‘wl_update_wowl’: /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2791: warning: unused variable ‘wdev’ make[1]: *** [/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.o] Error 1 make: *** [_module_/usr/local/src/hybrid-wl] Error 2 make: Leaving directory `/usr/src/kernels/2.6.32-573.7.1.el6.x86_64'
|
注意: 在 EL6 和 EL7 的步骤由此起分道扬镖。如果是 EL6,你应该遵从第 3 步上;而 EL7 只须应用第 3 步上的修正及第 3 步下的修正/sed 指命,只适用于 EL7,并按照此步骤(3 上)内的指示编译它。即是说, EL7 要略过第 3 步上的 sed 指令。 |
在 EL6 上,驱动程序由于 wl_cfg80211_hybrid.c 档内检查内核版本的 if-then-else 句式而不能编译。我们须要执行下列的 sed 替换指令来进行修正:
[user@host hybrid-wl]$ sed -i 's/[ >][>=] KERNEL_VERSION(2, 6, 3.)/>= KERNEL_VERSION(2, 6, 32)/' src/wl/sys/wl_cfg80211_hybrid.c [user@host hybrid-wl]$ sed -i 's/[ >][>=] KERNEL_VERSION(3, ., .)/>= KERNEL_VERSION(2, 6, 32)/' src/wl/sys/wl_cfg80211_hybrid.c [user@host hybrid-wl]$ sed -i 's/[ >][>=] KERNEL_VERSION(3, 11, .)/>= KERNEL_VERSION(2, 6, 32)/' src/wl/sys/wl_cfg80211_hybrid.c [user@host hybrid-wl]$ sed -i 's/< KERNEL_VERSION(3, 18, .)/< KERNEL_VERSION(2, 6, 30)/' src/wl/sys/wl_cfg80211_hybrid.c [user@host hybrid-wl]$ sed -i 's/[ >][>=] KERNEL_VERSION(3, 15, .)/>= KERNEL_VERSION(2, 6, 32)/' src/wl/sys/wl_cfg80211_hybrid.c [user@host hybrid-wl]$ sed -i 's/[ >][>=] KERNEL_VERSION(4, 0, 0)/>= KERNEL_VERSION(2, 6, 32)/' src/wl/sys/wl_cfg80211_hybrid.c [user@host hybrid-wl]$ sed -i 's/< KERNEL_VERSION(4,2,0)/< KERNEL_VERSION(2, 6, 30)/' src/wl/sys/wl_cfg80211_hybrid.c
不过,这些 'sed' 替换命令仍未能确保驱动程序可以正常编译。我们还须要在编译驱动程序前应用 wl-kmod-fix-ioctl-handling.patch 这个修正。请将它下载至 /usr/local/src 然后执行下列指令来修正驱动程序的源代码:
[user@host hybrid-wl]$ 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).
现在,请尝试再次编译驱动模块:
[user@host hybrid-wl]$ make -C /lib/modules/`uname -r`/build/ M=`pwd`
编译器的输出大致上是这样:
make: Entering directory `/usr/src/kernels/2.6.32-573.7.1.el6.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:1802: warning: initialization from incompatible pointer type 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.unsigned NO SIGN [M] /usr/local/src/hybrid-wl/wl.ko make: Leaving directory `/usr/src/kernels/2.6.32-573.7.1.el6.x86_64'
一旦这个模块被建成,你便可以删除不必要的符号:
[user@host hybrid-wl]$ strip --strip-debug wl.ko
你会发现驱动模块的文件尺寸会缩小(由 8.2MB 降至 7.2MB)。而且,你的驱动模块仍能正常运作
4. 第 3 步下:编译 Broadcom 驱动模块 (EL7需要的部分细节)
|
注: 近来,你须要修补代码后才执行 sed 指令,但这不是定律,因此要是你不能编译,请尝试对调次序,即是 sed 后再修补。 |
视乎 EL7 的定点发行版本(更正确是你运行的内核版本),需要执行的 sed 替换指令会有异。因此,EL 7.0 附带的标准内核(即 kernel-3.10.0-123.X)不须以下任何指令,EL 7.1(即 kernel-3.10.0-229.X)须要首两个,EL 7.2(即 kernel-3.10.0-327.X)须要首四个,,EL 7.3 须要执行首六个 sed 指令,EL 7.4 须要首七个,而 EL 7.5 须要所有 sed 指令(连同第 3 步上的)才能今源码编译:
[user@host hybrid-wl]$ sed -i 's/ >= KERNEL_VERSION(3, 11, 0)/ >= KERNEL_VERSION(3, 10, 0)/' src/wl/sys/wl_cfg80211_hybrid.c [user@host hybrid-wl]$ sed -i 's/ >= KERNEL_VERSION(3, 15, 0)/ >= KERNEL_VERSION(3, 10, 0)/' src/wl/sys/wl_cfg80211_hybrid.c [user@host hybrid-wl]$ sed -i 's/ < KERNEL_VERSION(3, 18, 0)/ < KERNEL_VERSION(3, 9, 0)/' src/wl/sys/wl_cfg80211_hybrid.c [user@host hybrid-wl]$ sed -i 's/ >= KERNEL_VERSION(4, 0, 0)/ >= KERNEL_VERSION(3, 10, 0)/' src/wl/sys/wl_cfg80211_hybrid.c [user@host hybrid-wl]$ sed -i 's/ < KERNEL_VERSION(4,2,0)/ < KERNEL_VERSION(3, 9, 0)/' src/wl/sys/wl_cfg80211_hybrid.c [user@host hybrid-wl]$ sed -i 's/ >= KERNEL_VERSION(4, 7, 0)/ >= KERNEL_VERSION(3, 10, 0)/' src/wl/sys/wl_cfg80211_hybrid.c [user@host hybrid-wl]$ sed -i 's/ >= KERNEL_VERSION(4, 8, 0)/ >= KERNEL_VERSION(3, 10, 0)/' src/wl/sys/wl_cfg80211_hybrid.c [user@host hybrid-wl]$ sed -i 's/ >= KERNEL_VERSION(4, 11, 0)/ >= KERNEL_VERSION(3, 10, 0)/' src/wl/sys/wl_cfg80211_hybrid.c [user@host hybrid-wl]$ sed -i 's/ < KERNEL_VERSION(4, 12, 0)/ < KERNEL_VERSION(3, 9, 0)/' src/wl/sys/wl_cfg80211_hybrid.c [user@host hybrid-wl]$ sed -i 's/ >= KERNEL_VERSION(4, 12, 0)/ >= KERNEL_VERSION(3, 10, 0)/' src/wl/sys/wl_cfg80211_hybrid.c [user@host hybrid-wl]$ sed -i 's/ <= KERNEL_VERSION(4, 10, 0)/ < KERNEL_VERSION(3, 9, 0)/' src/wl/sys/wl_linux.c
再一次,特别如果你采用 EL 7.3 或它的内核,你必须 先应用以下修正档:wl-kmod-01_kernel_4.7_IEEE80211_BAND_to_NL80211_BAND.patch wl-kmod-02_kernel_4.8_add_cfg80211_scan_info_struct.patch wl-kmod-03_fix_kernel_warnings.patch wl-kmod-04_kernel_4.11_remove_last_rx_in_net_device_struct.patch wl-kmod-05_kernel_4.12_add_cfg80211_roam_info_struct.patch,然后才应用上述六个 sed 替换指令(否则便不能编译)。此外,不要忘记第 3 步上的修正档:
[user@host hybrid-wl]$ patch -p1 < ../wl-kmod-01_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). [user@host hybrid-wl]$ patch -p1 < ../wl-kmod-02_kernel_4.8_add_cfg80211_scan_info_struct.patch patching file src/wl/sys/wl_cfg80211_hybrid.c Hunk #1 succeeded at 2442 (offset 3 lines). Hunk #2 succeeded at 2553 (offset 3 lines). Hunk #3 succeeded at 2989 (offset 3 lines). [user@host hybrid-wl]$ patch -p1 < ../wl-kmod-03_fix_kernel_warnings.patch patching file src/wl/sys/wl_cfg80211_hybrid.c Hunk #1 succeeded at 2008 (offset 3 lines). Hunk #2 succeeded at 2032 (offset 3 lines). Hunk #3 succeeded at 2056 (offset 3 lines). Hunk #4 succeeded at 2071 (offset 3 lines). Hunk #5 succeeded at 2107 (offset 3 lines). Hunk #6 succeeded at 2386 (offset 3 lines). Hunk #7 succeeded at 2401 (offset 3 lines). Hunk #8 succeeded at 2441 (offset 3 lines). [user@host hybrid-wl]$ patch -p1 < ../wl-kmod-04_kernel_4.11_remove_last_rx_in_net_device_struct.patch patching file src/wl/sys/wl_cfg80211_hybrid.c patching file src/wl/sys/wl_linux.c Hunk #1 succeeded at 2911 (offset -18 lines). [user@host hybrid-wl]$ patch -p1 < ../wl-kmod-05_kernel_4.12_add_cfg80211_roam_info_struct.patch patching file src/wl/sys/wl_cfg80211_hybrid.c Hunk #3 succeeded at 2450 (offset 3 lines). Hunk #4 succeeded at 2466 (offset 3 lines).
将修正档应用于源码后,你只需完成第 3 步上的余下步骤 —— 编译驱动程序,并删除侦错符号。再次强调,建设内核 => 229 只需首两个指令,内核 => 327 需要首四个 sed 取代指令,内核 => 514 须要 6 个,内核 >=693 须要 7 个,而内核 >=862 须要所有 sed 指令才能编译驱动程序。
5. 第 4 步上:将驱动模块装入内核中
当你成功地编译了驱动模块后,你便可以将它装入内核中,并最终设置开机时自动装入此驱动程序(要这样做,你必须利用 root 的权限)。当然,做这一切之先,你必须从内核删除现在的无线驱动模块(假如有的话):
[root@host ~]# modprobe -r bcm43xx [root@host ~]# modprobe -r b43 [root@host ~]# modprobe -r b43legacy [root@host ~]# modprobe -r ssb [root@host ~]# modprobe -r bcma [root@host ~]# modprobe -r brcmsmac [root@host ~]# modprobe -r ndiswrapper
请将驱动模块的文件复制到一个可以让内核找到它的地方:
[root@host hybrid-wl]# cp -vi /usr/local/src/hybrid-wl/wl.ko /lib/modules/`uname -r`/extra/
这样做是为了与其它已经/将会从 kmod 组件安装的外置模块(例如:fuse、ntfs-3g、等)保持一贯性。
按著,请执行:
[root@host ~]# depmod $(uname -r)
以便能创建一个模块的互赖性清单。现在我们装入驱动模块:
[root@host hybrid-wl]# insmod wl.ko
假如这一步失败了(有不少这样的报告,但是作者本身还没有遇到过这类问题),并伴有如下提示信息:
insmod: error inserting 'wl.ko': -1 Unknown symbol in module
首先尝试创建模块依赖:
[root@host ~]# depmod `uname -r`
然后装入驱动模块:
[root@host hybrid-wl]# modprobe wl
要是没有错误信息,驱动程序已被装入及随时可用。假如你只有无线驱动程序应用 ndiswrapper 内核模块,你可将它删除 —— 但这并非必须的。
6. 第 4 步下:在开机时将驱动模块装入内核中
你仍须额外数个步骤才能在开机时自动装入模块。首先,编辑 /etc/modprobe.d/blacklist 这个文件并加入以下内容:
blacklist bcm43xx blacklist b43 blacklist b43legacy blacklist bcma blacklist brcmsmac blacklist ssb blacklist ndiswrapper
通过这样做,你可以防止这些模块在开机时被装入内核中,与 wl 模块产生冲突。另外,若要在开机时装入 wl 模块,请创建/编辑/etc/sysconfig/modules/kmod-wl.modules 并把以下内容剪贴到其中:
for M in lib80211 cfg80211 wl; do modprobe $M &>/dev/null done
现在你的驱动应该在每次开机时都会被装入(当然除了在你安装了新内核之后,到时你必须依照以上步骤将它重新编译)。
7. 附录一:已获(用户)测试和汇报为可用的 Broadcom 芯片型号
测试芯片 |
EL 版本 |
内核 |
结构 |
发行商编号:设备编号 |
驱动程序版本 |
|||||
BCM4311 |
CentOS 7.3 |
3.10.0-514.2.2.el7 |
x86_64 |
不详 |
6_30_223_271 |
|||||
BCM4312 |
CentOS 6.6 |
不详 |
不详 |
不详 |
6_30_223_248 |
|||||
BCM4313 |
CentOS 6.6 |
2.6.32-504.16.2.el6 |
x86_64 |
14e4:4727 |
6_30_223_248 |
|||||
BCM4321 |
CentOS 7.1 |
3.10.0-229.el7 |
x86_64 |
14e4:4328 |
6_30_223_248 |
|||||
BCM4322 |
CentOS 7.1 |
3.10.0-229.7.2.el7 |
x86_64 |
14e4:432b |
6_30_223_248 |
|||||
BCM43142 |
CentOS 6.6 |
不详 |
不详 |
14e4:4365(未确定) |
6_30_223_248 |
|||||
BCM43224 |
|
|
|
|
|
|||||
BCM43225 |
|
|
|
|
|
|||||
BCM43227 |
|
|
|
|
|
|||||
BCM43228 |
CentOS 7.1 |
3.10.0-229.4.2.el7 |
x86_64 |
14e4:4359 |
6_30_223_248 |
|||||
BCM4352 |
CentOS 7.1 |
3.10.0-229.7.2.el7 |
x86_64 |
14e4:43b1 |
6_30_223_248 |
|||||
|
CentOS 6.8 |
2.6.32-642.15.1 |
x86_64 |
14e4:43b1 |
6_30_223_271 |
|
注意: 这个驱动程序不能横跨内核升级(意即当你更新内核后用新内核开机,你必须重做以上步骤)。正因为这个原因,你要将压缩档的内容放置在 /usr/local/src/hybrid-wl 内,并更改目录及内容的拥有者。 |
|
注:成功安装驱动程序后,无联机网的新手经常会汇报 Error for wireless request "Set Encode" (8B2A): SET failed on device... 等问题。最简便的解决方法就是 设置 NetworkManager 守护服务替换 network 守护服务来管理你的网络连接。这个问题曾经在 CentOS 5 上出现,但在 CentOS 6 已再没有出现(或被汇报)。 |
8. 附录二:Broadcom 芯片间歇性出现问题
这个驱动程序模块,就笔者的经验而言,有时须要多次开机才能正常运作。简单来说,无线卡能找到 AP,但驱动程序不能与它连接。 我已多番尝试在不重启的情况下令卡/驱动程序,但未能成功。启用/停用 wpa_supplicant 务、开/关 WiFi、挂载/卸除驱动程序、等。有时只有多次重新开机才能令它运作。
来自 /var/log/wpa_supplicant.log:
Trying to associate with 58:6d:8f:xx:xx:xx (SSID='<ssid_name>' freq=2462 MHz) Association request to the driver failed
还有 /var/log/messages:
Dec 19 02:40:03 hostname kernel: cfg80211: Calling CRDA for country: RS Dec 19 02:40:03 hostname kernel: ------------[ cut here ]------------ Dec 19 02:40:03 hostname kernel: WARNING: at net/wireless/sme.c:664 __cfg80211_connect_result+0x3d9/0x430 [cfg80211]() (Tainted: P -- ------------ ) Dec 19 02:40:03 hostname kernel: Hardware name: Vostro 1540 Dec 19 02:40:03 hostname kernel: Modules linked in: vfat fat fuse ip6table_filter ip6_tables ebtable_nat ebtables ipt_MASQUERADE iptable_nat nf_nat xt_CHECKSUM iptable_mangle cpufreq_ondemand acpi_cpufreq freq_table mperf lockd sunrpc bridge stp llc ipv6 nf_conntrack_ftp xt_physdev ipt_REJECT nf_conntrack_ipv4 nf_defrag_ipv4 xt_state nf_conntrack iptable_filter ip_tables vhost_net macvtap macvlan tun kvm_intel kvm microcode iTCO_wdt iTCO_vendor_support dell_laptop dcdbas sg uvcvideo videodev v4l2_compat_ioctl32 btusb bluetooth joydev i2c_i801 lpc_ich mfd_core r8169 mii wl(P)(U) snd_hda_codec_hdmi snd_hda_codec_idt snd_hda_codec_generic cfg80211 rfkill snd_hda_intel snd_hda_codec snd_hwdep snd_seq snd_seq_device snd_pcm snd_timer snd soundcore snd_page_alloc ext4 jbd2 mbcache sr_mod cdrom sd_mod crc_t10dif ahci wmi usb_storage i915 drm_kms_helper drm i2c_algo_bit i2c_core video output dm_mirror dm_region_hash dm_log dm_mod [last unloaded: coretemp] Dec 19 02:40:03 hostname kernel: Pid: 912, comm: cfg80211 Tainted: P -- ------------ 2.6.32-573.26.1.el6.x86_64 #1 Dec 19 02:40:03 hostname kernel: Call Trace: Dec 19 02:40:03 hostname kernel: [<ffffffff81077821>] ? warn_slowpath_common+0x91/0xe0 Dec 19 02:40:03 hostname kernel: [<ffffffff8107788a>] ? warn_slowpath_null+0x1a/0x20 Dec 19 02:40:03 hostname kernel: [<ffffffffa0381239>] ? __cfg80211_connect_result+0x3d9/0x430 [cfg80211] Dec 19 02:40:03 hostname kernel: [<ffffffffa035b374>] ? cfg80211_process_wdev_events+0x144/0x1f0 [cfg80211] Dec 19 02:40:03 hostname kernel: [<ffffffff8153a63b>] ? mutex_unlock+0x1b/0x20 Dec 19 02:40:03 hostname kernel: [<ffffffffa0358410>] ? cfg80211_event_work+0x0/0x30 [cfg80211] Dec 19 02:40:03 hostname kernel: [<ffffffffa035b458>] ? cfg80211_process_rdev_events+0x38/0x70 [cfg80211] Dec 19 02:40:03 hostname kernel: [<ffffffffa0358432>] ? cfg80211_event_work+0x22/0x30 [cfg80211] Dec 19 02:40:03 hostname kernel: [<ffffffff8109ab40>] ? worker_thread+0x170/0x2a0 Dec 19 02:40:03 hostname kernel: [<ffffffff810a1820>] ? autoremove_wake_function+0x0/0x40 Dec 19 02:40:03 hostname kernel: [<ffffffff8109a9d0>] ? worker_thread+0x0/0x2a0 Dec 19 02:40:03 hostname kernel: [<ffffffff810a138e>] ? kthread+0x9e/0xc0 Dec 19 02:40:03 hostname kernel: [<ffffffff8100c28a>] ? child_rip+0xa/0x20 Dec 19 02:40:03 hostname kernel: [<ffffffff810a12f0>] ? kthread+0x0/0xc0 Dec 19 02:40:03 hostname kernel: [<ffffffff8100c280>] ? child_rip+0x0/0x20 Dec 19 02:40:03 hostname kernel: ---[ end trace e80c4119fc086d48 ]--- Dec 19 02:40:03 hostname kernel: cfg80211: Regulatory domain changed to country: RS Dec 19 02:40:03 hostname kernel: cfg80211: DFS Master region: ETSI Dec 19 02:40:03 hostname kernel: cfg80211: (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp), (dfs_cac_time)
有传闻指这是由于 WiFi 卡在开机时「不正确」地装入了固件,因此唯有重新开机才能修正问题。
另一个问题(很大机会由于不正确地载入韧体)就是不稳定/可靠的网络连线。网络卡似乎已与 AP 挂勾,但就算你与 AP 在同一房间仍会显示微弱的讯号,甚至 ping 都会留失,底线就是:连线根本无法使用。同样地,这个问题可靠赖重复开机才至正确地载入韧体而解决。
Translation of revision 61