diff options
-rw-r--r-- | drivers/pci/msi.c | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index 4de1c17ee573..aea8b258b9b8 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c | |||
@@ -600,7 +600,8 @@ static int msix_capability_init(struct pci_dev *dev, | |||
600 | struct msg_address address; | 600 | struct msg_address address; |
601 | struct msg_data data; | 601 | struct msg_data data; |
602 | int vector, pos, i, j, nr_entries, temp = 0; | 602 | int vector, pos, i, j, nr_entries, temp = 0; |
603 | u32 phys_addr, table_offset; | 603 | unsigned long phys_addr; |
604 | u32 table_offset; | ||
604 | u16 control; | 605 | u16 control; |
605 | u8 bir; | 606 | u8 bir; |
606 | void __iomem *base; | 607 | void __iomem *base; |
@@ -609,11 +610,11 @@ static int msix_capability_init(struct pci_dev *dev, | |||
609 | /* Request & Map MSI-X table region */ | 610 | /* Request & Map MSI-X table region */ |
610 | pci_read_config_word(dev, msi_control_reg(pos), &control); | 611 | pci_read_config_word(dev, msi_control_reg(pos), &control); |
611 | nr_entries = multi_msix_capable(control); | 612 | nr_entries = multi_msix_capable(control); |
612 | pci_read_config_dword(dev, msix_table_offset_reg(pos), | 613 | |
613 | &table_offset); | 614 | pci_read_config_dword(dev, msix_table_offset_reg(pos), &table_offset); |
614 | bir = (u8)(table_offset & PCI_MSIX_FLAGS_BIRMASK); | 615 | bir = (u8)(table_offset & PCI_MSIX_FLAGS_BIRMASK); |
615 | phys_addr = pci_resource_start (dev, bir); | 616 | table_offset &= ~PCI_MSIX_FLAGS_BIRMASK; |
616 | phys_addr += (u32)(table_offset & ~PCI_MSIX_FLAGS_BIRMASK); | 617 | phys_addr = pci_resource_start (dev, bir) + table_offset; |
617 | base = ioremap_nocache(phys_addr, nr_entries * PCI_MSIX_ENTRY_SIZE); | 618 | base = ioremap_nocache(phys_addr, nr_entries * PCI_MSIX_ENTRY_SIZE); |
618 | if (base == NULL) | 619 | if (base == NULL) |
619 | return -ENOMEM; | 620 | return -ENOMEM; |
@@ -838,8 +839,10 @@ static int msi_free_vector(struct pci_dev* dev, int vector, int reassign) | |||
838 | * Detect last MSI-X vector to be released. | 839 | * Detect last MSI-X vector to be released. |
839 | * Release the MSI-X memory-mapped table. | 840 | * Release the MSI-X memory-mapped table. |
840 | */ | 841 | */ |
842 | #if 0 | ||
841 | int pos, nr_entries; | 843 | int pos, nr_entries; |
842 | u32 phys_addr, table_offset; | 844 | unsigned long phys_addr; |
845 | u32 table_offset; | ||
843 | u16 control; | 846 | u16 control; |
844 | u8 bir; | 847 | u8 bir; |
845 | 848 | ||
@@ -850,9 +853,12 @@ static int msi_free_vector(struct pci_dev* dev, int vector, int reassign) | |||
850 | pci_read_config_dword(dev, msix_table_offset_reg(pos), | 853 | pci_read_config_dword(dev, msix_table_offset_reg(pos), |
851 | &table_offset); | 854 | &table_offset); |
852 | bir = (u8)(table_offset & PCI_MSIX_FLAGS_BIRMASK); | 855 | bir = (u8)(table_offset & PCI_MSIX_FLAGS_BIRMASK); |
853 | phys_addr = pci_resource_start (dev, bir); | 856 | table_offset &= ~PCI_MSIX_FLAGS_BIRMASK; |
854 | phys_addr += (u32)(table_offset & | 857 | phys_addr = pci_resource_start(dev, bir) + table_offset; |
855 | ~PCI_MSIX_FLAGS_BIRMASK); | 858 | /* |
859 | * FIXME! and what did you want to do with phys_addr? | ||
860 | */ | ||
861 | #endif | ||
856 | iounmap(base); | 862 | iounmap(base); |
857 | } | 863 | } |
858 | } | 864 | } |
@@ -1119,7 +1125,9 @@ void msi_remove_pci_irq_vectors(struct pci_dev* dev) | |||
1119 | msi_free_vector(dev, vector, 0); | 1125 | msi_free_vector(dev, vector, 0); |
1120 | if (warning) { | 1126 | if (warning) { |
1121 | /* Force to release the MSI-X memory-mapped table */ | 1127 | /* Force to release the MSI-X memory-mapped table */ |
1122 | u32 phys_addr, table_offset; | 1128 | #if 0 |
1129 | unsigned long phys_addr; | ||
1130 | u32 table_offset; | ||
1123 | u16 control; | 1131 | u16 control; |
1124 | u8 bir; | 1132 | u8 bir; |
1125 | 1133 | ||
@@ -1128,9 +1136,12 @@ void msi_remove_pci_irq_vectors(struct pci_dev* dev) | |||
1128 | pci_read_config_dword(dev, msix_table_offset_reg(pos), | 1136 | pci_read_config_dword(dev, msix_table_offset_reg(pos), |
1129 | &table_offset); | 1137 | &table_offset); |
1130 | bir = (u8)(table_offset & PCI_MSIX_FLAGS_BIRMASK); | 1138 | bir = (u8)(table_offset & PCI_MSIX_FLAGS_BIRMASK); |
1131 | phys_addr = pci_resource_start (dev, bir); | 1139 | table_offset &= ~PCI_MSIX_FLAGS_BIRMASK; |
1132 | phys_addr += (u32)(table_offset & | 1140 | phys_addr = pci_resource_start(dev, bir) + table_offset; |
1133 | ~PCI_MSIX_FLAGS_BIRMASK); | 1141 | /* |
1142 | * FIXME! and what did you want to do with phys_addr? | ||
1143 | */ | ||
1144 | #endif | ||
1134 | iounmap(base); | 1145 | iounmap(base); |
1135 | printk(KERN_WARNING "PCI: %s: msi_remove_pci_irq_vectors() " | 1146 | printk(KERN_WARNING "PCI: %s: msi_remove_pci_irq_vectors() " |
1136 | "called without free_irq() on all MSI-X vectors\n", | 1147 | "called without free_irq() on all MSI-X vectors\n", |