diff --git a/net/can/j1939/bus.c b/net/can/j1939/bus.c index cdc3c0a71937..a180bbdb3790 100644 --- a/net/can/j1939/bus.c +++ b/net/can/j1939/bus.c @@ -96,6 +96,16 @@ void j1939_ecu_unmap(struct j1939_ecu *ecu) write_unlock_bh(&ecu->priv->lock); } +void j1939_ecu_cancel_all(struct j1939_priv *priv) +{ + struct j1939_ecu *ecu, *tmp; + + write_lock_bh(&priv->lock); + list_for_each_entry_safe(ecu, tmp, &priv->ecus, list) + j1939_ecu_timer_cancel(ecu); + write_unlock_bh(&priv->lock); +} + void j1939_ecu_unmap_all(struct j1939_priv *priv) { int i; diff --git a/net/can/j1939/j1939-priv.h b/net/can/j1939/j1939-priv.h index cf26352d1d8c..37a245ef9b73 100644 --- a/net/can/j1939/j1939-priv.h +++ b/net/can/j1939/j1939-priv.h @@ -204,6 +204,7 @@ struct j1939_ecu *j1939_ecu_create_locked(struct j1939_priv *priv, name_t name); void j1939_ecu_timer_start(struct j1939_ecu *ecu); void j1939_ecu_timer_cancel(struct j1939_ecu *ecu); +void j1939_ecu_cancel_all(struct j1939_priv *priv); void j1939_ecu_unmap_all(struct j1939_priv *priv); struct j1939_priv *j1939_netdev_start(struct net_device *ndev); diff --git a/net/can/j1939/main.c b/net/can/j1939/main.c index 5e5e6c228f22..1f68ba803700 100644 --- a/net/can/j1939/main.c +++ b/net/can/j1939/main.c @@ -306,6 +306,7 @@ struct j1939_priv *j1939_netdev_start(struct net_device *ndev) void j1939_netdev_stop(struct j1939_priv *priv) { + j1939_ecu_cancel_all(priv); kref_put_mutex(&priv->rx_kref, __j1939_rx_release, &j1939_netdev_lock); j1939_priv_put(priv); }