aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorLi Zhang <zhlcindy@gmail.com>2013-08-13 18:42:58 +0000
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2013-08-22 02:33:20 -0700
commite8c254c5feb92c5b9a6950bc7351e2b1b7b09b93 (patch)
tree610e063e33db35281e7a27f908e75708bc077eb5 /drivers
parente1000e: Add code to check for failure of pci_disable_link_state call (diff)
downloadlinux-dev-e8c254c5feb92c5b9a6950bc7351e2b1b7b09b93.tar.xz
linux-dev-e8c254c5feb92c5b9a6950bc7351e2b1b7b09b93.zip
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>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/ethernet/intel/e1000e/netdev.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c
index 59c0c5413797..e87e9b01f404 100644
--- a/drivers/net/ethernet/intel/e1000e/netdev.c
+++ b/drivers/net/ethernet/intel/e1000e/netdev.c
@@ -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
* prevent this we need to mask off the correctable errors on the
* 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) {
struct pci_dev *us_dev = pdev->bus->self;
u16 devctl;
+ if (!us_dev)
+ return 0;
+
pcie_capability_read_word(us_dev, PCI_EXP_DEVCTL, &devctl);
pcie_capability_write_word(us_dev, PCI_EXP_DEVCTL,
(devctl & ~PCI_EXP_DEVCTL_CERE));