diff mbox series

usb: host: ehci: skip STS_HALT check for aspeed platform

Message ID 20210826071525.27651-1-neal_liu@aspeedtech.com
State New
Headers show
Series usb: host: ehci: skip STS_HALT check for aspeed platform | expand

Commit Message

Neal Liu Aug. 26, 2021, 7:15 a.m. UTC
STS_HALT also depends on ASS/PSS status for apseed.
Skip this check on startup.

Signed-off-by: neal_liu <neal_liu@aspeedtech.com>
---
 drivers/usb/host/ehci-hcd.c      | 10 +++++++++-
 drivers/usb/host/ehci-platform.c |  6 ++++++
 drivers/usb/host/ehci.h          |  1 +
 3 files changed, 16 insertions(+), 1 deletion(-)

Comments

Neal Liu Sept. 1, 2021, 2:34 a.m. UTC | #1
> -----Original Message-----

> From: Alan Stern <stern@rowland.harvard.edu>

> Sent: Thursday, August 26, 2021 11:28 PM

> To: Neal Liu <neal_liu@aspeedtech.com>

> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>; Tony Prisk

> <linux@prisktech.co.nz>; linux-usb@vger.kernel.org;

> linux-kernel@vger.kernel.org; linux-arm-kernel@lists.infradead.org; Tao Ren

> <rentao.bupt@gmail.com>; BMC-SW <BMC-SW@aspeedtech.com>

> Subject: Re: [PATCH] usb: host: ehci: skip STS_HALT check for aspeed platform

> 

> On Thu, Aug 26, 2021 at 03:15:25PM +0800, neal_liu wrote:

> > STS_HALT also depends on ASS/PSS status for apseed.

> > Skip this check on startup.

> >

> > Signed-off-by: neal_liu <neal_liu@aspeedtech.com>

> > ---

> >  drivers/usb/host/ehci-hcd.c      | 10 +++++++++-

> >  drivers/usb/host/ehci-platform.c |  6 ++++++

> >  drivers/usb/host/ehci.h          |  1 +

> >  3 files changed, 16 insertions(+), 1 deletion(-)

> >

> > diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c

> > index 10b0365f3439..a539e11502ef 100644

> > --- a/drivers/usb/host/ehci-hcd.c

> > +++ b/drivers/usb/host/ehci-hcd.c

> > @@ -634,7 +634,15 @@ static int ehci_run (struct usb_hcd *hcd)

> >  	/* Wait until HC become operational */

> >  	ehci_readl(ehci, &ehci->regs->command);	/* unblock posted writes */

> >  	msleep(5);

> > -	rc = ehci_handshake(ehci, &ehci->regs->status, STS_HALT, 0, 100 * 1000);

> > +

> > +	/* For Aspeed, STS_HALT also depends on ASS/PSS status.

> > +	 * Skip this check on startup.

> > +	 */

> > +	if (ehci->is_aspeed)

> > +		rc = 0;

> > +	else

> > +		rc = ehci_handshake(ehci, &ehci->regs->status, STS_HALT,

> > +				    0, 100 * 1000);

> 

> You must not do this.  You are assuming the controller will always begin

> operating within 5 ms of the time it is told to start.  What happens if you are

> wrong?

> 

> There must be some way for the aspeed controller's host computer to tell

> when the controller has started running.  Find out what it is and use it.

> 

> Alan Stern


We can check the command RS bit to tell the controller has started running.
I'll sent next patch within this change.
Thanks

-Neal Liu
diff mbox series

Patch

diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
index 10b0365f3439..a539e11502ef 100644
--- a/drivers/usb/host/ehci-hcd.c
+++ b/drivers/usb/host/ehci-hcd.c
@@ -634,7 +634,15 @@  static int ehci_run (struct usb_hcd *hcd)
 	/* Wait until HC become operational */
 	ehci_readl(ehci, &ehci->regs->command);	/* unblock posted writes */
 	msleep(5);
-	rc = ehci_handshake(ehci, &ehci->regs->status, STS_HALT, 0, 100 * 1000);
+
+	/* For Aspeed, STS_HALT also depends on ASS/PSS status.
+	 * Skip this check on startup.
+	 */
+	if (ehci->is_aspeed)
+		rc = 0;
+	else
+		rc = ehci_handshake(ehci, &ehci->regs->status, STS_HALT,
+				    0, 100 * 1000);
 
 	up_write(&ehci_cf_port_reset_rwsem);
 
diff --git a/drivers/usb/host/ehci-platform.c b/drivers/usb/host/ehci-platform.c
index c70f2d0b4aaf..c3dc906274d9 100644
--- a/drivers/usb/host/ehci-platform.c
+++ b/drivers/usb/host/ehci-platform.c
@@ -297,6 +297,12 @@  static int ehci_platform_probe(struct platform_device *dev)
 					  "has-transaction-translator"))
 			hcd->has_tt = 1;
 
+		if (of_device_is_compatible(dev->dev.of_node,
+					    "aspeed,ast2500-ehci") ||
+		    of_device_is_compatible(dev->dev.of_node,
+					    "aspeed,ast2600-ehci"))
+			ehci->is_aspeed = 1;
+
 		if (soc_device_match(quirk_poll_match))
 			priv->quirk_poll = true;
 
diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h
index 80bb823aa9fe..fdd073cc053b 100644
--- a/drivers/usb/host/ehci.h
+++ b/drivers/usb/host/ehci.h
@@ -219,6 +219,7 @@  struct ehci_hcd {			/* one per controller */
 	unsigned		need_oc_pp_cycle:1; /* MPC834X port power */
 	unsigned		imx28_write_fix:1; /* For Freescale i.MX28 */
 	unsigned		spurious_oc:1;
+	unsigned		is_aspeed:1;
 
 	/* required for usb32 quirk */
 	#define OHCI_CTRL_HCFS          (3 << 6)