Message ID | 20210910073619.26095-1-neal_liu@aspeedtech.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 7f2d73788d9067fd4f677ac5f60ffd25945af7af |
Headers | show |
Series | [v4] usb: ehci: handshake CMD_RUN instead of STS_HALT | expand |
Hi Greg, On Fri, 10 Sept 2021 at 07:38, Neal Liu <neal_liu@aspeedtech.com> wrote: > > For Aspeed, HCHalted status depends on not only Run/Stop but also > ASS/PSS status. > Handshake CMD_RUN on startup instead. > > Signed-off-by: Neal Liu <neal_liu@aspeedtech.com> > Acked-by: Alan Stern <stern@rowland.harvard.edu> > Reviewed-by: Tao Ren <rentao.bupt@gmail.com> > Tested-by: Tao Ren <rentao.bupt@gmail.com> Has this one gone in? If not, here's some tags: Reviewed-by: Joel Stanley <joel@jms.id.au> It also needs to go to stable: Cc: stable@vger.kernel.org Fixes: 280a9045bb18 ("ehci: fix EHCI host controller initialization sequence") Cheers, Joel > --- > drivers/usb/host/ehci-hcd.c | 11 ++++++++++- > drivers/usb/host/ehci-platform.c | 6 ++++++ > drivers/usb/host/ehci.h | 1 + > 3 files changed, 17 insertions(+), 1 deletion(-) > > --- > Fix STS_HALT handshake failure for Aspeed 2500/2600 platform. > > Change since v3: > - Add more description. > > Change since v2: > - Use my "real" name for both the Signed-off-by: line and the From: line. > > Change since v1: > - Handshake CMD_RUN status on startup instead of easily skip it. > --- > > diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c > index 6bdc6d6bf74d..55f92d25336b 100644 > --- a/drivers/usb/host/ehci-hcd.c > +++ b/drivers/usb/host/ehci-hcd.c > @@ -634,7 +634,16 @@ 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. > + * Check CMD_RUN instead. > + */ > + if (ehci->is_aspeed) > + rc = ehci_handshake(ehci, &ehci->regs->command, CMD_RUN, > + 1, 100 * 1000); > + 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) > -- > 2.25.1 >
On Wed, Oct 06, 2021 at 01:27:02AM +0000, Joel Stanley wrote: > Hi Greg, > > On Fri, 10 Sept 2021 at 07:38, Neal Liu <neal_liu@aspeedtech.com> wrote: > > > > For Aspeed, HCHalted status depends on not only Run/Stop but also > > ASS/PSS status. > > Handshake CMD_RUN on startup instead. > > > > Signed-off-by: Neal Liu <neal_liu@aspeedtech.com> > > Acked-by: Alan Stern <stern@rowland.harvard.edu> > > Reviewed-by: Tao Ren <rentao.bupt@gmail.com> > > Tested-by: Tao Ren <rentao.bupt@gmail.com> > > Has this one gone in? If not, here's some tags: > > Reviewed-by: Joel Stanley <joel@jms.id.au> > > It also needs to go to stable: > > Cc: stable@vger.kernel.org > Fixes: 280a9045bb18 ("ehci: fix EHCI host controller initialization sequence") This is already in my tree, but waiting until 5.16-rc1, sorry. You can see it at commit 7f2d73788d90 ("usb: ehci: handshake CMD_RUN instead of STS_HALT") in linux-next. I'll try to remember to queue it up in stable after it hits Linus's tree. thanks, greg k-h
On Wed, Oct 06, 2021 at 01:27:02AM +0000, Joel Stanley wrote: > Hi Greg, > > On Fri, 10 Sept 2021 at 07:38, Neal Liu <neal_liu@aspeedtech.com> wrote: > > > > For Aspeed, HCHalted status depends on not only Run/Stop but also > > ASS/PSS status. > > Handshake CMD_RUN on startup instead. > > > > Signed-off-by: Neal Liu <neal_liu@aspeedtech.com> > > Acked-by: Alan Stern <stern@rowland.harvard.edu> > > Reviewed-by: Tao Ren <rentao.bupt@gmail.com> > > Tested-by: Tao Ren <rentao.bupt@gmail.com> > > Has this one gone in? If not, here's some tags: > > Reviewed-by: Joel Stanley <joel@jms.id.au> > > It also needs to go to stable: > > Cc: stable@vger.kernel.org > Fixes: 280a9045bb18 ("ehci: fix EHCI host controller initialization sequence") This patch failed to apply to 4.4.y, 4.9.y, and 4.14.y, so could you provide a working backport for those kernels for me to be able to queue it up to the stable queues there? thanks, greg k-h
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 6bdc6d6bf74d..55f92d25336b 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c @@ -634,7 +634,16 @@ 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. + * Check CMD_RUN instead. + */ + if (ehci->is_aspeed) + rc = ehci_handshake(ehci, &ehci->regs->command, CMD_RUN, + 1, 100 * 1000); + 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)