aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/usb/cx231xx/cx231xx-cards.c')
-rw-r--r--drivers/media/usb/cx231xx/cx231xx-cards.c45
1 files changed, 40 insertions, 5 deletions
diff --git a/drivers/media/usb/cx231xx/cx231xx-cards.c b/drivers/media/usb/cx231xx/cx231xx-cards.c
index 8389c162bc89..2c5f76d588ac 100644
--- a/drivers/media/usb/cx231xx/cx231xx-cards.c
+++ b/drivers/media/usb/cx231xx/cx231xx-cards.c
@@ -1447,6 +1447,9 @@ static int cx231xx_init_v4l2(struct cx231xx *dev,
1447 1447
1448 uif = udev->actconfig->interface[idx]; 1448 uif = udev->actconfig->interface[idx];
1449 1449
1450 if (uif->altsetting[0].desc.bNumEndpoints < isoc_pipe + 1)
1451 return -ENODEV;
1452
1450 dev->video_mode.end_point_addr = uif->altsetting[0].endpoint[isoc_pipe].desc.bEndpointAddress; 1453 dev->video_mode.end_point_addr = uif->altsetting[0].endpoint[isoc_pipe].desc.bEndpointAddress;
1451 dev->video_mode.num_alt = uif->num_altsetting; 1454 dev->video_mode.num_alt = uif->num_altsetting;
1452 1455
@@ -1460,7 +1463,12 @@ static int cx231xx_init_v4l2(struct cx231xx *dev,
1460 return -ENOMEM; 1463 return -ENOMEM;
1461 1464
1462 for (i = 0; i < dev->video_mode.num_alt; i++) { 1465 for (i = 0; i < dev->video_mode.num_alt; i++) {
1463 u16 tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].desc.wMaxPacketSize); 1466 u16 tmp;
1467
1468 if (uif->altsetting[i].desc.bNumEndpoints < isoc_pipe + 1)
1469 return -ENODEV;
1470
1471 tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].desc.wMaxPacketSize);
1464 dev->video_mode.alt_max_pkt_size[i] = (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1); 1472 dev->video_mode.alt_max_pkt_size[i] = (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
1465 dev_dbg(dev->dev, 1473 dev_dbg(dev->dev,
1466 "Alternate setting %i, max size= %i\n", i, 1474 "Alternate setting %i, max size= %i\n", i,
@@ -1477,6 +1485,9 @@ static int cx231xx_init_v4l2(struct cx231xx *dev,
1477 } 1485 }
1478 uif = udev->actconfig->interface[idx]; 1486 uif = udev->actconfig->interface[idx];
1479 1487
1488 if (uif->altsetting[0].desc.bNumEndpoints < isoc_pipe + 1)
1489 return -ENODEV;
1490
1480 dev->vbi_mode.end_point_addr = 1491 dev->vbi_mode.end_point_addr =
1481 uif->altsetting[0].endpoint[isoc_pipe].desc. 1492 uif->altsetting[0].endpoint[isoc_pipe].desc.
1482 bEndpointAddress; 1493 bEndpointAddress;
@@ -1493,8 +1504,12 @@ static int cx231xx_init_v4l2(struct cx231xx *dev,
1493 return -ENOMEM; 1504 return -ENOMEM;
1494 1505
1495 for (i = 0; i < dev->vbi_mode.num_alt; i++) { 1506 for (i = 0; i < dev->vbi_mode.num_alt; i++) {
1496 u16 tmp = 1507 u16 tmp;
1497 le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe]. 1508
1509 if (uif->altsetting[i].desc.bNumEndpoints < isoc_pipe + 1)
1510 return -ENODEV;
1511
1512 tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].
1498 desc.wMaxPacketSize); 1513 desc.wMaxPacketSize);
1499 dev->vbi_mode.alt_max_pkt_size[i] = 1514 dev->vbi_mode.alt_max_pkt_size[i] =
1500 (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1); 1515 (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
@@ -1514,6 +1529,9 @@ static int cx231xx_init_v4l2(struct cx231xx *dev,
1514 } 1529 }
1515 uif = udev->actconfig->interface[idx]; 1530 uif = udev->actconfig->interface[idx];
1516 1531
1532 if (uif->altsetting[0].desc.bNumEndpoints < isoc_pipe + 1)
1533 return -ENODEV;
1534
1517 dev->sliced_cc_mode.end_point_addr = 1535 dev->sliced_cc_mode.end_point_addr =
1518 uif->altsetting[0].endpoint[isoc_pipe].desc. 1536 uif->altsetting[0].endpoint[isoc_pipe].desc.
1519 bEndpointAddress; 1537 bEndpointAddress;
@@ -1528,7 +1546,12 @@ static int cx231xx_init_v4l2(struct cx231xx *dev,
1528 return -ENOMEM; 1546 return -ENOMEM;
1529 1547
1530 for (i = 0; i < dev->sliced_cc_mode.num_alt; i++) { 1548 for (i = 0; i < dev->sliced_cc_mode.num_alt; i++) {
1531 u16 tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe]. 1549 u16 tmp;
1550
1551 if (uif->altsetting[i].desc.bNumEndpoints < isoc_pipe + 1)
1552 return -ENODEV;
1553
1554 tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].
1532 desc.wMaxPacketSize); 1555 desc.wMaxPacketSize);
1533 dev->sliced_cc_mode.alt_max_pkt_size[i] = 1556 dev->sliced_cc_mode.alt_max_pkt_size[i] =
1534 (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1); 1557 (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
@@ -1693,6 +1716,11 @@ static int cx231xx_usb_probe(struct usb_interface *interface,
1693 } 1716 }
1694 uif = udev->actconfig->interface[idx]; 1717 uif = udev->actconfig->interface[idx];
1695 1718
1719 if (uif->altsetting[0].desc.bNumEndpoints < isoc_pipe + 1) {
1720 retval = -ENODEV;
1721 goto err_video_alt;
1722 }
1723
1696 dev->ts1_mode.end_point_addr = 1724 dev->ts1_mode.end_point_addr =
1697 uif->altsetting[0].endpoint[isoc_pipe]. 1725 uif->altsetting[0].endpoint[isoc_pipe].
1698 desc.bEndpointAddress; 1726 desc.bEndpointAddress;
@@ -1710,7 +1738,14 @@ static int cx231xx_usb_probe(struct usb_interface *interface,
1710 } 1738 }
1711 1739
1712 for (i = 0; i < dev->ts1_mode.num_alt; i++) { 1740 for (i = 0; i < dev->ts1_mode.num_alt; i++) {
1713 u16 tmp = le16_to_cpu(uif->altsetting[i]. 1741 u16 tmp;
1742
1743 if (uif->altsetting[i].desc.bNumEndpoints < isoc_pipe + 1) {
1744 retval = -ENODEV;
1745 goto err_video_alt;
1746 }
1747
1748 tmp = le16_to_cpu(uif->altsetting[i].
1714 endpoint[isoc_pipe].desc. 1749 endpoint[isoc_pipe].desc.
1715 wMaxPacketSize); 1750 wMaxPacketSize);
1716 dev->ts1_mode.alt_max_pkt_size[i] = 1751 dev->ts1_mode.alt_max_pkt_size[i] =