ubuntu14.04安装无线网卡驱动

挣扎了许久,总算能够正常上无线网了。现在想想,操作系统的基础是如此的重要。

 

比较简单的方法: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

你可能感兴趣的:(ubuntu14.04安装无线网卡驱动)