can: restart device even if dev_alloc_skb() fails
If dev_alloc_skb() failed in can_restart(), the device was left behind in the bus-off state. This patch restarts the device nevertheless. Signed-off-by: Kurt Van Dijck <kurt.van.dijck@eia.be> Signed-off-by: Wolfgang Grandegger <wg@grandegger.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
e2372902d8
Коммит
b3d0df7ca3
|
@ -346,7 +346,7 @@ void can_restart(unsigned long data)
|
||||||
skb = dev_alloc_skb(sizeof(struct can_frame));
|
skb = dev_alloc_skb(sizeof(struct can_frame));
|
||||||
if (skb == NULL) {
|
if (skb == NULL) {
|
||||||
err = -ENOMEM;
|
err = -ENOMEM;
|
||||||
goto out;
|
goto restart;
|
||||||
}
|
}
|
||||||
skb->dev = dev;
|
skb->dev = dev;
|
||||||
skb->protocol = htons(ETH_P_CAN);
|
skb->protocol = htons(ETH_P_CAN);
|
||||||
|
@ -361,13 +361,13 @@ void can_restart(unsigned long data)
|
||||||
stats->rx_packets++;
|
stats->rx_packets++;
|
||||||
stats->rx_bytes += cf->can_dlc;
|
stats->rx_bytes += cf->can_dlc;
|
||||||
|
|
||||||
|
restart:
|
||||||
dev_dbg(dev->dev.parent, "restarted\n");
|
dev_dbg(dev->dev.parent, "restarted\n");
|
||||||
priv->can_stats.restarts++;
|
priv->can_stats.restarts++;
|
||||||
|
|
||||||
/* Now restart the device */
|
/* Now restart the device */
|
||||||
err = priv->do_set_mode(dev, CAN_MODE_START);
|
err = priv->do_set_mode(dev, CAN_MODE_START);
|
||||||
|
|
||||||
out:
|
|
||||||
netif_carrier_on(dev);
|
netif_carrier_on(dev);
|
||||||
if (err)
|
if (err)
|
||||||
dev_err(dev->dev.parent, "Error %d during restart", err);
|
dev_err(dev->dev.parent, "Error %d during restart", err);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче