ubuntu 12.04 bcm43xx無線網卡安裝…

本人本子型號爲HP envy 4 1006TX 無線網卡爲bcm4313 其實 ubuntu 12.04的內核是有這個型號的無線網卡的驅動 但是這個版本驅動 信號實在有點說不過去 於是想着辦法換一個版本

最先嚐試的是ubuntu apt source的bcmwl-kernel-source,這個版本的信號還是不錯的但僅限於12.04的,驅動版本爲5.100.82.38的。
安裝方法:
sudo apt-get install bcmwl-kernel-source
sudo vi /etc/modprobe.d/blacklist.conf
末尾加入以下語句:
blacklist b43
blacklist ssb
blacklist brcmsmac
保存文件後,重啓。

很簡單,驅動性能也還不錯,適合新手使用,但是喜歡折騰的人就繼續往下看吧。

本着自己愛折騰的思想,對驅動追新的理念還是很強的,於是上了broadcom的官網:
64-bit driver 5.100.82.112  10/25/2011 
最新的驅動明顯要比apt source的要新,經過測試性能也好於前者。

首先針對自己的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的確沒有這個接口了,看來這個驅動是2.6的內核的版本,指望官方是沒有希望了,自己動手吧。

看了一下bcmwl-kernel-source的patch,它使用的是.ndo_set_rx_mode替換的,那我們也用這個替換:
vi src/wl/sys/wl_linux.c +388
將源文件改爲以下(ps:這裏偷個懶就不對內核版本進行判斷了):
#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
ok,無線網卡正常運行,信號明顯要比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
保存文件後,重啓。

至此,一切正常,換了驅動後信號只是好的一B,比windows的驅動還要穩定,折騰成功:P
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章