|
@@ -68,6 +68,29 @@ static void msix_set_enable(struct pci_dev *dev, int enable)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static void msix_flush_writes(unsigned int irq)
|
|
|
+{
|
|
|
+ struct msi_desc *entry;
|
|
|
+
|
|
|
+ entry = get_irq_msi(irq);
|
|
|
+ BUG_ON(!entry || !entry->dev);
|
|
|
+ switch (entry->msi_attrib.type) {
|
|
|
+ case PCI_CAP_ID_MSI:
|
|
|
+ /* nothing to do */
|
|
|
+ break;
|
|
|
+ case PCI_CAP_ID_MSIX:
|
|
|
+ {
|
|
|
+ int offset = entry->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE +
|
|
|
+ PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET;
|
|
|
+ readl(entry->mask_base + offset);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ default:
|
|
|
+ BUG();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static void msi_set_mask_bit(unsigned int irq, int flag)
|
|
|
{
|
|
|
struct msi_desc *entry;
|
|
@@ -187,11 +210,13 @@ void write_msi_msg(unsigned int irq, struct msi_msg *msg)
|
|
|
void mask_msi_irq(unsigned int irq)
|
|
|
{
|
|
|
msi_set_mask_bit(irq, 1);
|
|
|
+ msix_flush_writes(irq);
|
|
|
}
|
|
|
|
|
|
void unmask_msi_irq(unsigned int irq)
|
|
|
{
|
|
|
msi_set_mask_bit(irq, 0);
|
|
|
+ msix_flush_writes(irq);
|
|
|
}
|
|
|
|
|
|
static int msi_free_irq(struct pci_dev* dev, int irq);
|