bnx2x: Add AER support (missing bits)

This function adds several OS calls required to fully enable PCIe AER support -
pci_enable_pcie_error_reporting() and pci_cleanup_aer_uncorrect_error_status().

Signed-off-by: Yuval Mintz <yuvalmin@broadcom.com>
Signed-off-by: Ariel Elior <ariele@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Yuval Mintz 2013-12-26 09:57:08 +02:00 committed by David S. Miller
parent 91ebb929b6
commit 33d8e6a5f5
2 changed files with 30 additions and 0 deletions

View File

@ -1546,6 +1546,7 @@ struct bnx2x {
#define INTERRUPTS_ENABLED_FLAG (1 << 23) #define INTERRUPTS_ENABLED_FLAG (1 << 23)
#define BC_SUPPORTS_RMMOD_CMD (1 << 24) #define BC_SUPPORTS_RMMOD_CMD (1 << 24)
#define HAS_PHYS_PORT_ID (1 << 25) #define HAS_PHYS_PORT_ID (1 << 25)
#define AER_ENABLED (1 << 26)
#define BP_NOMCP(bp) ((bp)->flags & NO_MCP_FLAG) #define BP_NOMCP(bp) ((bp)->flags & NO_MCP_FLAG)

View File

@ -27,6 +27,7 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/aer.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
@ -12225,6 +12226,14 @@ static int bnx2x_set_coherency_mask(struct bnx2x *bp)
return 0; return 0;
} }
static void bnx2x_disable_pcie_error_reporting(struct bnx2x *bp)
{
if (bp->flags & AER_ENABLED) {
pci_disable_pcie_error_reporting(bp->pdev);
bp->flags &= ~AER_ENABLED;
}
}
static int bnx2x_init_dev(struct bnx2x *bp, struct pci_dev *pdev, static int bnx2x_init_dev(struct bnx2x *bp, struct pci_dev *pdev,
struct net_device *dev, unsigned long board_type) struct net_device *dev, unsigned long board_type)
{ {
@ -12331,6 +12340,14 @@ static int bnx2x_init_dev(struct bnx2x *bp, struct pci_dev *pdev,
/* clean indirect addresses */ /* clean indirect addresses */
pci_write_config_dword(bp->pdev, PCICFG_GRC_ADDRESS, pci_write_config_dword(bp->pdev, PCICFG_GRC_ADDRESS,
PCICFG_VENDOR_ID_OFFSET); PCICFG_VENDOR_ID_OFFSET);
/* AER (Advanced Error reporting) configuration */
rc = pci_enable_pcie_error_reporting(pdev);
if (!rc)
bp->flags |= AER_ENABLED;
else
BNX2X_DEV_INFO("Failed To configure PCIe AER [%d]\n", rc);
/* /*
* Clean the following indirect addresses for all functions since it * Clean the following indirect addresses for all functions since it
* is not used by the driver. * is not used by the driver.
@ -12938,6 +12955,8 @@ static int bnx2x_init_one(struct pci_dev *pdev,
return 0; return 0;
init_one_exit: init_one_exit:
bnx2x_disable_pcie_error_reporting(bp);
if (bp->regview) if (bp->regview)
iounmap(bp->regview); iounmap(bp->regview);
@ -13011,6 +13030,8 @@ static void __bnx2x_remove(struct pci_dev *pdev,
pci_set_power_state(pdev, PCI_D3hot); pci_set_power_state(pdev, PCI_D3hot);
} }
bnx2x_disable_pcie_error_reporting(bp);
if (bp->regview) if (bp->regview)
iounmap(bp->regview); iounmap(bp->regview);
@ -13188,6 +13209,14 @@ static pci_ers_result_t bnx2x_io_slot_reset(struct pci_dev *pdev)
rtnl_unlock(); rtnl_unlock();
/* If AER, perform cleanup of the PCIe registers */
if (bp->flags & AER_ENABLED) {
if (pci_cleanup_aer_uncorrect_error_status(pdev))
BNX2X_ERR("pci_cleanup_aer_uncorrect_error_status failed\n");
else
DP(NETIF_MSG_HW, "pci_cleanup_aer_uncorrect_error_status succeeded\n");
}
return PCI_ERS_RESULT_RECOVERED; return PCI_ERS_RESULT_RECOVERED;
} }