diff options
-rw-r--r-- | drivers/net/can/dev.c | 24 | ||||
-rw-r--r-- | include/linux/can/dev.h | 2 |
2 files changed, 26 insertions, 0 deletions
diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c index 13a909822e25..cb584ea00331 100644 --- a/drivers/net/can/dev.c +++ b/drivers/net/can/dev.c | |||
@@ -521,6 +521,30 @@ struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf) | |||
521 | } | 521 | } |
522 | EXPORT_SYMBOL_GPL(alloc_can_skb); | 522 | EXPORT_SYMBOL_GPL(alloc_can_skb); |
523 | 523 | ||
524 | struct sk_buff *alloc_canfd_skb(struct net_device *dev, | ||
525 | struct canfd_frame **cfd) | ||
526 | { | ||
527 | struct sk_buff *skb; | ||
528 | |||
529 | skb = netdev_alloc_skb(dev, sizeof(struct can_skb_priv) + | ||
530 | sizeof(struct canfd_frame)); | ||
531 | if (unlikely(!skb)) | ||
532 | return NULL; | ||
533 | |||
534 | skb->protocol = htons(ETH_P_CANFD); | ||
535 | skb->pkt_type = PACKET_BROADCAST; | ||
536 | skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
537 | |||
538 | can_skb_reserve(skb); | ||
539 | can_skb_prv(skb)->ifindex = dev->ifindex; | ||
540 | |||
541 | *cfd = (struct canfd_frame *)skb_put(skb, sizeof(struct canfd_frame)); | ||
542 | memset(*cfd, 0, sizeof(struct canfd_frame)); | ||
543 | |||
544 | return skb; | ||
545 | } | ||
546 | EXPORT_SYMBOL_GPL(alloc_canfd_skb); | ||
547 | |||
524 | struct sk_buff *alloc_can_err_skb(struct net_device *dev, struct can_frame **cf) | 548 | struct sk_buff *alloc_can_err_skb(struct net_device *dev, struct can_frame **cf) |
525 | { | 549 | { |
526 | struct sk_buff *skb; | 550 | struct sk_buff *skb; |
diff --git a/include/linux/can/dev.h b/include/linux/can/dev.h index fb0ab651a041..dc5f9026b67f 100644 --- a/include/linux/can/dev.h +++ b/include/linux/can/dev.h | |||
@@ -124,6 +124,8 @@ unsigned int can_get_echo_skb(struct net_device *dev, unsigned int idx); | |||
124 | void can_free_echo_skb(struct net_device *dev, unsigned int idx); | 124 | void can_free_echo_skb(struct net_device *dev, unsigned int idx); |
125 | 125 | ||
126 | struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf); | 126 | struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf); |
127 | struct sk_buff *alloc_canfd_skb(struct net_device *dev, | ||
128 | struct canfd_frame **cfd); | ||
127 | struct sk_buff *alloc_can_err_skb(struct net_device *dev, | 129 | struct sk_buff *alloc_can_err_skb(struct net_device *dev, |
128 | struct can_frame **cf); | 130 | struct can_frame **cf); |
129 | 131 | ||