From nobody Fri Dec 19 19:23:32 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 309BB3191A8; Wed, 3 Dec 2025 18:25:56 +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=1764786357; cv=none; b=DM8+2xQe2qz5r4hj99CFqan18S8ufeo0iENriJgBMKzIt6J3hSc0WhyILYZyxLBloeLkygkQkdbPgSzkEgmUUHjGF3d6ZWKAn1HByryB8dlH1NcvDvUqYKoq754bDbZ5qX+npNLcYXWoHmDfKD3bl4OXYgT5UTuwlkdSxFvAzwU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764786357; c=relaxed/simple; bh=buB36Y5Sf5MgYfsXtNeJpE7oy9ZCXNnymdj5sOX4Nkg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rF6xamb8LWBFHXro0ih9N72emb9nrTJBR65p82HG9thOpX7lljJMqnpIYiJFJDp4z07MnwQdCR5X0EqvHrJg6AmACz7rvnT8z2sOQdeeg4su/oFu2DozMIG5q04TZFRyIXepmvhjw6SJ7FZEksMRz3qTWR4Lc1anL7NxLyFmPJc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=fytO8wms; 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="fytO8wms" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1C5D8C116B1; Wed, 3 Dec 2025 18:25:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1764786356; bh=buB36Y5Sf5MgYfsXtNeJpE7oy9ZCXNnymdj5sOX4Nkg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=fytO8wmsL8eg89d1gs6JQDUfv5MYtH/IBT4iibOY7tA6K9sksQZaqr27h8akUekGG VqB25Fq9Q5SO9n+Y6CJX8l1RZe4G5/dGgLvgRVTNw5DrMXAwHmrMhKrdIm8VZyesRi 343EyKK2AJ19yDZBPihzNkWXTInJVBclnWFaL5a2UT/tmZjr6cUwOQEQNf6tajb2Oq KDgeiH9PC9lPWBHNI0xlJqUCjfgsH9gJ6gqNECBY3LbG18zm4d203TPEorq8dG3VuU f/Lhp/0A++TWY9+LY+2yMG+QY8qrffEaRgss44YOql/ecFSYAr/6Ns9QWVejqAwO7j TlURp0gkW3a4Q== From: Vincent Mailhol Date: Wed, 03 Dec 2025 19:24:28 +0100 Subject: [PATCH iproute2-next v3 1/7] iplink_can: print_usage: fix the text indentation 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: <20251203-canxl-netlink-v3-1-999f38fae8c2@kernel.org> References: <20251203-canxl-netlink-v3-0-999f38fae8c2@kernel.org> In-Reply-To: <20251203-canxl-netlink-v3-0-999f38fae8c2@kernel.org> To: netdev@vger.kernel.org, Stephen Hemminger , Marc Kleine-Budde , Oliver Hartkopp , David Ahern Cc: Rakuram Eswaran , =?utf-8?q?St=C3=A9phane_Grosjean?= , linux-kernel@vger.kernel.org, linux-can@vger.kernel.org, Vincent Mailhol X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2576; i=mailhol@kernel.org; h=from:subject:message-id; bh=buB36Y5Sf5MgYfsXtNeJpE7oy9ZCXNnymdj5sOX4Nkg=; b=owGbwMvMwCV2McXO4Xp97WbG02pJDJkGDTN9u+uk3ty7X+e5TUzv/OJ3M/VUH3FxfJn+9LvE5 SV9X2V/dpSyMIhxMciKKbIsK+fkVugo9A479NcSZg4rE8gQBi5OAZhIhwbDP93v/49GTdXkZ5sj JW9+X/4d7545qZKfkjPDeS/w72D9m8Lwz/DKFrf/Idvt2hZHi/6q7/uxVHE7y79J377y/XSJ47H 0ZwYA X-Developer-Key: i=mailhol@kernel.org; a=openpgp; fpr=ED8F700574E67F20E574E8E2AB5FEB886DBB99C2 The description of the BITRATE variable is not correctly aligned with the other ones. Put it on a new line with the same indentation as the other variables. This done, reindent everything to only one tabulation (was one tabulation and two spaces before). Before this patch...: $ ip link help can Usage: ip link set DEVICE type can (...) Where: BITRATE :=3D { NUMBER in bps } SAMPLE-POINT :=3D { 0.000..0.999 } TQ :=3D { NUMBER in ns } PROP-SEG :=3D { NUMBER in tq } PHASE-SEG1 :=3D { NUMBER in tq } PHASE-SEG2 :=3D { NUMBER in tq } SJW :=3D { NUMBER in tq } TDCV :=3D { NUMBER in tc } TDCO :=3D { NUMBER in tc } TDCF :=3D { NUMBER in tc } RESTART-MS :=3D { 0 | NUMBER in ms } ...and after: $ ip link help can Usage: ip link set DEVICE type can (...) Where: BITRATE :=3D { NUMBER in bps } SAMPLE-POINT :=3D { 0.000..0.999 } TQ :=3D { NUMBER in ns } PROP-SEG :=3D { NUMBER in tq } PHASE-SEG1 :=3D { NUMBER in tq } PHASE-SEG2 :=3D { NUMBER in tq } SJW :=3D { NUMBER in tq } TDCV :=3D { NUMBER in tc } TDCO :=3D { NUMBER in tc } TDCF :=3D { NUMBER in tc } RESTART-MS :=3D { 0 | NUMBER in ms } Signed-off-by: Vincent Mailhol --- ip/iplink_can.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/ip/iplink_can.c b/ip/iplink_can.c index 1afdf088..f3640fe0 100644 --- a/ip/iplink_can.c +++ b/ip/iplink_can.c @@ -48,17 +48,18 @@ static void print_usage(FILE *f) "\n" "\t[ termination { 0..65535 } ]\n" "\n" - "\tWhere: BITRATE :=3D { NUMBER in bps }\n" - "\t SAMPLE-POINT :=3D { 0.000..0.999 }\n" - "\t TQ :=3D { NUMBER in ns }\n" - "\t PROP-SEG :=3D { NUMBER in tq }\n" - "\t PHASE-SEG1 :=3D { NUMBER in tq }\n" - "\t PHASE-SEG2 :=3D { NUMBER in tq }\n" - "\t SJW :=3D { NUMBER in tq }\n" - "\t TDCV :=3D { NUMBER in tc }\n" - "\t TDCO :=3D { NUMBER in tc }\n" - "\t TDCF :=3D { NUMBER in tc }\n" - "\t RESTART-MS :=3D { 0 | NUMBER in ms }\n" + "\tWhere:\n" + "\t BITRATE :=3D { NUMBER in bps }\n" + "\t SAMPLE-POINT :=3D { 0.000..0.999 }\n" + "\t TQ :=3D { NUMBER in ns }\n" + "\t PROP-SEG :=3D { NUMBER in tq }\n" + "\t PHASE-SEG1 :=3D { NUMBER in tq }\n" + "\t PHASE-SEG2 :=3D { NUMBER in tq }\n" + "\t SJW :=3D { NUMBER in tq }\n" + "\t TDCV :=3D { NUMBER in tc }\n" + "\t TDCO :=3D { NUMBER in tc }\n" + "\t TDCF :=3D { NUMBER in tc }\n" + "\t RESTART-MS :=3D { 0 | NUMBER in ms }\n" ); } =20 --=20 2.51.2 From nobody Fri Dec 19 19:23:32 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 6868F328634; Wed, 3 Dec 2025 18:26:00 +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=1764786360; cv=none; b=frWBZg+GGoyt5w0Uo38cfxFE+UmyByKmKPiGXeYZrZX2PVdfqa/I01Lq8gKO7clkEgSN/o0vDEXtHynI1yLaGkrLlQ8SvjMDZ0ZJtvawu0PNLFxZGTmlQT1snspiR5i4e3fUHiLFcpDYz5/srvZC3YgPKVYn6sbgUmB3k3UeXr8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764786360; c=relaxed/simple; bh=M4KKHo72Z25bXFP51FFH0SkrJdmV0dkgh6ZN6tjjy80=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=iseILfFJMtzrZZ2HvMKFNipRoheckc0D00uTZyQooYsaMDHi5/MvbURdmYKZtwBlMUkABpp8m3q+0EnCTaWX0LuN4w51j0ZVjMs3zxjXl82OYA4HUyXJnRlR+e+DL4DXYQLQJxKSoDs1mHNhJb4WBPA9hyUTvuGfUByeM2bXl1c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=eGhD1Cg8; 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="eGhD1Cg8" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4BDD6C16AAE; Wed, 3 Dec 2025 18:25:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1764786359; bh=M4KKHo72Z25bXFP51FFH0SkrJdmV0dkgh6ZN6tjjy80=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=eGhD1Cg87k3AA+sF7HlR5cbEwSGs+VN6peIwg/BSj64h0C5T+OXNlRd00wWGtIwax TmjbmkUX9TyCAmGG1GaY0Yd40+s+Zo66YzlV8E8xMv4Kbd8OAvCEtVPHb52qQ4zss1 w8V6hXat4wM4Xwe/yaiIcNyiRhknr9osHc6Zqq3FXuKP94Q/+K/cqTQrp/4qUYMeTa WTEuVTPHqVHhBdFq5B9pkAiGPzIBkhMXEs/YR+STPl8D+FnCQGnNRbdM51FrPeV9Qo vmQ79Ap9RmB2XFUI6MrE7wgYbPJLkiJPXryTSqLItPALp5qY3BrRqqWx/EKEQAT+vv wsRbHfsu7lWIA== From: Vincent Mailhol Date: Wed, 03 Dec 2025 19:24:29 +0100 Subject: [PATCH iproute2-next v3 2/7] iplink_can: print_usage: change unit for minimum time quanta to mtq 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: <20251203-canxl-netlink-v3-2-999f38fae8c2@kernel.org> References: <20251203-canxl-netlink-v3-0-999f38fae8c2@kernel.org> In-Reply-To: <20251203-canxl-netlink-v3-0-999f38fae8c2@kernel.org> To: netdev@vger.kernel.org, Stephen Hemminger , Marc Kleine-Budde , Oliver Hartkopp , David Ahern Cc: Rakuram Eswaran , =?utf-8?q?St=C3=A9phane_Grosjean?= , linux-kernel@vger.kernel.org, linux-can@vger.kernel.org, Vincent Mailhol X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1309; i=mailhol@kernel.org; h=from:subject:message-id; bh=M4KKHo72Z25bXFP51FFH0SkrJdmV0dkgh6ZN6tjjy80=; b=owGbwMvMwCV2McXO4Xp97WbG02pJDJkGDXPm5gpf9/S2FjZiqDcorYqeIVe3vk/27MYzR6/8e L9y1c22jlIWBjEuBlkxRZZl5ZzcCh2F3mGH/lrCzGFlAhnCwMUpABNpiWFkWGc96YOtZ1GQdZpy +emoI5leMze6nNw5Nbku7um67zymPgz/NFyP/556ct1tdvutjBz7Lee/dj1p6Oe43vG4nkDQh5K 5XAA= X-Developer-Key: i=mailhol@kernel.org; a=openpgp; fpr=ED8F700574E67F20E574E8E2AB5FEB886DBB99C2 In the vast majority of the available CAN datasheets, the minimum time quanta is abbreviated as "mtq". Note that the ISO standard uses "tqmin" (with the "min" part as a subscript). One fact is that no one seems to be using "tc". I was actually the one who initially proposed to use "tc", but I can not recall anymore the reasoning behind that. Change the minimum time quanta unit from "tc" to "mtq" to follow what the majority of the industry does. Fixes: 0c263d7c36ff ("iplink_can: add new CAN FD bittiming parameters: Tran= smitter Delay Compensation (TDC)") Signed-off-by: Vincent Mailhol --- ip/iplink_can.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ip/iplink_can.c b/ip/iplink_can.c index f3640fe0..ee27659c 100644 --- a/ip/iplink_can.c +++ b/ip/iplink_can.c @@ -56,9 +56,9 @@ static void print_usage(FILE *f) "\t PHASE-SEG1 :=3D { NUMBER in tq }\n" "\t PHASE-SEG2 :=3D { NUMBER in tq }\n" "\t SJW :=3D { NUMBER in tq }\n" - "\t TDCV :=3D { NUMBER in tc }\n" - "\t TDCO :=3D { NUMBER in tc }\n" - "\t TDCF :=3D { NUMBER in tc }\n" + "\t TDCV :=3D { NUMBER in mtq }\n" + "\t TDCO :=3D { NUMBER in mtq }\n" + "\t TDCF :=3D { NUMBER in mtq }\n" "\t RESTART-MS :=3D { 0 | NUMBER in ms }\n" ); } --=20 2.51.2 From nobody Fri Dec 19 19:23:32 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 3789031B101; Wed, 3 Dec 2025 18:26:02 +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=1764786363; cv=none; b=eFCIYDnS0ExYn/IdDb9SseuWpIpjQMD2SiLoMIfSMVCDqWzzUgc1n3crRFC3ZYVQEwwFoiCOj9k9VGQqN3N8UxVY6qM3yWVJ65ySfdyXIe0g6rKUkcHIvfToNapPhENBNoWr4KZ5Uq+2wLAgnHQzxGPqKdD/gGdnlluy7RB9NT4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764786363; c=relaxed/simple; bh=mJaIOjf4TRv4beB1yQdNszFV8zzBBZCGjwUvaq6QOFk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=B2i0yMRx3IWq3lSw+NqUuoVipP8Gx+sKsLeTP1CeL96MPdE4/E9nVdy9e4nIjqu/+K2ulgWYmlzkrou4K1nKVUB/I/1eYglnznwsn2B1/Kvj0rvnU687FF+cLCnVJCJnyECnINrHAsa6eHew4rgWE4XFswjBVTV+eN7rsSKOnvg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=rxJouGFI; 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="rxJouGFI" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5D3DEC116B1; Wed, 3 Dec 2025 18:26:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1764786362; bh=mJaIOjf4TRv4beB1yQdNszFV8zzBBZCGjwUvaq6QOFk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=rxJouGFIpZI+iZatp4NoPGYbMTHWUWvMddsEHX72F28dLLOUvdUhZA60Rs2QxeZe9 smnzi/U0YH/Qzfj+MVTSjUntaf7cJ9Efkmy2gcPwToi+oZpxNiReLkLE9AbCqnsd18 uDgQAaf1oqE+QX0yHEwHMtdTgs3xeYnSsbab4oMwaY94v3S1rAyn1ZXWRqV6qhqkHo jvSIhKi+Wkfx82wpLHII0fma3/LqEO4CjrHQjBL24jbjaCvCjPypvW/psNhMUgLvoV ma5gTYRbuq1AkRlYfhFQ04GO0YlFA5cvECw6meknDgUTK9u4LkK+oJA1kUE6qtnh9/ 0wnDppzVaXQuQ== From: Vincent Mailhol Date: Wed, 03 Dec 2025 19:24:30 +0100 Subject: [PATCH iproute2-next v3 3/7] iplink_can: print_usage: describe the CAN bittiming units 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: <20251203-canxl-netlink-v3-3-999f38fae8c2@kernel.org> References: <20251203-canxl-netlink-v3-0-999f38fae8c2@kernel.org> In-Reply-To: <20251203-canxl-netlink-v3-0-999f38fae8c2@kernel.org> To: netdev@vger.kernel.org, Stephen Hemminger , Marc Kleine-Budde , Oliver Hartkopp , David Ahern Cc: Rakuram Eswaran , =?utf-8?q?St=C3=A9phane_Grosjean?= , linux-kernel@vger.kernel.org, linux-can@vger.kernel.org, Vincent Mailhol X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1032; i=mailhol@kernel.org; h=from:subject:message-id; bh=mJaIOjf4TRv4beB1yQdNszFV8zzBBZCGjwUvaq6QOFk=; b=owGbwMvMwCV2McXO4Xp97WbG02pJDJkGDfPTdj2eUW84x9P6yqav2g6ZEtGVK4+85rmyVDJ5m dijoIDbHaUsDGJcDLJiiizLyjm5FToKvcMO/bWEmcPKBDKEgYtTACZSLsbI0ONeFDDrRX/qs6+u 6n+zOc4HahT/9jtzQImPv+v29l2X/RkZXj2ax1E3tXvaSsYdVkqs/qFBCnKx56asf7lKa7mIVto 1XgA= X-Developer-Key: i=mailhol@kernel.org; a=openpgp; fpr=ED8F700574E67F20E574E8E2AB5FEB886DBB99C2 While the meaning of "bps" or "ns" may be relatively easy to understand, some of the CAN specific units such as "mtq" (minimum time quanta) may be harder to understand. Add a new paragraph to the help menu which describes all the different units used for the CAN bittiming parameters. Signed-off-by: Vincent Mailhol --- Changelog v1 -> v2: - "s/milli second/millisecond/g" and "s/nano second/nanosecond/g" --- ip/iplink_can.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ip/iplink_can.c b/ip/iplink_can.c index ee27659c..d5abc43a 100644 --- a/ip/iplink_can.c +++ b/ip/iplink_can.c @@ -60,6 +60,13 @@ static void print_usage(FILE *f) "\t TDCO :=3D { NUMBER in mtq }\n" "\t TDCF :=3D { NUMBER in mtq }\n" "\t RESTART-MS :=3D { 0 | NUMBER in ms }\n" + "\n" + "\tUnits:\n" + "\t bps :=3D bit per second\n" + "\t ms :=3D millisecond\n" + "\t mtq :=3D minimum time quanta\n" + "\t ns :=3D nanosecond\n" + "\t tq :=3D time quanta\n" ); } =20 --=20 2.51.2 From nobody Fri Dec 19 19:23:32 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 39E3131D38F; Wed, 3 Dec 2025 18:26:05 +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=1764786366; cv=none; b=Tr5khLvcaZVVI0xTFROGDfYmTl82fX6Ch8Ky4hWwhVv9kK6FfK4Bq0AsXatUd93zUcwlueYrrOtUkFzOjUEGbmTZhz0vTEZvFRgybXi+iYY6BxRH/7DxG1BRXqelO5/BMmeHOFvAriOArwQWI9oybbrt/Ijd/dMuDSt772C3kX8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764786366; c=relaxed/simple; bh=QYZzNQBvCFLI2EZ4rvf8uqgFG68QjGj40iNCH+8qleg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=tNZRA7jWPJYIdD8pizUTfjMtFtW1GrDnxw8en/2eDphXpRhtyhFScXHKIVTLiDLvre5EhCGamC9TKJFrh0s7ovQbsIpNIDRGE5A//alrZMvHzsqHfQ2UdE37SjnyPS0NROhhb/vdTnUV7MTCxXguw1Znu7uivU/rogMtsZqdUqc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ehUAoF0o; 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="ehUAoF0o" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 50F1DC4CEF5; Wed, 3 Dec 2025 18:26:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1764786365; bh=QYZzNQBvCFLI2EZ4rvf8uqgFG68QjGj40iNCH+8qleg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=ehUAoF0oGLfjbAk6YnpfYK/V7DsUNJpb4MImWznqrlDUVQVy7kzTpNG4zzXpJcgW1 rP6+F2srhdNv9ELZtWzDpUwS90mn8fCOxtlP8DYslpvhxPND4E/8vfrFc4XQwHkwKl jCV1a4whkF5O1VZ74a2w8lnoL8lhnWQopSBJD1qNsi7c3pXLUPnZiwVfs8dnVW+fhy snIJyEQveW8dzSsu0eKSTKpCM/+MZ1cwqejNUrNpdn5OaVOefNCGFu3GrnpvMe2ytu SL533dfgeJ7r5LG7VNFDhLTLKNXikQmPhQYgQhyND8LIfpsE6sHgSxSsTqPPRFGKJw 73daiYEx36LUg== From: Vincent Mailhol Date: Wed, 03 Dec 2025 19:24:31 +0100 Subject: [PATCH iproute2-next v3 4/7] iplink_can: add RESTRICTED operation mode support 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: <20251203-canxl-netlink-v3-4-999f38fae8c2@kernel.org> References: <20251203-canxl-netlink-v3-0-999f38fae8c2@kernel.org> In-Reply-To: <20251203-canxl-netlink-v3-0-999f38fae8c2@kernel.org> To: netdev@vger.kernel.org, Stephen Hemminger , Marc Kleine-Budde , Oliver Hartkopp , David Ahern Cc: Rakuram Eswaran , =?utf-8?q?St=C3=A9phane_Grosjean?= , linux-kernel@vger.kernel.org, linux-can@vger.kernel.org, Vincent Mailhol X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2174; i=mailhol@kernel.org; h=from:subject:message-id; bh=QYZzNQBvCFLI2EZ4rvf8uqgFG68QjGj40iNCH+8qleg=; b=owGbwMvMwCV2McXO4Xp97WbG02pJDJkGDYvcWv9djn5hJtAYlMuU2TKH59h5NqVdKum39j13k /t5u2FzRykLgxgXg6yYIsuyck5uhY5C77BDfy1h5rAygQxh4OIUgInUxTD8D+GvzLV4+UV/9Zkd H2Y5fTPg+mU2dbFrw/YPC2cuWnM5bT8jw+dwvhmM8nmaXxQanitp/rdI4njuJeny5tCsiP0ii36 LcgAA X-Developer-Key: i=mailhol@kernel.org; a=openpgp; fpr=ED8F700574E67F20E574E8E2AB5FEB886DBB99C2 This is the iproute2 counterpart of Linux kernel's commit 60f511f443e5 ("can: netlink: add CAN_CTRLMODE_RESTRICTED"). ISO 11898-1:2024 adds a new restricted operation mode. This mode is added as a mandatory feature for nodes which support CAN XL and is retrofitted as optional for legacy nodes (i.e. the ones which only support Classical CAN and CAN FD). The restricted operation mode is nearly the same as the listen only mode: the node can not send data frames or remote frames and can not send dominant bits if an error occurs. The only exception is that the node shall still send the acknowledgment bit. Add the "restricted" option to iplink_can which controls the CAN_CTRLMODE_RESTRICTED flag of the netlink interface. Signed-off-by: Vincent Mailhol --- Changelog: v1 -> v2: - s/matches/strcmp/g in can_parse_opt() --- ip/iplink_can.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ip/iplink_can.c b/ip/iplink_can.c index d5abc43a..0ba86550 100644 --- a/ip/iplink_can.c +++ b/ip/iplink_can.c @@ -42,6 +42,7 @@ static void print_usage(FILE *f) "\t[ presume-ack { on | off } ]\n" "\t[ cc-len8-dlc { on | off } ]\n" "\t[ tdc-mode { auto | manual | off } ]\n" + "\t[ restricted { on | off } ]\n" "\n" "\t[ restart-ms TIME-MS ]\n" "\t[ restart ]\n" @@ -116,6 +117,7 @@ static void print_ctrlmode(enum output_type t, __u32 fl= ags, const char *key) print_flag(t, &flags, CAN_CTRLMODE_CC_LEN8_DLC, "CC-LEN8-DLC"); print_flag(t, &flags, CAN_CTRLMODE_TDC_AUTO, "TDC-AUTO"); print_flag(t, &flags, CAN_CTRLMODE_TDC_MANUAL, "TDC-MANUAL"); + print_flag(t, &flags, CAN_CTRLMODE_RESTRICTED, "RESTRICTED"); =20 if (flags) print_hex(t, NULL, "%x", flags); @@ -257,6 +259,9 @@ static int can_parse_opt(struct link_util *lu, int argc= , char **argv, invarg("\"tdc-mode\" must be either of \"auto\", \"manual\" or \"off\"= ", *argv); } + } else if (strcmp(*argv, "restricted") =3D=3D 0) { + NEXT_ARG(); + set_ctrlmode("restricted", *argv, &cm, CAN_CTRLMODE_RESTRICTED); } else if (matches(*argv, "restart") =3D=3D 0) { __u32 val =3D 1; =20 --=20 2.51.2 From nobody Fri Dec 19 19:23:32 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 D1BCE32E727; Wed, 3 Dec 2025 18:26:09 +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=1764786369; cv=none; b=k29QOxc4DKcKTBxYHszP1pE0CAxTwkzVJ0N/qhC2Uf1etD/l6wVbSNqiS8M+UuaFBD2D+nIJUg/CqtpmygMfxOSySezpfZEMazSy/MHuRpkpMyq1brvRL3bWwjEuvhT0ZtAp6pVgFJvvEwBJUO0wiQBFYlB4ldxEafzG0LBSsOY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764786369; c=relaxed/simple; bh=4EUBV3E88jFzZaKHRIUFav7cr3DT7U8xegEVdEy5mww=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=XDGfDHsxncW79BIDeW1BR4ckA8kT/lmY2XzKCrswsh56l8qWrBi0tDaKZ4LTyE9iPlQHLmp87/qxptKXZ5SSISsACZuPMZf1eSd86J6kOwaT/jWmUkV5IF/ClVAL8xDIBXi5cTPRvO3NbFLXkBH6Pg6f68bTCw7cK30cK5A9oXk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=AhoX6cMu; 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="AhoX6cMu" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 44AE9C116C6; Wed, 3 Dec 2025 18:26:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1764786369; bh=4EUBV3E88jFzZaKHRIUFav7cr3DT7U8xegEVdEy5mww=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=AhoX6cMu0ewqhOzvuumhgIY+dkRx0l7a+lN8RWFkLNNpdBxUS+S99t3NzLOm7lInn /+6hRVz5tNclaEgH6lLEBkNXrmMoU8Dgr7vapKaAdGjdrYZakApbbhmiJYQngs19k5 gxRnEqTTdzbYUmo7jymL3tbp2Z/fIZ/G4VFhgfuZY1IJzJQzttYcKorgaQsxys/mXd Q9gE1YJs0rPHvCiEP+CUQT1o8j4Qng2WSAvX4QO3phIrtXUmnM1cJ4tCqnMjnQmdJO DuQpDZfaC9kLgQLSZQCA79YReJ+E4YMXw6zMv7XbskeuWme4hAktE1Zo5m8ZLImPdF 1dfg8BqL+Foag== From: Vincent Mailhol Date: Wed, 03 Dec 2025 19:24:32 +0100 Subject: [PATCH iproute2-next v3 5/7] iplink_can: add initial CAN XL support 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: <20251203-canxl-netlink-v3-5-999f38fae8c2@kernel.org> References: <20251203-canxl-netlink-v3-0-999f38fae8c2@kernel.org> In-Reply-To: <20251203-canxl-netlink-v3-0-999f38fae8c2@kernel.org> To: netdev@vger.kernel.org, Stephen Hemminger , Marc Kleine-Budde , Oliver Hartkopp , David Ahern Cc: Rakuram Eswaran , =?utf-8?q?St=C3=A9phane_Grosjean?= , linux-kernel@vger.kernel.org, linux-can@vger.kernel.org, Vincent Mailhol X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=14776; i=mailhol@kernel.org; h=from:subject:message-id; bh=4EUBV3E88jFzZaKHRIUFav7cr3DT7U8xegEVdEy5mww=; b=owGbwMvMwCV2McXO4Xp97WbG02pJDJkGDUt3NTAbsZVWTfRidT+y5MMNV4/ml/MbRDfMOHxs3 b1wP+bFHaUsDGJcDLJiiizLyjm5FToKvcMO/bWEmcPKBDKEgYtTACZyqZnhr+xWThnml5KRfxhV +BOYTznNrrj2+nFxXtfZY7bTtk6/c5Thv+PFL5Lh/I83r/ggPsX12e/fCw5xXH7r7Xp+44nzWSW mISwA X-Developer-Key: i=mailhol@kernel.org; a=openpgp; fpr=ED8F700574E67F20E574E8E2AB5FEB886DBB99C2 This is the iproute2 counterpart of Linux kernel's commit e63281614747 ("can: netlink: add initial CAN XL support"). CAN XL uses bittiming parameters different from Classical CAN and CAN FD. Thus, all the data bittiming parameters, including TDC, need to be duplicated for CAN XL. Add the "xl" option to iplink_can which controls the CAN_CTRLMODE_XL flag of the netlink interface. Then add the "xbitrate", "xsample-point", "xtq", "xprop-seg", "xphase-seg1", "xphase-seg2", "xsjw", "xtdcv", "xtdco", "xtdcf" and "xtdc-mode" which are all sub options of "xl". Add the logic to query and print all those values. Update print_usage() accordingly. All these options behave similarly to their CAN FD equivalent. The new options which are specific to CAN XL (i.e. not inherited from CAN FD) will be added in a subsequent change. Example using the dummy_can driver: # modprobe dummy_can # ip link set can0 type can bitrate 500000 fd on dbitrate 2000000 xl on x= bitrate 8000000 $ ip --details link show can0 5: can0: mtu 2060 qdisc noop state DOWN mode DEFAULT group defaul= t qlen 10 link/can promiscuity 0 allmulti 0 minmtu 76 maxmtu 2060 can state STOPPED restart-ms 0 bitrate 500000 sample-point 0.875 tq 12 prop-seg 69 phase-seg1 70 phase-seg2 20 sjw 10 brp 2 dummy_can CC: tseg1 2..256 tseg2 2..128 sjw 1..128 brp 1..512 brp_inc 1 dbitrate 2000000 dsample-point 0.750 dtq 6 dprop-seg 29 dphase-seg1 30 dphase-seg2 20 dsjw 10 dbrp 1 tdco 60 tdcf 0 dummy_can FD: dtseg1 2..256 dtseg2 2..128 dsjw 1..128 dbrp 1..512 dbrp= _inc 1 tdco 0..127 tdcf 0..127 xbitrate 8000000 xsample-point 0.750 xtq 6 xprop-seg 7 xphase-seg1 7 xphase-seg2 5 xsjw 2 xbrp 1 xtdco 15 xtdcf 0 dummy_can XL: xtseg1 2..256 xtseg2 2..128 xsjw 1..128 xbrp 1..512 xbrp= _inc 1 xtdco 0..127 xtdcf 0..127 clock 160000000 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max= _segs 65535 tso_max_size 65536 tso_max_segs 65535 gro_max_size 65536 gso_ip= v4_max_size 65536 gro_ipv4_max_size 65536 Signed-off-by: Vincent Mailhol --- Changelog: v2 -> v3: - only use string literals in print_uint(). To achieve this, remove the "is_xl" parameter from can_print_xtdc_opt() and instead add can_print_xtdc_opt(). v1 -> v2: - s/matches/strcmp/g in can_parse_opt(). --- ip/iplink_can.c | 219 ++++++++++++++++++++++++++++++++++++++++++++++++++++= ++-- 1 file changed, 212 insertions(+), 7 deletions(-) diff --git a/ip/iplink_can.c b/ip/iplink_can.c index 0ba86550..8529a625 100644 --- a/ip/iplink_can.c +++ b/ip/iplink_can.c @@ -32,6 +32,10 @@ static void print_usage(FILE *f) "\t[ dtq TQ dprop-seg PROP_SEG dphase-seg1 PHASE-SEG1\n \t dphase-seg2 = PHASE-SEG2 [ dsjw SJW ] ]\n" "\t[ tdcv TDCV tdco TDCO tdcf TDCF ]\n" "\n" + "\t[ xbitrate BITRATE [ xsample-point SAMPLE-POINT] ] |\n" + "\t[ xtq TQ xprop-seg PROP_SEG xphase-seg1 PHASE-SEG1\n \t xphase-seg2 = PHASE-SEG2 [ xsjw SJW ] ]\n" + "\t[ xtdcv TDCV xtdco TDCO xtdcf TDCF ]\n" + "\n" "\t[ loopback { on | off } ]\n" "\t[ listen-only { on | off } ]\n" "\t[ triple-sampling { on | off } ]\n" @@ -43,6 +47,8 @@ static void print_usage(FILE *f) "\t[ cc-len8-dlc { on | off } ]\n" "\t[ tdc-mode { auto | manual | off } ]\n" "\t[ restricted { on | off } ]\n" + "\t[ xl { on | off } ]\n" + "\t[ xtdc-mode { auto | manual | off } ]\n" "\n" "\t[ restart-ms TIME-MS ]\n" "\t[ restart ]\n" @@ -118,6 +124,9 @@ static void print_ctrlmode(enum output_type t, __u32 fl= ags, const char *key) print_flag(t, &flags, CAN_CTRLMODE_TDC_AUTO, "TDC-AUTO"); print_flag(t, &flags, CAN_CTRLMODE_TDC_MANUAL, "TDC-MANUAL"); print_flag(t, &flags, CAN_CTRLMODE_RESTRICTED, "RESTRICTED"); + print_flag(t, &flags, CAN_CTRLMODE_XL, "XL"); + print_flag(t, &flags, CAN_CTRLMODE_XL_TDC_AUTO, "XL-TDC-AUTO"); + print_flag(t, &flags, CAN_CTRLMODE_XL_TDC_MANUAL, "XL-TDC-MANUAL"); =20 if (flags) print_hex(t, NULL, "%x", flags); @@ -128,9 +137,10 @@ static void print_ctrlmode(enum output_type t, __u32 f= lags, const char *key) static int can_parse_opt(struct link_util *lu, int argc, char **argv, struct nlmsghdr *n) { - struct can_bittiming bt =3D {}, fd_dbt =3D {}; + struct can_bittiming bt =3D {}, fd_dbt =3D {}, xl_dbt =3D {}; struct can_ctrlmode cm =3D { 0 }; struct can_tdc fd =3D { .tdcv =3D -1, .tdco =3D -1, .tdcf =3D -1 }; + struct can_tdc xl =3D { .tdcv =3D -1, .tdco =3D -1, .tdcf =3D -1 }; =20 while (argc > 0) { if (matches(*argv, "bitrate") =3D=3D 0) { @@ -208,6 +218,52 @@ static int can_parse_opt(struct link_util *lu, int arg= c, char **argv, NEXT_ARG(); if (get_u32(&fd.tdcf, *argv, 0)) invarg("invalid \"tdcf\" value", *argv); + } else if (strcmp(*argv, "xl") =3D=3D 0) { + NEXT_ARG(); + set_ctrlmode("xl", *argv, &cm, CAN_CTRLMODE_XL); + } else if (strcmp(*argv, "xbitrate") =3D=3D 0) { + NEXT_ARG(); + if (get_u32(&xl_dbt.bitrate, *argv, 0)) + invarg("invalid \"xbitrate\" value", *argv); + } else if (strcmp(*argv, "xsample-point") =3D=3D 0) { + float sp; + + NEXT_ARG(); + if (get_float(&sp, *argv)) + invarg("invalid \"xsample-point\" value", *argv); + xl_dbt.sample_point =3D (__u32)(sp * 1000); + } else if (strcmp(*argv, "xtq") =3D=3D 0) { + NEXT_ARG(); + if (get_u32(&xl_dbt.tq, *argv, 0)) + invarg("invalid \"xtq\" value", *argv); + } else if (strcmp(*argv, "xprop-seg") =3D=3D 0) { + NEXT_ARG(); + if (get_u32(&xl_dbt.prop_seg, *argv, 0)) + invarg("invalid \"xprop-seg\" value", *argv); + } else if (strcmp(*argv, "xphase-seg1") =3D=3D 0) { + NEXT_ARG(); + if (get_u32(&xl_dbt.phase_seg1, *argv, 0)) + invarg("invalid \"xphase-seg1\" value", *argv); + } else if (strcmp(*argv, "xphase-seg2") =3D=3D 0) { + NEXT_ARG(); + if (get_u32(&xl_dbt.phase_seg2, *argv, 0)) + invarg("invalid \"xphase-seg2\" value", *argv); + } else if (strcmp(*argv, "xsjw") =3D=3D 0) { + NEXT_ARG(); + if (get_u32(&xl_dbt.sjw, *argv, 0)) + invarg("invalid \"xsjw\" value", *argv); + } else if (strcmp(*argv, "xtdcv") =3D=3D 0) { + NEXT_ARG(); + if (get_u32(&xl.tdcv, *argv, 0)) + invarg("invalid \"xtdcv\" value", *argv); + } else if (strcmp(*argv, "xtdco") =3D=3D 0) { + NEXT_ARG(); + if (get_u32(&xl.tdco, *argv, 0)) + invarg("invalid \"xtdco\" value", *argv); + } else if (strcmp(*argv, "xtdcf") =3D=3D 0) { + NEXT_ARG(); + if (get_u32(&xl.tdcf, *argv, 0)) + invarg("invalid \"xtdcf\" value", *argv); } else if (matches(*argv, "loopback") =3D=3D 0) { NEXT_ARG(); set_ctrlmode("loopback", *argv, &cm, @@ -262,6 +318,21 @@ static int can_parse_opt(struct link_util *lu, int arg= c, char **argv, } else if (strcmp(*argv, "restricted") =3D=3D 0) { NEXT_ARG(); set_ctrlmode("restricted", *argv, &cm, CAN_CTRLMODE_RESTRICTED); + } else if (strcmp(*argv, "xtdc-mode") =3D=3D 0) { + NEXT_ARG(); + if (strcmp(*argv, "auto") =3D=3D 0) { + cm.flags |=3D CAN_CTRLMODE_XL_TDC_AUTO; + cm.mask |=3D CAN_CTRLMODE_XL_TDC_AUTO; + } else if (strcmp(*argv, "manual") =3D=3D 0) { + cm.flags |=3D CAN_CTRLMODE_XL_TDC_MANUAL; + cm.mask |=3D CAN_CTRLMODE_XL_TDC_MANUAL; + } else if (strcmp(*argv, "off") =3D=3D 0) { + cm.mask |=3D CAN_CTRLMODE_XL_TDC_AUTO | + CAN_CTRLMODE_XL_TDC_MANUAL; + } else { + invarg("\"xtdc-mode\" must be either of \"auto\", \"manual\" or \"off\= "", + *argv); + } } else if (matches(*argv, "restart") =3D=3D 0) { __u32 val =3D 1; =20 @@ -296,6 +367,8 @@ static int can_parse_opt(struct link_util *lu, int argc= , char **argv, addattr_l(n, 1024, IFLA_CAN_BITTIMING, &bt, sizeof(bt)); if (fd_dbt.bitrate || fd_dbt.tq) addattr_l(n, 1024, IFLA_CAN_DATA_BITTIMING, &fd_dbt, sizeof(fd_dbt)); + if (xl_dbt.bitrate || xl_dbt.tq) + addattr_l(n, 1024, IFLA_CAN_XL_DATA_BITTIMING, &xl_dbt, sizeof(xl_dbt)); if (cm.mask) addattr_l(n, 1024, IFLA_CAN_CTRLMODE, &cm, sizeof(cm)); =20 @@ -311,6 +384,18 @@ static int can_parse_opt(struct link_util *lu, int arg= c, char **argv, addattr32(n, 1024, IFLA_CAN_TDC_TDCF, fd.tdcf); addattr_nest_end(n, tdc); } + if (xl.tdcv !=3D -1 || xl.tdco !=3D -1 || xl.tdcf !=3D -1) { + struct rtattr *tdc =3D addattr_nest(n, 1024, + IFLA_CAN_XL_TDC | NLA_F_NESTED); + + if (xl.tdcv !=3D -1) + addattr32(n, 1024, IFLA_CAN_TDC_TDCV, xl.tdcv); + if (xl.tdco !=3D -1) + addattr32(n, 1024, IFLA_CAN_TDC_TDCO, xl.tdco); + if (xl.tdcf !=3D -1) + addattr32(n, 1024, IFLA_CAN_TDC_TDCF, xl.tdcf); + addattr_nest_end(n, tdc); + } =20 return 0; } @@ -369,30 +454,62 @@ static void can_print_tdc_opt(struct rtattr *tdc_attr) } } =20 -static void can_print_tdc_const_opt(struct rtattr *tdc_attr) +static void can_print_xtdc_opt(struct rtattr *tdc_attr) { struct rtattr *tb[IFLA_CAN_TDC_MAX + 1]; =20 parse_rtattr_nested(tb, IFLA_CAN_TDC_MAX, tdc_attr); - open_json_object("tdc"); + if (tb[IFLA_CAN_TDC_TDCV] || tb[IFLA_CAN_TDC_TDCO] || + tb[IFLA_CAN_TDC_TDCF]) { + open_json_object("xtdc"); + can_print_nl_indent(); + if (tb[IFLA_CAN_TDC_TDCV]) { + __u32 *tdcv =3D RTA_DATA(tb[IFLA_CAN_TDC_TDCV]); + + print_uint(PRINT_ANY, "tdcv", " xtdcv %u", *tdcv); + } + if (tb[IFLA_CAN_TDC_TDCO]) { + __u32 *tdco =3D RTA_DATA(tb[IFLA_CAN_TDC_TDCO]); + + print_uint(PRINT_ANY, "tdco", " xtdco %u", *tdco); + } + if (tb[IFLA_CAN_TDC_TDCF]) { + __u32 *tdcf =3D RTA_DATA(tb[IFLA_CAN_TDC_TDCF]); + + print_uint(PRINT_ANY, "tdcf", " xtdcf %u", *tdcf); + } + close_json_object(); + } +} + +static void can_print_tdc_const_opt(struct rtattr *tdc_attr, bool is_xl) +{ + const char *tdc =3D is_xl ? "xtdc" : "tdc"; + struct rtattr *tb[IFLA_CAN_TDC_MAX + 1]; + + parse_rtattr_nested(tb, IFLA_CAN_TDC_MAX, tdc_attr); + open_json_object(tdc); can_print_nl_indent(); if (tb[IFLA_CAN_TDC_TDCV_MIN] && tb[IFLA_CAN_TDC_TDCV_MAX]) { __u32 *tdcv_min =3D RTA_DATA(tb[IFLA_CAN_TDC_TDCV_MIN]); __u32 *tdcv_max =3D RTA_DATA(tb[IFLA_CAN_TDC_TDCV_MAX]); + const char *tdcv =3D is_xl ? " xtdcv" : " tdcv"; =20 - can_print_timing_min_max("tdcv", " tdcv", *tdcv_min, *tdcv_max); + can_print_timing_min_max("tdcv", tdcv, *tdcv_min, *tdcv_max); } if (tb[IFLA_CAN_TDC_TDCO_MIN] && tb[IFLA_CAN_TDC_TDCO_MAX]) { __u32 *tdco_min =3D RTA_DATA(tb[IFLA_CAN_TDC_TDCO_MIN]); __u32 *tdco_max =3D RTA_DATA(tb[IFLA_CAN_TDC_TDCO_MAX]); + const char *tdco =3D is_xl ? " xtdco" : " tdco"; =20 - can_print_timing_min_max("tdco", " tdco", *tdco_min, *tdco_max); + can_print_timing_min_max("tdco", tdco, *tdco_min, *tdco_max); } if (tb[IFLA_CAN_TDC_TDCF_MIN] && tb[IFLA_CAN_TDC_TDCF_MAX]) { __u32 *tdcf_min =3D RTA_DATA(tb[IFLA_CAN_TDC_TDCF_MIN]); __u32 *tdcf_max =3D RTA_DATA(tb[IFLA_CAN_TDC_TDCF_MAX]); + const char *tdcf =3D is_xl ? " xtdcf" : " tdcf"; =20 - can_print_timing_min_max("tdcf", " tdcf", *tdcf_min, *tdcf_max); + can_print_timing_min_max("tdcf", tdcf, *tdcf_min, *tdcf_max); } close_json_object(); } @@ -570,7 +687,7 @@ static void can_print_opt(struct link_util *lu, FILE *f= , struct rtattr *tb[]) print_uint(PRINT_ANY, "brp_inc", " dbrp_inc %u", dbtc->brp_inc); =20 if (tb[IFLA_CAN_TDC]) - can_print_tdc_const_opt(tb[IFLA_CAN_TDC]); + can_print_tdc_const_opt(tb[IFLA_CAN_TDC], false); =20 close_json_object(); } @@ -609,6 +726,94 @@ static void can_print_opt(struct link_util *lu, FILE *= f, struct rtattr *tb[]) close_json_array(PRINT_ANY, " ]"); } =20 + /* data bittiming is irrelevant if fixed bitrate is defined */ + if (tb[IFLA_CAN_XL_DATA_BITTIMING] && + !tb[IFLA_CAN_XL_DATA_BITRATE_CONST]) { + struct can_bittiming *dbt =3D + RTA_DATA(tb[IFLA_CAN_XL_DATA_BITTIMING]); + char dsp[6]; + + open_json_object("xl_data_bittiming"); + can_print_nl_indent(); + print_uint(PRINT_ANY, "bitrate", " xbitrate %u", dbt->bitrate); + snprintf(dsp, sizeof(dsp), "%.3f", dbt->sample_point / 1000.); + print_string(PRINT_ANY, "sample_point", " xsample-point %s", + dsp); + can_print_nl_indent(); + print_uint(PRINT_ANY, "tq", " xtq %u", dbt->tq); + print_uint(PRINT_ANY, "prop_seg", " xprop-seg %u", + dbt->prop_seg); + print_uint(PRINT_ANY, "phase_seg1", " xphase-seg1 %u", + dbt->phase_seg1); + print_uint(PRINT_ANY, "phase_seg2", " xphase-seg2 %u", + dbt->phase_seg2); + print_uint(PRINT_ANY, "sjw", " xsjw %u", dbt->sjw); + print_uint(PRINT_ANY, "brp", " xbrp %u", dbt->brp); + + if (tb[IFLA_CAN_XL_TDC]) + can_print_xtdc_opt(tb[IFLA_CAN_XL_TDC]); + + close_json_object(); + } + + /* data bittiming const is irrelevant if fixed bitrate is defined */ + if (tb[IFLA_CAN_XL_DATA_BITTIMING_CONST] && + !tb[IFLA_CAN_XL_DATA_BITRATE_CONST]) { + struct can_bittiming_const *dbtc =3D + RTA_DATA(tb[IFLA_CAN_XL_DATA_BITTIMING_CONST]); + + open_json_object("xl_data_bittiming_const"); + can_print_nl_indent(); + print_string(PRINT_ANY, "name", " %s:", dbtc->name); + can_print_timing_min_max("tseg1", " xtseg1", + dbtc->tseg1_min, dbtc->tseg1_max); + can_print_timing_min_max("tseg2", " xtseg2", + dbtc->tseg2_min, dbtc->tseg2_max); + can_print_timing_min_max("sjw", " xsjw", 1, dbtc->sjw_max); + can_print_timing_min_max("brp", " xbrp", + dbtc->brp_min, dbtc->brp_max); + print_uint(PRINT_ANY, "brp_inc", " xbrp_inc %u", dbtc->brp_inc); + + if (tb[IFLA_CAN_XL_TDC]) + can_print_tdc_const_opt(tb[IFLA_CAN_XL_TDC], true); + + close_json_object(); + } + + if (tb[IFLA_CAN_XL_DATA_BITRATE_CONST]) { + __u32 *dbitrate_const =3D + RTA_DATA(tb[IFLA_CAN_XL_DATA_BITRATE_CONST]); + int dbitrate_cnt =3D + RTA_PAYLOAD(tb[IFLA_CAN_XL_DATA_BITRATE_CONST]) / + sizeof(*dbitrate_const); + int i; + __u32 dbitrate =3D 0; + + if (tb[IFLA_CAN_XL_DATA_BITTIMING]) { + struct can_bittiming *dbt =3D + RTA_DATA(tb[IFLA_CAN_XL_DATA_BITTIMING]); + dbitrate =3D dbt->bitrate; + } + + can_print_nl_indent(); + print_uint(PRINT_ANY, "xl_data_bittiming_bitrate", " xbitrate %u", + dbitrate); + can_print_nl_indent(); + open_json_array(PRINT_ANY, is_json_context() ? + "data_bitrate_const" : " ["); + for (i =3D 0; i < dbitrate_cnt; ++i) { + /* This will keep lines below 80 signs */ + if (!(i % 6) && i) { + can_print_nl_indent(); + print_string(PRINT_FP, NULL, "%s", " "); + } + print_uint(PRINT_ANY, NULL, + i < dbitrate_cnt - 1 ? "%8u, " : "%8u", + dbitrate_const[i]); + } + close_json_array(PRINT_ANY, " ]"); + } + if (tb[IFLA_CAN_TERMINATION_CONST] && tb[IFLA_CAN_TERMINATION]) { __u16 *trm =3D RTA_DATA(tb[IFLA_CAN_TERMINATION]); __u16 *trm_const =3D RTA_DATA(tb[IFLA_CAN_TERMINATION_CONST]); --=20 2.51.2 From nobody Fri Dec 19 19:23:32 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 77D7231D38F; Wed, 3 Dec 2025 18:26:12 +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=1764786372; cv=none; b=pPZsXlr4qSxOBPYgtcolu/4y3MK9NIInN53DthrEuEOO/x6sfQQqcP43hjAth/gErS+jXfuSN9MpFUHk1FVLsn0YahZaKHTkoMMiOabRiJx3OmAtkX3CJxGlmNhG0uyRjPlHC3cWBnocd5c8yKohG+/klE4cap9vCjm8JJZFTGc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764786372; c=relaxed/simple; bh=1jWXwr1gVj2S7XBrBxYiIEU01oeX+alq3ZTjJB6hOx0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=hwd3B8WpeLP6f5RltNVaoZkn1NXouAq3RcxCEc8vsGHZQhbFTKIQltDOPDxEnveDGP7KVIubeIsJVDk4IdnePqDhLOe3K9KbvpUYeWE4QFU7HLuwjA1p2OsuvieOEx85Dq1Vp7rqRKPpkWl2Oei86N9eGrh26rtyTxAr+aUJc0w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=tJLoFv5O; 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="tJLoFv5O" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 991E6C4CEF5; Wed, 3 Dec 2025 18:26:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1764786372; bh=1jWXwr1gVj2S7XBrBxYiIEU01oeX+alq3ZTjJB6hOx0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=tJLoFv5OWrd4Ugq8IBobQkfO9KvIs4vlCcGhjj1C2Te80RasIZeesPOLC2uvQbFQt yssB2HD2ram8DK7ZLj40BO8mtFdYk6di7QJmeWZnfBCrXjML0F3AAdVbtbNY9WSM72 7M5gHHPgCetN/2+7SXwJDiJ38LJPnWnqT+J1nyRCgW2vD8wmyjMtx8T2vI811qWN7z hm3Rp5wrtQfY4W8NLoEEh1GRVUNkUyue5Jp79dMoFytrOwu6LBr/dwFdfZxEdZ0Qgq 3rgmsSRLgAbyrrogQW5cblUelIwxLik2vJUSo0QjqxcX/DOvyjidWpk9/G0PRbz1C5 nK1ceIH26TNvw== From: Vincent Mailhol Date: Wed, 03 Dec 2025 19:24:33 +0100 Subject: [PATCH iproute2-next v3 6/7] iplink_can: add CAN XL transceiver mode setting (TMS) support 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: <20251203-canxl-netlink-v3-6-999f38fae8c2@kernel.org> References: <20251203-canxl-netlink-v3-0-999f38fae8c2@kernel.org> In-Reply-To: <20251203-canxl-netlink-v3-0-999f38fae8c2@kernel.org> To: netdev@vger.kernel.org, Stephen Hemminger , Marc Kleine-Budde , Oliver Hartkopp , David Ahern Cc: Rakuram Eswaran , =?utf-8?q?St=C3=A9phane_Grosjean?= , linux-kernel@vger.kernel.org, linux-can@vger.kernel.org, Vincent Mailhol X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1995; i=mailhol@kernel.org; h=from:subject:message-id; bh=1jWXwr1gVj2S7XBrBxYiIEU01oeX+alq3ZTjJB6hOx0=; b=owGbwMvMwCV2McXO4Xp97WbG02pJDJkGDSu0pi2u7g3hEC2dffx3wvQF+eYTS3tfseZ5JYoor ZTx+SrcUcrCIMbFICumyLKsnJNboaPQO+zQX0uYOaxMIEMYuDgFYCL2rQy/WSvsw5wO7Lj/0Lb7 oqzB4TQjE8650ntX6cYprSx7IBURwshwMirdy/l+iqw129LTNzVs36sIZtcdXhS1NPzQxEymRjY mAA== X-Developer-Key: i=mailhol@kernel.org; a=openpgp; fpr=ED8F700574E67F20E574E8E2AB5FEB886DBB99C2 This is the iproute2 counterpart of Linux kernel's commit 233134af2086 ("can: netlink: add CAN_CTRLMODE_XL_TMS flag"). 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 "tms" option to iplink_can which controls the CAN_CTRLMODE_XL_TMS flag of the CAN netlink interface. Signed-off-by: Vincent Mailhol --- Changelog: v1 -> v2: - s/XL-TMS/TMS/g in print_ctrlmode() - s/matches/strcmp/g in can_parse_opt() --- ip/iplink_can.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ip/iplink_can.c b/ip/iplink_can.c index 8529a625..1cc943bb 100644 --- a/ip/iplink_can.c +++ b/ip/iplink_can.c @@ -49,6 +49,7 @@ static void print_usage(FILE *f) "\t[ restricted { on | off } ]\n" "\t[ xl { on | off } ]\n" "\t[ xtdc-mode { auto | manual | off } ]\n" + "\t[ tms { on | off } ]\n" "\n" "\t[ restart-ms TIME-MS ]\n" "\t[ restart ]\n" @@ -127,6 +128,7 @@ static void print_ctrlmode(enum output_type t, __u32 fl= ags, const char *key) print_flag(t, &flags, CAN_CTRLMODE_XL, "XL"); print_flag(t, &flags, CAN_CTRLMODE_XL_TDC_AUTO, "XL-TDC-AUTO"); print_flag(t, &flags, CAN_CTRLMODE_XL_TDC_MANUAL, "XL-TDC-MANUAL"); + print_flag(t, &flags, CAN_CTRLMODE_XL_TMS, "TMS"); =20 if (flags) print_hex(t, NULL, "%x", flags); @@ -333,6 +335,9 @@ static int can_parse_opt(struct link_util *lu, int argc= , char **argv, invarg("\"xtdc-mode\" must be either of \"auto\", \"manual\" or \"off\= "", *argv); } + } else if (strcmp(*argv, "tms") =3D=3D 0) { + NEXT_ARG(); + set_ctrlmode("tms", *argv, &cm, CAN_CTRLMODE_XL_TMS); } else if (matches(*argv, "restart") =3D=3D 0) { __u32 val =3D 1; =20 --=20 2.51.2 From nobody Fri Dec 19 19:23:32 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 4FCB933030E; Wed, 3 Dec 2025 18:26:15 +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=1764786375; cv=none; b=liqqUf5V+QVQIr0z+F8Ed7Mi6kIz0VPj1t6JzGfX6mrGIqGZIWi9cLamwQl2ece1ro6Glu9Md3dM9jrtYcss5jzJO+7wXu/scXB8aLSV81pXZraTJ8FKaSLhDS8pNjzPKl+UmihkTo7gZsj30jeqZEu+Bc3n/I7++JJU7ubPWpo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764786375; c=relaxed/simple; bh=hTv9qkjAOM2JGYQGnsmIZMfkj1CbyeyxYjvHdQeDrQc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=FVNb1SDNvW3d5NfK1fD810zPogKG+D00nustg9t1Ey/snjlTBz7ju5P7t75WrRnyHWaRXRyb2L+maaUZGTshEwD//k7oIp2t42LdPU3zqcjS9tPP0Bw3wK1LK+z8CMbFyc30LEfGDXVpHe8HGpP/+iO7PHoRmTkCoSAkrBvBmCI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=C/ZNrSUH; 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="C/ZNrSUH" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6B4FBC116C6; Wed, 3 Dec 2025 18:26:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1764786374; bh=hTv9qkjAOM2JGYQGnsmIZMfkj1CbyeyxYjvHdQeDrQc=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=C/ZNrSUH70F2KrHvIYTu5cILl45iGh1tym97XGjjqJYmiqIiTzuQnQ3295rtxF8ju 0C08yjiIJoxn4y0jhyDp7S5InNgB3I3TAOxIP//z9EwMSQwDxh+djlFwKqW+u3UWxJ sk1f4g1qr5qzVWujqfqEG2IUTSbDyr43VlTOty46xWBvdIzHuFCb02EnVO4ZQmsmWH FU5omC0m5l0Uqk8lso9hqzOFui4vX/oBNhhXRc8IuaLPfp/e1klc3tMVo9T0/27AIw Q6to4N6kSsPWtqOyIc2uAAlcaCPRL82QINWdSVEjnTNmYf++1DFXaM3LYK6O39/cff poyqqJfUzi1Uw== From: Vincent Mailhol Date: Wed, 03 Dec 2025 19:24:34 +0100 Subject: [PATCH iproute2-next v3 7/7] iplink_can: add CAN XL TMS PWM configuration support 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: <20251203-canxl-netlink-v3-7-999f38fae8c2@kernel.org> References: <20251203-canxl-netlink-v3-0-999f38fae8c2@kernel.org> In-Reply-To: <20251203-canxl-netlink-v3-0-999f38fae8c2@kernel.org> To: netdev@vger.kernel.org, Stephen Hemminger , Marc Kleine-Budde , Oliver Hartkopp , David Ahern Cc: Rakuram Eswaran , =?utf-8?q?St=C3=A9phane_Grosjean?= , linux-kernel@vger.kernel.org, linux-can@vger.kernel.org, Vincent Mailhol X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=7655; i=mailhol@kernel.org; h=from:subject:message-id; bh=hTv9qkjAOM2JGYQGnsmIZMfkj1CbyeyxYjvHdQeDrQc=; b=owGbwMvMwCV2McXO4Xp97WbG02pJDJkGDavl7Toem13cN+Wuv87la423qpvPv9pofenyppxoM 42969rLO0pZGMS4GGTFFFmWlXNyK3QUeocd+msJM4eVCWQIAxenAEwkejbDX+nEnLNP1jfKXGBK XBYpyWLWVlCes9Xysb6DZH3OotP7jzEyfFSa+LoxPn3HXOMVFz1P/v8kO6Ha6Utz2BP3m9x7m96 LMwAA X-Developer-Key: i=mailhol@kernel.org; a=openpgp; fpr=ED8F700574E67F20E574E8E2AB5FEB886DBB99C2 This is the iproute2 counterpart of Linux kernel's commit 46552323fa67 ("can: netlink: add PWM netlink interface"). When the TMS is switched on, the node uses PWM (Pulse Width Modulation) during the data phase instead of the classic NRZ (Non Return to Zero) encoding. PWM is configured by three parameters: - PWMS: Pulse Width Modulation Short phase - PWML: Pulse Width Modulation Long phase - PWMO: Pulse Width Modulation Offset time For each of these parameters, the CAN netlink interface defines three IFLA symbols: - IFLA_CAN_PWM_PWM*_MIN: the minimum allowed value. - IFLA_CAN_PWM_PWM*_MAX: the maximum allowed value. - IFLA_CAN_PWM_PWM*: the runtime value. This results in a total of nine IFLA symbols which are all nested in a parent IFLA_CAN_XL_PWM symbol. Add the "pwms", "pwml" and "pwmo" options to iplink_can which controls the IFLA_CAN_PWM_PWM* runtime values. Add the logic to query and print all those IFLA values. Update print_usage() accordingly. Example using the dummy_can driver: # modprobe dummy_can # ip link set can0 type can bitrate 1000000 xl on xbitrate 20000000 tms on $ ip --details link show can0 5: can0: mtu 2060 qdisc noop state DOWN mode DEFAULT group defaul= t qlen 10 link/can promiscuity 0 allmulti 0 minmtu 76 maxmtu 2060 can state STOPPED restart-ms 0 bitrate 1000000 sample-point 0.750 tq 6 prop-seg 59 phase-seg1 60 phase-seg2 40 sjw 20 brp 1 dummy_can CC: tseg1 2..256 tseg2 2..128 sjw 1..128 brp 1..512 brp_inc 1 dummy_can FD: dtseg1 2..256 dtseg2 2..128 dsjw 1..128 dbrp 1..512 dbrp= _inc 1 tdco 0..127 tdcf 0..127 xbitrate 20000000 xsample-point 0.625 xtq 6 xprop-seg 2 xphase-seg1 2 xphase-seg2 3 xsjw 1 xbrp 1 pwms 2 pwml 6 pwmo 0 dummy_can XL: xtseg1 2..256 xtseg2 2..128 xsjw 1..128 xbrp 1..512 xbrp= _inc 1 xtdco 0..127 xtdcf 0..127 pwms 1..8 pwml 2..24 pwmo 0..16 clock 160000000 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max= _segs 65535 tso_max_size 65536 tso_max_segs 65535 gro_max_size 65536 gso_ip= v4_max_size 65536 gro_ipv4_max_size 65536 Signed-off-by: Vincent Mailhol --- Changelog: v1 -> v2: - Remove a double space in patch description - s/matches/strcmp/g in can_parse_opt() --- ip/iplink_can.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++= +++- 1 file changed, 91 insertions(+), 1 deletion(-) diff --git a/ip/iplink_can.c b/ip/iplink_can.c index 1cc943bb..f631aab8 100644 --- a/ip/iplink_can.c +++ b/ip/iplink_can.c @@ -34,7 +34,7 @@ static void print_usage(FILE *f) "\n" "\t[ xbitrate BITRATE [ xsample-point SAMPLE-POINT] ] |\n" "\t[ xtq TQ xprop-seg PROP_SEG xphase-seg1 PHASE-SEG1\n \t xphase-seg2 = PHASE-SEG2 [ xsjw SJW ] ]\n" - "\t[ xtdcv TDCV xtdco TDCO xtdcf TDCF ]\n" + "\t[ xtdcv TDCV xtdco TDCO xtdcf TDCF pwms PWMS pwml PWML pwmo PWMO]\n" "\n" "\t[ loopback { on | off } ]\n" "\t[ listen-only { on | off } ]\n" @@ -67,6 +67,9 @@ static void print_usage(FILE *f) "\t TDCV :=3D { NUMBER in mtq }\n" "\t TDCO :=3D { NUMBER in mtq }\n" "\t TDCF :=3D { NUMBER in mtq }\n" + "\t PWMS :=3D { NUMBER in mtq }\n" + "\t PWML :=3D { NUMBER in mtq }\n" + "\t PWMO :=3D { NUMBER in mtq }\n" "\t RESTART-MS :=3D { 0 | NUMBER in ms }\n" "\n" "\tUnits:\n" @@ -143,6 +146,7 @@ static int can_parse_opt(struct link_util *lu, int argc= , char **argv, struct can_ctrlmode cm =3D { 0 }; struct can_tdc fd =3D { .tdcv =3D -1, .tdco =3D -1, .tdcf =3D -1 }; struct can_tdc xl =3D { .tdcv =3D -1, .tdco =3D -1, .tdcf =3D -1 }; + __u32 pwms =3D -1, pwml =3D -1, pwmo =3D -1; =20 while (argc > 0) { if (matches(*argv, "bitrate") =3D=3D 0) { @@ -266,6 +270,18 @@ static int can_parse_opt(struct link_util *lu, int arg= c, char **argv, NEXT_ARG(); if (get_u32(&xl.tdcf, *argv, 0)) invarg("invalid \"xtdcf\" value", *argv); + } else if (strcmp(*argv, "pwms") =3D=3D 0) { + NEXT_ARG(); + if (get_u32(&pwms, *argv, 0)) + invarg("invalid \"pwms\" value", *argv); + } else if (strcmp(*argv, "pwml") =3D=3D 0) { + NEXT_ARG(); + if (get_u32(&pwml, *argv, 0)) + invarg("invalid \"pwml\" value", *argv); + } else if (strcmp(*argv, "pwmo") =3D=3D 0) { + NEXT_ARG(); + if (get_u32(&pwmo, *argv, 0)) + invarg("invalid \"pwmo\" value", *argv); } else if (matches(*argv, "loopback") =3D=3D 0) { NEXT_ARG(); set_ctrlmode("loopback", *argv, &cm, @@ -401,6 +417,18 @@ static int can_parse_opt(struct link_util *lu, int arg= c, char **argv, addattr32(n, 1024, IFLA_CAN_TDC_TDCF, xl.tdcf); addattr_nest_end(n, tdc); } + if (pwms !=3D -1 || pwml !=3D -1 || pwmo !=3D -1) { + struct rtattr *pwm =3D addattr_nest(n, 1024, + IFLA_CAN_XL_PWM | NLA_F_NESTED); + + if (pwms !=3D -1) + addattr32(n, 1024, IFLA_CAN_PWM_PWMS, pwms); + if (pwml !=3D -1) + addattr32(n, 1024, IFLA_CAN_PWM_PWML, pwml); + if (pwmo !=3D -1) + addattr32(n, 1024, IFLA_CAN_PWM_PWMO, pwmo); + addattr_nest_end(n, pwm); + } =20 return 0; } @@ -519,6 +547,62 @@ static void can_print_tdc_const_opt(struct rtattr *tdc= _attr, bool is_xl) close_json_object(); } =20 +static void can_print_pwm_opt(struct rtattr *pwm_attr) +{ + struct rtattr *tb[IFLA_CAN_PWM_MAX + 1]; + + parse_rtattr_nested(tb, IFLA_CAN_PWM_MAX, pwm_attr); + if (tb[IFLA_CAN_PWM_PWMS] || tb[IFLA_CAN_PWM_PWML] || + tb[IFLA_CAN_PWM_PWMO]) { + open_json_object("pwm"); + can_print_nl_indent(); + if (tb[IFLA_CAN_PWM_PWMS]) { + __u32 *pwms =3D RTA_DATA(tb[IFLA_CAN_PWM_PWMS]); + + print_uint(PRINT_ANY, " pwms", " pwms %u", *pwms); + } + if (tb[IFLA_CAN_PWM_PWML]) { + __u32 *pwml =3D RTA_DATA(tb[IFLA_CAN_PWM_PWML]); + + print_uint(PRINT_ANY, " pwml", " pwml %u", *pwml); + } + if (tb[IFLA_CAN_PWM_PWMO]) { + __u32 *pwmo =3D RTA_DATA(tb[IFLA_CAN_PWM_PWMO]); + + print_uint(PRINT_ANY, " pwmo", " pwmo %u", *pwmo); + } + close_json_object(); + } +} + +static void can_print_pwm_const_opt(struct rtattr *pwm_attr) +{ + struct rtattr *tb[IFLA_CAN_PWM_MAX + 1]; + + parse_rtattr_nested(tb, IFLA_CAN_PWM_MAX, pwm_attr); + open_json_object("pwm"); + can_print_nl_indent(); + if (tb[IFLA_CAN_PWM_PWMS_MAX]) { + __u32 *pwms_min =3D RTA_DATA(tb[IFLA_CAN_PWM_PWMS_MIN]); + __u32 *pwms_max =3D RTA_DATA(tb[IFLA_CAN_PWM_PWMS_MAX]); + + can_print_timing_min_max("pwms", " pwms", *pwms_min, *pwms_max); + } + if (tb[IFLA_CAN_PWM_PWML_MAX]) { + __u32 *pwml_min =3D RTA_DATA(tb[IFLA_CAN_PWM_PWML_MIN]); + __u32 *pwml_max =3D RTA_DATA(tb[IFLA_CAN_PWM_PWML_MAX]); + + can_print_timing_min_max("pwml", " pwml", *pwml_min, *pwml_max); + } + if (tb[IFLA_CAN_PWM_PWMO_MAX]) { + __u32 *pwmo_min =3D RTA_DATA(tb[IFLA_CAN_PWM_PWMO_MIN]); + __u32 *pwmo_max =3D RTA_DATA(tb[IFLA_CAN_PWM_PWMO_MAX]); + + can_print_timing_min_max("pwmo", " pwmo", *pwmo_min, *pwmo_max); + } + close_json_object(); +} + static void can_print_ctrlmode_ext(struct rtattr *ctrlmode_ext_attr, __u32 cm_flags) { @@ -758,6 +842,9 @@ static void can_print_opt(struct link_util *lu, FILE *f= , struct rtattr *tb[]) if (tb[IFLA_CAN_XL_TDC]) can_print_xtdc_opt(tb[IFLA_CAN_XL_TDC]); =20 + if (tb[IFLA_CAN_XL_PWM]) + can_print_pwm_opt(tb[IFLA_CAN_XL_PWM]); + close_json_object(); } =20 @@ -782,6 +869,9 @@ static void can_print_opt(struct link_util *lu, FILE *f= , struct rtattr *tb[]) if (tb[IFLA_CAN_XL_TDC]) can_print_tdc_const_opt(tb[IFLA_CAN_XL_TDC], true); =20 + if (tb[IFLA_CAN_XL_PWM]) + can_print_pwm_const_opt(tb[IFLA_CAN_XL_PWM]); + close_json_object(); } =20 --=20 2.51.2