From 61d05ad3607cd8294dc32add0cd35bf6ac9e6116 Mon Sep 17 00:00:00 2001 From: Huazhong Tan Date: Fri, 28 Jun 2019 14:53:44 +0800 Subject: [PATCH] net: hns3: supplement reset error handling driver inclusion category: bugfix bugzilla: NA CVE: NA When reset fails, the driver should keep its handshake status with the hardware, otherwise the hardware will wait for this failing driver and do nothing anymore. Also, this patch deals with the continuous IMP reset case. Feature or Bugfix:Bugfix Signed-off-by: Huazhong Tan Reviewed-by: lipeng Reviewed-by: Yang Yingliang Signed-off-by: Yang Yingliang --- drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 4 +++- drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c index f211bbfb54fe..147d0bc8bffa 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c @@ -3337,7 +3337,7 @@ static bool hclge_reset_err_handle(struct hclge_dev *hdev, bool is_timeout) } else if (hdev->reset_fail_cnt < HCLGE_RESET_MAX_FAIL_CNT) { hdev->reset_fail_cnt++; - if (is_timeout) { + if (hdev->reset_type == HNAE3_IMP_RESET || is_timeout) { set_bit(hdev->reset_type, &hdev->reset_pending); dev_info(&hdev->pdev->dev, "re-schedule to wait for hw reset done\n"); @@ -3354,6 +3354,8 @@ static bool hclge_reset_err_handle(struct hclge_dev *hdev, bool is_timeout) } hclge_clear_reset_cause(hdev); + hclge_write_dev(&hdev->hw, HCLGE_NIC_CSQ_DEPTH_REG, + HCLGE_NIC_CMQ_ENABLE); if (handle && handle->ae_algo->ops->reset_done) handle->ae_algo->ops->reset_done(handle, false); diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c index 7ef7eb1e907e..e64d694be431 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c @@ -1480,6 +1480,9 @@ static void hclgevf_reset_err_handle(struct hclgevf_dev *hdev) if (hclgevf_is_reset_pending(hdev)) { set_bit(HCLGEVF_RESET_PENDING, &hdev->reset_state); hclgevf_reset_task_schedule(hdev); + } else { + hclgevf_write_dev(&hdev->hw, HCLGEVF_NIC_CSQ_DEPTH_REG, + HCLGEVF_NIC_CMQ_ENABLE); } } -- GitLab