diff options
author | Shiju Jose | 2018-10-19 21:15:27 +0200 |
---|---|---|
committer | David S. Miller | 2018-10-23 04:31:13 +0200 |
commit | 6ae4e733cdd4e0e6e7069abe40197fc456e2eeea (patch) | |
tree | c7055c93aa7da4df92bcde919f37569a40be3426 /drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | |
parent | net: hns3: Add PCIe AER callback error_detected (diff) | |
download | kernel-qcow2-linux-6ae4e733cdd4e0e6e7069abe40197fc456e2eeea.tar.gz kernel-qcow2-linux-6ae4e733cdd4e0e6e7069abe40197fc456e2eeea.tar.xz kernel-qcow2-linux-6ae4e733cdd4e0e6e7069abe40197fc456e2eeea.zip |
net: hns3: Add PCIe AER error recovery
This patch adds the error recovery for the HNS hw errors.
Signed-off-by: Shiju Jose <shiju.jose@huawei.com>
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/hisilicon/hns3/hns3_enet.c')
-rw-r--r-- | drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c index 3c6fa39831e3..32f3aca814e7 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c @@ -9,6 +9,7 @@ #include <linux/ipv6.h> #include <linux/module.h> #include <linux/pci.h> +#include <linux/aer.h> #include <linux/skbuff.h> #include <linux/sctp.h> #include <linux/vermagic.h> @@ -1613,7 +1614,7 @@ static void hns3_nic_net_timeout(struct net_device *ndev) /* request the reset */ if (h->ae_algo->ops->reset_event) - h->ae_algo->ops->reset_event(h); + h->ae_algo->ops->reset_event(h->pdev, h); } static const struct net_device_ops hns3_nic_netdev_ops = { @@ -1796,8 +1797,25 @@ static pci_ers_result_t hns3_error_detected(struct pci_dev *pdev, return ret; } +static pci_ers_result_t hns3_slot_reset(struct pci_dev *pdev) +{ + struct hnae3_ae_dev *ae_dev = pci_get_drvdata(pdev); + struct device *dev = &pdev->dev; + + dev_info(dev, "requesting reset due to PCI error\n"); + + /* request the reset */ + if (ae_dev->ops->reset_event) { + ae_dev->ops->reset_event(pdev, NULL); + return PCI_ERS_RESULT_RECOVERED; + } + + return PCI_ERS_RESULT_DISCONNECT; +} + static const struct pci_error_handlers hns3_err_handler = { .error_detected = hns3_error_detected, + .slot_reset = hns3_slot_reset, }; static struct pci_driver hns3_driver = { |