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 <[email protected]>
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 <[email protected]>
---
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 =