Gentoo Linux在MacBook Pro配置Wifi

Broadcom WiFi

早期MacBook Air 11” 2011版

我曾经使用过MacBook Air 11” 2011版,这款笔记本使用的是Broadcom B43xx系列,是可以使用 b43-firmware 驱动的,装 b43 驱动即可:

MacBook Air 11” 2011版可以使用 b43 驱动
echo "sys-firmware/b43-firmware" >> /etc/portage/package.accept_keywords
echo "sys-firmware/b43-firmware Broadcom" >> /etc/portage/package.license
emerge --ask b43-firmware

Broadcom BCM4360

MacBook Pro 15” Late 2013 以及我另外一台 MacBook Air 13” ,采用是 Broadcom BCM4360 。这款无线芯片对开源支持不佳,参考 Linux wireless b43文档 可以看到 b43 驱动不支持BCM4360,建议使用 wl 驱动。

也就是需要使用闭源的Broadcom驱动( Apple Macbook Pro Retina - Closed source Broadcom driver )

lspci -k 输出硬件信息
# lspci -k
...
03:00.0 Network controller: Broadcom Inc. and subsidiaries BCM4360 802.11ac Wireless Network Adapter (rev 03)
	Subsystem: Apple Inc. BCM4360 802.11ac Wireless Network Adapter
	Kernel driver in use: bcma-pci-bridge
	Kernel modules: bcma
...

内核

IEEE 802.11

至少需要激活 cfg80211 (CONFIG_CFG80211) 和 mac80211 (CONFIG_MAC80211)

内核激活 cfg80211 (CONFIG_CFG80211) 和 mac80211 (CONFIG_MAC80211)
[*] Networking support  --->
    [*] Wireless  --->
        <M>   cfg80211 - wireless configuration API
        [ ]     nl80211 testmode command
        [ ]     enable developer warnings
        [ ]     cfg80211 certification onus
        [*]     enable powersave by default
        [*]     cfg80211 DebugFS entries # 文档没有要求,我选择激活
        [ ]     support CRDA
        [ ]     cfg80211 wireless extensions compatibility
        <M>   Generic IEEE 802.11 Networking Stack (mac80211)
        [*]   Minstrel
        [*]     Minstrel 802.11n support
        [ ]       Minstrel 802.11ac support
              Default rate control algorithm (Minstrel)  --->
        [*]   Enable mac80211 mesh networking support # 文档没有要求,但我这个功能有时候有用
        -*-   Enable LED triggers
        -*-   Export mac80211 internals in DebugFS
        [ ]   Trace all mac80211 debug messages
        [ ]   Select mac80211 debugging features  ----

备注

由于需要加载firmware,所以 wireless configuration API (CONFIG_CFG80211) 需要配置成模块方式而不是直接buildin

备注

对于私有驱动, 似乎 需要关闭 mac80211 (CONFIG_MAC80211)

WEXT

cfg80211 wireless extensions compatibility 选项( WEXT )可以支持传统的 wireless-toolsiwconfig :

内核激活 cfg80211 wireless extensions compatibility 选项( WEXT )
[*] Networking support  --->
    [*] Wireless  --->
        [*]     cfg80211 wireless extensions compatibility

备注

我在 Kernel 6.1.12 未找到这个配置项

设备驱动

注意,建议将驱动编译为内核模块,因为WiFi驱动通常需要firmware,只有作为模块加载时才能使用firmware:

内核激活相应的驱动内核模块
Device Drivers  --->
    [*] Network device support  --->
        [*] Wireless LAN  --->
 
            Select the driver for your Wifi network device, e.g.:
            <M> Broadcom 43xx wireless support (mac80211 stack) (b43)
            [M]    Support for 802.11n (N-PHY) devices
            [M]    Support for low-power (LP-PHY) devices
            [M]    Support for HT-PHY (high throughput) devices
            <M> Intel Wireless WiFi Next Gen AGN - Wireless-N/Advanced-N/Ultimate-N (iwlwifi)
            <M>    Intel Wireless WiFi DVM Firmware support                             
            <M>    Intel Wireless WiFi MVM Firmware support
            <M> Intel Wireless WiFi 4965AGN (iwl4965)
            <M> Intel PRO/Wireless 3945ABG/BG Network Connection (iwl3945)
            <M> Ralink driver support  --->
                <M>   Ralink rt27xx/rt28xx/rt30xx (USB) support (rt2800usb)
 
