Skip to content

Instantly share code, notes, and snippets.

@gornostal
Last active November 28, 2025 04:45
Show Gist options
  • Select an option

  • Save gornostal/192e2ae29af3da1baeea384d0f19252d to your computer and use it in GitHub Desktop.

Select an option

Save gornostal/192e2ae29af3da1baeea384d0f19252d to your computer and use it in GitHub Desktop.
Intel BE200 Wi-Fi Resume Fix on Ubuntu 25.10

Intel BE200 Wi-Fi Resume Fix on Ubuntu 25.10

This guide documents the suspend/resume Wi-Fi failure observed on a Lenovo IdeaPad running Ubuntu 25.10 desktop and walks through the exact remediation steps that were validated on October 27, 2025. Use it after a fresh OS install or kernel update if the problem reappears.

1. Problem Overview

  • Hardware: Lenovo IdeaPad Pro 5-14IAH10 with Intel BE200 (Wi-Fi 7) controller at PCI address 0000:01:00.0 (device id 8086:272b).
  • Kernel Symptom: After resuming from suspend (s2idle), the wireless adapter stays in PCI power state D3cold and never returns, leaving wlp1s0f0 unavailable. Logs show:
    • Unable to change power state from D3cold to D0, device inaccessible
    • timeout waiting for FW reset ACK followed by repeated firmware crashes.
  • User Experience: NetworkManager lists the device as unavailable; Wi-Fi toggle remains disabled until reboot.
  • Root Cause: Intel iwlwifi firmware/driver combo for BE200 mishandles D3cold entry, especially on s2idle platforms. Preventing the device from entering D3cold avoids the failure.

2. Quick Verification Checklist

  1. nmcli device status shows wlp1s0f0 as unavailable after resume.
  2. journalctl -b | grep -i iwlwifi contains D3cold errors.
  3. /sys/bus/pci/devices/0000:01:00.0/d3cold_allowed reads 1.

If all three conditions match, proceed with the fix below.

3. Permanent Fix Steps

3.1 Disable D3cold at Boot

Create a oneshot systemd service that forces the Wi-Fi device out of D3cold during boot:

cat <<'EOF' > /etc/systemd/system/disable-wifi-d3cold.service
[Unit]
Description=Disable D3cold for Intel BE200 Wi-Fi
After=systemd-udevd.service

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo 0 > /sys/bus/pci/devices/0000:01:00.0/d3cold_allowed'

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now disable-wifi-d3cold.service

3.2 Reapply After Resume

Install a system sleep hook that re-disables D3cold immediately after every suspend cycle:

cat <<'EOF' > /usr/lib/systemd/system-sleep/disable-wifi-d3cold.sh
#!/bin/sh
sysfs_path=/sys/bus/pci/devices/0000:01:00.0/d3cold_allowed
if [ "$1" = "post" ] && [ -w "$sysfs_path" ]; then
  echo 0 > "$sysfs_path"
fi
exit 0
EOF

chmod 755 /usr/lib/systemd/system-sleep/disable-wifi-d3cold.sh

3.3 Add Udev Safety Net (Optional but Recommended)

Ensure hotplug events keep the flag cleared (covers PCI rescans):

cat <<'EOF' > /etc/udev/rules.d/80-disable-wifi-d3cold.rules
# Disable D3cold for Intel BE200 Wi-Fi to prevent resume issues
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x8086", ATTR{device}=="0x272b", ATTR{d3cold_allowed}="0"
EOF

udevadm control --reload
udevadm trigger -v -p add /sys/bus/pci/devices/0000:01:00.0

4. Validate the Fix

  1. Confirm the sysfs flag sticks:
    cat /sys/bus/pci/devices/0000:01:00.0/d3cold_allowed
    Expected output: 0.
  2. Run a suspend/resume cycle (10-second rtcwake shown):
    rtcwake -m mem -s 10
  3. After wake, check that Wi-Fi remains connected:
    nmcli device status
    Device wlp1s0f0 should stay connected.
  4. Inspect recent logs for regressions:
    journalctl -b --since "$(date --iso-8601=minutes -d '-5 minutes')" | grep -i iwlwifi
    There should be no new D3cold errors.

5. Troubleshooting Notes

  • If /usr/lib/systemd/system-sleep does not exist, create it before writing the hook (mkdir -p /usr/lib/systemd/system-sleep).
  • Reboot once after installing the service to verify everything happens automatically during boot.
  • If the Wi-Fi device disappears from lspci after manual tinkering, run reboot instead of attempting PCI rescans.
  • Adjust the PCI address in the scripts if hardware changes; confirm with lspci -nn.

6. Rollback Instructions

To undo the workaround:

systemctl disable --now disable-wifi-d3cold.service
rm -f /etc/systemd/system/disable-wifi-d3cold.service
rm -f /usr/lib/systemd/system-sleep/disable-wifi-d3cold.sh
rm -f /etc/udev/rules.d/80-disable-wifi-d3cold.rules
systemctl daemon-reload
udevadm control --reload

Reboot afterwards to restore default power-management behavior (which will likely reintroduce the resume failure).

7. References

  • Intel community reports on BE200 D3cold resume failures under Linux kernels 6.6–6.18 as of October 2025.
  • Ubuntu 25.10 testing performed on October 27, 2025.

Keep this document with your backup scripts so you can reapply the fix quickly after OS reinstalls or kernel upgrades.

@gornostal
Copy link
Author

gornostal commented Nov 28, 2025 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment