Re: [PATCH v2 1/1] USB: EHCI: add condition for delay during the resume

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, 17 Oct 2012, Peter Chen wrote:

> Without this condition, all controllers will do this delay,
> and increase the resume time.
> 
> Only enabled and unsuspended port needs this delay, but
> Some buggy hardware(like Synopsys usb controller) will
> clear suspend bit once they receive/send resume signal,
> so it takes resume bit as consideration.
> 
> Tested it at Freescale i.mx6q Sabrelite board.
> 
> Signed-off-by: Peter Chen <peter.chen@xxxxxxxxxxxxx>
> ---
> 
> Changes for v2:
> - Fix some coding style problem
> - Change ehci_warn to ehci_dbg
> 
>  drivers/usb/host/ehci-hub.c |   23 ++++++++++++++++++-----
>  1 files changed, 18 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c
> index 914ce93..394bcda 100644
> --- a/drivers/usb/host/ehci-hub.c
> +++ b/drivers/usb/host/ehci-hub.c
> @@ -384,11 +384,24 @@ static int ehci_bus_resume (struct usb_hcd *hcd)
>  	ehci_writel(ehci, ehci->command, &ehci->regs->command);
>  	ehci->rh_state = EHCI_RH_RUNNING;
>  
> -	/* Some controller/firmware combinations need a delay during which
> -	 * they set up the port statuses.  See Bugzilla #8190. */
> -	spin_unlock_irq(&ehci->lock);
> -	msleep(8);
> -	spin_lock_irq(&ehci->lock);
> +	/*
> +	 * According to Bugzilla #8190, the port status for some controllers
> +	 * will be wrong without a delay. At their wrong status, the port
> +	 * is enabled, but not suspended neither resumed.
> +	 */
> +	i = HCS_N_PORTS(ehci->hcs_params);
> +	while (i--) {
> +		temp = ehci_readl(ehci, &ehci->regs->port_status[i]);
> +		if ((temp & PORT_PE) &&
> +			!(temp & (PORT_SUSPEND | PORT_RESUME))) {

This continuation line should be indented by one more tab stop, so that 
it doesn't look like part of the body of the "if" statement.  Maybe 
Greg can adjust this when he applies the patch.

> +			ehci_dbg(ehci, "Port status(0x%x) is wrong\n", temp);
> +			spin_unlock_irq(&ehci->lock);
> +			msleep(8);
> +			spin_lock_irq(&ehci->lock);
> +			break;
> +		}
> +	}
> +
>  	if (ehci->shutdown)
>  		goto shutdown;
>  

Otherwise this is fine.

Acked-by: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx>

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux