net: hns3: add compatible handling for command HCLGE_OPC_PF_RST_DONE
authorHuazhong Tan <tanhuazhong@huawei.com>
Thu, 7 Nov 2019 01:30:19 +0000 (09:30 +0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 7 Nov 2019 05:46:56 +0000 (21:46 -0800)
Since old firmware does not support HCLGE_OPC_PF_RST_DONE, it will
return -EOPNOTSUPP to the driver when received this command. So
for this case, it should just print a warning and return success
to the caller.

Fixes: 72e2fb07997c ("net: hns3: clear reset interrupt status in hclge_irq_handle()")
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c

index e02e01b..16f7d0e 100644 (file)
@@ -3587,12 +3587,28 @@ static int hclge_set_rst_done(struct hclge_dev *hdev)
 {
        struct hclge_pf_rst_done_cmd *req;
        struct hclge_desc desc;
+       int ret;
 
        req = (struct hclge_pf_rst_done_cmd *)desc.data;
        hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_PF_RST_DONE, false);
        req->pf_rst_done |= HCLGE_PF_RESET_DONE_BIT;
 
-       return hclge_cmd_send(&hdev->hw, &desc, 1);
+       ret = hclge_cmd_send(&hdev->hw, &desc, 1);
+       /* To be compatible with the old firmware, which does not support
+        * command HCLGE_OPC_PF_RST_DONE, just print a warning and
+        * return success
+        */
+       if (ret == -EOPNOTSUPP) {
+               dev_warn(&hdev->pdev->dev,
+                        "current firmware does not support command(0x%x)!\n",
+                        HCLGE_OPC_PF_RST_DONE);
+               return 0;
+       } else if (ret) {
+               dev_err(&hdev->pdev->dev, "assert PF reset done fail %d!\n",
+                       ret);
+       }
+
+       return ret;
 }
 
 static int hclge_reset_prepare_up(struct hclge_dev *hdev)