diff options
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/e1000e/netdev.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index cc0502bbb9ff..ebbb9f061c87 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c | |||
@@ -4462,7 +4462,27 @@ static int e1000_suspend(struct pci_dev *pdev, pm_message_t state) | |||
4462 | 4462 | ||
4463 | pci_disable_device(pdev); | 4463 | pci_disable_device(pdev); |
4464 | 4464 | ||
4465 | pci_set_power_state(pdev, pci_choose_state(pdev, state)); | 4465 | /* |
4466 | * The pci-e switch on some quad port adapters will report a | ||
4467 | * correctable error when the MAC transitions from D0 to D3. To | ||
4468 | * prevent this we need to mask off the correctable errors on the | ||
4469 | * downstream port of the pci-e switch. | ||
4470 | */ | ||
4471 | if (adapter->flags & FLAG_IS_QUAD_PORT) { | ||
4472 | struct pci_dev *us_dev = pdev->bus->self; | ||
4473 | int pos = pci_find_capability(us_dev, PCI_CAP_ID_EXP); | ||
4474 | u16 devctl; | ||
4475 | |||
4476 | pci_read_config_word(us_dev, pos + PCI_EXP_DEVCTL, &devctl); | ||
4477 | pci_write_config_word(us_dev, pos + PCI_EXP_DEVCTL, | ||
4478 | (devctl & ~PCI_EXP_DEVCTL_CERE)); | ||
4479 | |||
4480 | pci_set_power_state(pdev, pci_choose_state(pdev, state)); | ||
4481 | |||
4482 | pci_write_config_word(us_dev, pos + PCI_EXP_DEVCTL, devctl); | ||
4483 | } else { | ||
4484 | pci_set_power_state(pdev, pci_choose_state(pdev, state)); | ||
4485 | } | ||
4466 | 4486 | ||
4467 | return 0; | 4487 | return 0; |
4468 | } | 4488 | } |