This is an automated email from the ASF dual-hosted git repository. xiaoxiang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push: new dd53c34722 net/netdev: Change SIOCSCANBITRATE to require interface down. dd53c34722 is described below commit dd53c34722dba37e6e23262b64f57920425883d0 Author: Carlos Sanchez <carlossanc...@geotab.com> AuthorDate: Mon Apr 14 11:29:10 2025 +0200 net/netdev: Change SIOCSCANBITRATE to require interface down. Previously, SIOCSCANBITRATE brought the iterface up to ensure changes where immediately applied. This was confusing, see https://lists.apache.org/thread/g8d0m6yp7noywhroby5br4hxt3r4og2c Now SIOCSCANBITRATE fails is interface is up. All existing SocketCAN drivers updated. Signed-off-by: Carlos Sanchez <carlossanc...@geotab.com> --- arch/arm/src/imx9/imx9_flexcan.c | 4 +--- arch/arm/src/imxrt/imxrt_flexcan.c | 4 +--- arch/arm/src/kinetis/kinetis_flexcan.c | 3 +-- arch/arm/src/s32k1xx/s32k1xx_flexcan.c | 3 +-- arch/arm/src/s32k3xx/s32k3xx_flexcan.c | 3 +-- arch/arm/src/stm32h7/stm32_fdcan_sock.c | 11 ++--------- arch/arm64/src/imx9/imx9_flexcan.c | 4 +--- net/netdev/netdev_ioctl.c | 12 +++++++++++- 8 files changed, 19 insertions(+), 25 deletions(-) diff --git a/arch/arm/src/imx9/imx9_flexcan.c b/arch/arm/src/imx9/imx9_flexcan.c index 1925d4e15e..9c5146eadf 100644 --- a/arch/arm/src/imx9/imx9_flexcan.c +++ b/arch/arm/src/imx9/imx9_flexcan.c @@ -1601,15 +1601,13 @@ static int imx9_ioctl(struct net_driver_s *dev, int cmd, if (ret == OK) { - /* Reset CAN controller and start with new timings */ + /* Apply the new timings (interface is guaranteed to be down) */ priv->arbi_timing = arbi_timing; if (priv->canfd_capable) { priv->data_timing = data_timing; } - - imx9_ifup(dev); } } break; diff --git a/arch/arm/src/imxrt/imxrt_flexcan.c b/arch/arm/src/imxrt/imxrt_flexcan.c index 32203af992..bd7a230dca 100644 --- a/arch/arm/src/imxrt/imxrt_flexcan.c +++ b/arch/arm/src/imxrt/imxrt_flexcan.c @@ -1569,15 +1569,13 @@ static int imxrt_ioctl(struct net_driver_s *dev, int cmd, if (ret == OK) { - /* Reset CAN controller and start with new timings */ + /* Apply the new timings (interface is guaranteed to be down) */ priv->arbi_timing = arbi_timing; if (priv->canfd_capable) { priv->data_timing = data_timing; } - - imxrt_ifup(dev); } } break; diff --git a/arch/arm/src/kinetis/kinetis_flexcan.c b/arch/arm/src/kinetis/kinetis_flexcan.c index 43592e8fc0..a1a824b217 100644 --- a/arch/arm/src/kinetis/kinetis_flexcan.c +++ b/arch/arm/src/kinetis/kinetis_flexcan.c @@ -1533,13 +1533,12 @@ static int kinetis_ioctl(struct net_driver_s *dev, int cmd, if (ret == OK) { - /* Reset CAN controller and start with new timings */ + /* Apply the new timings (interface is guaranteed to be down) */ priv->arbi_timing = arbi_timing; #ifdef CONFIG_NET_CAN_CANFD priv->data_timing = data_timing; #endif - kinetis_ifup(dev); } } break; diff --git a/arch/arm/src/s32k1xx/s32k1xx_flexcan.c b/arch/arm/src/s32k1xx/s32k1xx_flexcan.c index 63b6f10300..aa998eca3b 100644 --- a/arch/arm/src/s32k1xx/s32k1xx_flexcan.c +++ b/arch/arm/src/s32k1xx/s32k1xx_flexcan.c @@ -1516,13 +1516,12 @@ static int s32k1xx_ioctl(struct net_driver_s *dev, int cmd, if (ret == OK) { - /* Reset CAN controller and start with new timings */ + /* Apply the new timings (interface is guaranteed to be down) */ priv->arbi_timing = arbi_timing; #ifdef CONFIG_NET_CAN_CANFD priv->data_timing = data_timing; #endif - s32k1xx_ifup(dev); } } break; diff --git a/arch/arm/src/s32k3xx/s32k3xx_flexcan.c b/arch/arm/src/s32k3xx/s32k3xx_flexcan.c index 3cc2f68cec..a5472a1339 100644 --- a/arch/arm/src/s32k3xx/s32k3xx_flexcan.c +++ b/arch/arm/src/s32k3xx/s32k3xx_flexcan.c @@ -1707,13 +1707,12 @@ static int s32k3xx_ioctl(struct net_driver_s *dev, int cmd, if (ret == OK) { - /* Reset CAN controller and start with new timings */ + /* Apply the new timings (interface is guaranteed to be down) */ priv->arbi_timing = arbi_timing; #ifdef CONFIG_NET_CAN_CANFD priv->data_timing = data_timing; #endif - s32k3xx_ifup(dev); } } break; diff --git a/arch/arm/src/stm32h7/stm32_fdcan_sock.c b/arch/arm/src/stm32h7/stm32_fdcan_sock.c index af9de4013a..bc868150eb 100644 --- a/arch/arm/src/stm32h7/stm32_fdcan_sock.c +++ b/arch/arm/src/stm32h7/stm32_fdcan_sock.c @@ -1966,19 +1966,12 @@ static int fdcan_netdev_ioctl(struct net_driver_s *dev, int cmd, struct can_ioctl_data_s *req = (struct can_ioctl_data_s *)((uintptr_t)arg); + /* Apply the new timings (interface is guaranteed to be down) */ + priv->arbi_timing.bitrate = req->arbi_bitrate * 1000; #ifdef CONFIG_NET_CAN_CANFD priv->data_timing.bitrate = req->data_bitrate * 1000; #endif - - /* Reset CAN controller and start with new timings */ - - ret = fdcan_initialize(priv); - - if (ret == OK) - { - ret = fdcan_ifup(dev); - } } break; #endif /* CONFIG_NETDEV_CAN_BITRATE_IOCTL */ diff --git a/arch/arm64/src/imx9/imx9_flexcan.c b/arch/arm64/src/imx9/imx9_flexcan.c index 2e30a58c29..7f22b699b6 100644 --- a/arch/arm64/src/imx9/imx9_flexcan.c +++ b/arch/arm64/src/imx9/imx9_flexcan.c @@ -1634,15 +1634,13 @@ static int imx9_ioctl(struct net_driver_s *dev, int cmd, if (ret == OK) { - /* Reset CAN controller and start with new timings */ + /* Apply the new timings (interface is guaranteed to be down) */ priv->arbi_timing = arbi_timing; if (priv->canfd_capable) { priv->data_timing = data_timing; } - - imx9_ifup(dev); } } break; diff --git a/net/netdev/netdev_ioctl.c b/net/netdev/netdev_ioctl.c index e754be749d..d4ab1a956a 100644 --- a/net/netdev/netdev_ioctl.c +++ b/net/netdev/netdev_ioctl.c @@ -1176,8 +1176,18 @@ static int netdev_ifr_ioctl(FAR struct socket *psock, int cmd, #endif #if defined(CONFIG_NETDEV_IOCTL) && defined(CONFIG_NETDEV_CAN_BITRATE_IOCTL) - case SIOCGCANBITRATE: /* Get bitrate from a CAN controller */ case SIOCSCANBITRATE: /* Set bitrate of a CAN controller */ + if (dev->d_flags & IFF_UP) + { + /* Cannot set bitrate if the interface is up. */ + + ret = -EBUSY; + break; + } + + /* If down, fall-through to common code in SIOCGCANBITRATE. */ + + case SIOCGCANBITRATE: /* Get bitrate from a CAN controller */ if (dev->d_ioctl) { FAR struct can_ioctl_data_s *can_bitrate_data =