optimize VLAN filter/offload ops.<br /> <br />Signed-off-by: Junlong Wang <wang.junlong1@zte.com.cn> <br />---<br /> drivers/net/zxdh/zxdh_ethdev_ops.c |  42 +++------<br /> drivers/net/zxdh/zxdh_msg.c        |  81 +++++++++++++++++<br /> drivers/net/zxdh/zxdh_msg.h        |   5 +-<br /> drivers/net/zxdh/zxdh_tables.c     | 139 +++++++++++++++++++++++++++++<br /> drivers/net/zxdh/zxdh_tables.h     | 112 +++++++++++++++--------<br /> 5 files changed, 312 insertions(+), 67 deletions(-)<br /> <br />diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c b/drivers/net/zxdh/zxdh_ethdev_ops.c<br />index c43047006e..ec83e8850c 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev_ops.c<br />+++ b/drivers/net/zxdh/zxdh_ethdev_ops.c<br />@@ -678,11 +678,6 @@ zxdh_dev_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)<br />         return -EINVAL;<br />     }<br />  <br />-    if (dev->data->dev_started == 0) {<br />-        PMD_DRV_LOG(ERR, "vlan_filter dev not start");<br />-        return -1;<br />-    }<br />-<br />     idx = vlan_id / ZXDH_VLAN_FILTER_GROUPS;<br />     bit_idx = vlan_id % ZXDH_VLAN_FILTER_GROUPS;<br />  <br />@@ -732,16 +727,13 @@ zxdh_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask)<br />     struct zxdh_hw *hw = dev->data->dev_private;<br />     struct rte_eth_rxmode *rxmode;<br />     struct zxdh_msg_info msg = {0};<br />-    struct zxdh_port_attr_table port_attr = {0};<br />     int ret = 0;<br />  <br />     rxmode = &dev->data->dev_conf.rxmode;<br />     if (mask & RTE_ETH_VLAN_FILTER_MASK) {<br />         if (rxmode->offloads & RTE_ETH_RX_OFFLOAD_VLAN_FILTER) {<br />             if (hw->is_pf) {<br />-                ret = zxdh_get_port_attr(hw, hw->vport.vport, &port_attr);<br />-                port_attr.vlan_filter_enable = true;<br />-                ret = zxdh_set_port_attr(hw, hw->vport.vport, &port_attr);<br />+                ret = zxdh_set_vlan_filter(hw, hw->vport.vport, true);<br />                 if (ret) {<br />                     PMD_DRV_LOG(ERR, "port %d vlan filter set failed",<br />                         hw->vport.vfid);<br />@@ -760,9 +752,7 @@ zxdh_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask)<br />             }<br />         } else {<br />             if (hw->is_pf) {<br />-                ret = zxdh_get_port_attr(hw, hw->vport.vport, &port_attr);<br />-                port_attr.vlan_filter_enable = false;<br />-                ret = zxdh_set_port_attr(hw, hw->vport.vport, &port_attr);<br />+                ret = zxdh_set_vlan_filter(hw, hw->vport.vport, false);<br />                 if (ret) {<br />                     PMD_DRV_LOG(ERR, "port %d vlan filter set failed",<br />                         hw->vport.vfid);<br />@@ -785,9 +775,8 @@ zxdh_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask)<br />     if (mask & RTE_ETH_VLAN_STRIP_MASK) {<br />         if (rxmode->offloads & RTE_ETH_RX_OFFLOAD_VLAN_STRIP) {<br />             if (hw->is_pf) {<br />-                ret = zxdh_get_port_attr(hw, hw->vport.vport, &port_attr);<br />-                port_attr.vlan_strip_offload = true;<br />-                ret = zxdh_set_port_attr(hw, hw->vport.vport, &port_attr);<br />+                ret = zxdh_set_vlan_offload(hw, hw->vport.vport,<br />+                        ZXDH_VLAN_STRIP_TYPE, true);<br />                 if (ret) {<br />                     PMD_DRV_LOG(ERR, "port %d vlan strip set failed",<br />                         hw->vport.vfid);<br />@@ -795,7 +784,7 @@ zxdh_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask)<br />                 }<br />             } else {<br />                 msg.data.vlan_offload_msg.enable = true;<br />-                msg.data.vlan_offload_msg.type = ZXDH_VLAN_STRIP_MSG_TYPE;<br />+                msg.data.vlan_offload_msg.type = ZXDH_VLAN_STRIP_TYPE;<br />                 zxdh_msg_head_build(hw, ZXDH_VLAN_OFFLOAD, &msg);<br />                 ret = zxdh_vf_send_msg_to_pf(hw->eth_dev, &msg,<br />                         sizeof(struct zxdh_msg_info), NULL, 0);<br />@@ -807,9 +796,8 @@ zxdh_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask)<br />             }<br />         } else {<br />             if (hw->is_pf) {<br />-                ret = zxdh_get_port_attr(hw, hw->vport.vport, &port_attr);<br />-                port_attr.vlan_strip_offload = false;<br />-                ret = zxdh_set_port_attr(hw, hw->vport.vport, &port_attr);<br />+                ret = zxdh_set_vlan_offload(hw, hw->vport.vport,<br />+                        ZXDH_VLAN_STRIP_TYPE, false);<br />                 if (ret) {<br />                     PMD_DRV_LOG(ERR, "port %d vlan strip set failed",<br />                         hw->vport.vfid);<br />@@ -817,7 +805,7 @@ zxdh_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask)<br />                 }<br />             } else {<br />                 msg.data.vlan_offload_msg.enable = false;<br />-                msg.data.vlan_offload_msg.type = ZXDH_VLAN_STRIP_MSG_TYPE;<br />+                msg.data.vlan_offload_msg.type = ZXDH_VLAN_STRIP_TYPE;<br />                 zxdh_msg_head_build(hw, ZXDH_VLAN_OFFLOAD, &msg);<br />                 ret = zxdh_vf_send_msg_to_pf(hw->eth_dev, &msg,<br />                         sizeof(struct zxdh_msg_info), NULL, 0);<br />@@ -834,9 +822,8 @@ zxdh_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask)<br />         memset(&msg, 0, sizeof(struct zxdh_msg_info));<br />         if (rxmode->offloads & RTE_ETH_RX_OFFLOAD_QINQ_STRIP) {<br />             if (hw->is_pf) {<br />-                ret = zxdh_get_port_attr(hw, hw->vport.vport, &port_attr);<br />-                port_attr.qinq_strip_offload = true;<br />-                ret = zxdh_set_port_attr(hw, hw->vport.vport, &port_attr);<br />+                ret = zxdh_set_vlan_offload(hw, hw->vport.vport,<br />+                    ZXDH_QINQ_STRIP_TYPE, true);<br />                 if (ret) {<br />                     PMD_DRV_LOG(ERR, "port %d qinq offload set failed",<br />                         hw->vport.vfid);<br />@@ -844,7 +831,7 @@ zxdh_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask)<br />                 }<br />             } else {<br />                 msg.data.vlan_offload_msg.enable = true;<br />-                msg.data.vlan_offload_msg.type = ZXDH_QINQ_STRIP_MSG_TYPE;<br />+                msg.data.vlan_offload_msg.type = ZXDH_QINQ_STRIP_TYPE;<br />                 zxdh_msg_head_build(hw, ZXDH_VLAN_OFFLOAD, &msg);<br />                 ret = zxdh_vf_send_msg_to_pf(hw->eth_dev, &msg,<br />                         sizeof(struct zxdh_msg_info), NULL, 0);<br />@@ -856,9 +843,8 @@ zxdh_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask)<br />             }<br />         } else {<br />             if (hw->is_pf) {<br />-                ret = zxdh_get_port_attr(hw, hw->vport.vport, &port_attr);<br />-                port_attr.qinq_strip_offload = true;<br />-                ret = zxdh_set_port_attr(hw, hw->vport.vport, &port_attr);<br />+                ret = zxdh_set_vlan_offload(hw, hw->vport.vport,<br />+                        ZXDH_QINQ_STRIP_TYPE, false);<br />                 if (ret) {<br />                     PMD_DRV_LOG(ERR, "port %d qinq offload set failed",<br />                         hw->vport.vfid);<br />@@ -866,7 +852,7 @@ zxdh_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask)<br />                 }<br />             } else {<br />                 msg.data.vlan_offload_msg.enable = false;<br />-                msg.data.vlan_offload_msg.type = ZXDH_QINQ_STRIP_MSG_TYPE;<br />+                msg.data.vlan_offload_msg.type = ZXDH_QINQ_STRIP_TYPE;<br />                 zxdh_msg_head_build(hw, ZXDH_VLAN_OFFLOAD, &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 892d57a51e..d9f212e642 100644<br />--- a/drivers/net/zxdh/zxdh_msg.c<br />+++ b/drivers/net/zxdh/zxdh_msg.c<br />@@ -1469,6 +1469,83 @@ zxdh_vf_promisc_set(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,<br />     return ret;<br /> }<br />  <br />+static int<br />+zxdh_vf_vlan_filter_table_process(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,<br />+        struct zxdh_msg_reply_body *res_info, uint16_t *res_len, uint8_t enable)<br />+{<br />+    struct zxdh_vlan_filter *vlan_filter = cfg_data;<br />+    uint16_t vlan_id =  vlan_filter->vlan_id;<br />+    char str[ZXDH_MSG_REPLY_BODY_MAX_LEN] = "vlan filter table";<br />+    int ret = 0;<br />+<br />+    ret = zxdh_vlan_filter_table_set(hw, vport, vlan_id, enable);<br />+    if (ret)<br />+        sprintf(str, "vlan filter op-code[%d] vlan id:%d failed, code:%d\n",<br />+            enable, vlan_id, ret);<br />+<br />+    *res_len = strlen(str) + sizeof(enum zxdh_reps_flag);<br />+    rte_memcpy(&res_info->reply_data, str, strlen(str) + 1);<br />+    res_info->flag = (ret == 0) ? ZXDH_REPS_SUCC : ZXDH_REPS_FAIL;<br />+    return ret;<br />+}<br />+<br />+static int<br />+zxdh_vf_vlan_filter_table_add(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,<br />+        struct zxdh_msg_reply_body *res_info, uint16_t *res_len)<br />+{<br />+    return zxdh_vf_vlan_filter_table_process(hw, vport, cfg_data, res_info, res_len, 1);<br />+}<br />+<br />+static int<br />+zxdh_vf_vlan_filter_table_del(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,<br />+        struct zxdh_msg_reply_body *res_info, uint16_t *res_len)<br />+{<br />+    return zxdh_vf_vlan_filter_table_process(hw, vport, cfg_data, res_info, res_len, 0);<br />+}<br />+<br />+static int<br />+zxdh_vf_set_vlan_filter(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,<br />+        struct zxdh_msg_reply_body *reply, uint16_t *res_len)<br />+{<br />+    struct zxdh_vlan_filter_set *vlan_filter = cfg_data;<br />+    union zxdh_virport_num port = (union zxdh_virport_num)vport;<br />+    char str[ZXDH_MSG_REPLY_BODY_MAX_LEN] = "vlan filter";<br />+    int ret = 0;<br />+    uint16_t vfid = port.vfid;<br />+<br />+    ret = zxdh_set_vlan_filter(hw, vport, vlan_filter->enable);<br />+    if (ret)<br />+        sprintf(str, "[vfid:%d] vlan filter. set failed, ret:%d\n", vfid, ret);<br />+<br />+    *res_len = strlen(str) + sizeof(enum zxdh_reps_flag);<br />+    reply->flag = (ret == 0) ? ZXDH_REPS_SUCC : ZXDH_REPS_FAIL;<br />+    rte_memcpy(&reply->reply_data, str, strlen(str) + 1);<br />+    return ret;<br />+}<br />+<br />+static int<br />+zxdh_vf_set_vlan_offload(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,<br />+        struct zxdh_msg_reply_body *reply, uint16_t *res_len)<br />+{<br />+    struct zxdh_vlan_offload *vlan_offload = cfg_data;<br />+    union zxdh_virport_num port = (union zxdh_virport_num)vport;<br />+    char str[ZXDH_MSG_REPLY_BODY_MAX_LEN] = "vlan offload";<br />+    int ret = 0;<br />+    uint16_t vfid = port.vfid;<br />+<br />+    PMD_DRV_LOG(DEBUG, "vfid:%d, type:%s, enable:%d",<br />+        vfid, vlan_offload->type == ZXDH_VLAN_STRIP_TYPE ? "vlan-strip" : "qinq-strip",<br />+            vlan_offload->enable);<br />+    ret = zxdh_set_vlan_offload(hw, vport, vlan_offload->type, vlan_offload->enable);<br />+    if (ret)<br />+        sprintf(str, "[vfid:%d] vlan offload set failed, ret:%d\n", vfid, ret);<br />+<br />+    *res_len = strlen(str) + sizeof(enum zxdh_reps_flag);<br />+    reply->flag = (ret == 0) ? ZXDH_REPS_SUCC : ZXDH_REPS_FAIL;<br />+    rte_memcpy(&reply->reply_data, str, strlen(str) + 1);<br />+    return ret;<br />+}<br />+<br /> zxdh_msg_process_callback zxdh_proc_cb[] = {<br />     [ZXDH_NULL] = NULL,<br />     [ZXDH_VF_PORT_INIT] = zxdh_vf_port_init,<br />@@ -1476,6 +1553,10 @@ zxdh_msg_process_callback zxdh_proc_cb[] = {<br />     [ZXDH_MAC_ADD] = zxdh_add_vf_mac_table,<br />     [ZXDH_MAC_DEL] = zxdh_del_vf_mac_table,<br />     [ZXDH_PORT_PROMISC_SET] = zxdh_vf_promisc_set,<br />+    [ZXDH_VLAN_FILTER_SET] = zxdh_vf_set_vlan_filter,<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 /> };<br />  <br /> static inline int<br />diff --git a/drivers/net/zxdh/zxdh_msg.h b/drivers/net/zxdh/zxdh_msg.h<br />index 3c0225ac08..5a7085ad7b 100644<br />--- a/drivers/net/zxdh/zxdh_msg.h<br />+++ b/drivers/net/zxdh/zxdh_msg.h<br />@@ -56,8 +56,9 @@<br /> #define ZXDH_MAC_UNFILTER          0xff<br /> #define ZXDH_PROMISC_MODE          1<br /> #define ZXDH_ALLMULTI_MODE         2<br />-#define ZXDH_VLAN_STRIP_MSG_TYPE   0<br />-#define ZXDH_QINQ_STRIP_MSG_TYPE   1<br />+#define ZXDH_VLAN_STRIP_TYPE       0<br />+#define ZXDH_QINQ_STRIP_TYPE       1<br />+#define ZXDH_VLAN_FILTER_TYPE      2<br />  <br /> #define ZXDH_EEXIST_MAC_FLAG       0xFD<br />  <br />diff --git a/drivers/net/zxdh/zxdh_tables.c b/drivers/net/zxdh/zxdh_tables.c<br />index 9838b8d103..253d9ce438 100644<br />--- a/drivers/net/zxdh/zxdh_tables.c<br />+++ b/drivers/net/zxdh/zxdh_tables.c<br />@@ -15,6 +15,7 @@<br /> #define ZXDH_SDT_BROCAST_ATT_TABLE        6<br /> #define ZXDH_SDT_UNICAST_ATT_TABLE        10<br /> #define ZXDH_SDT_MULTICAST_ATT_TABLE      11<br />+#define ZXDH_SDT_PORT_VLAN_ATT_TABLE      16<br />  <br /> #define ZXDH_MAC_HASH_INDEX_BASE          64<br /> #define ZXDH_MAC_HASH_INDEX(index)        (ZXDH_MAC_HASH_INDEX_BASE + (index))<br />@@ -26,6 +27,14 @@<br /> #define ZXDH_VLAN_GROUP_NUM               35<br /> #define ZXDH_VLAN_FILTER_VLANID_STEP      120<br />  <br />+static inline int32_t<br />+no_business_offload(struct zxdh_port_vlan_table *port_vlan)<br />+{<br />+    return (port_vlan->business_qinq_strip == 0 && <br />+            port_vlan->business_vlan_filter == 0 && <br />+            port_vlan->business_vlan_strip == 0);<br />+}<br />+<br /> int<br /> zxdh_set_port_attr(struct zxdh_hw *hw, uint16_t vport, struct zxdh_port_attr_table *port_attr)<br /> {<br />@@ -901,3 +910,133 @@ zxdh_dev_broadcast_set(struct zxdh_hw *hw, uint16_t vport, bool enable)<br />     }<br />     return 0;<br /> }<br />+<br />+static int<br />+zxdh_vlan_relate_vport(struct rte_eth_dev *dev, uint16_t vport,<br />+        struct zxdh_port_attr_table *vport_attr,<br />+        struct zxdh_port_vlan_table *port_vlan, uint8_t on)<br />+{<br />+    struct zxdh_hw *hw = dev->data->dev_private;<br />+    union zxdh_virport_num port = (union zxdh_virport_num)vport;<br />+    int ret = 0;<br />+<br />+    if (on) {<br />+        if (!vport_attr->business_vlan_enable) {<br />+            vport_attr->business_vlan_enable = 1;<br />+            ret = zxdh_set_port_attr(hw, vport, vport_attr);<br />+            if (ret) {<br />+                PMD_DRV_LOG(ERR, "[vfid:%d] vlan offload set failedd, set vport tbl ret:%d",<br />+                        port.vfid, ret);<br />+                return ret;<br />+            }<br />+        }<br />+    } else {<br />+        if (no_business_offload(port_vlan))<br />+            if (vport_attr->business_vlan_enable) {<br />+                PMD_DRV_LOG(INFO, "port vlan no business offload, vport business_vlan_enable set 0");<br />+                vport_attr->business_vlan_enable = 0;<br />+                ret = zxdh_set_port_attr(hw, vport, vport_attr);<br />+                if (ret) {<br />+                    PMD_DRV_LOG(ERR, "[vfid:%d] vlan offload set failedd, set vport tbl ret:%d",<br />+                            port.vfid, ret);<br />+                    return ret;<br />+                }<br />+            }<br />+    }<br />+<br />+    return 0;<br />+}<br />+<br />+static int<br />+zxdh_set_port_vlan_attr(struct zxdh_hw *hw, uint16_t vport,<br />+        struct zxdh_port_vlan_table *port_vlan)<br />+{<br />+    union zxdh_virport_num vport_num = (union zxdh_virport_num)vport;<br />+    int ret = 0;<br />+<br />+    ZXDH_DTB_ERAM_ENTRY_INFO_T port_entry = {<br />+        .index = vport_num.vfid,<br />+        .p_data = (uint32_t *)port_vlan<br />+    };<br />+    ZXDH_DTB_USER_ENTRY_T entry = {<br />+        .sdt_no = ZXDH_SDT_PORT_VLAN_ATT_TABLE,<br />+        .p_entry_data = (void *)&port_entry<br />+    };<br />+<br />+    ret = zxdh_np_dtb_table_entry_write(hw->slot_id, hw->dev_sd->dtb_sd.queueid, 1, &entry);<br />+    if (ret)<br />+        PMD_DRV_LOG(ERR, "write port_vlan tbl failed, ret:%d ", ret);<br />+    return ret;<br />+}<br />+<br />+static int<br />+zxdh_get_port_vlan_attr(struct zxdh_hw *hw, uint16_t vport,<br />+        struct zxdh_port_vlan_table *port_vlan)<br />+{<br />+    union zxdh_virport_num vport_num = (union zxdh_virport_num)vport;<br />+    int ret = 0;<br />+<br />+    ZXDH_DTB_ERAM_ENTRY_INFO_T port_entry = {<br />+        .index = vport_num.vfid,<br />+        .p_data = (uint32_t *)port_vlan<br />+    };<br />+    ZXDH_DTB_USER_ENTRY_T entry = {<br />+        .sdt_no = ZXDH_SDT_PORT_VLAN_ATT_TABLE,<br />+        .p_entry_data = (void *)&port_entry<br />+    };<br />+<br />+    ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid,<br />+            &entry, 1);<br />+    if (ret)<br />+        PMD_DRV_LOG(ERR, "get port vlan tbl failed, ret:%d ", ret);<br />+<br />+    return ret;<br />+}<br />+<br />+static int<br />+set_vlan_config(struct zxdh_hw *hw, uint16_t vport, uint8_t type, uint8_t enable)<br />+{<br />+    struct zxdh_port_attr_table vport_attr = {0};<br />+    struct zxdh_port_vlan_table port_vlan_attr = {0};<br />+    union zxdh_virport_num port = (union zxdh_virport_num)vport;<br />+    uint16_t vfid = port.vfid;<br />+    int ret = 0;<br />+<br />+    ret = zxdh_get_port_vlan_attr(hw, vport, &port_vlan_attr);<br />+    if (ret) {<br />+        PMD_DRV_LOG(ERR, "[vfid:%d] get port vlan ret:%d", vfid, ret);<br />+        return ret;<br />+    }<br />+    ret = zxdh_get_port_attr(hw, vport, &vport_attr);<br />+    if (ret) {<br />+        PMD_DRV_LOG(ERR, "[vfid:%d] get port ret:%d", vfid, ret);<br />+        return ret;<br />+    }<br />+<br />+    if (type == ZXDH_VLAN_STRIP_TYPE)<br />+        port_vlan_attr.business_vlan_strip = !!enable;<br />+    else if (type == ZXDH_QINQ_STRIP_TYPE)<br />+        port_vlan_attr.business_qinq_strip = !!enable;<br />+    else if (type == ZXDH_VLAN_FILTER_TYPE)<br />+        port_vlan_attr.business_vlan_filter = !!enable;<br />+<br />+    port_vlan_attr.hit_flag = 1;<br />+<br />+    ret = zxdh_set_port_vlan_attr(hw, vport, &port_vlan_attr);<br />+    if (ret) {<br />+        PMD_DRV_LOG(ERR, "[vfid:%d] set port vlan ret:%d", vfid, ret);<br />+        return ret;<br />+    }<br />+<br />+    return zxdh_vlan_relate_vport(hw->eth_dev, vport, &vport_attr, &port_vlan_attr, enable);<br />+}<br />+<br />+int zxdh_set_vlan_filter(struct zxdh_hw *hw, uint16_t vport, uint8_t enable)<br />+{<br />+    return set_vlan_config(hw, vport, ZXDH_VLAN_FILTER_TYPE, enable);<br />+}<br />+<br />+int zxdh_set_vlan_offload(struct zxdh_hw *hw, uint16_t vport, uint8_t type, uint8_t enable)<br />+{<br />+    return set_vlan_config(hw, vport, type, enable);<br />+}<br />diff --git a/drivers/net/zxdh/zxdh_tables.h b/drivers/net/zxdh/zxdh_tables.h<br />index 040867d333..fe1de63f5c 100644<br />--- a/drivers/net/zxdh/zxdh_tables.h<br />+++ b/drivers/net/zxdh/zxdh_tables.h<br />@@ -33,22 +33,57 @@<br />  <br /> extern struct zxdh_dtb_shared_data g_dtb_data;<br />  <br />+struct zxdh_port_vlan_table {<br />+#if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN<br />+    uint16_t business_vlan_tpid:16;<br />+    /* byte[3,4] */<br />+    uint8_t rsv2:8;<br />+    /* byte[2] */<br />+    uint8_t rsv1: 4;<br />+    uint8_t business_vlan_strip: 1;<br />+    uint8_t business_qinq_strip: 1;<br />+    uint8_t business_vlan_filter: 1;<br />+    uint8_t hit_flag: 1;<br />+    /* byte[1] */<br />+    uint16_t sriov_vlan_tci:16;<br />+    /* byte[7:8] */<br />+    uint16_t sriov_vlan_tpid:16;<br />+    /* byte[5:6] */<br />+#else<br />+    uint8_t rsv1: 4;<br />+    uint8_t business_vlan_strip: 1;<br />+    uint8_t business_qinq_strip: 1;<br />+    uint8_t business_vlan_filter: 1;<br />+    uint8_t hit_flag: 1;<br />+    /* byte[1] */<br />+    uint8_t rsv2:8;<br />+    /* byte[2] */<br />+    uint16_t business_vlan_tpid:16;<br />+    /* byte[3:4] */<br />+    uint16_t sriov_vlan_tpid:16;<br />+    /* byte[5:6] */<br />+    uint16_t sriov_vlan_tci:16;<br />+    /* byte[7:8] */<br />+#endif<br />+};<br />+<br /> struct zxdh_port_attr_table {<br /> #if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN<br />-    uint8_t byte4_rsv1: 1;<br />-    uint8_t ingress_meter_enable: 1;<br />-    uint8_t egress_meter_enable: 1;<br />-    uint8_t byte4_rsv2: 2;<br />-    uint8_t fd_enable: 1;<br />-    uint8_t vepa_enable: 1;<br />+    uint8_t egress_meter_enable: 1; /* np view */<br />+    uint8_t ingress_meter_enable: 1; /* np view */<br />+    uint8_t egress_meter_mode: 1; /* np view */<br />+    uint8_t ingress_meter_mode: 1; /* np view */<br />+    uint8_t egress_tm_enable: 1; /* np view */<br />+    uint8_t ingress_tm_enable: 1; /* np view */<br />+    uint8_t rsv1: 1;<br />     uint8_t spoof_check_enable: 1;<br />  <br />     uint8_t inline_sec_offload: 1;<br />-    uint8_t ovs_enable: 1;<br />+    uint8_t fd_enable: 1;<br />     uint8_t lag_enable: 1;<br />-    uint8_t is_passthrough: 1;<br />+    uint8_t vepa_enable: 1;<br />     uint8_t is_vf: 1;<br />-    uint8_t virtion_version: 2;<br />+    uint8_t virtio_ver: 2;<br />     uint8_t virtio_enable: 1;<br />  <br />     uint8_t accelerator_offload_flag: 1;<br />@@ -58,13 +93,13 @@ struct zxdh_port_attr_table {<br />     uint8_t ip_checksum_offload: 1;<br />     uint8_t outer_ip_checksum_offload: 1;<br />     uint8_t is_up: 1;<br />-    uint8_t rsv1: 1;<br />+    uint8_t business_enable: 1;<br />  <br />-    uint8_t promisc_enable : 1;<br />+    uint8_t hw_bond_enable : 1;<br />     uint8_t rdma_offload_enable: 1;<br />-    uint8_t vlan_filter_enable: 1;<br />-    uint8_t vlan_strip_offload: 1;<br />-    uint8_t qinq_strip_offload: 1;<br />+    uint8_t promisc_enable: 1;<br />+    uint8_t sriov_vlan_enable: 1;<br />+    uint8_t business_vlan_enable: 1;<br />     uint8_t rss_enable: 1;<br />     uint8_t mtu_enable: 1;<br />     uint8_t hit_flag: 1;<br />@@ -73,7 +108,7 @@ struct zxdh_port_attr_table {<br />  <br />     uint16_t port_base_qid : 12;<br />     uint16_t hash_search_index : 3;<br />-    uint16_t rsv: 1;<br />+    uint16_t hpm: 1;<br />  <br />     uint8_t rss_hash_factor;<br />  <br />@@ -81,20 +116,20 @@ struct zxdh_port_attr_table {<br />     uint8_t phy_port: 4;<br />  <br />     uint16_t lag_id : 3;<br />+    uint16_t rsv81 : 1;<br />     uint16_t pf_vfid : 11;<br />-    uint16_t ingress_tm_enable : 1;<br />-    uint16_t egress_tm_enable : 1;<br />+    uint16_t rsv82 : 1;<br />  <br />     uint16_t tpid;<br />  <br />     uint16_t vhca : 10;<br />-    uint16_t uplink_port : 6;<br />+    uint16_t rsv16_1 : 6;<br /> #else<br />-    uint8_t rsv3 : 1;<br />+    uint8_t hw_bond_enable : 1;<br />     uint8_t rdma_offload_enable: 1;<br />-    uint8_t vlan_filter_enable: 1;<br />-    uint8_t vlan_strip_offload: 1;<br />-    uint8_t qinq_strip_offload: 1;<br />+    uint8_t promisc_enable: 1;<br />+    uint8_t sriov_vlan_enable: 1;<br />+    uint8_t business_vlan_enable: 1;<br />     uint8_t rss_enable: 1;<br />     uint8_t mtu_enable: 1;<br />     uint8_t hit_flag: 1;<br />@@ -106,34 +141,35 @@ struct zxdh_port_attr_table {<br />     uint8_t ip_checksum_offload: 1;<br />     uint8_t outer_ip_checksum_offload: 1;<br />     uint8_t is_up: 1;<br />-    uint8_t rsv1: 1;<br />+    uint8_t business_enable: 1;<br />  <br />     uint8_t inline_sec_offload: 1;<br />-    uint8_t ovs_enable: 1;<br />+    uint8_t fd_enable: 1;<br />     uint8_t lag_enable: 1;<br />-    uint8_t is_passthrough: 1;<br />+    uint8_t vepa_enable: 1;<br />     uint8_t is_vf: 1;<br />-    uint8_t virtion_version: 2;<br />+    uint8_t virtio_ver: 2;<br />     uint8_t virtio_enable: 1;<br />  <br />-    uint8_t byte4_rsv1: 1;<br />-    uint8_t ingress_meter_enable: 1;<br />-    uint8_t egress_meter_enable: 1;<br />-    uint8_t byte4_rsv2: 2;<br />-    uint8_t fd_enable: 1;<br />-    uint8_t vepa_enable: 1;<br />+    uint8_t egress_meter_enable: 1; /* np view */<br />+    uint8_t ingress_meter_enable: 1; /* np view */<br />+    uint8_t egress_meter_mode: 1; /* np view */<br />+    uint8_t ingress_meter_mode: 1; /* np view */<br />+    uint8_t egress_tm_enable: 1; /* np view */<br />+    uint8_t ingress_tm_enable: 1; /* np view */<br />+    uint8_t rsv1: 1;<br />     uint8_t spoof_check_enable: 1;<br />  <br />-    uint16_t port_base_qid : 12;<br />+    uint16_t port_base_qid : 12; /* need rte_bwap16 */<br />     uint16_t hash_search_index : 3;<br />     uint16_t rsv: 1;<br />  <br />     uint16_t mtu;<br />  <br />-    uint16_t lag_id : 3;<br />+    uint16_t lag_id : 3; /* need rte_bwap16 */<br />+    uint16_t rsv81 : 1;<br />     uint16_t pf_vfid : 11;<br />-    uint16_t ingress_tm_enable : 1;<br />-    uint16_t egress_tm_enable : 1;<br />+    uint16_t rsv82 : 1;<br />  <br />     uint8_t hash_alg: 4;<br />     uint8_t phy_port: 4;<br />@@ -143,7 +179,7 @@ struct zxdh_port_attr_table {<br />     uint16_t tpid;<br />  <br />     uint16_t vhca : 10;<br />-    uint16_t uplink_port : 6;<br />+    uint16_t rsv16_1 : 6;<br /> #endif<br /> };<br />  <br />@@ -249,5 +285,7 @@ int zxdh_rss_table_get(struct zxdh_hw *hw, uint16_t vport, struct zxdh_rss_reta<br /> int zxdh_get_panel_attr(struct rte_eth_dev *dev, struct zxdh_panel_table *panel_attr);<br /> int zxdh_set_panel_attr(struct rte_eth_dev *dev, struct zxdh_panel_table *panel_attr);<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 />  <br /> #endif /* ZXDH_TABLES_H */<br />--  <br />2.27.0<br />