diff options
| -rw-r--r-- | drivers/pci/msi.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index f8105783da2f..4aea563bda60 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c | |||
| @@ -916,6 +916,7 @@ static int msix_capability_init(struct pci_dev *dev, | |||
| 916 | **/ | 916 | **/ |
| 917 | int pci_enable_msi(struct pci_dev* dev) | 917 | int pci_enable_msi(struct pci_dev* dev) |
| 918 | { | 918 | { |
| 919 | struct pci_bus *bus; | ||
| 919 | int pos, temp, status = -EINVAL; | 920 | int pos, temp, status = -EINVAL; |
| 920 | u16 control; | 921 | u16 control; |
| 921 | 922 | ||
| @@ -925,8 +926,9 @@ int pci_enable_msi(struct pci_dev* dev) | |||
| 925 | if (dev->no_msi) | 926 | if (dev->no_msi) |
| 926 | return status; | 927 | return status; |
| 927 | 928 | ||
| 928 | if (dev->bus->bus_flags & PCI_BUS_FLAGS_NO_MSI) | 929 | for (bus = dev->bus; bus; bus = bus->parent) |
| 929 | return -EINVAL; | 930 | if (bus->bus_flags & PCI_BUS_FLAGS_NO_MSI) |
| 931 | return -EINVAL; | ||
| 930 | 932 | ||
| 931 | temp = dev->irq; | 933 | temp = dev->irq; |
| 932 | 934 | ||
| @@ -1162,6 +1164,7 @@ static int reroute_msix_table(int head, struct msix_entry *entries, int *nvec) | |||
| 1162 | **/ | 1164 | **/ |
| 1163 | int pci_enable_msix(struct pci_dev* dev, struct msix_entry *entries, int nvec) | 1165 | int pci_enable_msix(struct pci_dev* dev, struct msix_entry *entries, int nvec) |
| 1164 | { | 1166 | { |
| 1167 | struct pci_bus *bus; | ||
| 1165 | int status, pos, nr_entries, free_vectors; | 1168 | int status, pos, nr_entries, free_vectors; |
| 1166 | int i, j, temp; | 1169 | int i, j, temp; |
| 1167 | u16 control; | 1170 | u16 control; |
| @@ -1170,6 +1173,13 @@ int pci_enable_msix(struct pci_dev* dev, struct msix_entry *entries, int nvec) | |||
| 1170 | if (!pci_msi_enable || !dev || !entries) | 1173 | if (!pci_msi_enable || !dev || !entries) |
| 1171 | return -EINVAL; | 1174 | return -EINVAL; |
| 1172 | 1175 | ||
| 1176 | if (dev->no_msi) | ||
| 1177 | return -EINVAL; | ||
| 1178 | |||
| 1179 | for (bus = dev->bus; bus; bus = bus->parent) | ||
| 1180 | if (bus->bus_flags & PCI_BUS_FLAGS_NO_MSI) | ||
| 1181 | return -EINVAL; | ||
| 1182 | |||
| 1173 | status = msi_init(); | 1183 | status = msi_init(); |
| 1174 | if (status < 0) | 1184 | if (status < 0) |
| 1175 | return status; | 1185 | return status; |
