Fix the broken WiFi (brcmfmac / BCM43602) on a MacBook Pro 2016/2017 running Linux — Ubuntu, Xubuntu, Debian, Fedora, Arch Linux, openSUSE and derivatives.
If your MacBook Pro on Linux shows any of these symptoms, this repository is for you:
- ❌ WiFi won't connect even with the correct password (NetworkManager keeps re-asking for it)
- ❌
CTRL-EVENT-ASSOC-REJECT bssid=00:00:00:00:00:00 status_code=16in the logs - ❌ Very weak signal — only works right next to the router
- ❌ No 5GHz networks visible, only 2.4GHz
- ❌ Disconnects every few minutes and reconnects
- ❌ Slow link speed (stuck at 54–130 Mbit/s)
- ❌
brcmf_c_process_clm_blob: no clm_blob available/Direct firmware load for brcm/brcmfmac43602-pcie.txt failedindmesg
After this fix (results on a MacBookPro13,2 / Xubuntu): 5GHz 802.11ac, signal −76 dBm → −40 dBm, link 400 Mbit/s, stable for hours with zero drops.
Applies to Apple's BCM43602 chip (PCI ID
14e4:43ba), found in the MacBook Pro 13" and 15" 2016–2017 (MacBookPro13,1 / 13,2 / 13,3 / 14,1 / 14,2 / 14,3). Check yours withlspci -nn | grep -i network.
- Why WiFi is broken on these MacBooks
- Quick install
- Manual playbook (step by step)
- Router-side recommendations
- Troubleshooting & FAQ
- Uninstall
- Roadmap
- Credits & sources
Four independent problems stack on top of each other:
- Missing NVRAM calibration. The BCM43602 needs a per-board radio
calibration file (
brcmfmac43602-pcie.txt). On macOS, Apple provides it; Broadcom does not allow Linux distributions to ship it. Without it the radio runs uncalibrated: crippled transmit power, no 5GHz, and a placeholder Broadcom MAC address (00:90:4c:…). This is the main fix — this repo ships a community-extracted Apple NVRAM you adapt to your machine. - Apple OEM country code. The firmware defaults to locale
ccode=X0, which the genericlinux-firmwareblob has no regulatory data for, further limiting power and channels. We patch it to the worldwide default. - Aggressive power saving in NetworkManager causes the disconnect-every-few-minutes pattern.
- WPA2/WPA3 transition mode on modern routers. The 2015-era firmware cannot do PMF/802.11w (management frame protection), so association against mixed-mode access points times out — which NetworkManager misreports as a wrong password.
All methods need the stock firmware present first (package linux-firmware
on Ubuntu/Arch, linux-firmware / brcmfmac-firmware on Fedora).
wget https://github.com/DeyAgrO/macbook-pro-13-2-linux/releases/latest/download/macbook-bcm43602-fix_1.0.0_all.deb
sudo apt install ./macbook-bcm43602-fix_1.0.0_all.deb
sudo rebootwget https://github.com/DeyAgrO/macbook-pro-13-2-linux/releases/latest/download/macbook-bcm43602-fix-1.0.0-1.noarch.rpm
sudo dnf install ./macbook-bcm43602-fix-1.0.0-1.noarch.rpm # or: sudo zypper install ./macbook-bcm43602-fix.rpm
sudo rebootgit clone https://github.com/DeyAgrO/macbook-pro-13-2-linux.git
cd macbook-pro-13-2-linux/packaging/arch
makepkg -si
sudo rebootgit clone https://github.com/DeyAgrO/macbook-pro-13-2-linux.git
cd macbook-pro-13-2-linux
sudo ./scripts/install.sh --country FR # use your own country code!After installing, if your router runs WPA2/WPA3 mixed mode, disable PMF on your connection (see Router-side recommendations):
nmcli connection modify "<your-wifi-name>" 802-11-wireless-security.pmf disableUse this if you want to understand each step or adapt it to another distro, init system, or network stack. Run everything as root.
0. Confirm the chip and the symptoms.
lspci -nn | grep -i network # expect: BCM43602 [14e4:43ba]
dmesg | grep brcmfmac # look for the missing .txt/.clm_blob lines
journalctl -u wpa_supplicant | grep ASSOC-REJECT1. Install the NVRAM calibration file.
Copy firmware/brcmfmac43602-pcie.txt to
/usr/lib/firmware/brcm/ and set macaddr= to your interface's MAC address
(any unique MAC works — ip link shows the current one):
sed "s/^macaddr=.*/macaddr=$(cat /sys/class/net/wl*/address)/" \
firmware/brcmfmac43602-pcie.txt > /usr/lib/firmware/brcm/brcmfmac43602-pcie.txt2. Patch the firmware blob's country code (X0 → worldwide):
sudo ./scripts/patch-firmware-ccode.sh3. Driver options. Create /etc/modprobe.d/brcmfmac.conf:
options brcmfmac feature_disable=0x82000 roamoff=1
feature_disable=0x82000 turns off the firmware's internal supplicant and SAE
handling (handshakes are done by wpa_supplicant in software instead of the
buggy 2015 firmware); roamoff=1 stops firmware-initiated roaming, a known
source of random disconnects on mesh networks.
4. Set your regulatory domain (replace FR with your country):
echo 'options cfg80211 ieee80211_regdom=FR' > /etc/modprobe.d/cfg80211.conf
iw reg set FR5. Disable WiFi power saving and scan MAC randomization (NetworkManager):
printf '[connection]\nwifi.powersave = 2\n' > /etc/NetworkManager/conf.d/wifi-powersave.conf
printf '[device]\nwifi.scan-rand-mac-address=no\n' > /etc/NetworkManager/conf.d/no-mac-rand.conf(For systems without NetworkManager: iw dev <iface> set power_save off, and
disable MAC randomization in your supplicant config.)
6. Rebuild the initramfs so early boot picks up the new firmware:
update-initramfs -u # Debian/Ubuntu
dracut -f # Fedora
mkinitcpio -P # Arch7. Reload and connect:
modprobe -r brcmfmac_wcc brcmfmac brcmutil; modprobe brcmfmac
nmcli connection modify "<your-wifi>" 802-11-wireless-security.pmf disable
nmcli connection up "<your-wifi>"Optionally prefer 5GHz (much faster, and this chip associates more reliably
on it): nmcli connection modify "<your-wifi>" 802-11-wireless.band a
- If your router/box (Freebox, Fritz!Box, Livebox, most ISP routers since ~2021) runs WPA2/WPA3 transition mode, this chip's firmware may still refuse to associate. Setting the router to WPA2-only (PMF disabled) is the most reliable configuration for this hardware.
- Avoid 802.11r (fast roaming) on mesh systems if you see periodic drops.
It still asks for my password / "Secrets were required".
That message is misleading: the association itself is failing. Check
journalctl -u wpa_supplicant -f while connecting. If you see
ASSOC-REJECT … status_code=16, the radio's transmit power is too low to
reach the router (move closer to verify) or the router is in WPA2/WPA3 mixed
mode (see router-side recommendations).
WiFi broke again after a system update.
A linux-firmware package update may have replaced the patched blob. Re-run
sudo ./scripts/install.sh (or reinstall the package) and rebuild the
initramfs.
The interface disappeared after installing ("Firmware has halted or crashed").
The NVRAM file didn't suit your board. Remove
/usr/lib/firmware/brcm/brcmfmac43602-pcie.txt, reload the driver, and open
an issue with your model identifier (sudo dmidecode -s system-product-name).
Does this enable AirDrop/AWDL, or fix Bluetooth? No. This fixes 802.11 client WiFi only.
Why is my MAC address different from macOS?
The NVRAM template uses your current interface MAC (or a random one). If you
need the original Apple MAC (e.g. for router MAC filtering), read it from a
macOS backup or your router's old client list, then reinstall with
sudo ./scripts/install.sh --mac aa:bb:cc:dd:ee:ff.
dmesg still says no clm_blob available.
That warning is expected and harmless with this fix. The proprietary
Apple CLM data has never been extracted for the BCM43602; the NVRAM
calibration recovers nearly all of the real-world performance anyway.
sudo ./scripts/uninstall.sh # script install
sudo apt remove macbook-bcm43602-fix # deb
sudo dnf remove macbook-bcm43602-fix # rpm
sudo pacman -R macbook-bcm43602-fix # archThe extras/ directory contains the rest of the hardware enablement
for these machines:
Touch Bar (extras/touchbar/) — mainline kernels only
support the T2 Touch Bar; the 2016/2017 T1 needs the out-of-tree
mbp-t1-touchbar-driver.
Our installer builds it via DKMS (survives kernel updates — upstream has no
DKMS recipe) and adds a dynamic attach script + systemd service (upstream only
documents manual echo commands with hardcoded USB ports):
cd extras/touchbar && sudo ./install.sh
⚠️ "Apple Mobile Device [Recovery Mode]" inlsusb? The T1 co-processor failed to boot its firmware and no driver can help until you do a full power-off (not a reboot — the T1 stays powered through reboots). Shut down, wait 15 seconds, power on;lsusbshould then show05ac:8600 iBridge.
Default layout is Mac-like: media keys shown, hold Fn for F1–F12
(fnmode=2 in apple-touchbar.conf), never auto-dims.
Keyboard backlight (extras/keyboard-backlight/) —
already driven by the in-kernel applespi driver (LED spi::kbd_backlight),
it just defaults to off. The udev rule turns it on at boot:
sudo cp extras/keyboard-backlight/99-kbd-backlight.rules /etc/udev/rules.d/Bind keys to adjust it with brightnessctl (works on any desktop environment):
brightnessctl --device=spi::kbd_backlight set +10% # brighter
brightnessctl --device=spi::kbd_backlight set 10%- # dimmer- WiFi (BCM43602) — this repository
- Touch Bar —
extras/touchbar/(T1 driver via DKMS + attach service) - Keyboard backlight —
extras/keyboard-backlight/ - Touch ID fingerprint reader (no known Linux driver yet — T1 chip)
- Ambient light sensor auto-brightness (apple-ib-als is installed by the Touch Bar setup; integration TBD)
- NVRAM dump: a17t/mbp13-3
- Platform tracking: Dunedan/mbp-2016-linux
- Country-code patch & module options: kernel Bugzilla #193121, Arch Linux forums
- PMF/WPA3 analysis: NixOS Discourse
Disclaimer: the NVRAM calibration data originates from Apple hardware and
is redistributed by the community for interoperability. Use at your own risk;
regulatory compliance (--country) is your responsibility.
Keywords: MacBook Pro 2016 Linux WiFi not working, BCM43602 Linux driver, brcmfmac MacBook Pro, MacBookPro13,2 Ubuntu WiFi, ASSOC-REJECT status_code=16, brcmfmac43602-pcie firmware, MacBook weak WiFi signal Linux, no 5GHz MacBook Linux, Apple Broadcom WiFi fix, Xubuntu MacBook Pro Touch Bar 2016.