Suspend/Resume Support For SATA Link Power Management

From ThinkWiki
Jump to: navigation, search

Synopsys

One good way to save power with a dynticks-enabled kernel is to set SATA link power management to minimum power. However, if you do that you will probably experience long delays when resuming from suspend-to-disk. If, like Ubuntu Hardy, your distribution uses pm-suspend, the following script placed in /etc/pm/sleep.d/99sata will set the link power to maximum performance just before suspending, and restore it to whatever it was upon resume.

#!/bin/bash

[ -d /sys/class/scsi_host/ ] || exit 0

. /usr/lib/pm-utils/functions

suspend_sata()
{
    pushd /sys/class/scsi_host/ > /dev/null 2>&1
    local host
    for host in $(ls -1); do
        if [ -e ${host}/link_power_management_policy ]; then
            local policy=$(cat ${host}/link_power_management_policy)
            savestate ${host}_link_power_management_policy "${policy}"
            echo max_performance > ${host}/link_power_management_policy
        fi
    done
    popd
}

resume_sata()
{
    pushd /sys/class/scsi_host/ > /dev/null 2>&1
    local host
    for host in $(ls -1); do
        if [ -e ${host}/link_power_management_policy ]; then
            local policy=$(restorestate $(echo ${host}_link_power_management_policy))
            echo ${policy} > ${host}/link_power_management_policy
        fi
    done
    popd
}

case "$1" in
	suspend|hibernate)
		suspend_sata
		;;
	resume|thaw)
		resume_sata
		;;
	*)
		;;
esac

exit $?