|
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",
|