All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Rafael J. Wysocki" <rjw@rjwysocki.net>
To: Chris Chiu <chiu@endlessm.com>
Cc: "Rafael J. Wysocki" <rafael@kernel.org>,
	Seth Forshee <seth.forshee@canonical.com>,
	Len Brown <lenb@kernel.org>,
	ACPI Devel Maling List <linux-acpi@vger.kernel.org>,
	Linux Kernel <linux-kernel@vger.kernel.org>,
	Linux Upstreaming Team <linux@endlessm.com>
Subject: Re: System fails to exit s2idle by a keystroke on my laptop
Date: Thu, 07 May 2020 20:05:11 +0200	[thread overview]
Message-ID: <5029155.caIQduTdCh@kreacher> (raw)
In-Reply-To: <CAB4CAweZcN0SPe-a7jbthV=-ip9cCzJOM=NfP9YvtXw97ugKgQ@mail.gmail.com>

On Thursday, May 7, 2020 5:38:11 AM CEST Chris Chiu wrote:
> On Wed, May 6, 2020 at 6:19 PM Rafael J. Wysocki <rafael@kernel.org> wrote:
> >
> > On Wed, May 6, 2020 at 11:32 AM Rafael J. Wysocki <rafael@kernel.org> wrote:
> > >
> > >
> > > Thanks for the report, the issue evidently is EC-related.
> > >
> > > > @@ -1024,7 +1024,7 @@ static bool acpi_s2idle_wake(void)
> > > >                  * regarded as a spurious one.
> > > >                  */
> > > >                 if (!acpi_ec_dispatch_gpe())
> > > > -                       return false;
> > > > +                       return true;
> > >
> > > Have you tried commenting out simply removing the if () check and the
> > > following return statement?
> >
> > Scratch that.
> >
> > Instead, please try doing
> >
> > acpi_ec_dispatch_gpe()
> >
> > instead of the if () and the following return statement.
> 
> Yes. I verified with the modification you suggested on my laptop. It's
> working OK.
> I can wake from a keystroke w/o problem.
> 
> @ -1024,8 +1024,7 @@ static bool acpi_s2idle_wake(void)
>                  * If the EC GPE status bit has not been set, the wakeup is
>                  * regarded as a spurious one.
>                  */
> -               if (!acpi_ec_dispatch_gpe())
> -                       return false;
> +               acpi_ec_dispatch_gpe();
> 
>                 /*
>                  * Cancel the wakeup and process all pending events in case
> 

OK, great, thanks for the confirmation!

Does the appended patch work for you then?

It should be functionally equivalent to the above change if I didn't mess it up.


---
 drivers/acpi/ec.c       |   23 ++++++++++++++---------
 drivers/acpi/internal.h |    1 -
 drivers/acpi/sleep.c    |   14 ++------------
 3 files changed, 16 insertions(+), 22 deletions(-)

Index: linux-pm/drivers/acpi/sleep.c
===================================================================
--- linux-pm.orig/drivers/acpi/sleep.c
+++ linux-pm/drivers/acpi/sleep.c
@@ -1013,21 +1013,11 @@ static bool acpi_s2idle_wake(void)
 		if (acpi_check_wakeup_handlers())
 			return true;
 
-		/*
-		 * If the status bit is set for any enabled GPE other than the
-		 * EC one, the wakeup is regarded as a genuine one.
-		 */
-		if (acpi_ec_other_gpes_active())
+		/* Check non-EC GPE wakeups and dispatch the EC GPE. */
+		if (acpi_ec_dispatch_gpe())
 			return true;
 
 		/*
-		 * If the EC GPE status bit has not been set, the wakeup is
-		 * regarded as a spurious one.
-		 */
-		if (!acpi_ec_dispatch_gpe())
-			return false;
-
-		/*
 		 * Cancel the wakeup and process all pending events in case
 		 * there are any wakeup ones in there.
 		 *
Index: linux-pm/drivers/acpi/ec.c
===================================================================
--- linux-pm.orig/drivers/acpi/ec.c
+++ linux-pm/drivers/acpi/ec.c
@@ -1994,23 +1994,28 @@ void acpi_ec_set_gpe_wake_mask(u8 action
 		acpi_set_gpe_wake_mask(NULL, first_ec->gpe, action);
 }
 
-bool acpi_ec_other_gpes_active(void)
-{
-	return acpi_any_gpe_status_set(first_ec ? first_ec->gpe : U32_MAX);
-}
-
 bool acpi_ec_dispatch_gpe(void)
 {
 	u32 ret;
 
 	if (!first_ec)
-		return false;
+		return acpi_any_gpe_status_set(U32_MAX);
 
+	/*
+	 * Report wakeup if the status bit is set for any enabled GPE other
+	 * than the EC one.
+	 */
+	if (acpi_any_gpe_status_set(first_ec->gpe))
+		return true;
+
+	/*
+	 * Dispatch the EC GPE in-band, but do not report wakeup in any case
+	 * to allow the caller to process events properly after that.
+	 */
 	ret = acpi_dispatch_gpe(NULL, first_ec->gpe);
-	if (ret == ACPI_INTERRUPT_HANDLED) {
+	if (ret == ACPI_INTERRUPT_HANDLED)
 		pm_pr_dbg("EC GPE dispatched\n");
-		return true;
-	}
+
 	return false;
 }
 #endif /* CONFIG_PM_SLEEP */
Index: linux-pm/drivers/acpi/internal.h
===================================================================
--- linux-pm.orig/drivers/acpi/internal.h
+++ linux-pm/drivers/acpi/internal.h
@@ -202,7 +202,6 @@ void acpi_ec_remove_query_handler(struct
 
 #ifdef CONFIG_PM_SLEEP
 void acpi_ec_flush_work(void);
-bool acpi_ec_other_gpes_active(void);
 bool acpi_ec_dispatch_gpe(void);
 #endif
 




  reply	other threads:[~2020-05-07 18:05 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-04 17:09 System fails to exit s2idle by a keystroke on my laptop Chris Chiu
2020-05-06  9:32 ` Rafael J. Wysocki
2020-05-06 10:19   ` Rafael J. Wysocki
2020-05-07  3:38     ` Chris Chiu
2020-05-07 18:05       ` Rafael J. Wysocki [this message]
2020-05-08  8:22         ` Chris Chiu
2020-05-08 16:50           ` Rafael J. Wysocki
2020-05-11  6:54             ` Chris Chiu
2020-05-11  8:10               ` Rafael J. Wysocki

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5029155.caIQduTdCh@kreacher \
    --to=rjw@rjwysocki.net \
    --cc=chiu@endlessm.com \
    --cc=lenb@kernel.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@endlessm.com \
    --cc=rafael@kernel.org \
    --cc=seth.forshee@canonical.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.