| From 896e23bd04ea50a146dffd342e2f96180f0812a5 Mon Sep 17 00:00:00 2001 |
| From: Olivier Sobrie <olivier@sobrie.be> |
| Date: Sun, 27 Oct 2013 22:07:53 +0100 |
| Subject: can: kvaser_usb: fix usb endpoints detection |
| |
| From: Olivier Sobrie <olivier@sobrie.be> |
| |
| commit 896e23bd04ea50a146dffd342e2f96180f0812a5 upstream. |
| |
| 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. |
| |
| Signed-off-by: Olivier Sobrie <olivier@sobrie.be> |
| Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/net/can/usb/kvaser_usb.c | 20 +++++++++++++------- |
| 1 file changed, 13 insertions(+), 7 deletions(-) |
| |
| --- 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 us |
| return 0; |
| } |
| |
| -static void kvaser_usb_get_endpoints(const struct usb_interface *intf, |
| - struct usb_endpoint_descriptor **in, |
| - struct usb_endpoint_descriptor **out) |
| +static int kvaser_usb_get_endpoints(const struct usb_interface *intf, |
| + struct usb_endpoint_descriptor **in, |
| + struct usb_endpoint_descriptor **out) |
| { |
| const struct usb_host_interface *iface_desc; |
| struct usb_endpoint_descriptor *endpoint; |
| @@ -1557,12 +1557,18 @@ static void kvaser_usb_get_endpoints(con |
| for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { |
| endpoint = &iface_desc->endpoint[i].desc; |
| |
| - if (usb_endpoint_is_bulk_in(endpoint)) |
| + if (!*in && usb_endpoint_is_bulk_in(endpoint)) |
| *in = endpoint; |
| |
| - if (usb_endpoint_is_bulk_out(endpoint)) |
| + if (!*out && usb_endpoint_is_bulk_out(endpoint)) |
| *out = endpoint; |
| + |
| + /* use first bulk endpoint for in and out */ |
| + if (*in && *out) |
| + return 0; |
| } |
| + |
| + return -ENODEV; |
| } |
| |
| static int kvaser_usb_probe(struct usb_interface *intf, |
| @@ -1576,8 +1582,8 @@ static int kvaser_usb_probe(struct usb_i |
| if (!dev) |
| return -ENOMEM; |
| |
| - kvaser_usb_get_endpoints(intf, &dev->bulk_in, &dev->bulk_out); |
| - if (!dev->bulk_in || !dev->bulk_out) { |
| + err = kvaser_usb_get_endpoints(intf, &dev->bulk_in, &dev->bulk_out); |
| + if (err) { |
| dev_err(&intf->dev, "Cannot get usb endpoint(s)"); |
| return err; |
| } |