struct list_head pirq_list_head;
/* Used for saving/restoring MSI-X tables */
void __iomem *mask_base;
+ /* Store default pre-assigned irq */
+ unsigned int default_irq;
};
struct msi_pirq_entry {
{
struct pci_bus *bus;
int pos, temp, status = -EINVAL;
+ struct msi_dev_list *msi_dev_entry = get_msi_dev_pirq_list(dev);
if (!pci_msi_enable || !dev)
return status;
return ret;
dev->irq = evtchn_map_pirq(-1, dev->irq);
- dev->irq_old = temp;
+ msi_dev_entry->default_irq = temp;
return ret;
}
status = msi_capability_init(dev);
if ( !status )
- dev->irq_old = temp;
- else
+ msi_dev_entry->default_irq = temp;
+ else
dev->irq = temp;
return status;
{
int pos;
int pirq;
+ struct msi_dev_list *msi_dev_entry = get_msi_dev_pirq_list(dev);
if (!pci_msi_enable)
return;
if (!is_initial_xendomain()) {
evtchn_map_pirq(dev->irq, 0);
pci_frontend_disable_msi(dev);
- dev->irq = dev->irq_old;
+ dev->irq = msi_dev_entry->default_irq;
return;
}
#endif
pirq = dev->irq;
/* Restore dev->irq to its default pin-assertion vector */
- dev->irq = dev->irq_old;
+ dev->irq = msi_dev_entry->default_irq;
msi_unmap_pirq(dev, pirq);
/* Disable MSI mode */
int status, pos, nr_entries;
int i, j, temp;
u16 control;
+ struct msi_dev_list *msi_dev_entry = get_msi_dev_pirq_list(dev);
if (!pci_msi_enable || !dev || !entries)
return -EINVAL;
struct msi_pirq_entry *pirq_entry;
int ret, irq;
+ temp = dev->irq;
ret = pci_frontend_enable_msix(dev, entries, nvec);
if (ret) {
printk("get %x from pci_frontend_enable_msix\n", ret);
return ret;
}
+ msi_dev_entry->default_irq = temp;
msi_dev_entry = get_msi_dev_pirq_list(dev);
for (i = 0; i < nvec; i++) {
status = msix_capability_init(dev, entries, nvec);
if ( !status )
- dev->irq_old = temp;
+ msi_dev_entry->default_irq = temp;
else
dev->irq = temp;
{
int pos;
u16 control;
+ struct msi_dev_list *msi_dev_entry = get_msi_dev_pirq_list(dev);
if (!pci_msi_enable)
kfree(pirq_entry);
}
- dev->irq = dev->irq_old;
+ dev->irq = msi_dev_entry->default_irq;
return;
}
#endif
spin_unlock_irqrestore(&msi_dev_entry->pirq_list_lock, flags);
iounmap(msi_dev_entry->mask_base);
msi_dev_entry->mask_base = NULL;
- dev->irq = dev->irq_old;
+ dev->irq = msi_dev_entry->default_irq;
}
void pci_no_msi(void)