tech-kern archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: apm(4) fixes
In article <20100226105946.GA3707%asim.lip6.fr@localhost>,
Manuel Bouyer <bouyer%antioche.eu.org@localhost> wrote:
>-=-=-=-=-=-
>
>Hi,
>after updating my old laptop to netbsd-5, I did need to have a working
>APM again. I came up with the following patch, which makes standby,
>suspend to ram and suspend to disk work again for me.
>
>There are 2 problems:
>- apm_suspend() and apm_standby() will call splhhigh() before entering
> standby or suspend. After resume, the system go back tsleep()ing
> in the apm thread without restoring the ipl (this is done in
> apm_resume()), and calling tlseep() at IPL_HIGH cause a DIAGOSCTIC
> panic (and other bad things, I guess).
> My fix is to call apm_resume() from within apm_suspend() or
> apm_standby(), after aa_set_powstate() has returned.
> Another option would be to set another global variable apm_in_sleep
> and not call tsleep in the apm thread when this variable is not 0.
> Not sure which one is better.
>
>- In apm_event_handle(), we test (apm_standbys || apm_suspends) to set
> apm_damn_fool_bios to 1 and break the while() loop in apm_periodic_check().
> But we set apm_standbys or apm_suspends to non-0 only if apm_op_inprog
> is 0 and we failed to record the apm event. With apmd listening
> we usually succeed recording the event, so apm_standbys/apm_suspends remains
> 0 and we never go out of the while() loop.
> My fix is to check apm_op_inprog instead of (apm_standbys || apm_suspends)
> to break the loop. This one is always set when an event is being
> handled.
>
>Comments ?
>
>PS: on this laptop the pfm handler are harmfull and I had to disable them:
>on reboot, the laptop gets stuck in BIOS, and on wakeup after a
>suspend/standby, the kernel is completely dead. But that's a different
>problem.
>
Looks good to me.
christos
Home |
Main Index |
Thread Index |
Old Index