Thomas Bogendoerfer 7f7d70
From: liuzhongzhu <liuzhongzhu@huawei.com>
Thomas Bogendoerfer 7f7d70
Date: Wed, 20 Feb 2019 10:32:48 +0800
Thomas Bogendoerfer 7f7d70
Subject: net: hns3: Record VF unicast and multicast tables
Thomas Bogendoerfer 7f7d70
Patch-mainline: v5.1-rc1
Thomas Bogendoerfer 7f7d70
Git-commit: 6dd86902f21d096ed7ef2dcc921ee80c73807313
Thomas Bogendoerfer 7f7d70
References: bsc#1126390
Thomas Bogendoerfer 7f7d70
Thomas Bogendoerfer 7f7d70
Record the unicast and multicast tables that the VF sends to the chip.
Thomas Bogendoerfer 7f7d70
After the VF exception, the PF actively clears the VF to chip config.
Thomas Bogendoerfer 7f7d70
Thomas Bogendoerfer 7f7d70
Signed-off-by: liuzhongzhu <liuzhongzhu@huawei.com>
Thomas Bogendoerfer 7f7d70
Signed-off-by: Peng Li <lipeng321@huawei.com>
Thomas Bogendoerfer 7f7d70
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
Thomas Bogendoerfer 7f7d70
Signed-off-by: David S. Miller <davem@davemloft.net>
Thomas Bogendoerfer 7f7d70
Acked-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
Thomas Bogendoerfer 7f7d70
---
Thomas Bogendoerfer 7f7d70
 drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h         |    2 
Thomas Bogendoerfer 7f7d70
 drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c |  102 ++++++++++++++++
Thomas Bogendoerfer 7f7d70
 drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h |   25 +++
Thomas Bogendoerfer 7f7d70
 drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c  |   28 ++++
Thomas Bogendoerfer 7f7d70
 4 files changed, 156 insertions(+), 1 deletion(-)
Thomas Bogendoerfer 7f7d70
Thomas Bogendoerfer 7f7d70
--- a/drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h
Thomas Bogendoerfer 7f7d70
+++ b/drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h
Thomas Bogendoerfer 7f7d70
@@ -42,6 +42,8 @@ enum HCLGE_MBX_OPCODE {
Thomas Bogendoerfer 7f7d70
 	HCLGE_MBX_GET_QID_IN_PF,	/* (VF -> PF) get queue id in pf */
Thomas Bogendoerfer 7f7d70
 	HCLGE_MBX_LINK_STAT_MODE,	/* (PF -> VF) link mode has changed */
Thomas Bogendoerfer 7f7d70
 	HCLGE_MBX_GET_LINK_MODE,	/* (VF -> PF) get the link mode of pf */
Thomas Bogendoerfer 7f7d70
+
Thomas Bogendoerfer 7f7d70
+	HCLGE_MBX_GET_VF_FLR_STATUS = 200, /* (M7 -> PF) get vf reset status */
Thomas Bogendoerfer 7f7d70
 };
Thomas Bogendoerfer 7f7d70
 
Thomas Bogendoerfer 7f7d70
 /* below are per-VF mac-vlan subcodes */
