Skip to content

Commit e1a5cd9

Browse files
vincent-mailholmarckleinebudde
authored andcommitted
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>
1 parent 2e543af commit e1a5cd9

File tree

1 file changed

+54
-42
lines changed

1 file changed

+54
-42
lines changed

drivers/net/can/dev/netlink.c

Lines changed: 54 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,59 @@ static int can_validate(struct nlattr *tb[], struct nlattr *data[],
172172
return 0;
173173
}
174174

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+
175228
static int can_tdc_changelink(struct data_bittiming_params *dbt_params,
176229
const struct nlattr *nla,
177230
struct netlink_ext_ack *extack)
@@ -315,48 +368,7 @@ static int can_changelink(struct net_device *dev, struct nlattr *tb[],
315368
/* We need synchronization with dev->stop() */
316369
ASSERT_RTNL();
317370

318-
if (data[IFLA_CAN_CTRLMODE]) {
319-
struct can_ctrlmode *cm;
320-
u32 ctrlstatic;
321-
u32 maskedflags;
322-
323-
/* Do not allow changing controller mode while running */
324-
if (dev->flags & IFF_UP)
325-
return -EBUSY;
326-
cm = nla_data(data[IFLA_CAN_CTRLMODE]);
327-
ctrlstatic = can_get_static_ctrlmode(priv);
328-
maskedflags = cm->flags & cm->mask;
329-
330-
/* check whether provided bits are allowed to be passed */
331-
if (maskedflags & ~(priv->ctrlmode_supported | ctrlstatic))
332-
return -EOPNOTSUPP;
333-
334-
/* do not check for static fd-non-iso if 'fd' is disabled */
335-
if (!(maskedflags & CAN_CTRLMODE_FD))
336-
ctrlstatic &= ~CAN_CTRLMODE_FD_NON_ISO;
337-
338-
/* make sure static options are provided by configuration */
339-
if ((maskedflags & ctrlstatic) != ctrlstatic)
340-
return -EOPNOTSUPP;
341-
342-
/* If a top dependency flag is provided, reset all its dependencies */
343-
if (cm->mask & CAN_CTRLMODE_FD)
344-
priv->ctrlmode &= ~CAN_CTRLMODE_FD_TDC_MASK;
345-
346-
/* clear bits to be modified and copy the flag values */
347-
priv->ctrlmode &= ~cm->mask;
348-
priv->ctrlmode |= maskedflags;
349-
350-
/* Wipe potential leftovers from previous CAN FD config */
351-
if (!(priv->ctrlmode & CAN_CTRLMODE_FD)) {
352-
memset(&priv->fd.data_bittiming, 0,
353-
sizeof(priv->fd.data_bittiming));
354-
priv->ctrlmode &= ~CAN_CTRLMODE_FD_TDC_MASK;
355-
memset(&priv->fd.tdc, 0, sizeof(priv->fd.tdc));
356-
}
357-
358-
can_set_default_mtu(dev);
359-
}
371+
can_ctrlmode_changelink(dev, data, extack);
360372

361373
if (data[IFLA_CAN_BITTIMING]) {
362374
struct can_bittiming bt;

0 commit comments

Comments
 (0)