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