lkml.org 
[lkml]   [2016]   [Nov]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
SubjectRE: [PATCH v3] fsl/usb: Workarourd for USB erratum-A005697
Date
Thanks a lot, Alan.
That is my fault, will fix it and send one new version.

Best Regards
Jerry Huang


-----Original Message-----
From: Alan Stern [mailto:stern@rowland.harvard.edu]
Sent: Monday, November 28, 2016 11:58 PM
To: Jerry Huang <jerry.huang@nxp.com>
Cc: gregkh@linuxfoundation.org; Ramneek Mehresh <ramneek.mehresh@nxp.com>; julia.lawall@lip6.fr; Sriram Dash <sriram.dash@nxp.com>; linux-usb@vger.kernel.org; linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3] fsl/usb: Workarourd for USB erratum-A005697

On Mon, 28 Nov 2016, Changming Huang wrote:

> The EHCI specification states the following in the SUSP bit description:
> In the Suspend state, the port is sensitive to resume detection.
> Note that the bit status does not change until the port is suspended
> and that there may be a delay in suspending a port if there is a
> transaction currently in progress on the USB.
>
> However, in NXP USBDR controller, the PORTSCx[SUSP] bit changes
> immediately when the application sets it and not when the port is actually suspended.
>
> So the application must wait for at least 10 milliseconds after a port
> indicates that it is suspended, to make sure this port has entered
> suspended state before initiating this port resume using the Force
> Port Resume bit. This bit is for NXP controller, not EHCI compatible.
>
> Signed-off-by: Changming Huang <jerry.huang@nxp.com>
> Signed-off-by: Ramneek Mehresh <ramneek.mehresh@nxp.com>
> ---
> Changes in v3:
> - add 10ms delay in function ehci_hub_control
> - fix typos
> Changes in v2:
> - move sleep out of spin-lock
> - add more comment for this workaround

> --- a/drivers/usb/host/ehci-hub.c
> +++ b/drivers/usb/host/ehci-hub.c
> @@ -310,6 +310,14 @@ static int ehci_bus_suspend (struct usb_hcd *hcd)
> }
> spin_unlock_irq(&ehci->lock);
>
> + if (changed && ehci_has_fsl_susp_errata(ehci))
> + /*
> + * Wait for at least 10 millisecondes to ensure the controller
> + * enter the suspend status before initiating a port resume
> + * using the Force Port Resume bit (Not-EHCI compatible).
> + */
> + usleep_range(10000, 20000);
> +
> if ((changed && ehci->has_tdi_phy_lpm) || fs_idle_delay) {
> /*
> * Wait for HCD to enter low-power mode or for the bus @@ -1200,6
> +1208,9 @@ int ehci_hub_control(
> wIndex, (temp1 & HOSTPC_PHCD) ?
> "succeeded" : "failed");
> }
> + if (ehci_has_fsl_susp_errata(ehci))
> + /* 10ms for HCD enter suspend */
> + usleep_range(10000, 20000);
> set_bit(wIndex, &ehci->suspended_ports);
> break;

Just like before, you have to release the spinlock before sleeping.
Look at the code 10 lines above this.

Alan Stern

\
 
 \ /
  Last update: 2016-11-29 04:14    [W:0.081 / U:0.180 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site