I have a small server at home, which perfectly supports S3 (Suspend to RAM) state, but I did not get the server to wake up again under Linux 2.6 using a Wake-on-LAN (WoL) magic packet although I configured the BIOS accordingly.
The on-board Ethernet of the server is based on an AN983B chip, which supports PCI power management functions and several WoL wake-up events. This is what lspci shows:
02:01.0 Ethernet controller: ADMtek NC100 Network Everywhere Fast Ethernet 10/100 (rev 11)
The AN983B is supported by the tulip ethernet driver. This is what the tulip driver shows when loading:
Apr 20 20:36:23 gandalf eth0: ADMtek Comet rev 17 at MMIO 0xd0100000, 00:30:05:65:34:fe, IRQ 17.
However, the tulip driver does not support the WoL functions of the AN983B. The following patch adds support for link state change and magic packet WoL events to the tulip driver for this particular Ethernet chip.
The patch has only received minimal testing and is basically in “works for me” state (i.e. it works for my uses cases on my hardware). Since my setup runs Ubuntu 8.04.3 LTS, the patch is for kernel 2.6.24.
When configuring the patched Kernel, you need to enable power management (CONFIG_PM) and the tulip driver, of course.
The patchs enable WoL only when suspending the system and not when shutting down the interface, which causes some problems with existing standby/resume scripts (see below for how to solve that on Ubuntu 8.04).
I currently have no time to maintain the patch nor to support it. I hope that this patch may still be useful for someone.
Update (June 2012): I just realized that support for WoL based on this patch became part of mainline two years ago! Great, but someone could have told me. So, no need to use this patch starting with 2.6.36.
Download link for Ubuntu 10.04: tulip_an983b_wol_lucid-2.6.32-22.patch
Download link for Ubuntu 8.04: tulip_an983b_wol_2.6.24.patch.gz
Using the patch
- Patch, compile, and install the kernel or module (see here for how to do this).
- Verify that the module recognizes the Ethernet adapter.
Use
dmesgto verify that the patched tulip module loaded and initialized the Ethernet adapter correctly. Look for the message which says that WOL support has been enabled:[ 40.298344] tulip_init_one: Enabled WOL support for AN983B
[ 40.299020] tulip0: MII transceiver #1 config 3100 status 786d advertising 05e1.
[ 40.306047] eth0: ADMtek Comet rev 17 at Port 0×3000, 00:30:05:65:34:fe, IRQ 19. - Enable the events that may wakeup the computer.
Wakeup events from the PCI bus must be allowed to wake up the computer. I had to enable the
PCI0device on my setup (use “echo PCI0 > /proc/acpi/wakeup” to toggle between “enabled” and “disabled”). Here is the contents of/proc/acpi/wakeupon my server after enabling the wake up events:Device S-state Status Sysfs node
PCI0 S4 enabled no-bus:pci0000:00
AGPB S4 enabled
PCIH S4 enabled pci:0000:00:1e.0
USB1 S4 disabled pci:0000:00:1d.0
USB2 S4 disabled pci:0000:00:1d.1
USB3 S4 disabled pci:0000:00:1d.2
USB4 S4 disabled pci:0000:00:1d.7
AC97 S4 disabled pci:0000:00:1f.5
MC97 S4 disabled
KEYB S1 disabled pnp:00:07
PS2M S1 disabled
COM1 S1 disabled pnp:00:0a
COM2 S1 disabledEnabling
PCI0also enablesAGPBandPCIHin my setup. - Enable wakeup for the PCI device.
Note: This seems to be necessary for Ubuntu 10.04 only. I did not do this under Ubuntu 8.04.
Wakeup must be enabled for the respective PCI device. In my case, this is device 02:01.0 (see
lspcioutput above):> echo enabled > /sys/bus/pci/devices/0000\:02\:01.0/power/wakeup
> echo enabled > /sys/bus/pci/devices/0000\:00\:1e.0/power/wakeupThe second line is for the PCI bridge the Ethernet card is attached to. I don’t think this is really necessary, though. The kernel seems to enable wakeup for the PCI bridge automatically when suspending.
- Enable the wakeup event on the Ethernet adapter.
WoL is disabled by default. Thus
ethtoolshould show the following:> ethtool eth0
Settings for eth0:
Supports Wake-on: pg
Wake-on: dEnable wake on magic packet:
> ethtool -s eth0 wol g
> ethtool eth0
Settings for eth0:
Supports Wake-on: pg
Wake-on: g - Prevent unloading of network modules when going into standby.
Note: This does not seem to be necessary for Ubuntu 10.04 anymore.
I use
pm-utilsfor hibernating to ram. Unfortunately, it unloads the network driver modules before suspending, i.e. the suspend/resume functions in the network driver are never called. In my setup, I don’t need to unload any modules when hibernating. Therefore, I commented the calls to both the shell functionssuspend_modulesandunload_networkin/usr/lib/pm-utils/sleep.d/50modules:case “$1″ in
hibernate|suspend)
# suspend_modules
# unload_networkNote that
/usr/lib/pm-utils/sleep.d/10NetworkManagermight do similar things for Ethernet adapters that are controlled by Network Manager. - Suspend the system.
Use
/usr/sbin/pm-suspendto suspend the computer. The link on your Ethernet adapter should stay up. Send a magic packet from another computer to the MAC address of the Ethernet adapter (fingers crossed) …