Centos Broadcom驱动

CentOS 对这些芯片组并没有原生的支持。

这页的英文版本现时由 Miloš Blažević 维护。

注:此指南主要针对 EL 6 和 EL 7。假如你采用 EL 5、6 或 7,你可不进行编译,而选择创建兼容 kABI 的 RPM 驱动程序组件,它们在内核升级后仍可重用。进一步数据可参考 ELRepo kmod-wl 页面。另外,有报告指此驱动程序不支持所有芯片组,因此烦请你反馈对 Broadcom 无线产品的经验,好让此指南能保持更新及不断改善。

注:基于这个 Broadcam 驱动程序的极度限制性条款,ELRepo 软件库的开发者放弃以 rpm 组件来提供它 —— 因此这份文件被创建的目的是要提供一个全面的驱动程序安装说明。

注:此指南以 CentOS 6 为基础,并以 Broadcom BCM4313(Vendor/DeviceID 14e4:4727)作测试之用。旧版本的 Wiki 针对 CentOS 5,并利用 Broadcom BCM4311/4312 芯片进行测试。

Contents

  1. 以 Broadcom Corporation BCM4311, BCM4312, BCM4313, BCM4321, BCM4322, BCM43224, BCM43225, BCM43227 和 BCM43228 为基础的无线网络卡
    1. 第 1 步:辨认无线网络芯片及安装时依赖的组件
    2. 第 2 步:下载并解压 Broadcom 驱动程序的压缩档
    3. 第 3 步上:编译 Broadcom 驱动模块 (在 EL6 和 EL7 上)
    4. 第 3 步下:编译 Broadcom 驱动模块 (EL7需要的部分细节)
    5. 第 4 步上:将驱动模块装入内核中
    6. 第 4 步下:在开机时将驱动模块装入内核中
    7. 附录一:已获(用户)测试和汇报为可用的 Broadcom 芯片型号

若要安装以 Broadcom BCM4311、BCM4312、BCM4313、BCM4321、BCM4322、BCM43224、BCM43225、BCM43227 或 BCM43228 为基础的无线网络卡,请遵照以下的步骤:

第 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 步:下载并解压 Broadcom 驱动程序的压缩档

请从 Broadcom 的官方网站下载 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 xvfz /path/to/the/tarball/hybrid-v35_64-nodebug-pcoem-6_30_223_248.tar.gz
[root@host hybrid-wl]# chown -R someuser.somegroup /usr/local/src/hybrid-wl 

注:为什么不随便将它解压到一个位置并保留缺省的拥有者?
原因是上面的做法会把驱动模块的源代码保留在系统上 —— 在你放置它们的位置 —— 好让你可以随时按需要创建驱动程序(譬如:你将内核升了级 —— 因为驱动模块永远根据某个内核来编译),还有,就是你可以用无特权的用户来编译!

第 3 步上:编译 Broadcom 驱动模块 (在 EL6 和 EL7 上)


驱动模块可以这样编译:

[user@host hybrid-wl]$ make -C /lib/modules/`uname -r`/build/ M=`pwd`

请留意引号(即反引号)。

编译现有的驱动程序(6.30.223.248 版)时,你差不多肯定会获得一个错误信息,而不是一个编译好的驱动模块(实际上,本作者仍未遇过这个信息以外的情况)。这则信息的内容随着内核和操作系统版本而变化,但是在 CentOS 6 上它大致上是:

