Re: [PATCH] xHCI: Clear PLC in xhci_bus_resume()

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

 



On Fri, Apr 15, 2011 at 01:53:43PM +0800, Andiry Xu wrote:
> This patch clears PORT_PLC if xhci_bus_resume() resumes a previous suspended
> port, because if a port transition from U3 to U0 state, it will report a
> port link state change, and software should clear the corresponding PLC bit.
> 
> It also uses hcd->speed to check if a port is a USB2 protocol port.

Do you mean that you've changed the check to look for if this port can
handle low speed, full speed, or high speed devices?  Because it looks
like the previous check only looked for high speed devices, and this new
check will match all ports that are not SuperSpeed ports (i.e.
LS/FS/HS).

> The patch fixes the issue that USB keyboard can not wakeup system from
> hibernation.
> 
> Signed-off-by: Andiry Xu <andiry.xu@xxxxxxx>
> ---
>  drivers/usb/host/xhci-hub.c |   16 ++++++++++++++--
>  1 files changed, 14 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c
> index a78f2eb..8647008 100644
> --- a/drivers/usb/host/xhci-hub.c
> +++ b/drivers/usb/host/xhci-hub.c
> @@ -777,7 +777,7 @@ int xhci_bus_suspend(struct usb_hcd *hcd)
>  		if (t1 != t2)
>  			xhci_writel(xhci, t2, port_array[port_index]);
>  
> -		if (DEV_HIGHSPEED(t1)) {
> +		if (hcd->speed != HCD_USB3) {
>  			/* enable remote wake up for USB 2.0 */
>  			u32 __iomem *addr;
>  			u32 tmp;
> @@ -866,6 +866,18 @@ int xhci_bus_resume(struct usb_hcd *hcd)
>  				temp |= PORT_LINK_STROBE | XDEV_U0;
>  				xhci_writel(xhci, temp, port_array[port_index]);
>  			}
> +			spin_unlock_irqrestore(&xhci->lock, flags);
> +			msleep(20);
> +			spin_lock_irqsave(&xhci->lock, flags);

What's the purpose of this msleep?  Are you waiting for the port link
state to change?  Is that time constant, or can it vary on different
host controllers?

Can you add some documentation about the msleep, preferably as a comment
in the code?

> +
> +			/* Clear PLC */
> +			temp = xhci_readl(xhci, port_array[port_index]);
> +			if (temp & PORT_PLC) {
> +				temp = xhci_port_state_to_neutral(temp);
> +				temp |= PORT_PLC;
> +				xhci_writel(xhci, temp, port_array[port_index]);
> +			}
> +
>  			slot_id = xhci_find_slot_id_by_port(hcd,
>  					xhci, port_index + 1);
>  			if (slot_id)
> @@ -873,7 +885,7 @@ int xhci_bus_resume(struct usb_hcd *hcd)
>  		} else
>  			xhci_writel(xhci, temp, port_array[port_index]);
>  
> -		if (DEV_HIGHSPEED(temp)) {
> +		if (hcd->speed != HCD_USB3) {
>  			/* disable remote wake up for USB 2.0 */
>  			u32 __iomem *addr;
>  			u32 tmp;

Sarah Sharp
--
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