Re: [PATCH] Re: [BUG] acpi_hw_[enable|disable]_non_wakeup_gpe_block

Alexander Malysh
2004-02-15T21:00:06Z

On Sunday 15 February 2004 21:07, you wrote:
> On Sun, Feb 15, 2004 at 04:47:19PM +0100, Alexander Malysh wrote:
> > Hi again,
> >
> > after some more testing, I have found a cause for this.
> > We disable non wakeup gpes (and store those values) with interrupts
> > disabled, but enable those with interrupts enabled which were already
> > overwritten while handling of wakeup interrupt[1]. So we must restore non
> > wakeup gpes as long interrupts are disabled. Attached patch should fix
> > it.
> >
> >
> > --- linux-2.6.2-linus/drivers/acpi/hardware/hwsleep.c~orig 2004-02-15
> > 16:31:50.928455040 +0100 +++
> > linux-2.6.2-linus/drivers/acpi/hardware/hwsleep.c 2004-02-15
> > 16:35:30.030146520 +0100 @@ -342,6 +342,12 @@
> >
> > } while (!in_value);
> >
> > + /* Enable non_wakeup_gpes as long interrupts are disabled */
> > + status = acpi_hw_enable_non_wakeup_gpes ();
> > + if (ACPI_FAILURE (status)) {
> > + return_ACPI_STATUS (status);
> > + }
> > +
> > return_ACPI_STATUS (AE_OK);
>
> First, this path is *never reached* for S3 and S4, so you break somehow S3
> and S4 in fact...

hmm, where do we jump after wakeup from S3/S4 ?

>
> Second, the path for which you remove the enable gpes is supposed to be
> run with interrupt *dissabled*. If that is not the case, then it is the
> real bug in fact.

as you can see from log (or in drivers/acpi/sleep/main.c)
acpi_leave_sleep_state called with interrupts enabled.
and you are right: acpi_leave_sleep_state _must_ be called with interrupts
disabled, so no wonder why sleep/resume fail on many laptops :(