解决博通Broadcom无线网卡在Linux系统中的一些问题

概述

博通(Broadcom):
上世纪90年代初创立于美国加州的一家无厂半导体公司,自从2003开始涉足无线局域网芯片组后,其芯片组在GNU/Linux上的支持不好可谓臭名昭著。
在GNU/Linux平台中,针对博通无线芯片的驱动有3个版本:

版本 描述
brcm80211 博通发布的完全开源的驱动程序,在内核版本2.6.37后引入
b43 社区通过逆向工程开发的驱动,在内核版本2.6.24后引入
broadcom-wl 包含受限许可的博通私有驱动

在默认情况下,Linux系统会加载b43驱动,而这些驱动一般都不能很好的发挥硬件性能

所以如果你发现你的电脑在Windows系统上无线速度良好,在Linux中却遇到高丢包、高延迟、传输速度慢等问题,赶快看看你的网卡是不是来自博通。

你可以通过lspci来查看通过PCI总线连接到电脑的设备

$ lspci -k | grep Network
#你的输出可能类似于这样:
08:00.0 Network controller: Broadcom Inc. and subsidiaries BCM4313 802.11bgn Wireless Network Adapter (rev 01)
    Subsystem: Broadcom Inc. and subsidiaries BCM4313 802.11bgn Wireless Network Adapter

安装私有驱动

broadcom-wl驱动有broadcom-wl和基于DKMS的两种版本,这里推荐安装基于DKMS的版本,它的优点是可以使用不同的内核,同时,在内核升级后也不会破坏,不用重新安装

ArchLinux以及Manjaro等基于ArchLinux的发行版

在安装之前,我们需要先安装base-devel软件包组以及linux-headers

它们的的安装命令是:

# pacman -Syu base-devel linux-headres

之后我们安装broadcom-wl-dkms包:

# pacman -Syu broadcom-wl-dkms

之后我们按照提示以root权限执行:

# rmmod b43 b43legacy bcm43xx bcma brcm80211 brcmfmac brcmsmac ssb wl

以删除其他可能冲突的模块,再执行:

# modprobe wl

加载wl模块
安装完成后我们执行$ lspci -vnn -d 14e4:命令检查模块加载情况:

Kernel driver in use: wl
Kernel modules: bcma, wl

在最后两行,应该输出如上信息,代表驱动已经切换为wl驱动

Debian以及其他基于Debian的发行版

和ArchLinux不同的是,在Debian系统中安装之前需要在/etc/apt/sources.list添加一个非自由固件,例如:

#Debian 9“Stretch”
deb http://httpredir.debian.org/debian/ stretch main contrib non-free

之后刷新软件包列表并安装可用的Linux imagelinux-headers以及broadcom-sta-dkms

# apt update
# apt install linux-image-$(uname -r|sed 's,[^-]*-[^-]*-,,') linux-headers-$(uname -r|sed 's,[^-]*-[^-]*-,,') broadcom-sta-dkms

之后需要卸载冲突的模块:

# modprobe -r b44 b43 b43legacy ssb brcmsmac bcma

然后加载wl模块:

# modprobe wl