[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 <hdegoede@redhat.com> Signed-off-by: Jean-François Moine <moinejf@free.fr> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
66957b8646
commit
d0d3435b21
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue