Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e59e36e7 authored by Olivier Sobrie's avatar Olivier Sobrie Committed by Marc Kleine-Budde
Browse files

can: kvaser_usb: add retries/timeout to kvaser_usb_wait_msg()



On some Kvaser hardware, the firmware returns extra messages after the
request for card info. For instance on a Leaf Light v2:
  --> CMD_GET_CARD_INFO
  <-- CMD_USB_THROTTLE
  <-- CMD_GET_CARD_INFO2
  <-- CMD_GET_CARD_INFO_REQ
When it happens, the probing function fails because we only read
the first usb message.

To overcome this issue, we add a mechanism of retries to the
kvaser_usb_wait_msg() function.

I tested this patch with the following hardware:
 - Kvaser Leaf Light
 - Kvaser Leaf Light v2
 - Kvaser USBCan R

This patch is necessary for the Leaf Light v2 hardware.

Signed-off-by: default avatarOlivier Sobrie <olivier@sobrie.be>
Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
parent 869ba1e6
Loading
Loading
Loading
Loading
+27 −22
Original line number Diff line number Diff line
@@ -379,12 +379,14 @@ static int kvaser_usb_wait_msg(const struct kvaser_usb *dev, u8 id,
	void *buf;
	int actual_len;
	int err;
	int pos = 0;
	int pos;
	unsigned long to = jiffies + msecs_to_jiffies(USB_RECV_TIMEOUT);

	buf = kzalloc(RX_BUFFER_SIZE, GFP_KERNEL);
	if (!buf)
		return -ENOMEM;

	do {
		err = usb_bulk_msg(dev->udev,
				   usb_rcvbulkpipe(dev->udev,
					dev->bulk_in->bEndpointAddress),
@@ -393,6 +395,7 @@ static int kvaser_usb_wait_msg(const struct kvaser_usb *dev, u8 id,
		if (err < 0)
			goto end;

		pos = 0;
		while (pos <= actual_len - MSG_HEADER_LEN) {
			tmp = buf + pos;

@@ -400,7 +403,8 @@ static int kvaser_usb_wait_msg(const struct kvaser_usb *dev, u8 id,
				break;

			if (pos + tmp->len > actual_len) {
			dev_err(dev->udev->dev.parent, "Format error\n");
				dev_err(dev->udev->dev.parent,
					"Format error\n");
				break;
			}

@@ -411,6 +415,7 @@ static int kvaser_usb_wait_msg(const struct kvaser_usb *dev, u8 id,

			pos += tmp->len;
		}
	} while (time_before(jiffies, to));

	err = -EINVAL;