diff options
Diffstat (limited to 'drivers/net/can/usb/kvaser_usb.c')
-rw-r--r-- | drivers/net/can/usb/kvaser_usb.c | 31 |
1 files changed, 15 insertions, 16 deletions
diff --git a/drivers/net/can/usb/kvaser_usb.c b/drivers/net/can/usb/kvaser_usb.c index 541fb7a05625..c32cd61073bc 100644 --- a/drivers/net/can/usb/kvaser_usb.c +++ b/drivers/net/can/usb/kvaser_usb.c | |||
@@ -520,10 +520,10 @@ static void kvaser_usb_tx_acknowledge(const struct kvaser_usb *dev, | |||
520 | skb = alloc_can_err_skb(priv->netdev, &cf); | 520 | skb = alloc_can_err_skb(priv->netdev, &cf); |
521 | if (skb) { | 521 | if (skb) { |
522 | cf->can_id |= CAN_ERR_RESTARTED; | 522 | cf->can_id |= CAN_ERR_RESTARTED; |
523 | netif_rx(skb); | ||
524 | 523 | ||
525 | stats->rx_packets++; | 524 | stats->rx_packets++; |
526 | stats->rx_bytes += cf->can_dlc; | 525 | stats->rx_bytes += cf->can_dlc; |
526 | netif_rx(skb); | ||
527 | } else { | 527 | } else { |
528 | netdev_err(priv->netdev, | 528 | netdev_err(priv->netdev, |
529 | "No memory left for err_skb\n"); | 529 | "No memory left for err_skb\n"); |
@@ -770,10 +770,9 @@ static void kvaser_usb_rx_error(const struct kvaser_usb *dev, | |||
770 | 770 | ||
771 | priv->can.state = new_state; | 771 | priv->can.state = new_state; |
772 | 772 | ||
773 | netif_rx(skb); | ||
774 | |||
775 | stats->rx_packets++; | 773 | stats->rx_packets++; |
776 | stats->rx_bytes += cf->can_dlc; | 774 | stats->rx_bytes += cf->can_dlc; |
775 | netif_rx(skb); | ||
777 | } | 776 | } |
778 | 777 | ||
779 | static void kvaser_usb_rx_can_err(const struct kvaser_usb_net_priv *priv, | 778 | static void kvaser_usb_rx_can_err(const struct kvaser_usb_net_priv *priv, |
@@ -805,10 +804,9 @@ static void kvaser_usb_rx_can_err(const struct kvaser_usb_net_priv *priv, | |||
805 | stats->rx_over_errors++; | 804 | stats->rx_over_errors++; |
806 | stats->rx_errors++; | 805 | stats->rx_errors++; |
807 | 806 | ||
808 | netif_rx(skb); | ||
809 | |||
810 | stats->rx_packets++; | 807 | stats->rx_packets++; |
811 | stats->rx_bytes += cf->can_dlc; | 808 | stats->rx_bytes += cf->can_dlc; |
809 | netif_rx(skb); | ||
812 | } | 810 | } |
813 | } | 811 | } |
814 | 812 | ||
@@ -887,10 +885,9 @@ static void kvaser_usb_rx_can_msg(const struct kvaser_usb *dev, | |||
887 | cf->can_dlc); | 885 | cf->can_dlc); |
888 | } | 886 | } |
889 | 887 | ||
890 | netif_rx(skb); | ||
891 | |||
892 | stats->rx_packets++; | 888 | stats->rx_packets++; |
893 | stats->rx_bytes += cf->can_dlc; | 889 | stats->rx_bytes += cf->can_dlc; |
890 | netif_rx(skb); | ||
894 | } | 891 | } |
895 | 892 | ||
896 | static void kvaser_usb_start_chip_reply(const struct kvaser_usb *dev, | 893 | static void kvaser_usb_start_chip_reply(const struct kvaser_usb *dev, |
@@ -1246,6 +1243,9 @@ static int kvaser_usb_close(struct net_device *netdev) | |||
1246 | if (err) | 1243 | if (err) |
1247 | netdev_warn(netdev, "Cannot stop device, error %d\n", err); | 1244 | netdev_warn(netdev, "Cannot stop device, error %d\n", err); |
1248 | 1245 | ||
1246 | /* reset tx contexts */ | ||
1247 | kvaser_usb_unlink_tx_urbs(priv); | ||
1248 | |||
1249 | priv->can.state = CAN_STATE_STOPPED; | 1249 | priv->can.state = CAN_STATE_STOPPED; |
1250 | close_candev(priv->netdev); | 1250 | close_candev(priv->netdev); |
1251 | 1251 | ||
@@ -1294,12 +1294,14 @@ static netdev_tx_t kvaser_usb_start_xmit(struct sk_buff *skb, | |||
1294 | if (!urb) { | 1294 | if (!urb) { |
1295 | netdev_err(netdev, "No memory left for URBs\n"); | 1295 | netdev_err(netdev, "No memory left for URBs\n"); |
1296 | stats->tx_dropped++; | 1296 | stats->tx_dropped++; |
1297 | goto nourbmem; | 1297 | dev_kfree_skb(skb); |
1298 | return NETDEV_TX_OK; | ||
1298 | } | 1299 | } |
1299 | 1300 | ||
1300 | buf = kmalloc(sizeof(struct kvaser_msg), GFP_ATOMIC); | 1301 | buf = kmalloc(sizeof(struct kvaser_msg), GFP_ATOMIC); |
1301 | if (!buf) { | 1302 | if (!buf) { |
1302 | stats->tx_dropped++; | 1303 | stats->tx_dropped++; |
1304 | dev_kfree_skb(skb); | ||
1303 | goto nobufmem; | 1305 | goto nobufmem; |
1304 | } | 1306 | } |
1305 | 1307 | ||
@@ -1334,6 +1336,7 @@ static netdev_tx_t kvaser_usb_start_xmit(struct sk_buff *skb, | |||
1334 | } | 1336 | } |
1335 | } | 1337 | } |
1336 | 1338 | ||
1339 | /* This should never happen; it implies a flow control bug */ | ||
1337 | if (!context) { | 1340 | if (!context) { |
1338 | netdev_warn(netdev, "cannot find free context\n"); | 1341 | netdev_warn(netdev, "cannot find free context\n"); |
1339 | ret = NETDEV_TX_BUSY; | 1342 | ret = NETDEV_TX_BUSY; |
@@ -1364,9 +1367,6 @@ static netdev_tx_t kvaser_usb_start_xmit(struct sk_buff *skb, | |||
1364 | if (unlikely(err)) { | 1367 | if (unlikely(err)) { |
1365 | can_free_echo_skb(netdev, context->echo_index); | 1368 | can_free_echo_skb(netdev, context->echo_index); |
1366 | 1369 | ||
1367 | skb = NULL; /* set to NULL to avoid double free in | ||
1368 | * dev_kfree_skb(skb) */ | ||
1369 | |||
1370 | atomic_dec(&priv->active_tx_urbs); | 1370 | atomic_dec(&priv->active_tx_urbs); |
1371 | usb_unanchor_urb(urb); | 1371 | usb_unanchor_urb(urb); |
1372 | 1372 | ||
@@ -1388,8 +1388,6 @@ releasebuf: | |||
1388 | kfree(buf); | 1388 | kfree(buf); |
1389 | nobufmem: | 1389 | nobufmem: |
1390 | usb_free_urb(urb); | 1390 | usb_free_urb(urb); |
1391 | nourbmem: | ||
1392 | dev_kfree_skb(skb); | ||
1393 | return ret; | 1391 | return ret; |
1394 | } | 1392 | } |
1395 | 1393 | ||
@@ -1502,6 +1500,10 @@ static int kvaser_usb_init_one(struct usb_interface *intf, | |||
1502 | struct kvaser_usb_net_priv *priv; | 1500 | struct kvaser_usb_net_priv *priv; |
1503 | int i, err; | 1501 | int i, err; |
1504 | 1502 | ||
1503 | err = kvaser_usb_send_simple_msg(dev, CMD_RESET_CHIP, channel); | ||
1504 | if (err) | ||
1505 | return err; | ||
1506 | |||
1505 | netdev = alloc_candev(sizeof(*priv), MAX_TX_URBS); | 1507 | netdev = alloc_candev(sizeof(*priv), MAX_TX_URBS); |
1506 | if (!netdev) { | 1508 | if (!netdev) { |
1507 | dev_err(&intf->dev, "Cannot alloc candev\n"); | 1509 | dev_err(&intf->dev, "Cannot alloc candev\n"); |
@@ -1606,9 +1608,6 @@ static int kvaser_usb_probe(struct usb_interface *intf, | |||
1606 | 1608 | ||
1607 | usb_set_intfdata(intf, dev); | 1609 | usb_set_intfdata(intf, dev); |
1608 | 1610 | ||
1609 | for (i = 0; i < MAX_NET_DEVICES; i++) | ||
1610 | kvaser_usb_send_simple_msg(dev, CMD_RESET_CHIP, i); | ||
1611 | |||
1612 | err = kvaser_usb_get_software_info(dev); | 1611 | err = kvaser_usb_get_software_info(dev); |
1613 | if (err) { | 1612 | if (err) { |
1614 | dev_err(&intf->dev, | 1613 | dev_err(&intf->dev, |