diff options
author | Olivier Sobrie <olivier@sobrie.be> | 2013-10-27 17:07:53 -0400 |
---|---|---|
committer | Marc Kleine-Budde <mkl@pengutronix.de> | 2013-10-31 15:20:23 -0400 |
commit | 896e23bd04ea50a146dffd342e2f96180f0812a5 (patch) | |
tree | c6bb44a17c1e21b09106dc73a54d16affb4beb79 /drivers/net/can | |
parent | 5d0f801a2ccec3b1fdabc3392c8d99ed0413d216 (diff) |
can: kvaser_usb: fix usb endpoints detection
Some devices, like the Kvaser Memorator Professional, have several bulk in
endpoints. Only the first one found must be used by the driver. The same holds
for the bulk out endpoint. The official Kvaser driver (leaf) was used as
reference for this patch.
Cc: linux-stable <stable@vger.kernel.org>
Signed-off-by: Olivier Sobrie <olivier@sobrie.be>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Diffstat (limited to 'drivers/net/can')
-rw-r--r-- | drivers/net/can/usb/kvaser_usb.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/drivers/net/can/usb/kvaser_usb.c b/drivers/net/can/usb/kvaser_usb.c index 3b9546588240..4b2d5ed62b11 100644 --- a/drivers/net/can/usb/kvaser_usb.c +++ b/drivers/net/can/usb/kvaser_usb.c | |||
@@ -1544,9 +1544,9 @@ static int kvaser_usb_init_one(struct usb_interface *intf, | |||
1544 | return 0; | 1544 | return 0; |
1545 | } | 1545 | } |
1546 | 1546 | ||
1547 | static void kvaser_usb_get_endpoints(const struct usb_interface *intf, | 1547 | static int kvaser_usb_get_endpoints(const struct usb_interface *intf, |
1548 | struct usb_endpoint_descriptor **in, | 1548 | struct usb_endpoint_descriptor **in, |
1549 | struct usb_endpoint_descriptor **out) | 1549 | struct usb_endpoint_descriptor **out) |
1550 | { | 1550 | { |
1551 | const struct usb_host_interface *iface_desc; | 1551 | const struct usb_host_interface *iface_desc; |
1552 | struct usb_endpoint_descriptor *endpoint; | 1552 | struct usb_endpoint_descriptor *endpoint; |
@@ -1557,12 +1557,18 @@ static void kvaser_usb_get_endpoints(const struct usb_interface *intf, | |||
1557 | for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { | 1557 | for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { |
1558 | endpoint = &iface_desc->endpoint[i].desc; | 1558 | endpoint = &iface_desc->endpoint[i].desc; |
1559 | 1559 | ||
1560 | if (usb_endpoint_is_bulk_in(endpoint)) | 1560 | if (!*in && usb_endpoint_is_bulk_in(endpoint)) |
1561 | *in = endpoint; | 1561 | *in = endpoint; |
1562 | 1562 | ||
1563 | if (usb_endpoint_is_bulk_out(endpoint)) | 1563 | if (!*out && usb_endpoint_is_bulk_out(endpoint)) |
1564 | *out = endpoint; | 1564 | *out = endpoint; |
1565 | |||
1566 | /* use first bulk endpoint for in and out */ | ||
1567 | if (*in && *out) | ||
1568 | return 0; | ||
1565 | } | 1569 | } |
1570 | |||
1571 | return -ENODEV; | ||
1566 | } | 1572 | } |
1567 | 1573 | ||
1568 | static int kvaser_usb_probe(struct usb_interface *intf, | 1574 | static int kvaser_usb_probe(struct usb_interface *intf, |
@@ -1576,8 +1582,8 @@ static int kvaser_usb_probe(struct usb_interface *intf, | |||
1576 | if (!dev) | 1582 | if (!dev) |
1577 | return -ENOMEM; | 1583 | return -ENOMEM; |
1578 | 1584 | ||
1579 | kvaser_usb_get_endpoints(intf, &dev->bulk_in, &dev->bulk_out); | 1585 | err = kvaser_usb_get_endpoints(intf, &dev->bulk_in, &dev->bulk_out); |
1580 | if (!dev->bulk_in || !dev->bulk_out) { | 1586 | if (err) { |
1581 | dev_err(&intf->dev, "Cannot get usb endpoint(s)"); | 1587 | dev_err(&intf->dev, "Cannot get usb endpoint(s)"); |
1582 | return err; | 1588 | return err; |
1583 | } | 1589 | } |