Skip to content

Commit

Permalink
can: allow to change the device mtu for CAN FD capable devices
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Oliver Hartkopp authored and Marc Kleine-Budde committed Mar 7, 2014
1 parent 9859ccd commit bc05a89
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 0 deletions.
39 changes: 39 additions & 0 deletions drivers/net/can/dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -594,6 +594,39 @@ void free_candev(struct net_device *dev)
}
EXPORT_SYMBOL_GPL(free_candev);

/*
* changing MTU and control mode for CAN/CANFD devices
*/
int can_change_mtu(struct net_device *dev, int new_mtu)
{
struct can_priv *priv = netdev_priv(dev);

/* Do not allow changing the MTU while running */
if (dev->flags & IFF_UP)
return -EBUSY;

/* allow change of MTU according to the CANFD ability of the device */
switch (new_mtu) {
case CAN_MTU:
priv->ctrlmode &= ~CAN_CTRLMODE_FD;
break;

case CANFD_MTU:
if (!(priv->ctrlmode_supported & CAN_CTRLMODE_FD))
return -EINVAL;

priv->ctrlmode |= CAN_CTRLMODE_FD;
break;

default:
return -EINVAL;
}

dev->mtu = new_mtu;
return 0;
}
EXPORT_SYMBOL_GPL(can_change_mtu);

/*
* Common open function when the device gets opened.
*
Expand Down Expand Up @@ -693,6 +726,12 @@ static int can_changelink(struct net_device *dev,
return -EOPNOTSUPP;
priv->ctrlmode &= ~cm->mask;
priv->ctrlmode |= cm->flags;

/* CAN_CTRLMODE_FD can only be set when driver supports FD */
if (priv->ctrlmode & CAN_CTRLMODE_FD)
dev->mtu = CANFD_MTU;
else
dev->mtu = CAN_MTU;
}

if (data[IFLA_CAN_RESTART_MS]) {
Expand Down
1 change: 1 addition & 0 deletions include/linux/can/dev.h
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ struct can_priv *safe_candev_priv(struct net_device *dev);

int open_candev(struct net_device *dev);
void close_candev(struct net_device *dev);
int can_change_mtu(struct net_device *dev, int new_mtu);

int register_candev(struct net_device *dev);
void unregister_candev(struct net_device *dev);
Expand Down
1 change: 1 addition & 0 deletions include/uapi/linux/can/netlink.h
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ struct can_ctrlmode {
#define CAN_CTRLMODE_3_SAMPLES 0x04 /* Triple sampling mode */
#define CAN_CTRLMODE_ONE_SHOT 0x08 /* One-Shot mode */
#define CAN_CTRLMODE_BERR_REPORTING 0x10 /* Bus-error reporting */
#define CAN_CTRLMODE_FD 0x20 /* CAN FD mode */

/*
* CAN device statistics
Expand Down

0 comments on commit bc05a89

Please sign in to comment.