|
@@ -48,13 +48,10 @@
|
|
static LIST_HEAD(zpci_list);
|
|
static LIST_HEAD(zpci_list);
|
|
static DEFINE_SPINLOCK(zpci_list_lock);
|
|
static DEFINE_SPINLOCK(zpci_list_lock);
|
|
|
|
|
|
-static void zpci_enable_irq(struct irq_data *data);
|
|
|
|
-static void zpci_disable_irq(struct irq_data *data);
|
|
|
|
-
|
|
|
|
static struct irq_chip zpci_irq_chip = {
|
|
static struct irq_chip zpci_irq_chip = {
|
|
.name = "zPCI",
|
|
.name = "zPCI",
|
|
- .irq_unmask = zpci_enable_irq,
|
|
|
|
- .irq_mask = zpci_disable_irq,
|
|
|
|
|
|
+ .irq_unmask = unmask_msi_irq,
|
|
|
|
+ .irq_mask = mask_msi_irq,
|
|
};
|
|
};
|
|
|
|
|
|
static DECLARE_BITMAP(zpci_domain, ZPCI_NR_DEVICES);
|
|
static DECLARE_BITMAP(zpci_domain, ZPCI_NR_DEVICES);
|
|
@@ -244,43 +241,6 @@ static int zpci_cfg_store(struct zpci_dev *zdev, int offset, u32 val, u8 len)
|
|
return rc;
|
|
return rc;
|
|
}
|
|
}
|
|
|
|
|
|
-static int zpci_msi_set_mask_bits(struct msi_desc *msi, u32 mask, u32 flag)
|
|
|
|
-{
|
|
|
|
- int offset, pos;
|
|
|
|
- u32 mask_bits;
|
|
|
|
-
|
|
|
|
- if (msi->msi_attrib.is_msix) {
|
|
|
|
- offset = msi->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE +
|
|
|
|
- PCI_MSIX_ENTRY_VECTOR_CTRL;
|
|
|
|
- msi->masked = readl(msi->mask_base + offset);
|
|
|
|
- writel(flag, msi->mask_base + offset);
|
|
|
|
- } else if (msi->msi_attrib.maskbit) {
|
|
|
|
- pos = (long) msi->mask_base;
|
|
|
|
- pci_read_config_dword(msi->dev, pos, &mask_bits);
|
|
|
|
- mask_bits &= ~(mask);
|
|
|
|
- mask_bits |= flag & mask;
|
|
|
|
- pci_write_config_dword(msi->dev, pos, mask_bits);
|
|
|
|
- } else
|
|
|
|
- return 0;
|
|
|
|
-
|
|
|
|
- msi->msi_attrib.maskbit = !!flag;
|
|
|
|
- return 1;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static void zpci_enable_irq(struct irq_data *data)
|
|
|
|
-{
|
|
|
|
- struct msi_desc *msi = irq_get_msi_desc(data->irq);
|
|
|
|
-
|
|
|
|
- zpci_msi_set_mask_bits(msi, 1, 0);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static void zpci_disable_irq(struct irq_data *data)
|
|
|
|
-{
|
|
|
|
- struct msi_desc *msi = irq_get_msi_desc(data->irq);
|
|
|
|
-
|
|
|
|
- zpci_msi_set_mask_bits(msi, 1, 1);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
void pcibios_fixup_bus(struct pci_bus *bus)
|
|
void pcibios_fixup_bus(struct pci_bus *bus)
|
|
{
|
|
{
|
|
}
|
|
}
|
|
@@ -487,7 +447,10 @@ void arch_teardown_msi_irqs(struct pci_dev *pdev)
|
|
|
|
|
|
/* Release MSI interrupts */
|
|
/* Release MSI interrupts */
|
|
list_for_each_entry(msi, &pdev->msi_list, list) {
|
|
list_for_each_entry(msi, &pdev->msi_list, list) {
|
|
- zpci_msi_set_mask_bits(msi, 1, 1);
|
|
|
|
|
|
+ if (msi->msi_attrib.is_msix)
|
|
|
|
+ default_msix_mask_irq(msi, 1);
|
|
|
|
+ else
|
|
|
|
+ default_msi_mask_irq(msi, 1, 1);
|
|
irq_set_msi_desc(msi->irq, NULL);
|
|
irq_set_msi_desc(msi->irq, NULL);
|
|
irq_free_desc(msi->irq);
|
|
irq_free_desc(msi->irq);
|
|
msi->msg.address_lo = 0;
|
|
msi->msg.address_lo = 0;
|