]> rtime.felk.cvut.cz Git - socketcan-devel.git/commitdiff
dev: add can_get_echo_skb() for cleanup purposes
authorwolf <wolf@030b6a49-0b11-0410-94ab-b0dab22257f2>
Tue, 2 Jun 2009 11:57:19 +0000 (11:57 +0000)
committerwolf <wolf@030b6a49-0b11-0410-94ab-b0dab22257f2>
Tue, 2 Jun 2009 11:57:19 +0000 (11:57 +0000)
Signed-off-by: Wolfgang Grandegger <wg@grandegger.com>
git-svn-id: svn://svn.berlios.de//socketcan/trunk@985 030b6a49-0b11-0410-94ab-b0dab22257f2

kernel/2.6/drivers/net/can/dev.c
kernel/2.6/include/linux/can/dev.h

index 290c75581f05db9a7c0a54d87eaf194666c4ba31..0280a730577a67c21b494c9891785f462b3f1927 100644 (file)
@@ -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
  */
index 3047a627f858755e4f6f2839a26c8ac9ce8ad091..5121cd634704749d8b6b3312606285292864f635 100644 (file)
@@ -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);