挣扎了许久,总算能够正常上无线网了。现在想想,操作系统的基础是如此的重要。
比较简单的方法:ubuntu apt source的bcmwl-kernel-source
安装方法如下:
sudo apt-get update sudo apt-get install bcmwl-kernel-source
驱动加入黑名单,让系统记住
sudo vi /etc/modprobe.d/blacklist.conf
末尾加入以下语句:
blacklist b43 blacklist ssb blacklist brcmsmac
复杂方法:
PC公司驱动下载网站上都只支持Windows XX版本的驱动。安装linux操作系统的驱动必须要到相应的硬件厂商网站上才能下载、安装。
首先也必须得了解一下自己电脑的硬件配置:
lspci
找到Network controller一项。找到对应的无线网卡硬件商公司及产品型号。
(Network controller为无线网卡项,Ethernet controller为以太网网卡项)
以下内容暂时没有进行尝试,做为摘抄:
进入broadcom的官网:http://www.broadcom.com/support/802.11/linux_sta.php 下载相应的驱动包。
首先针对自己的OS是32bit还是64bit下载对应的驱动,下载好后开始解压准备编译:
mkdir bcm43xx_x86_64-v5_100_82_112 tar xzvf hybrid-portsrc_x86_64-v5_100_82_112.tar.gz -C bcm43xx_x86_64-v5_100_82_112 cd bcm43xx_x86_64-v5_100_82_112 make
出现以下错误:
Using Wireless Extension API LD /home/ego/Drivers/bcm43xx_x86_64-v5_100_82_112/built-in.o CC [M] /home/ego/Drivers/bcm43xx_x86_64-v5_100_82_112/src/shared/linux_osl.o CC [M] /home/ego/Drivers/bcm43xx_x86_64-v5_100_82_112/src/wl/sys/wl_linux.o /home/ego/Drivers/bcm43xx_x86_64-v5_100_82_112/src/wl/sys/wl_linux.c:388:2: error: unknown field ‘ndo_set_multicast_list’ specified in initializer /home/ego/Drivers/bcm43xx_x86_64-v5_100_82_112/src/wl/sys/wl_linux.c:388:2: warning: initialization from incompatible pointer type [enabled by default] /home/ego/Drivers/bcm43xx_x86_64-v5_100_82_112/src/wl/sys/wl_linux.c:388:2: warning: (near initialization for ‘wl_netdev_ops.ndo_validate_addr’) [enabled by default] make[2]: *** [/home/ego/Drivers/bcm43xx_x86_64-v5_100_82_112/src/wl/sys/wl_linux.o] Error 1 make[1]: *** [_module_/home/ego/Drivers/bcm43xx_x86_64-v5_100_82_112] Error 2 make[1]: Leaving directory `/usr/src/linux-headers-3.2.0-26-generic' make: *** [all] Error 2
关键是src/wl/sys/wl_linux.c的388行
vi src/wl/sys/wl_linux.c +388
代码如下:
.ndo_set_multicast_list = wl_set_multicast_list,
查看内核源码struct net_device_ops的确没有这个接口了。
看了一下bcmwl-kernel-source的patch,它使用的是.ndo_set_rx_mode替换的,那我们也用这个替换:
vi src/wl/sys/wl_linux.c +388
将源文件改为以下:
#if 0 .ndo_set_multicast_list = wl_set_multicast_list, #else .ndo_set_rx_mode = wl_set_multicast_list, #endif
修改好后保存,继续编译:
make
这次编译顺利通过,生成了wl.ko。
sudo make install sudo rmmod brcmsmac sudo rmmod brcmutil sudo depmod sudo modprobe wl sudo ifconfig eth1 up
无线网卡正常运行,信号明显要比bcmwl-kernel-source要好一些。
禁用内核驱动:
sudo vi /etc/modprobe.d/blacklist.conf
末尾加入以下语句:
blacklist b43 blacklist ssb blacklist brcmsmac
保存文件后,重启。
问题出来了,wl加载了,但是竟然不能正常驱动无线网卡,为什么重启之前可用呢,复现重启之前的环境:
sudo rmmod wl sudo modprobe brcmsmac sudo rmmod brcmsmac sudo rmmod brcmutil sudo modprobe wl
神奇,居然又工作了,看来还要依赖brcmsmac才行,不完美,继续折腾!
方法1:
修改启动脚本:
sudo vi /etc/init.d/rc
在文本末尾炸到exit 0关键字后,按照如下修改:
rmmod wl modprobe brcmsmac rmmod brcmsmac rmmod brcmutil modprobe wl trap - EXIT # Disable emergency handler exit 0
保存,重启,ok,驱动正常,但是启动过程中,本子的无线指示灯会出现1秒的循环闪烁,还不是最优解,继续折腾!
方法2:
既然bcmwl-kernel-source可以不依赖brcmsmac直接驱动设备,那么为什么自己编译的不行呢。
继续分析他的deb,没有发现任何不一样,只是他的驱动安装路径不同,难道这也有差,继续偷懒:
sudo apt-get install bcmwl-kernel-source
然后将咱们编译的wl.ko替换掉bcmwl-kernel-source的:
sudo mv /lib/modules/`uname -r`/updates/dkms/wl.ko /lib/modules/`uname -r`/updates/dkms/wl.ko.old sudo cp ./wl.ko /lib/modules/`uname -r`/updates/dkms/wl.ko
继续禁用kernel的驱动:
sudo vi /etc/modprobe.d/blacklist.conf
末尾加入以下语句:
blacklist b43 blacklist ssb blacklist brcmsmac
保存文件后,重启。
参考资料:
http://blog.sina.com.cn/s/blog_73b6331101016haq.html
http://forums.fedoraforum.org/archive/index.php/t-280821.html