diff options
Diffstat (limited to 'drivers/media/usb/cx231xx/cx231xx-cards.c')
-rw-r--r-- | drivers/media/usb/cx231xx/cx231xx-cards.c | 45 |
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] = |