e1000e: Avoid kernel crash during shutdown

While doing shutdown on the PCI device, the corresponding callback
function e1000e_shutdown() is trying to clear those correctable
errors on the upstream P2P bridge. Unfortunately, we don't have
the upstream P2P bridge under some cases (e.g. PCI-passthrou for
KVM on Power). That leads to kernel crash eventually.

The patch adds one more check on that to avoid kernel crash.

Signed-off-by: Li Zhang <zhlcindy@gmail.com>
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
Li Zhang 2013-08-13 18:42:58 +00:00 committed by Jeff Kirsher
parent 13129d9b61
commit e8c254c5fe
1 changed files with 7 additions and 0 deletions

View File

@ -5999,11 +5999,18 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool runtime)
* correctable error when the MAC transitions from D0 to D3. To * correctable error when the MAC transitions from D0 to D3. To
* prevent this we need to mask off the correctable errors on the * prevent this we need to mask off the correctable errors on the
* downstream port of the pci-e switch. * downstream port of the pci-e switch.
*
* We don't have the associated upstream bridge while assigning
* the PCI device into guest. For example, the KVM on power is
* one of the cases.
*/ */
if (adapter->flags & FLAG_IS_QUAD_PORT) { if (adapter->flags & FLAG_IS_QUAD_PORT) {
struct pci_dev *us_dev = pdev->bus->self; struct pci_dev *us_dev = pdev->bus->self;
u16 devctl; u16 devctl;
if (!us_dev)
return 0;
pcie_capability_read_word(us_dev, PCI_EXP_DEVCTL, &devctl); pcie_capability_read_word(us_dev, PCI_EXP_DEVCTL, &devctl);
pcie_capability_write_word(us_dev, PCI_EXP_DEVCTL, pcie_capability_write_word(us_dev, PCI_EXP_DEVCTL,
(devctl & ~PCI_EXP_DEVCTL_CERE)); (devctl & ~PCI_EXP_DEVCTL_CERE));