provided vlan tpid set ops implementations. Signed-off-by: Junlong Wang --- drivers/net/zxdh/zxdh_ethdev.c | 1 + drivers/net/zxdh/zxdh_ethdev_ops.c | 37 ++++++++++++++++++++++++++++++ drivers/net/zxdh/zxdh_ethdev_ops.h | 1 + drivers/net/zxdh/zxdh_msg.c | 30 ++++++++++++++++++++++++ drivers/net/zxdh/zxdh_msg.h | 6 +++++ 5 files changed, 75 insertions(+) diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c index d92df46d11..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, diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c b/drivers/net/zxdh/zxdh_ethdev_ops.c index b1361ef518..52a6b1c919 100644 --- a/drivers/net/zxdh/zxdh_ethdev_ops.c +++ b/drivers/net/zxdh/zxdh_ethdev_ops.c @@ -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 b378a99a7e..69fdd3cf4e 100644 --- a/drivers/net/zxdh/zxdh_msg.c +++ b/drivers/net/zxdh/zxdh_msg.c @@ -2157,6 +2157,35 @@ 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) +{ + 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, @@ -2168,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..86c406c333 100644 --- a/drivers/net/zxdh/zxdh_msg.h +++ b/drivers/net/zxdh/zxdh_msg.h @@ -229,6 +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 +536,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 +556,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; -- 2.27.0