Thomas Bogendoerfer 7f7d70
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
Thomas Bogendoerfer 7f7d70
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
Thomas Bogendoerfer 7f7d70
@@ -1329,6 +1329,8 @@ static int hclge_alloc_vport(struct hclg
Thomas Bogendoerfer 7f7d70
 		vport->back = hdev;
Thomas Bogendoerfer 7f7d70
 		vport->vport_id = i;
Thomas Bogendoerfer 7f7d70
 		vport->mps = HCLGE_MAC_DEFAULT_FRAME;
Thomas Bogendoerfer 7f7d70
+		INIT_LIST_HEAD(&vport->uc_mac_list);
Thomas Bogendoerfer 7f7d70
+		INIT_LIST_HEAD(&vport->mc_mac_list);
Thomas Bogendoerfer 7f7d70
 
Thomas Bogendoerfer 7f7d70
 		if (i == 0)
Thomas Bogendoerfer 7f7d70
 			ret = hclge_vport_setup(vport, tqp_main_vport);
Thomas Bogendoerfer 7f7d70
@@ -6074,6 +6076,103 @@ int hclge_rm_mc_addr_common(struct hclge
Thomas Bogendoerfer 7f7d70
 	return status;
Thomas Bogendoerfer 7f7d70
 }
Thomas Bogendoerfer 7f7d70
 
Thomas Bogendoerfer 7f7d70
+void hclge_add_vport_mac_table(struct hclge_vport *vport, const u8 *mac_addr,
Thomas Bogendoerfer 7f7d70
+			       enum HCLGE_MAC_ADDR_TYPE mac_type)
Thomas Bogendoerfer 7f7d70
+{
Thomas Bogendoerfer 7f7d70
+	struct hclge_vport_mac_addr_cfg *mac_cfg;
Thomas Bogendoerfer 7f7d70
+	struct list_head *list;
Thomas Bogendoerfer 7f7d70
+
Thomas Bogendoerfer 7f7d70
+	if (!vport->vport_id)
Thomas Bogendoerfer 7f7d70
+		return;
Thomas Bogendoerfer 7f7d70
+
Thomas Bogendoerfer 7f7d70
+	mac_cfg = kzalloc(sizeof(*mac_cfg), GFP_KERNEL);
Thomas Bogendoerfer 7f7d70
+	if (!mac_cfg)
Thomas Bogendoerfer 7f7d70
+		return;
Thomas Bogendoerfer 7f7d70
+
Thomas Bogendoerfer 7f7d70
+	mac_cfg->hd_tbl_status = true;
Thomas Bogendoerfer 7f7d70
+	memcpy(mac_cfg->mac_addr, mac_addr, ETH_ALEN);
Thomas Bogendoerfer 7f7d70
+
Thomas Bogendoerfer 7f7d70
+	list = (mac_type == HCLGE_MAC_ADDR_UC) ?
Thomas Bogendoerfer 7f7d70
+	       &vport->uc_mac_list : &vport->mc_mac_list;
Thomas Bogendoerfer 7f7d70
+
Thomas Bogendoerfer 7f7d70
+	list_add_tail(&mac_cfg->node, list);
Thomas Bogendoerfer 7f7d70
+}
Thomas Bogendoerfer 7f7d70
+
Thomas Bogendoerfer 7f7d70
+void hclge_rm_vport_mac_table(struct hclge_vport *vport, const u8 *mac_addr,
Thomas Bogendoerfer 7f7d70
+			      bool is_write_tbl,
Thomas Bogendoerfer 7f7d70
+			      enum HCLGE_MAC_ADDR_TYPE mac_type)
Thomas Bogendoerfer 7f7d70
+{
Thomas Bogendoerfer 7f7d70
+	struct hclge_vport_mac_addr_cfg *mac_cfg, *tmp;
Thomas Bogendoerfer 7f7d70
+	struct list_head *list;
Thomas Bogendoerfer 7f7d70
+	bool uc_flag, mc_flag;
Thomas Bogendoerfer 7f7d70
+
Thomas Bogendoerfer 7f7d70
+	list = (mac_type == HCLGE_MAC_ADDR_UC) ?
Thomas Bogendoerfer 7f7d70
+	       &vport->uc_mac_list : &vport->mc_mac_list;
Thomas Bogendoerfer 7f7d70
+
Thomas Bogendoerfer 7f7d70
+	uc_flag = is_write_tbl && mac_type == HCLGE_MAC_ADDR_UC;
Thomas Bogendoerfer 7f7d70
+	mc_flag = is_write_tbl && mac_type == HCLGE_MAC_ADDR_MC;
Thomas Bogendoerfer 7f7d70
+
Thomas Bogendoerfer 7f7d70
+	list_for_each_entry_safe(mac_cfg, tmp, list, node) {
Thomas Bogendoerfer 7f7d70
+		if (strncmp(mac_cfg->mac_addr, mac_addr, ETH_ALEN) == 0) {
Thomas Bogendoerfer 7f7d70
+			if (uc_flag && mac_cfg->hd_tbl_status)
Thomas Bogendoerfer 7f7d70
+				hclge_rm_uc_addr_common(vport, mac_addr);
Thomas Bogendoerfer 7f7d70
+
Thomas Bogendoerfer 7f7d70
+			if (mc_flag && mac_cfg->hd_tbl_status)
Thomas Bogendoerfer 7f7d70
+				hclge_rm_mc_addr_common(vport, mac_addr);
Thomas Bogendoerfer 7f7d70
+
Thomas Bogendoerfer 7f7d70
+			list_del(&mac_cfg->node);
Thomas Bogendoerfer 7f7d70
+			kfree(mac_cfg);
Thomas Bogendoerfer 7f7d70
+			break;
Thomas Bogendoerfer 7f7d70
+		}
Thomas Bogendoerfer 7f7d70
+	}
Thomas Bogendoerfer 7f7d70
+}
Thomas Bogendoerfer 7f7d70
+
Thomas Bogendoerfer 7f7d70
+void hclge_rm_vport_all_mac_table(struct hclge_vport *vport, bool is_del_list,
Thomas Bogendoerfer 7f7d70
+				  enum HCLGE_MAC_ADDR_TYPE mac_type)
Thomas Bogendoerfer 7f7d70
+{
Thomas Bogendoerfer 7f7d70
+	struct hclge_vport_mac_addr_cfg *mac_cfg, *tmp;
Thomas Bogendoerfer 7f7d70
+	struct list_head *list;
Thomas Bogendoerfer 7f7d70
+
Thomas Bogendoerfer 7f7d70
+	list = (mac_type == HCLGE_MAC_ADDR_UC) ?
Thomas Bogendoerfer 7f7d70
+	       &vport->uc_mac_list : &vport->mc_mac_list;
Thomas Bogendoerfer 7f7d70
+
Thomas Bogendoerfer 7f7d70
+	list_for_each_entry_safe(mac_cfg, tmp, list, node) {
Thomas Bogendoerfer 7f7d70
+		if (mac_type == HCLGE_MAC_ADDR_UC && mac_cfg->hd_tbl_status)
Thomas Bogendoerfer 7f7d70
+			hclge_rm_uc_addr_common(vport, mac_cfg->mac_addr);
Thomas Bogendoerfer 7f7d70
+
Thomas Bogendoerfer 7f7d70
+		if (mac_type == HCLGE_MAC_ADDR_MC && mac_cfg->hd_tbl_status)
Thomas Bogendoerfer 7f7d70
+			hclge_rm_mc_addr_common(vport, mac_cfg->mac_addr);
Thomas Bogendoerfer 7f7d70
+
Thomas Bogendoerfer 7f7d70
+		mac_cfg->hd_tbl_status = false;
Thomas Bogendoerfer 7f7d70
+		if (is_del_list) {
Thomas Bogendoerfer 7f7d70
+			list_del(&mac_cfg->node);
Thomas Bogendoerfer 7f7d70
+			kfree(mac_cfg);
Thomas Bogendoerfer 7f7d70
+		}
Thomas Bogendoerfer 7f7d70
+	}
Thomas Bogendoerfer 7f7d70
+}
Thomas Bogendoerfer 7f7d70
+
Thomas Bogendoerfer 7f7d70
+void hclge_uninit_vport_mac_table(struct hclge_dev *hdev)
Thomas Bogendoerfer 7f7d70
+{
Thomas Bogendoerfer 7f7d70
+	struct hclge_vport_mac_addr_cfg *mac, *tmp;
Thomas Bogendoerfer 7f7d70
+	struct hclge_vport *vport;
Thomas Bogendoerfer 7f7d70
+	int i;
Thomas Bogendoerfer 7f7d70
+
Thomas Bogendoerfer 7f7d70
+	mutex_lock(&hdev->vport_cfg_mutex);
Thomas Bogendoerfer 7f7d70
+	for (i = 0; i < hdev->num_alloc_vport; i++) {
Thomas Bogendoerfer 7f7d70
+		vport = &hdev->vport[i];
Thomas Bogendoerfer 7f7d70
+		list_for_each_entry_safe(mac, tmp, &vport->uc_mac_list, node) {
Thomas Bogendoerfer 7f7d70
+			list_del(&mac->node);
Thomas Bogendoerfer 7f7d70
+			kfree(mac);
Thomas Bogendoerfer 7f7d70
+		}
Thomas Bogendoerfer 7f7d70
+
Thomas Bogendoerfer 7f7d70
+		list_for_each_entry_safe(mac, tmp, &vport->mc_mac_list, node) {
Thomas Bogendoerfer 7f7d70
+			list_del(&mac->node);
Thomas Bogendoerfer 7f7d70
+			kfree(mac);
Thomas Bogendoerfer 7f7d70
+		}
Thomas Bogendoerfer 7f7d70
+	}
Thomas Bogendoerfer 7f7d70
+	mutex_unlock(&hdev->vport_cfg_mutex);
Thomas Bogendoerfer 7f7d70
+}
Thomas Bogendoerfer 7f7d70
+
Thomas Bogendoerfer 7f7d70
 static int hclge_get_mac_ethertype_cmd_status(struct hclge_dev *hdev,
Thomas Bogendoerfer 7f7d70
 					      u16 cmdq_resp, u8 resp_code)
Thomas Bogendoerfer 7f7d70
 {
Thomas Bogendoerfer 7f7d70
@@ -7339,6 +7438,7 @@ static int hclge_init_ae_dev(struct hnae
Thomas Bogendoerfer 7f7d70
 	hdev->mps = ETH_FRAME_LEN + ETH_FCS_LEN + 2 * VLAN_HLEN;
Thomas Bogendoerfer 7f7d70
 
Thomas Bogendoerfer 7f7d70
 	mutex_init(&hdev->vport_lock);
Thomas Bogendoerfer 7f7d70
+	mutex_init(&hdev->vport_cfg_mutex);
Thomas Bogendoerfer 7f7d70
 
Thomas Bogendoerfer 7f7d70
 	ret = hclge_pci_init(hdev);
Thomas Bogendoerfer 7f7d70
 	if (ret) {
Thomas Bogendoerfer 7f7d70
@@ -7631,6 +7731,8 @@ static void hclge_uninit_ae_dev(struct h
Thomas Bogendoerfer 7f7d70
 	hclge_misc_irq_uninit(hdev);
Thomas Bogendoerfer 7f7d70
 	hclge_pci_uninit(hdev);
Thomas Bogendoerfer 7f7d70
 	mutex_destroy(&hdev->vport_lock);
Thomas Bogendoerfer 7f7d70
+	hclge_uninit_vport_mac_table(hdev);
Thomas Bogendoerfer 7f7d70
+	mutex_destroy(&hdev->vport_cfg_mutex);
Thomas Bogendoerfer 7f7d70
 	ae_dev->priv = NULL;
Thomas Bogendoerfer 7f7d70
 }
Thomas Bogendoerfer 7f7d70
 
Thomas Bogendoerfer 7f7d70
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
Thomas Bogendoerfer 7f7d70
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
Thomas Bogendoerfer 7f7d70
@@ -632,6 +632,17 @@ struct hclge_fd_ad_data {
Thomas Bogendoerfer 7f7d70
 	u16 rule_id;
Thomas Bogendoerfer 7f7d70
 };
Thomas Bogendoerfer 7f7d70
 
Thomas Bogendoerfer 7f7d70
+struct hclge_vport_mac_addr_cfg {
Thomas Bogendoerfer 7f7d70
+	struct list_head node;
Thomas Bogendoerfer 7f7d70
+	int hd_tbl_status;
Thomas Bogendoerfer 7f7d70
+	u8 mac_addr[ETH_ALEN];
Thomas Bogendoerfer 7f7d70
+};
Thomas Bogendoerfer 7f7d70
+
Thomas Bogendoerfer 7f7d70
+enum HCLGE_MAC_ADDR_TYPE {
Thomas Bogendoerfer 7f7d70
+	HCLGE_MAC_ADDR_UC,
Thomas Bogendoerfer 7f7d70
+	HCLGE_MAC_ADDR_MC
Thomas Bogendoerfer 7f7d70
+};
Thomas Bogendoerfer 7f7d70
+
Thomas Bogendoerfer 7f7d70
 /* For each bit of TCAM entry, it uses a pair of 'x' and
Thomas Bogendoerfer 7f7d70
  * 'y' to indicate which value to match, like below:
Thomas Bogendoerfer 7f7d70
  * ----------------------------------
Thomas Bogendoerfer 7f7d70
@@ -771,6 +782,8 @@ struct hclge_dev {
Thomas Bogendoerfer 7f7d70
 	/* unicast mac vlan space shared by PF and its VFs */
Thomas Bogendoerfer 7f7d70
 	u16 share_umv_size;
Thomas Bogendoerfer 7f7d70
 	struct mutex umv_mutex; /* protect share_umv_size */
Thomas Bogendoerfer 7f7d70
+
Thomas Bogendoerfer 7f7d70
+	struct mutex vport_cfg_mutex;   /* Protect stored vf table */
Thomas Bogendoerfer 7f7d70
 };
Thomas Bogendoerfer 7f7d70
 
Thomas Bogendoerfer 7f7d70
 /* VPort level vlan tag configuration for TX direction */
Thomas Bogendoerfer 7f7d70
@@ -838,6 +851,9 @@ struct hclge_vport {
Thomas Bogendoerfer 7f7d70
 	unsigned long state;
Thomas Bogendoerfer 7f7d70
 	unsigned long last_active_jiffies;
Thomas Bogendoerfer 7f7d70
 	u32 mps; /* Max packet size */
Thomas Bogendoerfer 7f7d70
+
Thomas Bogendoerfer 7f7d70
+	struct list_head uc_mac_list;   /* Store VF unicast table */
Thomas Bogendoerfer 7f7d70
+	struct list_head mc_mac_list;   /* Store VF multicast table */
Thomas Bogendoerfer 7f7d70
 };
Thomas Bogendoerfer 7f7d70
 
Thomas Bogendoerfer 7f7d70
 void hclge_promisc_param_init(struct hclge_promisc_param *param, bool en_uc,
Thomas Bogendoerfer 7f7d70
@@ -892,4 +908,13 @@ int hclge_dbg_run_cmd(struct hnae3_handl
Thomas Bogendoerfer 7f7d70
 u16 hclge_covert_handle_qid_global(struct hnae3_handle *handle, u16 queue_id);
Thomas Bogendoerfer 7f7d70
 int hclge_notify_client(struct hclge_dev *hdev,
Thomas Bogendoerfer 7f7d70
 			enum hnae3_reset_notify_type type);
Thomas Bogendoerfer 7f7d70
+void hclge_add_vport_mac_table(struct hclge_vport *vport, const u8 *mac_addr,
Thomas Bogendoerfer 7f7d70
+			       enum HCLGE_MAC_ADDR_TYPE mac_type);
Thomas Bogendoerfer 7f7d70
+void hclge_rm_vport_mac_table(struct hclge_vport *vport, const u8 *mac_addr,
Thomas Bogendoerfer 7f7d70
+			      bool is_write_tbl,
Thomas Bogendoerfer 7f7d70
+			      enum HCLGE_MAC_ADDR_TYPE mac_type);
Thomas Bogendoerfer 7f7d70
+void hclge_rm_vport_all_mac_table(struct hclge_vport *vport, bool is_del_list,
Thomas Bogendoerfer 7f7d70
+				  enum HCLGE_MAC_ADDR_TYPE mac_type);
Thomas Bogendoerfer 7f7d70
+void hclge_uninit_vport_mac_table(struct hclge_dev *hdev);
Thomas Bogendoerfer 7f7d70
+
Thomas Bogendoerfer 7f7d70
 #endif
Thomas Bogendoerfer 7f7d70
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
Thomas Bogendoerfer 7f7d70
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
Thomas Bogendoerfer 7f7d70
@@ -224,12 +224,24 @@ static int hclge_set_vf_uc_mac_addr(stru
Thomas Bogendoerfer 7f7d70
 
Thomas Bogendoerfer 7f7d70
 		hclge_rm_uc_addr_common(vport, old_addr);
Thomas Bogendoerfer 7f7d70
 		status = hclge_add_uc_addr_common(vport, mac_addr);
Thomas Bogendoerfer 7f7d70
-		if (status)
Thomas Bogendoerfer 7f7d70
+		if (status) {
Thomas Bogendoerfer 7f7d70
 			hclge_add_uc_addr_common(vport, old_addr);
Thomas Bogendoerfer 7f7d70
+		} else {
Thomas Bogendoerfer 7f7d70
+			hclge_rm_vport_mac_table(vport, mac_addr,
Thomas Bogendoerfer 7f7d70
+						 false, HCLGE_MAC_ADDR_UC);
Thomas Bogendoerfer 7f7d70
+			hclge_add_vport_mac_table(vport, mac_addr,
Thomas Bogendoerfer 7f7d70
+						  HCLGE_MAC_ADDR_UC);
Thomas Bogendoerfer 7f7d70
+		}
Thomas Bogendoerfer 7f7d70
 	} else if (mbx_req->msg[1] == HCLGE_MBX_MAC_VLAN_UC_ADD) {
Thomas Bogendoerfer 7f7d70
 		status = hclge_add_uc_addr_common(vport, mac_addr);
Thomas Bogendoerfer 7f7d70
+		if (!status)
Thomas Bogendoerfer 7f7d70
+			hclge_add_vport_mac_table(vport, mac_addr,
Thomas Bogendoerfer 7f7d70
+						  HCLGE_MAC_ADDR_UC);
Thomas Bogendoerfer 7f7d70
 	} else if (mbx_req->msg[1] == HCLGE_MBX_MAC_VLAN_UC_REMOVE) {
Thomas Bogendoerfer 7f7d70
 		status = hclge_rm_uc_addr_common(vport, mac_addr);
Thomas Bogendoerfer 7f7d70
+		if (!status)
Thomas Bogendoerfer 7f7d70
+			hclge_rm_vport_mac_table(vport, mac_addr,
Thomas Bogendoerfer 7f7d70
+						 false, HCLGE_MAC_ADDR_UC);
Thomas Bogendoerfer 7f7d70
 	} else {
Thomas Bogendoerfer 7f7d70
 		dev_err(&hdev->pdev->dev,
Thomas Bogendoerfer 7f7d70
 			"failed to set unicast mac addr, unknown subcode %d\n",
Thomas Bogendoerfer 7f7d70
@@ -255,8 +267,14 @@ static int hclge_set_vf_mc_mac_addr(stru
Thomas Bogendoerfer 7f7d70
 
Thomas Bogendoerfer 7f7d70
 	if (mbx_req->msg[1] == HCLGE_MBX_MAC_VLAN_MC_ADD) {
Thomas Bogendoerfer 7f7d70
 		status = hclge_add_mc_addr_common(vport, mac_addr);
Thomas Bogendoerfer 7f7d70
+		if (!status)
Thomas Bogendoerfer 7f7d70
+			hclge_add_vport_mac_table(vport, mac_addr,
Thomas Bogendoerfer 7f7d70
+						  HCLGE_MAC_ADDR_MC);
Thomas Bogendoerfer 7f7d70
 	} else if (mbx_req->msg[1] == HCLGE_MBX_MAC_VLAN_MC_REMOVE) {
Thomas Bogendoerfer 7f7d70
 		status = hclge_rm_mc_addr_common(vport, mac_addr);
Thomas Bogendoerfer 7f7d70
+		if (!status)
Thomas Bogendoerfer 7f7d70
+			hclge_rm_vport_mac_table(vport, mac_addr,
Thomas Bogendoerfer 7f7d70
+						 false, HCLGE_MAC_ADDR_MC);
Thomas Bogendoerfer 7f7d70
 	} else {
Thomas Bogendoerfer 7f7d70
 		dev_err(&hdev->pdev->dev,
Thomas Bogendoerfer 7f7d70
 			"failed to set mcast mac addr, unknown subcode %d\n",
Thomas Bogendoerfer 7f7d70
@@ -585,6 +603,14 @@ void hclge_mbx_handler(struct hclge_dev
Thomas Bogendoerfer 7f7d70
 		case HCLGE_MBX_GET_LINK_MODE:
Thomas Bogendoerfer 7f7d70
 			hclge_get_link_mode(vport, req);
Thomas Bogendoerfer 7f7d70
 			break;
Thomas Bogendoerfer 7f7d70
+		case HCLGE_MBX_GET_VF_FLR_STATUS:
Thomas Bogendoerfer 7f7d70
+			mutex_lock(&hdev->vport_cfg_mutex);
Thomas Bogendoerfer 7f7d70
+			hclge_rm_vport_all_mac_table(vport, true,
Thomas Bogendoerfer 7f7d70
+						     HCLGE_MAC_ADDR_UC);
Thomas Bogendoerfer 7f7d70
+			hclge_rm_vport_all_mac_table(vport, true,
Thomas Bogendoerfer 7f7d70
+						     HCLGE_MAC_ADDR_MC);
Thomas Bogendoerfer 7f7d70
+			mutex_unlock(&hdev->vport_cfg_mutex);
Thomas Bogendoerfer 7f7d70
+			break;
Thomas Bogendoerfer 7f7d70
 		default:
Thomas Bogendoerfer 7f7d70
 			dev_err(&hdev->pdev->dev,
Thomas Bogendoerfer 7f7d70
 				"un-supported mailbox message, code = %d\n",