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:
parent
13129d9b61
commit
e8c254c5fe
|
@ -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));
|
||||||
|
|
Loading…
Reference in New Issue