linux-input.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Henrik Rydberg" <rydberg@euromail.se>
To: Alan Stern <stern@rowland.harvard.edu>
Cc: Matthew Garrett <mjg59@srcf.ucam.org>,
	Oliver Neukum <oliver@neukum.org>,
	linux-input@vger.kernel.org, dtor@mail.ru
Subject: Re: [PATCH V3] input: Fix USB autosuspend on bcm5974
Date: Thu, 13 Oct 2011 19:21:36 +0200	[thread overview]
Message-ID: <20111013172136.GA2234@polaris.bitmath.org> (raw)
In-Reply-To: <Pine.LNX.4.44L0.1110131134270.2026-100000@iolanthe.rowland.org>

> > I tried the patch out, unfortunately it did not work. The second
> > suspend request returns with a -EINPROGRESS, here:
> > 
> > 	if (dev->power.runtime_status == RPM_SUSPENDING) {
> > 		DEFINE_WAIT(wait);
> > 
> > 		if (rpmflags & (RPM_ASYNC | RPM_NOWAIT)) {
> > 			retval = -EINPROGRESS;
> > 			goto out;
> > 		}
> > 
> > 		/* Wait for the other suspend running in parallel with us. */
> > 		for (;;) {
> > 
> > The reason is above my horizon, although RPM_ASYNC looks suspicious.
> > In general, we are re-entering rpm_suspend from within the driver
> > handler, so the exit condition of rpm_suspend may not have been
> > satisfied yet.
> 
> Ah yes, I vaguely remember thinking that another part would have to be
> fixed.  But it's not just the part you identified; the error actually
> occurred higher up.  The patch below ought to help.

Yes, this works nicely, thank you. I attached my tested-by at the end,
presuming there will be a formal patch. :-)

>  drivers/base/power/runtime.c |   18 ++++++++++++------
>  1 file changed, 12 insertions(+), 6 deletions(-)
> 
> Index: usb-3.1/drivers/base/power/runtime.c
> ===================================================================
> --- usb-3.1.orig/drivers/base/power/runtime.c
> +++ usb-3.1/drivers/base/power/runtime.c
> @@ -278,8 +278,9 @@ static int rpm_callback(int (*cb)(struct
>   * @rpmflags: Flag bits.
>   *
>   * Check if the device's runtime PM status allows it to be suspended.  If
> - * another suspend has been started earlier, either return immediately or wait
> - * for it to finish, depending on the RPM_NOWAIT and RPM_ASYNC flags.  Cancel a
> + * another suspend has been started earlier and the RPM_ASYNC flag isn't set,
> + * either return immediately or wait for it to finish, depending on the
> + * RPM_NOWAIT flag.  Cancel a
>   * pending idle notification.  If the RPM_ASYNC flag is set then queue a
>   * suspend request; otherwise run the ->runtime_suspend() callback directly.
>   * If a deferred resume was requested while the callback was running then carry
> @@ -311,8 +312,7 @@ static int rpm_suspend(struct device *de
>  		goto out;
>  
>  	/* If the autosuspend_delay time hasn't expired yet, reschedule. */
> -	if ((rpmflags & RPM_AUTO)
> -	    && dev->power.runtime_status != RPM_SUSPENDING) {
> +	if (rpmflags & RPM_AUTO) {
>  		unsigned long expires = pm_runtime_autosuspend_expiration(dev);
>  
>  		if (expires != 0) {
> @@ -339,10 +339,16 @@ static int rpm_suspend(struct device *de
>  	/* Other scheduled or pending requests need to be canceled. */
>  	pm_runtime_cancel_pending(dev);
>  
> -	if (dev->power.runtime_status == RPM_SUSPENDING) {
> +	/*
> +	 * If the request is synchronous, wait for a concurrent suspend attempt
> +	 * to finish.  Allow asynchronous requests to go through; they will be
> +	 * cancelled if the concurrent suspend succeeds.
> +	 */
> +	if (dev->power.runtime_status == RPM_SUSPENDING &&
> +			!(rpmflags & RPM_ASYNC)) {
>  		DEFINE_WAIT(wait);
>  
> -		if (rpmflags & (RPM_ASYNC | RPM_NOWAIT)) {
> +		if (rpmflags & RPM_NOWAIT) {
>  			retval = -EINPROGRESS;
>  			goto out;
>  		}
> 

    Tested-by: Henrik Rydberg <rydberg@euromail.se>

Thanks,
Henrik

  reply	other threads:[~2011-10-13 17:14 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-10-10 15:47 [PATCH V3] input: Fix USB autosuspend on bcm5974 Matthew Garrett
2011-10-10 21:05 ` Henrik Rydberg
2011-10-10 21:12   ` Matthew Garrett
2011-10-10 22:44     ` Henrik Rydberg
2011-10-11  0:11       ` Matthew Garrett
2011-10-11  4:10         ` Oliver Neukum
2011-10-11 11:04           ` Henrik Rydberg
2011-10-11 11:09             ` Oliver Neukum
2011-10-11 20:42               ` Matthew Garrett
2011-10-12  6:32                 ` Oliver Neukum
2011-10-12 14:33                   ` Alan Stern
2011-10-12 14:37                     ` Oliver Neukum
2011-10-12 15:28                       ` Alan Stern
2011-10-12 16:16                         ` Matthew Garrett
2011-10-12 16:56                           ` Oliver Neukum
2011-10-12 16:59                             ` Matthew Garrett
2011-10-12 17:24                               ` Alan Stern
2011-10-12 17:26                                 ` Matthew Garrett
2011-10-12 17:41                                   ` Alan Stern
2011-10-12 18:33                               ` Henrik Rydberg
2011-10-12 19:21                                 ` Alan Stern
2011-10-13  8:20                                   ` Henrik Rydberg
2011-10-13 15:49                                     ` Alan Stern
2011-10-13 17:21                                       ` Henrik Rydberg [this message]
2011-10-12 17:11                         ` Oliver Neukum
2011-10-12 19:18                           ` Alan Stern
2011-10-11 16:05           ` Dmitry Torokhov
2011-10-11 16:43             ` Alan Stern
2011-10-12  7:03               ` Oliver Neukum
2011-10-12 13:54                 ` Matthew Garrett
2011-10-12 14:18                   ` Alan Stern
2011-10-12 14:26                     ` Matthew Garrett
2011-10-12 14:38                       ` Oliver Neukum
2011-10-12 18:50                         ` Henrik Rydberg
2011-10-13  6:47                           ` Oliver Neukum
2011-10-10 21:16   ` Matthew Garrett

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=20111013172136.GA2234@polaris.bitmath.org \
    --to=rydberg@euromail.se \
    --cc=dtor@mail.ru \
    --cc=linux-input@vger.kernel.org \
    --cc=mjg59@srcf.ucam.org \
    --cc=oliver@neukum.org \
    --cc=stern@rowland.harvard.edu \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).