linux-omap.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Re: [PATCH] usb: musb: fix idling for suspend after disconnect interrupt
       [not found] <20191126034151.38154-1-tony@atomide.com>
@ 2020-10-27  4:55 ` Bhushan Shah
  2020-10-27  6:17   ` Tony Lindgren
  0 siblings, 1 reply; 4+ messages in thread
From: Bhushan Shah @ 2020-10-27  4:55 UTC (permalink / raw)
  To: Tony Lindgren
  Cc: Bin Liu, Greg Kroah-Hartman, linux-usb, linux-omap,
	Merlijn Wajer, Pavel Machek, Sebastian Reichel, clayton

[-- Attachment #1: Type: text/plain, Size: 2824 bytes --]

Hi Tony,

On Mon, Nov 25, 2019 at 07:41:51PM -0800, Tony Lindgren wrote:
> When disconnected as USB B-device, we sometimes get a suspend interrupt
> after disconnect interrupt. In that case we have devctl set to 99 with
> VBUS still valid and musb_pm_runtime_check_session() wrongly things we
> have an active session. We have no other interrupts after disconnect
> coming in this case at least with the omap2430 glue.

So I had been debugging a issue with musb_hrdc driver preventing a
suspend on the pinephone, which is Allwinner A64 platform.

Namely, if I have USB connected, and I try to suspend, it would hang
until USB is disconnected. After enabling tracing, I realized that is
hanging after this commit. Reverting it makes device suspend and resume
correctly.

Some more of debugging notes can be found at,

https://gitlab.com/postmarketOS/pmaports/-/issues/839

I wonder what would be right solution here? Disable this quirk somehow
for device?

Regards

> Let's fix the issue by checking the interrupt status again with
> delayed work for the devctl 99 case. In the suspend after disconnect
> case the devctl session bit has cleared by then and musb can idle.
> For a typical USB B-device connect case we just continue with normal
> interrupts.
> 
> Cc: Merlijn Wajer <merlijn@wizzup.org>
> Cc: Pavel Machek <pavel@ucw.cz>
> Cc: Sebastian Reichel <sre@kernel.org>
> Signed-off-by: Tony Lindgren <tony@atomide.com>
> ---
>  drivers/usb/musb/musb_core.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
> --- a/drivers/usb/musb/musb_core.c
> +++ b/drivers/usb/musb/musb_core.c
> @@ -1943,6 +1943,9 @@ ATTRIBUTE_GROUPS(musb);
>  #define MUSB_QUIRK_B_INVALID_VBUS_91	(MUSB_DEVCTL_BDEVICE | \
>  					 (2 << MUSB_DEVCTL_VBUS_SHIFT) | \
>  					 MUSB_DEVCTL_SESSION)
> +#define MUSB_QUIRK_B_DISCONNECT_99	(MUSB_DEVCTL_BDEVICE | \
> +					 (3 << MUSB_DEVCTL_VBUS_SHIFT) | \
> +					 MUSB_DEVCTL_SESSION)
>  #define MUSB_QUIRK_A_DISCONNECT_19	((3 << MUSB_DEVCTL_VBUS_SHIFT) | \
>  					 MUSB_DEVCTL_SESSION)
>  
> @@ -1965,6 +1968,11 @@ static void musb_pm_runtime_check_session(struct musb *musb)
>  	s = MUSB_DEVCTL_FSDEV | MUSB_DEVCTL_LSDEV |
>  		MUSB_DEVCTL_HR;
>  	switch (devctl & ~s) {
> +	case MUSB_QUIRK_B_DISCONNECT_99:
> +		musb_dbg(musb, "Poll devctl in case of suspend after disconnect\n");
> +		schedule_delayed_work(&musb->irq_work,
> +				      msecs_to_jiffies(1000));
> +		break;
>  	case MUSB_QUIRK_B_INVALID_VBUS_91:
>  		if (musb->quirk_retries && !musb->flush_irq_work) {
>  			musb_dbg(musb,
> -- 
> 2.24.0

-- 
Bhushan Shah
http://blog.bshah.in
IRC Nick : bshah on Freenode
GPG key fingerprint : 0AAC 775B B643 7A8D 9AF7 A3AC FE07 8411 7FBC E11D

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] usb: musb: fix idling for suspend after disconnect interrupt
  2020-10-27  4:55 ` [PATCH] usb: musb: fix idling for suspend after disconnect interrupt Bhushan Shah
@ 2020-10-27  6:17   ` Tony Lindgren
  2020-10-27  7:59     ` Bhushan Shah
  0 siblings, 1 reply; 4+ messages in thread
From: Tony Lindgren @ 2020-10-27  6:17 UTC (permalink / raw)
  To: Bhushan Shah
  Cc: Bin Liu, Greg Kroah-Hartman, linux-usb, linux-omap,
	Merlijn Wajer, Pavel Machek, Sebastian Reichel, clayton

Hi,

* Bhushan Shah <bshah@kde.org> [201027 04:55]:
> Hi Tony,
> 
> On Mon, Nov 25, 2019 at 07:41:51PM -0800, Tony Lindgren wrote:
> > When disconnected as USB B-device, we sometimes get a suspend interrupt
> > after disconnect interrupt. In that case we have devctl set to 99 with
> > VBUS still valid and musb_pm_runtime_check_session() wrongly things we
> > have an active session. We have no other interrupts after disconnect
> > coming in this case at least with the omap2430 glue.
> 
> So I had been debugging a issue with musb_hrdc driver preventing a
> suspend on the pinephone, which is Allwinner A64 platform.

Great. After that you might want to take a look and make sure that musb
also gets idled properly during runtime with no devices connected :)

> Namely, if I have USB connected, and I try to suspend, it would hang
> until USB is disconnected. After enabling tracing, I realized that is
> hanging after this commit. Reverting it makes device suspend and resume
> correctly.
> 
> Some more of debugging notes can be found at,
> 
> https://gitlab.com/postmarketOS/pmaports/-/issues/839
> 
> I wonder what would be right solution here? Disable this quirk somehow
> for device?

Hmm maybe we're just missing the check for suspend here. Maybe
give the following untested patch a try?

I'll give it a try here too but it might be few days.

Seems like we might be able to eventually simplify the suspend and
quirk check stuff, but let's fix the $subject issue first.

Regards,

Tony

8< ----------------------
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
--- a/drivers/usb/musb/musb_core.c
+++ b/drivers/usb/musb/musb_core.c
@@ -2005,10 +2005,14 @@ static void musb_pm_runtime_check_session(struct musb *musb)
 		MUSB_DEVCTL_HR;
 	switch (devctl & ~s) {
 	case MUSB_QUIRK_B_DISCONNECT_99:
-		musb_dbg(musb, "Poll devctl in case of suspend after disconnect\n");
-		schedule_delayed_work(&musb->irq_work,
-				      msecs_to_jiffies(1000));
-		break;
+		if (musb->quirk_retries && !musb->flush_irq_work) {
+			musb_dbg(musb, "Poll devctl in case of suspend after disconnect\n");
+			schedule_delayed_work(&musb->irq_work,
+					      msecs_to_jiffies(1000));
+			musb->quirk_retries--;
+			break;
+		}
+		/* fall through */
 	case MUSB_QUIRK_B_INVALID_VBUS_91:
 		if (musb->quirk_retries && !musb->flush_irq_work) {
 			musb_dbg(musb,

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] usb: musb: fix idling for suspend after disconnect interrupt
  2020-10-27  6:17   ` Tony Lindgren
@ 2020-10-27  7:59     ` Bhushan Shah
  2020-10-28  8:42       ` Tony Lindgren
  0 siblings, 1 reply; 4+ messages in thread
From: Bhushan Shah @ 2020-10-27  7:59 UTC (permalink / raw)
  To: Tony Lindgren
  Cc: Bin Liu, Greg Kroah-Hartman, linux-usb, linux-omap,
	Merlijn Wajer, Pavel Machek, Sebastian Reichel, clayton

[-- Attachment #1: Type: text/plain, Size: 1678 bytes --]

Hello!

On Tue, Oct 27, 2020 at 08:17:41AM +0200, Tony Lindgren wrote:
> Hmm maybe we're just missing the check for suspend here. Maybe
> give the following untested patch a try?
> 
> I'll give it a try here too but it might be few days.

Thanks for quick patch! I tested this on my device and I can confirm
that it fixes issue for me.

So from my side,

Tested-by: Bhushan Shah <bshah@kde.org>

Thanks!

> Seems like we might be able to eventually simplify the suspend and
> quirk check stuff, but let's fix the $subject issue first.
> 
> Regards,
> 
> Tony
> 
> 8< ----------------------
> diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
> --- a/drivers/usb/musb/musb_core.c
> +++ b/drivers/usb/musb/musb_core.c
> @@ -2005,10 +2005,14 @@ static void musb_pm_runtime_check_session(struct musb *musb)
>  		MUSB_DEVCTL_HR;
>  	switch (devctl & ~s) {
>  	case MUSB_QUIRK_B_DISCONNECT_99:
> -		musb_dbg(musb, "Poll devctl in case of suspend after disconnect\n");
> -		schedule_delayed_work(&musb->irq_work,
> -				      msecs_to_jiffies(1000));
> -		break;
> +		if (musb->quirk_retries && !musb->flush_irq_work) {
> +			musb_dbg(musb, "Poll devctl in case of suspend after disconnect\n");
> +			schedule_delayed_work(&musb->irq_work,
> +					      msecs_to_jiffies(1000));
> +			musb->quirk_retries--;
> +			break;
> +		}
> +		/* fall through */
>  	case MUSB_QUIRK_B_INVALID_VBUS_91:
>  		if (musb->quirk_retries && !musb->flush_irq_work) {
>  			musb_dbg(musb,

-- 
Bhushan Shah
http://blog.bshah.in
IRC Nick : bshah on Freenode
GPG key fingerprint : 0AAC 775B B643 7A8D 9AF7 A3AC FE07 8411 7FBC E11D

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] usb: musb: fix idling for suspend after disconnect interrupt
  2020-10-27  7:59     ` Bhushan Shah
@ 2020-10-28  8:42       ` Tony Lindgren
  0 siblings, 0 replies; 4+ messages in thread
From: Tony Lindgren @ 2020-10-28  8:42 UTC (permalink / raw)
  To: Bhushan Shah
  Cc: Bin Liu, Greg Kroah-Hartman, linux-usb, linux-omap,
	Merlijn Wajer, Pavel Machek, Sebastian Reichel, clayton

* Bhushan Shah <bshah@kde.org> [201027 07:59]:
> Hello!
> 
> On Tue, Oct 27, 2020 at 08:17:41AM +0200, Tony Lindgren wrote:
> > Hmm maybe we're just missing the check for suspend here. Maybe
> > give the following untested patch a try?
> > 
> > I'll give it a try here too but it might be few days.
> 
> Thanks for quick patch! I tested this on my device and I can confirm
> that it fixes issue for me.
> 
> So from my side,
> 
> Tested-by: Bhushan Shah <bshah@kde.org>

OK good to hear :) Will post a proper patch after testing here too.

Regards,

Tony

> > Seems like we might be able to eventually simplify the suspend and
> > quirk check stuff, but let's fix the $subject issue first.
> > 
> > Regards,
> > 
> > Tony
> > 
> > 8< ----------------------
> > diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
> > --- a/drivers/usb/musb/musb_core.c
> > +++ b/drivers/usb/musb/musb_core.c
> > @@ -2005,10 +2005,14 @@ static void musb_pm_runtime_check_session(struct musb *musb)
> >  		MUSB_DEVCTL_HR;
> >  	switch (devctl & ~s) {
> >  	case MUSB_QUIRK_B_DISCONNECT_99:
> > -		musb_dbg(musb, "Poll devctl in case of suspend after disconnect\n");
> > -		schedule_delayed_work(&musb->irq_work,
> > -				      msecs_to_jiffies(1000));
> > -		break;
> > +		if (musb->quirk_retries && !musb->flush_irq_work) {
> > +			musb_dbg(musb, "Poll devctl in case of suspend after disconnect\n");
> > +			schedule_delayed_work(&musb->irq_work,
> > +					      msecs_to_jiffies(1000));
> > +			musb->quirk_retries--;
> > +			break;
> > +		}
> > +		/* fall through */
> >  	case MUSB_QUIRK_B_INVALID_VBUS_91:
> >  		if (musb->quirk_retries && !musb->flush_irq_work) {
> >  			musb_dbg(musb,
> 
> -- 
> Bhushan Shah
> http://blog.bshah.in
> IRC Nick : bshah on Freenode
> GPG key fingerprint : 0AAC 775B B643 7A8D 9AF7 A3AC FE07 8411 7FBC E11D



^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2020-10-29  2:05 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20191126034151.38154-1-tony@atomide.com>
2020-10-27  4:55 ` [PATCH] usb: musb: fix idling for suspend after disconnect interrupt Bhushan Shah
2020-10-27  6:17   ` Tony Lindgren
2020-10-27  7:59     ` Bhushan Shah
2020-10-28  8:42       ` Tony Lindgren

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).