Re: [PATCH] usb: host: xhci: fix compliance mode workaround

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

 



On Wed, Aug 27, 2014 at 04:38:04PM -0500, Felipe Balbi wrote:
> Commit 71c731a (usb: host: xhci: Fix Compliance Mode
> on SN65LVP3502CP Hardware) implemented a workaround
> for a known issue with Texas Instruments' USB 3.0
> redriver IC but it left a condition where any xHCI
> host would be taken out of reset if port was placed
> in compliance mode and there was no device connected
> to the port.
> 
> That condition would trigger a fake connection to a
> non-existent device so that usbcore would trigger a
> warm reset of the port, thus taking the link out of
> reset.
> 
> This has the side-effect of preventing any xHCI host
> connected to a Linux machine from starting and running
> the USB 3.0 Electrical Compliance Suite because the
> port will mysteriously taken out of compliance mode
> and, thus, xHCI won't step through the necessary
> compliance patterns for link validation.
> 
> This patch fixes the issue by just adding a missing
> check for XHCI_COMP_MODE_QUIRK inside
> xhci_hub_report_usb3_link_state() when PORT_CAS isn't
> set.
> 
> This patch should be backported to all kernels containing
> commit 71c731a.
> 
> Fixes: 71c731a (usb: host: xhci: Fix Compliance Mode on SN65LVP3502CP Hardware)
> Cc: Alexis R. Cortes <alexis.cortes@xxxxxx>
> Cc: <stable@xxxxxxxxxxxxxxx> # v3.2+
> Signed-off-by: Felipe Balbi <balbi@xxxxxx>
> ---
> 
> This has been tested on a certification setup with LeCroy Voyager M3i
> and a really expensive oscilloscope :-)
> 
> Without this patch we cannot keep the host in compliance.
> 
>  drivers/usb/host/xhci-hub.c | 8 +++++---
>  1 file changed, 5 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c
> index aa79e87..69aece3 100644
> --- a/drivers/usb/host/xhci-hub.c
> +++ b/drivers/usb/host/xhci-hub.c
> @@ -468,7 +468,8 @@ static void xhci_hub_report_usb2_link_state(u32 *status, u32 status_reg)
>  }
>  
>  /* Updates Link Status for super Speed port */
> -static void xhci_hub_report_usb3_link_state(u32 *status, u32 status_reg)
> +static void xhci_hub_report_usb3_link_state(struct xhci_hcd *xhci,
> +		u32 *status, u32 status_reg)
>  {
>  	u32 pls = status_reg & PORT_PLS_MASK;
>  
> @@ -507,7 +508,8 @@ static void xhci_hub_report_usb3_link_state(u32 *status, u32 status_reg)
>  		 * in which sometimes the port enters compliance mode
>  		 * caused by a delay on the host-device negotiation.
>  		 */
> -		if (pls == USB_SS_PORT_LS_COMP_MOD)
> +		if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) &&
> +				(pls == USB_SS_PORT_LS_COMP_MOD))
>  			pls |= USB_PORT_STAT_CONNECTION;
>  	}
>  
> @@ -666,7 +668,7 @@ static u32 xhci_get_port_status(struct usb_hcd *hcd,
>  	}
>  	/* Update Port Link State */
>  	if (hcd->speed == HCD_USB3) {
> -		xhci_hub_report_usb3_link_state(&status, raw_port_status);
> +		xhci_hub_report_usb3_link_state(xhci, &status, raw_port_status);
>  		/*
>  		 * Verify if all USB3 Ports Have entered U0 already.
>  		 * Delete Compliance Mode Timer if so.

Looks good, Mathias, can I get an ACK so I can queue this up now?

thanks,

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




[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]