From d494389a95f3f5ee45508f7e487fa86919a23f4a Mon Sep 17 00:00:00 2001
From: Yonglong Liu <liuyonglong@huawei.com>
Date: Thu, 22 Sep 2022 20:27:16 +0800
Subject: [PATCH] net: hns3: fix error resume keep alive when remove hclgevf

driver inclusion
category: https://gitee.com/openeuler/kernel/issues/I5S7WZ
bugzilla: NA
CVE: NA

----------------------------

When enable lots of vf, remove the driver of vf will call keep
alive wrong resume.

Fixes: 6a804d0a6068 ("net: hns3: fix keep alive can not resume problem when system busy")

Signed-off-by: Yonglong Liu <liuyonglong@huawei.com>
Reviewed-by: li yongxin <liyongxin1@huawei.com>
Signed-off-by: Laibin Qiu <qiulaibin@huawei.com>
---
 drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 2 ++
 drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h | 1 +
 drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c  | 3 ++-
 3 files changed, 5 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 41a12df725b3..b4b1e440fba4 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
@@ -7096,6 +7096,7 @@ int hclge_vport_start(struct hclge_vport *vport)
 	struct hclge_dev *hdev = vport->back;
 
 	vport->last_active_jiffies = jiffies;
+	set_bit(HCLGE_VPORT_STATE_START, &vport->state);
 	set_bit(HCLGE_VPORT_STATE_ALIVE, &vport->state);
 
 	if (test_bit(vport->vport_id, hdev->vport_config_block)) {
@@ -7113,6 +7114,7 @@ int hclge_vport_start(struct hclge_vport *vport)
 
 void hclge_vport_stop(struct hclge_vport *vport)
 {
+	clear_bit(HCLGE_VPORT_STATE_START, &vport->state);
 	clear_bit(HCLGE_VPORT_STATE_ALIVE, &vport->state);
 }
 
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
index 8477dc343a40..99a55fa74cd4 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
@@ -926,6 +926,7 @@ enum HCLGE_VPORT_STATE {
 	HCLGE_VPORT_STATE_MAC_TBL_CHANGE,
 	HCLGE_VPORT_STATE_PROMISC_CHANGE,
 	HCLGE_VPORT_STATE_VLAN_FLTR_CHANGE,
+	HCLGE_VPORT_STATE_START,
 	HCLGE_VPORT_STATE_MAX
 };
 
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
index 45f94cd33524..893f6e0ce473 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
@@ -644,7 +644,8 @@ static void hclge_vf_keep_alive(struct hclge_vport *vport)
 
 	vport->last_active_jiffies = jiffies;
 
-	if (!test_bit(HCLGE_VPORT_STATE_ALIVE, &vport->state)) {
+	if (test_bit(HCLGE_VPORT_STATE_START, &vport->state) &&
+	    !test_bit(HCLGE_VPORT_STATE_ALIVE, &vport->state)) {
 		set_bit(HCLGE_VPORT_STATE_ALIVE, &vport->state);
 
 		dev_info(&hdev->pdev->dev, "VF %u keep alive resume!",
-- 
GitLab