Skip to content

Commit

Permalink
e1000e: add aer support
Browse files Browse the repository at this point in the history
most if not all of the devices supported by e1000e support
AER (Advanced Error Reporting) so we attempt to register
with the OS that we know how to reset ourselves after
a fatal error.

Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
jbrandeb authored and davem330 committed Feb 11, 2009
1 parent b4ac530 commit 111b9dc
Showing 1 changed file with 30 additions and 9 deletions.
39 changes: 30 additions & 9 deletions drivers/net/e1000e/netdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
#include <linux/cpu.h>
#include <linux/smp.h>
#include <linux/pm_qos_params.h>
#include <linux/aer.h>

#include "e1000.h"

Expand Down Expand Up @@ -4521,6 +4522,14 @@ static int e1000_resume(struct pci_dev *pdev)
return err;
}

/* AER (Advanced Error Reporting) hooks */
err = pci_enable_pcie_error_reporting(pdev);
if (err) {
dev_err(&pdev->dev, "pci_enable_pcie_error_reporting failed "
"0x%x\n", err);
/* non-fatal, continue */
}

pci_set_master(pdev);

pci_enable_wake(pdev, PCI_D3hot, 0);
Expand Down Expand Up @@ -4615,24 +4624,29 @@ static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev)
struct e1000_adapter *adapter = netdev_priv(netdev);
struct e1000_hw *hw = &adapter->hw;
int err;
pci_ers_result_t result;

e1000e_disable_l1aspm(pdev);
err = pci_enable_device_mem(pdev);
if (err) {
dev_err(&pdev->dev,
"Cannot re-enable PCI device after reset.\n");
return PCI_ERS_RESULT_DISCONNECT;
}
pci_set_master(pdev);
pci_restore_state(pdev);
result = PCI_ERS_RESULT_DISCONNECT;
} else {
pci_set_master(pdev);
pci_restore_state(pdev);

pci_enable_wake(pdev, PCI_D3hot, 0);
pci_enable_wake(pdev, PCI_D3cold, 0);
pci_enable_wake(pdev, PCI_D3hot, 0);
pci_enable_wake(pdev, PCI_D3cold, 0);

e1000e_reset(adapter);
ew32(WUS, ~0);
e1000e_reset(adapter);
ew32(WUS, ~0);
result = PCI_ERS_RESULT_RECOVERED;
}

return PCI_ERS_RESULT_RECOVERED;
pci_cleanup_aer_uncorrect_error_status(pdev);

return result;
}

/**
Expand Down Expand Up @@ -5063,6 +5077,7 @@ static void __devexit e1000_remove(struct pci_dev *pdev)
{
struct net_device *netdev = pci_get_drvdata(pdev);
struct e1000_adapter *adapter = netdev_priv(netdev);
int err;

/*
* flush_scheduled work may reschedule our watchdog task, so
Expand Down Expand Up @@ -5097,6 +5112,12 @@ static void __devexit e1000_remove(struct pci_dev *pdev)

free_netdev(netdev);

/* AER disable */
err = pci_disable_pcie_error_reporting(pdev);
if (err)
dev_err(&pdev->dev,
"pci_disable_pcie_error_reporting failed 0x%x\n", err);

pci_disable_device(pdev);
}

Expand Down

0 comments on commit 111b9dc

Please sign in to comment.