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 a9da6fde59 arch/arm/src/*/stm32_fdcan_sock.c: prevent interrupt flood 
on errors.
a9da6fde59 is described below

commit a9da6fde59551ffa763f897d1e72a091191dae1d
Author: Carlos Sanchez <carlossanc...@geotab.com>
AuthorDate: Thu Jul 3 11:26:52 2025 +0200

    arch/arm/src/*/stm32_fdcan_sock.c: prevent interrupt flood on errors.
    
    Previous code was failing to disable error interrupts which
    due to standard CAN retransmissions might trigger continusouly
    (for example, with a disconnected CAN interface) flooding the
    system and preventing other operations to continue.
    
    Fixes: https://github.com/apache/nuttx/issues/16668
    Signed-off-by: Carlos Sanchez <carlossanc...@geotab.com>
---
 arch/arm/src/stm32/stm32_fdcan_sock.c       | 5 ++---
 arch/arm/src/stm32f0l0g0/stm32_fdcan_sock.c | 5 ++---
 arch/arm/src/stm32h7/stm32_fdcan_sock.c     | 5 ++---
 3 files changed, 6 insertions(+), 9 deletions(-)

diff --git a/arch/arm/src/stm32/stm32_fdcan_sock.c 
b/arch/arm/src/stm32/stm32_fdcan_sock.c
index 4c3c5df332..966d7cd6aa 100644
--- a/arch/arm/src/stm32/stm32_fdcan_sock.c
+++ b/arch/arm/src/stm32/stm32_fdcan_sock.c
@@ -2050,6 +2050,7 @@ static void fdcan_error_work(void *arg)
   ie = fdcan_getreg(priv, STM32_FDCAN_IE_OFFSET);
 
   pending = (ir & ie);
+  ie |= FDCAN_ANYERR_INTS;
 
   /* Check for common errors */
 
@@ -2071,7 +2072,6 @@ static void fdcan_error_work(void *arg)
       if ((psr & FDCAN_PSR_LEC_MASK) != 0)
         {
           ie &= ~(FDCAN_INT_PEA | FDCAN_INT_PED);
-          fdcan_putreg(priv, STM32_FDCAN_IE_OFFSET, ie);
         }
 
       /* Clear the error indications */
@@ -2113,7 +2113,6 @@ static void fdcan_error_work(void *arg)
        */
 
       ie &= ~(pending & FDCAN_RXERR_INTS);
-      fdcan_putreg(priv, STM32_FDCAN_IE_OFFSET, ie);
 
       /* Clear the error indications */
 
@@ -2128,7 +2127,7 @@ static void fdcan_error_work(void *arg)
 
   /* Re-enable ERROR interrupts */
 
-  fdcan_errint(priv, true);
+  fdcan_putreg(priv, STM32_FDCAN_IE_OFFSET, ie);
 }
 
 /****************************************************************************
diff --git a/arch/arm/src/stm32f0l0g0/stm32_fdcan_sock.c 
b/arch/arm/src/stm32f0l0g0/stm32_fdcan_sock.c
index bd96780d04..bb0b749b02 100644
--- a/arch/arm/src/stm32f0l0g0/stm32_fdcan_sock.c
+++ b/arch/arm/src/stm32f0l0g0/stm32_fdcan_sock.c
@@ -1746,6 +1746,7 @@ static void fdcan_error_work(void *arg)
   ie = fdcan_getreg(priv, STM32_FDCAN_IE_OFFSET);
 
   pending = (ir & ie);
+  ie |= FDCAN_ANYERR_INTS;
 
   /* Check for common errors */
 
@@ -1767,7 +1768,6 @@ static void fdcan_error_work(void *arg)
       if ((psr & FDCAN_PSR_LEC_MASK) != 0)
         {
           ie &= ~(FDCAN_INT_PEA | FDCAN_INT_PED);
-          fdcan_putreg(priv, STM32_FDCAN_IE_OFFSET, ie);
         }
 
       /* Clear the error indications */
@@ -1809,7 +1809,6 @@ static void fdcan_error_work(void *arg)
        */
 
       ie &= ~(pending & FDCAN_RXERR_INTS);
-      fdcan_putreg(priv, STM32_FDCAN_IE_OFFSET, ie);
 
       /* Clear the error indications */
 
@@ -1824,7 +1823,7 @@ static void fdcan_error_work(void *arg)
 
   /* Re-enable ERROR interrupts */
 
-  fdcan_errint(priv, true);
+  fdcan_putreg(priv, STM32_FDCAN_IE_OFFSET, ie);
 }
 
 /****************************************************************************
diff --git a/arch/arm/src/stm32h7/stm32_fdcan_sock.c 
b/arch/arm/src/stm32h7/stm32_fdcan_sock.c
index 5d3561dd0e..fdf667bce5 100644
--- a/arch/arm/src/stm32h7/stm32_fdcan_sock.c
+++ b/arch/arm/src/stm32h7/stm32_fdcan_sock.c
@@ -2611,6 +2611,7 @@ static void fdcan_error_work(void *arg)
   psr = getreg32(priv->base + STM32_FDCAN_PSR_OFFSET);
 
   pending = (ir);
+  ie |= FDCAN_ANYERR_INTS;
 
   /* Check for common errors */
 
@@ -2630,7 +2631,6 @@ static void fdcan_error_work(void *arg)
       if ((psr & FDCAN_PSR_LEC_MASK) != 0)
         {
           ie &= ~(FDCAN_IE_PEAE | FDCAN_IE_PEDE);
-          putreg32(ie, priv->base + STM32_FDCAN_IE_OFFSET);
         }
 
       /* Clear the error indications */
@@ -2672,7 +2672,6 @@ static void fdcan_error_work(void *arg)
        */
 
       ie &= ~(pending & FDCAN_RXERR_INTS);
-      putreg32(ie, priv->base + STM32_FDCAN_IE_OFFSET);
 
       /* Clear the error indications */
 
@@ -2687,7 +2686,7 @@ static void fdcan_error_work(void *arg)
 
   /* Re-enable ERROR interrupts */
 
-  fdcan_errint(priv, true);
+  putreg32(ie, priv->base + STM32_FDCAN_IE_OFFSET);
 }
 
 /****************************************************************************

Reply via email to