Add support for /etc/rc.suspend and /etc/rc.resume for ACPI. They are

called directly from acpiconf(8).  Change both scripts to take a
subsystem (apm|acpi) and sleep level (suspend,standby|1-5) argument.
This commit is contained in:
njl 2003-12-30 17:28:06 +00:00
parent edf9c2d50f
commit 2ed04cfc61
5 changed files with 62 additions and 11 deletions

View File

@ -4,7 +4,7 @@
# #
apm_event SUSPENDREQ { apm_event SUSPENDREQ {
exec "/etc/rc.suspend"; exec "/etc/rc.suspend apm suspend";
} }
apm_event USERSUSPENDREQ { apm_event USERSUSPENDREQ {
@ -14,7 +14,7 @@ apm_event USERSUSPENDREQ {
} }
apm_event NORMRESUME, STANDBYRESUME { apm_event NORMRESUME, STANDBYRESUME {
exec "/etc/rc.resume"; exec "/etc/rc.resume apm resume";
} }
# resume event configuration for serial mouse users by # resume event configuration for serial mouse users by

View File

@ -29,10 +29,18 @@
# sample run command file for APM Resume Event # sample run command file for APM Resume Event
if [ $# -ne 2 ]; then
echo "Usage: $0 [apm|acpi] [resume|1-5]"
exit 1
fi
subsystem=$1
state=$2
if [ -r /var/run/rc.suspend.pid ]; then if [ -r /var/run/rc.suspend.pid ]; then
kill -9 `cat /var/run/rc.suspend.pid` kill -9 `cat /var/run/rc.suspend.pid`
rm -f /var/run/rc.suspend.pid rm -f /var/run/rc.suspend.pid
echo 'rc.suspend is killed' echo 'rc.resume: killed rc.suspend that was still around'
fi fi
# Turns on a power supply of a card in the slot inactivated. # Turns on a power supply of a card in the slot inactivated.
@ -40,7 +48,11 @@ fi
# pccardq | awk -F '~' '$5 == "inactive" \ # pccardq | awk -F '~' '$5 == "inactive" \
# { printf("pccardc power %d 1", $1); }' | sh # { printf("pccardc power %d 1", $1); }' | sh
logger -t apmd resumed at `date +'%Y%m%d %H:%M:%S'` # UHCI has trouble resuming so we just load/unload it. You
# should add any other kernel modules you want reloaded here.
# kldload usb
logger -t $subsystem resumed at `date +'%Y%m%d %H:%M:%S'`
sync && sync && sync sync && sync && sync
exit 0 exit 0

View File

@ -29,6 +29,14 @@
# sample run command file for APM Suspend Event # sample run command file for APM Suspend Event
if [ $# -ne 2 ]; then
echo "Usage: $0 [apm|acpi] [standby,suspend|1-5]"
exit 1
fi
subsystem=$1
state=$2
if [ -r /var/run/rc.suspend.pid ]; then if [ -r /var/run/rc.suspend.pid ]; then
exit 1 exit 1
fi fi
@ -40,11 +48,15 @@ echo $$ > /var/run/rc.suspend.pid
# pccardq | awk -F '~' '$5 == "filled" && $4 ~ /sio/ \ # pccardq | awk -F '~' '$5 == "filled" && $4 ~ /sio/ \
# { printf("pccardc power %d 0", $1); }' | sh # { printf("pccardc power %d 0", $1); }' | sh
logger -t apmd suspend at `date +'%Y%m%d %H:%M:%S'` # UHCI has trouble resuming so we just load/unload it. You
# should add any other kernel modules you want unloaded here.
# kldunload usb
logger -t $subsystem suspend at `date +'%Y%m%d %H:%M:%S'`
sync && sync && sync sync && sync && sync
sleep 3 [ $subsystem = "apm" ] && sleep 3
rm -f /var/run/rc.suspend.pid rm -f /var/run/rc.suspend.pid
zzz [ $subsystem = "apm" ] && zzz
exit 0 exit 0

View File

@ -58,7 +58,8 @@ Enters the specified sleep mode.
Recognized types are Recognized types are
.Cm 1 .Cm 1
(only the CPU clock is stopped), (only the CPU clock is stopped),
.Cm 2 , .Cm 2
(not implemented on most systems but similar to S1),
.Cm 3 .Cm 3
(the CPU context is lost and memory context is preserved), (the CPU context is lost and memory context is preserved),
.Cm 4 .Cm 4
@ -69,6 +70,12 @@ and
Sleep states may also be given as S1, S2, etc. Sleep states may also be given as S1, S2, etc.
The supported states depend on BIOS implementation, including ACPI The supported states depend on BIOS implementation, including ACPI
byte code (AML). byte code (AML).
If the
.Pa /etc/rc.suspend
and
.Pa /etc/rc.resume
scripts are executable, they will be run before and after entering
the given sleep state.
.El .El
.Sh SEE ALSO .Sh SEE ALSO
.Xr acpi 4 , .Xr acpi 4 ,

View File

@ -37,10 +37,11 @@
#include <unistd.h> #include <unistd.h>
#include <dev/acpica/acpiio.h> #include <dev/acpica/acpiio.h>
#include <contrib/dev/acpica/acpi.h> #include <contrib/dev/acpica/acpi.h>
#define ACPIDEV "/dev/acpi" #define ACPIDEV "/dev/acpi"
#define RC_SUSPEND_PATH "/etc/rc.suspend"
#define RC_RESUME_PATH "/etc/rc.resume"
static int acpifd; static int acpifd;
@ -68,7 +69,26 @@ acpi_enable_disable(int enable)
static int static int
acpi_sleep(int sleep_type) acpi_sleep(int sleep_type)
{ {
if (ioctl(acpifd, ACPIIO_SETSLPSTATE, &sleep_type) == -1) char cmd[64];
int ret;
/* Run the suspend rc script, if available. */
if (access(RC_SUSPEND_PATH, X_OK) == 0) {
snprintf(cmd, sizeof(cmd), "%s acpi %d", RC_SUSPEND_PATH,
sleep_type);
system(cmd);
}
ret = ioctl(acpifd, ACPIIO_SETSLPSTATE, &sleep_type);
/* Run the resume rc script, if available. */
if (access(RC_RESUME_PATH, X_OK) == 0) {
snprintf(cmd, sizeof(cmd), "%s acpi %d", RC_RESUME_PATH,
sleep_type);
system(cmd);
}
if (ret != 0)
err(EX_IOERR, "sleep type (%d) failed", sleep_type); err(EX_IOERR, "sleep type (%d) failed", sleep_type);
return (0); return (0);