diff --git a/drivers/serial/uart_pci_16550.c b/drivers/serial/uart_pci_16550.c index e4c2ca56236e7..ab86bba8e87f5 100644 --- a/drivers/serial/uart_pci_16550.c +++ b/drivers/serial/uart_pci_16550.c @@ -546,6 +546,7 @@ static int pci_u16550_initialize(FAR struct pci_u16550_priv_s *priv, bool mmio) { int ret = 0; + int offset; /* Configure UART PCI */ @@ -563,6 +564,14 @@ static int pci_u16550_initialize(FAR struct pci_u16550_priv_s *priv, priv->common.regincr = type->regincr; priv->pcidev = dev; + /* Make sure that all interrupts are disabled otherwise spurious MSI + * interrupt can happen just after we connect MSI. + */ + + offset = (priv->common.regincr * sizeof(uart_datawidth_t) * + UART_IER_OFFSET); + priv->common.ops->putreg(&priv->common, offset, 0); + /* Allocate and connect MSI if supported */ ret = pci_alloc_irq(dev, &priv->common.irq, 1); @@ -586,14 +595,6 @@ static int pci_u16550_initialize(FAR struct pci_u16550_priv_s *priv, priv->common.irq = pci_get_irq(dev); - /* Attach interrupts early to prevent unexpected isr fault */ - - ret = irq_attach(priv->common.irq, priv->common.ops->isr, dev); - if (ret != OK) - { - pcierr("Failed to attach irq %d\n", ret); - } - return OK; }