@@ -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+
175228static 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