From: Hans de Goede Date: Fri, 30 Dec 2011 11:20:50 +0000 (-0300) Subject: [media] gspca - main: Correct use of interval in bandwidth calculation X-Git-Tag: v3.12-rc1~3230^2~225 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d0d3435b212f88aebee6a06e002e4fd3b487a918;p=kernel%2Fkernel-generic.git [media] gspca - main: Correct use of interval in bandwidth calculation The calculated bandwidth should not be multiplied by the interval, but be divided by it. Also bInterbval should be interpreted as a power of 2 for isochronous endpoints. Signed-off-by: Hans de Goede Signed-off-by: Jean-François Moine Signed-off-by: Mauro Carvalho Chehab --- diff --git a/drivers/media/video/gspca/gspca.c b/drivers/media/video/gspca/gspca.c index 5b8f4fc..a82d45e 100644 --- a/drivers/media/video/gspca/gspca.c +++ b/drivers/media/video/gspca/gspca.c @@ -698,12 +698,17 @@ static int build_isoc_ep_tb(struct gspca_dev *gspca_dev, USB_ENDPOINT_XFER_ISOC); if (ep == NULL) continue; + if (ep->desc.bInterval == 0) { + pr_err("alt %d iso endp with 0 interval\n", j); + continue; + } psize = le16_to_cpu(ep->desc.wMaxPacketSize); psize = (psize & 0x07ff) * (1 + ((psize >> 11) & 3)); - bandwidth = psize * ep->desc.bInterval * 1000; + bandwidth = psize * 1000; if (gspca_dev->dev->speed == USB_SPEED_HIGH || gspca_dev->dev->speed == USB_SPEED_SUPER) bandwidth *= 8; + bandwidth /= 1 << (ep->desc.bInterval - 1); if (bandwidth <= last_bw) continue; if (bandwidth < ep_tb->bandwidth) {