net: hns3: fix setting of the hns reset_type for rdma hw errors
authorShiju Jose <shiju.jose@huawei.com>
Sat, 23 Feb 2019 09:22:18 +0000 (17:22 +0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 25 Feb 2019 04:27:50 +0000 (20:27 -0800)
Presently the hns reset_type for the roce errors is set
in the hclge_log_and_clear_rocee_ras_error function.
This function is also called to detect and clear roce errors
while enabling the rdma error interrupts. However there is no hns
reset requested for this case. This can cause issue of wrong
reset_type used with subsequent hns reset as the
reset_type set in the above case was not cleared.

This patch moves setting of hns reset_type for the roce errors from
hclge_log_and_clear_rocee_ras_error function
to hclge_handle_rocee_ras_error.

Fixes: 630ba007f475 ("net: hns3: add handling of RDMA RAS errors")
Reported-by: Huazhong Tan <tanhuazhong@huawei.com>
Reported-by: Xiaofei Tan <tanxiaofei@huawei.com>
Signed-off-by: Shiju Jose <shiju.jose@huawei.com>
Signed-off-by: Peng Li <lipeng321@huawei.com>
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c

index b9d363fa595ab1fc87868d0811bad249f65fa165..1feceff1477cea9700ede728e473dca6765483d4 100644 (file)
@@ -1148,10 +1148,10 @@ static int hclge_log_rocee_ovf_error(struct hclge_dev *hdev)
        return 0;
 }
 
-static int hclge_log_and_clear_rocee_ras_error(struct hclge_dev *hdev)
+static enum hnae3_reset_type
+hclge_log_and_clear_rocee_ras_error(struct hclge_dev *hdev)
 {
-       enum hnae3_reset_type reset_type = HNAE3_FUNC_RESET;
-       struct hnae3_ae_dev *ae_dev = hdev->ae_dev;
+       enum hnae3_reset_type reset_type = HNAE3_NONE_RESET;
        struct device *dev = &hdev->pdev->dev;
        struct hclge_desc desc[2];
        unsigned int status;
@@ -1164,17 +1164,20 @@ static int hclge_log_and_clear_rocee_ras_error(struct hclge_dev *hdev)
        if (ret) {
                dev_err(dev, "failed(%d) to query ROCEE RAS INT SRC\n", ret);
                /* reset everything for now */
-               HCLGE_SET_DEFAULT_RESET_REQUEST(HNAE3_GLOBAL_RESET);
-               return ret;
+               return HNAE3_GLOBAL_RESET;
        }
 
        status = le32_to_cpu(desc[0].data[0]);
 
-       if (status & HCLGE_ROCEE_RERR_INT_MASK)
+       if (status & HCLGE_ROCEE_RERR_INT_MASK) {
                dev_warn(dev, "ROCEE RAS AXI rresp error\n");
+               reset_type = HNAE3_FUNC_RESET;
+       }
 
-       if (status & HCLGE_ROCEE_BERR_INT_MASK)
+       if (status & HCLGE_ROCEE_BERR_INT_MASK) {
                dev_warn(dev, "ROCEE RAS AXI bresp error\n");
+               reset_type = HNAE3_FUNC_RESET;
+       }
 
        if (status & HCLGE_ROCEE_ECC_INT_MASK) {
                dev_warn(dev, "ROCEE RAS 2bit ECC error\n");
@@ -1186,9 +1189,9 @@ static int hclge_log_and_clear_rocee_ras_error(struct hclge_dev *hdev)
                if (ret) {
                        dev_err(dev, "failed(%d) to process ovf error\n", ret);
                        /* reset everything for now */
-                       HCLGE_SET_DEFAULT_RESET_REQUEST(HNAE3_GLOBAL_RESET);
-                       return ret;
+                       return HNAE3_GLOBAL_RESET;
                }
+               reset_type = HNAE3_FUNC_RESET;
        }
 
        /* clear error status */
@@ -1197,12 +1200,10 @@ static int hclge_log_and_clear_rocee_ras_error(struct hclge_dev *hdev)
        if (ret) {
                dev_err(dev, "failed(%d) to clear ROCEE RAS error\n", ret);
                /* reset everything for now */
-               reset_type = HNAE3_GLOBAL_RESET;
+               return HNAE3_GLOBAL_RESET;
        }
 
-       HCLGE_SET_DEFAULT_RESET_REQUEST(reset_type);
-
-       return ret;
+       return reset_type;
 }
 
 static int hclge_config_rocee_ras_interrupt(struct hclge_dev *hdev, bool en)
@@ -1232,15 +1233,18 @@ static int hclge_config_rocee_ras_interrupt(struct hclge_dev *hdev, bool en)
        return ret;
 }
 
-static int hclge_handle_rocee_ras_error(struct hnae3_ae_dev *ae_dev)
+static void hclge_handle_rocee_ras_error(struct hnae3_ae_dev *ae_dev)
 {
+       enum hnae3_reset_type reset_type = HNAE3_NONE_RESET;
        struct hclge_dev *hdev = ae_dev->priv;
 
        if (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state) ||
            hdev->pdev->revision < 0x21)
-               return HNAE3_NONE_RESET;
+               return;
 
-       return hclge_log_and_clear_rocee_ras_error(hdev);
+       reset_type = hclge_log_and_clear_rocee_ras_error(hdev);
+       if (reset_type != HNAE3_NONE_RESET)
+               HCLGE_SET_DEFAULT_RESET_REQUEST(reset_type);
 }
 
 static const struct hclge_hw_blk hw_blk[] = {