]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ACPI / PCI: acpi_pci_irq_enable() must return an error if ACPI cannot map an IRQ.
authorPrarit Bhargava <prarit@redhat.com>
Mon, 15 Jul 2013 14:57:40 +0000 (10:57 -0400)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 25 Jul 2013 22:39:47 +0000 (00:39 +0200)
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>
drivers/acpi/pci_irq.c

index 41c5e1b799ef938ff1eed92e4cf48a7c7677f8bd..9681847aa1d7c73c6de19e97f4b6140d95763ba9 100644 (file)
@@ -430,6 +430,7 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
                } else {
                        dev_warn(&dev->dev, "PCI INT %c: no GSI\n",
                                 pin_name(pin));
+                       return -ENOENT;
                }
 
                return 0;