From patchwork Mon Jul 15 14:57:40 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: acpi, acpi_pci_irq_enable must return an error if ACPI cannot map an IRQ. X-Patchwork-Submitter: Prarit Bhargava X-Patchwork-Id: 259072 Message-Id: <1373900260-1599-1-git-send-email-prarit@redhat.com> To: linux-acpi@vger.kernel.org Cc: Prarit Bhargava , Len Brown , "Rafael J. Wysocki" , "Bjorn Helgaas" , "Myron Stowe" , linux-pci@vger.kernel.org Date: Mon, 15 Jul 2013 10:57:40 -0400 From: Prarit Bhargava List-Id: 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 Cc: Len Brown Cc: "Rafael J. Wysocki" Cc: "Bjorn Helgaas" Cc: "Myron Stowe" Cc: linux-pci@vger.kernel.org --- drivers/acpi/pci_irq.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c index 41c5e1b..9681847 100644 --- a/drivers/acpi/pci_irq.c +++ b/drivers/acpi/pci_irq.c @@ -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;