]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
can: netlink: add can_ctrlmode_changelink()
authorVincent Mailhol <mailhol@kernel.org>
Tue, 23 Sep 2025 06:58:36 +0000 (15:58 +0900)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Wed, 24 Sep 2025 15:09:45 +0000 (17:09 +0200)
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>
drivers/net/can/dev/netlink.c

index 5f2962aab5763a0dc8f86a6fa7fa3afbef125d26..e1a1767c0a6cfeeb06b7d53f9ec4c48d76387b62 100644 (file)
@@ -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;