From fd1441f5b5f1ac172ac4a2fa9c06850c2d268316 Mon Sep 17 00:00:00 2001 From: William Tang Date: Fri, 21 Nov 2025 18:27:48 +0800 Subject: [PATCH] drivers: can: mcux: flexcan: fix prop_seg for enhanced bit timing Move the FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG conditional logic from the general timing configuration to only apply within the CAN FD specific sections. This ensures that for classic CAN mode, prop_seg is always decremented by 1 regardless of the enhanced bit timing register feature. The previous implementation incorrectly applied the enhanced bit timing logic to classic CAN mode, which could cause timing misconfiguration on devices with enhanced bit timing register support when operating in classic CAN mode. Fixes #99746 Signed-off-by: William Tang --- drivers/can/can_mcux_flexcan.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/drivers/can/can_mcux_flexcan.c b/drivers/can/can_mcux_flexcan.c index 7a6c72e3eb3d0..0b7fecd2ccbd8 100644 --- a/drivers/can/can_mcux_flexcan.c +++ b/drivers/can/can_mcux_flexcan.c @@ -309,17 +309,18 @@ static int mcux_flexcan_start(const struct device *dev) timing.rJumpwidth = data->timing.sjw - 1U; timing.phaseSeg1 = data->timing.phase_seg1 - 1U; timing.phaseSeg2 = data->timing.phase_seg2 - 1U; -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) && \ - FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) - /* No propagation segment configuration, so prop_seg must be 0 */ - timing.propSeg = data->timing.prop_seg; -#else timing.propSeg = data->timing.prop_seg - 1U; -#endif FLEXCAN_SetTimingConfig(base, &timing); #ifdef CONFIG_CAN_MCUX_FLEXCAN_FD if (config->flexcan_fd) { +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) && \ + FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) + /* No propagation segment configuration, so prop_seg must be 0 */ + timing.propSeg = data->timing.prop_seg; + /* Reconfigure arbitration phase timing with prop_seg = 0 */ + FLEXCAN_SetTimingConfig(base, &timing); +#endif timing.fpreDivider = data->timing_data.prescaler - 1U; timing.frJumpwidth = data->timing_data.sjw - 1U; timing.fphaseSeg1 = data->timing_data.phase_seg1 - 1U; @@ -1262,13 +1263,7 @@ static int mcux_flexcan_init(const struct device *dev) flexcan_config.enableListenOnlyMode = true; flexcan_config.timingConfig.rJumpwidth = data->timing.sjw - 1U; -#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) && \ - FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) - /* No propagation segment configuration, so prop_seg must be 0 */ - flexcan_config.timingConfig.propSeg = data->timing.prop_seg; -#else flexcan_config.timingConfig.propSeg = data->timing.prop_seg - 1U; -#endif flexcan_config.timingConfig.phaseSeg1 = data->timing.phase_seg1 - 1U; flexcan_config.timingConfig.phaseSeg2 = data->timing.phase_seg2 - 1U; @@ -1276,6 +1271,11 @@ static int mcux_flexcan_init(const struct device *dev) #ifdef CONFIG_CAN_MCUX_FLEXCAN_FD if (config->flexcan_fd) { +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) && \ + FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) + /* No propagation segment configuration, so prop_seg must be 0 */ + flexcan_config.timingConfig.propSeg = data->timing.prop_seg; +#endif flexcan_config.timingConfig.frJumpwidth = data->timing_data.sjw - 1U; flexcan_config.timingConfig.fpropSeg = data->timing_data.prop_seg; flexcan_config.timingConfig.fphaseSeg1 = data->timing_data.phase_seg1 - 1U;