[FrontPage] [TitleIndex] [WordIndex

This is a read-only archived version of wiki.centos.org

以 Broadcom Corporation BCM4311, BCM4312, BCM4313, BCM4321, BCM4322, BCM43224, BCM43225, BCM43227 和 BCM43228 為基礎的無線網絡卡

<!> CentOS 對這些晶片組並沒有原生的支援。

這頁的英文版本現時由 Miloš Blažević 維護。

ArtWork/WikiDesign/icon-admonition-info.png

註:此指南主要針對 EL 6 和 EL 7。假如你採用 EL 5、6 或 7,你可不進行編譯,而選擇建立兼容 kABI 的 RPM 驅動程式套件,它們在內核升級後仍可重用。進一步資料可參考 ELRepo kmod-wl 頁面。另外,有報告指此驅動程式不支援所有晶片組,因此煩請你回饋對 Broadcom 無線產品的經驗,好讓此指南能保持更新及不斷改善。

ArtWork/WikiDesign/icon-admonition-info.png

註:基於這個 Broadcam 驅動程式的極度限制性條款,ELRepo 軟件庫的開發者放棄以 rpm 套件來提供它 —— 因此這份文件被建立的目的是要提供一個全面的驅動程式安裝說明。

ArtWork/WikiDesign/icon-admonition-info.png

註: 請留意此 Wiki 或許不適用於較舊版的內核(及/或驅動程式),這是由於驅動程式及新版內核中的改動。正因如此,我們只能保證在最新版的驅動程式及內核下進行編譯。

若要安裝以 Broadcom BCM4311、BCM4312、BCM4313、BCM4321、BCM4322、BCM43224、BCM43225、BCM43227 或 BCM43228 為基礎的無線網絡卡,請遵照以下的步驟:

1. 第 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. 第 2 步:下載並解壓 Broadcom 驅動程式的壓縮檔

請從 的官方網站 —— 它會以 Linux® STA 32-bit driverLinux® STA 64-bit driver 出現在搜尋結果中 —— 下載 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 xvzf /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 

ArtWork/WikiDesign/icon-admonition-idea.png

註:為甚麼不隨便將它解壓到一個位置並保留預設的擁有者?
原因是上面的做法會把驅動模塊的源代碼保留在系統上 —— 在你放置它們的位置 —— 好讓你可以隨時按需要建立驅動程式(譬如:你將內核升了級 —— 因為驅動模塊永遠根據某個內核來編譯),還有,就是你可以用無特權的用戶來編譯!

3. 第 3 步上:編譯 Broadcom 驅動模塊(在 EL6 及 EL7)


驅動模塊可以這樣編譯:

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

請留意引號(即反引號)。

編譯現有的驅動程式(6.30.223.271 版)時,你差不多肯定會獲得一個錯誤信息,而不是一個編譯好的驅動模塊(實際上,本作者仍未遇過這個信息以外的情況)。這則信息的內容也許會因內核及操作系統的版本而異,但在 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'

ArtWork/WikiDesign/icon-admonition-info.png

註: 針對 EL6 和 EL7 的步驟由此起分道揚鏢。如果是 EL6,你應該遵從第 3 步上;而 EL7 只須應用第 3 步上的修正及第 3 步下的修正/sed 指令,只適用於 EL7,並按照此步驟(3 上)內的指示編譯它。即是說, EL7 要略過第 3 步上的 sed 指令。

在 EL6 上,驅動程式由於 wl_cfg80211_hybrid.c 檔內檢查內核版本的 if-then-else 句式而無法編譯。我們須要執行下列的 sed 替代指令來進行修正:

[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

不過單單 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
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

你會發現驅動模塊的檔案大小會縮小(由 8.2MB 降至 7.2MB)。而且,你的驅動模塊仍能正常運作 ;)

4. 第 3 步下:編譯 Broadcom 驅動程式模塊(針對 EL7)

ArtWork/WikiDesign/icon-admonition-info.png

註: 近來,你須要修補代碼後才執行 sed 指令,但這不是定律,因此要是你無法編譯,請嘗試對調次序,即是 sed 後再修補。

視乎 EL7 的定點發行版本(更正確是你運行的內核版本),需要執行的 sed 替代指令會有異。因此,EL 7.0 附帶的標準內核(即 kernel-3.10.0-123.X)不須以下任何指令,EL 7.1(即 kernel-3.10.0-229.X)須要首兩個,EL 7.2(即 kernel-3.10.0-327.X)須要首四個,EL 7.3 須要執行首六個 sed 指令,EL 7.4 須要首七個,而 EL 7.5 須要所有 sed 指令(連同第 3 步上的)才能今源碼編譯:

[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

[user@host hybrid-wl]$ sed -i 's/ < KERNEL_VERSION(4,2,0)/ < KERNEL_VERSION(3, 9, 0)/' src/wl/sys/wl_cfg80211_hybrid.c
[user@host hybrid-wl]$ sed -i 's/ >= KERNEL_VERSION(4, 7, 0)/ >= KERNEL_VERSION(3, 10, 0)/' src/wl/sys/wl_cfg80211_hybrid.c

[user@host hybrid-wl]$ sed -i 's/ >= KERNEL_VERSION(4, 8, 0)/ >= KERNEL_VERSION(3, 10, 0)/' src/wl/sys/wl_cfg80211_hybrid.c
[user@host hybrid-wl]$ sed -i 's/ >= KERNEL_VERSION(4, 11, 0)/ >= KERNEL_VERSION(3, 10, 0)/' src/wl/sys/wl_cfg80211_hybrid.c
[user@host hybrid-wl]$ sed -i 's/ < KERNEL_VERSION(4, 12, 0)/ < KERNEL_VERSION(3, 9, 0)/' src/wl/sys/wl_cfg80211_hybrid.c
[user@host hybrid-wl]$ sed -i 's/ >= KERNEL_VERSION(4, 12, 0)/ >= KERNEL_VERSION(3, 10, 0)/' src/wl/sys/wl_cfg80211_hybrid.c
[user@host hybrid-wl]$ sed -i 's/ <= KERNEL_VERSION(4, 10, 0)/ < KERNEL_VERSION(3, 9, 0)/' src/wl/sys/wl_linux.c

再一次,特別如果你採用 EL 7.3 或它的內核,你必須 應用以下修正檔:wl-kmod-01_kernel_4.7_IEEE80211_BAND_to_NL80211_BAND.patch wl-kmod-02_kernel_4.8_add_cfg80211_scan_info_struct.patch wl-kmod-03_fix_kernel_warnings.patch wl-kmod-04_kernel_4.11_remove_last_rx_in_net_device_struct.patch wl-kmod-05_kernel_4.12_add_cfg80211_roam_info_struct.patch,然後才應用上述六個 sed 替代指令(否則便無法編譯)。此外,不要忘記第 3 步上的修正檔:

[user@host hybrid-wl]$ patch -p1 < ../wl-kmod-01_kernel_4.7_IEEE80211_BAND_to_NL80211_BAND.patch
patching file src/wl/sys/wl_cfg80211_hybrid.c
Hunk #6 succeeded at 1911 (offset 3 lines).
Hunk #7 succeeded at 2040 (offset 3 lines).
Hunk #8 succeeded at 2160 (offset 3 lines).
Hunk #9 succeeded at 2298 (offset 3 lines).
Hunk #10 succeeded at 2941 (offset 3 lines).
[user@host hybrid-wl]$ patch -p1 < ../wl-kmod-02_kernel_4.8_add_cfg80211_scan_info_struct.patch
patching file src/wl/sys/wl_cfg80211_hybrid.c
Hunk #1 succeeded at 2442 (offset 3 lines).
Hunk #2 succeeded at 2553 (offset 3 lines).
Hunk #3 succeeded at 2989 (offset 3 lines).
[user@host hybrid-wl]$ patch -p1 < ../wl-kmod-03_fix_kernel_warnings.patch
patching file src/wl/sys/wl_cfg80211_hybrid.c
Hunk #1 succeeded at 2008 (offset 3 lines).
Hunk #2 succeeded at 2032 (offset 3 lines).
Hunk #3 succeeded at 2056 (offset 3 lines).
Hunk #4 succeeded at 2071 (offset 3 lines).
Hunk #5 succeeded at 2107 (offset 3 lines).
Hunk #6 succeeded at 2386 (offset 3 lines).
Hunk #7 succeeded at 2401 (offset 3 lines).
Hunk #8 succeeded at 2441 (offset 3 lines).
[user@host hybrid-wl]$ patch -p1 < ../wl-kmod-04_kernel_4.11_remove_last_rx_in_net_device_struct.patch
patching file src/wl/sys/wl_cfg80211_hybrid.c
patching file src/wl/sys/wl_linux.c
Hunk #1 succeeded at 2911 (offset -18 lines).
[user@host hybrid-wl]$ patch -p1 < ../wl-kmod-05_kernel_4.12_add_cfg80211_roam_info_struct.patch
patching file src/wl/sys/wl_cfg80211_hybrid.c
Hunk #3 succeeded at 2450 (offset 3 lines).
Hunk #4 succeeded at 2466 (offset 3 lines).

將修正檔應用於源碼後,你只需完成第 3 步上的餘下步驟 —— 編譯驅動程式,並移除偵錯符號。再次強調,建設內核 => 229 只需首兩個指令,內核 => 327 需要首四個 sed 取代指令,內核 => 514 須要 6 個,內核 >=693 須要 7 個,而內核 >=862 須要所有 sed 指令才能編譯驅動程式。

5. 第 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 內核模塊,你可將它移除 —— 但這並非必須的。

6. 第 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 並把以下內容剪貼到其中:

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

現在你的驅動應該在每次開機時都會被載入(當然除了在你安裝了新內核之後,到時你必須依照以上步驟將它重新編譯)。

7. 附錄一:已獲(用戶)測試和匯報為可用的 Broadcom 晶片型號

測試晶片

EL 版本

內核

架構

發行商編號:裝置編號

驅動程式版本

BCM4311

CentOS 7.3

3.10.0-514.2.2.el7

x86_64

不詳

6_30_223_271

BCM4312

CentOS 6.6

不詳

不詳

不詳

6_30_223_248

BCM4313

CentOS 6.6

2.6.32-504.16.2.el6

x86_64

14e4:4727

6_30_223_248

BCM4321

CentOS 7.1

3.10.0-229.el7

x86_64

14e4:4328

6_30_223_248

BCM4322

CentOS 7.1

3.10.0-229.7.2.el7

x86_64

14e4:432b

6_30_223_248

BCM43142

CentOS 6.6

不詳

不詳

14e4:4365(未確定)

6_30_223_248

BCM43224

BCM43225

BCM43227

BCM43228

CentOS 7.1

3.10.0-229.4.2.el7

x86_64

14e4:4359

6_30_223_248

BCM4352

CentOS 7.1

3.10.0-229.7.2.el7

x86_64

14e4:43b1

6_30_223_248

CentOS 6.8

2.6.32-642.15.1

x86_64

14e4:43b1

6_30_223_271

ArtWork/WikiDesign/icon-admonition-alert.png

注意: 這個驅動程式無法橫跨內核升級(意即當你更新內核後用新內核開機,你必須重做以上步驟)。正因為這個原因,你要將壓縮檔的內容放置在 /usr/local/src/hybrid-wl 內,並更改目錄及內容的擁有者。

ArtWork/WikiDesign/icon-admonition-info.png

註:成功安裝驅動程式後,無線上網的新手經常會匯報 Error for wireless request "Set Encode" (8B2A): SET failed on device... 等問題。最簡便的解決方法就是 設置 NetworkManager 常駐服務替代 network 常駐服務來管理你的網絡連線。這個問題曾經在 CentOS 5 上出現,但在 CentOS 6 已再沒有出現(或被匯報)。

8. 附錄二:Broadcom 晶片間歇性出現問題

這個驅動程式模塊,就筆者的經驗而言,有時須要多次開機才能正常運作。簡單來說,無線卡能找到 AP,但驅動程式無法與它連線。 我已多番嘗試在不重啟的情況下令卡/驅動程式,但未能成功。啟用/停用 wpa_supplicant 務、開/關 WiFi、掛載/卸除驅動程式、等。有時只有多次重新開機才能令它運作。

來自 /var/log/wpa_supplicant.log:

Trying to associate with 58:6d:8f:xx:xx:xx (SSID='<ssid_name>' freq=2462 MHz)
Association request to the driver failed

還有 /var/log/messages:

Dec 19 02:40:03 hostname kernel: cfg80211: Calling CRDA for country: RS
Dec 19 02:40:03 hostname kernel: ------------[ cut here ]------------
Dec 19 02:40:03 hostname kernel: WARNING: at net/wireless/sme.c:664 __cfg80211_connect_result+0x3d9/0x430 [cfg80211]() (Tainted: P -- ------------ )
Dec 19 02:40:03 hostname kernel: Hardware name: Vostro 1540
Dec 19 02:40:03 hostname kernel: Modules linked in: vfat fat fuse ip6table_filter ip6_tables ebtable_nat ebtables ipt_MASQUERADE iptable_nat nf_nat xt_CHECKSUM iptable_mangle cpufreq_ondemand acpi_cpufreq freq_table mperf lockd sunrpc bridge stp llc ipv6 nf_conntrack_ftp xt_physdev ipt_REJECT nf_conntrack_ipv4 nf_defrag_ipv4 xt_state nf_conntrack iptable_filter ip_tables vhost_net macvtap macvlan tun kvm_intel kvm microcode iTCO_wdt iTCO_vendor_support dell_laptop dcdbas sg uvcvideo videodev v4l2_compat_ioctl32 btusb bluetooth joydev i2c_i801 lpc_ich mfd_core r8169 mii wl(P)(U) snd_hda_codec_hdmi snd_hda_codec_idt snd_hda_codec_generic cfg80211 rfkill snd_hda_intel snd_hda_codec snd_hwdep snd_seq snd_seq_device snd_pcm snd_timer snd soundcore snd_page_alloc ext4 jbd2 mbcache sr_mod cdrom sd_mod crc_t10dif ahci wmi usb_storage i915 drm_kms_helper drm i2c_algo_bit i2c_core video output dm_mirror dm_region_hash dm_log dm_mod [last unloaded: coretemp]
Dec 19 02:40:03 hostname kernel: Pid: 912, comm: cfg80211 Tainted: P -- ------------ 2.6.32-573.26.1.el6.x86_64 #1
Dec 19 02:40:03 hostname kernel: Call Trace:
Dec 19 02:40:03 hostname kernel: [<ffffffff81077821>] ? warn_slowpath_common+0x91/0xe0
Dec 19 02:40:03 hostname kernel: [<ffffffff8107788a>] ? warn_slowpath_null+0x1a/0x20
Dec 19 02:40:03 hostname kernel: [<ffffffffa0381239>] ? __cfg80211_connect_result+0x3d9/0x430 [cfg80211]
Dec 19 02:40:03 hostname kernel: [<ffffffffa035b374>] ? cfg80211_process_wdev_events+0x144/0x1f0 [cfg80211]
Dec 19 02:40:03 hostname kernel: [<ffffffff8153a63b>] ? mutex_unlock+0x1b/0x20
Dec 19 02:40:03 hostname kernel: [<ffffffffa0358410>] ? cfg80211_event_work+0x0/0x30 [cfg80211]
Dec 19 02:40:03 hostname kernel: [<ffffffffa035b458>] ? cfg80211_process_rdev_events+0x38/0x70 [cfg80211]
Dec 19 02:40:03 hostname kernel: [<ffffffffa0358432>] ? cfg80211_event_work+0x22/0x30 [cfg80211]
Dec 19 02:40:03 hostname kernel: [<ffffffff8109ab40>] ? worker_thread+0x170/0x2a0
Dec 19 02:40:03 hostname kernel: [<ffffffff810a1820>] ? autoremove_wake_function+0x0/0x40
Dec 19 02:40:03 hostname kernel: [<ffffffff8109a9d0>] ? worker_thread+0x0/0x2a0
Dec 19 02:40:03 hostname kernel: [<ffffffff810a138e>] ? kthread+0x9e/0xc0
Dec 19 02:40:03 hostname kernel: [<ffffffff8100c28a>] ? child_rip+0xa/0x20
Dec 19 02:40:03 hostname kernel: [<ffffffff810a12f0>] ? kthread+0x0/0xc0
Dec 19 02:40:03 hostname kernel: [<ffffffff8100c280>] ? child_rip+0x0/0x20
Dec 19 02:40:03 hostname kernel: ---[ end trace e80c4119fc086d48 ]---
Dec 19 02:40:03 hostname kernel: cfg80211: Regulatory domain changed to country: RS
Dec 19 02:40:03 hostname kernel: cfg80211: DFS Master region: ETSI
Dec 19 02:40:03 hostname kernel: cfg80211: (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp), (dfs_cac_time)

有傳聞指這是由於 WiFi 卡在開機時「不正確」地載入了韌體,因此唯有重新開機才能修正問題。

另一個問題(很大機會由於不正確地載入韌體)就是不穩定/可靠的網絡連線。網絡卡似乎已與 AP 掛勾,但就算你與 AP 在同一房間仍會顯示微弱的訊號,甚至 ping 都會留失,底線就是:連線根本無法使用。同樣地,這個問題可靠賴重覆開機才至正確地載入韌體而解決。

Translation of revision 61


2023-09-11 07:23