Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Vincent Mailhol and committed by
Marc Kleine-Budde
e1a5cd9d 2e543af4

+54 -42
+54 -42
drivers/net/can/dev/netlink.c
··· 172 172 return 0; 173 173 } 174 174 175 + static int can_ctrlmode_changelink(struct net_device *dev, 176 + struct nlattr *data[], 177 + struct netlink_ext_ack *extack) 178 + { 179 + struct can_priv *priv = netdev_priv(dev); 180 + struct can_ctrlmode *cm; 181 + u32 maskedflags; 182 + u32 ctrlstatic; 183 + 184 + if (!data[IFLA_CAN_CTRLMODE]) 185 + return 0; 186 + 187 + /* Do not allow changing controller mode while running */ 188 + if (dev->flags & IFF_UP) 189 + return -EBUSY; 190 + 191 + cm = nla_data(data[IFLA_CAN_CTRLMODE]); 192 + maskedflags = cm->flags & cm->mask; 193 + ctrlstatic = can_get_static_ctrlmode(priv); 194 + 195 + /* check whether provided bits are allowed to be passed */ 196 + if (maskedflags & ~(priv->ctrlmode_supported | ctrlstatic)) 197 + return -EOPNOTSUPP; 198 + 199 + /* do not check for static fd-non-iso if 'fd' is disabled */ 200 + if (!(maskedflags & CAN_CTRLMODE_FD)) 201 + ctrlstatic &= ~CAN_CTRLMODE_FD_NON_ISO; 202 + 203 + /* make sure static options are provided by configuration */ 204 + if ((maskedflags & ctrlstatic) != ctrlstatic) 205 + return -EOPNOTSUPP; 206 + 207 + /* If a top dependency flag is provided, reset all its dependencies */ 208 + if (cm->mask & CAN_CTRLMODE_FD) 209 + priv->ctrlmode &= ~CAN_CTRLMODE_FD_TDC_MASK; 210 + 211 + /* clear bits to be modified and copy the flag values */ 212 + priv->ctrlmode &= ~cm->mask; 213 + priv->ctrlmode |= maskedflags; 214 + 215 + /* Wipe potential leftovers from previous CAN FD config */ 216 + if (!(priv->ctrlmode & CAN_CTRLMODE_FD)) { 217 + memset(&priv->fd.data_bittiming, 0, 218 + sizeof(priv->fd.data_bittiming)); 219 + priv->ctrlmode &= ~CAN_CTRLMODE_FD_TDC_MASK; 220 + memset(&priv->fd.tdc, 0, sizeof(priv->fd.tdc)); 221 + } 222 + 223 + can_set_default_mtu(dev); 224 + 225 + return 0; 226 + } 227 + 175 228 static int can_tdc_changelink(struct data_bittiming_params *dbt_params, 176 229 const struct nlattr *nla, 177 230 struct netlink_ext_ack *extack) ··· 368 315 /* We need synchronization with dev->stop() */ 369 316 ASSERT_RTNL(); 370 317 371 - if (data[IFLA_CAN_CTRLMODE]) { 372 - struct can_ctrlmode *cm; 373 - u32 ctrlstatic; 374 - u32 maskedflags; 375 - 376 - /* Do not allow changing controller mode while running */ 377 - if (dev->flags & IFF_UP) 378 - return -EBUSY; 379 - cm = nla_data(data[IFLA_CAN_CTRLMODE]); 380 - ctrlstatic = can_get_static_ctrlmode(priv); 381 - maskedflags = cm->flags & cm->mask; 382 - 383 - /* check whether provided bits are allowed to be passed */ 384 - if (maskedflags & ~(priv->ctrlmode_supported | ctrlstatic)) 385 - return -EOPNOTSUPP; 386 - 387 - /* do not check for static fd-non-iso if 'fd' is disabled */ 388 - if (!(maskedflags & CAN_CTRLMODE_FD)) 389 - ctrlstatic &= ~CAN_CTRLMODE_FD_NON_ISO; 390 - 391 - /* make sure static options are provided by configuration */ 392 - if ((maskedflags & ctrlstatic) != ctrlstatic) 393 - return -EOPNOTSUPP; 394 - 395 - /* If a top dependency flag is provided, reset all its dependencies */ 396 - if (cm->mask & CAN_CTRLMODE_FD) 397 - priv->ctrlmode &= ~CAN_CTRLMODE_FD_TDC_MASK; 398 - 399 - /* clear bits to be modified and copy the flag values */ 400 - priv->ctrlmode &= ~cm->mask; 401 - priv->ctrlmode |= maskedflags; 402 - 403 - /* Wipe potential leftovers from previous CAN FD config */ 404 - if (!(priv->ctrlmode & CAN_CTRLMODE_FD)) { 405 - memset(&priv->fd.data_bittiming, 0, 406 - sizeof(priv->fd.data_bittiming)); 407 - priv->ctrlmode &= ~CAN_CTRLMODE_FD_TDC_MASK; 408 - memset(&priv->fd.tdc, 0, sizeof(priv->fd.tdc)); 409 - } 410 - 411 - can_set_default_mtu(dev); 412 - } 318 + can_ctrlmode_changelink(dev, data, extack); 413 319 414 320 if (data[IFLA_CAN_BITTIMING]) { 415 321 struct can_bittiming bt;