From: Michael Trimarchi <michael@amarulasolutions.com>
To: Ruslan Bilovol <ruslan.bilovol@ti.com>
Cc: Roger Quadros <rogerq@ti.com>,
USB list <linux-usb@vger.kernel.org>,
Linux OMAP Mailing List <linux-omap@vger.kernel.org>,
Alan Stern <stern@rowland.harvard.edu>
Subject: Re: omap4 ehci sporadic resume issue
Date: Thu, 27 Jun 2013 22:22:58 +0200 [thread overview]
Message-ID: <20130627202257.GB14115@panicking> (raw)
In-Reply-To: <CAB=otbT-BcJg5tNZ=7jd1jvoK8N1Hd_skScuxczaeP=tagdcSw@mail.gmail.com>
Hi
On Thu, Jun 27, 2013 at 11:07:11PM +0300, Ruslan Bilovol wrote:
> On Thu, Jun 27, 2013 at 10:24 PM, Michael Trimarchi
> <michael@amarulasolutions.com> wrote:
> > Hi
> >
> > On Thu, Jun 27, 2013 at 09:59:35PM +0300, Ruslan Bilovol wrote:
> >> Hello guys,
> >>
> >> On Thu, Jun 27, 2013 at 8:56 PM, Michael Trimarchi
> >> <michael@amarulasolutions.com> wrote:
> >> > Hi Roger
> >> >
> >> > On Thu, Jun 27, 2013 at 05:49:41PM +0300, Roger Quadros wrote:
> >> >> +Ruslan
> >> >>
> >> >> On 06/27/2013 05:17 PM, Michael Trimarchi wrote:
> >> >> > Hi Roger
> >> >> >
> >> >> > On Thu, Jun 27, 2013 at 04:59:38PM +0300, Roger Quadros wrote:
> >> >> >> Hi Michael,
> >> >> >>
> >> >> >> On 06/27/2013 02:51 PM, Michael Trimarchi wrote:
> >> >> >>> Hi
> >> >> >>>
> >> >> >>> I'm working on omap4460 with two ulpi connected to (SMSC3320 -> HUB SMSC2514) or (TUSB1210 -> HUB SMSC2514).
> >> >> >>> The problem only happen when both port are used and after few suspend resume are triggered.
> >> >> >>> If I use just one port there is no issue on suspend resume. I already covered all TI
> >> >> >>> errata that I know and I'm working on TI kernel.
> >> >> >>>
> >> >> >>> The problem is here
> >> >> >>>
> >> >> >>> [ 77.701934] ehci-omap ehci-omap.0: irq status a004 Async Recl PCD
> >> >> >>>
> >> >> >>> Both ports change status from 001005 to 001009 (you have a log just after).
> >> >> >>> So from host point of view both hub connected are not working in HS mode.
> >> >> >>> After that the omap ehci has gone because the bus can not work in FS and LS and I can not recover from here.
> >> >> >>> Status of transceivers are dumped and they are ok after resume.
> >> >> >>>
> >> >> >>> Do you have any suggestion?
> >> >> >>
> >> >> >> I'm not very sure but both ports suddenly changing state like that look like
> >> >> >> a hardware issue. Also, it is strange that you can reproduce it only when two
> >> >> >> ports are simultaneously in use. Unfortunately, I can't match your setup with 2 ULPI
> >> >> >
> >> >> > Yes I know that TI doesn't have any setup like that.
> >> >> >
> >> >> >> ports.
> >> >> >>
> >> >> >> I have a OMAP5 uEVM that uses 2 ports but it won't be identical to your setup as
> >> >> >> they are on HSIC and not ULPI.
> >> >> >>
> >> >> >> Did you try errata i693?
> >> >> >
> >> >> > Yes I have it. It's not clear if I need to wait after
> >> >> > ehci_writel(ehci, temp | PORT_SUSPEND, status_reg);
> >> >> > polling the suspendM of the SMSC or the suspend status of the PORT or I can
> >> >> > switch just after this instruction. Because TI kernel use an msleep of 4 mseconds and then switch. It could be a timing issue on how errata is implemented when I have two ports? How this internal count works?
> >> >>
> >> >>
> >> >> The OMAP EHCI controller transparently sets the suspendM bit of the PHY when you
> >> >> set the PORT_SUSPEND feature on the EHCI port. So you don't need to poll for anything.
> >> >>
> >> >
> >> > A delay is necessary. If we apply the errata to the port before a delay the errata
> >> > doesn't work.
> >> >
> >> > /* Use internal 60Mhz clock ULPIBx */
> >> > temp_reg = omap_readl(L3INIT_HSUSBHOST_CLKCTRL);
> >> > temp_reg |= 1 << (8 + port);
> >> > temp_reg &= ~(1 << (24 + port));
> >> > omap_writel(temp_reg, L3INIT_HSUSBHOST_CLKCTRL);
> >> >
> >> > /* Wait 2ms to have transceiver transaction */
> >> > mdelay(2);
> >> >
> >> > /* Use external clock ULPIBx */
> >> > temp_reg &= ~(1 << (8 + port));
> >> > temp_reg |= 1 << (24 + port);
> >> > omap_writel(temp_reg, L3INIT_HSUSBHOST_CLKCTRL);
> >> >
> >> > Now it's not clear to me what happen if I apply this clock too early (transeceiver still
> >> > driver the clock) or too late. Any clue?
> >>
> >> We need to wait 3ms for entire USB bus to go into suspend after
> >> setting the PORT_SUSPEND bit. During this time, internal OMAP EHCI logic
> >> will communicate with PHY so it is not safe to switch the clocks to
> >> internal source.
> >> That's why with 2ms delay it fails. 4ms delay (3ms + 1ms for safety)
> >> is enough here
> >> and is successfully used last few years for production devices.
> >
> > Well this mdelay is the switch of the clock and not the delay after
> > PORT_SUSPEND. So after writing PORT_SUSPEND I need to wait
> > 4ms and then in 2ms you have a lot of clock to reach the 18 count. Correct?
>
> Yes, sorry for confusing :)
> Moreover, 2ms is more than enough, errata document says about 1ms delay
> (and probably may be decreased up to few useconds)
>
> >
> > Anyway I understand, but why both hub connected to the smsc3320 move from
> > HS to FS? So it's not important if there is a drift of delay but it must
> > be >= 4ms. Correct?
> >
> > The code works if I just use one port or remove one hub ;)
> >
> > Now the code is like this:
> >
> > temp &= ~(PORT_WKCONN_E | PORT_RWC_BITS);
> > temp |= PORT_WKDISC_E | PORT_WKOC_E;
> > ehci_writel(ehci, temp | PORT_SUSPEND, status_reg);
> >
> > mdelay(4);
> > omap_ehci_erratum_i693(ehci, ((wIndex & 0xff) - 1));
> >
> > The code of the function is up on this email.
>
> Do you have locks around this software workaround?
> The patch I did against 3.4 linux kernel may be helpful for
> you in such case: http://review.omapzoom.org/28515
> Another patch extends this WA for all OMAP4 SoCs:
> http://review.omapzoom.org/31108
Yes, I'm using this code already applied to p-android-3.4 tree.
So the code is fine because it works when I use just one port
but for some reason I have problem when both ulpibx are active.
The scenario is this one:
GOOD ONE
[ 23.389892] ehci-omap ehci-omap.0: GetStatus port:1 status 001885 0 ACK POWER sig=j SUSPEND PE CONNECT
[ 23.389923] usb 1-1: usb resume
[ 23.390014] ehci-omap ehci-omap.0: GetStatus port:2 status 001885 0 ACK POWER sig=j SUSPEND PE CONNECT
[ 23.390045] usb 1-2: usb resume
[ 23.428497] dump_tranceiver -----------> on port 1
[ 23.428527] ULPI_FUNC_CTRL 0x40
[ 23.428558] ULPI_IFC_CTRL 0x00
[ 23.428558] ULPI_OTG_CTRL 0x06
[ 23.428588] ULPI_DEBUG 0x00
[ 23.428588] ULPI_USB_INT_STS 0x14
[ 23.428619] dump_tranceiver <---------- on port 1
[ 23.428649] ehci-omap ehci-omap.0: GetStatus port:1 status 001005 0 ACK POWER sig=se0 PE CONNECT
[ 23.428710] dump_tranceiver -----------> on port 2
[ 23.428741] ULPI_FUNC_CTRL 0x40
[ 23.428771] ULPI_IFC_CTRL 0x00
[ 23.428771] ULPI_OTG_CTRL 0x06
[ 23.428802] ULPI_DEBUG 0x00
[ 23.428802] ULPI_USB_INT_STS 0x14
[ 23.428802] dump_tranceiver <---------- on port 2
[ 23.428863] ehci-omap ehci-omap.0: GetStatus port:2 status 001005 0 ACK POWER sig=se0 PE CONNECT
BAD ONE
[ 32.741638] ehci-omap ehci-omap.0: GetStatus port:3 status 001000 0 ACK POWER sig=se0
[ 32.741851] ehci-omap ehci-omap.0: GetStatus port:1 status 001885 0 ACK POWER sig=j SUSPEND PE CONNECT
[ 32.741912] usb 1-1: usb resume
[ 32.741973] ehci-omap ehci-omap.0: GetStatus port:2 status 001885 0 ACK POWER sig=j SUSPEND PE CONNECT
[ 32.742034] usb 1-2: usb resume
[ 32.780395] dump_tranceiver -----------> on port 1
[ 32.780426] ULPI_FUNC_CTRL 0x40
[ 32.780456] ULPI_IFC_CTRL 0x00
[ 32.780456] ULPI_OTG_CTRL 0x06
[ 32.780487] ULPI_DEBUG 0x00
[ 32.780487] ULPI_USB_INT_STS 0x14
[ 32.780517] dump_tranceiver <---------- on port 1
[ 32.780578] ehci-omap ehci-omap.0: GetStatus port:1 status 001005 0 ACK POWER sig=se0 PE CONNECT
[ 32.780639] dump_tranceiver -----------> on port 2
[ 32.780670] ULPI_FUNC_CTRL 0x40
[ 32.780670] ULPI_IFC_CTRL 0x00
[ 32.780700] ULPI_OTG_CTRL 0x06
[ 32.780700] ULPI_DEBUG 0x00
[ 32.780731] ULPI_USB_INT_STS 0x14
[ 32.780731] dump_tranceiver <---------- on port 2
[ 32.780792] ehci-omap ehci-omap.0: GetStatus port:2 status 001005 0 ACK POWER sig=se0 PE CONNECT
[ 32.803894] usb 1-2: finish resume
[ 32.803985] usb 1-1: finish resume
[ 32.804046] ehci-omap ehci-omap.0: irq status a004 Async Recl PCD
[ 32.804046] Port 2 Status 0x1000
[ 32.804077] Port 1 Status 0x1009
[ 32.804077] Port 0 Status 0x1009
So status 1005 was good HS
1009 switch move to FS/LS device
[ 37.819274] ehci-omap ehci-omap.0: IAA watchdog: status a008 cmd 10065
[ 37.819427] usb 1-2: kworker/u:0 timed out on ep0in len=0/2
[ 37.819458] usb 1-2: retry with reset-resume
[ 37.819519] ehci-omap ehci-omap.0: port 2 reset
[ 37.834899] ehci-omap ehci-omap.0: IAA watchdog: status a008 cmd 10065
[ 37.835021] usb 1-1: kworker/u:3 timed out on ep0in len=0/2
[ 37.835021] usb 1-1: retry with reset-resume
[ 37.882049] ehci-omap ehci-omap.0: port 2 full speed --> companion
[ 37.882110] ehci-omap ehci-omap.0: GetStatus port:2 status 003001 0 ACK POWER OWNER sig=se0 CONNECT
[ 37.882141] ehci-omap ehci-omap.0: irq status 200c Recl FLR PCD
[ 37.882171] Port 2 Status 0x1000
[ 37.882202] Port 1 Status 0x300a
[ 37.882202] Port 0 Status 0x1809
[ 37.882263] hub 1-0:1.0: port 2 not reset yet, waiting 50ms
[ 37.944396] ehci-omap ehci-omap.0: GetStatus port:2 status 00300a 0 ACK POWER OWNER sig=se0 PEC CSC
[ 37.944488] hub 1-0:1.0: logical disconnect on port 2
[ 37.944549] usb 1-2: gone after usb resume? status -19
[ 37.944580] usb 1-2: can't resume, status -19
[ 37.944580] hub 1-0:1.0: logical disconnect on port 2
[ 37.944763] ehci-omap ehci-omap.0: port 1 reset
[ 38.007171] ehci-omap ehci-omap.0: port 1 full speed --> companion
[ 38.007232] ehci-omap ehci-omap.0: GetStatus port:1 status 003001 0 ACK POWER OWNER sig=se0 CONNECT
[ 38.007263] ehci-omap ehci-omap.0: irq status 2004 Recl PCD
Michael
>
> Regards
> Ruslan
>
> >
> > Michael
> >
> >>
> >> --
> >> Best regards,
> >> Ruslan Bilvol
> >>
> >> >
> >> >
> >> >> What the errata says is that once software sets the PORT_SUSPEND feature, the PHY will
> >> >> got into suspend and cut the PHY clock sooner than required for the EHCI controller to
> >> >> complete its suspend operations. (NOTE: this is only applicable when the PHY is providing the
> >> >> ulpi_clk).
> >> >>
> >> >
> >> > Yes this is the case
> >> >
> >> >> What the workaround does is to just wait for a while (don't know why 4ms), and remux the
> >> >> ulpi_clock to an internal 60MHz clock for a while so that it can complete its suspend operations.
> >> >
> >> > What happen if I apply a big delay after PORT_SUSPEND. Will the internal state machine of the omap
> >> > continue to wait the clock?
> >> >
> >> > Michael
> >> >
> >> >>
> >> >> >
> >> >> > First time is 18, and then?
> >> >> >
> >> >> I think it is 18 for every port suspend.
> >> >>
> >> >> >>
> >> >> >> Also, are you suspending and resuming only the USB or the entire system?
> >> >> >>
> >> >> >
> >> >> > Whole system. Right the only susbsytem that doens't go to suspend is the FSUSB
> >> >> > but this depends on the bootloader.
> >> >>
> >> >> OK.
> >> >>
> >> >> cheers,
> >> >> -roger
> >> > --
> >> > To unsubscribe from this list: send the line "unsubscribe linux-usb" in
> >> > the body of a message to majordomo@vger.kernel.org
> >> > More majordomo info at http://vger.kernel.org/majordomo-info.html
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> > the body of a message to majordomo@vger.kernel.org
> > More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2013-06-27 20:23 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-06-27 11:51 omap4 ehci sporadic resume issue Michael Trimarchi
2013-06-27 13:59 ` Roger Quadros
[not found] ` <51CC454A.1040104-l0cyMroinI0@public.gmane.org>
2013-06-27 14:17 ` Michael Trimarchi
2013-06-27 14:49 ` Roger Quadros
2013-06-27 17:56 ` Michael Trimarchi
2013-06-27 18:59 ` Ruslan Bilovol
2013-06-27 19:24 ` Michael Trimarchi
2013-06-27 20:07 ` Ruslan Bilovol
2013-06-27 20:22 ` Michael Trimarchi [this message]
2013-06-28 11:33 ` Michael Trimarchi
2013-06-28 11:46 ` Roger Quadros
[not found] ` <51CD7783.8030907-l0cyMroinI0@public.gmane.org>
2013-06-28 12:26 ` Michael Trimarchi
2013-06-28 12:55 ` Roger Quadros
[not found] ` <51CD87AC.6060107-l0cyMroinI0@public.gmane.org>
2013-06-28 14:52 ` Michael Trimarchi
2013-06-28 16:47 ` Michael Trimarchi
2013-07-02 14:42 ` Roger Quadros
[not found] ` <51D2E6DA.6030000-l0cyMroinI0@public.gmane.org>
2013-07-02 14:49 ` Michael Trimarchi
2013-07-02 14:57 ` Nishanth Menon
2013-07-02 15:03 ` Roger Quadros
[not found] ` <51D2EBBB.8000504-l0cyMroinI0@public.gmane.org>
2013-07-04 8:53 ` Michael Trimarchi
2013-08-30 17:59 ` Michael Trimarchi
[not found] ` <CAOf5uwk9U8CHWywfopCt-H5BJmYyuXrwPvpwaqqP+5-3g_qYhQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-09-02 7:04 ` Roger Quadros
2013-06-28 19:42 ` Michael Trimarchi
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=20130627202257.GB14115@panicking \
--to=michael@amarulasolutions.com \
--cc=linux-omap@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=rogerq@ti.com \
--cc=ruslan.bilovol@ti.com \
--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