diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/pci/msi.c | 22 | ||||
| -rw-r--r-- | drivers/pci/pci.c | 13 |
2 files changed, 24 insertions, 11 deletions
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index 604265c40853..5e63645a7abe 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c | |||
| @@ -185,7 +185,7 @@ static inline __attribute_const__ u32 msi_enabled_mask(u16 control) | |||
| 185 | * reliably as devices without an INTx disable bit will then generate a | 185 | * reliably as devices without an INTx disable bit will then generate a |
| 186 | * level IRQ which will never be cleared. | 186 | * level IRQ which will never be cleared. |
| 187 | */ | 187 | */ |
| 188 | static u32 __msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag) | 188 | u32 default_msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag) |
| 189 | { | 189 | { |
| 190 | u32 mask_bits = desc->masked; | 190 | u32 mask_bits = desc->masked; |
| 191 | 191 | ||
| @@ -199,9 +199,14 @@ static u32 __msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag) | |||
| 199 | return mask_bits; | 199 | return mask_bits; |
| 200 | } | 200 | } |
| 201 | 201 | ||
| 202 | __weak u32 arch_msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag) | ||
| 203 | { | ||
| 204 | return default_msi_mask_irq(desc, mask, flag); | ||
| 205 | } | ||
| 206 | |||
| 202 | static void msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag) | 207 | static void msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag) |
| 203 | { | 208 | { |
| 204 | desc->masked = __msi_mask_irq(desc, mask, flag); | 209 | desc->masked = arch_msi_mask_irq(desc, mask, flag); |
| 205 | } | 210 | } |
| 206 | 211 | ||
| 207 | /* | 212 | /* |
| @@ -211,7 +216,7 @@ static void msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag) | |||
| 211 | * file. This saves a few milliseconds when initialising devices with lots | 216 | * file. This saves a few milliseconds when initialising devices with lots |
| 212 | * of MSI-X interrupts. | 217 | * of MSI-X interrupts. |
| 213 | */ | 218 | */ |
| 214 | static u32 __msix_mask_irq(struct msi_desc *desc, u32 flag) | 219 | u32 default_msix_mask_irq(struct msi_desc *desc, u32 flag) |
| 215 | { | 220 | { |
| 216 | u32 mask_bits = desc->masked; | 221 | u32 mask_bits = desc->masked; |
| 217 | unsigned offset = desc->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE + | 222 | unsigned offset = desc->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE + |
| @@ -224,9 +229,14 @@ static u32 __msix_mask_irq(struct msi_desc *desc, u32 flag) | |||
| 224 | return mask_bits; | 229 | return mask_bits; |
| 225 | } | 230 | } |
| 226 | 231 | ||
| 232 | __weak u32 arch_msix_mask_irq(struct msi_desc *desc, u32 flag) | ||
| 233 | { | ||
| 234 | return default_msix_mask_irq(desc, flag); | ||
| 235 | } | ||
| 236 | |||
| 227 | static void msix_mask_irq(struct msi_desc *desc, u32 flag) | 237 | static void msix_mask_irq(struct msi_desc *desc, u32 flag) |
| 228 | { | 238 | { |
| 229 | desc->masked = __msix_mask_irq(desc, flag); | 239 | desc->masked = arch_msix_mask_irq(desc, flag); |
| 230 | } | 240 | } |
| 231 | 241 | ||
| 232 | static void msi_set_mask_bit(struct irq_data *data, u32 flag) | 242 | static void msi_set_mask_bit(struct irq_data *data, u32 flag) |
| @@ -902,7 +912,7 @@ void pci_msi_shutdown(struct pci_dev *dev) | |||
| 902 | pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &ctrl); | 912 | pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &ctrl); |
| 903 | mask = msi_capable_mask(ctrl); | 913 | mask = msi_capable_mask(ctrl); |
| 904 | /* Keep cached state to be restored */ | 914 | /* Keep cached state to be restored */ |
| 905 | __msi_mask_irq(desc, mask, ~mask); | 915 | arch_msi_mask_irq(desc, mask, ~mask); |
| 906 | 916 | ||
| 907 | /* Restore dev->irq to its default pin-assertion irq */ | 917 | /* Restore dev->irq to its default pin-assertion irq */ |
| 908 | dev->irq = desc->msi_attrib.default_irq; | 918 | dev->irq = desc->msi_attrib.default_irq; |
| @@ -998,7 +1008,7 @@ void pci_msix_shutdown(struct pci_dev *dev) | |||
| 998 | /* Return the device with MSI-X masked as initial states */ | 1008 | /* Return the device with MSI-X masked as initial states */ |
| 999 | list_for_each_entry(entry, &dev->msi_list, list) { | 1009 | list_for_each_entry(entry, &dev->msi_list, list) { |
| 1000 | /* Keep cached states to be restored */ | 1010 | /* Keep cached states to be restored */ |
| 1001 | __msix_mask_irq(entry, 1); | 1011 | arch_msix_mask_irq(entry, 1); |
| 1002 | } | 1012 | } |
| 1003 | 1013 | ||
| 1004 | msix_set_enable(dev, 0); | 1014 | msix_set_enable(dev, 0); |
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index e485d92b3fa8..b127fbda6fc8 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
| @@ -1148,12 +1148,12 @@ int pci_reenable_device(struct pci_dev *dev) | |||
| 1148 | 1148 | ||
| 1149 | static void pci_enable_bridge(struct pci_dev *dev) | 1149 | static void pci_enable_bridge(struct pci_dev *dev) |
| 1150 | { | 1150 | { |
| 1151 | struct pci_dev *bridge; | ||
| 1151 | int retval; | 1152 | int retval; |
| 1152 | 1153 | ||
| 1153 | if (!dev) | 1154 | bridge = pci_upstream_bridge(dev); |
| 1154 | return; | 1155 | if (bridge) |
| 1155 | 1156 | pci_enable_bridge(bridge); | |
| 1156 | pci_enable_bridge(dev->bus->self); | ||
| 1157 | 1157 | ||
| 1158 | if (pci_is_enabled(dev)) { | 1158 | if (pci_is_enabled(dev)) { |
| 1159 | if (!dev->is_busmaster) | 1159 | if (!dev->is_busmaster) |
| @@ -1170,6 +1170,7 @@ static void pci_enable_bridge(struct pci_dev *dev) | |||
| 1170 | 1170 | ||
| 1171 | static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags) | 1171 | static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags) |
| 1172 | { | 1172 | { |
| 1173 | struct pci_dev *bridge; | ||
| 1173 | int err; | 1174 | int err; |
| 1174 | int i, bars = 0; | 1175 | int i, bars = 0; |
| 1175 | 1176 | ||
| @@ -1188,7 +1189,9 @@ static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags) | |||
| 1188 | if (atomic_inc_return(&dev->enable_cnt) > 1) | 1189 | if (atomic_inc_return(&dev->enable_cnt) > 1) |
| 1189 | return 0; /* already enabled */ | 1190 | return 0; /* already enabled */ |
| 1190 | 1191 | ||
| 1191 | pci_enable_bridge(dev->bus->self); | 1192 | bridge = pci_upstream_bridge(dev); |
| 1193 | if (bridge) | ||
| 1194 | pci_enable_bridge(bridge); | ||
| 1192 | 1195 | ||
| 1193 | /* only skip sriov related */ | 1196 | /* only skip sriov related */ |
| 1194 | for (i = 0; i <= PCI_ROM_RESOURCE; i++) | 1197 | for (i = 0; i <= PCI_ROM_RESOURCE; i++) |
