mirror of
https://github.com/torvalds/linux.git
synced 2024-11-29 07:31:29 +00:00
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>
This commit is contained in:
parent
fb08cba12b
commit
ebf87fc728
@ -71,11 +71,10 @@ MODULE_PARM_DESC(echo, "Echo sent frames (for testing). Default: 0 (Off)");
|
||||
|
||||
static void vcan_rx(struct sk_buff *skb, struct net_device *dev)
|
||||
{
|
||||
struct canfd_frame *cfd = (struct canfd_frame *)skb->data;
|
||||
struct net_device_stats *stats = &dev->stats;
|
||||
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cfd->len;
|
||||
stats->rx_bytes += can_skb_get_data_len(skb);
|
||||
|
||||
skb->pkt_type = PACKET_BROADCAST;
|
||||
skb->dev = dev;
|
||||
@ -86,14 +85,14 @@ static void vcan_rx(struct sk_buff *skb, struct net_device *dev)
|
||||
|
||||
static netdev_tx_t vcan_tx(struct sk_buff *skb, struct net_device *dev)
|
||||
{
|
||||
struct canfd_frame *cfd = (struct canfd_frame *)skb->data;
|
||||
struct net_device_stats *stats = &dev->stats;
|
||||
int loop, len;
|
||||
unsigned int len;
|
||||
int loop;
|
||||
|
||||
if (can_dropped_invalid_skb(dev, skb))
|
||||
return NETDEV_TX_OK;
|
||||
|
||||
len = cfd->can_id & CAN_RTR_FLAG ? 0 : cfd->len;
|
||||
len = can_skb_get_data_len(skb);
|
||||
stats->tx_packets++;
|
||||
stats->tx_bytes += len;
|
||||
|
||||
@ -137,7 +136,8 @@ static int vcan_change_mtu(struct net_device *dev, int new_mtu)
|
||||
if (dev->flags & IFF_UP)
|
||||
return -EBUSY;
|
||||
|
||||
if (new_mtu != CAN_MTU && new_mtu != CANFD_MTU)
|
||||
if (new_mtu != CAN_MTU && new_mtu != CANFD_MTU &&
|
||||
!can_is_canxl_dev_mtu(new_mtu))
|
||||
return -EINVAL;
|
||||
|
||||
dev->mtu = new_mtu;
|
||||
|
@ -38,10 +38,9 @@ static netdev_tx_t vxcan_xmit(struct sk_buff *oskb, struct net_device *dev)
|
||||
{
|
||||
struct vxcan_priv *priv = netdev_priv(dev);
|
||||
struct net_device *peer;
|
||||
struct canfd_frame *cfd = (struct canfd_frame *)oskb->data;
|
||||
struct net_device_stats *peerstats, *srcstats = &dev->stats;
|
||||
struct sk_buff *skb;
|
||||
u8 len;
|
||||
unsigned int len;
|
||||
|
||||
if (can_dropped_invalid_skb(dev, oskb))
|
||||
return NETDEV_TX_OK;
|
||||
@ -70,7 +69,7 @@ static netdev_tx_t vxcan_xmit(struct sk_buff *oskb, struct net_device *dev)
|
||||
skb->dev = peer;
|
||||
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
||||
|
||||
len = cfd->can_id & CAN_RTR_FLAG ? 0 : cfd->len;
|
||||
len = can_skb_get_data_len(skb);
|
||||
if (netif_rx(skb) == NET_RX_SUCCESS) {
|
||||
srcstats->tx_packets++;
|
||||
srcstats->tx_bytes += len;
|
||||
@ -132,7 +131,8 @@ static int vxcan_change_mtu(struct net_device *dev, int new_mtu)
|
||||
if (dev->flags & IFF_UP)
|
||||
return -EBUSY;
|
||||
|
||||
if (new_mtu != CAN_MTU && new_mtu != CANFD_MTU)
|
||||
if (new_mtu != CAN_MTU && new_mtu != CANFD_MTU &&
|
||||
!can_is_canxl_dev_mtu(new_mtu))
|
||||
return -EINVAL;
|
||||
|
||||
dev->mtu = new_mtu;
|
||||
|
@ -147,6 +147,11 @@ static inline u32 can_get_static_ctrlmode(struct can_priv *priv)
|
||||
return priv->ctrlmode & ~priv->ctrlmode_supported;
|
||||
}
|
||||
|
||||
static inline bool can_is_canxl_dev_mtu(unsigned int mtu)
|
||||
{
|
||||
return (mtu >= CANXL_MIN_MTU && mtu <= CANXL_MAX_MTU);
|
||||
}
|
||||
|
||||
void can_setup(struct net_device *dev);
|
||||
|
||||
struct net_device *alloc_candev_mqs(int sizeof_priv, unsigned int echo_skb_max,
|
||||
|
Loading…
Reference in New Issue
Block a user