From 68812b3e481833508d924c8fdf19b3fc65490054 Mon Sep 17 00:00:00 2001 From: wolf Date: Tue, 2 Jun 2009 11:57:19 +0000 Subject: [PATCH] dev: add can_get_echo_skb() for cleanup purposes Signed-off-by: Wolfgang Grandegger git-svn-id: svn://svn.berlios.de//socketcan/trunk@985 030b6a49-0b11-0410-94ab-b0dab22257f2 --- kernel/2.6/drivers/net/can/dev.c | 18 +++++++++++++++++- kernel/2.6/include/linux/can/dev.h | 1 + 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/kernel/2.6/drivers/net/can/dev.c b/kernel/2.6/drivers/net/can/dev.c index 290c755..0280a73 100644 --- a/kernel/2.6/drivers/net/can/dev.c +++ b/kernel/2.6/drivers/net/can/dev.c @@ -423,13 +423,29 @@ void can_get_echo_skb(struct net_device *dev, int idx) { struct can_priv *priv = netdev_priv(dev); - if ((dev->flags & IFF_ECHO) && priv->echo_skb[idx]) { + if (priv->echo_skb[idx]) { netif_rx(priv->echo_skb[idx]); priv->echo_skb[idx] = NULL; } } EXPORT_SYMBOL_GPL(can_get_echo_skb); +/* + * Remove the skb from the stack and free it. + * + * The function is typically called when TX failed. + */ +void can_free_echo_skb(struct net_device *dev, int idx) +{ + struct can_priv *priv = netdev_priv(dev); + + if (priv->echo_skb[idx]) { + kfree_skb(priv->echo_skb[idx]); + priv->echo_skb[idx] = NULL; + } +} +EXPORT_SYMBOL_GPL(can_free_echo_skb); + /* * CAN device restart for bus-off recovery */ diff --git a/kernel/2.6/include/linux/can/dev.h b/kernel/2.6/include/linux/can/dev.h index 3047a62..5121cd6 100644 --- a/kernel/2.6/include/linux/can/dev.h +++ b/kernel/2.6/include/linux/can/dev.h @@ -147,6 +147,7 @@ void can_close_cleanup(struct net_device *dev); void can_put_echo_skb(struct sk_buff *skb, struct net_device *dev, int idx); void can_get_echo_skb(struct net_device *dev, int idx); +void can_free_echo_skb(struct net_device *dev, int idx); int can_sample_point(struct can_bittiming *bt); -- 2.39.2