This tutorial outlines the steps to fix the immediate kernel panic/hard freeze caused by the Broadcom BCM43224 wireless card on older MacBook hardware running modern Linux kernels (e.g., 7.0.0+).
The internal Broadcom card (BCM43224 [14e4:4353]) often triggers an immediate system freeze when loading the proprietary wl driver or the open-source b43 driver. This is typically due to modern power management or MSI (Message Signaled Interrupts) conflicts on the older MacBook PCI bus.
- An external USB Wi-Fi dongle or Ethernet adapter (to maintain internet during the fix).
- Terminal access.
First, remove the proprietary Broadcom stack which is often the primary cause of the panics.
sudo apt purge bcmwl-kernel-source dkmsModify the GRUB configuration to include kernel parameters that stabilize the hardware interaction by disabling MSI for PCI and limiting CPU idle states.
-
Open
/etc/default/grub:sudo nano /etc/default/grub
-
Find the line starting with
GRUB_CMDLINE_LINUX_DEFAULTand append the following parameters:pci=nomsi intel_idle.max_cstate=1Example:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash pci=nomsi intel_idle.max_cstate=1" -
Update GRUB:
sudo update-grub
Ensure that the faulty b43 and ssb modules are blocked, allowing the more stable brcmsmac driver to take control.
- Create a new blacklist file:
sudo nano /etc/modprobe.d/blacklist-broadcom.conf
- Add the following content:
# Blacklist drivers that cause panics on BCM43224 blacklist b43 blacklist ssb # Ensure bcma and brcmsmac are NOT blacklisted
The brcmsmac driver requires the Broadcom firmware package.
sudo apt update
sudo apt install firmware-brcm80211To apply the GRUB parameters and clean up the module state, a reboot is required.
sudo rebootAfter rebooting, check that the interface is active:
nmcli device status
# You should see wlp2s0b1 (or similar) as 'connected' or 'disconnected' (not 'unmanaged')
# Verify the driver in use
lspci -nnk -d 14e4:4353
# Look for "Kernel driver in use: brcmsmac"If the system still feels unstable, verify that your kernel command line correctly applied the parameters:
cat /proc/cmdlineCheck for pci=nomsi and intel_idle.max_cstate=1.