From: Roger Quadros <rogerq@ti.com>
To: Alan Stern <stern@rowland.harvard.edu>
Cc: balbi@ti.com, tony@atomide.com, ruslan.bilovol@ti.com,
linux-usb@vger.kernel.org, linux-omap@vger.kernel.org,
linux-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org
Subject: Re: [RFC PATCH 4/6] USB: ehci-omap: Suspend the controller during bus suspend
Date: Fri, 28 Jun 2013 16:57:55 +0300 [thread overview]
Message-ID: <51CD9663.6060806@ti.com> (raw)
In-Reply-To: <51CD7FA1.3020005@ti.com>
On 06/28/2013 03:20 PM, Roger Quadros wrote:
> On 06/27/2013 06:40 PM, Alan Stern wrote:
>> On Wed, 26 Jun 2013, Roger Quadros wrote:
>>
>>> I updated the ehci-omap.c driver to call ehci_suspend/resume during runtime_suspend/resume.
>>> After that, it stopped detecting the port status change event when a device was plugged
>>> to an external HUB. The wakeup irq was coming and the root hub/controller were being resumed,
>>> but after that, no hub_irq.
>>
>> Wait a minute. I'm not clear on what happened. You're starting out
>> with the controller, the root hub, and the external hub all suspended,
>> right? Then you plugged a new device into the external hub. This
>
> This is right.
>
>> caused the controller and the root hub to wake up, but not the external
>> hub?
>>
> Right. It seems the external hub has signaled remote wakeup but the kernel doesn't
> resume the root hub's port it is connected to.
>
> By observing the detailed logs below you can see that the root hub does not generate
> an INTerrupt transaction to notify the port status change event. I've captured the pstatus
> and GetPortStatus info as well.
>
> Failing case
> ------------
>
> [ 16.108032] usb usb1: usb auto-resume
> [ 16.108062] ehci-omap 48064800.ehci: resume root hub
> [ 16.108154] hub 1-0:1.0: hub_resume
> [ 16.108398] ehci_hub_control GetPortStatus, port 1 temp = 0x1000
> [ 16.108459] ehci_hub_control GetPortStatus, port 2 temp = 0x14c5
> [ 16.108551] hub 1-0:1.0: port 2: status 0507 change 0000
> [ 16.108612] ehci_hub_control GetPortStatus, port 3 temp = 0x1000
> [ 16.108642] hub 1-0:1.0: hub_activate submitting urb
> [ 16.109222] ehci_irq port 3 pstatus 0x1000
> [ 16.109222] ehci_irq port 2 pstatus 0x14c5
> [ 16.109252] ehci_irq port 1 pstatus 0x1000
> [ 16.109374] hub 1-0:1.0: state 7 ports 3 chg 0000 evt 0000
>
> Passing case
> ------------
>
> / # [ 19.704589] usb usb1: usb wakeup-resume
> [ 19.709075] ehci-omap 48064800.ehci: omap_ehci_runtime_resume
> [ 19.715423] usb usb1: usb auto-resume
> [ 19.719299] ehci-omap 48064800.ehci: resume root hub
> [ 19.724670] hub 1-0:1.0: hub_resume
> [ 19.728424] ehci_hub_control GetPortStatus, port 1 temp = 0x1000
> [ 19.734863] ehci_hub_control GetPortStatus, port 2 temp = 0x14c5
> [ 19.741271] hub 1-0:1.0: port 2: status 0507 change 0000
> [ 19.746948] ehci_hub_control GetPortStatus, port 3 temp = 0x1000
> [ 19.753448] hub 1-0:1.0: hub_activate submitting urb
> [ 19.759216] ehci_irq port 3 pstatus 0x1000
> [ 19.763519] ehci_irq port 2 pstatus 0x14c5
> [ 19.767822] ehci_irq port 1 pstatus 0x1000
> [ 19.772155] hub 1-0:1.0: hub_irq
>
> <---This is the Port Status change hub INT which is missing in the failing case--->
>
> [ 19.775604] hub 1-0:1.0: hub_irq submitting urb
> [ 19.780548] hub 1-0:1.0: state 7 ports 3 chg 0000 evt 0004
> [ 19.786407] hub 1-0:1.0: hub_irq
> [ 19.789916] hub 1-0:1.0: hub_irq submitting urb
> [ 19.794799] ehci_hub_control GetPortStatus, port 2 temp = 0x14c5
> [ 19.801147] ehci-omap 48064800.ehci: GetStatus port:2 status 001005 0 ACK POWER sig=se0 PE CONNECT
> [ 19.822937] usb 1-2: usb wakeup-resume
> [ 19.826995] ehci_hub_control GetPortStatus, port 2 temp = 0x1005
> [ 19.833404] usb 1-2: finish resume
> [ 19.837738] hub 1-2:1.0: hub_resume
> [ 19.841613] hub 1-2:1.0: port 1: status 0507 change 0000
> [ 19.848358] hub 1-2:1.0: port 4: status 0101 change 0001
> [ 19.962890] hub 1-2:1.0: hub_activate submitting urb
> [ 19.968139] ehci-omap 48064800.ehci: reused qh dd450200 schedule
> [ 19.974456] usb 1-2: link qh256-0001/dd450200 start 1 [1/0 us]
> [ 19.980743] hub 1-0:1.0: resume on port 2, status 0
> [ 19.985961] hub 1-0:1.0: state 7 ports 3 chg 0000 evt 0000
> [ 19.991760] hub 1-2:1.0: state 7 ports 5 chg 0010 evt 0000
> [ 19.997741] hub 1-2:1.0: port 4, status 0101, change 0000, 12 Mb/s
> [ 20.083129] usb 1-2.4: new high-speed USB device number 4 using ehci-omap
> <snip>
>
> One more thing is that the delay didn't help if I reduce printk verbosity to 7.
> So the debug prints are also adding some delays around the place which is affecting
> the behaviour.
Just found the problem. It seems that enabling the ehci_irq _after_ the root hub is resumed
is the root cause of the problem. Doing so will miss events from the root hub.
The following modification worked for me without any delays.
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 72df4eb..b3af1aa 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -2136,11 +2136,6 @@ static void hcd_resume_work(struct work_struct *work)
usb_lock_device(udev);
usb_remote_wakeup(udev);
usb_unlock_device(udev);
- if (HCD_IRQ_DISABLED(hcd)) {
- /* Interrupt was disabled */
- clear_bit(HCD_FLAG_IRQ_DISABLED, &hcd->flags);
- enable_irq(hcd->irq);
- }
}
/**
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
index 593d28d..f2a1a46 100644
--- a/drivers/usb/host/ehci-hcd.c
+++ b/drivers/usb/host/ehci-hcd.c
@@ -1110,6 +1110,12 @@ int ehci_resume(struct usb_hcd *hcd, bool hibernated)
{
struct ehci_hcd *ehci = hcd_to_ehci(hcd);
+ if (HCD_IRQ_DISABLED(hcd)) {
+ /* Interrupt was disabled */
+ clear_bit(HCD_FLAG_IRQ_DISABLED, &hcd->flags);
+ enable_irq(hcd->irq);
+ }
+
if (time_before(jiffies, ehci->next_statechange))
msleep(100);
cheers,
-roger
next prev parent reply other threads:[~2013-06-28 13:57 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-06-19 14:05 [RFC PATCH 0/6] Suspend USB Host controller on bus suspend Roger Quadros
2013-06-19 14:05 ` [RFC PATCH 1/6] mfd: omap-usb-host: move initialization to module_init() Roger Quadros
2013-06-20 12:07 ` Felipe Balbi
2013-06-20 12:29 ` Roger Quadros
2013-06-19 14:05 ` [RFC PATCH 2/6] mfd: omap-usb-host: Put pins in IDLE state on suspend Roger Quadros
2013-06-19 17:23 ` Kevin Hilman
2013-06-20 7:21 ` Tony Lindgren
2013-06-20 12:30 ` Roger Quadros
2013-06-19 14:05 ` [RFC PATCH 3/6] USB: ehci: allow controller drivers to override irq & bus_suspend/resume Roger Quadros
2013-06-19 14:05 ` [RFC PATCH 4/6] USB: ehci-omap: Suspend the controller during bus suspend Roger Quadros
2013-06-19 17:39 ` Kevin Hilman
2013-06-20 12:32 ` Roger Quadros
[not found] ` <1371650753-11452-5-git-send-email-rogerq-l0cyMroinI0@public.gmane.org>
2013-06-20 12:11 ` Felipe Balbi
2013-06-20 12:35 ` Roger Quadros
2013-06-20 17:33 ` Alan Stern
2013-06-24 15:09 ` Roger Quadros
2013-06-24 19:34 ` Alan Stern
2013-06-25 13:59 ` Roger Quadros
2013-06-25 17:38 ` Alan Stern
2013-06-26 13:38 ` Roger Quadros
2013-06-27 15:40 ` Alan Stern
2013-06-28 12:20 ` Roger Quadros
2013-06-28 13:57 ` Roger Quadros [this message]
2013-06-28 19:18 ` Alan Stern
2013-07-01 8:33 ` Roger Quadros
2013-06-28 19:06 ` Alan Stern
2013-07-01 8:16 ` Roger Quadros
2013-07-01 16:24 ` Alan Stern
2013-07-01 16:49 ` Felipe Balbi
2013-07-01 21:01 ` Alan Stern
2013-07-02 8:22 ` Roger Quadros
2013-07-02 17:17 ` Alan Stern
2013-07-03 9:13 ` Roger Quadros
2013-07-03 12:57 ` Felipe Balbi
2013-07-03 13:06 ` Roger Quadros
2013-07-03 13:15 ` Felipe Balbi
[not found] ` <20130703131513.GH15056-S8G//mZuvNWo5Im9Ml3/Zg@public.gmane.org>
2013-07-03 14:30 ` Alan Stern
[not found] ` <Pine.LNX.4.44L0.1306281346430.1047-100000-IYeN2dnnYyZXsRXLowluHWD2FQJk+8+b@public.gmane.org>
2013-07-09 13:58 ` Roger Quadros
2013-06-19 14:05 ` [RFC PATCH 5/6] ARM: dts: omap3beagle-xm: Add idle state pins for USB host Roger Quadros
2013-06-19 18:42 ` Kevin Hilman
2013-06-20 11:55 ` Roger Quadros
2013-06-20 12:02 ` Roger Quadros
2013-06-20 13:02 ` Roger Quadros
2013-06-19 14:05 ` [RFC PATCH 6/6] ARM: OMAP3: Enable Hardware Save and Restore for USB Host Roger Quadros
2013-06-19 17:30 ` Sergei Shtylyov
2013-06-20 12:42 ` Roger Quadros
2013-06-19 15:23 ` [RFC PATCH 0/6] Suspend USB Host controller on bus suspend Alan Stern
2013-06-20 12:39 ` Roger Quadros
2013-06-20 17:19 ` Alan Stern
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=51CD9663.6060806@ti.com \
--to=rogerq@ti.com \
--cc=balbi@ti.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-omap@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=ruslan.bilovol@ti.com \
--cc=stern@rowland.harvard.edu \
--cc=tony@atomide.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 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).