can: netlink: add can_ctrlmode_changelink()
Split the control mode change link logic into a new function: can_ctrlmode_changelink(). The purpose is to increase code readability by preventing can_changelink() from becoming too big. Signed-off-by: Vincent Mailhol <mailhol@kernel.org> Link: https://patch.msgid.link/20250923-canxl-netlink-prep-v4-11-e720d28f66fe@kernel.org Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
This commit is contained in:
parent
2e543af483
commit
e1a5cd9d66
|
|
@ -172,6 +172,59 @@ static int can_validate(struct nlattr *tb[], struct nlattr *data[],
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int can_ctrlmode_changelink(struct net_device *dev,
|
||||
struct nlattr *data[],
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct can_priv *priv = netdev_priv(dev);
|
||||
struct can_ctrlmode *cm;
|
||||
u32 maskedflags;
|
||||
u32 ctrlstatic;
|
||||
|
||||
if (!data[IFLA_CAN_CTRLMODE])
|
||||
return 0;
|
||||
|
||||
/* Do not allow changing controller mode while running */
|
||||
if (dev->flags & IFF_UP)
|
||||
return -EBUSY;
|
||||
|
||||
cm = nla_data(data[IFLA_CAN_CTRLMODE]);
|
||||
maskedflags = cm->flags & cm->mask;
|
||||
ctrlstatic = can_get_static_ctrlmode(priv);
|
||||
|
||||
/* check whether provided bits are allowed to be passed */
|
||||
if (maskedflags & ~(priv->ctrlmode_supported | ctrlstatic))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
/* do not check for static fd-non-iso if 'fd' is disabled */
|
||||
if (!(maskedflags & CAN_CTRLMODE_FD))
|
||||
ctrlstatic &= ~CAN_CTRLMODE_FD_NON_ISO;
|
||||
|
||||
/* make sure static options are provided by configuration */
|
||||
if ((maskedflags & ctrlstatic) != ctrlstatic)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
/* If a top dependency flag is provided, reset all its dependencies */
|
||||
if (cm->mask & CAN_CTRLMODE_FD)
|
||||
priv->ctrlmode &= ~CAN_CTRLMODE_FD_TDC_MASK;
|
||||
|
||||
/* clear bits to be modified and copy the flag values */
|
||||
priv->ctrlmode &= ~cm->mask;
|
||||
priv->ctrlmode |= maskedflags;
|
||||
|
||||
/* Wipe potential leftovers from previous CAN FD config */
|
||||
if (!(priv->ctrlmode & CAN_CTRLMODE_FD)) {
|
||||
memset(&priv->fd.data_bittiming, 0,
|
||||
sizeof(priv->fd.data_bittiming));
|
||||
priv->ctrlmode &= ~CAN_CTRLMODE_FD_TDC_MASK;
|
||||
memset(&priv->fd.tdc, 0, sizeof(priv->fd.tdc));
|
||||
}
|
||||
|
||||
can_set_default_mtu(dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int can_tdc_changelink(struct data_bittiming_params *dbt_params,
|
||||
const struct nlattr *nla,
|
||||
struct netlink_ext_ack *extack)
|
||||
|
|
@ -315,48 +368,7 @@ static int can_changelink(struct net_device *dev, struct nlattr *tb[],
|
|||
/* We need synchronization with dev->stop() */
|
||||
ASSERT_RTNL();
|
||||
|
||||
if (data[IFLA_CAN_CTRLMODE]) {
|
||||
struct can_ctrlmode *cm;
|
||||
u32 ctrlstatic;
|
||||
u32 maskedflags;
|
||||
|
||||
/* Do not allow changing controller mode while running */
|
||||
if (dev->flags & IFF_UP)
|
||||
return -EBUSY;
|
||||
cm = nla_data(data[IFLA_CAN_CTRLMODE]);
|
||||
ctrlstatic = can_get_static_ctrlmode(priv);
|
||||
maskedflags = cm->flags & cm->mask;
|
||||
|
||||
/* check whether provided bits are allowed to be passed */
|
||||
if (maskedflags & ~(priv->ctrlmode_supported | ctrlstatic))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
/* do not check for static fd-non-iso if 'fd' is disabled */
|
||||
if (!(maskedflags & CAN_CTRLMODE_FD))
|
||||
ctrlstatic &= ~CAN_CTRLMODE_FD_NON_ISO;
|
||||
|
||||
/* make sure static options are provided by configuration */
|
||||
if ((maskedflags & ctrlstatic) != ctrlstatic)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
/* If a top dependency flag is provided, reset all its dependencies */
|
||||
if (cm->mask & CAN_CTRLMODE_FD)
|
||||
priv->ctrlmode &= ~CAN_CTRLMODE_FD_TDC_MASK;
|
||||
|
||||
/* clear bits to be modified and copy the flag values */
|
||||
priv->ctrlmode &= ~cm->mask;
|
||||
priv->ctrlmode |= maskedflags;
|
||||
|
||||
/* Wipe potential leftovers from previous CAN FD config */
|
||||
if (!(priv->ctrlmode & CAN_CTRLMODE_FD)) {
|
||||
memset(&priv->fd.data_bittiming, 0,
|
||||
sizeof(priv->fd.data_bittiming));
|
||||
priv->ctrlmode &= ~CAN_CTRLMODE_FD_TDC_MASK;
|
||||
memset(&priv->fd.tdc, 0, sizeof(priv->fd.tdc));
|
||||
}
|
||||
|
||||
can_set_default_mtu(dev);
|
||||
}
|
||||
can_ctrlmode_changelink(dev, data, extack);
|
||||
|
||||
if (data[IFLA_CAN_BITTIMING]) {
|
||||
struct can_bittiming bt;
|
||||
|
|
|
|||
Loading…
Reference in New Issue