*ping* :) On 8/12/19 1:21 PM, Ralf Ramsauer wrote: > There may be setups, where legacy interrupts are not available. This is > the caese, e.g., when Linux runs as guest (aka. non-root cell) of the > partitioning hypervisor Jailhouse. There, only MSI(-X) interrupts are > available for guests. > > But the 8250_pci driver currently only supports legacy ints. So let's > enable MSI(-X) interrupts. > > Nevertheless, this needs to handled with care: while many 8250 devices > actually claim to support MSI(-X) interrupts it should not be enabled be > default. I had at least one device in my hands with broken MSI > implementation. > > So better introduce a whitelist with devices that are known to support > MSI(-X) interrupts. I tested all devices mentioned in the patch. > > Signed-off-by: Ralf Ramsauer <ralf.ramsauer@xxxxxxxxxxxxxxxxx> > --- > drivers/tty/serial/8250/8250_pci.c | 27 ++++++++++++++++++++++++++- > 1 file changed, 26 insertions(+), 1 deletion(-) > > diff --git a/drivers/tty/serial/8250/8250_pci.c b/drivers/tty/serial/8250/8250_pci.c > index bbe5cba21522..97992884c0ee 100644 > --- a/drivers/tty/serial/8250/8250_pci.c > +++ b/drivers/tty/serial/8250/8250_pci.c > @@ -53,6 +53,16 @@ struct serial_private { > int line[0]; > }; > > +static const struct pci_device_id pci_use_msi[] = { > + { PCI_DEVICE_SUB(PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9900, > + 0xA000, 0x1000) }, > + { PCI_DEVICE_SUB(PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9912, > + 0xA000, 0x1000) }, > + { PCI_DEVICE_SUB(PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9922, > + 0xA000, 0x1000) }, > + { } > +}; > + > static int pci_default_setup(struct serial_private*, > const struct pciserial_board*, struct uart_8250_port *, int); > > @@ -3643,7 +3653,22 @@ pciserial_init_ports(struct pci_dev *dev, const struct pciserial_board *board) > memset(&uart, 0, sizeof(uart)); > uart.port.flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ; > uart.port.uartclk = board->base_baud * 16; > - uart.port.irq = get_pci_irq(dev, board); > + > + if (pci_match_id(pci_use_msi, dev)) { > + dev_dbg(&dev->dev, "Using MSI(-X) interrupts\n"); > + pci_set_master(dev); > + rc = pci_alloc_irq_vectors(dev, 1, 1, PCI_IRQ_ALL_TYPES); > + } else { > + dev_dbg(&dev->dev, "Using legacy interrupts\n"); > + rc = pci_alloc_irq_vectors(dev, 1, 1, PCI_IRQ_LEGACY); > + } > + if (rc < 0) { > + kfree(priv); > + priv = ERR_PTR(rc); > + goto err_deinit; > + } > + > + uart.port.irq = pci_irq_vector(dev, 0); > uart.port.dev = &dev->dev; > > for (i = 0; i < nr_ports; i++) { >