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