|
|
@@ -477,14 +477,7 @@ void can_put_echo_skb(struct sk_buff *skb, struct net_device *dev,
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(can_put_echo_skb);
|
|
|
|
|
|
-/*
|
|
|
- * Get the skb from the stack and loop it back locally
|
|
|
- *
|
|
|
- * The function is typically called when the TX done interrupt
|
|
|
- * is handled in the device driver. The driver must protect
|
|
|
- * access to priv->echo_skb, if necessary.
|
|
|
- */
|
|
|
-unsigned int can_get_echo_skb(struct net_device *dev, unsigned int idx)
|
|
|
+struct sk_buff *__can_get_echo_skb(struct net_device *dev, unsigned int idx, u8 *len_ptr)
|
|
|
{
|
|
|
struct can_priv *priv = netdev_priv(dev);
|
|
|
|
|
|
@@ -495,13 +488,34 @@ unsigned int can_get_echo_skb(struct net_device *dev, unsigned int idx)
|
|
|
struct can_frame *cf = (struct can_frame *)skb->data;
|
|
|
u8 dlc = cf->can_dlc;
|
|
|
|
|
|
- netif_rx(priv->echo_skb[idx]);
|
|
|
+ *len_ptr = dlc;
|
|
|
priv->echo_skb[idx] = NULL;
|
|
|
|
|
|
- return dlc;
|
|
|
+ return skb;
|
|
|
}
|
|
|
|
|
|
- return 0;
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Get the skb from the stack and loop it back locally
|
|
|
+ *
|
|
|
+ * The function is typically called when the TX done interrupt
|
|
|
+ * is handled in the device driver. The driver must protect
|
|
|
+ * access to priv->echo_skb, if necessary.
|
|
|
+ */
|
|
|
+unsigned int can_get_echo_skb(struct net_device *dev, unsigned int idx)
|
|
|
+{
|
|
|
+ struct sk_buff *skb;
|
|
|
+ u8 len;
|
|
|
+
|
|
|
+ skb = __can_get_echo_skb(dev, idx, &len);
|
|
|
+ if (!skb)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ netif_rx(skb);
|
|
|
+
|
|
|
+ return len;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(can_get_echo_skb);
|
|
|
|