← Back to team overview

canonical-kernel-sru-team team mailing list archive

[Fwd: Re: [PATCH 6/6] USB: xhci - fix interval calculation for FS isoc endpoints]

 

-------- Forwarded Message --------
From: Sarah Sharp <sarah.a.sharp@xxxxxxxxxxxxxxx>
To: Greg Kroah-Hartman <gregkh@xxxxxxx>
Cc: Dmitry Torokhov <dtor@xxxxxxxxxx>, linux-usb@xxxxxxxxxxxxxxx, Matt
Evans <matt@xxxxxxxxxx>, Steve Conklin <sconklin@xxxxxxxxxxxxx>
Subject: Re: [PATCH 6/6] USB: xhci - fix interval calculation for FS
isoc endpoints
Date: Sun, 5 Jun 2011 21:00:52 -0700

Hi Greg,

Looks like I mentioned that this needs to be backported to stable, but
didn't actually Cc stable@xxxxxxxxxx in the commit.  I'll send an
updated pull request shortly.

Sarah Sharp

On Thu, Jun 02, 2011 at 06:45:37PM -0700, Sarah Sharp wrote:
> From: Dmitry Torokhov <dtor@xxxxxxxxxx>
> 
> Full-speed isoc endpoints specify interval in exponent based form in
> frames, not microframes, so we need to adjust accordingly.
> 
> NEC xHCI host controllers will return an error code of 0x11 if a full
> speed isochronous endpoint is added with the Interval field set to
> something less than 3 (2^3 = 8 microframes, or one frame).  It is
> impossible for a full speed device to have an interval smaller than one
> frame.
> 
> This was always an issue in the xHCI driver, but commit
> dfa49c4ad120a784ef1ff0717168aa79f55a483a "USB: xhci - fix math in
> xhci_get_endpoint_interval()" removed the clamping of the minimum value
> in the Interval field, which revealed this bug.
> 
> This needs to be backported to stable kernels back to 2.6.31.
> 
> Reported-by: Matt Evans <matt@xxxxxxxxxx>
> Signed-off-by: Dmitry Torokhov <dtor@xxxxxxxxxx>
> Signed-off-by: Sarah Sharp <sarah.a.sharp@xxxxxxxxxxxxxxx>
> ---
>  drivers/usb/host/xhci-mem.c |   14 ++++++++++++--
>  1 files changed, 12 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
> index 26caba4..0f8e1d2 100644
> --- a/drivers/usb/host/xhci-mem.c
> +++ b/drivers/usb/host/xhci-mem.c
> @@ -985,9 +985,19 @@ static unsigned int xhci_parse_exponent_interval(struct usb_device *udev,
>  	interval = clamp_val(ep->desc.bInterval, 1, 16) - 1;
>  	if (interval != ep->desc.bInterval - 1)
>  		dev_warn(&udev->dev,
> -			 "ep %#x - rounding interval to %d microframes\n",
> +			 "ep %#x - rounding interval to %d %sframes\n",
>  			 ep->desc.bEndpointAddress,
> -			 1 << interval);
> +			 1 << interval,
> +			 udev->speed == USB_SPEED_FULL ? "" : "micro");
> +
> +	if (udev->speed == USB_SPEED_FULL) {
> +		/*
> +		 * Full speed isoc endpoints specify interval in frames,
> +		 * not microframes. We are using microframes everywhere,
> +		 * so adjust accordingly.
> +		 */
> +		interval += 3;	/* 1 frame = 2^3 uframes */
> +	}
>  
>  	return interval;
>  }
> -- 
> 1.7.4.1
> 
> --
> 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

Attachment: signature.asc
Description: This is a digitally signed message part