net: hns3: add handler for NCSI error mailbox
authorHuazhong Tan <tanhuazhong@huawei.com>
Thu, 1 Aug 2019 03:55:35 +0000 (11:55 +0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 1 Aug 2019 17:32:12 +0000 (13:32 -0400)
When NCSI has HW error, the IMP will report this error to the driver
by sending a mailbox. After received this message, the driver should
assert a global reset to fix this kind of HW error.

Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
Reviewed-by: Peng Li <lipeng321@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c

index 1564be5e148b03b852d18c49d79b4e72436da3d7..f8a87f8ca9833001505c27efc5ed65fa6cba384b 100644 (file)
@@ -48,6 +48,7 @@ enum HCLGE_MBX_OPCODE {
 
        HCLGE_MBX_GET_VF_FLR_STATUS = 200, /* (M7 -> PF) get vf reset status */
        HCLGE_MBX_PUSH_LINK_STATUS,     /* (M7 -> PF) get port link status */
+       HCLGE_MBX_NCSI_ERROR,           /* (M7 -> PF) receive a NCSI error */
 };
 
 /* below are per-VF mac-vlan subcodes */
index 538d1017592a2a36846a79b648267418481b9e0c..c20b972d21f78878157ec293ea9c6bcbdd6d24f8 100644 (file)
@@ -394,6 +394,7 @@ static int hclge_firmware_compat_config(struct hclge_dev *hdev)
        req = (struct hclge_firmware_compat_cmd *)desc.data;
 
        hnae3_set_bit(compat, HCLGE_LINK_EVENT_REPORT_EN_B, 1);
+       hnae3_set_bit(compat, HCLGE_NCSI_ERROR_REPORT_EN_B, 1);
        req->compat = cpu_to_le32(compat);
 
        return hclge_cmd_send(&hdev->hw, &desc, 1);
index 743c9f41c67ea2a9d2a41948e03762bc05b1482e..070b9ddb6ffe0d8d05e472fc778e186d606ab4d0 100644 (file)
@@ -1011,6 +1011,7 @@ struct hclge_query_ppu_pf_other_int_dfx_cmd {
 };
 
 #define HCLGE_LINK_EVENT_REPORT_EN_B   0
+#define HCLGE_NCSI_ERROR_REPORT_EN_B   1
 struct hclge_firmware_compat_cmd {
        __le32 compat;
        u8 rsv[20];
index 87de32dfa6c838d2045b03fa498760e4c1e1f6ce..5a7221ee6bb96a2bad97d1740b25aacacbc5ef20 100644 (file)
@@ -582,6 +582,15 @@ static bool hclge_cmd_crq_empty(struct hclge_hw *hw)
        return tail == hw->cmq.crq.next_to_use;
 }
 
+static void hclge_handle_ncsi_error(struct hclge_dev *hdev)
+{
+       struct hnae3_ae_dev *ae_dev = hdev->ae_dev;
+
+       ae_dev->ops->set_default_reset_request(ae_dev, HNAE3_GLOBAL_RESET);
+       dev_warn(&hdev->pdev->dev, "requesting reset due to NCSI error\n");
+       ae_dev->ops->reset_event(hdev->pdev, NULL);
+}
+
 void hclge_mbx_handler(struct hclge_dev *hdev)
 {
        struct hclge_cmq_ring *crq = &hdev->hw.cmq.crq;
@@ -740,6 +749,9 @@ void hclge_mbx_handler(struct hclge_dev *hdev)
                case HCLGE_MBX_PUSH_LINK_STATUS:
                        hclge_handle_link_change_event(hdev, req);
                        break;
+               case HCLGE_MBX_NCSI_ERROR:
+                       hclge_handle_ncsi_error(hdev);
+                       break;
                default:
                        dev_err(&hdev->pdev->dev,
                                "un-supported mailbox message, code = %d\n",