modify some vlan related issues, and provided<br />vlan tpid set ops.<br /> <br />Signed-off-by: Junlong Wang <wang.junlong1@zte.com.cn> <br />---<br /> drivers/net/zxdh/zxdh_ethdev.c     | 10 +++++-<br /> drivers/net/zxdh/zxdh_ethdev_ops.c | 39 +++++++++++++++++++-<br /> drivers/net/zxdh/zxdh_ethdev_ops.h |  1 +<br /> drivers/net/zxdh/zxdh_msg.c        | 58 +++++++++++++++++++++++++++++-<br /> drivers/net/zxdh/zxdh_msg.h        |  7 +++-<br /> drivers/net/zxdh/zxdh_tables.c     | 30 ++++++++++++----<br /> drivers/net/zxdh/zxdh_tables.h     |  7 +++-<br /> 7 files changed, 140 insertions(+), 12 deletions(-)<br /> <br />diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c<br />index 74018821d1..9512aff99c 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev.c<br />+++ b/drivers/net/zxdh/zxdh_ethdev.c<br />@@ -1429,6 +1429,7 @@ static const struct eth_dev_ops zxdh_eth_dev_ops = {<br />     .allmulticast_disable     = zxdh_dev_allmulticast_disable,<br />     .vlan_filter_set         = zxdh_dev_vlan_filter_set,<br />     .vlan_offload_set         = zxdh_dev_vlan_offload_set,<br />+    .vlan_tpid_set             = zxdh_vlan_tpid_set,<br />     .reta_update             = zxdh_dev_rss_reta_update,<br />     .reta_query                 = zxdh_dev_rss_reta_query,<br />     .rss_hash_update         = zxdh_rss_hash_update,<br />@@ -1907,6 +1908,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 />@@ -1927,12 +1929,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 e865d23849..c16271aeaf 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 />@@ -1004,6 +1004,43 @@ zxdh_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask)<br />     return ret;<br /> }<br />  <br />+int<br />+zxdh_vlan_tpid_set(struct rte_eth_dev *dev, enum rte_vlan_type vlan_type, uint16_t tpid)<br />+{<br />+    struct zxdh_hw *hw = dev->data->dev_private;<br />+    struct zxdh_port_vlan_table port_vlan_table = {0};<br />+    struct zxdh_msg_info msg = {0};<br />+    int ret = 0;<br />+<br />+    if (vlan_type != RTE_ETH_VLAN_TYPE_OUTER) {<br />+        PMD_DRV_LOG(ERR, "unsupported rte vlan type!");<br />+        return -1;<br />+    }<br />+<br />+    if (hw->is_pf) {<br />+        ret = zxdh_get_port_vlan_attr(hw, hw->vport.vport, &port_vlan_table);<br />+        if (ret != 0)<br />+            PMD_DRV_LOG(ERR, "get port vlan attr table failed");<br />+        port_vlan_table.hit_flag = 1;<br />+        port_vlan_table.business_vlan_tpid = tpid;<br />+        ret = zxdh_set_port_vlan_attr(hw, hw->vport.vport, &port_vlan_table);<br />+        if (ret != 0)<br />+            PMD_DRV_LOG(ERR, "set port vlan tpid %d attr table failed", tpid);<br />+    } else {<br />+        zxdh_msg_head_build(hw, ZXDH_VLAN_SET_TPID, &msg);<br />+        msg.data.zxdh_vlan_tpid.tpid = tpid;<br />+        ret = zxdh_vf_send_msg_to_pf(dev, &msg,<br />+                sizeof(struct zxdh_msg_info), NULL, 0);<br />+        if (ret) {<br />+            PMD_DRV_LOG(ERR, "port %d vlan tpid %d set failed",<br />+                hw->vfid, tpid);<br />+            return -1;<br />+        }<br />+    }<br />+<br />+    return 0;<br />+}<br />+<br /> int<br /> zxdh_dev_rss_reta_update(struct rte_eth_dev *dev,<br />              struct rte_eth_rss_reta_entry64 *reta_conf,<br />diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.h b/drivers/net/zxdh/zxdh_ethdev_ops.h<br />index 97a1eb4532..6015b3de59 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev_ops.h<br />+++ b/drivers/net/zxdh/zxdh_ethdev_ops.h<br />@@ -120,6 +120,7 @@ int zxdh_dev_allmulticast_enable(struct rte_eth_dev *dev);<br /> int zxdh_dev_allmulticast_disable(struct rte_eth_dev *dev);<br /> int zxdh_dev_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on);<br /> int zxdh_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask);<br />+int zxdh_vlan_tpid_set(struct rte_eth_dev *dev, enum rte_vlan_type vlan_type, uint16_t tpid);<br /> int zxdh_dev_rss_reta_update(struct rte_eth_dev *dev,<br />              struct rte_eth_rss_reta_entry64 *reta_conf,<br />              uint16_t reta_size);<br />diff --git a/drivers/net/zxdh/zxdh_msg.c b/drivers/net/zxdh/zxdh_msg.c<br />index 49291cfbaf..be4f115380 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 />@@ -1254,7 +1272,7 @@ zxdh_vf_port_init(struct zxdh_hw *pf_hw, uint16_t vport, void *cfg_data,<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 +1283,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 />@@ -2131,6 +2156,36 @@ zxdh_vf_mtr_hw_profile_cfg(struct zxdh_hw *pf_hw __rte_unused,<br />     return 0;<br /> }<br />  <br />+static int<br />+zxdh_vf_vlan_tpid_set(struct zxdh_hw *pf_hw, uint16_t vport, void *cfg_data,<br />+        void *res_info, uint16_t *res_len)<br />+{<br />+    union zxdh_virport_num port = {.vport = vport};<br />+    struct zxdh_vlan_tpid *vlan_tpid = (struct zxdh_vlan_tpid *)cfg_data;<br />+    struct zxdh_port_vlan_table port_vlan_table = {0};<br />+    int ret = 0;<br />+<br />+    RTE_ASSERT(!cfg_data || !pf_hw || !res_info || !res_len);<br />+<br />+    ret = zxdh_get_port_vlan_attr(pf_hw, vport, &port_vlan_table);<br />+    if (ret) {<br />+        PMD_DRV_LOG(ERR, "get port vlan attr failed, code:%d", ret);<br />+        goto proc_end;<br />+    }<br />+    port_vlan_table.hit_flag = 1;<br />+    port_vlan_table.business_vlan_tpid = vlan_tpid->tpid;<br />+    ret = zxdh_set_port_vlan_attr(pf_hw, vport, &port_vlan_table);<br />+    if (ret) {<br />+        PMD_DRV_LOG(ERR, "set port vlan attr failed, code:%d", ret);<br />+        goto proc_end;<br />+    }<br />+<br />+proc_end:<br />+    *res_len = sizeof(uint8_t);<br />+    ZXDH_SET(msg_reply_body, res_info, flag, ZXDH_REPS_FAIL);<br />+    return ret;<br />+}<br />+<br /> static const zxdh_msg_process_callback zxdh_proc_cb[] = {<br />     [ZXDH_NULL] = NULL,<br />     [ZXDH_VF_PORT_INIT] = zxdh_vf_port_init,<br />@@ -2142,6 +2197,7 @@ static const zxdh_msg_process_callback zxdh_proc_cb[] = {<br />     [ZXDH_VLAN_FILTER_ADD] = zxdh_vf_vlan_filter_table_add,<br />     [ZXDH_VLAN_FILTER_DEL] = zxdh_vf_vlan_filter_table_del,<br />     [ZXDH_VLAN_OFFLOAD] = zxdh_vf_set_vlan_offload,<br />+    [ZXDH_VLAN_SET_TPID] = zxdh_vf_vlan_tpid_set,<br />     [ZXDH_RSS_ENABLE] = zxdh_vf_rss_enable,<br />     [ZXDH_RSS_RETA_GET] = zxdh_vf_rss_table_get,<br />     [ZXDH_RSS_RETA_SET] = zxdh_vf_rss_table_set,<br />diff --git a/drivers/net/zxdh/zxdh_msg.h b/drivers/net/zxdh/zxdh_msg.h<br />index 7dad6f7335..b62ace7219 100644<br />--- a/drivers/net/zxdh/zxdh_msg.h<br />+++ b/drivers/net/zxdh/zxdh_msg.h<br />@@ -229,7 +229,7 @@ enum zxdh_msg_type {<br />     ZXDH_VLAN_FILTER_ADD = 18,<br />     ZXDH_VLAN_FILTER_DEL = 19,<br />     ZXDH_VLAN_OFFLOAD = 21,<br />-<br />+    ZXDH_VLAN_SET_TPID = 23,<br />     ZXDH_PORT_ATTRS_SET = 25,<br />     ZXDH_PORT_PROMISC_SET = 26,<br />  <br />@@ -535,6 +535,10 @@ struct zxdh_plcr_profile_free {<br />     uint16_t profile_id;<br /> };<br />  <br />+struct zxdh_vlan_tpid {<br />+    uint16_t tpid;<br />+};<br />+<br /> struct zxdh_msg_info {<br />     union {<br />         uint8_t head_len[ZXDH_MSG_HEAD_LEN];<br />@@ -551,6 +555,7 @@ struct zxdh_msg_info {<br />         struct zxdh_vlan_filter vlan_filter_msg;<br />         struct zxdh_vlan_filter_set vlan_filter_set_msg;<br />         struct zxdh_vlan_offload vlan_offload_msg;<br />+        struct zxdh_vlan_tpid zxdh_vlan_tpid;<br />         struct zxdh_rss_reta rss_reta;<br />         struct zxdh_rss_enable rss_enable;<br />         struct zxdh_rss_hf rss_hf;<br />diff --git a/drivers/net/zxdh/zxdh_tables.c b/drivers/net/zxdh/zxdh_tables.c<br />index 26d9b90382..57a291e92a 100644<br />--- a/drivers/net/zxdh/zxdh_tables.c<br />+++ b/drivers/net/zxdh/zxdh_tables.c<br />@@ -700,10 +700,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 />@@ -718,7 +719,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 />@@ -730,7 +731,7 @@ zxdh_vlan_filter_table_init(struct rte_eth_dev *dev)<br />         if (ret != 0) {<br />             PMD_DRV_LOG(ERR,<br />                 "[vfid:%d], vlan_group:%d, init vlan filter table failed",<br />-                hw->vport.vfid, vlan_group);<br />+                vfid, vlan_group);<br />             ret = -1;<br />         }<br />     }<br />@@ -750,7 +751,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 />@@ -951,7 +952,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 />@@ -974,7 +975,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 />@@ -1046,3 +1047,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 />