aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOliver Hartkopp <socketcan@hartkopp.net>2014-02-28 10:36:24 -0500
committerMarc Kleine-Budde <mkl@pengutronix.de>2014-03-07 03:18:23 -0500
commitbc05a8944a344acdb81a65de055ca6febbf9657c (patch)
treebf3e474f5bac669b5a9d4b3d07aa7119875334fc
parent9859ccd2c8be63ce939522e63e265f2b0caa1109 (diff)
can: allow to change the device mtu for CAN FD capable devices
The configuration for CAN FD depends on CAN_CTRLMODE_FD enabled in the driver specific ctrlmode_supported capabilities. The configuration can be done either with the 'fd { on | off }' option in the 'ip' tool from iproute2 or by setting the CAN netdevice MTU to CAN_MTU (16) or to CANFD_MTU (72). Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net> Acked-by: Stephane Grosjean <s.grosjean@peak-system.com> Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
-rw-r--r--drivers/net/can/dev.c39
-rw-r--r--include/linux/can/dev.h1
-rw-r--r--include/uapi/linux/can/netlink.h1
3 files changed, 41 insertions, 0 deletions
diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c
index 8ebe112458c4..4e20d82b799e 100644
--- a/drivers/net/can/dev.c
+++ b/drivers/net/can/dev.c
@@ -595,6 +595,39 @@ void free_candev(struct net_device *dev)
595EXPORT_SYMBOL_GPL(free_candev); 595EXPORT_SYMBOL_GPL(free_candev);
596 596
597/* 597/*
598 * changing MTU and control mode for CAN/CANFD devices
599 */
600int can_change_mtu(struct net_device *dev, int new_mtu)
601{
602 struct can_priv *priv = netdev_priv(dev);
603
604 /* Do not allow changing the MTU while running */
605 if (dev->flags & IFF_UP)
606 return -EBUSY;
607
608 /* allow change of MTU according to the CANFD ability of the device */
609 switch (new_mtu) {
610 case CAN_MTU:
611 priv->ctrlmode &= ~CAN_CTRLMODE_FD;
612 break;
613
614 case CANFD_MTU:
615 if (!(priv->ctrlmode_supported & CAN_CTRLMODE_FD))
616 return -EINVAL;
617
618 priv->ctrlmode |= CAN_CTRLMODE_FD;
619 break;
620
621 default:
622 return -EINVAL;
623 }
624
625 dev->mtu = new_mtu;
626 return 0;
627}
628EXPORT_SYMBOL_GPL(can_change_mtu);
629
630/*
598 * Common open function when the device gets opened. 631 * Common open function when the device gets opened.
599 * 632 *
600 * This function should be called in the open function of the device 633 * This function should be called in the open function of the device
@@ -693,6 +726,12 @@ static int can_changelink(struct net_device *dev,
693 return -EOPNOTSUPP; 726 return -EOPNOTSUPP;
694 priv->ctrlmode &= ~cm->mask; 727 priv->ctrlmode &= ~cm->mask;
695 priv->ctrlmode |= cm->flags; 728 priv->ctrlmode |= cm->flags;
729
730 /* CAN_CTRLMODE_FD can only be set when driver supports FD */
731 if (priv->ctrlmode & CAN_CTRLMODE_FD)
732 dev->mtu = CANFD_MTU;
733 else
734 dev->mtu = CAN_MTU;
696 } 735 }
697 736
698 if (data[IFLA_CAN_RESTART_MS]) { 737 if (data[IFLA_CAN_RESTART_MS]) {
diff --git a/include/linux/can/dev.h b/include/linux/can/dev.h
index 8adaee96f292..3ce5e526525f 100644
--- a/include/linux/can/dev.h
+++ b/include/linux/can/dev.h
@@ -113,6 +113,7 @@ struct can_priv *safe_candev_priv(struct net_device *dev);
113 113
114int open_candev(struct net_device *dev); 114int open_candev(struct net_device *dev);
115void close_candev(struct net_device *dev); 115void close_candev(struct net_device *dev);
116int can_change_mtu(struct net_device *dev, int new_mtu);
116 117
117int register_candev(struct net_device *dev); 118int register_candev(struct net_device *dev);
118void unregister_candev(struct net_device *dev); 119void unregister_candev(struct net_device *dev);
diff --git a/include/uapi/linux/can/netlink.h b/include/uapi/linux/can/netlink.h
index b41933d6bdcd..7e2e1863db16 100644
--- a/include/uapi/linux/can/netlink.h
+++ b/include/uapi/linux/can/netlink.h
@@ -96,6 +96,7 @@ struct can_ctrlmode {
96#define CAN_CTRLMODE_3_SAMPLES 0x04 /* Triple sampling mode */ 96#define CAN_CTRLMODE_3_SAMPLES 0x04 /* Triple sampling mode */
97#define CAN_CTRLMODE_ONE_SHOT 0x08 /* One-Shot mode */ 97#define CAN_CTRLMODE_ONE_SHOT 0x08 /* One-Shot mode */
98#define CAN_CTRLMODE_BERR_REPORTING 0x10 /* Bus-error reporting */ 98#define CAN_CTRLMODE_BERR_REPORTING 0x10 /* Bus-error reporting */
99#define CAN_CTRLMODE_FD 0x20 /* CAN FD mode */
99 100
100/* 101/*
101 * CAN device statistics 102 * CAN device statistics