On Wed, Feb 04, 2015 at 03:57:00AM -0700, David Coppa wrote:
>
> Hi,
>
> Currently, when you hibernate your thinkpad using the hibernate
> button (Fn+F12), /etc/apm/hibernate does not get executed. It is
> only when you hibernate using 'ZZZ'.
>
> The diff below makes the hibernate button behave like the suspend
> one.
>
> I have chosen 0x000D as the value for APM_USER_HIBERNATE_REQ: is
> it right? If it's not please suggest a valid alternative.
>
> Cheers!
> David
Sure, this seems ok.
ok mlarkin@
-ml
>
> Index: sys/arch/amd64/include/apmvar.h
> ===================================================================
> RCS file: /cvs/src/sys/arch/amd64/include/apmvar.h,v
> retrieving revision 1.5
> diff -u -p -u -p -r1.5 apmvar.h
> --- sys/arch/amd64/include/apmvar.h 8 Jul 2012 18:02:45 -0000 1.5
> +++ sys/arch/amd64/include/apmvar.h 4 Feb 2015 10:35:22 -0000
> @@ -172,6 +172,7 @@
> #define APM_USER_SUSPEND_REQ 0x000A
> #define APM_SYS_STANDBY_RESUME 0x000B
> #define APM_CAPABILITY_CHANGE 0x000C /* apm v1.2 */
> +#define APM_USER_HIBERNATE_REQ 0x000D
> /* 0x000d - 0x00ff Reserved system events */
> /* 0x0100 - 0x01ff Reserved device events */
> /* 0x0200 - 0x02ff OEM-defined APM events */
> Index: sys/arch/i386/include/apmvar.h
> ===================================================================
> RCS file: /cvs/src/sys/arch/i386/include/apmvar.h,v
> retrieving revision 1.19
> diff -u -p -u -p -r1.19 apmvar.h
> --- sys/arch/i386/include/apmvar.h 8 Jul 2012 18:02:45 -0000 1.19
> +++ sys/arch/i386/include/apmvar.h 4 Feb 2015 10:35:22 -0000
> @@ -171,6 +171,7 @@
> #define APM_USER_SUSPEND_REQ 0x000A
> #define APM_SYS_STANDBY_RESUME 0x000B
> #define APM_CAPABILITY_CHANGE 0x000C /* apm v1.2 */
> +#define APM_USER_HIBERNATE_REQ 0x000D
> /* 0x000d - 0x00ff Reserved system events */
> /* 0x0100 - 0x01ff Reserved device events */
> /* 0x0200 - 0x02ff OEM-defined APM events */
> Index: sys/dev/acpi/acpithinkpad.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/acpi/acpithinkpad.c,v
> retrieving revision 1.42
> diff -u -p -u -p -r1.42 acpithinkpad.c
> --- sys/dev/acpi/acpithinkpad.c 13 Dec 2014 05:29:50 -0000 1.42
> +++ sys/dev/acpi/acpithinkpad.c 4 Feb 2015 10:35:22 -0000
> @@ -347,8 +347,9 @@ thinkpad_hotkey(struct aml_node *node, i
> break;
> case THINKPAD_BUTTON_HIBERNATE:
> #if defined(HIBERNATE) && !defined(SMALL_KERNEL)
> - acpi_addtask(sc->sc_acpi, acpi_sleep_task,
> - sc->sc_acpi, ACPI_STATE_S4);
> + if (acpi_record_event(sc->sc_acpi,
> APM_USER_HIBERNATE_REQ))
> + acpi_addtask(sc->sc_acpi, acpi_sleep_task,
> + sc->sc_acpi, ACPI_STATE_S4);
> #endif
> handled = 1;
> break;
> Index: usr.sbin/apmd/apmd.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/apmd/apmd.c,v
> retrieving revision 1.74
> diff -u -p -u -p -r1.74 apmd.c
> --- usr.sbin/apmd/apmd.c 16 Jan 2015 06:40:15 -0000 1.74
> +++ usr.sbin/apmd/apmd.c 4 Feb 2015 10:35:23 -0000
> @@ -348,7 +348,7 @@ int
> main(int argc, char *argv[])
> {
> const char *fname = apmdev;
> - int ctl_fd, sock_fd, ch, suspends, standbys, resumes;
> + int ctl_fd, sock_fd, ch, suspends, standbys, hibernates, resumes;
> int statonly = 0;
> int powerstatus = 0, powerbak = 0, powerchange = 0;
> int noacsleep = 0;
> @@ -487,7 +487,7 @@ main(int argc, char *argv[])
> continue;
>
> if (ev->ident == ctl_fd) {
> - suspends = standbys = resumes = 0;
> + suspends = standbys = hibernates = resumes = 0;
> syslog(LOG_DEBUG, "apmevent %04x index %d",
> (int)APM_EVENT_TYPE(ev->data),
> (int)APM_EVENT_INDEX(ev->data));
> @@ -503,6 +503,9 @@ main(int argc, char *argv[])
> case APM_STANDBY_REQ:
> standbys++;
> break;
> + case APM_USER_HIBERNATE_REQ:
> + hibernates++;
> + break;
> #if 0
> case APM_CANCEL:
> suspends = standbys = 0;
> @@ -536,6 +539,8 @@ main(int argc, char *argv[])
> suspend(ctl_fd);
> else if (standbys)
> stand_by(ctl_fd);
> + else if (hibernates)
> + hibernate(ctl_fd);
> else if (resumes) {
> do_etc_file(_PATH_APM_ETC_RESUME);
> syslog(LOG_NOTICE,