This guide documents how to fix WiFi and Bluetooth connectivity issues after hibernation on T2 MacBooks (like MacBookAir9,1) running CachyOS/Arch Linux.
After resuming from hibernation (long sleep), WiFi and Bluetooth devices appear in ip link show but show NO-CARRIER state and cannot connect to networks. Running the firmware.sh script temporarily fixes the issue until the next hibernation.
IMPORTANT: This guide assumes hibernation itself is working. If you cannot successfully hibernate and resume your system, you MUST fix hibernation first before proceeding with WiFi/Bluetooth fixes.
Test hibernation:
sudo systemctl hibernateIf your system:
- Fails to hibernate: You have hibernation configuration issues. See Appendix A: Setting Up Hibernation first.
- Hibernates but won't resume: Check your bootloader configuration and resume kernel parameters.
- Hibernates and resumes successfully: Continue with this guide.
The Broadcom WiFi card in T2 MacBooks enters power save mode before hibernation. When the system resumes, the card's power state doesn't properly reinitialize, causing it to remain in a non-functional state despite the interface appearing "up."
- Install firmware properly (one-time setup)
- Configure hibernation (if not already done)
- Create a system-sleep hook that:
- Disables WiFi power save before hibernating
- Re-enables power save after resuming (for battery life)
If not already installed, run the t2linux firmware script:
cd ~/firmware # or wherever your firmware.sh is located
sudo bash firmware.sh get_from_efiThis extracts firmware from the EFI partition and installs it to /lib/firmware/brcm/.
Verification:
ls -la /lib/firmware/brcm/ | grep brcmfmac
ip link show | grep wlanSee Appendix A for full hibernation setup instructions.
Quick verification:
swapon --show # Should show a swapfile >= your RAM size
cat /proc/cmdline | grep resume # Should show resume=UUID=xxx resume_offset=yyyCreate a systemd-sleep hook that manages WiFi power state around hibernation:
sudo tee /usr/lib/systemd/system-sleep/wifi-hibernate-manager << 'EOF'
#!/bin/bash
case "$1" in
pre)
# Before sleep: Disable power save so WiFi works on resume
logger "Pre-hibernate: Disabling WiFi power save"
/sbin/iw dev wlan0 set power_save off 2>/dev/null || true
;;
post)
# After resume: Re-enable power save for battery life
# Wait a bit for WiFi to settle
sleep 3
logger "Post-resume: Re-enabling WiFi power save"
/sbin/iw dev wlan0 set power_save on 2>/dev/null || true
;;
esac
EOF
sudo chmod +x /usr/lib/systemd/system-sleep/wifi-hibernate-manager-
Check current power save state (should be ON for normal battery life):
iw dev wlan0 get power_save # Expected: "Power save: on" -
Test hibernation:
sudo systemctl hibernate
-
After resume, verify:
# WiFi should be connected and working ip link show wlan0 # Should show UP and have an IP # Power save should be re-enabled for battery life iw dev wlan0 get power_save # Should show "Power save: on" # Bluetooth should also be working bluetoothctl
The Problem:
- Broadcom WiFi cards (brcmfmac driver) don't properly reinitialize power state after hibernation
- When power save is enabled, the card enters a low-power state before hibernation
- On resume, the card can't exit this state properly, resulting in NO-CARRIER
The Solution:
- The system-sleep hook runs
pre(before) andpost(after) hibernation - Before hibernation: Disables power save → card stays in active state → survives hibernation
- After resuming: Re-enables power save → returns to normal battery-saving behavior
Battery Impact:
- Normal use: Power save ON (saves ~10-20% battery)
- Only disabled during hibernation transition (negligible impact)
-
Check if the hook is executing:
journalctl | grep "Pre-hibernate\|Post-resume"
-
Verify the hook is executable:
ls -la /usr/lib/systemd/system-sleep/wifi-hibernate-manager
-
Check if firmware is properly installed:
ls /lib/firmware/brcm/brcmfmac*.bin
The hook includes a 3-second delay to allow WiFi to settle. If your system needs more time:
sudo nano /usr/lib/systemd/system-sleep/wifi-hibernate-manager
# Change "sleep 3" to "sleep 5" or longerIf you previously created systemd services for this fix (e.g., wifi-power-save-off.service), disable them:
sudo systemctl disable wifi-power-save-off.service 2>/dev/null || true
sudo rm -f /etc/systemd/system/wifi-power-save-off.service
sudo systemctl daemon-reloadThis solution was tested and verified on:
- Hardware: MacBookAir9,1 (T2 Mac)
- OS: CachyOS (Arch Linux-based)
- Kernel: 6.19.9-1-cachyos
- WiFi Card: Broadcom BCM4364 (brcmfmac driver)
- Firmware: Extracted from macOS EFI partition using firmware.sh
If hibernation is not working on your system, follow these steps:
Check your RAM:
free -hCreate swap file (8GB for 7.6GB RAM):
sudo swapoff /swapfile # If existing swapfile exists
sudo rm /swapfile # Remove old swapfile
sudo truncate -s 0 /swapfile
sudo chattr +C /swapfile # Disable COW for swap (BTRFS only)
sudo fallocate -l 8G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfileFor BTRFS filesystems:
sudo btrfs inspect-internal map-swapfile -r /swapfile
# Note the number (e.g., 13696046)For other filesystems:
sudo filefrag -v /swapfile | awk '$1=="0:" {print substr($4, 1, length($4)-2)}'Get your swap partition UUID:
findmnt -no UUID /Edit your bootloader config (example for Limine):
sudo nano /boot/limine.confAdd to your kernel cmdline:
resume=UUID=YOUR_SWAP_PARTITION_UUID resume_offset=YOUR_OFFSET_NUMBER
Example:
cmdline: quiet rw root=UUID=xxx resume=UUID=xxx resume_offset=13696046
sudo reboot
# After reboot, verify parameters:
cat /proc/cmdline | grep resume
# Test hibernation:
sudo systemctl hibernateError: "Specified resume device is missing or is not an active swap device"
- Solution: You forgot to add
resumeandresume_offsetkernel parameters, or the offset is wrong.
Error: System hibernates but won't resume
- Solution: Check that the resume partition UUID is correct. For swap files, verify the offset calculation.
System immediately wakes after hibernating
- Solution: Check wake-on-LAN settings or USB devices. See Arch Wiki troubleshooting section.
Document Version: 1.0 Last Updated: 2026-03-22