|
@@ -86,6 +86,31 @@ void default_teardown_msi_irqs(struct pci_dev *dev)
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
+#ifndef arch_restore_msi_irqs
|
|
|
|
+# define arch_restore_msi_irqs default_restore_msi_irqs
|
|
|
|
+# define HAVE_DEFAULT_MSI_RESTORE_IRQS
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+#ifdef HAVE_DEFAULT_MSI_RESTORE_IRQS
|
|
|
|
+void default_restore_msi_irqs(struct pci_dev *dev, int irq)
|
|
|
|
+{
|
|
|
|
+ struct msi_desc *entry;
|
|
|
|
+
|
|
|
|
+ entry = NULL;
|
|
|
|
+ if (dev->msix_enabled) {
|
|
|
|
+ list_for_each_entry(entry, &dev->msi_list, list) {
|
|
|
|
+ if (irq == entry->irq)
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ } else if (dev->msi_enabled) {
|
|
|
|
+ entry = irq_get_msi_desc(irq);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (entry)
|
|
|
|
+ write_msi_msg(irq, &entry->msg);
|
|
|
|
+}
|
|
|
|
+#endif
|
|
|
|
+
|
|
static void msi_set_enable(struct pci_dev *dev, int pos, int enable)
|
|
static void msi_set_enable(struct pci_dev *dev, int pos, int enable)
|
|
{
|
|
{
|
|
u16 control;
|
|
u16 control;
|
|
@@ -372,7 +397,7 @@ static void __pci_restore_msi_state(struct pci_dev *dev)
|
|
|
|
|
|
pci_intx_for_msi(dev, 0);
|
|
pci_intx_for_msi(dev, 0);
|
|
msi_set_enable(dev, pos, 0);
|
|
msi_set_enable(dev, pos, 0);
|
|
- write_msi_msg(dev->irq, &entry->msg);
|
|
|
|
|
|
+ arch_restore_msi_irqs(dev, dev->irq);
|
|
|
|
|
|
pci_read_config_word(dev, pos + PCI_MSI_FLAGS, &control);
|
|
pci_read_config_word(dev, pos + PCI_MSI_FLAGS, &control);
|
|
msi_mask_irq(entry, msi_capable_mask(control), entry->masked);
|
|
msi_mask_irq(entry, msi_capable_mask(control), entry->masked);
|
|
@@ -400,7 +425,7 @@ static void __pci_restore_msix_state(struct pci_dev *dev)
|
|
pci_write_config_word(dev, pos + PCI_MSIX_FLAGS, control);
|
|
pci_write_config_word(dev, pos + PCI_MSIX_FLAGS, control);
|
|
|
|
|
|
list_for_each_entry(entry, &dev->msi_list, list) {
|
|
list_for_each_entry(entry, &dev->msi_list, list) {
|
|
- write_msi_msg(entry->irq, &entry->msg);
|
|
|
|
|
|
+ arch_restore_msi_irqs(dev, entry->irq);
|
|
msix_mask_irq(entry, entry->masked);
|
|
msix_mask_irq(entry, entry->masked);
|
|
}
|
|
}
|
|
|
|
|