On Thu, Feb 21, 2013 at 07:53:14AM +0100, Hannes Reinecke wrote:I would actually prefer the second solution, as the ACPI code givesOn 02/20/2013 05:57 PM, Yinghai Lu wrote:...it seems you mess pin with interrupt line.But the device _has_ an interrupt pin implemented.
current code:
unsigned char irq;
pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &irq);
dev->pin = irq;
if (irq)
pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &irq);
dev->irq = irq;
so if the device does not have interrupt pin implemented, pin should be zero.
and pin and irq in dev should
be all 0.
The whole point here is that the interrupt line is _NOT_ zero.
So at one point we have to decide that ->irq is not valid, despite it
being not set to zero.
An alternative fix would be this:
diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c
index 68a921d..4a480cb 100644
--- a/drivers/acpi/pci_irq.c
+++ b/drivers/acpi/pci_irq.c
@@ -469,6 +469,7 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
} else {
dev_warn(&dev->dev, "PCI INT %c: no GSI\n",
pin_name(pin));
+ dev->irq = 0;
}
return 0;
}
Which probably is a better solution, as here ->irq is _definitely_
not valid, so we should reset it to '0' to avoid confusion on upper
layers.
Is there any agreement on how to proceed?