From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mo4-p01-ob.smtp.rzone.de (mo4-p01-ob.smtp.rzone.de [85.215.255.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 60557302CB2 for ; Fri, 21 Nov 2025 19:35:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=85.215.255.54 ARC-Seal:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763753742; cv=pass; b=Nf2ispgQ57maNPV9ooIU0wKGDSM40MasqUtTJHA7sXxnme1dMg4BL411LE3EVU9qf6p4owUUYq9bTbdzgqilrHJL36ruq9VwT+u14z/S0raAz0EaOyAiVLZQUr+Swy7vZjQBEsinD95L8TsAGqj1YTRCg6ir6oAYAxzxATSaGFk= ARC-Message-Signature:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763753742; c=relaxed/simple; bh=GLYw6DWDt3oePp+8a+BgZIKpOTOFAKzaaYW/2Fjfr0g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=f5BTQErHKYp9o2URegRmyxw5mtxqyv8SNDOe2O+RD08eZ/6uTbSPzhR5S8BXGqR7h/fGBoqP79cWTT4S+ENZVEF828hmH4aEnRZ1nNhar3XgTxCOWrtAcotTU2vvUQNsV1d1KAmzxOoOm1d0PmrijEZIfX0s5PXpu+G9dE0Pw04= ARC-Authentication-Results:i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=hartkopp.net; spf=pass smtp.mailfrom=hartkopp.net; dkim=pass (2048-bit key) header.d=hartkopp.net header.i=@hartkopp.net header.b=gvFk7a4V; dkim=permerror (0-bit key) header.d=hartkopp.net header.i=@hartkopp.net header.b=LzFwRuvI; arc=pass smtp.client-ip=85.215.255.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=hartkopp.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=hartkopp.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=hartkopp.net header.i=@hartkopp.net header.b="gvFk7a4V"; dkim=permerror (0-bit key) header.d=hartkopp.net header.i=@hartkopp.net header.b="LzFwRuvI" ARC-Seal: i=1; a=rsa-sha256; t=1763753728; cv=none; d=strato.com; s=strato-dkim-0002; b=p6uesI28+G7filpWjGXW5/mnAt3aC7IRG0i6dbH8PraHwdMS4PjhAGUgt73DPK1WBw 1RObUYOah0ufTg/8r3U1HcFUXtF+Bogw4LLNfSejF8Gs9qzuxK5AUejR1yFkqWFAv5CE cZpq+xSfI/FqjgOWqLNXRwQ93BS4FleR862+5B3m+F0qZ6OBj9VavdTXskiIrTyvVg1j GxAxUZaGPb0yM9lmLWBY64hR1sX77f5WDgkiduQ14xkYd8Y/1QyaAYnPgiqy60jniSFB f+DKgl5oPFpYA8gVtRFvXX4jrs1ZCbcwZ5B/uEfUDjop1wYD/4UX2OJA2LAo8m5iJmUm Gz0g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; t=1763753728; s=strato-dkim-0002; d=strato.com; h=References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Cc:Date: From:Subject:Sender; bh=tFwzf0H47txhVYqX1RnH/isA6GYuE7RxeqKNFJkbEsE=; b=AQ4yk/ElKr2zWNFGmzx8SUw1q3sL3c68mEiHM22nT0sHW3/0GZMInnQdAiWl2agHR0 evBb+SkPnWpVPRpJRXMkelKa9kbmus/i5vbXO4AmQm6V8dcNqzaGY5uXEbbTRyyX+U9c FixGu53PyVbsK64YE4ctrByB4i+EX6UDQGuwD8JYKTDgtqRdAv/rRNDqhID2Uf8LLfxI gqkgADVMFKGqJPvO8FGstxs06SnGmYOQQtBJqM2Z8yj7fFVQy0i3py9couVaLGeSewhr mMvKf34qf/f1sJh0Qi5p+DUNFMnCfcRlnOWT9K2n9UuKaLTyhhpQEXymUwBF9IG5Y0KF 7zZg== ARC-Authentication-Results: i=1; strato.com; arc=none; dkim=none X-RZG-CLASS-ID: mo01 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; t=1763753728; s=strato-dkim-0002; d=hartkopp.net; h=References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Cc:Date: From:Subject:Sender; bh=tFwzf0H47txhVYqX1RnH/isA6GYuE7RxeqKNFJkbEsE=; b=gvFk7a4Vv32i6fwxVCvJHYZ5VnKPBGUpQe8oRlAFykZku961q3s+Fd9oqtLRhT8wk/ KMHGXcz8CrJGEiYdD18DRnG57gklMcXQ0wTeS2WqL8YXk31sPOqxjZD2jV0eLGhU320H X6FBoRMXmzxsgvH68XYAtLTyFrlxfK096VjtSbBUI8oSpCcCyKquVl/OP0lMz627cX7l XJlWQGqSlaCcyOG+eeigQhz1GqmD5zraEPzxl9q41+Pqs/dBbh7DL7W59ABRI5zbNiDc a0EULjijPsf47iXrk2zm1ye6wgGXPQivJhQmQH+f1EbLH0lgNozwR64ID1uVwUAcsa67 unVQ== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; t=1763753728; s=strato-dkim-0003; d=hartkopp.net; h=References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Cc:Date: From:Subject:Sender; bh=tFwzf0H47txhVYqX1RnH/isA6GYuE7RxeqKNFJkbEsE=; b=LzFwRuvIf9u7jeoz2x9JL77a5EFpN1sbegqu9yxteDaT9XfjG+OBBel9YqvcLyFrFM hF9CkMa8ROQgs9AAwXBw== X-RZG-AUTH: ":P2MHfkW8eP4Mre39l357AZT/I7AY/7nT2yrDxb8mjH4JKvMdQv2tTUsMrZpkO3Mw3lZ/t54cFxeEQ7s8bGWj0Q==" Received: from lenov17.lan by smtp.strato.de (RZmta 54.0.0 AUTH) with ESMTPSA id Ke2b461ALJZSEn7 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256 bits)) (Client did not present a certificate); Fri, 21 Nov 2025 20:35:28 +0100 (CET) From: Oliver Hartkopp To: linux-can@vger.kernel.org Cc: Vincent Mailhol , Oliver Hartkopp Subject: [canxl v5 06/17] can: netlink: add CAN_CTRLMODE_XL_TMS flag Date: Fri, 21 Nov 2025 20:35:02 +0100 Message-ID: <20251121193513.2097-7-socketcan@hartkopp.net> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251121193513.2097-1-socketcan@hartkopp.net> References: <20251121193513.2097-1-socketcan@hartkopp.net> Precedence: bulk X-Mailing-List: linux-can@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="us-ascii" From: Vincent Mailhol The Transceiver Mode Switching (TMS) indicates whether the CAN XL controller shall use the PWM or NRZ encoding during the data phase. The term "transceiver mode switching" is used in both ISO 11898-1 and CiA 612-2 (although only the latter one uses the abbreviation TMS). We adopt the same naming convention here for consistency. Add the CAN_CTRLMODE_XL_TMS flag to the list of the CAN control modes. Add can_validate_xl_flags() to check the coherency of the TMS flag. That function will be reused in upcoming changes to validate the other CAN XL flags. Signed-off-by: Vincent Mailhol Signed-off-by: Oliver Hartkopp --- drivers/net/can/dev/dev.c | 2 ++ drivers/net/can/dev/netlink.c | 48 ++++++++++++++++++++++++++++++-- include/uapi/linux/can/netlink.h | 1 + 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/drivers/net/can/dev/dev.c b/drivers/net/can/dev/dev.c index dbc9b099b3f9..32db9f69844d 100644 --- a/drivers/net/can/dev/dev.c +++ b/drivers/net/can/dev/dev.c @@ -121,10 +121,12 @@ const char *can_get_ctrlmode_str(u32 ctrlmode) return "XL"; case CAN_CTRLMODE_XL_TDC_AUTO: return "XL-TDC-AUTO"; case CAN_CTRLMODE_XL_TDC_MANUAL: return "XL-TDC-MANUAL"; + case CAN_CTRLMODE_XL_TMS: + return "TMS"; default: return ""; } } EXPORT_SYMBOL_GPL(can_get_ctrlmode_str); diff --git a/drivers/net/can/dev/netlink.c b/drivers/net/can/dev/netlink.c index fdd1fa7cf93a..b2c24439abba 100644 --- a/drivers/net/can/dev/netlink.c +++ b/drivers/net/can/dev/netlink.c @@ -179,10 +179,36 @@ static int can_validate_databittiming(struct nlattr *data[], return err; return 0; } +static int can_validate_xl_flags(struct netlink_ext_ack *extack, + u32 masked_flags, u32 mask) +{ + if (masked_flags & CAN_CTRLMODE_XL) { + if (masked_flags & CAN_CTRLMODE_XL_TMS) { + const u32 tms_conflicts_mask = CAN_CTRLMODE_FD | + CAN_CTRLMODE_XL_TDC_MASK; + u32 tms_conflicts = masked_flags & tms_conflicts_mask; + + if (tms_conflicts) { + NL_SET_ERR_MSG_FMT(extack, + "TMS and %s are mutually exclusive", + can_get_ctrlmode_str(tms_conflicts)); + return -EOPNOTSUPP; + } + } + } else { + if (mask & CAN_CTRLMODE_XL_TMS) { + NL_SET_ERR_MSG(extack, "TMS requires CAN XL"); + return -EOPNOTSUPP; + } + } + + return 0; +} + static int can_validate(struct nlattr *tb[], struct nlattr *data[], struct netlink_ext_ack *extack) { u32 flags = 0; int err; @@ -199,10 +225,14 @@ static int can_validate(struct nlattr *tb[], struct nlattr *data[], (flags & CAN_CTRLMODE_RESTRICTED)) { NL_SET_ERR_MSG(extack, "LISTEN-ONLY and RESTRICTED modes are mutually exclusive"); return -EOPNOTSUPP; } + + err = can_validate_xl_flags(extack, flags, cm->mask); + if (err) + return err; } err = can_validate_bittiming(data, extack, IFLA_CAN_BITTIMING); if (err) return err; @@ -224,11 +254,11 @@ 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 ctrlstatic, maskedflags, notsupp, ctrlstatic_missing; + u32 ctrlstatic, maskedflags, deactivated, notsupp, ctrlstatic_missing; if (!data[IFLA_CAN_CTRLMODE]) return 0; /* Do not allow changing controller mode while running */ @@ -236,10 +266,11 @@ static int can_ctrlmode_changelink(struct net_device *dev, return -EBUSY; cm = nla_data(data[IFLA_CAN_CTRLMODE]); ctrlstatic = can_get_static_ctrlmode(priv); maskedflags = cm->flags & cm->mask; + deactivated = ~cm->flags & cm->mask; notsupp = maskedflags & ~(priv->ctrlmode_supported | ctrlstatic); ctrlstatic_missing = (maskedflags & ctrlstatic) ^ ctrlstatic; if (notsupp) { NL_SET_ERR_MSG_FMT(extack, @@ -257,15 +288,25 @@ static int can_ctrlmode_changelink(struct net_device *dev, "missing required %s static control mode", can_get_ctrlmode_str(ctrlstatic_missing)); return -EOPNOTSUPP; } + /* If FD was active and is not turned off, check for XL conflicts */ + if (priv->ctrlmode & CAN_CTRLMODE_FD & ~deactivated) { + if (maskedflags & CAN_CTRLMODE_XL_TMS) { + NL_SET_ERR_MSG(extack, + "TMS can not be activated while CAN FD is on"); + 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; if (cm->mask & CAN_CTRLMODE_XL) - priv->ctrlmode &= ~(CAN_CTRLMODE_XL_TDC_MASK); + priv->ctrlmode &= ~(CAN_CTRLMODE_XL_TDC_MASK | + CAN_CTRLMODE_XL_TMS); /* clear bits to be modified and copy the flag values */ priv->ctrlmode &= ~cm->mask; priv->ctrlmode |= maskedflags; @@ -393,11 +434,12 @@ static int can_dbt_changelink(struct net_device *dev, struct nlattr *data[], memset(&dbt_params->tdc, 0, sizeof(dbt_params->tdc)); if (data[IFLA_CAN_CTRLMODE]) { struct can_ctrlmode *cm = nla_data(data[IFLA_CAN_CTRLMODE]); - need_tdc_calc = !(cm->mask & tdc_mask); + if (fd || !(priv->ctrlmode & CAN_CTRLMODE_XL_TMS)) + need_tdc_calc = !(cm->mask & tdc_mask); } if (data_tdc) { /* TDC parameters are provided: use them */ err = can_tdc_changelink(dbt_params, data_tdc, extack); if (err) { diff --git a/include/uapi/linux/can/netlink.h b/include/uapi/linux/can/netlink.h index c2c96c5978a8..ebafb091d80f 100644 --- a/include/uapi/linux/can/netlink.h +++ b/include/uapi/linux/can/netlink.h @@ -105,10 +105,11 @@ struct can_ctrlmode { #define CAN_CTRLMODE_TDC_MANUAL 0x400 /* FD TDCV is manually set up by user */ #define CAN_CTRLMODE_RESTRICTED 0x800 /* Restricted operation mode */ #define CAN_CTRLMODE_XL 0x1000 /* CAN XL mode */ #define CAN_CTRLMODE_XL_TDC_AUTO 0x2000 /* XL transceiver automatically calculates TDCV */ #define CAN_CTRLMODE_XL_TDC_MANUAL 0x4000 /* XL TDCV is manually set up by user */ +#define CAN_CTRLMODE_XL_TMS 0x8000 /* Transceiver Mode Switching */ /* * CAN device statistics */ struct can_device_stats { -- 2.47.3