On Sun, Apr 30, 2017 at 12:29:55PM -0700, Jim Harris wrote: > Some userspace drivers and frameworks only poll and do not > require interrupts to be available and enabled on the > PCI device. So remove the requirement that an IRQ is > assigned. If an IRQ is not assigned and a userspace > driver tries to read()/write(), the generic uio > framework will just return -EIO. > > This allows binding uio_pci_generic to devices which > cannot get an IRQ assigned, such as an NVMe controller > behind Intel Volume Management Device (VMD), since VMD > does not support INTx interrupts. > > Signed-off-by: Jim Harris <james.r.harris@xxxxxxxxx> Without interrupts, why do you want uio? All it does is forward interrupts to userspace. > --- > drivers/uio/uio_pci_generic.c | 20 +++++++++----------- > 1 file changed, 9 insertions(+), 11 deletions(-) > > diff --git a/drivers/uio/uio_pci_generic.c b/drivers/uio/uio_pci_generic.c > index d0b508b68f3c..81c59b4f8552 100644 > --- a/drivers/uio/uio_pci_generic.c > +++ b/drivers/uio/uio_pci_generic.c > @@ -66,14 +66,7 @@ static int probe(struct pci_dev *pdev, > return err; > } > > - if (!pdev->irq) { > - dev_warn(&pdev->dev, "No IRQ assigned to device: " > - "no support for interrupts?\n"); > - pci_disable_device(pdev); > - return -ENODEV; > - } > - > - if (!pci_intx_mask_supported(pdev)) { > + if (pci->irq && !pci_intx_mask_supported(pdev)) { > err = -ENODEV; > goto err_verify; > } > @@ -86,10 +79,15 @@ static int probe(struct pci_dev *pdev, > > gdev->info.name = "uio_pci_generic"; > gdev->info.version = DRIVER_VERSION; > - gdev->info.irq = pdev->irq; > - gdev->info.irq_flags = IRQF_SHARED; > - gdev->info.handler = irqhandler; > gdev->pdev = pdev; > + if (pdev->irq) { > + gdev->info.irq = pdev->irq; > + gdev->info.irq_flags = IRQF_SHARED; > + gdev->info.handler = irqhandler; > + } else { > + dev_warn(&pdev->dev, "No IRQ assigned to device: " > + "no support for interrupts?\n"); > + } > > err = uio_register_device(&pdev->dev, &gdev->info); > if (err) > -- > 2.12.2