-*- Cryptographic API --->
    Accelerated Cryptographic Algorithms for CPU (x86)  --->
       <*> Ciphers: AES, modes: ECB, CBC, CTS, CTR, XTR, XTS, GCM (AES-NI)

备注

b43 可以在内核源码中激活模块方式编译,但是Broadcom4360需要私有驱动 net-wireless/broadcom-sta 没有编译选项

对于安装私有驱动,上述设备驱动我全关闭了

但是参考 Closed source Broadcom driver 采用激活Intel PRO/Wireless 2100网卡驱动来输出内核的 LIB80211

Device Drivers
   -> Network device support
      -> Wireless LAN
         -> <*>   Intel PRO/Wireless 2100 Network Connection

LED支持

笔记本内置WiFi没有LED,可忽略

内核WiFi的LED支持(数据包收发LED triggers)
Device Drivers  --->
    [*] LED Support  --->
        <*>   LED Class Support
 
[*] Networking support  --->
    [*] Wireless  --->
        [*] Enable LED triggers

Firmware

根据 gentoo linux wiki: WiFi 文档,除了内核模块编译支持之外,WiFi芯片还需要对应firmware:

Broadcom无线网卡驱动及firmware

WiFi设备

驱动

Firmware

说明

Broadcom 43xx 无线芯片

b43 / b43legacy

sys-firmware/b43-firmware

可用于 Aircrack-ng ,如果bcm43xx设备被该驱动支持则通常是最好的选择

Broadcom PCIe和SDIO/USB设备

brcmsmac / brcmfmac

sys-kernel/linux-firmware

缺乏节能,LED支持以及一些其他功能

Broadcom 43xx 无线芯片

wl

net-wireless/broadcom-sta

私有驱动,没有AP或监控模式,可以支持 b43 不支持的芯片,如4360

Broadcom BCM4360驱动和Firmware

综上所述,对于 Broadcom BCM4360 实际上就只有安装私有驱动和firmware了,几乎连内核驱动模块都省了:

  • 安装 wl 驱动和firmware:

安装Broadcom BCM4360的私有驱动和firmware
emerge --ask net-wireless/broadcom-sta

备注

net-wireless/broadcom-sta 同时包含了驱动和firmware

broadcom-sta 编译时会检查当前内核编译配置,如果有冲突选项会提示,按提示调整内核编译配置,例如我遇到以下内核配置需要关闭:

X86_INTEL_LPSS  #位于 "Processor type and features ==> Intel Low Power Subsystem Support"
PREEMPT_RCU 不能设置为 Preemptible Kernel  Preemption Model  #位于General setup ==> RCU Subsystem

PREEMPT_RCU 冲突

我在最新的 6.1.12 内核安装 broadcom-sta 遇到报错:

PREEMPT_RCU: Please do not set the Preemption Model to "Preemptible Kernel"; choose something else.

这个问题在 emerge broadcom-sta fails (6.1.12 kernel) due to PREEMPT_RCU 有解决建议:

  • PREEMPT_RCU 不能直接修改(确实,我在配置选项中没有找到)

  • General setup 中 当选择以下 preemption modelsPREEMPT_RCU 会自动选择:

    • Preemptible Kernel (Low-Latency Desktop) # 位于 General setup => Preemption Model

    • Fully Preemptible Kernel (Real-Time) (this might not be available on all CPU architectures)

  • General setup 中如果激活 PREEMPT_DYNAMIC 就会自动选择

果然,原来我选择激活了 Gneeral setup => Preemption behaviour defined on boot ,这个选项就是 PREEMPT_DYNAMIC=y ,就是这个选项导致。真是这个选项激活导致了 PREEMPT_RCU 出现,我取消这个配置就可以了

参考