Commit 8d8d67f1 authored by David S. Miller's avatar David S. Miller

Merge tag 'linux-can-fixes-for-3.19-20150127' of...

Merge tag 'linux-can-fixes-for-3.19-20150127' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can

Marc Kleine-Budde says:

====================
pull-request: can 2015-01-27

this is another pull request for net/master which consists of 4 patches.

All 4 patches are contributed by Ahmed S. Darwish, he fixes more problems in
the kvaser_usb driver.

David, please merge net/master to net-next/master, as we have more kvaser_usb
patches in the queue, that target net-next.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents fc752f1f e638642b
...@@ -587,7 +587,7 @@ static int kvaser_usb_simple_msg_async(struct kvaser_usb_net_priv *priv, ...@@ -587,7 +587,7 @@ static int kvaser_usb_simple_msg_async(struct kvaser_usb_net_priv *priv,
usb_sndbulkpipe(dev->udev, usb_sndbulkpipe(dev->udev,
dev->bulk_out->bEndpointAddress), dev->bulk_out->bEndpointAddress),
buf, msg->len, buf, msg->len,
kvaser_usb_simple_msg_callback, priv); kvaser_usb_simple_msg_callback, netdev);
usb_anchor_urb(urb, &priv->tx_submitted); usb_anchor_urb(urb, &priv->tx_submitted);
err = usb_submit_urb(urb, GFP_ATOMIC); err = usb_submit_urb(urb, GFP_ATOMIC);
...@@ -662,11 +662,6 @@ static void kvaser_usb_rx_error(const struct kvaser_usb *dev, ...@@ -662,11 +662,6 @@ static void kvaser_usb_rx_error(const struct kvaser_usb *dev,
priv = dev->nets[channel]; priv = dev->nets[channel];
stats = &priv->netdev->stats; stats = &priv->netdev->stats;
if (status & M16C_STATE_BUS_RESET) {
kvaser_usb_unlink_tx_urbs(priv);
return;
}
skb = alloc_can_err_skb(priv->netdev, &cf); skb = alloc_can_err_skb(priv->netdev, &cf);
if (!skb) { if (!skb) {
stats->rx_dropped++; stats->rx_dropped++;
...@@ -677,7 +672,7 @@ static void kvaser_usb_rx_error(const struct kvaser_usb *dev, ...@@ -677,7 +672,7 @@ static void kvaser_usb_rx_error(const struct kvaser_usb *dev,
netdev_dbg(priv->netdev, "Error status: 0x%02x\n", status); netdev_dbg(priv->netdev, "Error status: 0x%02x\n", status);
if (status & M16C_STATE_BUS_OFF) { if (status & (M16C_STATE_BUS_OFF | M16C_STATE_BUS_RESET)) {
cf->can_id |= CAN_ERR_BUSOFF; cf->can_id |= CAN_ERR_BUSOFF;
priv->can.can_stats.bus_off++; priv->can.can_stats.bus_off++;
...@@ -703,9 +698,7 @@ static void kvaser_usb_rx_error(const struct kvaser_usb *dev, ...@@ -703,9 +698,7 @@ static void kvaser_usb_rx_error(const struct kvaser_usb *dev,
} }
new_state = CAN_STATE_ERROR_PASSIVE; new_state = CAN_STATE_ERROR_PASSIVE;
} } else if (status & M16C_STATE_BUS_ERROR) {
if (status == M16C_STATE_BUS_ERROR) {
if ((priv->can.state < CAN_STATE_ERROR_WARNING) && if ((priv->can.state < CAN_STATE_ERROR_WARNING) &&
((txerr >= 96) || (rxerr >= 96))) { ((txerr >= 96) || (rxerr >= 96))) {
cf->can_id |= CAN_ERR_CRTL; cf->can_id |= CAN_ERR_CRTL;
...@@ -715,7 +708,8 @@ static void kvaser_usb_rx_error(const struct kvaser_usb *dev, ...@@ -715,7 +708,8 @@ static void kvaser_usb_rx_error(const struct kvaser_usb *dev,
priv->can.can_stats.error_warning++; priv->can.can_stats.error_warning++;
new_state = CAN_STATE_ERROR_WARNING; new_state = CAN_STATE_ERROR_WARNING;
} else if (priv->can.state > CAN_STATE_ERROR_ACTIVE) { } else if ((priv->can.state > CAN_STATE_ERROR_ACTIVE) &&
((txerr < 96) && (rxerr < 96))) {
cf->can_id |= CAN_ERR_PROT; cf->can_id |= CAN_ERR_PROT;
cf->data[2] = CAN_ERR_PROT_ACTIVE; cf->data[2] = CAN_ERR_PROT_ACTIVE;
...@@ -1590,7 +1584,7 @@ static int kvaser_usb_probe(struct usb_interface *intf, ...@@ -1590,7 +1584,7 @@ static int kvaser_usb_probe(struct usb_interface *intf,
{ {
struct kvaser_usb *dev; struct kvaser_usb *dev;
int err = -ENOMEM; int err = -ENOMEM;
int i; int i, retry = 3;
dev = devm_kzalloc(&intf->dev, sizeof(*dev), GFP_KERNEL); dev = devm_kzalloc(&intf->dev, sizeof(*dev), GFP_KERNEL);
if (!dev) if (!dev)
...@@ -1608,7 +1602,15 @@ static int kvaser_usb_probe(struct usb_interface *intf, ...@@ -1608,7 +1602,15 @@ static int kvaser_usb_probe(struct usb_interface *intf,
usb_set_intfdata(intf, dev); usb_set_intfdata(intf, dev);
err = kvaser_usb_get_software_info(dev); /* 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.
*/
do {
err = kvaser_usb_get_software_info(dev);
} while (--retry && err == -ETIMEDOUT);
if (err) { if (err) {
dev_err(&intf->dev, dev_err(&intf->dev,
"Cannot get software infos, error %d\n", err); "Cannot get software infos, error %d\n", err);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment