Hi Marc, This patch fixes the bug you just encountered: having both TDC_AUTO and TDC_MANUAL set at the same time. I also cleaned all garbage data in struct can_tdc because that was trivial. This patch is meant to be squashed into: commit ca7200319a90 ("can: netlink: add interface for CAN-FD Transmitter Delay Compensation (TDC)") For now, I am just sharing it here so that you can continue your testing. I will resend the full series after we finish current ongoing discussion. Signed-off-by: Vincent Mailhol <mailhol.vincent@xxxxxxxxxx> --- drivers/net/can/dev/netlink.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/can/dev/netlink.c b/drivers/net/can/dev/netlink.c index f05745c96b9c..d8cefe7d354c 100644 --- a/drivers/net/can/dev/netlink.c +++ b/drivers/net/can/dev/netlink.c @@ -204,6 +204,7 @@ static int can_changelink(struct net_device *dev, struct nlattr *tb[], } } + priv->ctrlmode &= ~CAN_CTRLMODE_TDC_MASK; if (data[IFLA_CAN_CTRLMODE]) { struct can_ctrlmode *cm; u32 ctrlstatic; @@ -239,8 +240,6 @@ static int can_changelink(struct net_device *dev, struct nlattr *tb[], dev->mtu = CAN_MTU; memset(&priv->data_bittiming, 0, sizeof(priv->data_bittiming)); - memset(&priv->tdc, 0, sizeof(priv->tdc)); - priv->ctrlmode &= ~CAN_CTRLMODE_TDC_MASK; } tdc_mask = cm->mask & CAN_CTRLMODE_TDC_MASK; @@ -326,6 +325,7 @@ static int can_changelink(struct net_device *dev, struct nlattr *tb[], priv->termination = termval; } + memset(&priv->tdc, 0, sizeof(priv->tdc)); if (data[IFLA_CAN_TDC]) { /* Use the provided TDC parameters */ err = can_tdc_changelink(dev, data[IFLA_CAN_TDC], extack); -- 2.31.1