diff options
| -rw-r--r-- | drivers/pci/pcie/portdrv_core.c | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/drivers/pci/pcie/portdrv_core.c b/drivers/pci/pcie/portdrv_core.c index d0245c83b621..a9c222d79ebc 100644 --- a/drivers/pci/pcie/portdrv_core.c +++ b/drivers/pci/pcie/portdrv_core.c | |||
| @@ -259,20 +259,43 @@ static int get_port_device_capability(struct pci_dev *dev) | |||
| 259 | /* Hot-Plug Capable */ | 259 | /* Hot-Plug Capable */ |
| 260 | if ((cap_mask & PCIE_PORT_SERVICE_HP) && (reg16 & PCI_EXP_FLAGS_SLOT)) { | 260 | if ((cap_mask & PCIE_PORT_SERVICE_HP) && (reg16 & PCI_EXP_FLAGS_SLOT)) { |
| 261 | pci_read_config_dword(dev, pos + PCI_EXP_SLTCAP, ®32); | 261 | pci_read_config_dword(dev, pos + PCI_EXP_SLTCAP, ®32); |
| 262 | if (reg32 & PCI_EXP_SLTCAP_HPC) | 262 | if (reg32 & PCI_EXP_SLTCAP_HPC) { |
| 263 | services |= PCIE_PORT_SERVICE_HP; | 263 | services |= PCIE_PORT_SERVICE_HP; |
| 264 | /* | ||
| 265 | * Disable hot-plug interrupts in case they have been | ||
| 266 | * enabled by the BIOS and the hot-plug service driver | ||
| 267 | * is not loaded. | ||
| 268 | */ | ||
| 269 | pos += PCI_EXP_SLTCTL; | ||
| 270 | pci_read_config_word(dev, pos, ®16); | ||
| 271 | reg16 &= ~(PCI_EXP_SLTCTL_CCIE | PCI_EXP_SLTCTL_HPIE); | ||
| 272 | pci_write_config_word(dev, pos, reg16); | ||
| 273 | } | ||
| 264 | } | 274 | } |
| 265 | /* AER capable */ | 275 | /* AER capable */ |
| 266 | if ((cap_mask & PCIE_PORT_SERVICE_AER) | 276 | if ((cap_mask & PCIE_PORT_SERVICE_AER) |
| 267 | && pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR)) | 277 | && pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR)) { |
| 268 | services |= PCIE_PORT_SERVICE_AER; | 278 | services |= PCIE_PORT_SERVICE_AER; |
| 279 | /* | ||
| 280 | * Disable AER on this port in case it's been enabled by the | ||
| 281 | * BIOS (the AER service driver will enable it when necessary). | ||
| 282 | */ | ||
| 283 | pci_disable_pcie_error_reporting(dev); | ||
| 284 | } | ||
| 269 | /* VC support */ | 285 | /* VC support */ |
| 270 | if (pci_find_ext_capability(dev, PCI_EXT_CAP_ID_VC)) | 286 | if (pci_find_ext_capability(dev, PCI_EXT_CAP_ID_VC)) |
| 271 | services |= PCIE_PORT_SERVICE_VC; | 287 | services |= PCIE_PORT_SERVICE_VC; |
| 272 | /* Root ports are capable of generating PME too */ | 288 | /* Root ports are capable of generating PME too */ |
| 273 | if ((cap_mask & PCIE_PORT_SERVICE_PME) | 289 | if ((cap_mask & PCIE_PORT_SERVICE_PME) |
| 274 | && dev->pcie_type == PCI_EXP_TYPE_ROOT_PORT) | 290 | && dev->pcie_type == PCI_EXP_TYPE_ROOT_PORT) { |
| 275 | services |= PCIE_PORT_SERVICE_PME; | 291 | services |= PCIE_PORT_SERVICE_PME; |
| 292 | /* | ||
| 293 | * Disable PME interrupt on this port in case it's been enabled | ||
| 294 | * by the BIOS (the PME service driver will enable it when | ||
| 295 | * necessary). | ||
| 296 | */ | ||
| 297 | pcie_pme_interrupt_enable(dev, false); | ||
| 298 | } | ||
| 276 | 299 | ||
| 277 | return services; | 300 | return services; |
| 278 | } | 301 | } |
