[media] gspca - main: Correct use of interval in bandwidth calculation
authorHans de Goede <hdegoede@redhat.com>
Fri, 30 Dec 2011 11:20:50 +0000 (08:20 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Fri, 6 Jan 2012 11:01:18 +0000 (09:01 -0200)
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 <hdegoede@redhat.com>
Signed-off-by: Jean-François Moine <moinejf@free.fr>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/gspca/gspca.c

index 5b8f4fc5d1c6d2c2b5128ead3194a392527e8404..a82d45e5789646dcedaa87f8068d9f70a2394958 100644 (file)
@@ -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) {