Driver probe's currently do the following
pci_enable_device();
/* ... do some other init stuff, and eventually call ... */
request_irq();
After pci_enable_device() is called it is assumed that the device's
irq value (pci_dev->irq) has been appropriately set on success. This
value is passed into the request_irq() call.
In the case that ACPI is used to determine the irq value, it is
possible that the ACPI IRQ look up for a specific device fails and
success is returned by pci_enable_device().
The call sequence is:
pci_enable_device();
-> pci_enable_device_flags();
->do_pci_enable_device();
-> pcibios_enable_device() which, if the device
does not use MSI calls
-> pcibios_enable_irq() which maps to
acpi_pci_irq_enable()
-> acpi_pci_irq_lookup()
If acpi_pci_irq_lookup() cannot map the device's IRQ value it returns
NULL as an error. The error is returned to acpi_pci_irq_enable(),
but is not propagated further. This can result in the driver
returning success for pci_enable_device() and the driver probe
attempting to call request_irq() with dev->irq = 0.
This patch modifies acpi_pci_irq_enable() to return an error in the
case that an entry is not found in the ACPI tables.
Signed-off-by: Prarit Bhargava <prarit@redhat.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
} else {
dev_warn(&dev->dev, "PCI INT %c: no GSI\n",
pin_name(pin));
+ return -ENOENT;
}
return 0;