Lars Engels wrote:[color=blue]
> On Sun, Jun 17, 2007 at 10:13:34AM -0700, Nate Lawson wrote:[color=green]
>> This patch updates the user API for acpi suspend in a number of ways.
>>
>> * /etc/rc.suspend,rc.resume are always run, no matter the source of the
>> suspend event
>> * suspend now requires positive user acknowledgement. If a user program
>> wants to cancel the suspend, they can. If one of the user programs
>> hangs or doesn't respond within 10 seconds, the system suspends anyway.
>> * /dev/apm is clonable, allowing multiple listeners for suspend events.
>> In the future, xorg-server can use this to be informed about suspend
>> even if there are other listeners (i.e. apmd).
>>
>> The API changes are intended to be MFCd and hence are minimal.
>>
>> * Two new ACPI ioctls: REQSLPSTATE and ACKSLPSTATE. Request begins the
>> process of suspending by notifying all listeners. acpi is monitored by
>> devd(8) and /dev/apm listener(s) are also counted. Users register their
>> approval or disapproval via Ack. If anyone disapproves, suspend is vetoed.
>>
>> * Binary compat is preserved in that old user programs or kernel modules
>> (yeah, right) that called the API can still do so. A message is printed
>> once that this interface is deprecated.
>>
>> * acpiconf gains the -k flag to ack the suspend request. This flag is
>> undocumented on purpose since it's only used by /etc/rc.suspend. It is
>> not intended to be a permanent change and will be removed once a better
>> power API is implemented.
>>
>> These patches have been successfully tested for about a week through
>> suspend/resumes and various usermode programs, including patches to
>> xorg-server.
>>
>> The eventual goal is to improve subr_power to be a more generic central
>> power management interface to user and kernel providers. powerd(8)
>> might start managing profiles similar to apmd(8). I don't know yet and
>> there isn't time to do that. This patch provides a reasonable interface
>> for now and eliminates some serious weaknesses, especially in that
>> pressing a sleep button did not guarantee rc.suspend would run before
>> sleeping.
>>
>> Comments welcome, patches are for 6.x and 7.x.
>>
>> --
>> Nate[/color]
>
> Nate,
>
> thanks for your patch.
> But after applying it on a recent -Current I get a lot of kernel messages
> like these:
> Jun 21 17:48:27 maggie kernel: apm34 opened clone 0xc457fd00
> Jun 21 17:48:27 maggie kernel: apm34 closed clone 0xc457fd00
> Jun 21 17:48:32 maggie kernel: apm35 opened clone 0xc457ee40
> Jun 21 17:48:32 maggie kernel: apm35 closed clone 0xc457ee40
> Jun 21 17:48:37 maggie kernel: apm36 opened clone 0xc457ec40
> Jun 21 17:48:37 maggie kernel: apm36 closed clone 0xc457ec40
> Jun 21 17:48:42 maggie kernel: apm37 opened clone 0xc457fc40
> Jun 21 17:48:42 maggie kernel: apm37 closed clone 0xc457fc40
> Jun 21 17:48:47 maggie kernel: apm38 opened clone 0xc433b6c0
> Jun 21 17:48:47 maggie kernel: apm38 closed clone 0xc433b6c0
> Jun 21 17:48:52 maggie kernel: apm39 opened clone 0xc433b240[/color]

Thanks for testing! Those were there to assist in debugging if people
had any problems.
[color=blue]
> Additionally, pressing the power button only generates this:
> Jun 21 17:50:03 maggie kernel: acpi: request to enter state S5 failed
>
> I need to run 'shutdown -p ' to power the system down.[/color]

This was already fixed in the updated patch that I plan to commit today.
It's attached or you can just wait for the commit to get it.

-# UHCI has trouble resuming so we just load/unload it. You
-# should add any other kernel modules you want reloaded here.
-# kldload usb
+# If a device driver has problems resuming, try unloading it before
+# suspend and reloading it on resume. Example:
+# kldunload usb
+
+# wpa_supplicant(8) doesn't seem to reassociate during resume. Uncomment
+# the following to signal it to reassociate.
+# /usr/sbin/wpa_cli reassociate

-# UHCI has trouble resuming so we just load/unload it. You
-# should add any other kernel modules you want unloaded here.
+# If a device driver has problems suspending, try unloading it before
+# suspend and reloading it on resume. Example:
# kldunload usb