Broadcom wireless (简体中文)

From ArchWiki
Jump to: navigation, search


介绍

博通对于其Wifi卡在 GNU/Linux 上的支持不好可谓是臭名昭著。直到最近,大部分的博通芯片要么是完全不被支持,或者需要用户自行修改内核。一组有限的无线芯片由不同的逆向工程提供支持(比如:brcm4xxx, b43。从 Kernel 2.6.24 开始,这些逆向工程 b43 的驱动已经被收录。

2008年8月,博通发布了GNU/ Linux上的 802.11 Linux STA 驱动 正式为其无线设备提供 GNU/Linux 支持。这些驱动是闭源的, 但博通承诺,在未来将以一种更加开放的方式提供支持。此外,它们不具有隐藏 ESSID 的功能。

在2010年9月,博通完全开源的硬件驱动[1]。该驱动程序 brcm80211已被列入到自2.6.37之后的内核中。随着2.6.39发布,这些驱动程序已被重新命名为 brcmsmac brcmfmac


在写这篇文章时,使用博通芯片组的用户有以下三种选择:

驱动 描述
brcmsmac/brcmfmac 开源内核驱动
b43 逆向工程内核驱动
broadcom-wl 专有的 Broadcom STA 驱动

查看你可以使用何种驱动

首先,向你的终端输入以下内容来检测网卡的 PCI-ID:

$ lspci -vnn | grep 14e4:

然后在以下列表中检查 [2] 以及 [3].

获取驱动

brcm80211

Kernel內建了两个开源驱动: brcmfmac 提供原生硬MAC支持, brcmsmac 提供基于mac80211的软MAC支持。 它们应该会在启动时自行加载。

Note:
  • brcmfmac 提供较新的芯片支持,并且支持AP模式,P2P模式,高级加密。
  • brcmsmac 仅提供对于较老芯片的支持,例如BCM4313, BCM43224, BCM43225。

b43/b43legacy

b43 以及 b43legacy两个逆向工程驱动已经被內建在Kernel中。b43支持大部分的博通无线芯片组,而b43legacy驱动仅支持早期的BCM4301以及BCM4306 rev.2 芯片组。为了避免与别的驱动造成冲突,请 blacklist 未使用的驱动。

这些驱动的运行都需要安装闭源固件,请从AUR安装b43-firmwareAURb43-firmware-classicAUR 或者 b43-firmware-legacyAUR

Note:
  • BCM4306 rev.3, BCM4311, BCM4312 与 b43-firmware 固件不能良好的工作。对于这些芯片组请使用 b43-firmware-classicAUR 代替。
  • BCM4331 与 b43-firmware-classic 固件不能良好的工作。 对于这些芯片组请使用 b43-firmwareAUR 代替。


broadcom-wl

AUR 中有两个版本的Broadcom STA闭源驱动:

Tip: DKMS版本 broadcom-wl-dkms
  • 可以在不同的Kernel中工作 (例如 linux-ckAUR).
  • 每次安装新的Kernel时,dkms都会重新构建驱动,如果你使用 broadcom-wlAUR 或者其他依赖于单个Kernel版本的驱动 (例如 broadcom-wl-ckAUR), 那么在更新Kernel或者使用新的Kernel时都有可能使驱动崩溃。

加载broadcom-wl的内核模块

wl 模块可能会与其他模块冲突而无法加载。加载wl模块之前, 请移除b43或者其他可能造成冲突的模块:

# rmmod b43

如果 ssb 加载了,也请一并移除:

# rmmod ssb
Note: 错误的加载 ssb 可能导致无线界面无法被创建。

加载 wl 模块:

# modprobe wl

加载 wl 模块的同时 lib80211 或者 lib80211_crypt_tkip 应该也会被自动加载。 使用 lsmod 来进行检查,如果没有,请手动加载二者之一;

# modprobe lib80211

# modprobe lib80211_crypt_tkip

如果你直接从博通官方网站下载驱动冰安装,你可能同时需要更新依赖模块:

# depmod -a

如果模块无法在启动时加载,请将 wl (以及 lib80211/lib80211_crypt_tkip如果需要) 到 /etc/rc.conf的MODULES列:

# MODULES=(... wl...)

你也可以Blacklist掉可能冲突的模块,在 /etc/modprobe.d/modprobe.conf中加入:

# blacklist b43
# blacklist ssb
Warning: Broadcom Corporation BCM4311 802.11b/g WLAN [14e4:4311] 在Blacklist b43 以及 ssb后可能不工作。

加载多博通网卡的内核驱动模块

b43的博通无线网卡驱动与b44博通有线网卡驱动可能产生冲突,因此建议您使用broadcom-wl驱动

  • Put "lib80211_crypt_tkip" and "wl" at the BEFORE b44 (if you have it) position in MODULES= 在 /etc/rc.conf 模块部分,b44(如果你需要这个驱动的话)之前加入lib80211_crypt_tkip wl
  • 不要忘记把 b43 模块加入黑名单
  • 您的无线网卡设备为eth0
  • 您的有线网卡设备为eth1
  • 两者能同是正常工作

故障排除

各种可以纠正的错误。

更新 Kernel 后设备无法访问

如果您使用 brcm80211 请确保没有被 blacklisted。如果你使用 b43 驱动确保它在工作。如果你使用Broadcom STA驱动的broadcom-wlAUR包,请重新安装或一劳永逸地切换成broadcom-wl-dkms

使用 broadcom-wl 驱动的设备不工作/不显示

请查看dmesg是否存在报错信息,broadcom-wl经常发生奇怪的问题,重新加载Kernel模块或者重启一般能解决问题

使用 broadcom-wl 驱动时接口交换

使用 broadcom-wl 驱动也许会发现它们的以太网和 Wi-Fi 接口交换了。查看这里(device naming)的解决方案。

接口显示正常但是不能连接

加入以下 kernel parameter:

b43.allhwsupport=1

奇怪的报错信息

你可能会在启动时接收到奇怪的报错信息,类似于:

phy0: brcms_ops_bss_info_changed: arp filtering: enabled true, count 0 (implement)
phy0: brcms_ops_bss_info_changed: qos enabled: false (implement)
phy0: brcms_ops_bss_info_changed: arp filtering: enabled true, count 1 (implement)
enabled, active

一般情况下这并不影响驱动的正常工作,如果你想不想收到这些信息,可以提高printk的日志级别。

/etc/sysctl.d/中创建一个printk.conf或者类似的配置文件:

printk.conf

kernel.printk = 3 3 3 3

最后sysctl -p确保配置被成功写入。

不能检测到设备 BCM43241

无论是 lspci 还是 lsusb 都不能检测到设备。这个问题目前无法解决。 请在解决后删除此部分。

在连接到某些路由器时可能不稳定

如果没有其他的解决方法,安装linux-lts,或者使用低版本的驱动