modify some vlan related issues, and provided vlan tpid set ops. Signed-off-by: Junlong Wang --- drivers/net/zxdh/zxdh_ethdev.c | 10 +++++- drivers/net/zxdh/zxdh_ethdev_ops.c | 39 +++++++++++++++++++- drivers/net/zxdh/zxdh_ethdev_ops.h | 1 + drivers/net/zxdh/zxdh_msg.c | 58 +++++++++++++++++++++++++++++- drivers/net/zxdh/zxdh_msg.h | 7 +++- drivers/net/zxdh/zxdh_tables.c | 30 ++++++++++++---- drivers/net/zxdh/zxdh_tables.h | 7 +++- 7 files changed, 140 insertions(+), 12 deletions(-) diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c index 74018821d1..9512aff99c 100644 --- a/drivers/net/zxdh/zxdh_ethdev.c +++ b/drivers/net/zxdh/zxdh_ethdev.c @@ -1429,6 +1429,7 @@ static const struct eth_dev_ops zxdh_eth_dev_ops = { .allmulticast_disable = zxdh_dev_allmulticast_disable, .vlan_filter_set = zxdh_dev_vlan_filter_set, .vlan_offload_set = zxdh_dev_vlan_offload_set, + .vlan_tpid_set = zxdh_vlan_tpid_set, .reta_update = zxdh_dev_rss_reta_update, .reta_query = zxdh_dev_rss_reta_query, .rss_hash_update = zxdh_rss_hash_update, @@ -1907,6 +1908,7 @@ zxdh_np_init(struct rte_eth_dev *eth_dev) static int zxdh_tables_init(struct rte_eth_dev *dev) { + struct zxdh_hw *hw = dev->data->dev_private; int ret = 0; ret = zxdh_port_attr_init(dev); @@ -1927,12 +1929,18 @@ zxdh_tables_init(struct rte_eth_dev *dev) return ret; } - ret = zxdh_vlan_filter_table_init(dev); + ret = zxdh_vlan_filter_table_init(hw, hw->vport.vport); if (ret) { PMD_DRV_LOG(ERR, "vlan filter table init failed"); return ret; } + ret = zxdh_port_vlan_table_init(hw, hw->vport.vport); + if (ret) { + PMD_DRV_LOG(ERR, "port vlan table init failed"); + return ret; + } + return ret; } diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c b/drivers/net/zxdh/zxdh_ethdev_ops.c index e865d23849..c16271aeaf 100644 --- a/drivers/net/zxdh/zxdh_ethdev_ops.c +++ b/drivers/net/zxdh/zxdh_ethdev_ops.c @@ -895,7 +895,7 @@ zxdh_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask) return -EAGAIN; } } else { - msg.data.vlan_filter_set_msg.enable = true; + msg.data.vlan_filter_set_msg.enable = false; zxdh_msg_head_build(hw, ZXDH_VLAN_FILTER_SET, &msg); ret = zxdh_vf_send_msg_to_pf(hw->eth_dev, &msg, sizeof(struct zxdh_msg_info), NULL, 0); @@ -1004,6 +1004,43 @@ zxdh_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask) return ret; } +int +zxdh_vlan_tpid_set(struct rte_eth_dev *dev, enum rte_vlan_type vlan_type, uint16_t tpid) +{ + struct zxdh_hw *hw = dev->data->dev_private; + struct zxdh_port_vlan_table port_vlan_table = {0}; + struct zxdh_msg_info msg = {0}; + int ret = 0; + + if (vlan_type != RTE_ETH_VLAN_TYPE_OUTER) { + PMD_DRV_LOG(ERR, "unsupported rte vlan type!"); + return -1; + } + + if (hw->is_pf) { + ret = zxdh_get_port_vlan_attr(hw, hw->vport.vport, &port_vlan_table); + if (ret != 0) + PMD_DRV_LOG(ERR, "get port vlan attr table failed"); + port_vlan_table.hit_flag = 1; + port_vlan_table.business_vlan_tpid = tpid; + ret = zxdh_set_port_vlan_attr(hw, hw->vport.vport, &port_vlan_table); + if (ret != 0) + PMD_DRV_LOG(ERR, "set port vlan tpid %d attr table failed", tpid); + } else { + zxdh_msg_head_build(hw, ZXDH_VLAN_SET_TPID, &msg); + msg.data.zxdh_vlan_tpid.tpid = tpid; + ret = zxdh_vf_send_msg_to_pf(dev, &msg, + sizeof(struct zxdh_msg_info), NULL, 0); + if (ret) { + PMD_DRV_LOG(ERR, "port %d vlan tpid %d set failed", + hw->vfid, tpid); + return -1; + } + } + + return 0; +} + int zxdh_dev_rss_reta_update(struct rte_eth_dev *dev, struct rte_eth_rss_reta_entry64 *reta_conf, diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.h b/drivers/net/zxdh/zxdh_ethdev_ops.h index 97a1eb4532..6015b3de59 100644 --- a/drivers/net/zxdh/zxdh_ethdev_ops.h +++ b/drivers/net/zxdh/zxdh_ethdev_ops.h @@ -120,6 +120,7 @@ int zxdh_dev_allmulticast_enable(struct rte_eth_dev *dev); int zxdh_dev_allmulticast_disable(struct rte_eth_dev *dev); int zxdh_dev_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on); int zxdh_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask); +int zxdh_vlan_tpid_set(struct rte_eth_dev *dev, enum rte_vlan_type vlan_type, uint16_t tpid); int zxdh_dev_rss_reta_update(struct rte_eth_dev *dev, struct rte_eth_rss_reta_entry64 *reta_conf, uint16_t reta_size); diff --git a/drivers/net/zxdh/zxdh_msg.c b/drivers/net/zxdh/zxdh_msg.c index 49291cfbaf..be4f115380 100644 --- a/drivers/net/zxdh/zxdh_msg.c +++ b/drivers/net/zxdh/zxdh_msg.c @@ -1233,6 +1233,24 @@ zxdh_vf_promisc_uninit(struct zxdh_hw *hw, union zxdh_virport_num vport) return ret; } +static int +zxdh_vf_vlan_table_init(struct zxdh_hw *hw, uint16_t vport) +{ + int ret = 0; + ret = zxdh_vlan_filter_table_init(hw, vport); + if (ret) { + PMD_DRV_LOG(ERR, "vf vlan filter table init failed, code:%d", ret); + return -1; + } + + ret = zxdh_port_vlan_table_init(hw, vport); + if (ret) { + PMD_DRV_LOG(ERR, "vf port vlan table init failed, code:%d", ret); + return -1; + } + return ret; +} + static int zxdh_vf_port_init(struct zxdh_hw *pf_hw, uint16_t vport, void *cfg_data, void *res_info, uint16_t *res_len) @@ -1254,7 +1272,7 @@ zxdh_vf_port_init(struct zxdh_hw *pf_hw, uint16_t vport, void *cfg_data, port_attr.port_base_qid = vf_init_msg->base_qid; uint16_t vfid = zxdh_vport_to_vfid(port); - ret = zxdh_set_port_attr(pf_hw, vfid, &port_attr); + ret = zxdh_set_port_attr(pf_hw, vport, &port_attr); if (ret) { PMD_DRV_LOG(ERR, "set vport attr failed, code:%d", ret); goto proc_end; @@ -1265,6 +1283,13 @@ zxdh_vf_port_init(struct zxdh_hw *pf_hw, uint16_t vport, void *cfg_data, PMD_DRV_LOG(ERR, "vf_promisc_table_init failed, code:%d", ret); goto proc_end; } + + ret = zxdh_vf_vlan_table_init(pf_hw, vport); + if (ret) { + PMD_DRV_LOG(ERR, "vf vlan table init failed, code:%d", ret); + goto proc_end; + } + ZXDH_SET(msg_reply_body, res_info, flag, ZXDH_REPS_SUCC); *res_len = sizeof(uint8_t); @@ -2131,6 +2156,36 @@ zxdh_vf_mtr_hw_profile_cfg(struct zxdh_hw *pf_hw __rte_unused, return 0; } +static int +zxdh_vf_vlan_tpid_set(struct zxdh_hw *pf_hw, uint16_t vport, void *cfg_data, + void *res_info, uint16_t *res_len) +{ + union zxdh_virport_num port = {.vport = vport}; + struct zxdh_vlan_tpid *vlan_tpid = (struct zxdh_vlan_tpid *)cfg_data; + struct zxdh_port_vlan_table port_vlan_table = {0}; + int ret = 0; + + RTE_ASSERT(!cfg_data || !pf_hw || !res_info || !res_len); + + ret = zxdh_get_port_vlan_attr(pf_hw, vport, &port_vlan_table); + if (ret) { + PMD_DRV_LOG(ERR, "get port vlan attr failed, code:%d", ret); + goto proc_end; + } + port_vlan_table.hit_flag = 1; + port_vlan_table.business_vlan_tpid = vlan_tpid->tpid; + ret = zxdh_set_port_vlan_attr(pf_hw, vport, &port_vlan_table); + if (ret) { + PMD_DRV_LOG(ERR, "set port vlan attr failed, code:%d", ret); + goto proc_end; + } + +proc_end: + *res_len = sizeof(uint8_t); + ZXDH_SET(msg_reply_body, res_info, flag, ZXDH_REPS_FAIL); + return ret; +} + static const zxdh_msg_process_callback zxdh_proc_cb[] = { [ZXDH_NULL] = NULL, [ZXDH_VF_PORT_INIT] = zxdh_vf_port_init, @@ -2142,6 +2197,7 @@ static const zxdh_msg_process_callback zxdh_proc_cb[] = { [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, + [ZXDH_VLAN_SET_TPID] = zxdh_vf_vlan_tpid_set, [ZXDH_RSS_ENABLE] = zxdh_vf_rss_enable, [ZXDH_RSS_RETA_GET] = zxdh_vf_rss_table_get, [ZXDH_RSS_RETA_SET] = zxdh_vf_rss_table_set, diff --git a/drivers/net/zxdh/zxdh_msg.h b/drivers/net/zxdh/zxdh_msg.h index 7dad6f7335..b62ace7219 100644 --- a/drivers/net/zxdh/zxdh_msg.h +++ b/drivers/net/zxdh/zxdh_msg.h @@ -229,7 +229,7 @@ enum zxdh_msg_type { ZXDH_VLAN_FILTER_ADD = 18, ZXDH_VLAN_FILTER_DEL = 19, ZXDH_VLAN_OFFLOAD = 21, - + ZXDH_VLAN_SET_TPID = 23, ZXDH_PORT_ATTRS_SET = 25, ZXDH_PORT_PROMISC_SET = 26, @@ -535,6 +535,10 @@ struct zxdh_plcr_profile_free { uint16_t profile_id; }; +struct zxdh_vlan_tpid { + uint16_t tpid; +}; + struct zxdh_msg_info { union { uint8_t head_len[ZXDH_MSG_HEAD_LEN]; @@ -551,6 +555,7 @@ struct zxdh_msg_info { struct zxdh_vlan_filter vlan_filter_msg; struct zxdh_vlan_filter_set vlan_filter_set_msg; struct zxdh_vlan_offload vlan_offload_msg; + struct zxdh_vlan_tpid zxdh_vlan_tpid; struct zxdh_rss_reta rss_reta; struct zxdh_rss_enable rss_enable; struct zxdh_rss_hf rss_hf; diff --git a/drivers/net/zxdh/zxdh_tables.c b/drivers/net/zxdh/zxdh_tables.c index 26d9b90382..57a291e92a 100644 --- a/drivers/net/zxdh/zxdh_tables.c +++ b/drivers/net/zxdh/zxdh_tables.c @@ -700,10 +700,11 @@ zxdh_dev_multicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable) } int -zxdh_vlan_filter_table_init(struct rte_eth_dev *dev) +zxdh_vlan_filter_table_init(struct zxdh_hw *hw, uint16_t vport) { - struct zxdh_hw *hw = dev->data->dev_private; struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd; + union zxdh_virport_num vport_num = (union zxdh_virport_num)vport; + uint16_t vfid = zxdh_vport_to_vfid(vport_num); struct zxdh_vlan_filter_table vlan_table = {0}; int16_t ret = 0; @@ -718,7 +719,7 @@ zxdh_vlan_filter_table_init(struct rte_eth_dev *dev) } else { vlan_table.vlans[0] = 0; } - uint32_t index = (vlan_group << 11) | hw->vport.vfid; + uint32_t index = (vlan_group << 11) | vfid; ZXDH_DTB_ERAM_ENTRY_INFO_T entry_data = { .index = index, .p_data = (uint32_t *)&vlan_table @@ -730,7 +731,7 @@ zxdh_vlan_filter_table_init(struct rte_eth_dev *dev) if (ret != 0) { PMD_DRV_LOG(ERR, "[vfid:%d], vlan_group:%d, init vlan filter table failed", - hw->vport.vfid, vlan_group); + vfid, vlan_group); ret = -1; } } @@ -750,7 +751,7 @@ zxdh_vlan_filter_table_set(struct zxdh_hw *hw, uint16_t vport, uint16_t vlan_id, memset(&vlan_table, 0, sizeof(struct zxdh_vlan_filter_table)); int table_num = vlan_id / ZXDH_VLAN_FILTER_VLANID_STEP; uint32_t index = (table_num << 11) | vfid; - uint16_t group = (vlan_id - table_num * ZXDH_VLAN_FILTER_VLANID_STEP) / 8 + 1; + uint16_t group = (vlan_id % ZXDH_VLAN_FILTER_VLANID_STEP) / 8 + 1; uint8_t val = sizeof(struct zxdh_vlan_filter_table) / sizeof(uint32_t); uint8_t vlan_tbl_index = group / val; @@ -951,7 +952,7 @@ zxdh_vlan_relate_vport(struct rte_eth_dev *dev, uint16_t vport, return 0; } -static int +int zxdh_set_port_vlan_attr(struct zxdh_hw *hw, uint16_t vport, struct zxdh_port_vlan_table *port_vlan) { @@ -974,7 +975,7 @@ zxdh_set_port_vlan_attr(struct zxdh_hw *hw, uint16_t vport, return ret; } -static int +int zxdh_get_port_vlan_attr(struct zxdh_hw *hw, uint16_t vport, struct zxdh_port_vlan_table *port_vlan) { @@ -1046,3 +1047,18 @@ int zxdh_set_vlan_offload(struct zxdh_hw *hw, uint16_t vport, uint8_t type, uint { return set_vlan_config(hw, vport, type, enable); } + +int zxdh_port_vlan_table_init(struct zxdh_hw *hw, uint16_t vport) +{ + struct zxdh_port_vlan_table port_vlan = {0}; + int ret = 0; + + if (!hw->is_pf) + return 0; + + ret = zxdh_set_port_vlan_attr(hw, vport, &port_vlan); + if (ret) + PMD_DRV_LOG(ERR, "port vlan table init failed"); + + return ret; +} diff --git a/drivers/net/zxdh/zxdh_tables.h b/drivers/net/zxdh/zxdh_tables.h index cb34e38be8..3280ff1f89 100644 --- a/drivers/net/zxdh/zxdh_tables.h +++ b/drivers/net/zxdh/zxdh_tables.h @@ -362,7 +362,7 @@ int zxdh_promisc_table_init(struct rte_eth_dev *dev); int zxdh_promisc_table_uninit(struct rte_eth_dev *dev); int zxdh_dev_unicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable); int zxdh_dev_multicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable); -int zxdh_vlan_filter_table_init(struct rte_eth_dev *dev); +int zxdh_vlan_filter_table_init(struct zxdh_hw *hw, uint16_t vport); int zxdh_vlan_filter_table_set(struct zxdh_hw *hw, uint16_t vport, uint16_t vlan_id, uint8_t enable); int zxdh_rss_table_set(struct zxdh_hw *hw, uint16_t vport, struct zxdh_rss_reta *rss_reta); @@ -372,5 +372,10 @@ int zxdh_set_panel_attr(struct rte_eth_dev *dev, struct zxdh_panel_table *panel_ 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); +int zxdh_set_port_vlan_attr(struct zxdh_hw *hw, uint16_t vport, + struct zxdh_port_vlan_table *port_vlan); +int zxdh_get_port_vlan_attr(struct zxdh_hw *hw, uint16_t vport, + struct zxdh_port_vlan_table *port_vlan); +int zxdh_port_vlan_table_init(struct zxdh_hw *hw, uint16_t vport); #endif /* ZXDH_TABLES_H */ -- 2.27.0