Acer Predator G5910: Wake-on-LAN from power-off under Linux
Short version: disable Deep Power Off Mode in the BIOS, then install the s5direct kernel module. On this board, Linux has to skip the BIOS's broken power-off routine (see Linux won't power off), and that routine is also where the chipset gets set up to let the LAN wake the PC. The module powers off the same way but sets the chipset's WOL_EN_OVRD bit first. A magic packet then wakes the PC in about 45 seconds.
Symptoms
- After a Linux power-off, a magic packet does nothing.
- The network port LEDs go dark when the PC is off.
ethtoolshowsWake-on: g,/sys/class/net/<nic>/device/power/wakeupisenabled, andGBEis enabled in/proc/acpi/wakeup, so Linux looks correctly configured.
Two separate causes
1. BIOS: Deep Power Off Mode
In the BIOS Power tab, Deep Power Off Mode (Intel "Deep S5") cuts standby power to almost everything when the PC is off, the LAN PHY included. Set it to Disabled, and check that Power On by Onboard LAN and Power On by PCIE Devices are Enabled. The PC then uses 1–2 W more while it's off.
That alone did not fix it.
2. The BIOS power-off routine that Linux has to skip
Plain Linux power-off doesn't work on this board. The ACPI _PTS method sets SLP_SMI_EN, so the final "enter S5" write traps into a BIOS SMI handler, and under Linux that handler never finishes. Both workarounds, GRUB's halt and a raw S5 write from a shutdown hook, power off without that handler. But that handler also prepares the chipset for wake-on-LAN, so with any workaround that setup never happens. Two things go missing:
- The NIC isn't armed. A systemd-shutdown hook runs before the kernel's driver shutdown, and that driver shutdown is where
e1000eprograms the 82579 PHY to watch for magic packets. - The chipset doesn't let the LAN wake the board from S5. In the Intel 6-series PCH this is
WOL_EN_OVRD, bit 13 ofGEN_PMCON_3(LPC bridge, PCI00:1f.0, offset0xA4). On this board it read0(GEN_PMCON_3 = 0x1948), and setting it was the missing step.
The registers (Intel 6 Series / C200 datasheet, 324645)
| GEN_PMCON_3 bit 8 SLP_LAN_DEFAULT | Value of SLP_LAN# in Sx when nothing else sets it. 1 = LAN PHY stays powered. Already 1 here. |
|---|---|
| GEN_PMCON_3 bit 13 WOL_EN_OVRD | 1 = the integrated LAN may wake the system from S5, whatever PME_B0_EN says. This was the missing bit. |
| GEN_PMCON_3 bit 15 PME_B0_S5_DIS | 1 blocks PME_B0 wake from S5. Keep it at 0. |
| GPIO29 (SLP_LAN#) | If the BIOS set it as an output, its level decides SLP_LAN# in Sx (Table 5-37). Here it was an output at level 1. |
| Bits 1, 9, 14 | Write-1-to-clear status bits (PWR_FLR, GEN_RST_STS, SUS_PWR_FLR). Mask them out on a read-modify-write. |
The fix (works)
Install the s5direct kernel module. It hooks into the kernel's own power-off sequence and runs at two points:
- Prepare (after ACPI's prepare step, before drivers shut down): re-enables the ACPI wake GPEs, then sets
SLP_LAN_DEFAULTandWOL_EN_OVRDand clearsPME_B0_S5_DIS. - Power-off (after drivers shut down, so
e1000ehas armed the PHY): clearsSLP_SMI_EN(port0x430, bit 4) and writesSLP_TYP | SLP_EN=0x3C00to PM1a_CNT (port0x404), like GRUB.
git clone https://github.com/jy-roda/acer-predator-g5910-linux-poweroff-wol.git
cd acer-predator-g5910-linux-poweroff-wol
sudo sh install.sh
The script builds the module with DKMS, so it's rebuilt on kernel updates, and loads it at boot. It adds a udev rule that sets wol g on the wired NIC, and installs the raw-write shell hook as a fallback for when the module isn't loaded (power-off still works then, without wake-on-LAN).
Test it: sudo poweroff. The port LEDs should stay lit. Then, from another machine on the LAN:
wakeonlan f8:0f:41:11:c9:d3 # Linux, package "wakeonlan"; use your NIC's MAC
# or Windows PowerShell:
$m=[byte[]]('f8:0f:41:11:c9:d3' -split ':' | % {[Convert]::ToByte($_,16)})
$p=[byte[]](,0xFF*6)+($m*16); $u=New-Object Net.Sockets.UdpClient; $u.EnableBroadcast=$true
[void]$u.Send($p,$p.Length,'255.255.255.255',9)
It woke in 43–56 seconds in three tests (most of that is POST and boot, until it answered ping).
What did not help
- Only disabling Deep Power Off Mode, with the shell-hook power-off.
- The first version of the module, which ran after driver shutdown but didn't clear
SLP_SMI_EN: the board stayed on, which led to the root cause. - The second version, which powered off properly but didn't touch
GEN_PMCON_3: the LEDs were dark and it didn't wake.
Other boards
The same pattern (an ACPI _PTS that sets an SMI-on-sleep bit, and a BIOS SMI handler that owns wake-on-LAN setup) is common on AMI boards of that era. The register bits above are for Intel 6-series PCHs and are probably similar on 5/7-series, but check your datasheet first. The README explains how to read your own port addresses from the ACPI tables.