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

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

 



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