Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

can: dev: add CAN XL support to virtual CAN

Make use of new can_skb_get_data_len() helper.
Add support for variable CANXL MTU using the new can_is_canxl_dev_mtu().

Acked-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
Link: https://lore.kernel.org/all/20220912170725.120748-7-socketcan@hartkopp.net
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>

authored by

Oliver Hartkopp and committed by
Marc Kleine-Budde
ebf87fc7 fb08cba1

+15 -10
+6 -6
drivers/net/can/vcan.c
··· 71 71 72 72 static void vcan_rx(struct sk_buff *skb, struct net_device *dev) 73 73 { 74 - struct canfd_frame *cfd = (struct canfd_frame *)skb->data; 75 74 struct net_device_stats *stats = &dev->stats; 76 75 77 76 stats->rx_packets++; 78 - stats->rx_bytes += cfd->len; 77 + stats->rx_bytes += can_skb_get_data_len(skb); 79 78 80 79 skb->pkt_type = PACKET_BROADCAST; 81 80 skb->dev = dev; ··· 85 86 86 87 static netdev_tx_t vcan_tx(struct sk_buff *skb, struct net_device *dev) 87 88 { 88 - struct canfd_frame *cfd = (struct canfd_frame *)skb->data; 89 89 struct net_device_stats *stats = &dev->stats; 90 - int loop, len; 90 + unsigned int len; 91 + int loop; 91 92 92 93 if (can_dropped_invalid_skb(dev, skb)) 93 94 return NETDEV_TX_OK; 94 95 95 - len = cfd->can_id & CAN_RTR_FLAG ? 0 : cfd->len; 96 + len = can_skb_get_data_len(skb); 96 97 stats->tx_packets++; 97 98 stats->tx_bytes += len; 98 99 ··· 136 137 if (dev->flags & IFF_UP) 137 138 return -EBUSY; 138 139 139 - if (new_mtu != CAN_MTU && new_mtu != CANFD_MTU) 140 + if (new_mtu != CAN_MTU && new_mtu != CANFD_MTU && 141 + !can_is_canxl_dev_mtu(new_mtu)) 140 142 return -EINVAL; 141 143 142 144 dev->mtu = new_mtu;
+4 -4
drivers/net/can/vxcan.c
··· 38 38 { 39 39 struct vxcan_priv *priv = netdev_priv(dev); 40 40 struct net_device *peer; 41 - struct canfd_frame *cfd = (struct canfd_frame *)oskb->data; 42 41 struct net_device_stats *peerstats, *srcstats = &dev->stats; 43 42 struct sk_buff *skb; 44 - u8 len; 43 + unsigned int len; 45 44 46 45 if (can_dropped_invalid_skb(dev, oskb)) 47 46 return NETDEV_TX_OK; ··· 69 70 skb->dev = peer; 70 71 skb->ip_summed = CHECKSUM_UNNECESSARY; 71 72 72 - len = cfd->can_id & CAN_RTR_FLAG ? 0 : cfd->len; 73 + len = can_skb_get_data_len(skb); 73 74 if (netif_rx(skb) == NET_RX_SUCCESS) { 74 75 srcstats->tx_packets++; 75 76 srcstats->tx_bytes += len; ··· 131 132 if (dev->flags & IFF_UP) 132 133 return -EBUSY; 133 134 134 - if (new_mtu != CAN_MTU && new_mtu != CANFD_MTU) 135 + if (new_mtu != CAN_MTU && new_mtu != CANFD_MTU && 136 + !can_is_canxl_dev_mtu(new_mtu)) 135 137 return -EINVAL; 136 138 137 139 dev->mtu = new_mtu;
+5
include/linux/can/dev.h
··· 147 147 return priv->ctrlmode & ~priv->ctrlmode_supported; 148 148 } 149 149 150 + static inline bool can_is_canxl_dev_mtu(unsigned int mtu) 151 + { 152 + return (mtu >= CANXL_MIN_MTU && mtu <= CANXL_MAX_MTU); 153 + } 154 + 150 155 void can_setup(struct net_device *dev); 151 156 152 157 struct net_device *alloc_candev_mqs(int sizeof_priv, unsigned int echo_skb_max,