PCI MSI: Use mask_pos instead of mask_base when appropriate
Matthew Wilcox [Tue, 17 Mar 2009 12:54:08 +0000 (08:54 -0400)]
MSI interrupts have a mask_pos where MSI-X have a mask_base.  Use a
transparent union to get rid of some ugly casts.

Signed-off-by: Matthew Wilcox <willy@linux.intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>

drivers/pci/msi.c
include/linux/msi.h

index a658c0f..fcde04d 100644 (file)
@@ -145,7 +145,7 @@ static int msi_set_mask_bits(struct irq_desc *desc, u32 mask, u32 flag)
                if (!entry->msi_attrib.maskbit)
                        return 0;
 
-               pos = (long)entry->mask_base;
+               pos = entry->mask_pos;
                pci_read_config_dword(entry->dev, pos, &mask_bits);
                mask_bits &= ~mask;
                mask_bits |= flag & mask;
@@ -363,8 +363,7 @@ static int msi_capability_init(struct pci_dev *dev)
                unsigned int base, maskbits, temp;
 
                base = msi_mask_bits_reg(pos, entry->msi_attrib.is_64);
-               entry->mask_base = (void __iomem *)(long)base;
-
+               entry->mask_pos = base;
                /* All MSIs are unmasked by default, Mask them all */
                pci_read_config_dword(dev, base, &maskbits);
                temp = msi_mask((control & PCI_MSI_FLAGS_QMASK) >> 1);
index 9c5ce21..5025ca4 100644 (file)
@@ -33,7 +33,10 @@ struct msi_desc {
        unsigned int irq;
        struct list_head list;
 
-       void __iomem *mask_base;
+       union {
+               void __iomem *mask_base;
+               u8 mask_pos;
+       };
        struct pci_dev *dev;
 
        /* Last set MSI message */