diff options
author | Ahmed S. Darwish <ahmed.darwish@valeo.com> | 2015-01-26 00:24:06 -0500 |
---|---|---|
committer | Marc Kleine-Budde <mkl@pengutronix.de> | 2015-01-27 02:55:09 -0500 |
commit | 14c10c2a1dd8eb8e00b750b521753260befa2789 (patch) | |
tree | 9519bad0fd1b08825e52bf264485296bd3913e3b /drivers/net/can | |
parent | 3803fa6977f1de15fda4e8646c8fec97c8045cae (diff) |
can: kvaser_usb: Retry the first bulk transfer on -ETIMEDOUT
On some x86 laptops, plugging a Kvaser device again after an
unplug makes the firmware always ignore the very first command.
For such a case, provide some room for retries instead of
completely exiting the driver init code.
Signed-off-by: Ahmed S. Darwish <ahmed.darwish@valeo.com>
Cc: linux-stable <stable@vger.kernel.org>
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 | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/drivers/net/can/usb/kvaser_usb.c b/drivers/net/can/usb/kvaser_usb.c index f0c62075df0a..55407b9663a6 100644 --- a/drivers/net/can/usb/kvaser_usb.c +++ b/drivers/net/can/usb/kvaser_usb.c | |||
@@ -1585,7 +1585,7 @@ static int kvaser_usb_probe(struct usb_interface *intf, | |||
1585 | { | 1585 | { |
1586 | struct kvaser_usb *dev; | 1586 | struct kvaser_usb *dev; |
1587 | int err = -ENOMEM; | 1587 | int err = -ENOMEM; |
1588 | int i; | 1588 | int i, retry = 3; |
1589 | 1589 | ||
1590 | dev = devm_kzalloc(&intf->dev, sizeof(*dev), GFP_KERNEL); | 1590 | dev = devm_kzalloc(&intf->dev, sizeof(*dev), GFP_KERNEL); |
1591 | if (!dev) | 1591 | if (!dev) |
@@ -1603,7 +1603,15 @@ static int kvaser_usb_probe(struct usb_interface *intf, | |||
1603 | 1603 | ||
1604 | usb_set_intfdata(intf, dev); | 1604 | usb_set_intfdata(intf, dev); |
1605 | 1605 | ||
1606 | err = kvaser_usb_get_software_info(dev); | 1606 | /* On some x86 laptops, plugging a Kvaser device again after |
1607 | * an unplug makes the firmware always ignore the very first | ||
1608 | * command. For such a case, provide some room for retries | ||
1609 | * instead of completely exiting the driver. | ||
1610 | */ | ||
1611 | do { | ||
1612 | err = kvaser_usb_get_software_info(dev); | ||
1613 | } while (--retry && err == -ETIMEDOUT); | ||
1614 | |||
1607 | if (err) { | 1615 | if (err) { |
1608 | dev_err(&intf->dev, | 1616 | dev_err(&intf->dev, |
1609 | "Cannot get software infos, error %d\n", err); | 1617 | "Cannot get software infos, error %d\n", err); |