Skip to content

Commit 5a9f0ea

Browse files
shijujose4davem330
authored andcommitted
net: hns3: Add PCIe AER callback error_detected
Set of hw errors occurred in the HNS3 are reported to the hns3 driver through PCIe AER and RAS.The error info will be processed and appropriately recovered. This patch adds error_detected callback and error processing. Signed-off-by: Shiju Jose <[email protected]> Signed-off-by: Salil Mehta <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent aeb5e02 commit 5a9f0ea

File tree

6 files changed

+101
-1
lines changed

6 files changed

+101
-1
lines changed

drivers/net/ethernet/hisilicon/hns3/hnae3.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,7 @@ struct hnae3_ae_ops {
429429
struct ethtool_rxnfc *cmd, u32 *rule_locs);
430430
int (*restore_fd_rules)(struct hnae3_handle *handle);
431431
void (*enable_fd)(struct hnae3_handle *handle, bool enable);
432+
pci_ers_result_t (*process_hw_error)(struct hnae3_ae_dev *ae_dev);
432433
};
433434

434435
struct hnae3_dcb_ops {

drivers/net/ethernet/hisilicon/hns3/hns3_enet.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1771,13 +1771,43 @@ static void hns3_shutdown(struct pci_dev *pdev)
17711771
pci_set_power_state(pdev, PCI_D3hot);
17721772
}
17731773

1774+
static pci_ers_result_t hns3_error_detected(struct pci_dev *pdev,
1775+
pci_channel_state_t state)
1776+
{
1777+
struct hnae3_ae_dev *ae_dev = pci_get_drvdata(pdev);
1778+
pci_ers_result_t ret;
1779+
1780+
dev_info(&pdev->dev, "PCI error detected, state(=%d)!!\n", state);
1781+
1782+
if (state == pci_channel_io_perm_failure)
1783+
return PCI_ERS_RESULT_DISCONNECT;
1784+
1785+
if (!ae_dev) {
1786+
dev_err(&pdev->dev,
1787+
"Can't recover - error happened during device init\n");
1788+
return PCI_ERS_RESULT_NONE;
1789+
}
1790+
1791+
if (ae_dev->ops->process_hw_error)
1792+
ret = ae_dev->ops->process_hw_error(ae_dev);
1793+
else
1794+
return PCI_ERS_RESULT_NONE;
1795+
1796+
return ret;
1797+
}
1798+
1799+
static const struct pci_error_handlers hns3_err_handler = {
1800+
.error_detected = hns3_error_detected,
1801+
};
1802+
17741803
static struct pci_driver hns3_driver = {
17751804
.name = hns3_driver_name,
17761805
.id_table = hns3_pci_tbl,
17771806
.probe = hns3_probe,
17781807
.remove = hns3_remove,
17791808
.shutdown = hns3_shutdown,
17801809
.sriov_configure = hns3_pci_sriov_configure,
1810+
.err_handler = &hns3_err_handler,
17811811
};
17821812

17831813
/* set default feature to hns3 */

drivers/net/ethernet/hisilicon/hns3/hns3pf/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@
66
ccflags-y := -Idrivers/net/ethernet/hisilicon/hns3
77

88
obj-$(CONFIG_HNS3_HCLGE) += hclge.o
9-
hclge-objs = hclge_main.o hclge_cmd.o hclge_mdio.o hclge_tm.o hclge_mbx.o
9+
hclge-objs = hclge_main.o hclge_cmd.o hclge_mdio.o hclge_tm.o hclge_mbx.o hclge_err.o
1010

1111
hclge-$(CONFIG_HNS3_DCB) += hclge_dcb.o
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// SPDX-License-Identifier: GPL-2.0+
2+
/* Copyright (c) 2016-2017 Hisilicon Limited. */
3+
4+
#include "hclge_err.h"
5+
6+
static const struct hclge_hw_blk hw_blk[] = {
7+
{ /* sentinel */ }
8+
};
9+
10+
pci_ers_result_t hclge_process_ras_hw_error(struct hnae3_ae_dev *ae_dev)
11+
{
12+
struct hclge_dev *hdev = ae_dev->priv;
13+
struct device *dev = &hdev->pdev->dev;
14+
u32 sts, val;
15+
int i = 0;
16+
17+
sts = hclge_read_dev(&hdev->hw, HCLGE_RAS_PF_OTHER_INT_STS_REG);
18+
19+
/* Processing Non-fatal errors */
20+
if (sts & HCLGE_RAS_REG_NFE_MASK) {
21+
val = (sts >> HCLGE_RAS_REG_NFE_SHIFT) & 0xFF;
22+
i = 0;
23+
while (hw_blk[i].name) {
24+
if (!(hw_blk[i].msk & val)) {
25+
i++;
26+
continue;
27+
}
28+
dev_warn(dev, "%s ras non-fatal error identified\n",
29+
hw_blk[i].name);
30+
if (hw_blk[i].process_error)
31+
hw_blk[i].process_error(hdev,
32+
HCLGE_ERR_INT_RAS_NFE);
33+
i++;
34+
}
35+
}
36+
37+
return PCI_ERS_RESULT_NEED_RESET;
38+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/* SPDX-License-Identifier: GPL-2.0+ */
2+
/* Copyright (c) 2016-2017 Hisilicon Limited. */
3+
4+
#ifndef __HCLGE_ERR_H
5+
#define __HCLGE_ERR_H
6+
7+
#include "hclge_main.h"
8+
9+
#define HCLGE_RAS_PF_OTHER_INT_STS_REG 0x20B00
10+
#define HCLGE_RAS_REG_FE_MASK 0xFF
11+
#define HCLGE_RAS_REG_NFE_MASK 0xFF00
12+
#define HCLGE_RAS_REG_NFE_SHIFT 8
13+
14+
enum hclge_err_int_type {
15+
HCLGE_ERR_INT_MSIX = 0,
16+
HCLGE_ERR_INT_RAS_CE = 1,
17+
HCLGE_ERR_INT_RAS_NFE = 2,
18+
HCLGE_ERR_INT_RAS_FE = 3,
19+
};
20+
21+
struct hclge_hw_blk {
22+
u32 msk;
23+
const char *name;
24+
void (*process_error)(struct hclge_dev *hdev,
25+
enum hclge_err_int_type type);
26+
};
27+
28+
pci_ers_result_t hclge_process_ras_hw_error(struct hnae3_ae_dev *ae_dev);
29+
#endif

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "hclge_mbx.h"
2020
#include "hclge_mdio.h"
2121
#include "hclge_tm.h"
22+
#include "hclge_err.h"
2223
#include "hnae3.h"
2324

2425
#define HCLGE_NAME "hclge"
@@ -7312,6 +7313,7 @@ static const struct hnae3_ae_ops hclge_ops = {
73127313
.get_fd_all_rules = hclge_get_all_rules,
73137314
.restore_fd_rules = hclge_restore_fd_entries,
73147315
.enable_fd = hclge_enable_fd,
7316+
.process_hw_error = hclge_process_ras_hw_error,
73157317
};
73167318

73177319
static struct hnae3_ae_algo ae_algo = {

0 commit comments

Comments
 (0)