make: Entering directory `/usr/src/kernels/2.6.32-504.1.3.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-504.1.3.el6.x86_64'

注意: 在 EL6 和 EL7 上这里的指令并不相同。对于 EL6 来说,你只需要遵照第 3 步上,但是对于 EL7,你需要同时应用第 3 步上 和第 3 步下 的修正,并且编译它们,就像步骤里(3 上)演示的一样。所以,对于EL7来说,可以跳过 'sed' 命令。

驱动程序由于 wl_cfg80211_hybrid.c 档内检查内核版本的 if-then-else 句式而不能编译。我们须要执行下列两个指令来进行修正:

[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(2, 6, 3.)/>= KERNEL_VERSION(2, 6, 32)/' 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
patching file src/wl/sys/wl_linux.c

现在,请尝试再次编译驱动模块:

[user@host hybrid-wl]$ make -C /lib/modules/`uname -r`/build/ M=`pwd`

编译器的输出大致上是这样:

make: Entering directory `/usr/src/kernels/2.6.32-504.1.3.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
  LD [M] /usr/local/src/hybrid-wl/wl.o
WARNING: modpost: missing MODULE_LICENSE() in /usr/local/src/hybrid-wl/wl.o
see include/linux/module.h for more information
  Building modules, stage 2.
CFG80211 API is prefered for this kernel version
Using CFG80211 API
  MODPOST 1 modules
WARNING: modpost: missing MODULE_LICENSE() in /usr/local/src/hybrid-wl/wl.o
see include/linux/module.h for more information
  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-504.1.3.el6.x86_64'

一旦这个模块被建成,你便可以删除不必要的符号:

[user@host hybrid-wl]$ strip --strip-debug wl.ko

你会发现驱动模块的文件尺寸会缩小(由 8.2MB 降至 7.2MB)。而且,你的驱动模块仍能正常运作 

第 3 步下:编译 Broadcom 驱动模块 (EL7需要的部分细节)

如果你运行的是 EL7,那么不需要运行前面步骤的 'sed' 命令。不过你需要应用这个额外的修正:wl-kmod-rhel7_1.patch(连同第 3 步上 的那个修正一起)

[user@host hybrid-wl]$ patch -p1 < ../wl-kmod-rhel7_1.patch
patching file src/wl/sys/wl_cfg80211_hybrid.c
Hunk #1 succeeded at 1801 (offset -3 lines).
Hunk #2 succeeded at 1867 (offset -3 lines).
Hunk #3 succeeded at 2071 (offset -3 lines).
Hunk #4 succeeded at 2804 (offset -3 lines).

当应用了这个修正之后,接着按照第 3 步上 的剩余步骤 - 编译驱动程序和删除侦错符号。只有应用这两个修正才可以编译驱动模块,就像所说的那样起作用。

第 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 内核模块,你可将它删除 —— 但这并非必须的。

第 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 并把以下内容剪贴到其中:

#!/bin/bash

for M in lib80211 cfg80211 wl; do
    modprobe $M &>/dev/null
done

现在你的驱动应该在每次开机时都会被装入(当然除了在你安装了新内核之后,到时你必须依照以上步骤将它重新编译)。

附录一:已获(用户)测试和汇报为可用的 Broadcom 芯片型号

测试芯片

EL 版本

内核

结构

VendorID:DeviceID

BCM4311

BCM4312

CentOS 6.6

不详

不详

不详

BCM4313

CentOS 6.6

2.6.32-504.16.2.el6

x86_64

14e4:4727

BCM4321

BCM4322

BCM43142

CentOS 6.6

不详

不详

14e4:4365(未確定)

BCM43224

BCM43225

BCM43227

BCM43228

CentOS 7.1

3.10.0-229.4.2.el7

x86_64

14e4:4359

注意: 这个驱动程序不能横跨内核升级(意即当你更新内核后用新内核开机,你必须重做以上步骤)。正因为这个原因,你要将压缩档的内容放置在 /usr/local/src/hybrid-wl 内,并更改目录及内容的拥有者。

注:成功安装驱动程序后,无联机网的新手经常会汇报 Error for wireless request "Set Encode" (8B2A): SET failed on device... 等问题。最简便的解决方法就是 设置 NetworkManager 守护服务替换 network 守护服务来管理你的网络连接。这个问题曾经在 CentOS 5 上出现,但在 CentOS 6 已再没

你可能感兴趣的:(Centos Broadcom驱动)