From: Hidetoshi Seto Date: Thu, 6 Aug 2009 02:34:34 +0000 (+0900) Subject: PCI MSI: MSI-X cleanup, msix_map_region() X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=5a05a9d819a328b3aae750237909aa2097adbeec;p=openwrt%2Fstaging%2Fblogic.git PCI MSI: MSI-X cleanup, msix_map_region() Cleanup based on the prototype from Matthew Milcox. Reviewed-by: Matthew Wilcox Signed-off-by: Hidetoshi Seto Signed-off-by: Jesse Barnes --- diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index 7085d665db01..b0cc82123cc7 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c @@ -432,6 +432,21 @@ static int msi_capability_init(struct pci_dev *dev, int nvec) return 0; } +static void __iomem *msix_map_region(struct pci_dev *dev, unsigned pos, + unsigned nr_entries) +{ + unsigned long phys_addr; + u32 table_offset; + u8 bir; + + pci_read_config_dword(dev, msix_table_offset_reg(pos), &table_offset); + bir = (u8)(table_offset & PCI_MSIX_FLAGS_BIRMASK); + table_offset &= ~PCI_MSIX_FLAGS_BIRMASK; + phys_addr = pci_resource_start(dev, bir) + table_offset; + + return ioremap_nocache(phys_addr, nr_entries * PCI_MSIX_ENTRY_SIZE); +} + /** * msix_capability_init - configure device's MSI-X capability * @dev: pointer to the pci_dev data structure of MSI-X device function @@ -446,11 +461,8 @@ static int msix_capability_init(struct pci_dev *dev, struct msix_entry *entries, int nvec) { struct msi_desc *entry; - int pos, i, j, nr_entries, ret; - unsigned long phys_addr; - u32 table_offset; - u16 control; - u8 bir; + int pos, i, j, ret; + u16 control; void __iomem *base; pos = pci_find_capability(dev, PCI_CAP_ID_MSIX); @@ -461,14 +473,8 @@ static int msix_capability_init(struct pci_dev *dev, pci_write_config_word(dev, pos + PCI_MSIX_FLAGS, control); /* Request & Map MSI-X table region */ - nr_entries = multi_msix_capable(control); - - pci_read_config_dword(dev, msix_table_offset_reg(pos), &table_offset); - bir = (u8)(table_offset & PCI_MSIX_FLAGS_BIRMASK); - table_offset &= ~PCI_MSIX_FLAGS_BIRMASK; - phys_addr = pci_resource_start (dev, bir) + table_offset; - base = ioremap_nocache(phys_addr, nr_entries * PCI_MSIX_ENTRY_SIZE); - if (base == NULL) + base = msix_map_region(dev, pos, multi_msix_capable(control)); + if (!base) return -ENOMEM; for (i = 0; i < nvec; i++) {