diff --git a/drivers/can/can_common.c b/drivers/can/can_common.c index 21df3a3b55e..cb2e7c3ebcd 100644 --- a/drivers/can/can_common.c +++ b/drivers/can/can_common.c @@ -351,10 +351,13 @@ int z_impl_can_set_timing(const struct device *dev, int z_impl_can_set_bitrate(const struct device *dev, uint32_t bitrate) { struct can_timing timing = { 0 }; + uint32_t min_bitrate; uint32_t max_bitrate; uint16_t sample_pnt; int ret; + (void)can_get_min_bitrate(dev, &min_bitrate); + ret = can_get_max_bitrate(dev, &max_bitrate); if (ret == -ENOSYS) { /* Maximum bitrate unknown */ @@ -363,7 +366,7 @@ int z_impl_can_set_bitrate(const struct device *dev, uint32_t bitrate) return ret; } - if ((max_bitrate > 0) && (bitrate > max_bitrate)) { + if ((bitrate < min_bitrate) || (((max_bitrate > 0) && (bitrate > max_bitrate)))) { return -ENOTSUP; } @@ -404,10 +407,13 @@ int z_impl_can_set_timing_data(const struct device *dev, int z_impl_can_set_bitrate_data(const struct device *dev, uint32_t bitrate_data) { struct can_timing timing_data = { 0 }; + uint32_t min_bitrate; uint32_t max_bitrate; uint16_t sample_pnt; int ret; + (void)can_get_min_bitrate(dev, &min_bitrate); + ret = can_get_max_bitrate(dev, &max_bitrate); if (ret == -ENOSYS) { /* Maximum bitrate unknown */ @@ -416,7 +422,7 @@ int z_impl_can_set_bitrate_data(const struct device *dev, uint32_t bitrate_data) return ret; } - if ((max_bitrate > 0) && (bitrate_data > max_bitrate)) { + if ((bitrate_data < min_bitrate) || ((max_bitrate > 0) && (bitrate_data > max_bitrate))) { return -ENOTSUP; }