modify some vlan related issues,<br />which were discovered during the testing process.<br /> <br />Fixes: b4f996b7fcf6 ("net/zxdh: optimize VLAN filter and offload")<br />Cc: stable@dpdk.org<br /> <br />Signed-off-by: Junlong Wang <wang.junlong1@zte.com.cn> <br />---<br /> drivers/net/zxdh/zxdh_ethdev.c     |  9 ++++++++-<br /> drivers/net/zxdh/zxdh_ethdev_ops.c |  2 +-<br /> drivers/net/zxdh/zxdh_msg.c        | 28 ++++++++++++++++++++++++++--<br /> drivers/net/zxdh/zxdh_tables.c     | 28 ++++++++++++++++++++++------<br /> drivers/net/zxdh/zxdh_tables.h     |  7 ++++++-<br /> 5 files changed, 63 insertions(+), 11 deletions(-)<br /> <br />diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c<br />index 57c47f3bf8..7fd542af3e 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev.c<br />+++ b/drivers/net/zxdh/zxdh_ethdev.c<br />@@ -1904,6 +1904,7 @@ zxdh_np_init(struct rte_eth_dev *eth_dev)<br /> static int<br /> zxdh_tables_init(struct rte_eth_dev *dev)<br /> {<br />+    struct zxdh_hw *hw = dev->data->dev_private;<br />     int ret = 0;<br />  <br />     ret = zxdh_port_attr_init(dev);<br />@@ -1924,12 +1925,18 @@ zxdh_tables_init(struct rte_eth_dev *dev)<br />         return ret;<br />     }<br />  <br />-    ret = zxdh_vlan_filter_table_init(dev);<br />+    ret = zxdh_vlan_filter_table_init(hw, hw->vport.vport);<br />     if (ret) {<br />         PMD_DRV_LOG(ERR, "vlan filter table init failed");<br />         return ret;<br />     }<br />  <br />+    ret = zxdh_port_vlan_table_init(hw, hw->vport.vport);<br />+    if (ret) {<br />+        PMD_DRV_LOG(ERR, "port vlan table init failed");<br />+        return ret;<br />+    }<br />+<br />     return ret;<br /> }<br />  <br />diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c b/drivers/net/zxdh/zxdh_ethdev_ops.c<br />index 8c71721472..93b7045565 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev_ops.c<br />+++ b/drivers/net/zxdh/zxdh_ethdev_ops.c<br />@@ -895,7 +895,7 @@ zxdh_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask)<br />                     return -EAGAIN;<br />                 }<br />             } else {<br />-                msg.data.vlan_filter_set_msg.enable = true;<br />+                msg.data.vlan_filter_set_msg.enable = false;<br />                 zxdh_msg_head_build(hw, ZXDH_VLAN_FILTER_SET, &msg);<br />                 ret = zxdh_vf_send_msg_to_pf(hw->eth_dev, &msg,<br />                         sizeof(struct zxdh_msg_info), NULL, 0);<br />diff --git a/drivers/net/zxdh/zxdh_msg.c b/drivers/net/zxdh/zxdh_msg.c<br />index 452c7ab2e3..e607ea1dab 100644<br />--- a/drivers/net/zxdh/zxdh_msg.c<br />+++ b/drivers/net/zxdh/zxdh_msg.c<br />@@ -1233,6 +1233,24 @@ zxdh_vf_promisc_uninit(struct zxdh_hw *hw, union zxdh_virport_num vport)<br />     return ret;<br /> }<br />  <br />+static int<br />+zxdh_vf_vlan_table_init(struct zxdh_hw *hw, uint16_t vport)<br />+{<br />+    int ret = 0;<br />+    ret = zxdh_vlan_filter_table_init(hw, vport);<br />+    if (ret) {<br />+        PMD_DRV_LOG(ERR, "vf vlan filter table init failed, code:%d", ret);<br />+        return -1;<br />+    }<br />+<br />+    ret = zxdh_port_vlan_table_init(hw, vport);<br />+    if (ret) {<br />+        PMD_DRV_LOG(ERR, "vf port vlan table init failed, code:%d", ret);<br />+        return -1;<br />+    }<br />+    return ret;<br />+}<br />+<br /> static int<br /> zxdh_vf_port_init(struct zxdh_hw *pf_hw, uint16_t vport, void *cfg_data,<br />         void *res_info, uint16_t *res_len)<br />@@ -1252,9 +1270,8 @@ zxdh_vf_port_init(struct zxdh_hw *pf_hw, uint16_t vport, void *cfg_data,<br />     port_attr.pf_vfid = pf_hw->vfid;<br />     port_attr.hash_search_index = pf_hw->hash_search_index;<br />     port_attr.port_base_qid = vf_init_msg->base_qid;<br />-    uint16_t vfid = zxdh_vport_to_vfid(port);<br />  <br />-    ret = zxdh_set_port_attr(pf_hw, vfid, &port_attr);<br />+    ret = zxdh_set_port_attr(pf_hw, vport, &port_attr);<br />     if (ret) {<br />         PMD_DRV_LOG(ERR, "set vport attr failed, code:%d", ret);<br />         goto proc_end;<br />@@ -1265,6 +1282,13 @@ zxdh_vf_port_init(struct zxdh_hw *pf_hw, uint16_t vport, void *cfg_data,<br />         PMD_DRV_LOG(ERR, "vf_promisc_table_init failed, code:%d", ret);<br />         goto proc_end;<br />     }<br />+<br />+    ret = zxdh_vf_vlan_table_init(pf_hw, vport);<br />+    if (ret) {<br />+        PMD_DRV_LOG(ERR, "vf vlan table init failed, code:%d", ret);<br />+        goto proc_end;<br />+    }<br />+<br />     ZXDH_SET(msg_reply_body, res_info, flag, ZXDH_REPS_SUCC);<br />     *res_len = sizeof(uint8_t);<br />  <br />diff --git a/drivers/net/zxdh/zxdh_tables.c b/drivers/net/zxdh/zxdh_tables.c<br />index 14974c021b..2d2dd26499 100644<br />--- a/drivers/net/zxdh/zxdh_tables.c<br />+++ b/drivers/net/zxdh/zxdh_tables.c<br />@@ -699,10 +699,11 @@ zxdh_dev_multicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable)<br /> }<br />  <br /> int<br />-zxdh_vlan_filter_table_init(struct rte_eth_dev *dev)<br />+zxdh_vlan_filter_table_init(struct zxdh_hw *hw, uint16_t vport)<br /> {<br />-    struct zxdh_hw *hw = dev->data->dev_private;<br />     struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd;<br />+    union zxdh_virport_num vport_num = (union zxdh_virport_num)vport;<br />+    uint16_t vfid = zxdh_vport_to_vfid(vport_num);<br />     struct zxdh_vlan_filter_table vlan_table = {0};<br />     int16_t ret = 0;<br />  <br />@@ -717,7 +718,7 @@ zxdh_vlan_filter_table_init(struct rte_eth_dev *dev)<br />         } else {<br />             vlan_table.vlans[0] = 0;<br />         }<br />-        uint32_t index = (vlan_group << 11) | hw->vport.vfid;<br />+        uint32_t index = (vlan_group << 11) | vfid;<br />         ZXDH_DTB_ERAM_ENTRY_INFO_T entry_data = {<br />             .index = index,<br />             .p_data = (uint32_t *)&vlan_table<br />@@ -749,7 +750,7 @@ zxdh_vlan_filter_table_set(struct zxdh_hw *hw, uint16_t vport, uint16_t vlan_id,<br />     memset(&vlan_table, 0, sizeof(struct zxdh_vlan_filter_table));<br />     int table_num = vlan_id / ZXDH_VLAN_FILTER_VLANID_STEP;<br />     uint32_t index = (table_num << 11) | vfid;<br />-    uint16_t group = (vlan_id - table_num * ZXDH_VLAN_FILTER_VLANID_STEP) / 8 + 1;<br />+    uint16_t group = (vlan_id % ZXDH_VLAN_FILTER_VLANID_STEP) / 8 + 1;<br />  <br />     uint8_t val = sizeof(struct zxdh_vlan_filter_table) / sizeof(uint32_t);<br />     uint8_t vlan_tbl_index = group / val;<br />@@ -950,7 +951,7 @@ zxdh_vlan_relate_vport(struct rte_eth_dev *dev, uint16_t vport,<br />     return 0;<br /> }<br />  <br />-static int<br />+int<br /> zxdh_set_port_vlan_attr(struct zxdh_hw *hw, uint16_t vport,<br />         struct zxdh_port_vlan_table *port_vlan)<br /> {<br />@@ -973,7 +974,7 @@ zxdh_set_port_vlan_attr(struct zxdh_hw *hw, uint16_t vport,<br />     return ret;<br /> }<br />  <br />-static int<br />+int<br /> zxdh_get_port_vlan_attr(struct zxdh_hw *hw, uint16_t vport,<br />         struct zxdh_port_vlan_table *port_vlan)<br /> {<br />@@ -1045,3 +1046,18 @@ int zxdh_set_vlan_offload(struct zxdh_hw *hw, uint16_t vport, uint8_t type, uint<br /> {<br />     return set_vlan_config(hw, vport, type, enable);<br /> }<br />+<br />+int zxdh_port_vlan_table_init(struct zxdh_hw *hw, uint16_t vport)<br />+{<br />+    struct zxdh_port_vlan_table port_vlan = {0};<br />+    int ret = 0;<br />+<br />+    if (!hw->is_pf)<br />+        return 0;<br />+<br />+    ret = zxdh_set_port_vlan_attr(hw, vport, &port_vlan);<br />+    if (ret)<br />+        PMD_DRV_LOG(ERR, "port vlan table init failed");<br />+<br />+    return ret;<br />+}<br />diff --git a/drivers/net/zxdh/zxdh_tables.h b/drivers/net/zxdh/zxdh_tables.h<br />index cb34e38be8..3280ff1f89 100644<br />--- a/drivers/net/zxdh/zxdh_tables.h<br />+++ b/drivers/net/zxdh/zxdh_tables.h<br />@@ -362,7 +362,7 @@ int zxdh_promisc_table_init(struct rte_eth_dev *dev);<br /> int zxdh_promisc_table_uninit(struct rte_eth_dev *dev);<br /> int zxdh_dev_unicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable);<br /> int zxdh_dev_multicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable);<br />-int zxdh_vlan_filter_table_init(struct rte_eth_dev *dev);<br />+int zxdh_vlan_filter_table_init(struct zxdh_hw *hw, uint16_t vport);<br /> int zxdh_vlan_filter_table_set(struct zxdh_hw *hw, uint16_t vport,<br />         uint16_t vlan_id, uint8_t enable);<br /> int zxdh_rss_table_set(struct zxdh_hw *hw, uint16_t vport, struct zxdh_rss_reta *rss_reta);<br />@@ -372,5 +372,10 @@ int zxdh_set_panel_attr(struct rte_eth_dev *dev, struct zxdh_panel_table *panel_<br /> int zxdh_dev_broadcast_set(struct zxdh_hw *hw, uint16_t vport, bool enable);<br /> int zxdh_set_vlan_filter(struct zxdh_hw *hw, uint16_t vport, uint8_t enable);<br /> int zxdh_set_vlan_offload(struct zxdh_hw *hw, uint16_t vport, uint8_t type, uint8_t enable);<br />+int zxdh_set_port_vlan_attr(struct zxdh_hw *hw, uint16_t vport,<br />+        struct zxdh_port_vlan_table *port_vlan);<br />+int zxdh_get_port_vlan_attr(struct zxdh_hw *hw, uint16_t vport,<br />+        struct zxdh_port_vlan_table *port_vlan);<br />+int zxdh_port_vlan_table_init(struct zxdh_hw *hw, uint16_t vport);<br />  <br /> #endif /* ZXDH_TABLES_H */<br />--  <br />2.27.0<br />