|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v4 4/4] xen/drivers/char: fix exynos4210 IRQ registration failure propagation
In exynos4210_uart_init_postirq(), when setup_irq() returns an error
the failure was only logged via dprintk() and execution continued,
unconditionally clearing UINTM and setting UMCON_INT_EN. This enabled
receive and transmit interrupt lines with no handler registered. On
platforms where the GIC receives these asserted lines, the result is
either repeated spurious-interrupt warnings or an unhandled interrupt
fault.
Add an early return in the setup_irq() error branch so that the
interrupt-enable writes to UINTM and UMCON are skipped when IRQ
registration fails.
Signed-off-by: Oleksii Moisieiev <oleksii_moisieiev@xxxxxxxx>
Reviewed-by: Michal Orzel <michal.orzel@xxxxxxx>
---
Changes in v4:
- update comment on setup_irq
- change %d to %u since irq is unsigned in exynos
- add r-b
Changes in v3:
- skip clearing pending interrupts if setup_irq was failed because
according to the 13.4.1.13 of the RM: it must be cleared after
cleaning interrupt pending in INTC.
xen/drivers/char/exynos4210-uart.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/xen/drivers/char/exynos4210-uart.c
b/xen/drivers/char/exynos4210-uart.c
index 58901df554..7addc11c2c 100644
--- a/xen/drivers/char/exynos4210-uart.c
+++ b/xen/drivers/char/exynos4210-uart.c
@@ -199,8 +199,12 @@ static void __init exynos4210_uart_init_postirq(struct
serial_port *port)
uart->irqaction.dev_id = port;
if ( (rc = setup_irq(uart->irq, 0, &uart->irqaction)) != 0 )
- dprintk(XENLOG_ERR, "Failed to allocated exynos4210_uart IRQ %d\n",
+ {
+ dprintk(XENLOG_ERR, "Failed to allocated exynos4210_uart IRQ %u\n",
uart->irq);
+ /* Do not unmask interrupts if irq handler wasn't set */
+ return;
+ }
/* Unmask interrupts */
exynos4210_write(uart, UINTM, ~UINTM_ALLI);
--
2.43.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |