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 =

Reply via email to