From 382ed6550f823b833f416ba32e8342463968d143 Mon Sep 17 00:00:00 2001 From: Jukka Laitinen Date: Thu, 18 Sep 2025 15:15:56 +0300 Subject: [PATCH] imx9/imx9_usbdev.c: Fix interrupt handling in SMP mode The interrupt handler accesses the device as well as the driver's private data. Use critical_section for mutual exclusion with drivers/usbdev, which also protects the same data with critical_section. Signed-off-by: Jukka Laitinen --- arch/arm64/src/imx9/imx9_usbdev.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/arch/arm64/src/imx9/imx9_usbdev.c b/arch/arm64/src/imx9/imx9_usbdev.c index e641c6e253..803bb229a0 100644 --- a/arch/arm64/src/imx9/imx9_usbdev.c +++ b/arch/arm64/src/imx9/imx9_usbdev.c @@ -1974,6 +1974,10 @@ static int imx9_usbinterrupt(int irq, void *context, void *arg) usbtrace(TRACE_INTENTRY(IMX9_TRACEINTID_USB), 0); +#ifdef CONFIG_SMP + irqstate_t flags = enter_critical_section(); +#endif + /* Read the interrupts and then clear them */ disr = imx9_getreg(priv, IMX9_USBDEV_USBSTS_OFFSET); @@ -1985,6 +1989,10 @@ static int imx9_usbinterrupt(int irq, void *context, void *arg) imx9_usbreset(priv); +#ifdef CONFIG_SMP + leave_critical_section(flags); +#endif + usbtrace(TRACE_INTEXIT(IMX9_TRACEINTID_USB), 0); return OK; } @@ -2153,6 +2161,10 @@ static int imx9_usbinterrupt(int irq, void *context, void *arg) imx9_putreg(priv, IMX9_USBDEV_ENDPTNAK_OFFSET, pending); } +#ifdef CONFIG_SMP + leave_critical_section(flags); +#endif + usbtrace(TRACE_INTEXIT(IMX9_TRACEINTID_USB), 0); return OK; }