|
@@ -226,21 +226,27 @@ static int xen_pcifront_enable_irq(struct pci_dev *dev)
|
|
|
{
|
|
|
int rc;
|
|
|
int share = 1;
|
|
|
+ u8 gsi;
|
|
|
|
|
|
- dev_info(&dev->dev, "Xen PCI enabling IRQ: %d\n", dev->irq);
|
|
|
-
|
|
|
- if (dev->irq < 0)
|
|
|
- return -EINVAL;
|
|
|
+ rc = pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &gsi);
|
|
|
+ if (rc < 0) {
|
|
|
+ dev_warn(&dev->dev, "Xen PCI: failed to read interrupt line: %d\n",
|
|
|
+ rc);
|
|
|
+ return rc;
|
|
|
+ }
|
|
|
|
|
|
- if (dev->irq < NR_IRQS_LEGACY)
|
|
|
+ if (gsi < NR_IRQS_LEGACY)
|
|
|
share = 0;
|
|
|
|
|
|
- rc = xen_allocate_pirq(dev->irq, share, "pcifront");
|
|
|
+ rc = xen_allocate_pirq(gsi, share, "pcifront");
|
|
|
if (rc < 0) {
|
|
|
- dev_warn(&dev->dev, "Xen PCI IRQ: %d, failed to register:%d\n",
|
|
|
- dev->irq, rc);
|
|
|
+ dev_warn(&dev->dev, "Xen PCI: failed to register GSI%d: %d\n",
|
|
|
+ gsi, rc);
|
|
|
return rc;
|
|
|
}
|
|
|
+
|
|
|
+ dev->irq = rc;
|
|
|
+ dev_info(&dev->dev, "Xen PCI mapped GSI%d to IRQ%d\n", gsi, dev->irq);
|
|
|
return 0;
|
|
|
}
|
|
|
|