安装CentOS 7双系统(四)——解决博通无线网卡问题

上一篇我们安装好了CentOS 7系统,但是却发现笔记本电脑无法连接Wi-Fi,这是因为我的笔记本电脑使用博通的无线网卡,驱动不支持导致的。

本文主要从英文翻译过来,希望能帮助一些童鞋解决这个问题,如果英文差不多可以直接看CentOS论坛上这篇,可以完美解决。

前言

CentOS 7本身可以支持很多常见的无线网卡,但如果你不幸使用了博通公司的BCM4311, BCM4312, BCM4313, BCM4321, BCM4322, BCM43224, BCM43225, BCM43227 and BCM43228这些型号的无线网卡,就需要进行一些配置了。

注:本文所记录的方法主要针对EL6 and EL7

目录

  • 步骤一:确定无线网卡型号,并安装依赖包
  • 步骤二:下载、解压博通无线网卡驱动压缩包
  • 步骤三:编译博通芯片驱动模块
  • 步骤四:将驱动载入内核
  • 步骤五:将驱动载入程序加入开机启动

步骤一:确定无线网卡型号,并安装依赖包

[user@host ~]$ /sbin/lspci | grep Broadcom  
0b:00.0 Network controller: Broadcom Corporation BCM4312 802.11a/b/g (rev 01)

注:博主自己电脑网卡的型号是BCM43142,虽然原帖中没有列出来,也是没有关系的,方法完全适用

另外确定你在之后编译阶段没有缺失必要的宏包

[root@host ~]# yum install kernel-headers kernel-devel gcc

当然啦,如果你用的是服务器,要编译Xen kernel (i.e. kernel-xen),那你需要下载kernel-xen-devel 而不是kernel-devel

步骤二:下载、解压博通无线网卡驱动压缩包

博通官网下载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_271.tar.gz  
[root@host hybrid-wl]# chown -R someuser.somegroup /usr/local/src/hybrid-wl

步骤三:编译博通芯片驱动模块

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

根据目前这个版本的驱动,几乎可以肯定所有人都会编译出错,在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'

注:博主发现在el7上错误信息和上面列的相同

接下来就是el6el7步骤不同的地方

EL6

在EL6上,因为内核中if-then-else语句会搜寻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  
[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

EL7

而在EL7上,需要运行的是以下语句:

[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

打补丁,再次编译

以下步骤在EL6和EL7上相同。

下载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

至此,驱动已经编译完成,可以使用。

步骤四:将驱动载入内核

首先,移除已经存在的一些不可用的无线网卡驱动,这样才能载入新的。

[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

把驱动模块放在kernel能找到的地方

[root@host hybrid-wl]# cp -vi /usr/local/src/hybrid-wl/wl.ko /lib/modules/`uname -r`/extra/

然后运行

[root@host ~]# depmod $(uname -r)  
[root@host hybrid-wl]# modprobe wl

如果没有报错就可以用啦。

步骤五:将驱动载入程序加入开机启动

编辑/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

这样,驱动就会开机启动啦!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容

  • 0 前言 最近闲来无事,决定研(ru)究(keng)一下Linux,装了一个CentOS 6.5 的版本,安装过程...
    Tongson阅读 3,854评论 0 4
  • 我们说的Linux其实指的就是 内核(kernel)而已。这个内核控制你主机的所有硬件并提供系统所有的功能,所以它...
    Zhang21阅读 7,376评论 0 18
  • 我这里今天4℃ 屋子里没装暖气 这会儿 人坐在了床上 盖着 两条被子 中午出去吃饭 风 很凉很凉 吹的我头疼 ...
    与黄鹤阅读 186评论 0 1
  • 人生处处是风景,有君自是艳阳天, 相携华发余生度,不羡鸳鸯莫羡仙!
    化茧成蝶_219a阅读 168评论 0 1
  • 我想小心翼翼的抓住你的手,想我们是适合在一起的。 可以越想好好把握,越会弄巧成拙。 我从来没有抱怨你不在意时间。 ...
    火星女神阅读 210评论 0 0