From nobody Thu Oct 2 05:03:28 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 3EEB630F95C; Tue, 23 Sep 2025 05:40:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758606055; cv=none; b=cGOxDayPXYeUK0vvk9sYWmktIiK/2HIeex9K39a8+/N1yCdty30TZwODwLbKcJtR2VcqJCm2oCWBvmXjq7zOTlwy4U8QHEt0CyVLNJ4E3LBpNS9PQondcbqWRjOxFdDcPkVDYUSEtOwvDszCI2z3QZeBq820ZvgsROV4MKa6Sng= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758606055; c=relaxed/simple; bh=v3v+O363rC+dn52ot3vqRu7qNq/YGiBUd4dacgQWkrQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ORq6kCRL4SeuthSENj7MiitvA70To8TH8vUK+v0hbH0ZXyeM4PE+bUkPoFYOjeuN5wDUuOpF+RNE6fK/ngcyyBFZJCtDUdZ2uNcVPefwQaaSBNUzfzJTP8YyPMKVsq2ZLs0+PvMROmtKBIGCOxfHn5FRV3JWwMp/Fz1w7XdDKMk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=CAs5t3df; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="CAs5t3df" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A1A0EC4AF0B; Tue, 23 Sep 2025 05:40:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1758606054; bh=v3v+O363rC+dn52ot3vqRu7qNq/YGiBUd4dacgQWkrQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=CAs5t3dff3fEsfs7beYsMaMQZsQWm5/RHDL6A1hI9eCN7an5+1BI8BC5Ffsf0Frpx c9KGSaJ66lhfnCvuko/EQmD07Mce8W6xzv09KHVP3gE8DRk4XYGoxX0Aaxmu1JMJxO +GKcKKjAnSc1AyzdD/KubQ9ztOZxFoM1M1K3GX5tpH5CuAptP1AAGSjepsCTczKq+G T8KHHE0HhKHPMe1CLcFSm9wVdyWhov+7T9golkS5Env23YqWcgQU7LveK2AigUK5CQ IYd90uDT5O4K9v58NRKVr5WOMBNFMtA6bPQscdLiPNnS0SQZYw2Lwzs3aG9mTC4RE6 pSVXfUnvS/qDQ== From: Vincent Mailhol Date: Tue, 23 Sep 2025 14:39:40 +0900 Subject: [PATCH v3 05/20] can: netlink: add can_validate_tdc() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250923-canxl-netlink-prep-v3-5-87a7684333f3@kernel.org> References: <20250923-canxl-netlink-prep-v3-0-87a7684333f3@kernel.org> In-Reply-To: <20250923-canxl-netlink-prep-v3-0-87a7684333f3@kernel.org> To: Marc Kleine-Budde , Oliver Hartkopp Cc: Vincent Mailhol , =?utf-8?q?St=C3=A9phane_Grosjean?= , Robert Nawrath , Minh Le , Duy Nguyen , linux-can@vger.kernel.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4624; i=mailhol@kernel.org; h=from:subject:message-id; bh=v3v+O363rC+dn52ot3vqRu7qNq/YGiBUd4dacgQWkrQ=; b=owGbwMvMwCV2McXO4Xp97WbG02pJDBmXjLbcXbAwrHppyI+cxFtJz7OedPLOO+qbyXxLPtm09 8N68ST5jlIWBjEuBlkxRZZl5ZzcCh2F3mGH/lrCzGFlAhnCwMUpABNx+cHIsPp2a+f6uzsdXk9i DVe0Cr7Zffdnxva3mmqBqUuPt0QIejD892ye/OHztsvVteXMSu+dhPadMd/T2azvXuh40O7zOfG trAA= X-Developer-Key: i=mailhol@kernel.org; a=openpgp; fpr=ED8F700574E67F20E574E8E2AB5FEB886DBB99C2 Factorise the TDC validation out of can_validate() and move it in the new can_validate_tdc() function. This is a preparation patch for the introduction of CAN XL because this TDC validation will be reused later on. Signed-off-by: Vincent Mailhol --- Changelog: RFC -> v1: - fix bug on tdc flags mutual exclusivity: 'if (tdc_auto =3D=3D tdc_manual)' -> 'if (tdc_auto && tdc_manual)' --- drivers/net/can/dev/netlink.c | 82 +++++++++++++++++++++++++--------------= ---- include/linux/can/bittiming.h | 4 +++ 2 files changed, 52 insertions(+), 34 deletions(-) diff --git a/drivers/net/can/dev/netlink.c b/drivers/net/can/dev/netlink.c index 13555253e789ec6ca9c8c30571c990ad6bfde770..25c08adee9ade22a5dabdd3dec1= b5eb1ee16a78e 100644 --- a/drivers/net/can/dev/netlink.c +++ b/drivers/net/can/dev/netlink.c @@ -57,6 +57,49 @@ static int can_validate_bittiming(struct nlattr *data[], return 0; } =20 +static int can_validate_tdc(struct nlattr *data_tdc, + struct netlink_ext_ack *extack, u32 tdc_flags) +{ + bool tdc_manual =3D tdc_flags & CAN_CTRLMODE_TDC_MANUAL_MASK; + bool tdc_auto =3D tdc_flags & CAN_CTRLMODE_TDC_AUTO_MASK; + int err; + + /* CAN_CTRLMODE_TDC_{AUTO,MANUAL} are mutually exclusive */ + if (tdc_auto && tdc_manual) + return -EOPNOTSUPP; + + /* If one of the CAN_CTRLMODE_TDC_* flag is set then TDC + * must be set and vice-versa + */ + if ((tdc_auto || tdc_manual) !=3D !!data_tdc) + return -EOPNOTSUPP; + + /* If providing TDC parameters, at least TDCO is needed. TDCV + * is needed if and only if CAN_CTRLMODE_TDC_MANUAL is set + */ + if (data_tdc) { + struct nlattr *tb_tdc[IFLA_CAN_TDC_MAX + 1]; + + err =3D nla_parse_nested(tb_tdc, IFLA_CAN_TDC_MAX, + data_tdc, can_tdc_policy, extack); + if (err) + return err; + + if (tb_tdc[IFLA_CAN_TDC_TDCV]) { + if (tdc_auto) + return -EOPNOTSUPP; + } else { + if (tdc_manual) + return -EOPNOTSUPP; + } + + if (!tb_tdc[IFLA_CAN_TDC_TDCO]) + return -EOPNOTSUPP; + } + + return 0; +} + static int can_validate(struct nlattr *tb[], struct nlattr *data[], struct netlink_ext_ack *extack) { @@ -67,7 +110,7 @@ static int can_validate(struct nlattr *tb[], struct nlat= tr *data[], * - nominal/arbitration bittiming * - data bittiming * - control mode with CAN_CTRLMODE_FD set - * - TDC parameters are coherent (details below) + * - TDC parameters are coherent (details in can_validate_tdc()) */ =20 if (!data) @@ -75,42 +118,13 @@ static int can_validate(struct nlattr *tb[], struct nl= attr *data[], =20 if (data[IFLA_CAN_CTRLMODE]) { struct can_ctrlmode *cm =3D nla_data(data[IFLA_CAN_CTRLMODE]); - u32 tdc_flags =3D cm->flags & CAN_CTRLMODE_FD_TDC_MASK; =20 is_can_fd =3D cm->flags & cm->mask & CAN_CTRLMODE_FD; =20 - /* CAN_CTRLMODE_TDC_{AUTO,MANUAL} are mutually exclusive */ - if (tdc_flags =3D=3D CAN_CTRLMODE_FD_TDC_MASK) - return -EOPNOTSUPP; - /* If one of the CAN_CTRLMODE_TDC_* flag is set then - * TDC must be set and vice-versa - */ - if (!!tdc_flags !=3D !!data[IFLA_CAN_TDC]) - return -EOPNOTSUPP; - /* If providing TDC parameters, at least TDCO is - * needed. TDCV is needed if and only if - * CAN_CTRLMODE_TDC_MANUAL is set - */ - if (data[IFLA_CAN_TDC]) { - struct nlattr *tb_tdc[IFLA_CAN_TDC_MAX + 1]; - - err =3D nla_parse_nested(tb_tdc, IFLA_CAN_TDC_MAX, - data[IFLA_CAN_TDC], - can_tdc_policy, extack); - if (err) - return err; - - if (tb_tdc[IFLA_CAN_TDC_TDCV]) { - if (tdc_flags & CAN_CTRLMODE_TDC_AUTO) - return -EOPNOTSUPP; - } else { - if (tdc_flags & CAN_CTRLMODE_TDC_MANUAL) - return -EOPNOTSUPP; - } - - if (!tb_tdc[IFLA_CAN_TDC_TDCO]) - return -EOPNOTSUPP; - } + err =3D can_validate_tdc(data[IFLA_CAN_TDC], extack, + cm->flags & CAN_CTRLMODE_FD_TDC_MASK); + if (err) + return err; } =20 err =3D can_validate_bittiming(data, extack, IFLA_CAN_BITTIMING); diff --git a/include/linux/can/bittiming.h b/include/linux/can/bittiming.h index 4d5f7794194ab13641c7854c2d66625c4e942f6c..71f839c3f0325b2a496a4bc4470= 44a4853541338 100644 --- a/include/linux/can/bittiming.h +++ b/include/linux/can/bittiming.h @@ -16,6 +16,10 @@ =20 #define CAN_CTRLMODE_FD_TDC_MASK \ (CAN_CTRLMODE_TDC_AUTO | CAN_CTRLMODE_TDC_MANUAL) +#define CAN_CTRLMODE_TDC_AUTO_MASK \ + (CAN_CTRLMODE_TDC_AUTO) +#define CAN_CTRLMODE_TDC_MANUAL_MASK \ + (CAN_CTRLMODE_TDC_MANUAL) =20 /* * struct can_tdc - CAN FD Transmission Delay Compensation parameters --=20 2.49.1