* [PATCH v2 00/20] can: netlink: preparation before introduction of CAN XL step 2/2
@ 2025-09-10 6:03 Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 01/20] can: dev: move struct data_bittiming_params to linux/can/bittiming.h Vincent Mailhol
` (19 more replies)
0 siblings, 20 replies; 32+ messages in thread
From: Vincent Mailhol @ 2025-09-10 6:03 UTC (permalink / raw)
To: Marc Kleine-Budde, Oliver Hartkopp
Cc: Vincent Mailhol, Stéphane Grosjean, Robert Nawrath, Minh Le,
Duy Nguyen, linux-can, linux-kernel
In November last year, I sent an RFC to introduce CAN XL [1]. That
RFC, despite positive feedback, was put on hold due to some unanswered
question concerning the PWM encoding [2].
While stuck, some small preparation work was done in parallel in [3]
by refactoring the struct can_priv and doing some trivial clean-up and
renaming. Initially, [3] received zero feedback but was eventually
merged after splitting it in smaller parts and resending it.
Finally, in July this year, we clarified the remaining mysteries about
PWM calculation, thus unlocking the series. Summer being a bit busy
because of some personal matters brings us to now.
After doing all the refactoring and adding all the CAN XL features,
the final result is roughly 30 patches, probably too much for a single
series. So I am splitting it in two:
- preparation (this series)
- CAN XL (will come later, after this series get ACK-ed)
And so, this series continues and finishes the preparation work done
in [3]. It contains all the refactoring needed to smoothly introduce
CAN XL. The goal is to:
- split the functions in smaller pieces: CAN XL will introduce a
fair amount of code. And some functions which are already fairly
long (86 lines for can_validate(), 216 lines for can_changelink())
would grow to disproportionate sizes if the CAN XL logic were to
be inlined in those functions.
- repurpose the existing code to handle both CAN FD and CAN XL: a
huge part of CAN XL simply reuses the CAN FD logic. All the
existing CAN FD logic is made more generic to handle both CAN FD
and XL.
In more details:
- Patch #1 moves struct data_bittiming_params from dev.h to
bittiming.h and patch #2 makes can_get_relative_tdco() FD agnostic
before also moving it to bittiming.h.
- Patch #3 adds some comments to netlink.h tagging which IFLA
symbols are FD specific.
- Patches #4 to #6 are refactoring can_validate() and
can_validate_bittiming().
- Patches #7 to #11 are refactoring can_changelink() and
can_tdc_changelink().
- Patches #12 and #13 are refactoring can_get_size() and
can_tdc_get_size().
- Patches #14 to #17 are refactoring can_fill_info() and
can_tdc_fill_info().
- Patch #18 makes can_calc_tdco() FD agnostic.
- Patch #19 adds can_get_ctrlmode_str() which converts control mode
flags into strings. This is done in preparation of patch #20.
- Patch #20 is the final patch and improves the user experience by
providing detailed error messages whenever invalid parameters are
provided. All those error messages came into handy when debugging
the upcoming CAN XL patches.
Aside from the last patch, the other changes do not impact any of the
existing functionalities.
The follow up series which introduces CAN XL is nearly completed but
will be sent only once this one is approved: one thing at a time, I do
not want to overwhelm people (including myself).
[1] https://lore.kernel.org/linux-can/20241110155902.72807-16-mailhol.vincent@wanadoo.fr/
[2] https://lore.kernel.org/linux-can/c4771c16-c578-4a6d-baee-918fe276dbe9@wanadoo.fr/
[3] https://lore.kernel.org/linux-can/20241110155902.72807-16-mailhol.vincent@wanadoo.fr/
To: Marc Kleine-Budde <mkl@pengutronix.de>
To: Oliver Hartkopp <socketcan@hartkopp.net>
Cc: Vincent Mailhol <mailhol@kernel.org>
Cc: Stéphane Grosjean <stephane.grosjean@hms-networks.com>
Cc: Robert Nawrath <mbro1689@gmail.com>
Cc: Minh Le <minh.le.aj@renesas.com>
Cc: Duy Nguyen <duy.nguyen.rh@renesas.com>
Cc: linux-can@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Vincent Mailhol <mailhol@kernel.org>
---
Changes in v2:
- Move can_validate()'s comment block to can_validate_databittiming().
Consequently,
[PATCH 07/21] can: netlink: remove comment in can_validate()
from v1 is removed.
- Change any occurrences of WARN_ON(1) into return -EOPNOTSUPP to
suppress the three gcc warnings which were reported by the kernel
test robot:
Link: https://lore.kernel.org/linux-can/202509050259.NjPdQyAD-lkp@intel.com/
Link: https://lore.kernel.org/linux-can/202509050404.ZLQknagH-lkp@intel.com/
Link: https://lore.kernel.org/linux-can/202509050541.1FKRbqOi-lkp@intel.com/
- Small rewrite of patch #12 "can: netlink: make can_tdc_get_size()
FD agnostic" description to add more details.
- Link to v1: https://lore.kernel.org/r/20250903-canxl-netlink-prep-v1-0-904bd6037cd9@kernel.org
---
Vincent Mailhol (20):
can: dev: move struct data_bittiming_params to linux/can/bittiming.h
can: dev: make can_get_relative_tdco() FD agnostic and move it to bittiming.h
can: netlink: document which symbols are FD specific
can: netlink: refactor can_validate_bittiming()
can: netlink: add can_validate_tdc()
can: netlink: add can_validate_databittiming()
can: netlink: refactor CAN_CTRLMODE_TDC_{AUTO,MANUAL} flag reset logic
can: netlink: remove useless check in can_tdc_changelink()
can: netlink: make can_tdc_changelink() FD agnostic
can: netlink: add can_dtb_changelink()
can: netlink: add can_ctrlmode_changelink()
can: netlink: make can_tdc_get_size() FD agnostic
can: netlink: add can_data_bittiming_get_size()
can: netlink: add can_bittiming_fill_info()
can: netlink: add can_bittiming_const_fill_info()
can: netlink: add can_bitrate_const_fill_info()
can: netlink: make can_tdc_fill_info() FD agnostic
can: calc_bittiming: make can_calc_tdco() FD agnostic
can: dev: add can_get_ctrlmode_str()
can: netlink: add userland error messages
drivers/net/can/dev/calc_bittiming.c | 10 +-
drivers/net/can/dev/dev.c | 33 ++
drivers/net/can/dev/netlink.c | 614 ++++++++++++++++++++++-------------
include/linux/can/bittiming.h | 48 ++-
include/linux/can/dev.h | 42 +--
include/uapi/linux/can/netlink.h | 14 +-
6 files changed, 478 insertions(+), 283 deletions(-)
---
base-commit: c6142e1913de563ab772f7b0e4ae78d6de9cc5b1
change-id: 20250831-canxl-netlink-prep-9dbf8498fd9d
Best regards,
--
Vincent Mailhol <mailhol@kernel.org>
^ permalink raw reply [flat|nested] 32+ messages in thread
* [PATCH v2 01/20] can: dev: move struct data_bittiming_params to linux/can/bittiming.h
2025-09-10 6:03 [PATCH v2 00/20] can: netlink: preparation before introduction of CAN XL step 2/2 Vincent Mailhol
@ 2025-09-10 6:03 ` Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 02/20] can: dev: make can_get_relative_tdco() FD agnostic and move it to bittiming.h Vincent Mailhol
` (18 subsequent siblings)
19 siblings, 0 replies; 32+ messages in thread
From: Vincent Mailhol @ 2025-09-10 6:03 UTC (permalink / raw)
To: Marc Kleine-Budde, Oliver Hartkopp
Cc: Vincent Mailhol, Stéphane Grosjean, Robert Nawrath, Minh Le,
Duy Nguyen, linux-can, linux-kernel
In commit b803c4a4f788 ("can: dev: add struct data_bittiming_params to
group FD parameters"), struct data_bittiming_params was put into
linux/can/dev.h.
This structure being a collection of bittiming parameters, on second
thought, bittiming.h is actually a better location. This way, users of
struct data_bittiming_params will not have to forcefully include
linux/can/dev.h thus removing some complexity and reducing the risk of
circular dependencies in headers.
Move struct data_bittiming_params from linux/can/dev.h to
linux/can/bittiming.h.
Signed-off-by: Vincent Mailhol <mailhol@kernel.org>
---
include/linux/can/bittiming.h | 11 +++++++++++
include/linux/can/dev.h | 11 -----------
2 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/include/linux/can/bittiming.h b/include/linux/can/bittiming.h
index 5dfdbb63b1d54f3dc02170b10b73dbb9c2242851..6572ec1712ca2df8db7fe1453ae5a4d5699712b1 100644
--- a/include/linux/can/bittiming.h
+++ b/include/linux/can/bittiming.h
@@ -114,6 +114,17 @@ struct can_tdc_const {
u32 tdcf_max;
};
+struct data_bittiming_params {
+ const struct can_bittiming_const *data_bittiming_const;
+ struct can_bittiming data_bittiming;
+ const struct can_tdc_const *tdc_const;
+ struct can_tdc tdc;
+ const u32 *data_bitrate_const;
+ unsigned int data_bitrate_const_cnt;
+ int (*do_set_data_bittiming)(struct net_device *dev);
+ int (*do_get_auto_tdcv)(const struct net_device *dev, u32 *tdcv);
+};
+
#ifdef CONFIG_CAN_CALC_BITTIMING
int can_calc_bittiming(const struct net_device *dev, struct can_bittiming *bt,
const struct can_bittiming_const *btc, struct netlink_ext_ack *extack);
diff --git a/include/linux/can/dev.h b/include/linux/can/dev.h
index 9a92cbe5b2cb7ccdfca3121718856d096e9ecfa6..76022f48a97673d81676c39c697eadc6d7063ff7 100644
--- a/include/linux/can/dev.h
+++ b/include/linux/can/dev.h
@@ -38,17 +38,6 @@ enum can_termination_gpio {
CAN_TERMINATION_GPIO_MAX,
};
-struct data_bittiming_params {
- const struct can_bittiming_const *data_bittiming_const;
- struct can_bittiming data_bittiming;
- const struct can_tdc_const *tdc_const;
- struct can_tdc tdc;
- const u32 *data_bitrate_const;
- unsigned int data_bitrate_const_cnt;
- int (*do_set_data_bittiming)(struct net_device *dev);
- int (*do_get_auto_tdcv)(const struct net_device *dev, u32 *tdcv);
-};
-
/*
* CAN common private data
*/
--
2.49.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH v2 02/20] can: dev: make can_get_relative_tdco() FD agnostic and move it to bittiming.h
2025-09-10 6:03 [PATCH v2 00/20] can: netlink: preparation before introduction of CAN XL step 2/2 Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 01/20] can: dev: move struct data_bittiming_params to linux/can/bittiming.h Vincent Mailhol
@ 2025-09-10 6:03 ` Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 03/20] can: netlink: document which symbols are FD specific Vincent Mailhol
` (17 subsequent siblings)
19 siblings, 0 replies; 32+ messages in thread
From: Vincent Mailhol @ 2025-09-10 6:03 UTC (permalink / raw)
To: Marc Kleine-Budde, Oliver Hartkopp
Cc: Vincent Mailhol, Stéphane Grosjean, Robert Nawrath, Minh Le,
Duy Nguyen, linux-can, linux-kernel
can_get_relative_tdco() needs to access can_priv->fd making it
specific to CAN FD. Change the function parameter from struct can_priv
to struct data_bittiming_params. This way, the function becomes CAN FD
agnostic and can be reused later on for the CAN XL TDC.
Now that we dropped the dependency on struct can_priv, also move
can_get_relative_tdco() back to bittiming.h where it was meant to
belong to.
Signed-off-by: Vincent Mailhol <mailhol@kernel.org>
---
Changelog:
RFC -> v1:
- Just pass the IFLA index instead of passing each argument
individually. Instead, derive these as local variables depending
on whethe the IFLA index is IFLA_CAN_TDC or IFLA_CAN_XL_TDC.
---
include/linux/can/bittiming.h | 29 +++++++++++++++++++++++++++++
include/linux/can/dev.h | 29 -----------------------------
2 files changed, 29 insertions(+), 29 deletions(-)
diff --git a/include/linux/can/bittiming.h b/include/linux/can/bittiming.h
index 6572ec1712ca2df8db7fe1453ae5a4d5699712b1..4d5f7794194ab13641c7854c2d66625c4e942f6c 100644
--- a/include/linux/can/bittiming.h
+++ b/include/linux/can/bittiming.h
@@ -160,6 +160,35 @@ int can_get_bittiming(const struct net_device *dev, struct can_bittiming *bt,
const unsigned int bitrate_const_cnt,
struct netlink_ext_ack *extack);
+/*
+ * can_get_relative_tdco() - TDCO relative to the sample point
+ *
+ * struct can_tdc::tdco represents the absolute offset from TDCV. Some
+ * controllers use instead an offset relative to the Sample Point (SP)
+ * such that:
+ *
+ * SSP = TDCV + absolute TDCO
+ * = TDCV + SP + relative TDCO
+ *
+ * -+----------- one bit ----------+-- TX pin
+ * |<--- Sample Point --->|
+ *
+ * --+----------- one bit ----------+-- RX pin
+ * |<-------- TDCV -------->|
+ * |<------------------------>| absolute TDCO
+ * |<--- Sample Point --->|
+ * | |<->| relative TDCO
+ * |<------------- Secondary Sample Point ------------>|
+ */
+static inline s32 can_get_relative_tdco(const struct data_bittiming_params *dbt_params)
+{
+ const struct can_bittiming *dbt = &dbt_params->data_bittiming;
+ s32 sample_point_in_tc = (CAN_SYNC_SEG + dbt->prop_seg +
+ dbt->phase_seg1) * dbt->brp;
+
+ return (s32)dbt_params->tdc.tdco - sample_point_in_tc;
+}
+
/*
* can_bit_time() - Duration of one bit
*
diff --git a/include/linux/can/dev.h b/include/linux/can/dev.h
index 76022f48a97673d81676c39c697eadc6d7063ff7..55aaadaacf68f940fa1b71f7c438e68b84080292 100644
--- a/include/linux/can/dev.h
+++ b/include/linux/can/dev.h
@@ -85,35 +85,6 @@ static inline bool can_fd_tdc_is_enabled(const struct can_priv *priv)
return !!(priv->ctrlmode & CAN_CTRLMODE_FD_TDC_MASK);
}
-/*
- * can_get_relative_tdco() - TDCO relative to the sample point
- *
- * struct can_tdc::tdco represents the absolute offset from TDCV. Some
- * controllers use instead an offset relative to the Sample Point (SP)
- * such that:
- *
- * SSP = TDCV + absolute TDCO
- * = TDCV + SP + relative TDCO
- *
- * -+----------- one bit ----------+-- TX pin
- * |<--- Sample Point --->|
- *
- * --+----------- one bit ----------+-- RX pin
- * |<-------- TDCV -------->|
- * |<------------------------>| absolute TDCO
- * |<--- Sample Point --->|
- * | |<->| relative TDCO
- * |<------------- Secondary Sample Point ------------>|
- */
-static inline s32 can_get_relative_tdco(const struct can_priv *priv)
-{
- const struct can_bittiming *dbt = &priv->fd.data_bittiming;
- s32 sample_point_in_tc = (CAN_SYNC_SEG + dbt->prop_seg +
- dbt->phase_seg1) * dbt->brp;
-
- return (s32)priv->fd.tdc.tdco - sample_point_in_tc;
-}
-
/* helper to define static CAN controller features at device creation time */
static inline int __must_check can_set_static_ctrlmode(struct net_device *dev,
u32 static_mode)
--
2.49.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH v2 03/20] can: netlink: document which symbols are FD specific
2025-09-10 6:03 [PATCH v2 00/20] can: netlink: preparation before introduction of CAN XL step 2/2 Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 01/20] can: dev: move struct data_bittiming_params to linux/can/bittiming.h Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 02/20] can: dev: make can_get_relative_tdco() FD agnostic and move it to bittiming.h Vincent Mailhol
@ 2025-09-10 6:03 ` Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 04/20] can: netlink: refactor can_validate_bittiming() Vincent Mailhol
` (16 subsequent siblings)
19 siblings, 0 replies; 32+ messages in thread
From: Vincent Mailhol @ 2025-09-10 6:03 UTC (permalink / raw)
To: Marc Kleine-Budde, Oliver Hartkopp
Cc: Vincent Mailhol, Stéphane Grosjean, Robert Nawrath, Minh Le,
Duy Nguyen, linux-can, linux-kernel
The CAN XL netlink interface will also have data bitrate and TDC
parameters. The current FD parameters do not have a prefix in their
names to differentiate them.
Because the netlink interface is part of the UAPI, it is unfortunately
not feasible to rename the existing symbols to add an FD_ prefix. The
best alternative is to add a comment for each of the symbols to notify
the reader of which parts are CAN FD specific.
While at it, fix a typo: transiver -> transceiver.
Signed-off-by: Vincent Mailhol <mailhol@kernel.org>
---
include/uapi/linux/can/netlink.h | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/include/uapi/linux/can/netlink.h b/include/uapi/linux/can/netlink.h
index 02ec32d694742a32b3a51ff8c33616e109cef9f4..ef62f56eaaefda9f2fb39345776a483734682cd0 100644
--- a/include/uapi/linux/can/netlink.h
+++ b/include/uapi/linux/can/netlink.h
@@ -101,8 +101,8 @@ struct can_ctrlmode {
#define CAN_CTRLMODE_PRESUME_ACK 0x40 /* Ignore missing CAN ACKs */
#define CAN_CTRLMODE_FD_NON_ISO 0x80 /* CAN FD in non-ISO mode */
#define CAN_CTRLMODE_CC_LEN8_DLC 0x100 /* Classic CAN DLC option */
-#define CAN_CTRLMODE_TDC_AUTO 0x200 /* CAN transiver automatically calculates TDCV */
-#define CAN_CTRLMODE_TDC_MANUAL 0x400 /* TDCV is manually set up by user */
+#define CAN_CTRLMODE_TDC_AUTO 0x200 /* FD transceiver automatically calculates TDCV */
+#define CAN_CTRLMODE_TDC_MANUAL 0x400 /* FD TDCV is manually set up by user */
/*
* CAN device statistics
@@ -129,14 +129,14 @@ enum {
IFLA_CAN_RESTART_MS,
IFLA_CAN_RESTART,
IFLA_CAN_BERR_COUNTER,
- IFLA_CAN_DATA_BITTIMING,
- IFLA_CAN_DATA_BITTIMING_CONST,
+ IFLA_CAN_DATA_BITTIMING, /* FD */
+ IFLA_CAN_DATA_BITTIMING_CONST, /* FD */
IFLA_CAN_TERMINATION,
IFLA_CAN_TERMINATION_CONST,
IFLA_CAN_BITRATE_CONST,
- IFLA_CAN_DATA_BITRATE_CONST,
+ IFLA_CAN_DATA_BITRATE_CONST, /* FD */
IFLA_CAN_BITRATE_MAX,
- IFLA_CAN_TDC,
+ IFLA_CAN_TDC, /* FD */
IFLA_CAN_CTRLMODE_EXT,
/* add new constants above here */
@@ -145,7 +145,7 @@ enum {
};
/*
- * CAN FD Transmitter Delay Compensation (TDC)
+ * CAN FD/XL Transmitter Delay Compensation (TDC)
*
* Please refer to struct can_tdc_const and can_tdc in
* include/linux/can/bittiming.h for further details.
--
2.49.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH v2 04/20] can: netlink: refactor can_validate_bittiming()
2025-09-10 6:03 [PATCH v2 00/20] can: netlink: preparation before introduction of CAN XL step 2/2 Vincent Mailhol
` (2 preceding siblings ...)
2025-09-10 6:03 ` [PATCH v2 03/20] can: netlink: document which symbols are FD specific Vincent Mailhol
@ 2025-09-10 6:03 ` Vincent Mailhol
2025-09-10 6:13 ` Marc Kleine-Budde
2025-09-10 6:03 ` [PATCH v2 05/20] can: netlink: add can_validate_tdc() Vincent Mailhol
` (15 subsequent siblings)
19 siblings, 1 reply; 32+ messages in thread
From: Vincent Mailhol @ 2025-09-10 6:03 UTC (permalink / raw)
To: Marc Kleine-Budde, Oliver Hartkopp
Cc: Vincent Mailhol, Stéphane Grosjean, Robert Nawrath, Minh Le,
Duy Nguyen, linux-can, linux-kernel
Whenever can_validate_bittiming() is called, it is always preceded by
some boilerplate code which was copy pasted all over the place. Move
that repeated code directly inside can_validate_bittiming().
Finally, the mempcy() is not needed. Just use the pointer returned by
nla_data() as-is.
Signed-off-by: Vincent Mailhol <mailhol@kernel.org>
---
drivers/net/can/dev/netlink.c | 35 ++++++++++++++++-------------------
1 file changed, 16 insertions(+), 19 deletions(-)
diff --git a/drivers/net/can/dev/netlink.c b/drivers/net/can/dev/netlink.c
index d9f6ab3efb9767409c318b714f19df8a30e51137..bc91df8d75ac41381fefea895d7e490a965d3f7b 100644
--- a/drivers/net/can/dev/netlink.c
+++ b/drivers/net/can/dev/netlink.c
@@ -36,13 +36,20 @@ static const struct nla_policy can_tdc_policy[IFLA_CAN_TDC_MAX + 1] = {
[IFLA_CAN_TDC_TDCF] = { .type = NLA_U32 },
};
-static int can_validate_bittiming(const struct can_bittiming *bt,
- struct netlink_ext_ack *extack)
+static int can_validate_bittiming(struct nlattr *data[],
+ struct netlink_ext_ack *extack,
+ int ifla_can_bittiming)
{
+ struct can_bittiming *bt;
+
+ if (!data[ifla_can_bittiming])
+ return 0;
+
+ bt = nla_data(data[ifla_can_bittiming]);
+
/* sample point is in one-tenth of a percent */
if (bt->sample_point >= 1000) {
NL_SET_ERR_MSG(extack, "sample point must be between 0 and 100%");
-
return -EINVAL;
}
@@ -105,14 +112,9 @@ static int can_validate(struct nlattr *tb[], struct nlattr *data[],
}
}
- if (data[IFLA_CAN_BITTIMING]) {
- struct can_bittiming bt;
-
- memcpy(&bt, nla_data(data[IFLA_CAN_BITTIMING]), sizeof(bt));
- err = can_validate_bittiming(&bt, extack);
- if (err)
- return err;
- }
+ err = can_validate_bittiming(data, extack, IFLA_CAN_BITTIMING);
+ if (err)
+ return err;
if (is_can_fd) {
if (!data[IFLA_CAN_BITTIMING] || !data[IFLA_CAN_DATA_BITTIMING])
@@ -124,14 +126,9 @@ static int can_validate(struct nlattr *tb[], struct nlattr *data[],
return -EOPNOTSUPP;
}
- if (data[IFLA_CAN_DATA_BITTIMING]) {
- struct can_bittiming bt;
-
- memcpy(&bt, nla_data(data[IFLA_CAN_DATA_BITTIMING]), sizeof(bt));
- err = can_validate_bittiming(&bt, extack);
- if (err)
- return err;
- }
+ err = can_validate_bittiming(data, extack, IFLA_CAN_DATA_BITTIMING);
+ if (err)
+ return err;
return 0;
}
--
2.49.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH v2 05/20] can: netlink: add can_validate_tdc()
2025-09-10 6:03 [PATCH v2 00/20] can: netlink: preparation before introduction of CAN XL step 2/2 Vincent Mailhol
` (3 preceding siblings ...)
2025-09-10 6:03 ` [PATCH v2 04/20] can: netlink: refactor can_validate_bittiming() Vincent Mailhol
@ 2025-09-10 6:03 ` Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 06/20] can: netlink: add can_validate_databittiming() Vincent Mailhol
` (14 subsequent siblings)
19 siblings, 0 replies; 32+ messages in thread
From: Vincent Mailhol @ 2025-09-10 6:03 UTC (permalink / raw)
To: Marc Kleine-Budde, Oliver Hartkopp
Cc: Vincent Mailhol, Stéphane Grosjean, Robert Nawrath, Minh Le,
Duy Nguyen, linux-can, linux-kernel
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 <mailhol@kernel.org>
---
Changelog:
RFC 1 -> RFC 2:
- fix bug on tdc flags mutual exclusivity:
'if (tdc_auto == 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 bc91df8d75ac41381fefea895d7e490a965d3f7b..24ad34ad7cc9ae75b6f28d53fb4d8030710d2507 100644
--- a/drivers/net/can/dev/netlink.c
+++ b/drivers/net/can/dev/netlink.c
@@ -56,6 +56,49 @@ static int can_validate_bittiming(struct nlattr *data[],
return 0;
}
+static int can_validate_tdc(struct nlattr *data_tdc,
+ struct netlink_ext_ack *extack, u32 tdc_flags)
+{
+ bool tdc_manual = tdc_flags & CAN_CTRLMODE_TDC_MANUAL_MASK;
+ bool tdc_auto = 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) != !!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 = 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)
{
@@ -66,7 +109,7 @@ static int can_validate(struct nlattr *tb[], struct nlattr *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())
*/
if (!data)
@@ -74,42 +117,13 @@ static int can_validate(struct nlattr *tb[], struct nlattr *data[],
if (data[IFLA_CAN_CTRLMODE]) {
struct can_ctrlmode *cm = nla_data(data[IFLA_CAN_CTRLMODE]);
- u32 tdc_flags = cm->flags & CAN_CTRLMODE_FD_TDC_MASK;
is_can_fd = cm->flags & cm->mask & CAN_CTRLMODE_FD;
- /* CAN_CTRLMODE_TDC_{AUTO,MANUAL} are mutually exclusive */
- if (tdc_flags == 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 != !!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 = 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 = can_validate_tdc(data[IFLA_CAN_TDC], extack,
+ cm->flags & CAN_CTRLMODE_FD_TDC_MASK);
+ if (err)
+ return err;
}
err = can_validate_bittiming(data, extack, IFLA_CAN_BITTIMING);
diff --git a/include/linux/can/bittiming.h b/include/linux/can/bittiming.h
index 4d5f7794194ab13641c7854c2d66625c4e942f6c..71f839c3f0325b2a496a4bc447044a4853541338 100644
--- a/include/linux/can/bittiming.h
+++ b/include/linux/can/bittiming.h
@@ -16,6 +16,10 @@
#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)
/*
* struct can_tdc - CAN FD Transmission Delay Compensation parameters
--
2.49.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH v2 06/20] can: netlink: add can_validate_databittiming()
2025-09-10 6:03 [PATCH v2 00/20] can: netlink: preparation before introduction of CAN XL step 2/2 Vincent Mailhol
` (4 preceding siblings ...)
2025-09-10 6:03 ` [PATCH v2 05/20] can: netlink: add can_validate_tdc() Vincent Mailhol
@ 2025-09-10 6:03 ` Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 07/20] can: netlink: refactor CAN_CTRLMODE_TDC_{AUTO,MANUAL} flag reset logic Vincent Mailhol
` (13 subsequent siblings)
19 siblings, 0 replies; 32+ messages in thread
From: Vincent Mailhol @ 2025-09-10 6:03 UTC (permalink / raw)
To: Marc Kleine-Budde, Oliver Hartkopp
Cc: Vincent Mailhol, Stéphane Grosjean, Robert Nawrath, Minh Le,
Duy Nguyen, linux-can, linux-kernel
Factorise the databittiming validation out of can_validate() and move
it in the new add can_validate_databittiming() function. Also move
can_validate()'s comment because it is specific to CAN FD. This is a
preparation patch for the introduction of CAN XL as this databittiming
validation will be reused later on.
Signed-off-by: Vincent Mailhol <mailhol@kernel.org>
---
Changelog:
v1 -> v2:
- Move can_validate()'s comment block to
can_validate_databittiming(). Consequently, the next patch
can: netlink: remove comment in can_validate()
is removed.
- Change WARN_ON(1) into return -EOPNOTSUPP to suppress a gcc
warning.
Link: https://lore.kernel.org/linux-can/202509050259.NjPdQyAD-lkp@intel.com/
---
drivers/net/can/dev/netlink.c | 64 +++++++++++++++++++++++++++++--------------
1 file changed, 44 insertions(+), 20 deletions(-)
diff --git a/drivers/net/can/dev/netlink.c b/drivers/net/can/dev/netlink.c
index 24ad34ad7cc9ae75b6f28d53fb4d8030710d2507..274eaab10796b601d565c32f6315727a578970bb 100644
--- a/drivers/net/can/dev/netlink.c
+++ b/drivers/net/can/dev/netlink.c
@@ -99,10 +99,13 @@ static int can_validate_tdc(struct nlattr *data_tdc,
return 0;
}
-static int can_validate(struct nlattr *tb[], struct nlattr *data[],
- struct netlink_ext_ack *extack)
+static int can_validate_databittiming(struct nlattr *data[],
+ struct netlink_ext_ack *extack,
+ int ifla_can_data_bittiming, u32 flags)
{
- bool is_can_fd = false;
+ struct nlattr *data_tdc;
+ u32 tdc_flags;
+ bool is_on;
int err;
/* Make sure that valid CAN FD configurations always consist of
@@ -112,35 +115,56 @@ static int can_validate(struct nlattr *tb[], struct nlattr *data[],
* - TDC parameters are coherent (details in can_validate_tdc())
*/
+ if (ifla_can_data_bittiming == IFLA_CAN_DATA_BITTIMING) {
+ data_tdc = data[IFLA_CAN_TDC];
+ tdc_flags = flags & CAN_CTRLMODE_FD_TDC_MASK;
+ is_on = flags & CAN_CTRLMODE_FD;
+ } else {
+ return -EOPNOTSUPP; /* Place holder for CAN XL */
+ }
+
+ if (is_on) {
+ if (!data[IFLA_CAN_BITTIMING] || !data[ifla_can_data_bittiming])
+ return -EOPNOTSUPP;
+ }
+
+ if (data[ifla_can_data_bittiming] || data_tdc) {
+ if (!is_on)
+ return -EOPNOTSUPP;
+ }
+
+ err = can_validate_bittiming(data, extack, ifla_can_data_bittiming);
+ if (err)
+ return err;
+
+ err = can_validate_tdc(data_tdc, extack, tdc_flags);
+ if (err)
+ return err;
+
+ return 0;
+}
+
+static int can_validate(struct nlattr *tb[], struct nlattr *data[],
+ struct netlink_ext_ack *extack)
+{
+ u32 flags = 0;
+ int err;
+
if (!data)
return 0;
if (data[IFLA_CAN_CTRLMODE]) {
struct can_ctrlmode *cm = nla_data(data[IFLA_CAN_CTRLMODE]);
- is_can_fd = cm->flags & cm->mask & CAN_CTRLMODE_FD;
-
- err = can_validate_tdc(data[IFLA_CAN_TDC], extack,
- cm->flags & CAN_CTRLMODE_FD_TDC_MASK);
- if (err)
- return err;
+ flags = cm->flags & cm->mask;
}
err = can_validate_bittiming(data, extack, IFLA_CAN_BITTIMING);
if (err)
return err;
- if (is_can_fd) {
- if (!data[IFLA_CAN_BITTIMING] || !data[IFLA_CAN_DATA_BITTIMING])
- return -EOPNOTSUPP;
- }
-
- if (data[IFLA_CAN_DATA_BITTIMING] || data[IFLA_CAN_TDC]) {
- if (!is_can_fd)
- return -EOPNOTSUPP;
- }
-
- err = can_validate_bittiming(data, extack, IFLA_CAN_DATA_BITTIMING);
+ err = can_validate_databittiming(data, extack,
+ IFLA_CAN_DATA_BITTIMING, flags);
if (err)
return err;
--
2.49.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH v2 07/20] can: netlink: refactor CAN_CTRLMODE_TDC_{AUTO,MANUAL} flag reset logic
2025-09-10 6:03 [PATCH v2 00/20] can: netlink: preparation before introduction of CAN XL step 2/2 Vincent Mailhol
` (5 preceding siblings ...)
2025-09-10 6:03 ` [PATCH v2 06/20] can: netlink: add can_validate_databittiming() Vincent Mailhol
@ 2025-09-10 6:03 ` Vincent Mailhol
2025-09-20 7:24 ` Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 08/20] can: netlink: remove useless check in can_tdc_changelink() Vincent Mailhol
` (12 subsequent siblings)
19 siblings, 1 reply; 32+ messages in thread
From: Vincent Mailhol @ 2025-09-10 6:03 UTC (permalink / raw)
To: Marc Kleine-Budde, Oliver Hartkopp
Cc: Vincent Mailhol, Stéphane Grosjean, Robert Nawrath, Minh Le,
Duy Nguyen, linux-can, linux-kernel
CAN_CTRLMODE_TDC_AUTO and CAN_CTRLMODE_TDC_MANUAL are mutually
exclusive. This means that whenever the user switches from auto to
manual mode (or vice versa), the other flag which was set previously
needs to be cleared.
Currently, this is handled with a masking operation. It can be done in
a simpler manner by clearing any of the previous TDC flags before
copying netlink attributes. The code becomes easier to understand and
will make it easier to add the new upcoming CAN XL flags which will
have a similar reset logic as the current TDC flags.
Signed-off-by: Vincent Mailhol <mailhol@kernel.org>
---
drivers/net/can/dev/netlink.c | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/drivers/net/can/dev/netlink.c b/drivers/net/can/dev/netlink.c
index 274eaab10796b601d565c32f6315727a578970bb..72a82d4e9d6494771320ea035ed6f6098c0e8ce6 100644
--- a/drivers/net/can/dev/netlink.c
+++ b/drivers/net/can/dev/netlink.c
@@ -254,6 +254,10 @@ static int can_changelink(struct net_device *dev, struct nlattr *tb[],
if ((maskedflags & ctrlstatic) != ctrlstatic)
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;
+
/* clear bits to be modified and copy the flag values */
priv->ctrlmode &= ~cm->mask;
priv->ctrlmode |= maskedflags;
@@ -270,11 +274,6 @@ static int can_changelink(struct net_device *dev, struct nlattr *tb[],
}
fd_tdc_flag_provided = cm->mask & CAN_CTRLMODE_FD_TDC_MASK;
- /* CAN_CTRLMODE_TDC_{AUTO,MANUAL} are mutually
- * exclusive: make sure to turn the other one off
- */
- if (fd_tdc_flag_provided)
- priv->ctrlmode &= cm->flags | ~CAN_CTRLMODE_FD_TDC_MASK;
}
if (data[IFLA_CAN_BITTIMING]) {
--
2.49.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH v2 08/20] can: netlink: remove useless check in can_tdc_changelink()
2025-09-10 6:03 [PATCH v2 00/20] can: netlink: preparation before introduction of CAN XL step 2/2 Vincent Mailhol
` (6 preceding siblings ...)
2025-09-10 6:03 ` [PATCH v2 07/20] can: netlink: refactor CAN_CTRLMODE_TDC_{AUTO,MANUAL} flag reset logic Vincent Mailhol
@ 2025-09-10 6:03 ` Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 09/20] can: netlink: make can_tdc_changelink() FD agnostic Vincent Mailhol
` (11 subsequent siblings)
19 siblings, 0 replies; 32+ messages in thread
From: Vincent Mailhol @ 2025-09-10 6:03 UTC (permalink / raw)
To: Marc Kleine-Budde, Oliver Hartkopp
Cc: Vincent Mailhol, Stéphane Grosjean, Robert Nawrath, Minh Le,
Duy Nguyen, linux-can, linux-kernel
can_tdc_changelink() return -EOPNOTSUPP under this condition:
!tdc_const || !can_fd_tdc_is_enabled(priv)
But this function is only called if the data[IFLA_CAN_TDC] parameters
are provided. At this point, can_validate_tdc() already checked that
either of the tdc auto or tdc manual control modes were provided, that
is to say, can_fd_tdc_is_enabled(priv) must be true.
Because the right hand operand of this condition is always true,
remove it.
Signed-off-by: Vincent Mailhol <mailhol@kernel.org>
---
drivers/net/can/dev/netlink.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/can/dev/netlink.c b/drivers/net/can/dev/netlink.c
index 72a82d4e9d6494771320ea035ed6f6098c0e8ce6..33a6621bd7a916583802fa12e0bd971c89560924 100644
--- a/drivers/net/can/dev/netlink.c
+++ b/drivers/net/can/dev/netlink.c
@@ -179,7 +179,7 @@ static int can_tdc_changelink(struct can_priv *priv, const struct nlattr *nla,
const struct can_tdc_const *tdc_const = priv->fd.tdc_const;
int err;
- if (!tdc_const || !can_fd_tdc_is_enabled(priv))
+ if (!tdc_const)
return -EOPNOTSUPP;
err = nla_parse_nested(tb_tdc, IFLA_CAN_TDC_MAX, nla,
--
2.49.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH v2 09/20] can: netlink: make can_tdc_changelink() FD agnostic
2025-09-10 6:03 [PATCH v2 00/20] can: netlink: preparation before introduction of CAN XL step 2/2 Vincent Mailhol
` (7 preceding siblings ...)
2025-09-10 6:03 ` [PATCH v2 08/20] can: netlink: remove useless check in can_tdc_changelink() Vincent Mailhol
@ 2025-09-10 6:03 ` Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 10/20] can: netlink: add can_dtb_changelink() Vincent Mailhol
` (10 subsequent siblings)
19 siblings, 0 replies; 32+ messages in thread
From: Vincent Mailhol @ 2025-09-10 6:03 UTC (permalink / raw)
To: Marc Kleine-Budde, Oliver Hartkopp
Cc: Vincent Mailhol, Stéphane Grosjean, Robert Nawrath, Minh Le,
Duy Nguyen, linux-can, linux-kernel
can_tdc_changelink() needs to access can_priv->fd making it
specific to CAN FD. Change the function parameter from struct can_priv
to struct data_bittiming_params. This way, the function becomes CAN FD
agnostic and can be reused later on for the CAN XL TDC.
Signed-off-by: Vincent Mailhol <mailhol@kernel.org>
---
drivers/net/can/dev/netlink.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/drivers/net/can/dev/netlink.c b/drivers/net/can/dev/netlink.c
index 33a6621bd7a916583802fa12e0bd971c89560924..fde6565fa04af0c5615c09ebb094cbf8bcef3172 100644
--- a/drivers/net/can/dev/netlink.c
+++ b/drivers/net/can/dev/netlink.c
@@ -171,12 +171,13 @@ static int can_validate(struct nlattr *tb[], struct nlattr *data[],
return 0;
}
-static int can_tdc_changelink(struct can_priv *priv, const struct nlattr *nla,
+static int can_tdc_changelink(struct data_bittiming_params *dbt_params,
+ const struct nlattr *nla,
struct netlink_ext_ack *extack)
{
struct nlattr *tb_tdc[IFLA_CAN_TDC_MAX + 1];
struct can_tdc tdc = { 0 };
- const struct can_tdc_const *tdc_const = priv->fd.tdc_const;
+ const struct can_tdc_const *tdc_const = dbt_params->tdc_const;
int err;
if (!tdc_const)
@@ -214,7 +215,7 @@ static int can_tdc_changelink(struct can_priv *priv, const struct nlattr *nla,
tdc.tdcf = tdcf;
}
- priv->fd.tdc = tdc;
+ dbt_params->tdc = tdc;
return 0;
}
@@ -382,8 +383,8 @@ static int can_changelink(struct net_device *dev, struct nlattr *tb[],
memset(&priv->fd.tdc, 0, sizeof(priv->fd.tdc));
if (data[IFLA_CAN_TDC]) {
/* TDC parameters are provided: use them */
- err = can_tdc_changelink(priv, data[IFLA_CAN_TDC],
- extack);
+ err = can_tdc_changelink(&priv->fd,
+ data[IFLA_CAN_TDC], extack);
if (err) {
priv->ctrlmode &= ~CAN_CTRLMODE_FD_TDC_MASK;
return err;
--
2.49.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH v2 10/20] can: netlink: add can_dtb_changelink()
2025-09-10 6:03 [PATCH v2 00/20] can: netlink: preparation before introduction of CAN XL step 2/2 Vincent Mailhol
` (8 preceding siblings ...)
2025-09-10 6:03 ` [PATCH v2 09/20] can: netlink: make can_tdc_changelink() FD agnostic Vincent Mailhol
@ 2025-09-10 6:03 ` Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 11/20] can: netlink: add can_ctrlmode_changelink() Vincent Mailhol
` (9 subsequent siblings)
19 siblings, 0 replies; 32+ messages in thread
From: Vincent Mailhol @ 2025-09-10 6:03 UTC (permalink / raw)
To: Marc Kleine-Budde, Oliver Hartkopp
Cc: Vincent Mailhol, Stéphane Grosjean, Robert Nawrath, Minh Le,
Duy Nguyen, linux-can, linux-kernel
Factorise the databittiming parsing out of can_changelink() and move
it in the new can_dtb_changelink() function. This is a preparation
patch for the introduction of CAN XL because the databittiming
changelink logic will be reused later on.
Signed-off-by: Vincent Mailhol <mailhol@kernel.org>
---
Changelog:
v1 -> v2:
- Change WARN_ON(1) into return -EOPNOTSUPP to suppress a gcc
warning.
Link: https://lore.kernel.org/linux-can/202509050404.ZLQknagH-lkp@intel.com/
RFC -> v1:
- In the RFC, can_dbt_changelink() required 8 parameters. Instead,
just pass a boolean and then get the FD/XL specific parameters in
an "if (fd) {} else {}" conditional.
---
drivers/net/can/dev/netlink.c | 152 ++++++++++++++++++++++++------------------
1 file changed, 88 insertions(+), 64 deletions(-)
diff --git a/drivers/net/can/dev/netlink.c b/drivers/net/can/dev/netlink.c
index fde6565fa04af0c5615c09ebb094cbf8bcef3172..5812114ca8842baedebd698d3000843dbce3ec7d 100644
--- a/drivers/net/can/dev/netlink.c
+++ b/drivers/net/can/dev/netlink.c
@@ -220,12 +220,95 @@ static int can_tdc_changelink(struct data_bittiming_params *dbt_params,
return 0;
}
+static int can_dbt_changelink(struct net_device *dev, struct nlattr *data[],
+ bool fd, struct netlink_ext_ack *extack)
+{
+ struct nlattr *data_bittiming, *data_tdc;
+ struct can_priv *priv = netdev_priv(dev);
+ struct data_bittiming_params *dbt_params;
+ struct can_bittiming dbt;
+ bool need_tdc_calc = false;
+ u32 tdc_mask;
+ int err;
+
+ if (fd) {
+ data_bittiming = data[IFLA_CAN_DATA_BITTIMING];
+ data_tdc = data[IFLA_CAN_TDC];
+ dbt_params = &priv->fd;
+ tdc_mask = CAN_CTRLMODE_FD_TDC_MASK;
+ } else {
+ return -EOPNOTSUPP; /* Place holder for CAN XL */
+ }
+
+ if (!data_bittiming)
+ return 0;
+
+ /* Do not allow changing bittiming while running */
+ if (dev->flags & IFF_UP)
+ return -EBUSY;
+
+ /* Calculate bittiming parameters based on data_bittiming_const
+ * if set, otherwise pass bitrate directly via do_set_bitrate().
+ * Bail out if neither is given.
+ */
+ if (!dbt_params->data_bittiming_const && !dbt_params->do_set_data_bittiming &&
+ !dbt_params->data_bitrate_const)
+ return -EOPNOTSUPP;
+
+ memcpy(&dbt, nla_data(data_bittiming), sizeof(dbt));
+ err = can_get_bittiming(dev, &dbt, dbt_params->data_bittiming_const,
+ dbt_params->data_bitrate_const,
+ dbt_params->data_bitrate_const_cnt, extack);
+ if (err)
+ return err;
+
+ if (priv->bitrate_max && dbt.bitrate > priv->bitrate_max) {
+ NL_SET_ERR_MSG_FMT(extack,
+ "CAN data bitrate %u bps surpasses transceiver capabilities of %u bps",
+ dbt.bitrate, priv->bitrate_max);
+ return -EINVAL;
+ }
+
+ 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 (data_tdc) {
+ /* TDC parameters are provided: use them */
+ err = can_tdc_changelink(dbt_params, data_tdc, extack);
+ if (err) {
+ priv->ctrlmode &= ~tdc_mask;
+ return err;
+ }
+ } else if (need_tdc_calc) {
+ /* Neither of TDC parameters nor TDC flags are provided:
+ * do calculation
+ */
+ can_calc_tdco(&dbt_params->tdc, dbt_params->tdc_const, &dbt,
+ &priv->ctrlmode, priv->ctrlmode_supported);
+ } /* else: both CAN_CTRLMODE_TDC_{AUTO,MANUAL} are explicitly
+ * turned off. TDC is disabled: do nothing
+ */
+
+ memcpy(&dbt_params->data_bittiming, &dbt, sizeof(dbt));
+
+ if (dbt_params->do_set_data_bittiming) {
+ /* Finally, set the bit-timing registers */
+ err = dbt_params->do_set_data_bittiming(dev);
+ if (err)
+ return err;
+ }
+
+ return 0;
+}
+
static int can_changelink(struct net_device *dev, struct nlattr *tb[],
struct nlattr *data[],
struct netlink_ext_ack *extack)
{
struct can_priv *priv = netdev_priv(dev);
- bool fd_tdc_flag_provided = false;
int err;
/* We need synchronization with dev->stop() */
@@ -273,8 +356,6 @@ static int can_changelink(struct net_device *dev, struct nlattr *tb[],
priv->ctrlmode &= ~CAN_CTRLMODE_FD_TDC_MASK;
memset(&priv->fd.tdc, 0, sizeof(priv->fd.tdc));
}
-
- fd_tdc_flag_provided = cm->mask & CAN_CTRLMODE_FD_TDC_MASK;
}
if (data[IFLA_CAN_BITTIMING]) {
@@ -347,67 +428,10 @@ static int can_changelink(struct net_device *dev, struct nlattr *tb[],
return err;
}
- if (data[IFLA_CAN_DATA_BITTIMING]) {
- struct can_bittiming dbt;
-
- /* Do not allow changing bittiming while running */
- if (dev->flags & IFF_UP)
- return -EBUSY;
-
- /* Calculate bittiming parameters based on
- * data_bittiming_const if set, otherwise pass bitrate
- * directly via do_set_bitrate(). Bail out if neither
- * is given.
- */
- if (!priv->fd.data_bittiming_const && !priv->fd.do_set_data_bittiming &&
- !priv->fd.data_bitrate_const)
- return -EOPNOTSUPP;
-
- memcpy(&dbt, nla_data(data[IFLA_CAN_DATA_BITTIMING]),
- sizeof(dbt));
- err = can_get_bittiming(dev, &dbt,
- priv->fd.data_bittiming_const,
- priv->fd.data_bitrate_const,
- priv->fd.data_bitrate_const_cnt,
- extack);
- if (err)
- return err;
-
- if (priv->bitrate_max && dbt.bitrate > priv->bitrate_max) {
- NL_SET_ERR_MSG_FMT(extack,
- "CANFD data bitrate %u bps surpasses transceiver capabilities of %u bps",
- dbt.bitrate, priv->bitrate_max);
- return -EINVAL;
- }
-
- memset(&priv->fd.tdc, 0, sizeof(priv->fd.tdc));
- if (data[IFLA_CAN_TDC]) {
- /* TDC parameters are provided: use them */
- err = can_tdc_changelink(&priv->fd,
- data[IFLA_CAN_TDC], extack);
- if (err) {
- priv->ctrlmode &= ~CAN_CTRLMODE_FD_TDC_MASK;
- return err;
- }
- } else if (!fd_tdc_flag_provided) {
- /* Neither of TDC parameters nor TDC flags are
- * provided: do calculation
- */
- can_calc_tdco(&priv->fd.tdc, priv->fd.tdc_const, &dbt,
- &priv->ctrlmode, priv->ctrlmode_supported);
- } /* else: both CAN_CTRLMODE_TDC_{AUTO,MANUAL} are explicitly
- * turned off. TDC is disabled: do nothing
- */
-
- memcpy(&priv->fd.data_bittiming, &dbt, sizeof(dbt));
-
- if (priv->fd.do_set_data_bittiming) {
- /* Finally, set the bit-timing registers */
- err = priv->fd.do_set_data_bittiming(dev);
- if (err)
- return err;
- }
- }
+ /* CAN FD */
+ err = can_dbt_changelink(dev, data, true, extack);
+ if (err)
+ return err;
if (data[IFLA_CAN_TERMINATION]) {
const u16 termval = nla_get_u16(data[IFLA_CAN_TERMINATION]);
--
2.49.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH v2 11/20] can: netlink: add can_ctrlmode_changelink()
2025-09-10 6:03 [PATCH v2 00/20] can: netlink: preparation before introduction of CAN XL step 2/2 Vincent Mailhol
` (9 preceding siblings ...)
2025-09-10 6:03 ` [PATCH v2 10/20] can: netlink: add can_dtb_changelink() Vincent Mailhol
@ 2025-09-10 6:03 ` Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 12/20] can: netlink: make can_tdc_get_size() FD agnostic Vincent Mailhol
` (8 subsequent siblings)
19 siblings, 0 replies; 32+ messages in thread
From: Vincent Mailhol @ 2025-09-10 6:03 UTC (permalink / raw)
To: Marc Kleine-Budde, Oliver Hartkopp
Cc: Vincent Mailhol, Stéphane Grosjean, Robert Nawrath, Minh Le,
Duy Nguyen, linux-can, linux-kernel
Split the control mode change link logic into a new function:
can_ctrlmode_changelink(). The purpose is to increase code readability
by preventing can_changelink() from becoming too big.
Signed-off-by: Vincent Mailhol <mailhol@kernel.org>
---
drivers/net/can/dev/netlink.c | 98 ++++++++++++++++++++++++-------------------
1 file changed, 55 insertions(+), 43 deletions(-)
diff --git a/drivers/net/can/dev/netlink.c b/drivers/net/can/dev/netlink.c
index 5812114ca8842baedebd698d3000843dbce3ec7d..ab2c9e75347704132b4dfe3b3d29b2c3f1c98908 100644
--- a/drivers/net/can/dev/netlink.c
+++ b/drivers/net/can/dev/netlink.c
@@ -171,6 +171,60 @@ static int can_validate(struct nlattr *tb[], struct nlattr *data[],
return 0;
}
+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 maskedflags;
+ u32 ctrlstatic;
+
+ if (!data[IFLA_CAN_CTRLMODE])
+ return 0;
+
+ /* Do not allow changing controller mode while running */
+ if (dev->flags & IFF_UP)
+ return -EBUSY;
+
+ cm = nla_data(data[IFLA_CAN_CTRLMODE]);
+ maskedflags = cm->flags & cm->mask;
+ ctrlstatic = can_get_static_ctrlmode(priv);
+
+ /* check whether provided bits are allowed to be passed */
+ if (maskedflags & ~(priv->ctrlmode_supported | ctrlstatic))
+ return -EOPNOTSUPP;
+
+ /* do not check for static fd-non-iso if 'fd' is disabled */
+ if (!(maskedflags & CAN_CTRLMODE_FD))
+ ctrlstatic &= ~CAN_CTRLMODE_FD_NON_ISO;
+
+ /* make sure static options are provided by configuration */
+ if ((maskedflags & ctrlstatic) != ctrlstatic)
+ 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;
+
+ /* clear bits to be modified and copy the flag values */
+ priv->ctrlmode &= ~cm->mask;
+ priv->ctrlmode |= maskedflags;
+
+ /* CAN_CTRLMODE_FD can only be set when driver supports FD */
+ if (priv->ctrlmode & CAN_CTRLMODE_FD) {
+ dev->mtu = CANFD_MTU;
+ } else {
+ dev->mtu = CAN_MTU;
+ memset(&priv->fd.data_bittiming, 0,
+ sizeof(priv->fd.data_bittiming));
+ priv->ctrlmode &= ~CAN_CTRLMODE_FD_TDC_MASK;
+ memset(&priv->fd.tdc, 0, sizeof(priv->fd.tdc));
+ }
+
+ return 0;
+}
+
static int can_tdc_changelink(struct data_bittiming_params *dbt_params,
const struct nlattr *nla,
struct netlink_ext_ack *extack)
@@ -314,49 +368,7 @@ static int can_changelink(struct net_device *dev, struct nlattr *tb[],
/* We need synchronization with dev->stop() */
ASSERT_RTNL();
- if (data[IFLA_CAN_CTRLMODE]) {
- struct can_ctrlmode *cm;
- u32 ctrlstatic;
- u32 maskedflags;
-
- /* Do not allow changing controller mode while running */
- if (dev->flags & IFF_UP)
- return -EBUSY;
- cm = nla_data(data[IFLA_CAN_CTRLMODE]);
- ctrlstatic = can_get_static_ctrlmode(priv);
- maskedflags = cm->flags & cm->mask;
-
- /* check whether provided bits are allowed to be passed */
- if (maskedflags & ~(priv->ctrlmode_supported | ctrlstatic))
- return -EOPNOTSUPP;
-
- /* do not check for static fd-non-iso if 'fd' is disabled */
- if (!(maskedflags & CAN_CTRLMODE_FD))
- ctrlstatic &= ~CAN_CTRLMODE_FD_NON_ISO;
-
- /* make sure static options are provided by configuration */
- if ((maskedflags & ctrlstatic) != ctrlstatic)
- 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;
-
- /* clear bits to be modified and copy the flag values */
- priv->ctrlmode &= ~cm->mask;
- priv->ctrlmode |= maskedflags;
-
- /* CAN_CTRLMODE_FD can only be set when driver supports FD */
- if (priv->ctrlmode & CAN_CTRLMODE_FD) {
- dev->mtu = CANFD_MTU;
- } else {
- dev->mtu = CAN_MTU;
- memset(&priv->fd.data_bittiming, 0,
- sizeof(priv->fd.data_bittiming));
- priv->ctrlmode &= ~CAN_CTRLMODE_FD_TDC_MASK;
- memset(&priv->fd.tdc, 0, sizeof(priv->fd.tdc));
- }
- }
+ can_ctrlmode_changelink(dev, data, extack);
if (data[IFLA_CAN_BITTIMING]) {
struct can_bittiming bt;
--
2.49.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH v2 12/20] can: netlink: make can_tdc_get_size() FD agnostic
2025-09-10 6:03 [PATCH v2 00/20] can: netlink: preparation before introduction of CAN XL step 2/2 Vincent Mailhol
` (10 preceding siblings ...)
2025-09-10 6:03 ` [PATCH v2 11/20] can: netlink: add can_ctrlmode_changelink() Vincent Mailhol
@ 2025-09-10 6:03 ` Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 13/20] can: netlink: add can_data_bittiming_get_size() Vincent Mailhol
` (7 subsequent siblings)
19 siblings, 0 replies; 32+ messages in thread
From: Vincent Mailhol @ 2025-09-10 6:03 UTC (permalink / raw)
To: Marc Kleine-Budde, Oliver Hartkopp
Cc: Vincent Mailhol, Stéphane Grosjean, Robert Nawrath, Minh Le,
Duy Nguyen, linux-can, linux-kernel
can_tdc_get_size() needs to access can_priv->fd making it specific to
CAN FD. Change the function parameter from struct can_priv to struct
data_bittiming_params.
can_tdc_get_size() also uses the CAN_CTRLMODE_TDC_MANUAL macro making
it specific to CAN FD. Add the tdc mask to the function parameter
list. The value of the tdc manual flag can then be derived from that
mask and stored in a local variable.
This way, the function becomes CAN FD agnostic and can be reused later
on for the CAN XL TDC.
Signed-off-by: Vincent Mailhol <mailhol@kernel.org>
---
Changelog:
v1 -> v2:
- Small rewrite of the patch description adding one more paragraph
with further details.
---
drivers/net/can/dev/netlink.c | 21 +++++++++++----------
1 file changed, 11 insertions(+), 10 deletions(-)
diff --git a/drivers/net/can/dev/netlink.c b/drivers/net/can/dev/netlink.c
index ab2c9e75347704132b4dfe3b3d29b2c3f1c98908..a49131f227d60e136ea31792a6e8c0157f3a8275 100644
--- a/drivers/net/can/dev/netlink.c
+++ b/drivers/net/can/dev/netlink.c
@@ -472,32 +472,32 @@ static int can_changelink(struct net_device *dev, struct nlattr *tb[],
return 0;
}
-static size_t can_tdc_get_size(const struct net_device *dev)
+static size_t can_tdc_get_size(struct data_bittiming_params *dbt_params,
+ u32 tdc_flags)
{
- struct can_priv *priv = netdev_priv(dev);
+ bool tdc_manual = tdc_flags & CAN_CTRLMODE_TDC_MANUAL_MASK;
size_t size;
- if (!priv->fd.tdc_const)
+ if (!dbt_params->tdc_const)
return 0;
size = nla_total_size(0); /* nest IFLA_CAN_TDC */
- if (priv->ctrlmode_supported & CAN_CTRLMODE_TDC_MANUAL) {
+ if (tdc_manual) {
size += nla_total_size(sizeof(u32)); /* IFLA_CAN_TDCV_MIN */
size += nla_total_size(sizeof(u32)); /* IFLA_CAN_TDCV_MAX */
}
size += nla_total_size(sizeof(u32)); /* IFLA_CAN_TDCO_MIN */
size += nla_total_size(sizeof(u32)); /* IFLA_CAN_TDCO_MAX */
- if (priv->fd.tdc_const->tdcf_max) {
+ if (dbt_params->tdc_const->tdcf_max) {
size += nla_total_size(sizeof(u32)); /* IFLA_CAN_TDCF_MIN */
size += nla_total_size(sizeof(u32)); /* IFLA_CAN_TDCF_MAX */
}
- if (can_fd_tdc_is_enabled(priv)) {
- if (priv->ctrlmode & CAN_CTRLMODE_TDC_MANUAL ||
- priv->fd.do_get_auto_tdcv)
+ if (tdc_flags) {
+ if (tdc_manual || dbt_params->do_get_auto_tdcv)
size += nla_total_size(sizeof(u32)); /* IFLA_CAN_TDCV */
size += nla_total_size(sizeof(u32)); /* IFLA_CAN_TDCO */
- if (priv->fd.tdc_const->tdcf_max)
+ if (dbt_params->tdc_const->tdcf_max)
size += nla_total_size(sizeof(u32)); /* IFLA_CAN_TDCF */
}
@@ -541,7 +541,8 @@ static size_t can_get_size(const struct net_device *dev)
size += nla_total_size(sizeof(*priv->fd.data_bitrate_const) *
priv->fd.data_bitrate_const_cnt);
size += sizeof(priv->bitrate_max); /* IFLA_CAN_BITRATE_MAX */
- size += can_tdc_get_size(dev); /* IFLA_CAN_TDC */
+ size += can_tdc_get_size(&priv->fd, /* IFLA_CAN_TDC */
+ priv->ctrlmode & CAN_CTRLMODE_FD_TDC_MASK);
size += can_ctrlmode_ext_get_size(); /* IFLA_CAN_CTRLMODE_EXT */
return size;
--
2.49.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH v2 13/20] can: netlink: add can_data_bittiming_get_size()
2025-09-10 6:03 [PATCH v2 00/20] can: netlink: preparation before introduction of CAN XL step 2/2 Vincent Mailhol
` (11 preceding siblings ...)
2025-09-10 6:03 ` [PATCH v2 12/20] can: netlink: make can_tdc_get_size() FD agnostic Vincent Mailhol
@ 2025-09-10 6:03 ` Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 14/20] can: netlink: add can_bittiming_fill_info() Vincent Mailhol
` (6 subsequent siblings)
19 siblings, 0 replies; 32+ messages in thread
From: Vincent Mailhol @ 2025-09-10 6:03 UTC (permalink / raw)
To: Marc Kleine-Budde, Oliver Hartkopp
Cc: Vincent Mailhol, Stéphane Grosjean, Robert Nawrath, Minh Le,
Duy Nguyen, linux-can, linux-kernel
Add the can_data_bittiming_get_size() function to factorise the logic
to retrieve the size of below data bittiming parameters:
- data_bittiming
- data_bittiming_const
- data_bitrate_const
- tdc parameters
This function will be reused later on for CAN XL.
Signed-off-by: Vincent Mailhol <mailhol@kernel.org>
---
drivers/net/can/dev/netlink.c | 29 ++++++++++++++++++++---------
1 file changed, 20 insertions(+), 9 deletions(-)
diff --git a/drivers/net/can/dev/netlink.c b/drivers/net/can/dev/netlink.c
index a49131f227d60e136ea31792a6e8c0157f3a8275..c30920761d25871ac2e73a56a54333c521b4f9d8 100644
--- a/drivers/net/can/dev/netlink.c
+++ b/drivers/net/can/dev/netlink.c
@@ -504,6 +504,23 @@ static size_t can_tdc_get_size(struct data_bittiming_params *dbt_params,
return size;
}
+static size_t can_data_bittiming_get_size(struct data_bittiming_params *dbt_params,
+ u32 tdc_flags)
+{
+ size_t size = 0;
+
+ if (dbt_params->data_bittiming.bitrate) /* IFLA_CAN_DATA_BITTIMING */
+ size += nla_total_size(sizeof(dbt_params->data_bittiming));
+ if (dbt_params->data_bittiming_const) /* IFLA_CAN_DATA_BITTIMING_CONST */
+ size += nla_total_size(sizeof(*dbt_params->data_bittiming_const));
+ if (dbt_params->data_bitrate_const) /* IFLA_CAN_DATA_BITRATE_CONST */
+ size += nla_total_size(sizeof(*dbt_params->data_bitrate_const) *
+ dbt_params->data_bitrate_const_cnt);
+ size += can_tdc_get_size(dbt_params, tdc_flags);/* IFLA_CAN_TDC */
+
+ return size;
+}
+
static size_t can_ctrlmode_ext_get_size(void)
{
return nla_total_size(0) + /* nest IFLA_CAN_CTRLMODE_EXT */
@@ -525,10 +542,6 @@ static size_t can_get_size(const struct net_device *dev)
size += nla_total_size(sizeof(u32)); /* IFLA_CAN_RESTART_MS */
if (priv->do_get_berr_counter) /* IFLA_CAN_BERR_COUNTER */
size += nla_total_size(sizeof(struct can_berr_counter));
- if (priv->fd.data_bittiming.bitrate) /* IFLA_CAN_DATA_BITTIMING */
- size += nla_total_size(sizeof(struct can_bittiming));
- if (priv->fd.data_bittiming_const) /* IFLA_CAN_DATA_BITTIMING_CONST */
- size += nla_total_size(sizeof(struct can_bittiming_const));
if (priv->termination_const) {
size += nla_total_size(sizeof(priv->termination)); /* IFLA_CAN_TERMINATION */
size += nla_total_size(sizeof(*priv->termination_const) * /* IFLA_CAN_TERMINATION_CONST */
@@ -537,14 +550,12 @@ static size_t can_get_size(const struct net_device *dev)
if (priv->bitrate_const) /* IFLA_CAN_BITRATE_CONST */
size += nla_total_size(sizeof(*priv->bitrate_const) *
priv->bitrate_const_cnt);
- if (priv->fd.data_bitrate_const) /* IFLA_CAN_DATA_BITRATE_CONST */
- size += nla_total_size(sizeof(*priv->fd.data_bitrate_const) *
- priv->fd.data_bitrate_const_cnt);
size += sizeof(priv->bitrate_max); /* IFLA_CAN_BITRATE_MAX */
- size += can_tdc_get_size(&priv->fd, /* IFLA_CAN_TDC */
- priv->ctrlmode & CAN_CTRLMODE_FD_TDC_MASK);
size += can_ctrlmode_ext_get_size(); /* IFLA_CAN_CTRLMODE_EXT */
+ size += can_data_bittiming_get_size(&priv->fd,
+ priv->ctrlmode & CAN_CTRLMODE_FD_TDC_MASK);
+
return size;
}
--
2.49.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH v2 14/20] can: netlink: add can_bittiming_fill_info()
2025-09-10 6:03 [PATCH v2 00/20] can: netlink: preparation before introduction of CAN XL step 2/2 Vincent Mailhol
` (12 preceding siblings ...)
2025-09-10 6:03 ` [PATCH v2 13/20] can: netlink: add can_data_bittiming_get_size() Vincent Mailhol
@ 2025-09-10 6:03 ` Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 15/20] can: netlink: add can_bittiming_const_fill_info() Vincent Mailhol
` (5 subsequent siblings)
19 siblings, 0 replies; 32+ messages in thread
From: Vincent Mailhol @ 2025-09-10 6:03 UTC (permalink / raw)
To: Marc Kleine-Budde, Oliver Hartkopp
Cc: Vincent Mailhol, Stéphane Grosjean, Robert Nawrath, Minh Le,
Duy Nguyen, linux-can, linux-kernel
Add can_bittiming_fill_info() to factorise the logic when filling the
bittiming information for Classical CAN and CAN FD. This function will
be reused later on for CAN XL.
Signed-off-by: Vincent Mailhol <mailhol@kernel.org>
---
drivers/net/can/dev/netlink.c | 19 ++++++++++++-------
1 file changed, 12 insertions(+), 7 deletions(-)
diff --git a/drivers/net/can/dev/netlink.c b/drivers/net/can/dev/netlink.c
index c30920761d25871ac2e73a56a54333c521b4f9d8..e2f26898b83be8df8d2c4d0cd64b505f3c4a9b7d 100644
--- a/drivers/net/can/dev/netlink.c
+++ b/drivers/net/can/dev/netlink.c
@@ -559,6 +559,14 @@ static size_t can_get_size(const struct net_device *dev)
return size;
}
+static int can_bittiming_fill_info(struct sk_buff *skb, int ifla_can_bittiming,
+ struct can_bittiming *bittiming)
+{
+ return bittiming->bitrate != CAN_BITRATE_UNSET &&
+ bittiming->bitrate != CAN_BITRATE_UNKNOWN &&
+ nla_put(skb, ifla_can_bittiming, sizeof(*bittiming), bittiming);
+}
+
static int can_tdc_fill_info(struct sk_buff *skb, const struct net_device *dev)
{
struct nlattr *nest;
@@ -641,10 +649,8 @@ static int can_fill_info(struct sk_buff *skb, const struct net_device *dev)
if (priv->do_get_state)
priv->do_get_state(dev, &state);
- if ((priv->bittiming.bitrate != CAN_BITRATE_UNSET &&
- priv->bittiming.bitrate != CAN_BITRATE_UNKNOWN &&
- nla_put(skb, IFLA_CAN_BITTIMING,
- sizeof(priv->bittiming), &priv->bittiming)) ||
+ if (can_bittiming_fill_info(skb, IFLA_CAN_BITTIMING,
+ &priv->bittiming) ||
(priv->bittiming_const &&
nla_put(skb, IFLA_CAN_BITTIMING_CONST,
@@ -659,9 +665,8 @@ static int can_fill_info(struct sk_buff *skb, const struct net_device *dev)
!priv->do_get_berr_counter(dev, &bec) &&
nla_put(skb, IFLA_CAN_BERR_COUNTER, sizeof(bec), &bec)) ||
- (priv->fd.data_bittiming.bitrate &&
- nla_put(skb, IFLA_CAN_DATA_BITTIMING,
- sizeof(priv->fd.data_bittiming), &priv->fd.data_bittiming)) ||
+ can_bittiming_fill_info(skb, IFLA_CAN_DATA_BITTIMING,
+ &priv->fd.data_bittiming) ||
(priv->fd.data_bittiming_const &&
nla_put(skb, IFLA_CAN_DATA_BITTIMING_CONST,
--
2.49.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH v2 15/20] can: netlink: add can_bittiming_const_fill_info()
2025-09-10 6:03 [PATCH v2 00/20] can: netlink: preparation before introduction of CAN XL step 2/2 Vincent Mailhol
` (13 preceding siblings ...)
2025-09-10 6:03 ` [PATCH v2 14/20] can: netlink: add can_bittiming_fill_info() Vincent Mailhol
@ 2025-09-10 6:03 ` Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 16/20] can: netlink: add can_bitrate_const_fill_info() Vincent Mailhol
` (4 subsequent siblings)
19 siblings, 0 replies; 32+ messages in thread
From: Vincent Mailhol @ 2025-09-10 6:03 UTC (permalink / raw)
To: Marc Kleine-Budde, Oliver Hartkopp
Cc: Vincent Mailhol, Stéphane Grosjean, Robert Nawrath, Minh Le,
Duy Nguyen, linux-can, linux-kernel
Add function can_bittiming_fill_info() to factorise the logic when
filling the bittiming constant information for Classical CAN and CAN
FD. This function will be reused later on for CAN XL.
Signed-off-by: Vincent Mailhol <mailhol@kernel.org>
---
drivers/net/can/dev/netlink.c | 20 +++++++++++++-------
1 file changed, 13 insertions(+), 7 deletions(-)
diff --git a/drivers/net/can/dev/netlink.c b/drivers/net/can/dev/netlink.c
index e2f26898b83be8df8d2c4d0cd64b505f3c4a9b7d..39b7b0a0f5f48ce1765c201e7c3e56a85fd58740 100644
--- a/drivers/net/can/dev/netlink.c
+++ b/drivers/net/can/dev/netlink.c
@@ -567,6 +567,15 @@ static int can_bittiming_fill_info(struct sk_buff *skb, int ifla_can_bittiming,
nla_put(skb, ifla_can_bittiming, sizeof(*bittiming), bittiming);
}
+static int can_bittiming_const_fill_info(struct sk_buff *skb,
+ int ifla_can_bittiming_const,
+ const struct can_bittiming_const *bittiming_const)
+{
+ return bittiming_const &&
+ nla_put(skb, ifla_can_bittiming_const,
+ sizeof(*bittiming_const), bittiming_const);
+}
+
static int can_tdc_fill_info(struct sk_buff *skb, const struct net_device *dev)
{
struct nlattr *nest;
@@ -652,9 +661,8 @@ static int can_fill_info(struct sk_buff *skb, const struct net_device *dev)
if (can_bittiming_fill_info(skb, IFLA_CAN_BITTIMING,
&priv->bittiming) ||
- (priv->bittiming_const &&
- nla_put(skb, IFLA_CAN_BITTIMING_CONST,
- sizeof(*priv->bittiming_const), priv->bittiming_const)) ||
+ can_bittiming_const_fill_info(skb, IFLA_CAN_BITTIMING_CONST,
+ priv->bittiming_const) ||
nla_put(skb, IFLA_CAN_CLOCK, sizeof(priv->clock), &priv->clock) ||
nla_put_u32(skb, IFLA_CAN_STATE, state) ||
@@ -668,10 +676,8 @@ static int can_fill_info(struct sk_buff *skb, const struct net_device *dev)
can_bittiming_fill_info(skb, IFLA_CAN_DATA_BITTIMING,
&priv->fd.data_bittiming) ||
- (priv->fd.data_bittiming_const &&
- nla_put(skb, IFLA_CAN_DATA_BITTIMING_CONST,
- sizeof(*priv->fd.data_bittiming_const),
- priv->fd.data_bittiming_const)) ||
+ can_bittiming_const_fill_info(skb, IFLA_CAN_DATA_BITTIMING_CONST,
+ priv->fd.data_bittiming_const) ||
(priv->termination_const &&
(nla_put_u16(skb, IFLA_CAN_TERMINATION, priv->termination) ||
--
2.49.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH v2 16/20] can: netlink: add can_bitrate_const_fill_info()
2025-09-10 6:03 [PATCH v2 00/20] can: netlink: preparation before introduction of CAN XL step 2/2 Vincent Mailhol
` (14 preceding siblings ...)
2025-09-10 6:03 ` [PATCH v2 15/20] can: netlink: add can_bittiming_const_fill_info() Vincent Mailhol
@ 2025-09-10 6:03 ` Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 17/20] can: netlink: make can_tdc_fill_info() FD agnostic Vincent Mailhol
` (3 subsequent siblings)
19 siblings, 0 replies; 32+ messages in thread
From: Vincent Mailhol @ 2025-09-10 6:03 UTC (permalink / raw)
To: Marc Kleine-Budde, Oliver Hartkopp
Cc: Vincent Mailhol, Stéphane Grosjean, Robert Nawrath, Minh Le,
Duy Nguyen, linux-can, linux-kernel
Add can_bitrate_const_fill_info() to factorise the logic when filling
the bitrate constant information for Classical CAN and CAN FD. This
function will be reused later on for CAN XL.
Signed-off-by: Vincent Mailhol <mailhol@kernel.org>
---
drivers/net/can/dev/netlink.c | 25 +++++++++++++++----------
1 file changed, 15 insertions(+), 10 deletions(-)
diff --git a/drivers/net/can/dev/netlink.c b/drivers/net/can/dev/netlink.c
index 39b7b0a0f5f48ce1765c201e7c3e56a85fd58740..d79a1559ca76dbff8dd1043bfd964fbbe82b1b9c 100644
--- a/drivers/net/can/dev/netlink.c
+++ b/drivers/net/can/dev/netlink.c
@@ -576,6 +576,15 @@ static int can_bittiming_const_fill_info(struct sk_buff *skb,
sizeof(*bittiming_const), bittiming_const);
}
+static int can_bitrate_const_fill_info(struct sk_buff *skb,
+ int ifla_can_bitrate_const,
+ const u32 *bitrate_const, unsigned int cnt)
+{
+ return bitrate_const &&
+ nla_put(skb, ifla_can_bitrate_const,
+ sizeof(*bitrate_const) * cnt, bitrate_const);
+}
+
static int can_tdc_fill_info(struct sk_buff *skb, const struct net_device *dev)
{
struct nlattr *nest;
@@ -686,17 +695,13 @@ static int can_fill_info(struct sk_buff *skb, const struct net_device *dev)
priv->termination_const_cnt,
priv->termination_const))) ||
- (priv->bitrate_const &&
- nla_put(skb, IFLA_CAN_BITRATE_CONST,
- sizeof(*priv->bitrate_const) *
- priv->bitrate_const_cnt,
- priv->bitrate_const)) ||
+ can_bitrate_const_fill_info(skb, IFLA_CAN_BITRATE_CONST,
+ priv->bitrate_const,
+ priv->bitrate_const_cnt) ||
- (priv->fd.data_bitrate_const &&
- nla_put(skb, IFLA_CAN_DATA_BITRATE_CONST,
- sizeof(*priv->fd.data_bitrate_const) *
- priv->fd.data_bitrate_const_cnt,
- priv->fd.data_bitrate_const)) ||
+ can_bitrate_const_fill_info(skb, IFLA_CAN_DATA_BITRATE_CONST,
+ priv->fd.data_bitrate_const,
+ priv->fd.data_bitrate_const_cnt) ||
(nla_put(skb, IFLA_CAN_BITRATE_MAX,
sizeof(priv->bitrate_max),
--
2.49.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH v2 17/20] can: netlink: make can_tdc_fill_info() FD agnostic
2025-09-10 6:03 [PATCH v2 00/20] can: netlink: preparation before introduction of CAN XL step 2/2 Vincent Mailhol
` (15 preceding siblings ...)
2025-09-10 6:03 ` [PATCH v2 16/20] can: netlink: add can_bitrate_const_fill_info() Vincent Mailhol
@ 2025-09-10 6:03 ` Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 18/20] can: calc_bittiming: make can_calc_tdco() " Vincent Mailhol
` (2 subsequent siblings)
19 siblings, 0 replies; 32+ messages in thread
From: Vincent Mailhol @ 2025-09-10 6:03 UTC (permalink / raw)
To: Marc Kleine-Budde, Oliver Hartkopp
Cc: Vincent Mailhol, Stéphane Grosjean, Robert Nawrath, Minh Le,
Duy Nguyen, linux-can, linux-kernel
can_tdc_fill_info() depends on some variables which are specific to CAN
FD. Move these to the function parameters list so that, later on, this
function can be reused for the CAN XL TDC.
Signed-off-by: Vincent Mailhol <mailhol@kernel.org>
---
Changelog:
v1 -> v2:
- Change WARN_ON(1) into return -EOPNOTSUPP to suppress a gcc
warning.
Link: https://lore.kernel.org/linux-can/202509050541.1FKRbqOi-lkp@intel.com/
RFC -> v1:
- Just pass the IFLA index instead of passing each argument
individually. Instead, derive these as local variables depending on
whethe the IFLA index is IFLA_CAN_TDC or IFLA_CAN_XL_TDC.
---
drivers/net/can/dev/netlink.c | 35 ++++++++++++++++++++++++-----------
1 file changed, 24 insertions(+), 11 deletions(-)
diff --git a/drivers/net/can/dev/netlink.c b/drivers/net/can/dev/netlink.c
index d79a1559ca76dbff8dd1043bfd964fbbe82b1b9c..8c0830fb2d1e729a65aeb8a2eaa0db83959a71a1 100644
--- a/drivers/net/can/dev/netlink.c
+++ b/drivers/net/can/dev/netlink.c
@@ -585,21 +585,34 @@ static int can_bitrate_const_fill_info(struct sk_buff *skb,
sizeof(*bitrate_const) * cnt, bitrate_const);
}
-static int can_tdc_fill_info(struct sk_buff *skb, const struct net_device *dev)
+static int can_tdc_fill_info(struct sk_buff *skb, const struct net_device *dev,
+ int ifla_can_tdc)
{
- struct nlattr *nest;
struct can_priv *priv = netdev_priv(dev);
- struct can_tdc *tdc = &priv->fd.tdc;
- const struct can_tdc_const *tdc_const = priv->fd.tdc_const;
+ struct data_bittiming_params *dbt_params;
+ const struct can_tdc_const *tdc_const;
+ struct can_tdc *tdc;
+ struct nlattr *nest;
+ bool tdc_is_enabled, tdc_manual;
+
+ if (ifla_can_tdc == IFLA_CAN_TDC) {
+ dbt_params = &priv->fd;
+ tdc_is_enabled = can_fd_tdc_is_enabled(priv);
+ tdc_manual = priv->ctrlmode & CAN_CTRLMODE_TDC_MANUAL;
+ } else {
+ return -EOPNOTSUPP; /* Place holder for CAN XL */
+ }
+ tdc_const = dbt_params->tdc_const;
+ tdc = &dbt_params->tdc;
if (!tdc_const)
return 0;
- nest = nla_nest_start(skb, IFLA_CAN_TDC);
+ nest = nla_nest_start(skb, ifla_can_tdc);
if (!nest)
return -EMSGSIZE;
- if (priv->ctrlmode_supported & CAN_CTRLMODE_TDC_MANUAL &&
+ if (tdc_manual &&
(nla_put_u32(skb, IFLA_CAN_TDC_TDCV_MIN, tdc_const->tdcv_min) ||
nla_put_u32(skb, IFLA_CAN_TDC_TDCV_MAX, tdc_const->tdcv_max)))
goto err_cancel;
@@ -611,15 +624,15 @@ static int can_tdc_fill_info(struct sk_buff *skb, const struct net_device *dev)
nla_put_u32(skb, IFLA_CAN_TDC_TDCF_MAX, tdc_const->tdcf_max)))
goto err_cancel;
- if (can_fd_tdc_is_enabled(priv)) {
+ if (tdc_is_enabled) {
u32 tdcv;
int err = -EINVAL;
- if (priv->ctrlmode & CAN_CTRLMODE_TDC_MANUAL) {
+ if (tdc_manual) {
tdcv = tdc->tdcv;
err = 0;
- } else if (priv->fd.do_get_auto_tdcv) {
- err = priv->fd.do_get_auto_tdcv(dev, &tdcv);
+ } else if (dbt_params->do_get_auto_tdcv) {
+ err = dbt_params->do_get_auto_tdcv(dev, &tdcv);
}
if (!err && nla_put_u32(skb, IFLA_CAN_TDC_TDCV, tdcv))
goto err_cancel;
@@ -707,7 +720,7 @@ static int can_fill_info(struct sk_buff *skb, const struct net_device *dev)
sizeof(priv->bitrate_max),
&priv->bitrate_max)) ||
- can_tdc_fill_info(skb, dev) ||
+ can_tdc_fill_info(skb, dev, IFLA_CAN_TDC) ||
can_ctrlmode_ext_fill_info(skb, priv)
)
--
2.49.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH v2 18/20] can: calc_bittiming: make can_calc_tdco() FD agnostic
2025-09-10 6:03 [PATCH v2 00/20] can: netlink: preparation before introduction of CAN XL step 2/2 Vincent Mailhol
` (16 preceding siblings ...)
2025-09-10 6:03 ` [PATCH v2 17/20] can: netlink: make can_tdc_fill_info() FD agnostic Vincent Mailhol
@ 2025-09-10 6:03 ` Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 19/20] can: dev: add can_get_ctrlmode_str() Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 20/20] can: netlink: add userland error messages Vincent Mailhol
19 siblings, 0 replies; 32+ messages in thread
From: Vincent Mailhol @ 2025-09-10 6:03 UTC (permalink / raw)
To: Marc Kleine-Budde, Oliver Hartkopp
Cc: Vincent Mailhol, Stéphane Grosjean, Robert Nawrath, Minh Le,
Duy Nguyen, linux-can, linux-kernel
can_calc_tdco() uses the CAN_CTRLMODE_FD_TDC_MASK and
CAN_CTRLMODE_TDC_AUTO macros making it specific to CAN FD. Add the tdc
mask to the function parameter list. The value of the tdc auto flag
can then be derived from that mask and stored in a local variable.
This way, the function becomes CAN FD agnostic and can be reused later
on for the CAN XL TDC.
Signed-off-by: Vincent Mailhol <mailhol@kernel.org>
---
Changelog:
RFC -> v1:
- new patch. I overlooked this in the RFC and the CAN XL's TDC was
broken because of that.
---
drivers/net/can/dev/calc_bittiming.c | 10 ++++++----
drivers/net/can/dev/netlink.c | 2 +-
include/linux/can/bittiming.h | 4 ++--
3 files changed, 9 insertions(+), 7 deletions(-)
diff --git a/drivers/net/can/dev/calc_bittiming.c b/drivers/net/can/dev/calc_bittiming.c
index a94bd67c670c4801344e1fed6372d0182c46271f..394d6974f48151230510d7f43c80d75e1429dd37 100644
--- a/drivers/net/can/dev/calc_bittiming.c
+++ b/drivers/net/can/dev/calc_bittiming.c
@@ -173,13 +173,15 @@ int can_calc_bittiming(const struct net_device *dev, struct can_bittiming *bt,
void can_calc_tdco(struct can_tdc *tdc, const struct can_tdc_const *tdc_const,
const struct can_bittiming *dbt,
- u32 *ctrlmode, u32 ctrlmode_supported)
+ u32 tdc_mask, u32 *ctrlmode, u32 ctrlmode_supported)
{
- if (!tdc_const || !(ctrlmode_supported & CAN_CTRLMODE_TDC_AUTO))
+ u32 tdc_auto = tdc_mask & CAN_CTRLMODE_TDC_AUTO_MASK;
+
+ if (!tdc_const || !(ctrlmode_supported & tdc_auto))
return;
- *ctrlmode &= ~CAN_CTRLMODE_FD_TDC_MASK;
+ *ctrlmode &= ~tdc_mask;
/* As specified in ISO 11898-1 section 11.3.3 "Transmitter
* delay compensation" (TDC) is only applicable if data BRP is
@@ -193,6 +195,6 @@ void can_calc_tdco(struct can_tdc *tdc, const struct can_tdc_const *tdc_const,
if (sample_point_in_tc < tdc_const->tdco_min)
return;
tdc->tdco = min(sample_point_in_tc, tdc_const->tdco_max);
- *ctrlmode |= CAN_CTRLMODE_TDC_AUTO;
+ *ctrlmode |= tdc_auto;
}
}
diff --git a/drivers/net/can/dev/netlink.c b/drivers/net/can/dev/netlink.c
index 8c0830fb2d1e729a65aeb8a2eaa0db83959a71a1..48a74808dbc881d1d46ff7d03d347ddb8af3d16c 100644
--- a/drivers/net/can/dev/netlink.c
+++ b/drivers/net/can/dev/netlink.c
@@ -341,7 +341,7 @@ static int can_dbt_changelink(struct net_device *dev, struct nlattr *data[],
* do calculation
*/
can_calc_tdco(&dbt_params->tdc, dbt_params->tdc_const, &dbt,
- &priv->ctrlmode, priv->ctrlmode_supported);
+ tdc_mask, &priv->ctrlmode, priv->ctrlmode_supported);
} /* else: both CAN_CTRLMODE_TDC_{AUTO,MANUAL} are explicitly
* turned off. TDC is disabled: do nothing
*/
diff --git a/include/linux/can/bittiming.h b/include/linux/can/bittiming.h
index 71f839c3f0325b2a496a4bc447044a4853541338..d30816dd93c7082c774ca4c01ee42465cd042ca0 100644
--- a/include/linux/can/bittiming.h
+++ b/include/linux/can/bittiming.h
@@ -135,7 +135,7 @@ int can_calc_bittiming(const struct net_device *dev, struct can_bittiming *bt,
void can_calc_tdco(struct can_tdc *tdc, const struct can_tdc_const *tdc_const,
const struct can_bittiming *dbt,
- u32 *ctrlmode, u32 ctrlmode_supported);
+ u32 tdc_mask, u32 *ctrlmode, u32 ctrlmode_supported);
#else /* !CONFIG_CAN_CALC_BITTIMING */
static inline int
can_calc_bittiming(const struct net_device *dev, struct can_bittiming *bt,
@@ -148,7 +148,7 @@ can_calc_bittiming(const struct net_device *dev, struct can_bittiming *bt,
static inline void
can_calc_tdco(struct can_tdc *tdc, const struct can_tdc_const *tdc_const,
const struct can_bittiming *dbt,
- u32 *ctrlmode, u32 ctrlmode_supported)
+ u32 tdc_mask, u32 *ctrlmode, u32 ctrlmode_supported)
{
}
#endif /* CONFIG_CAN_CALC_BITTIMING */
--
2.49.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH v2 19/20] can: dev: add can_get_ctrlmode_str()
2025-09-10 6:03 [PATCH v2 00/20] can: netlink: preparation before introduction of CAN XL step 2/2 Vincent Mailhol
` (17 preceding siblings ...)
2025-09-10 6:03 ` [PATCH v2 18/20] can: calc_bittiming: make can_calc_tdco() " Vincent Mailhol
@ 2025-09-10 6:03 ` Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 20/20] can: netlink: add userland error messages Vincent Mailhol
19 siblings, 0 replies; 32+ messages in thread
From: Vincent Mailhol @ 2025-09-10 6:03 UTC (permalink / raw)
To: Marc Kleine-Budde, Oliver Hartkopp
Cc: Vincent Mailhol, Stéphane Grosjean, Robert Nawrath, Minh Le,
Duy Nguyen, linux-can, linux-kernel
In an effort to give more human readable messages when errors occur
because of conflicting options, it can be useful to convert the CAN
control mode flags into text.
Add a function which converts the first set CAN control mode into a
human readable string. The reason to only convert the first one is to
simplify edge cases: imagine that there are several invalid control
modes, we would just return the first invalid one to the user, thus
not having to handle complex string concatenation. The user can then
solve the first problem, call the netlink interface again and see the
next issue.
People who wish to enumerate all the control modes can still do so by,
for example, using this new function in a for_each_set_bit() loop.
Signed-off-by: Vincent Mailhol <mailhol@kernel.org>
---
drivers/net/can/dev/dev.c | 33 +++++++++++++++++++++++++++++++++
include/linux/can/dev.h | 2 ++
2 files changed, 35 insertions(+)
diff --git a/drivers/net/can/dev/dev.c b/drivers/net/can/dev/dev.c
index 3913971125de0ab16b4ad9f36712954141014ddf..d9368ca828fffbda45a19af78e4f8271acfba6c4 100644
--- a/drivers/net/can/dev/dev.c
+++ b/drivers/net/can/dev/dev.c
@@ -88,6 +88,39 @@ const char *can_get_state_str(const enum can_state state)
}
EXPORT_SYMBOL_GPL(can_get_state_str);
+const char *can_get_ctrlmode_str(u32 ctrlmode)
+{
+ switch (ctrlmode & ~(ctrlmode - 1)) {
+ case 0:
+ return "none";
+ case CAN_CTRLMODE_LOOPBACK:
+ return "loopback";
+ case CAN_CTRLMODE_LISTENONLY:
+ return "listen-only";
+ case CAN_CTRLMODE_3_SAMPLES:
+ return "triple-sampling";
+ case CAN_CTRLMODE_ONE_SHOT:
+ return "one-shot";
+ case CAN_CTRLMODE_BERR_REPORTING:
+ return "berr-reporting";
+ case CAN_CTRLMODE_FD:
+ return "fd";
+ case CAN_CTRLMODE_PRESUME_ACK:
+ return "presume-ack";
+ case CAN_CTRLMODE_FD_NON_ISO:
+ return "fd-non-iso";
+ case CAN_CTRLMODE_CC_LEN8_DLC:
+ return "cc-len8-dlc";
+ case CAN_CTRLMODE_TDC_AUTO:
+ return "fd-tdc-auto";
+ case CAN_CTRLMODE_TDC_MANUAL:
+ return "fd-tdc-manual";
+ default:
+ return "<unknown>";
+ }
+}
+EXPORT_SYMBOL_GPL(can_get_ctrlmode_str);
+
static enum can_state can_state_err_to_state(u16 err)
{
if (err < CAN_ERROR_WARNING_THRESHOLD)
diff --git a/include/linux/can/dev.h b/include/linux/can/dev.h
index 55aaadaacf68f940fa1b71f7c438e68b84080292..27690a8bea44d334bf1ac8f779ae36189e0e1493 100644
--- a/include/linux/can/dev.h
+++ b/include/linux/can/dev.h
@@ -159,6 +159,8 @@ int can_restart_now(struct net_device *dev);
void can_bus_off(struct net_device *dev);
const char *can_get_state_str(const enum can_state state);
+const char *can_get_ctrlmode_str(u32 ctrlmode);
+
void can_state_get_by_berr_counter(const struct net_device *dev,
const struct can_berr_counter *bec,
enum can_state *tx_state,
--
2.49.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH v2 20/20] can: netlink: add userland error messages
2025-09-10 6:03 [PATCH v2 00/20] can: netlink: preparation before introduction of CAN XL step 2/2 Vincent Mailhol
` (18 preceding siblings ...)
2025-09-10 6:03 ` [PATCH v2 19/20] can: dev: add can_get_ctrlmode_str() Vincent Mailhol
@ 2025-09-10 6:03 ` Vincent Mailhol
19 siblings, 0 replies; 32+ messages in thread
From: Vincent Mailhol @ 2025-09-10 6:03 UTC (permalink / raw)
To: Marc Kleine-Budde, Oliver Hartkopp
Cc: Vincent Mailhol, Stéphane Grosjean, Robert Nawrath, Minh Le,
Duy Nguyen, linux-can, linux-kernel
Use NL_SET_ERR_MSG() and NL_SET_ERR_MSG_FMT() to return meaningful
error messages to the userland whenever a -EOPNOTSUPP error is
returned due to a failed validation of the CAN netlink arguments.
Signed-off-by: Vincent Mailhol <mailhol@kernel.org>
---
drivers/net/can/dev/netlink.c | 82 ++++++++++++++++++++++++++++++++-----------
1 file changed, 62 insertions(+), 20 deletions(-)
diff --git a/drivers/net/can/dev/netlink.c b/drivers/net/can/dev/netlink.c
index 48a74808dbc881d1d46ff7d03d347ddb8af3d16c..d4f13701e719ca52e41188c7e6d989d00bc70073 100644
--- a/drivers/net/can/dev/netlink.c
+++ b/drivers/net/can/dev/netlink.c
@@ -63,15 +63,23 @@ static int can_validate_tdc(struct nlattr *data_tdc,
bool tdc_auto = tdc_flags & CAN_CTRLMODE_TDC_AUTO_MASK;
int err;
- /* CAN_CTRLMODE_TDC_{AUTO,MANUAL} are mutually exclusive */
- if (tdc_auto && tdc_manual)
+ if (tdc_auto && tdc_manual) {
+ NL_SET_ERR_MSG(extack,
+ "TDC manual and auto modes are mutually exclusive");
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) != !!data_tdc)
+ if ((tdc_auto || tdc_manual) && !data_tdc) {
+ NL_SET_ERR_MSG(extack, "TDC parameters are missing");
return -EOPNOTSUPP;
+ }
+ if (!(tdc_auto || tdc_manual) && data_tdc) {
+ NL_SET_ERR_MSG(extack, "TDC mode (auto or manual) is missing");
+ return -EOPNOTSUPP;
+ }
/* If providing TDC parameters, at least TDCO is needed. TDCV
* is needed if and only if CAN_CTRLMODE_TDC_MANUAL is set
@@ -85,15 +93,23 @@ static int can_validate_tdc(struct nlattr *data_tdc,
return err;
if (tb_tdc[IFLA_CAN_TDC_TDCV]) {
- if (tdc_auto)
+ if (tdc_auto) {
+ NL_SET_ERR_MSG(extack,
+ "TDCV is incompatible with TDC auto mode");
return -EOPNOTSUPP;
+ }
} else {
- if (tdc_manual)
+ if (tdc_manual) {
+ NL_SET_ERR_MSG(extack,
+ "TDC manual mode requires TDCV");
return -EOPNOTSUPP;
+ }
}
- if (!tb_tdc[IFLA_CAN_TDC_TDCO])
+ if (!tb_tdc[IFLA_CAN_TDC_TDCO]) {
+ NL_SET_ERR_MSG(extack, "TDCO is missing");
return -EOPNOTSUPP;
+ }
}
return 0;
@@ -104,6 +120,7 @@ static int can_validate_databittiming(struct nlattr *data[],
int ifla_can_data_bittiming, u32 flags)
{
struct nlattr *data_tdc;
+ const char *type;
u32 tdc_flags;
bool is_on;
int err;
@@ -119,18 +136,31 @@ static int can_validate_databittiming(struct nlattr *data[],
data_tdc = data[IFLA_CAN_TDC];
tdc_flags = flags & CAN_CTRLMODE_FD_TDC_MASK;
is_on = flags & CAN_CTRLMODE_FD;
+ type = "FD";
} else {
return -EOPNOTSUPP; /* Place holder for CAN XL */
}
if (is_on) {
- if (!data[IFLA_CAN_BITTIMING] || !data[ifla_can_data_bittiming])
+ if (!data[IFLA_CAN_BITTIMING] || !data[ifla_can_data_bittiming]) {
+ NL_SET_ERR_MSG_FMT(extack,
+ "Provide both nominal and %s data bittiming",
+ type);
return -EOPNOTSUPP;
- }
-
- if (data[ifla_can_data_bittiming] || data_tdc) {
- if (!is_on)
+ }
+ } else {
+ if (data[ifla_can_data_bittiming]) {
+ NL_SET_ERR_MSG_FMT(extack,
+ "%s data bittiming requires CAN %s",
+ type, type);
return -EOPNOTSUPP;
+ }
+ if (data_tdc) {
+ NL_SET_ERR_MSG_FMT(extack,
+ "%s TDC requires CAN %s",
+ type, type);
+ return -EOPNOTSUPP;
+ }
}
err = can_validate_bittiming(data, extack, ifla_can_data_bittiming);
@@ -177,8 +207,7 @@ static int can_ctrlmode_changelink(struct net_device *dev,
{
struct can_priv *priv = netdev_priv(dev);
struct can_ctrlmode *cm;
- u32 maskedflags;
- u32 ctrlstatic;
+ u32 ctrlstatic, maskedflags, notsupp, ctrlstatic_missing;
if (!data[IFLA_CAN_CTRLMODE])
return 0;
@@ -188,20 +217,28 @@ static int can_ctrlmode_changelink(struct net_device *dev,
return -EBUSY;
cm = nla_data(data[IFLA_CAN_CTRLMODE]);
- maskedflags = cm->flags & cm->mask;
ctrlstatic = can_get_static_ctrlmode(priv);
+ maskedflags = cm->flags & cm->mask;
+ notsupp = maskedflags & ~(priv->ctrlmode_supported | ctrlstatic);
+ ctrlstatic_missing = (maskedflags & ctrlstatic) ^ ctrlstatic;
- /* check whether provided bits are allowed to be passed */
- if (maskedflags & ~(priv->ctrlmode_supported | ctrlstatic))
+ if (notsupp) {
+ NL_SET_ERR_MSG_FMT(extack,
+ "requested control mode %s not supported",
+ can_get_ctrlmode_str(notsupp));
return -EOPNOTSUPP;
+ }
/* do not check for static fd-non-iso if 'fd' is disabled */
if (!(maskedflags & CAN_CTRLMODE_FD))
ctrlstatic &= ~CAN_CTRLMODE_FD_NON_ISO;
- /* make sure static options are provided by configuration */
- if ((maskedflags & ctrlstatic) != ctrlstatic)
+ if (ctrlstatic_missing) {
+ NL_SET_ERR_MSG_FMT(extack,
+ "missing required %s static control mode",
+ can_get_ctrlmode_str(ctrlstatic_missing));
return -EOPNOTSUPP;
+ }
/* If a top dependency flag is provided, reset all its dependencies */
if (cm->mask & CAN_CTRLMODE_FD)
@@ -234,8 +271,10 @@ static int can_tdc_changelink(struct data_bittiming_params *dbt_params,
const struct can_tdc_const *tdc_const = dbt_params->tdc_const;
int err;
- if (!tdc_const)
+ if (!tdc_const) {
+ NL_SET_ERR_MSG(extack, "The device does not support TDC");
return -EOPNOTSUPP;
+ }
err = nla_parse_nested(tb_tdc, IFLA_CAN_TDC_MAX, nla,
can_tdc_policy, extack);
@@ -450,8 +489,11 @@ static int can_changelink(struct net_device *dev, struct nlattr *tb[],
const unsigned int num_term = priv->termination_const_cnt;
unsigned int i;
- if (!priv->do_set_termination)
+ if (!priv->do_set_termination) {
+ NL_SET_ERR_MSG(extack,
+ "Termination is not configurable on this device");
return -EOPNOTSUPP;
+ }
/* check whether given value is supported by the interface */
for (i = 0; i < num_term; i++) {
--
2.49.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* Re: [PATCH v2 04/20] can: netlink: refactor can_validate_bittiming()
2025-09-10 6:03 ` [PATCH v2 04/20] can: netlink: refactor can_validate_bittiming() Vincent Mailhol
@ 2025-09-10 6:13 ` Marc Kleine-Budde
2025-09-10 6:43 ` Vincent Mailhol
0 siblings, 1 reply; 32+ messages in thread
From: Marc Kleine-Budde @ 2025-09-10 6:13 UTC (permalink / raw)
To: Vincent Mailhol
Cc: Oliver Hartkopp, Stéphane Grosjean, Robert Nawrath, Minh Le,
Duy Nguyen, linux-can, linux-kernel
[-- Attachment #1: Type: text/plain, Size: 763 bytes --]
On 10.09.2025 15:03:29, Vincent Mailhol wrote:
> Whenever can_validate_bittiming() is called, it is always preceded by
> some boilerplate code which was copy pasted all over the place. Move
> that repeated code directly inside can_validate_bittiming().
>
> Finally, the mempcy() is not needed. Just use the pointer returned by
> nla_data() as-is.
The memcpy()'ed struct is guaranteed to be properly aligned, is this
also the case for the casted nla_data() pointer?
regards,
Marc
--
Pengutronix e.K. | Marc Kleine-Budde |
Embedded Linux | https://www.pengutronix.de |
Vertretung Nürnberg | Phone: +49-5121-206917-129 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-9 |
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH v2 04/20] can: netlink: refactor can_validate_bittiming()
2025-09-10 6:13 ` Marc Kleine-Budde
@ 2025-09-10 6:43 ` Vincent Mailhol
2025-09-10 10:55 ` Marc Kleine-Budde
0 siblings, 1 reply; 32+ messages in thread
From: Vincent Mailhol @ 2025-09-10 6:43 UTC (permalink / raw)
To: Marc Kleine-Budde
Cc: Oliver Hartkopp, Stéphane Grosjean, Robert Nawrath, Minh Le,
Duy Nguyen, linux-can, linux-kernel
On 10/09/2025 at 15:13, Marc Kleine-Budde wrote:
> On 10.09.2025 15:03:29, Vincent Mailhol wrote:
>> Whenever can_validate_bittiming() is called, it is always preceded by
>> some boilerplate code which was copy pasted all over the place. Move
>> that repeated code directly inside can_validate_bittiming().
>>
>> Finally, the mempcy() is not needed. Just use the pointer returned by
>> nla_data() as-is.
>
> The memcpy()'ed struct is guaranteed to be properly aligned, is this
> also the case for the casted nla_data() pointer?
The NLA attributes are aligned on 4 bytes, c.f. NLA_ALIGNTO:
https://elixir.bootlin.com/linux/v6.16.5/source/include/uapi/linux/netlink.h#L248
Which is sufficient for struct can_bittiming which also requires just 4 bytes of
alignment as proven by the fact the the code would still compile if I add this
static assert:
static_assert(_Alignof(typeof(*bt)) <= NLA_ALIGNTO);
But I have to admit that you caught me off guard. I did not think of that. Maybe
I should add above static assertions to the code to document that what we are
doing is correct?
Yours sincerely,
Vincent Mailhol
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH v2 04/20] can: netlink: refactor can_validate_bittiming()
2025-09-10 6:43 ` Vincent Mailhol
@ 2025-09-10 10:55 ` Marc Kleine-Budde
2025-09-10 11:12 ` Vincent Mailhol
0 siblings, 1 reply; 32+ messages in thread
From: Marc Kleine-Budde @ 2025-09-10 10:55 UTC (permalink / raw)
To: Vincent Mailhol
Cc: Oliver Hartkopp, Stéphane Grosjean, Robert Nawrath, Minh Le,
Duy Nguyen, linux-can, linux-kernel
[-- Attachment #1: Type: text/plain, Size: 1513 bytes --]
On 10.09.2025 15:43:00, Vincent Mailhol wrote:
> On 10/09/2025 at 15:13, Marc Kleine-Budde wrote:
> > On 10.09.2025 15:03:29, Vincent Mailhol wrote:
> >> Whenever can_validate_bittiming() is called, it is always preceded by
> >> some boilerplate code which was copy pasted all over the place. Move
> >> that repeated code directly inside can_validate_bittiming().
> >>
> >> Finally, the mempcy() is not needed. Just use the pointer returned by
> >> nla_data() as-is.
> >
> > The memcpy()'ed struct is guaranteed to be properly aligned, is this
> > also the case for the casted nla_data() pointer?
>
> The NLA attributes are aligned on 4 bytes, c.f. NLA_ALIGNTO:
>
> https://elixir.bootlin.com/linux/v6.16.5/source/include/uapi/linux/netlink.h#L248
>
> Which is sufficient for struct can_bittiming which also requires just 4 bytes of
> alignment as proven by the fact the the code would still compile if I add this
> static assert:
>
> static_assert(_Alignof(typeof(*bt)) <= NLA_ALIGNTO);
>
> But I have to admit that you caught me off guard. I did not think of that. Maybe
> I should add above static assertions to the code to document that what we are
> doing is correct?
Yes, make it so!
regards,
Marc
--
Pengutronix e.K. | Marc Kleine-Budde |
Embedded Linux | https://www.pengutronix.de |
Vertretung Nürnberg | Phone: +49-5121-206917-129 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-9 |
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH v2 04/20] can: netlink: refactor can_validate_bittiming()
2025-09-10 10:55 ` Marc Kleine-Budde
@ 2025-09-10 11:12 ` Vincent Mailhol
0 siblings, 0 replies; 32+ messages in thread
From: Vincent Mailhol @ 2025-09-10 11:12 UTC (permalink / raw)
To: Marc Kleine-Budde
Cc: Oliver Hartkopp, Stéphane Grosjean, Robert Nawrath, Minh Le,
Duy Nguyen, linux-can, linux-kernel
On 10/09/2025 at 19:55, Marc Kleine-Budde wrote:
> On 10.09.2025 15:43:00, Vincent Mailhol wrote:
>> On 10/09/2025 at 15:13, Marc Kleine-Budde wrote:
>>> On 10.09.2025 15:03:29, Vincent Mailhol wrote:
>>>> Whenever can_validate_bittiming() is called, it is always preceded by
>>>> some boilerplate code which was copy pasted all over the place. Move
>>>> that repeated code directly inside can_validate_bittiming().
>>>>
>>>> Finally, the mempcy() is not needed. Just use the pointer returned by
>>>> nla_data() as-is.
>>>
>>> The memcpy()'ed struct is guaranteed to be properly aligned, is this
>>> also the case for the casted nla_data() pointer?
>>
>> The NLA attributes are aligned on 4 bytes, c.f. NLA_ALIGNTO:
>>
>> https://elixir.bootlin.com/linux/v6.16.5/source/include/uapi/linux/netlink.h#L248
>>
>> Which is sufficient for struct can_bittiming which also requires just 4 bytes of
>> alignment as proven by the fact the the code would still compile if I add this
>> static assert:
>>
>> static_assert(_Alignof(typeof(*bt)) <= NLA_ALIGNTO);
>>
>> But I have to admit that you caught me off guard. I did not think of that. Maybe
>> I should add above static assertions to the code to document that what we are
>> doing is correct?
>
> Yes, make it so!
I applied the changes locally.
Let me know when you are done with the review of the other patches. I will wait
for your other comments (if any) before sending v3.
Yours sincerely,
Vincent Mailhol
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH v2 07/20] can: netlink: refactor CAN_CTRLMODE_TDC_{AUTO,MANUAL} flag reset logic
2025-09-10 6:03 ` [PATCH v2 07/20] can: netlink: refactor CAN_CTRLMODE_TDC_{AUTO,MANUAL} flag reset logic Vincent Mailhol
@ 2025-09-20 7:24 ` Vincent Mailhol
2025-09-22 9:43 ` Marc Kleine-Budde
0 siblings, 1 reply; 32+ messages in thread
From: Vincent Mailhol @ 2025-09-20 7:24 UTC (permalink / raw)
To: Marc Kleine-Budde, Oliver Hartkopp
Cc: Stéphane Grosjean, Robert Nawrath, Minh Le, Duy Nguyen,
linux-can, linux-kernel
On 10/09/2025 at 15:03, Vincent Mailhol wrote:
> CAN_CTRLMODE_TDC_AUTO and CAN_CTRLMODE_TDC_MANUAL are mutually
> exclusive. This means that whenever the user switches from auto to
> manual mode (or vice versa), the other flag which was set previously
> needs to be cleared.
>
> Currently, this is handled with a masking operation. It can be done in
> a simpler manner by clearing any of the previous TDC flags before
> copying netlink attributes. The code becomes easier to understand and
> will make it easier to add the new upcoming CAN XL flags which will
> have a similar reset logic as the current TDC flags.
>
> Signed-off-by: Vincent Mailhol <mailhol@kernel.org>
> ---
> drivers/net/can/dev/netlink.c | 9 ++++-----
> 1 file changed, 4 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/net/can/dev/netlink.c b/drivers/net/can/dev/netlink.c
> index 274eaab10796b601d565c32f6315727a578970bb..72a82d4e9d6494771320ea035ed6f6098c0e8ce6 100644
> --- a/drivers/net/can/dev/netlink.c
> +++ b/drivers/net/can/dev/netlink.c
> @@ -254,6 +254,10 @@ static int can_changelink(struct net_device *dev, struct nlattr *tb[],
> if ((maskedflags & ctrlstatic) != ctrlstatic)
> 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;
^
This is a bug. The correct operation to unset the flag is:
priv->ctrlmode &= ~CAN_CTRLMODE_FD_TDC_MASK;
(replace the ! operator by ~).
@Marc, do you think you can send your next PR to net soonish?
I would like to rebase this series and the "rework the CAN MTU logic" series on
top of the MTU fix:
https://lore.kernel.org/linux-can/20250918-can-fix-mtu-v1-0-0d1cada9393b@kernel.org/
But to do so, I first need to wait for the MTU fix to appear on net-next and
there is not so much time left before the end of the development windows.
If the schedule is too short, let me know and I will adjust accordingly by
dropping whatever patches are in conflict.
Yours sincerely,
Vincent Mailhol
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH v2 07/20] can: netlink: refactor CAN_CTRLMODE_TDC_{AUTO,MANUAL} flag reset logic
2025-09-20 7:24 ` Vincent Mailhol
@ 2025-09-22 9:43 ` Marc Kleine-Budde
2025-09-22 11:14 ` Vincent Mailhol
0 siblings, 1 reply; 32+ messages in thread
From: Marc Kleine-Budde @ 2025-09-22 9:43 UTC (permalink / raw)
To: Vincent Mailhol
Cc: Oliver Hartkopp, Stéphane Grosjean, Robert Nawrath, Minh Le,
Duy Nguyen, linux-can, linux-kernel
[-- Attachment #1: Type: text/plain, Size: 2708 bytes --]
On 20.09.2025 16:24:42, Vincent Mailhol wrote:
> On 10/09/2025 at 15:03, Vincent Mailhol wrote:
> > CAN_CTRLMODE_TDC_AUTO and CAN_CTRLMODE_TDC_MANUAL are mutually
> > exclusive. This means that whenever the user switches from auto to
> > manual mode (or vice versa), the other flag which was set previously
> > needs to be cleared.
> >
> > Currently, this is handled with a masking operation. It can be done in
> > a simpler manner by clearing any of the previous TDC flags before
> > copying netlink attributes. The code becomes easier to understand and
> > will make it easier to add the new upcoming CAN XL flags which will
> > have a similar reset logic as the current TDC flags.
> >
> > Signed-off-by: Vincent Mailhol <mailhol@kernel.org>
> > ---
> > drivers/net/can/dev/netlink.c | 9 ++++-----
> > 1 file changed, 4 insertions(+), 5 deletions(-)
> >
> > diff --git a/drivers/net/can/dev/netlink.c b/drivers/net/can/dev/netlink.c
> > index 274eaab10796b601d565c32f6315727a578970bb..72a82d4e9d6494771320ea035ed6f6098c0e8ce6 100644
> > --- a/drivers/net/can/dev/netlink.c
> > +++ b/drivers/net/can/dev/netlink.c
> > @@ -254,6 +254,10 @@ static int can_changelink(struct net_device *dev, struct nlattr *tb[],
> > if ((maskedflags & ctrlstatic) != ctrlstatic)
> > 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;
> ^
>
> This is a bug. The correct operation to unset the flag is:
>
> priv->ctrlmode &= ~CAN_CTRLMODE_FD_TDC_MASK;
>
> (replace the ! operator by ~).
>
> @Marc, do you think you can send your next PR to net soonish?
>
> I would like to rebase this series and the "rework the CAN MTU logic" series on
> top of the MTU fix:
>
> https://lore.kernel.org/linux-can/20250918-can-fix-mtu-v1-0-0d1cada9393b@kernel.org/
>
> But to do so, I first need to wait for the MTU fix to appear on net-next and
> there is not so much time left before the end of the development windows.
This series looks fine to me. After -rc1, please check for any
ndo_change_mtu, because the Nuvoton CAN-FD driver will go mainline, but
not via the net-next tree.
> If the schedule is too short, let me know and I will adjust accordingly by
> dropping whatever patches are in conflict.
Marc
--
Pengutronix e.K. | Marc Kleine-Budde |
Embedded Linux | https://www.pengutronix.de |
Vertretung Nürnberg | Phone: +49-5121-206917-129 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-9 |
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH v2 07/20] can: netlink: refactor CAN_CTRLMODE_TDC_{AUTO,MANUAL} flag reset logic
2025-09-22 9:43 ` Marc Kleine-Budde
@ 2025-09-22 11:14 ` Vincent Mailhol
2025-09-22 13:06 ` Marc Kleine-Budde
0 siblings, 1 reply; 32+ messages in thread
From: Vincent Mailhol @ 2025-09-22 11:14 UTC (permalink / raw)
To: Marc Kleine-Budde
Cc: Oliver Hartkopp, Stéphane Grosjean, Robert Nawrath, Minh Le,
Duy Nguyen, linux-can, linux-kernel
On 22/09/2025 at 18:43, Marc Kleine-Budde wrote:
> On 20.09.2025 16:24:42, Vincent Mailhol wrote:
(...)
>> @Marc, do you think you can send your next PR to net soonish?
>>
>> I would like to rebase this series and the "rework the CAN MTU logic" series on
>> top of the MTU fix:
>>
>> https://lore.kernel.org/linux-can/20250918-can-fix-mtu-v1-0-0d1cada9393b@kernel.org/
>>
>> But to do so, I first need to wait for the MTU fix to appear on net-next and
>> there is not so much time left before the end of the development windows.
>
> This series looks fine to me. After -rc1, please check for any
> ndo_change_mtu, because the Nuvoton CAN-FD driver will go mainline, but
> not via the net-next tree.
Thanks for the head-up!
At the moment, that driver is in Lee's tree, so I was thinking of directly
preparing the fix patch and sending it to the netdev team and Lee so that both
are aware of the upcoming conflict.
I will resend my two series in the next few days as soon as the MTU fix appears
in net-next.
Yours sincerely,
Vincent Mailhol
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH v2 07/20] can: netlink: refactor CAN_CTRLMODE_TDC_{AUTO,MANUAL} flag reset logic
2025-09-22 11:14 ` Vincent Mailhol
@ 2025-09-22 13:06 ` Marc Kleine-Budde
2025-09-23 7:04 ` Vincent Mailhol
0 siblings, 1 reply; 32+ messages in thread
From: Marc Kleine-Budde @ 2025-09-22 13:06 UTC (permalink / raw)
To: Vincent Mailhol
Cc: Oliver Hartkopp, Stéphane Grosjean, Robert Nawrath, Minh Le,
Duy Nguyen, linux-can, linux-kernel
[-- Attachment #1: Type: text/plain, Size: 1600 bytes --]
On 22.09.2025 20:14:16, Vincent Mailhol wrote:
> On 22/09/2025 at 18:43, Marc Kleine-Budde wrote:
> > On 20.09.2025 16:24:42, Vincent Mailhol wrote:
>
> (...)
>
> >> @Marc, do you think you can send your next PR to net soonish?
> >>
> >> I would like to rebase this series and the "rework the CAN MTU logic" series on
> >> top of the MTU fix:
> >>
> >> https://lore.kernel.org/linux-can/20250918-can-fix-mtu-v1-0-0d1cada9393b@kernel.org/
> >>
> >> But to do so, I first need to wait for the MTU fix to appear on net-next and
> >> there is not so much time left before the end of the development windows.
> >
> > This series looks fine to me. After -rc1, please check for any
> > ndo_change_mtu, because the Nuvoton CAN-FD driver will go mainline, but
> > not via the net-next tree.
>
> Thanks for the head-up!
>
> At the moment, that driver is in Lee's tree, so I was thinking of directly
> preparing the fix patch and sending it to the netdev team and Lee so that both
> are aware of the upcoming conflict.
>
> I will resend my two series in the next few days as soon as the MTU fix appears
> in net-next.
I don't know how much time we have between the merge of net into
net-next and the acceptance of the last PR by the network team for the
next merge window. We will see.
regards,
Marc
--
Pengutronix e.K. | Marc Kleine-Budde |
Embedded Linux | https://www.pengutronix.de |
Vertretung Nürnberg | Phone: +49-5121-206917-129 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-9 |
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH v2 07/20] can: netlink: refactor CAN_CTRLMODE_TDC_{AUTO,MANUAL} flag reset logic
2025-09-22 13:06 ` Marc Kleine-Budde
@ 2025-09-23 7:04 ` Vincent Mailhol
2025-09-23 9:08 ` Marc Kleine-Budde
0 siblings, 1 reply; 32+ messages in thread
From: Vincent Mailhol @ 2025-09-23 7:04 UTC (permalink / raw)
To: Marc Kleine-Budde
Cc: Oliver Hartkopp, Stéphane Grosjean, Robert Nawrath, Minh Le,
Duy Nguyen, linux-can, linux-kernel
On 22/09/2025 at 22:06, Marc Kleine-Budde a écrit :
> On 22.09.2025 20:14:16, Vincent Mailhol wrote:
(...)
>> I will resend my two series in the next few days as soon as the MTU fix appears
>> in net-next.
>
> I don't know how much time we have between the merge of net into
> net-next and the acceptance of the last PR by the network team for the
> next merge window. We will see.
With the pull request to net/main being delayed, I decided to finally remove the
patch which was in conflict and send the rest:
https://lore.kernel.org/linux-can/20250923-can-fix-mtu-v3-0-581bde113f52@kernel.org/
and:
https://lore.kernel.org/linux-can/20250923-canxl-netlink-prep-v4-0-e720d28f66fe@kernel.org/
These are my last two series for this development window (to be applied in order).
Also, sorry for the noise when sending those twice.
Yours sincerely,
Vincent Mailhol
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH v2 07/20] can: netlink: refactor CAN_CTRLMODE_TDC_{AUTO,MANUAL} flag reset logic
2025-09-23 7:04 ` Vincent Mailhol
@ 2025-09-23 9:08 ` Marc Kleine-Budde
2025-09-23 9:36 ` Vincent Mailhol
0 siblings, 1 reply; 32+ messages in thread
From: Marc Kleine-Budde @ 2025-09-23 9:08 UTC (permalink / raw)
To: Vincent Mailhol
Cc: Oliver Hartkopp, Stéphane Grosjean, Robert Nawrath, Minh Le,
Duy Nguyen, linux-can, linux-kernel
[-- Attachment #1: Type: text/plain, Size: 1483 bytes --]
On 23.09.2025 16:04:41, Vincent Mailhol wrote:
> >> I will resend my two series in the next few days as soon as the MTU fix appears
> >> in net-next.
> >
> > I don't know how much time we have between the merge of net into
> > net-next and the acceptance of the last PR by the network team for the
> > next merge window. We will see.
>
> With the pull request to net/main being delayed, I decided to finally remove the
> patch which was in conflict and send the rest:
>
> https://lore.kernel.org/linux-can/20250923-can-fix-mtu-v3-0-581bde113f52@kernel.org/
>
> and:
>
> https://lore.kernel.org/linux-can/20250923-canxl-netlink-prep-v4-0-e720d28f66fe@kernel.org/
>
> These are my last two series for this development window (to be applied in order).
>
> Also, sorry for the noise when sending those twice.
I've merged both series to linux-can-next. Thanks. b4 was a bit
confused, it took the canxl-netlink-prep when asked to merge the
can-fix-mtu series and it added the prerequisite patches when merging
canxl-netlink-prep on top of can-fix-mtu.
My next net-next PR is prepared as linux-can-next-for-6.18-20250923. Can
you check if I took the correct patches?
regards,
Marc
--
Pengutronix e.K. | Marc Kleine-Budde |
Embedded Linux | https://www.pengutronix.de |
Vertretung Nürnberg | Phone: +49-5121-206917-129 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-9 |
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH v2 07/20] can: netlink: refactor CAN_CTRLMODE_TDC_{AUTO,MANUAL} flag reset logic
2025-09-23 9:08 ` Marc Kleine-Budde
@ 2025-09-23 9:36 ` Vincent Mailhol
0 siblings, 0 replies; 32+ messages in thread
From: Vincent Mailhol @ 2025-09-23 9:36 UTC (permalink / raw)
To: Marc Kleine-Budde
Cc: Oliver Hartkopp, Stéphane Grosjean, Robert Nawrath, Minh Le,
Duy Nguyen, linux-can, linux-kernel
On 23/09/2025 at 18:08, Marc Kleine-Budde wrote:
> On 23.09.2025 16:04:41, Vincent Mailhol wrote:
>>>> I will resend my two series in the next few days as soon as the MTU fix appears
>>>> in net-next.
>>>
>>> I don't know how much time we have between the merge of net into
>>> net-next and the acceptance of the last PR by the network team for the
>>> next merge window. We will see.
>>
>> With the pull request to net/main being delayed, I decided to finally remove the
>> patch which was in conflict and send the rest:
>>
>> https://lore.kernel.org/linux-can/20250923-can-fix-mtu-v3-0-581bde113f52@kernel.org/
>>
>> and:
>>
>> https://lore.kernel.org/linux-can/20250923-canxl-netlink-prep-v4-0-e720d28f66fe@kernel.org/
>>
>> These are my last two series for this development window (to be applied in order).
>>
>> Also, sorry for the noise when sending those twice.
>
> I've merged both series to linux-can-next. Thanks. b4 was a bit
> confused, it took the canxl-netlink-prep when asked to merge the
> can-fix-mtu series and it added the prerequisite patches when merging
> canxl-netlink-prep on top of can-fix-mtu.
Yeh, I also had a lot of trouble on my side as you could see. This is the first
time I deal with such a complex series, at least, I am happy it is now merge.
> My next net-next PR is prepared as linux-can-next-for-6.18-20250923. Can
> you check if I took the correct patches?
I just checked, everything is there and my WIP CAN XL patches rebase nicely on
top. All good, thanks!
Yours sincerely,
Vincent Mailhol
^ permalink raw reply [flat|nested] 32+ messages in thread
end of thread, other threads:[~2025-09-23 9:36 UTC | newest]
Thread overview: 32+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-10 6:03 [PATCH v2 00/20] can: netlink: preparation before introduction of CAN XL step 2/2 Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 01/20] can: dev: move struct data_bittiming_params to linux/can/bittiming.h Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 02/20] can: dev: make can_get_relative_tdco() FD agnostic and move it to bittiming.h Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 03/20] can: netlink: document which symbols are FD specific Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 04/20] can: netlink: refactor can_validate_bittiming() Vincent Mailhol
2025-09-10 6:13 ` Marc Kleine-Budde
2025-09-10 6:43 ` Vincent Mailhol
2025-09-10 10:55 ` Marc Kleine-Budde
2025-09-10 11:12 ` Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 05/20] can: netlink: add can_validate_tdc() Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 06/20] can: netlink: add can_validate_databittiming() Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 07/20] can: netlink: refactor CAN_CTRLMODE_TDC_{AUTO,MANUAL} flag reset logic Vincent Mailhol
2025-09-20 7:24 ` Vincent Mailhol
2025-09-22 9:43 ` Marc Kleine-Budde
2025-09-22 11:14 ` Vincent Mailhol
2025-09-22 13:06 ` Marc Kleine-Budde
2025-09-23 7:04 ` Vincent Mailhol
2025-09-23 9:08 ` Marc Kleine-Budde
2025-09-23 9:36 ` Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 08/20] can: netlink: remove useless check in can_tdc_changelink() Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 09/20] can: netlink: make can_tdc_changelink() FD agnostic Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 10/20] can: netlink: add can_dtb_changelink() Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 11/20] can: netlink: add can_ctrlmode_changelink() Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 12/20] can: netlink: make can_tdc_get_size() FD agnostic Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 13/20] can: netlink: add can_data_bittiming_get_size() Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 14/20] can: netlink: add can_bittiming_fill_info() Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 15/20] can: netlink: add can_bittiming_const_fill_info() Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 16/20] can: netlink: add can_bitrate_const_fill_info() Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 17/20] can: netlink: make can_tdc_fill_info() FD agnostic Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 18/20] can: calc_bittiming: make can_calc_tdco() " Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 19/20] can: dev: add can_get_ctrlmode_str() Vincent Mailhol
2025-09-10 6:03 ` [PATCH v2 20/20] can: netlink: add userland error messages Vincent Mailhol
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).