* [PATCH v1 1/3] net/zxdh: modify some MAC config issues @ 2025-06-07 2:30 Junlong Wang 2025-06-07 2:30 ` [PATCH v1 2/3] net/zxdh: modify some VLAN related issues Junlong Wang ` (5 more replies) 0 siblings, 6 replies; 14+ messages in thread From: Junlong Wang @ 2025-06-07 2:30 UTC (permalink / raw) To: dev; +Cc: Junlong Wang [-- Attachment #1.1.1: Type: text/plain, Size: 12987 bytes --] modify some mac config issues, which were discovered during the testing process. Signed-off-by: Junlong Wang <wang.junlong1@zte.com.cn> --- drivers/net/zxdh/meson.build | 2 +- drivers/net/zxdh/zxdh_ethdev.c | 16 +++++++++++++ drivers/net/zxdh/zxdh_ethdev_ops.c | 36 +++++++++++++++++++++++------- drivers/net/zxdh/zxdh_msg.c | 10 ++++----- drivers/net/zxdh/zxdh_tables.c | 29 +++++++++++++----------- 5 files changed, 66 insertions(+), 27 deletions(-) diff --git a/drivers/net/zxdh/meson.build b/drivers/net/zxdh/meson.build index a48a0d43c2..ec71451a55 100644 --- a/drivers/net/zxdh/meson.build +++ b/drivers/net/zxdh/meson.build @@ -7,7 +7,7 @@ if not is_linux subdir_done() endif -if not dpdk_conf.has('RTE_ARCH_X86_64') or not dpdk_conf.get('RTE_ARCH_64') +if arch_subdir != 'x86' and arch_subdir != 'arm' or not dpdk_conf.get('RTE_ARCH_64') build = false reason = 'only supported on x86_64 and aarch64' subdir_done() diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c index 80053678cb..74018821d1 100644 --- a/drivers/net/zxdh/zxdh_ethdev.c +++ b/drivers/net/zxdh/zxdh_ethdev.c @@ -1265,6 +1265,7 @@ static int zxdh_mac_config(struct rte_eth_dev *eth_dev) { struct zxdh_hw *hw = eth_dev->data->dev_private; + struct zxdh_msg_info msg_info = {0}; int ret = 0; if (hw->is_pf) { @@ -1274,7 +1275,22 @@ zxdh_mac_config(struct rte_eth_dev *eth_dev) PMD_DRV_LOG(ERR, "Failed to add mac: port 0x%x", hw->vport.vport); return ret; } + hw->uc_num++; + } else { + struct zxdh_mac_filter *mac_filter = &msg_info.data.mac_filter_msg; + + mac_filter->filter_flag = 0xff; + memcpy(&mac_filter->mac, ð_dev->data->mac_addrs[0], + sizeof(eth_dev->data->mac_addrs[0])); + zxdh_msg_head_build(hw, ZXDH_MAC_ADD, &msg_info); + ret = zxdh_vf_send_msg_to_pf(eth_dev, &msg_info, sizeof(msg_info), NULL, 0); + if (ret) { + PMD_DRV_LOG(ERR, "Failed to send msg: msg type %d", ZXDH_MAC_ADD); + return ret; + } + hw->uc_num++; } + return ret; } diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c b/drivers/net/zxdh/zxdh_ethdev_ops.c index f8e8d26c50..e865d23849 100644 --- a/drivers/net/zxdh/zxdh_ethdev_ops.c +++ b/drivers/net/zxdh/zxdh_ethdev_ops.c @@ -413,7 +413,10 @@ zxdh_dev_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *addr) struct zxdh_hw *hw = (struct zxdh_hw *)dev->data->dev_private; struct rte_ether_addr *old_addr = &dev->data->mac_addrs[0]; struct zxdh_msg_info msg_info = {0}; - uint16_t ret = 0; + uint8_t zxdh_msg_reply_info[ZXDH_ST_SZ_BYTES(msg_reply_info)] = {0}; + void *reply_body_addr = ZXDH_ADDR_OF(msg_reply_info, zxdh_msg_reply_info, reply_body); + void *mac_reply_msg_addr = ZXDH_ADDR_OF(msg_reply_body, reply_body_addr, mac_reply_msg); + int ret = 0; if (!rte_is_valid_assigned_ether_addr(addr)) { PMD_DRV_LOG(ERR, "mac address is invalid!"); @@ -425,7 +428,7 @@ zxdh_dev_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *addr) if (hw->is_pf) { ret = zxdh_add_mac_table(hw, hw->vport.vport, addr, hw->hash_search_index, 0, 0); if (ret) { - if (ret == ZXDH_EEXIST_MAC_FLAG) { + if (ret == -EADDRINUSE) { PMD_DRV_LOG(ERR, "pf mac add failed! mac is in used, code:%d", ret); return -EADDRINUSE; } @@ -446,9 +449,11 @@ zxdh_dev_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *addr) mac_filter->filter_flag = ZXDH_MAC_UNFILTER; memcpy(&mac_filter->mac, addr, sizeof(struct rte_ether_addr)); zxdh_msg_head_build(hw, ZXDH_MAC_ADD, &msg_info); - ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), NULL, 0); + ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), + zxdh_msg_reply_info, ZXDH_ST_SZ_BYTES(msg_reply_info)); if (ret) { - if (ret == ZXDH_EEXIST_MAC_FLAG) { + uint8_t flag = ZXDH_GET(mac_reply_msg, mac_reply_msg_addr, mac_flag); + if (flag == ZXDH_EEXIST_MAC_FLAG) { PMD_DRV_LOG(ERR, "pf mac add failed! mac is in used, code:%d", ret); return -EADDRINUSE; } @@ -482,7 +487,11 @@ zxdh_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, { struct zxdh_hw *hw = dev->data->dev_private; struct zxdh_msg_info msg_info = {0}; - uint16_t i, ret; + uint8_t zxdh_msg_reply_info[ZXDH_ST_SZ_BYTES(msg_reply_info)] = {0}; + void *reply_body_addr = ZXDH_ADDR_OF(msg_reply_info, zxdh_msg_reply_info, reply_body); + void *mac_reply_msg_addr = ZXDH_ADDR_OF(msg_reply_body, reply_body_addr, mac_reply_msg); + uint16_t i; + int ret; if (index >= ZXDH_MAX_MAC_ADDRS) { PMD_DRV_LOG(ERR, "Add mac index (%u) is out of range", index); @@ -503,6 +512,10 @@ zxdh_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, ret = zxdh_add_mac_table(hw, hw->vport.vport, mac_addr, hw->hash_search_index, 0, 0); if (ret) { + if (ret == -EADDRINUSE) { + PMD_DRV_LOG(ERR, "pf mac add failed mac is in used"); + return -EADDRINUSE; + } PMD_DRV_LOG(ERR, "mac_addr_add failed, code:%d", ret); return ret; } @@ -530,15 +543,22 @@ zxdh_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, } } else { struct zxdh_mac_filter *mac_filter = &msg_info.data.mac_filter_msg; - + uint8_t flag; mac_filter->filter_flag = ZXDH_MAC_FILTER; memcpy(&mac_filter->mac, mac_addr, sizeof(struct rte_ether_addr)); zxdh_msg_head_build(hw, ZXDH_MAC_ADD, &msg_info); if (rte_is_unicast_ether_addr(mac_addr)) { if (hw->uc_num < ZXDH_MAX_UC_MAC_ADDRS) { - ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, - sizeof(msg_info), NULL, 0); + ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), + zxdh_msg_reply_info, + ZXDH_ST_SZ_BYTES(msg_reply_info)); if (ret) { + flag = ZXDH_GET(mac_reply_msg, + mac_reply_msg_addr, mac_flag); + if (flag == ZXDH_EEXIST_MAC_FLAG) { + PMD_DRV_LOG(ERR, "pf mac add failed mac is in used"); + return -EADDRINUSE; + } PMD_DRV_LOG(ERR, "Failed to send msg: port 0x%x msg type %d", hw->vport.vport, ZXDH_MAC_ADD); return ret; diff --git a/drivers/net/zxdh/zxdh_msg.c b/drivers/net/zxdh/zxdh_msg.c index 02ecd93b12..49291cfbaf 100644 --- a/drivers/net/zxdh/zxdh_msg.c +++ b/drivers/net/zxdh/zxdh_msg.c @@ -1349,11 +1349,11 @@ zxdh_add_vf_mac_table(struct zxdh_hw *hw, uint16_t vport, void *cfg_data, union zxdh_virport_num port = {0}; struct zxdh_mac_filter *mac_filter = (struct zxdh_mac_filter *)cfg_data; struct rte_ether_addr *addr = &mac_filter->mac; - int i = 0, ret = 0; - uint16_t vf_id = port.vfid; - port.vport = vport; void *reply_data_addr = ZXDH_ADDR_OF(msg_reply_body, reply_body, reply_data); void *mac_reply_msg_addr = ZXDH_ADDR_OF(msg_reply_body, reply_body, mac_reply_msg); + port.vport = vport; + uint16_t vf_id = port.vfid; + int i = 0, ret = 0; for (i = 0; i < ZXDH_MAX_MAC_ADDRS; i++) if (rte_is_same_ether_addr(&hw->vfinfo[vf_id].vf_mac[i], addr)) @@ -1396,12 +1396,12 @@ static int zxdh_del_vf_mac_table(struct zxdh_hw *hw, uint16_t vport, void *cfg_data, void *res_info, uint16_t *res_len) { - int ret, i = 0; struct zxdh_mac_filter *mac_filter = (struct zxdh_mac_filter *)cfg_data; union zxdh_virport_num port = (union zxdh_virport_num)vport; char str[ZXDH_MSG_REPLY_BODY_MAX_LEN] = "del mac"; - uint16_t vf_id = port.vfid; + uint16_t vf_id = port.vfid; void *reply_data_addr = ZXDH_ADDR_OF(msg_reply_body, res_info, reply_data); + int ret, i = 0; PMD_DRV_LOG(DEBUG, "[PF GET MSG FROM VF]--vf mac to del."); ret = zxdh_del_mac_table(hw, vport, &mac_filter->mac, hw->hash_search_index, 0, 0); diff --git a/drivers/net/zxdh/zxdh_tables.c b/drivers/net/zxdh/zxdh_tables.c index 29741e53ed..26d9b90382 100644 --- a/drivers/net/zxdh/zxdh_tables.c +++ b/drivers/net/zxdh/zxdh_tables.c @@ -8,8 +8,9 @@ #include "zxdh_tables.h" #include "zxdh_logs.h" -#define ZXDH_UNIMAC_HASH_INDEX(index) (ZXDH_SDT_L2_ENTRY_TABLE0 + (index)) -#define ZXDH_MULTIMAC_HASH_INDEX(index) (ZXDH_SDT_MC_TABLE0 + (index)) + +#define ZXDH_UNICAST_MAC_HASH_INDEX(index) (ZXDH_SDT_L2_ENTRY_TABLE0 + (index)) +#define ZXDH_MULTICAST_MAC_HASH_INDEX(index) (ZXDH_SDT_MC_TABLE0 + (index)) #define ZXDH_MC_GROUP_NUM 4 #define ZXDH_BASE_VFID 1152 #define ZXDH_TABLE_HIT_FLAG 128 @@ -257,7 +258,7 @@ zxdh_add_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad .p_rst = (uint8_t *)&unicast_table.entry }; ZXDH_DTB_USER_ENTRY_T entry_get = { - .sdt_no = ZXDH_UNIMAC_HASH_INDEX(hash_search_idx), + .sdt_no = ZXDH_UNICAST_MAC_HASH_INDEX(hash_search_idx), .p_entry_data = (void *)&dtb_hash_entry }; @@ -294,19 +295,20 @@ zxdh_add_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad }; ZXDH_DTB_USER_ENTRY_T entry_get = { - .sdt_no = ZXDH_MULTIMAC_HASH_INDEX(hash_search_idx), + .sdt_no = ZXDH_MULTICAST_MAC_HASH_INDEX(hash_search_idx), .p_entry_data = (void *)&dtb_hash_entry }; ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid, &entry_get, 1); uint8_t index = (vport_num.vfid % 64) / 32; + uint8_t value = (vport_num.vfid % 64) % 32; if (ret == 0) { if (vport_num.vf_flag) { if (group_id == vport_num.vfid / 64) multicast_table.entry.mc_bitmap[index] |= rte_cpu_to_be_32(UINT32_C(1) << - (31 - index)); + (31 - value)); } else { if (group_id == vport_num.vfid / 64) multicast_table.entry.mc_pf_enable = @@ -317,7 +319,7 @@ zxdh_add_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad if (group_id == vport_num.vfid / 64) multicast_table.entry.mc_bitmap[index] |= rte_cpu_to_be_32(UINT32_C(1) << - (31 - index)); + (31 - value)); else multicast_table.entry.mc_bitmap[index] = false; @@ -347,8 +349,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad struct zxdh_mac_unicast_table unicast_table = {0}; struct zxdh_mac_multicast_table multicast_table = {0}; union zxdh_virport_num vport_num = (union zxdh_virport_num)vport; - union zxdh_virport_num port = (union zxdh_virport_num)vport; - uint16_t vfid = zxdh_vport_to_vfid(port); + uint16_t vfid = zxdh_vport_to_vfid(vport_num); uint32_t ret, del_flag = 0; uint16_t group_id = 0; @@ -365,7 +366,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad }; ZXDH_DTB_USER_ENTRY_T entry_get = { - .sdt_no = ZXDH_UNIMAC_HASH_INDEX(hash_search_idx), + .sdt_no = ZXDH_UNICAST_MAC_HASH_INDEX(hash_search_idx), .p_entry_data = (void *)&dtb_hash_entry }; ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid, @@ -393,16 +394,17 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad }; ZXDH_DTB_USER_ENTRY_T entry_get = { - .sdt_no = ZXDH_MULTIMAC_HASH_INDEX(hash_search_idx), + .sdt_no = ZXDH_MULTICAST_MAC_HASH_INDEX(hash_search_idx), .p_entry_data = (void *)&dtb_hash_entry }; ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid, &entry_get, 1); uint8_t index = (vport_num.vfid % 64) / 32; + uint8_t value = (vport_num.vfid % 64) % 32; if (vport_num.vf_flag) multicast_table.entry.mc_bitmap[index] &= - ~(rte_cpu_to_be_32(UINT32_C(1) << (31 - index))); + ~(rte_cpu_to_be_32(UINT32_C(1) << (31 - value))); else multicast_table.entry.mc_pf_enable = 0; @@ -422,7 +424,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad .p_rst = (uint8_t *)&multicast_table.entry }; ZXDH_DTB_USER_ENTRY_T entry_get = { - .sdt_no = ZXDH_MULTIMAC_HASH_INDEX(hash_search_idx), + .sdt_no = ZXDH_MULTICAST_MAC_HASH_INDEX(hash_search_idx), .p_entry_data = (void *)&dtb_hash_entry }; @@ -447,7 +449,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad .p_rst = (uint8_t *)&multicast_table.entry }; ZXDH_DTB_USER_ENTRY_T entry_get = { - .sdt_no = ZXDH_MULTIMAC_HASH_INDEX(hash_search_idx), + .sdt_no = ZXDH_MULTICAST_MAC_HASH_INDEX(hash_search_idx), .p_entry_data = (void *)&dtb_hash_entry }; @@ -604,6 +606,7 @@ zxdh_dev_unicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable) struct zxdh_unitcast_table uc_table = {0}; struct zxdh_port_attr_table port_attr = {0}; union zxdh_virport_num vport_num = (union zxdh_virport_num)vport; + uint16_t vfid = zxdh_vport_to_vfid(vport_num); int16_t ret = 0; ZXDH_DTB_ERAM_ENTRY_INFO_T uc_table_entry = { -- 2.27.0 [-- Attachment #1.1.2: Type: text/html , Size: 34183 bytes --] ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v1 2/3] net/zxdh: modify some VLAN related issues 2025-06-07 2:30 [PATCH v1 1/3] net/zxdh: modify some MAC config issues Junlong Wang @ 2025-06-07 2:30 ` Junlong Wang 2025-06-16 16:20 ` Stephen Hemminger 2025-06-07 2:30 ` [PATCH v1 3/3] net/zxdh: modify RSS " Junlong Wang ` (4 subsequent siblings) 5 siblings, 1 reply; 14+ messages in thread From: Junlong Wang @ 2025-06-07 2:30 UTC (permalink / raw) To: dev; +Cc: Junlong Wang [-- Attachment #1.1.1: Type: text/plain, Size: 13158 bytes --] modify some vlan related issues, and provided vlan tpid set ops. Signed-off-by: Junlong Wang <wang.junlong1@zte.com.cn> --- 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 [-- Attachment #1.1.2: Type: text/html , Size: 28012 bytes --] ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v1 2/3] net/zxdh: modify some VLAN related issues 2025-06-07 2:30 ` [PATCH v1 2/3] net/zxdh: modify some VLAN related issues Junlong Wang @ 2025-06-16 16:20 ` Stephen Hemminger 0 siblings, 0 replies; 14+ messages in thread From: Stephen Hemminger @ 2025-06-16 16:20 UTC (permalink / raw) To: Junlong Wang; +Cc: dev On Sat, 7 Jun 2025 10:30:19 +0800 Junlong Wang <wang.junlong1@zte.com.cn> wrote: > modify some vlan related issues, and provided > vlan tpid set ops. > > Signed-off-by: Junlong Wang <wang.junlong1@zte.com.cn> Best not to mix bug fix with new features. Bug fix should have Fixes: tag. ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v1 3/3] net/zxdh: modify RSS related issues 2025-06-07 2:30 [PATCH v1 1/3] net/zxdh: modify some MAC config issues Junlong Wang 2025-06-07 2:30 ` [PATCH v1 2/3] net/zxdh: modify some VLAN related issues Junlong Wang @ 2025-06-07 2:30 ` Junlong Wang 2025-06-16 16:22 ` Stephen Hemminger 2025-06-12 0:14 ` [PATCH v1 1/3] net/zxdh: modify some MAC config issues Thomas Monjalon ` (3 subsequent siblings) 5 siblings, 1 reply; 14+ messages in thread From: Junlong Wang @ 2025-06-07 2:30 UTC (permalink / raw) To: dev; +Cc: Junlong Wang [-- Attachment #1.1.1: Type: text/plain, Size: 9205 bytes --] modify rss related issues in testing process. Signed-off-by: Junlong Wang <wang.junlong1@zte.com.cn> --- drivers/net/zxdh/zxdh_ethdev.c | 1 + drivers/net/zxdh/zxdh_ethdev_ops.c | 66 +++++++++++++++++++----------- drivers/net/zxdh/zxdh_ethdev_ops.h | 4 +- drivers/net/zxdh/zxdh_msg.c | 12 +++--- drivers/net/zxdh/zxdh_tables.c | 8 ++-- 5 files changed, 54 insertions(+), 37 deletions(-) diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c index 9512aff99c..a245ab24ce 100644 --- a/drivers/net/zxdh/zxdh_ethdev.c +++ b/drivers/net/zxdh/zxdh_ethdev.c @@ -66,6 +66,7 @@ zxdh_dev_infos_get(struct rte_eth_dev *dev, dev_info->rx_offload_capa |= RTE_ETH_RX_OFFLOAD_TCP_LRO; dev_info->rx_offload_capa |= RTE_ETH_RX_OFFLOAD_RSS_HASH; + dev_info->hash_key_size = ZXDH_RSS_HASH_KEY_LEN; dev_info->reta_size = RTE_ETH_RSS_RETA_SIZE_256; dev_info->flow_type_rss_offloads = ZXDH_RSS_HF; diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c b/drivers/net/zxdh/zxdh_ethdev_ops.c index c16271aeaf..86517d571a 100644 --- a/drivers/net/zxdh/zxdh_ethdev_ops.c +++ b/drivers/net/zxdh/zxdh_ethdev_ops.c @@ -289,7 +289,7 @@ zxdh_link_info_get(struct rte_eth_dev *dev, struct rte_eth_link *link) zxdh_pci_read_dev_config(hw, offsetof(struct zxdh_net_config, status), &status, sizeof(status)); - link->link_status = status; + link->link_status = status & hw->admin_status; if (status == RTE_ETH_LINK_DOWN) { link->link_speed = RTE_ETH_SPEED_NUM_UNKNOWN; @@ -1207,7 +1207,7 @@ zxdh_rss_hf_to_hw(uint64_t hf) } static uint64_t -zxdh_rss_hf_to_eth(uint32_t hw_hf) +zxdh_rss_hf_to_eth(uint64_t hw_hf) { uint64_t hf = 0; @@ -1245,7 +1245,7 @@ zxdh_rss_hash_update(struct rte_eth_dev *dev, hw_hf_new = zxdh_rss_hf_to_hw(rss_conf->rss_hf); hw_hf_old = zxdh_rss_hf_to_hw(old_rss_conf->rss_hf); - if ((hw_hf_new != hw_hf_old || !!rss_conf->rss_hf)) + if ((hw_hf_new != hw_hf_old || hw->rss_enable != (!!rss_conf->rss_hf))) need_update_hf = 1; if (need_update_hf) { @@ -1267,6 +1267,9 @@ zxdh_rss_hash_update(struct rte_eth_dev *dev, return -EINVAL; } } + hw->rss_enable = !!rss_conf->rss_hf; + if (rss_conf->rss_hf == 0) + return 0; if (hw->is_pf) { ret = zxdh_get_port_attr(hw, hw->vport.vport, &port_attr); port_attr.rss_hash_factor = hw_hf_new; @@ -1294,15 +1297,16 @@ zxdh_rss_hash_update(struct rte_eth_dev *dev, int zxdh_rss_hash_conf_get(struct rte_eth_dev *dev, struct rte_eth_rss_conf *rss_conf) { - struct zxdh_hw *hw = (struct zxdh_hw *)dev->data->dev_private; + struct zxdh_hw *hw = dev->data->dev_private; struct rte_eth_rss_conf *old_rss_conf = &dev->data->dev_conf.rx_adv_conf.rss_conf; struct zxdh_msg_info msg = {0}; uint8_t zxdh_msg_reply_info[ZXDH_ST_SZ_BYTES(msg_reply_info)] = {0}; void *reply_body_addr = ZXDH_ADDR_OF(msg_reply_info, zxdh_msg_reply_info, reply_body); void *rss_hf_msg_addr = ZXDH_ADDR_OF(msg_reply_body, reply_body_addr, rss_hf_msg); struct zxdh_port_attr_table port_attr = {0}; - uint32_t rss_hf; - uint32_t hw_hf; + uint64_t rss_hf = 0; + uint64_t hw_hf = 0; + uint8_t need_update_hf = 0; int ret; if (rss_conf == NULL) { @@ -1310,27 +1314,40 @@ zxdh_rss_hash_conf_get(struct rte_eth_dev *dev, struct rte_eth_rss_conf *rss_con return -ENOMEM; } - hw_hf = zxdh_rss_hf_to_hw(old_rss_conf->rss_hf); - rss_conf->rss_hf = zxdh_rss_hf_to_eth(hw_hf); + if (hw->rss_enable == 0) { + rss_conf->rss_hf = 0; + return 0; + } - zxdh_msg_head_build(hw, ZXDH_RSS_HF_GET, &msg); - if (hw->is_pf) { - ret = zxdh_get_port_attr(hw, hw->vport.vport, &port_attr); - if (ret) { - PMD_DRV_LOG(ERR, "rss hash factor set failed"); - return -EINVAL; - } - ZXDH_SET(rss_hf, rss_hf_msg_addr, rss_hf, port_attr.rss_hash_factor); - } else { - ret = zxdh_vf_send_msg_to_pf(dev, &msg, sizeof(struct zxdh_msg_info), - zxdh_msg_reply_info, ZXDH_ST_SZ_BYTES(msg_reply_info)); - if (ret) { - PMD_DRV_LOG(ERR, "rss hash factor set failed"); - return -EINVAL; + if (old_rss_conf->rss_hf == 0) + need_update_hf = 1; + + if (!need_update_hf) { + hw_hf = zxdh_rss_hf_to_hw(old_rss_conf->rss_hf); + rss_conf->rss_hf = zxdh_rss_hf_to_eth(hw_hf); + } + + if (need_update_hf) { + zxdh_msg_head_build(hw, ZXDH_RSS_HF_GET, &msg); + if (hw->is_pf) { + ret = zxdh_get_port_attr(hw, hw->vport.vport, &port_attr); + if (ret) { + PMD_DRV_LOG(ERR, "rss hash factor set failed"); + return -EINVAL; + } + ZXDH_SET(rss_hf, rss_hf_msg_addr, rss_hf, port_attr.rss_hash_factor); + } else { + ret = zxdh_vf_send_msg_to_pf(dev, &msg, sizeof(struct zxdh_msg_info), + zxdh_msg_reply_info, ZXDH_ST_SZ_BYTES(msg_reply_info)); + if (ret) { + PMD_DRV_LOG(ERR, "rss hash factor set failed"); + return -EINVAL; + } } + rss_hf = ZXDH_GET(rss_hf, rss_hf_msg_addr, rss_hf); + rss_conf->rss_hf = zxdh_rss_hf_to_eth(rss_hf); + old_rss_conf->rss_hf = zxdh_rss_hf_to_eth(hw_hf); } - rss_hf = ZXDH_GET(rss_hf, rss_hf_msg_addr, rss_hf); - rss_conf->rss_hf = zxdh_rss_hf_to_eth(rss_hf); return 0; } @@ -1389,7 +1406,6 @@ zxdh_rss_configure(struct rte_eth_dev *dev) if (curr_rss_enable && hw->rss_init == 0) { /* config hash factor */ - dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf = ZXDH_HF_F5_ETH; hw_hf = zxdh_rss_hf_to_hw(dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf); memset(&msg, 0, sizeof(msg)); if (hw->is_pf) { diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.h b/drivers/net/zxdh/zxdh_ethdev_ops.h index 6015b3de59..762562fbef 100644 --- a/drivers/net/zxdh/zxdh_ethdev_ops.h +++ b/drivers/net/zxdh/zxdh_ethdev_ops.h @@ -12,8 +12,7 @@ #include "zxdh_ethdev.h" #define ZXDH_ETH_RSS_L2 RTE_ETH_RSS_L2_PAYLOAD -#define ZXDH_ETH_RSS_IP \ - (RTE_ETH_RSS_IPV4 | \ +#define ZXDH_ETH_RSS_IP (RTE_ETH_RSS_IPV4 | \ RTE_ETH_RSS_FRAG_IPV4 | \ RTE_ETH_RSS_IPV6 | \ RTE_ETH_RSS_FRAG_IPV6) @@ -25,6 +24,7 @@ #define ZXDH_HF_F3_ETH ZXDH_ETH_RSS_IP #define ZXDH_HF_MAC_VLAN_ETH ZXDH_ETH_RSS_L2 #define ZXDH_RSS_HF ((ZXDH_HF_MAC_VLAN_ETH | ZXDH_HF_F3_ETH | ZXDH_HF_F5_ETH)) +#define ZXDH_RSS_HASH_KEY_LEN 40U #define ZXDH_ETHER_MIN_MTU 68 diff --git a/drivers/net/zxdh/zxdh_msg.c b/drivers/net/zxdh/zxdh_msg.c index be4f115380..68f2bab0c1 100644 --- a/drivers/net/zxdh/zxdh_msg.c +++ b/drivers/net/zxdh/zxdh_msg.c @@ -1270,7 +1270,6 @@ zxdh_vf_port_init(struct zxdh_hw *pf_hw, uint16_t vport, void *cfg_data, port_attr.pf_vfid = pf_hw->vfid; port_attr.hash_search_index = pf_hw->hash_search_index; 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, vport, &port_attr); if (ret) { @@ -1714,12 +1713,14 @@ zxdh_vf_rss_table_get(struct zxdh_hw *hw, uint16_t vport, void *cfg_data __rte_u if (ret) sprintf(str, "set rss reta tbl failed, code:%d", ret); - *res_len = strlen(str) + sizeof(uint8_t); - if (ret == 0) + if (ret == 0) { + *res_len = ZXDH_ST_SZ_BYTES(rss_reta) + sizeof(uint8_t); ZXDH_SET(msg_reply_body, reply, flag, ZXDH_REPS_SUCC); - else + } else { + *res_len = strlen(str) + sizeof(uint8_t); ZXDH_SET(msg_reply_body, reply, flag, ZXDH_REPS_FAIL); - memcpy(reply_data_addr, str, strlen(str) + 1); + memcpy(reply_data_addr, str, strlen(str) + 1); + } return ret; } @@ -2160,7 +2161,6 @@ 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; diff --git a/drivers/net/zxdh/zxdh_tables.c b/drivers/net/zxdh/zxdh_tables.c index 57a291e92a..e11b4bf92c 100644 --- a/drivers/net/zxdh/zxdh_tables.c +++ b/drivers/net/zxdh/zxdh_tables.c @@ -620,7 +620,7 @@ zxdh_dev_unicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable) ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &entry, 1); if (ret) { - PMD_DRV_LOG(ERR, "unicast_table_get_failed:%d", hw->vfid); + PMD_DRV_LOG(ERR, "unicast_table_get_failed:%d", vfid); return -ret; } @@ -637,20 +637,20 @@ zxdh_dev_unicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable) ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid, 1, &entry); if (ret) { - PMD_DRV_LOG(ERR, "unicast_table_set_failed:%d", hw->vfid); + PMD_DRV_LOG(ERR, "unicast_table_set_failed:%d", vfid); return -ret; } ret = zxdh_get_port_attr(hw, vport, &port_attr); if (ret) { - PMD_DRV_LOG(ERR, "port_attr_table_get_failed:%d", hw->vfid); + PMD_DRV_LOG(ERR, "port_attr_table_get_failed:%d", vfid); return -ret; } port_attr.promisc_enable = enable; ret = zxdh_set_port_attr(hw, vport, &port_attr); if (ret) { - PMD_DRV_LOG(ERR, "port_attr_table_set_failed:%d", hw->vfid); + PMD_DRV_LOG(ERR, "port_attr_table_set_failed:%d", vfid); return -ret; } -- 2.27.0 [-- Attachment #1.1.2: Type: text/html , Size: 20529 bytes --] ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v1 3/3] net/zxdh: modify RSS related issues 2025-06-07 2:30 ` [PATCH v1 3/3] net/zxdh: modify RSS " Junlong Wang @ 2025-06-16 16:22 ` Stephen Hemminger 0 siblings, 0 replies; 14+ messages in thread From: Stephen Hemminger @ 2025-06-16 16:22 UTC (permalink / raw) To: Junlong Wang; +Cc: dev On Sat, 7 Jun 2025 10:30:20 +0800 Junlong Wang <wang.junlong1@zte.com.cn> wrote: > modify rss related issues in testing process. Better commit message please. Should have Fixes: tabg. > > Signed-off-by: Junlong Wang <wang.junlong1@zte.com.cn> > --- > drivers/net/zxdh/zxdh_ethdev.c | 1 + > drivers/net/zxdh/zxdh_ethdev_ops.c | 66 +++++++++++++++++++----------- > drivers/net/zxdh/zxdh_ethdev_ops.h | 4 +- > drivers/net/zxdh/zxdh_msg.c | 12 +++--- > drivers/net/zxdh/zxdh_tables.c | 8 ++-- > 5 files changed, 54 insertions(+), 37 deletions(-) > > diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c > index 9512aff99c..a245ab24ce 100644 > --- a/drivers/net/zxdh/zxdh_ethdev.c > +++ b/drivers/net/zxdh/zxdh_ethdev.c > @@ -66,6 +66,7 @@ zxdh_dev_infos_get(struct rte_eth_dev *dev, > dev_info->rx_offload_capa |= RTE_ETH_RX_OFFLOAD_TCP_LRO; > dev_info->rx_offload_capa |= RTE_ETH_RX_OFFLOAD_RSS_HASH; > > + dev_info->hash_key_size = ZXDH_RSS_HASH_KEY_LEN; > dev_info->reta_size = RTE_ETH_RSS_RETA_SIZE_256; > dev_info->flow_type_rss_offloads = ZXDH_RSS_HF; > > diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c b/drivers/net/zxdh/zxdh_ethdev_ops.c > index c16271aeaf..86517d571a 100644 > --- a/drivers/net/zxdh/zxdh_ethdev_ops.c > +++ b/drivers/net/zxdh/zxdh_ethdev_ops.c > @@ -289,7 +289,7 @@ zxdh_link_info_get(struct rte_eth_dev *dev, struct rte_eth_link *link) > zxdh_pci_read_dev_config(hw, offsetof(struct zxdh_net_config, status), > &status, sizeof(status)); > > - link->link_status = status; > + link->link_status = status & hw->admin_status; > > if (status == RTE_ETH_LINK_DOWN) { > link->link_speed = RTE_ETH_SPEED_NUM_UNKNOWN; > @@ -1207,7 +1207,7 @@ zxdh_rss_hf_to_hw(uint64_t hf) > } > > static uint64_t > -zxdh_rss_hf_to_eth(uint32_t hw_hf) > +zxdh_rss_hf_to_eth(uint64_t hw_hf) > { > uint64_t hf = 0; > > @@ -1245,7 +1245,7 @@ zxdh_rss_hash_update(struct rte_eth_dev *dev, > hw_hf_new = zxdh_rss_hf_to_hw(rss_conf->rss_hf); > hw_hf_old = zxdh_rss_hf_to_hw(old_rss_conf->rss_hf); > > - if ((hw_hf_new != hw_hf_old || !!rss_conf->rss_hf)) > + if ((hw_hf_new != hw_hf_old || hw->rss_enable != (!!rss_conf->rss_hf))) You don't needs so many () here. Just: if (hw_hf_new != hw_hf_old || hw->rss_enable != !!rss_conf->rss_hf) ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v1 1/3] net/zxdh: modify some MAC config issues 2025-06-07 2:30 [PATCH v1 1/3] net/zxdh: modify some MAC config issues Junlong Wang 2025-06-07 2:30 ` [PATCH v1 2/3] net/zxdh: modify some VLAN related issues Junlong Wang 2025-06-07 2:30 ` [PATCH v1 3/3] net/zxdh: modify RSS " Junlong Wang @ 2025-06-12 0:14 ` Thomas Monjalon 2025-06-12 1:18 ` Junlong Wang ` (2 subsequent siblings) 5 siblings, 0 replies; 14+ messages in thread From: Thomas Monjalon @ 2025-06-12 0:14 UTC (permalink / raw) To: Junlong Wang; +Cc: dev Hello, 07/06/2025 04:30, Junlong Wang: > modify some mac config issues, > which were discovered during the testing process. > > Signed-off-by: Junlong Wang <wang.junlong1@zte.com.cn> That's not how we fix issues in general in DPDK. We want to provide tracking history, so: - we split the fixes per issue - we provide the cause origin (with "Fixes:" line) Please could split and better comment these fixes? Thanks ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v1 1/3] net/zxdh: modify some MAC config issues 2025-06-07 2:30 [PATCH v1 1/3] net/zxdh: modify some MAC config issues Junlong Wang ` (2 preceding siblings ...) 2025-06-12 0:14 ` [PATCH v1 1/3] net/zxdh: modify some MAC config issues Thomas Monjalon @ 2025-06-12 1:18 ` Junlong Wang 2025-06-16 16:16 ` Stephen Hemminger 2025-06-17 2:04 ` [PATCH v2 1/5] net/zxdh: fix meson.build issus in compilation Junlong Wang 5 siblings, 0 replies; 14+ messages in thread From: Junlong Wang @ 2025-06-12 1:18 UTC (permalink / raw) To: thomas, stephen; +Cc: dev [-- Attachment #1.1.1: Type: text/plain, Size: 583 bytes --] >> modify some mac config issues, >> which were discovered during the testing process. >> >> Signed-off-by: Junlong Wang <wang.junlong1@zte.com.cn> > That's not how we fix issues in general in DPDK. > We want to provide tracking history, so: > - we split the fixes per issue > - we provide the cause origin (with "Fixes:" line) > > Please could split and better comment these fixes? > Thanks Okay, I will revise and resubmit it split and better comment these fixes. but this series patch status is Awaiting Upstream, do I need to modify the status for rollback. [-- Attachment #1.1.2: Type: text/html , Size: 1174 bytes --] ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v1 1/3] net/zxdh: modify some MAC config issues 2025-06-07 2:30 [PATCH v1 1/3] net/zxdh: modify some MAC config issues Junlong Wang ` (3 preceding siblings ...) 2025-06-12 1:18 ` Junlong Wang @ 2025-06-16 16:16 ` Stephen Hemminger 2025-06-17 2:04 ` [PATCH v2 1/5] net/zxdh: fix meson.build issus in compilation Junlong Wang 5 siblings, 0 replies; 14+ messages in thread From: Stephen Hemminger @ 2025-06-16 16:16 UTC (permalink / raw) To: Junlong Wang; +Cc: dev On Sat, 7 Jun 2025 10:30:18 +0800 Junlong Wang <wang.junlong1@zte.com.cn> wrote: > modify some mac config issues, > which were discovered during the testing process. This sounds like you fixed one or more bugs. In which case patch should be sent with the Fixes: tag so that stable maintainers know if it should be backported. ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v2 1/5] net/zxdh: fix meson.build issus in compilation 2025-06-07 2:30 [PATCH v1 1/3] net/zxdh: modify some MAC config issues Junlong Wang ` (4 preceding siblings ...) 2025-06-16 16:16 ` Stephen Hemminger @ 2025-06-17 2:04 ` Junlong Wang 2025-06-17 2:05 ` [PATCH v2 2/5] net/zxdh: modify some MAC config issues Junlong Wang ` (3 more replies) 5 siblings, 4 replies; 14+ messages in thread From: Junlong Wang @ 2025-06-17 2:04 UTC (permalink / raw) To: stephen; +Cc: dev, Junlong Wang, stable [-- Attachment #1.1.1: Type: text/plain, Size: 850 bytes --] fix meson.build issus in compilation, which caused the inability to compile in the arm64 environment. Fixes: 29e89288ff14 ("net/zxdh: add driver skeleton") Cc: stable@dpdk.org Signed-off-by: Junlong Wang <wang.junlong1@zte.com.cn> --- drivers/net/zxdh/meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/zxdh/meson.build b/drivers/net/zxdh/meson.build index a48a0d43c2..ec71451a55 100644 --- a/drivers/net/zxdh/meson.build +++ b/drivers/net/zxdh/meson.build @@ -7,7 +7,7 @@ if not is_linux subdir_done() endif -if not dpdk_conf.has('RTE_ARCH_X86_64') or not dpdk_conf.get('RTE_ARCH_64') +if arch_subdir != 'x86' and arch_subdir != 'arm' or not dpdk_conf.get('RTE_ARCH_64') build = false reason = 'only supported on x86_64 and aarch64' subdir_done() -- 2.27.0 [-- Attachment #1.1.2: Type: text/html , Size: 1504 bytes --] ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v2 2/5] net/zxdh: modify some MAC config issues 2025-06-17 2:04 ` [PATCH v2 1/5] net/zxdh: fix meson.build issus in compilation Junlong Wang @ 2025-06-17 2:05 ` Junlong Wang 2025-06-17 2:05 ` [PATCH v2 3/5] net/zxdh: modify some VLAN related issues Junlong Wang ` (2 subsequent siblings) 3 siblings, 0 replies; 14+ messages in thread From: Junlong Wang @ 2025-06-17 2:05 UTC (permalink / raw) To: stephen; +Cc: dev, Junlong Wang [-- Attachment #1.1.1: Type: text/plain, Size: 14067 bytes --] modify some mac config issues, which were discovered during the testing process. Fixes: 1c8f68b64cfc ("net/zxdh: optimize MAC operations") Signed-off-by: Junlong Wang <wang.junlong1@zte.com.cn> --- drivers/net/zxdh/zxdh_ethdev.c | 16 ++++++++++++ drivers/net/zxdh/zxdh_ethdev_ops.c | 34 +++++++++++++++++++----- drivers/net/zxdh/zxdh_msg.c | 10 +++---- drivers/net/zxdh/zxdh_tables.c | 42 ++++++++++++++++-------------- 4 files changed, 70 insertions(+), 32 deletions(-) diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c index 80053678cb..74018821d1 100644 --- a/drivers/net/zxdh/zxdh_ethdev.c +++ b/drivers/net/zxdh/zxdh_ethdev.c @@ -1265,6 +1265,7 @@ static int zxdh_mac_config(struct rte_eth_dev *eth_dev) { struct zxdh_hw *hw = eth_dev->data->dev_private; + struct zxdh_msg_info msg_info = {0}; int ret = 0; if (hw->is_pf) { @@ -1274,7 +1275,22 @@ zxdh_mac_config(struct rte_eth_dev *eth_dev) PMD_DRV_LOG(ERR, "Failed to add mac: port 0x%x", hw->vport.vport); return ret; } + hw->uc_num++; + } else { + struct zxdh_mac_filter *mac_filter = &msg_info.data.mac_filter_msg; + + mac_filter->filter_flag = 0xff; + memcpy(&mac_filter->mac, ð_dev->data->mac_addrs[0], + sizeof(eth_dev->data->mac_addrs[0])); + zxdh_msg_head_build(hw, ZXDH_MAC_ADD, &msg_info); + ret = zxdh_vf_send_msg_to_pf(eth_dev, &msg_info, sizeof(msg_info), NULL, 0); + if (ret) { + PMD_DRV_LOG(ERR, "Failed to send msg: msg type %d", ZXDH_MAC_ADD); + return ret; + } + hw->uc_num++; } + return ret; } diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c b/drivers/net/zxdh/zxdh_ethdev_ops.c index f8e8d26c50..c7a9dc7854 100644 --- a/drivers/net/zxdh/zxdh_ethdev_ops.c +++ b/drivers/net/zxdh/zxdh_ethdev_ops.c @@ -413,7 +413,10 @@ zxdh_dev_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *addr) struct zxdh_hw *hw = (struct zxdh_hw *)dev->data->dev_private; struct rte_ether_addr *old_addr = &dev->data->mac_addrs[0]; struct zxdh_msg_info msg_info = {0}; - uint16_t ret = 0; + uint8_t zxdh_msg_reply_info[ZXDH_ST_SZ_BYTES(msg_reply_info)] = {0}; + void *reply_body_addr = ZXDH_ADDR_OF(msg_reply_info, zxdh_msg_reply_info, reply_body); + void *mac_reply_msg_addr = ZXDH_ADDR_OF(msg_reply_body, reply_body_addr, mac_reply_msg); + int ret = 0; if (!rte_is_valid_assigned_ether_addr(addr)) { PMD_DRV_LOG(ERR, "mac address is invalid!"); @@ -425,7 +428,7 @@ zxdh_dev_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *addr) if (hw->is_pf) { ret = zxdh_add_mac_table(hw, hw->vport.vport, addr, hw->hash_search_index, 0, 0); if (ret) { - if (ret == ZXDH_EEXIST_MAC_FLAG) { + if (ret == -EADDRINUSE) { PMD_DRV_LOG(ERR, "pf mac add failed! mac is in used, code:%d", ret); return -EADDRINUSE; } @@ -446,9 +449,11 @@ zxdh_dev_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *addr) mac_filter->filter_flag = ZXDH_MAC_UNFILTER; memcpy(&mac_filter->mac, addr, sizeof(struct rte_ether_addr)); zxdh_msg_head_build(hw, ZXDH_MAC_ADD, &msg_info); - ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), NULL, 0); + ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), + zxdh_msg_reply_info, ZXDH_ST_SZ_BYTES(msg_reply_info)); if (ret) { - if (ret == ZXDH_EEXIST_MAC_FLAG) { + uint8_t flag = ZXDH_GET(mac_reply_msg, mac_reply_msg_addr, mac_flag); + if (flag == ZXDH_EEXIST_MAC_FLAG) { PMD_DRV_LOG(ERR, "pf mac add failed! mac is in used, code:%d", ret); return -EADDRINUSE; } @@ -482,7 +487,11 @@ zxdh_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, { struct zxdh_hw *hw = dev->data->dev_private; struct zxdh_msg_info msg_info = {0}; - uint16_t i, ret; + uint8_t zxdh_msg_reply_info[ZXDH_ST_SZ_BYTES(msg_reply_info)] = {0}; + void *reply_body_addr = ZXDH_ADDR_OF(msg_reply_info, zxdh_msg_reply_info, reply_body); + void *mac_reply_msg_addr = ZXDH_ADDR_OF(msg_reply_body, reply_body_addr, mac_reply_msg); + uint16_t i; + int ret; if (index >= ZXDH_MAX_MAC_ADDRS) { PMD_DRV_LOG(ERR, "Add mac index (%u) is out of range", index); @@ -503,6 +512,10 @@ zxdh_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, ret = zxdh_add_mac_table(hw, hw->vport.vport, mac_addr, hw->hash_search_index, 0, 0); if (ret) { + if (ret == -EADDRINUSE) { + PMD_DRV_LOG(ERR, "pf mac add failed mac is in used"); + return -EADDRINUSE; + } PMD_DRV_LOG(ERR, "mac_addr_add failed, code:%d", ret); return ret; } @@ -536,9 +549,16 @@ zxdh_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, zxdh_msg_head_build(hw, ZXDH_MAC_ADD, &msg_info); if (rte_is_unicast_ether_addr(mac_addr)) { if (hw->uc_num < ZXDH_MAX_UC_MAC_ADDRS) { - ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, - sizeof(msg_info), NULL, 0); + ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), + zxdh_msg_reply_info, + ZXDH_ST_SZ_BYTES(msg_reply_info)); if (ret) { + flag = ZXDH_GET(mac_reply_msg, + mac_reply_msg_addr, mac_flag); + if (flag == ZXDH_EEXIST_MAC_FLAG) { + PMD_DRV_LOG(ERR, "pf mac add failed mac is in used"); + return -EADDRINUSE; + } PMD_DRV_LOG(ERR, "Failed to send msg: port 0x%x msg type %d", hw->vport.vport, ZXDH_MAC_ADD); return ret; diff --git a/drivers/net/zxdh/zxdh_msg.c b/drivers/net/zxdh/zxdh_msg.c index 02ecd93b12..452c7ab2e3 100644 --- a/drivers/net/zxdh/zxdh_msg.c +++ b/drivers/net/zxdh/zxdh_msg.c @@ -1349,11 +1349,11 @@ zxdh_add_vf_mac_table(struct zxdh_hw *hw, uint16_t vport, void *cfg_data, union zxdh_virport_num port = {0}; struct zxdh_mac_filter *mac_filter = (struct zxdh_mac_filter *)cfg_data; struct rte_ether_addr *addr = &mac_filter->mac; - int i = 0, ret = 0; - uint16_t vf_id = port.vfid; - port.vport = vport; void *reply_data_addr = ZXDH_ADDR_OF(msg_reply_body, reply_body, reply_data); void *mac_reply_msg_addr = ZXDH_ADDR_OF(msg_reply_body, reply_body, mac_reply_msg); + port.vport = vport; + uint16_t vf_id = port.vfid; + int i = 0, ret = 0; for (i = 0; i < ZXDH_MAX_MAC_ADDRS; i++) if (rte_is_same_ether_addr(&hw->vfinfo[vf_id].vf_mac[i], addr)) @@ -1396,12 +1396,12 @@ static int zxdh_del_vf_mac_table(struct zxdh_hw *hw, uint16_t vport, void *cfg_data, void *res_info, uint16_t *res_len) { - int ret, i = 0; struct zxdh_mac_filter *mac_filter = (struct zxdh_mac_filter *)cfg_data; union zxdh_virport_num port = (union zxdh_virport_num)vport; char str[ZXDH_MSG_REPLY_BODY_MAX_LEN] = "del mac"; - uint16_t vf_id = port.vfid; void *reply_data_addr = ZXDH_ADDR_OF(msg_reply_body, res_info, reply_data); + uint16_t vf_id = port.vfid; + int ret, i = 0; PMD_DRV_LOG(DEBUG, "[PF GET MSG FROM VF]--vf mac to del."); ret = zxdh_del_mac_table(hw, vport, &mac_filter->mac, hw->hash_search_index, 0, 0); diff --git a/drivers/net/zxdh/zxdh_tables.c b/drivers/net/zxdh/zxdh_tables.c index 29741e53ed..33f161c4cd 100644 --- a/drivers/net/zxdh/zxdh_tables.c +++ b/drivers/net/zxdh/zxdh_tables.c @@ -8,8 +8,8 @@ #include "zxdh_tables.h" #include "zxdh_logs.h" -#define ZXDH_UNIMAC_HASH_INDEX(index) (ZXDH_SDT_L2_ENTRY_TABLE0 + (index)) -#define ZXDH_MULTIMAC_HASH_INDEX(index) (ZXDH_SDT_MC_TABLE0 + (index)) +#define ZXDH_UNICAST_MAC_HASH_INDEX(index) (ZXDH_SDT_L2_ENTRY_TABLE0 + (index)) +#define ZXDH_MULTICAST_MAC_HASH_INDEX(index) (ZXDH_SDT_MC_TABLE0 + (index)) #define ZXDH_MC_GROUP_NUM 4 #define ZXDH_BASE_VFID 1152 #define ZXDH_TABLE_HIT_FLAG 128 @@ -244,8 +244,8 @@ zxdh_add_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad struct zxdh_mac_multicast_table multicast_table = {0}; union zxdh_virport_num vport_num = (union zxdh_virport_num)vport; uint16_t vfid = zxdh_vport_to_vfid(vport_num); - uint32_t ret; uint16_t group_id = 0; + int16_t ret; if (rte_is_unicast_ether_addr(addr)) { rte_memcpy(unicast_table.key.dmac_addr, addr, sizeof(struct rte_ether_addr)); @@ -257,7 +257,7 @@ zxdh_add_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad .p_rst = (uint8_t *)&unicast_table.entry }; ZXDH_DTB_USER_ENTRY_T entry_get = { - .sdt_no = ZXDH_UNIMAC_HASH_INDEX(hash_search_idx), + .sdt_no = ZXDH_UNICAST_MAC_HASH_INDEX(hash_search_idx), .p_entry_data = (void *)&dtb_hash_entry }; @@ -294,19 +294,20 @@ zxdh_add_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad }; ZXDH_DTB_USER_ENTRY_T entry_get = { - .sdt_no = ZXDH_MULTIMAC_HASH_INDEX(hash_search_idx), + .sdt_no = ZXDH_MULTICAST_MAC_HASH_INDEX(hash_search_idx), .p_entry_data = (void *)&dtb_hash_entry }; ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid, &entry_get, 1); uint8_t index = (vport_num.vfid % 64) / 32; + uint8_t value = (vport_num.vfid % 64) % 32; if (ret == 0) { if (vport_num.vf_flag) { if (group_id == vport_num.vfid / 64) multicast_table.entry.mc_bitmap[index] |= rte_cpu_to_be_32(UINT32_C(1) << - (31 - index)); + (31 - value)); } else { if (group_id == vport_num.vfid / 64) multicast_table.entry.mc_pf_enable = @@ -317,7 +318,7 @@ zxdh_add_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad if (group_id == vport_num.vfid / 64) multicast_table.entry.mc_bitmap[index] |= rte_cpu_to_be_32(UINT32_C(1) << - (31 - index)); + (31 - value)); else multicast_table.entry.mc_bitmap[index] = false; @@ -347,10 +348,9 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad struct zxdh_mac_unicast_table unicast_table = {0}; struct zxdh_mac_multicast_table multicast_table = {0}; union zxdh_virport_num vport_num = (union zxdh_virport_num)vport; - union zxdh_virport_num port = (union zxdh_virport_num)vport; - uint16_t vfid = zxdh_vport_to_vfid(port); - uint32_t ret, del_flag = 0; - uint16_t group_id = 0; + uint16_t vfid = zxdh_vport_to_vfid(vport_num); + uint16_t del_flag, group_id = 0; + int32_t ret = 0; if (rte_is_unicast_ether_addr(addr)) { rte_memcpy(unicast_table.key.dmac_addr, addr, sizeof(struct rte_ether_addr)); @@ -365,7 +365,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad }; ZXDH_DTB_USER_ENTRY_T entry_get = { - .sdt_no = ZXDH_UNIMAC_HASH_INDEX(hash_search_idx), + .sdt_no = ZXDH_UNICAST_MAC_HASH_INDEX(hash_search_idx), .p_entry_data = (void *)&dtb_hash_entry }; ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid, @@ -393,16 +393,17 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad }; ZXDH_DTB_USER_ENTRY_T entry_get = { - .sdt_no = ZXDH_MULTIMAC_HASH_INDEX(hash_search_idx), + .sdt_no = ZXDH_MULTICAST_MAC_HASH_INDEX(hash_search_idx), .p_entry_data = (void *)&dtb_hash_entry }; ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid, &entry_get, 1); uint8_t index = (vport_num.vfid % 64) / 32; + uint8_t value = (vport_num.vfid % 64) % 32; if (vport_num.vf_flag) multicast_table.entry.mc_bitmap[index] &= - ~(rte_cpu_to_be_32(UINT32_C(1) << (31 - index))); + ~(rte_cpu_to_be_32(UINT32_C(1) << (31 - value))); else multicast_table.entry.mc_pf_enable = 0; @@ -422,7 +423,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad .p_rst = (uint8_t *)&multicast_table.entry }; ZXDH_DTB_USER_ENTRY_T entry_get = { - .sdt_no = ZXDH_MULTIMAC_HASH_INDEX(hash_search_idx), + .sdt_no = ZXDH_MULTICAST_MAC_HASH_INDEX(hash_search_idx), .p_entry_data = (void *)&dtb_hash_entry }; @@ -447,7 +448,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad .p_rst = (uint8_t *)&multicast_table.entry }; ZXDH_DTB_USER_ENTRY_T entry_get = { - .sdt_no = ZXDH_MULTIMAC_HASH_INDEX(hash_search_idx), + .sdt_no = ZXDH_MULTICAST_MAC_HASH_INDEX(hash_search_idx), .p_entry_data = (void *)&dtb_hash_entry }; @@ -604,6 +605,7 @@ zxdh_dev_unicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable) struct zxdh_unitcast_table uc_table = {0}; struct zxdh_port_attr_table port_attr = {0}; union zxdh_virport_num vport_num = (union zxdh_virport_num)vport; + uint16_t vfid = zxdh_vport_to_vfid(vport_num); int16_t ret = 0; ZXDH_DTB_ERAM_ENTRY_INFO_T uc_table_entry = { @@ -617,7 +619,7 @@ zxdh_dev_unicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable) ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &entry, 1); if (ret) { - PMD_DRV_LOG(ERR, "unicast_table_get_failed:%d", hw->vfid); + PMD_DRV_LOG(ERR, "unicast_table_get_failed:%d", vfid); return -ret; } @@ -634,20 +636,20 @@ zxdh_dev_unicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable) ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid, 1, &entry); if (ret) { - PMD_DRV_LOG(ERR, "unicast_table_set_failed:%d", hw->vfid); + PMD_DRV_LOG(ERR, "unicast_table_set_failed:%d", vfid); return -ret; } ret = zxdh_get_port_attr(hw, vport, &port_attr); if (ret) { - PMD_DRV_LOG(ERR, "port_attr_table_get_failed:%d", hw->vfid); + PMD_DRV_LOG(ERR, "port_attr_table_get_failed:%d", vfid); return -ret; } port_attr.promisc_enable = enable; ret = zxdh_set_port_attr(hw, vport, &port_attr); if (ret) { - PMD_DRV_LOG(ERR, "port_attr_table_set_failed:%d", hw->vfid); + PMD_DRV_LOG(ERR, "port_attr_table_set_failed:%d", vfid); return -ret; } -- 2.27.0 [-- Attachment #1.1.2: Type: text/html , Size: 36658 bytes --] ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v2 3/5] net/zxdh: modify some VLAN related issues 2025-06-17 2:04 ` [PATCH v2 1/5] net/zxdh: fix meson.build issus in compilation Junlong Wang 2025-06-17 2:05 ` [PATCH v2 2/5] net/zxdh: modify some MAC config issues Junlong Wang @ 2025-06-17 2:05 ` Junlong Wang 2025-06-17 2:05 ` [PATCH v2 4/5] net/zxdh: modify RSS " Junlong Wang 2025-06-17 2:05 ` [PATCH v2 5/5] net/zxdh: add support VLAN TPID set ops Junlong Wang 3 siblings, 0 replies; 14+ messages in thread From: Junlong Wang @ 2025-06-17 2:05 UTC (permalink / raw) To: stephen; +Cc: dev, Junlong Wang [-- Attachment #1.1.1: Type: text/plain, Size: 8322 bytes --] modify some vlan related issues, which were discovered during the testing process. Fixes: b4f996b7fcf6 ("net/zxdh: optimize VLAN filter and offload") Signed-off-by: Junlong Wang <wang.junlong1@zte.com.cn> --- drivers/net/zxdh/zxdh_ethdev.c | 9 ++++++++- drivers/net/zxdh/zxdh_ethdev_ops.c | 4 ++-- drivers/net/zxdh/zxdh_msg.c | 28 ++++++++++++++++++++++++++-- drivers/net/zxdh/zxdh_tables.c | 28 ++++++++++++++++++++++------ drivers/net/zxdh/zxdh_tables.h | 7 ++++++- 5 files changed, 64 insertions(+), 12 deletions(-) diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c index 74018821d1..d92df46d11 100644 --- a/drivers/net/zxdh/zxdh_ethdev.c +++ b/drivers/net/zxdh/zxdh_ethdev.c @@ -1907,6 +1907,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 +1928,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 c7a9dc7854..3eed388dac 100644 --- a/drivers/net/zxdh/zxdh_ethdev_ops.c +++ b/drivers/net/zxdh/zxdh_ethdev_ops.c @@ -553,7 +553,7 @@ zxdh_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, zxdh_msg_reply_info, ZXDH_ST_SZ_BYTES(msg_reply_info)); if (ret) { - flag = ZXDH_GET(mac_reply_msg, + uint8_t flag = ZXDH_GET(mac_reply_msg, mac_reply_msg_addr, mac_flag); if (flag == ZXDH_EEXIST_MAC_FLAG) { PMD_DRV_LOG(ERR, "pf mac add failed mac is in used"); @@ -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); diff --git a/drivers/net/zxdh/zxdh_msg.c b/drivers/net/zxdh/zxdh_msg.c index 452c7ab2e3..e607ea1dab 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) @@ -1252,9 +1270,8 @@ zxdh_vf_port_init(struct zxdh_hw *pf_hw, uint16_t vport, void *cfg_data, port_attr.pf_vfid = pf_hw->vfid; port_attr.hash_search_index = pf_hw->hash_search_index; 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 +1282,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); diff --git a/drivers/net/zxdh/zxdh_tables.c b/drivers/net/zxdh/zxdh_tables.c index 33f161c4cd..a213df4f23 100644 --- a/drivers/net/zxdh/zxdh_tables.c +++ b/drivers/net/zxdh/zxdh_tables.c @@ -699,10 +699,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; @@ -717,7 +718,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 @@ -749,7 +750,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; @@ -950,7 +951,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) { @@ -973,7 +974,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) { @@ -1045,3 +1046,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 [-- Attachment #1.1.2: Type: text/html , Size: 17628 bytes --] ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v2 4/5] net/zxdh: modify RSS related issues 2025-06-17 2:04 ` [PATCH v2 1/5] net/zxdh: fix meson.build issus in compilation Junlong Wang 2025-06-17 2:05 ` [PATCH v2 2/5] net/zxdh: modify some MAC config issues Junlong Wang 2025-06-17 2:05 ` [PATCH v2 3/5] net/zxdh: modify some VLAN related issues Junlong Wang @ 2025-06-17 2:05 ` Junlong Wang 2025-06-17 2:05 ` [PATCH v2 5/5] net/zxdh: add support VLAN TPID set ops Junlong Wang 3 siblings, 0 replies; 14+ messages in thread From: Junlong Wang @ 2025-06-17 2:05 UTC (permalink / raw) To: stephen; +Cc: dev, Junlong Wang [-- Attachment #1.1.1: Type: text/plain, Size: 5879 bytes --] modify rss related issues in testing process. Modify the comments of the maintainers. Fixes: 01acc23bab13 ("net/zxdh: optimize RSS operations") Signed-off-by: Junlong Wang <wang.junlong1@zte.com.cn> --- drivers/net/zxdh/zxdh_ethdev.h | 1 + drivers/net/zxdh/zxdh_ethdev_ops.c | 64 +++++++++++++++++++----------- drivers/net/zxdh/zxdh_msg.c | 10 +++-- 3 files changed, 47 insertions(+), 28 deletions(-) diff --git a/drivers/net/zxdh/zxdh_ethdev.h b/drivers/net/zxdh/zxdh_ethdev.h index 169af209a2..1013446876 100644 --- a/drivers/net/zxdh/zxdh_ethdev.h +++ b/drivers/net/zxdh/zxdh_ethdev.h @@ -54,6 +54,7 @@ #define ZXDH_SLOT_MAX 256 #define ZXDH_MAX_VF 256 #define ZXDH_HASHIDX_MAX 6 +#define ZXDH_RSS_HASH_KEY_LEN 40U union zxdh_virport_num { uint16_t vport; diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c b/drivers/net/zxdh/zxdh_ethdev_ops.c index 3eed388dac..b1361ef518 100644 --- a/drivers/net/zxdh/zxdh_ethdev_ops.c +++ b/drivers/net/zxdh/zxdh_ethdev_ops.c @@ -1170,7 +1170,7 @@ zxdh_rss_hf_to_hw(uint64_t hf) } static uint64_t -zxdh_rss_hf_to_eth(uint32_t hw_hf) +zxdh_rss_hf_to_eth(uint64_t hw_hf) { uint64_t hf = 0; @@ -1208,7 +1208,7 @@ zxdh_rss_hash_update(struct rte_eth_dev *dev, hw_hf_new = zxdh_rss_hf_to_hw(rss_conf->rss_hf); hw_hf_old = zxdh_rss_hf_to_hw(old_rss_conf->rss_hf); - if ((hw_hf_new != hw_hf_old || !!rss_conf->rss_hf)) + if (hw_hf_new != hw_hf_old || hw->rss_enable != !!rss_conf->rss_hf) need_update_hf = 1; if (need_update_hf) { @@ -1230,6 +1230,9 @@ zxdh_rss_hash_update(struct rte_eth_dev *dev, return -EINVAL; } } + hw->rss_enable = !!rss_conf->rss_hf; + if (rss_conf->rss_hf == 0) + return 0; if (hw->is_pf) { ret = zxdh_get_port_attr(hw, hw->vport.vport, &port_attr); port_attr.rss_hash_factor = hw_hf_new; @@ -1257,15 +1260,16 @@ zxdh_rss_hash_update(struct rte_eth_dev *dev, int zxdh_rss_hash_conf_get(struct rte_eth_dev *dev, struct rte_eth_rss_conf *rss_conf) { - struct zxdh_hw *hw = (struct zxdh_hw *)dev->data->dev_private; + struct zxdh_hw *hw = dev->data->dev_private; struct rte_eth_rss_conf *old_rss_conf = &dev->data->dev_conf.rx_adv_conf.rss_conf; struct zxdh_msg_info msg = {0}; uint8_t zxdh_msg_reply_info[ZXDH_ST_SZ_BYTES(msg_reply_info)] = {0}; void *reply_body_addr = ZXDH_ADDR_OF(msg_reply_info, zxdh_msg_reply_info, reply_body); void *rss_hf_msg_addr = ZXDH_ADDR_OF(msg_reply_body, reply_body_addr, rss_hf_msg); struct zxdh_port_attr_table port_attr = {0}; - uint32_t rss_hf; - uint32_t hw_hf; + uint64_t rss_hf = 0; + uint64_t hw_hf = 0; + uint8_t need_update_hf = 0; int ret; if (rss_conf == NULL) { @@ -1273,27 +1277,40 @@ zxdh_rss_hash_conf_get(struct rte_eth_dev *dev, struct rte_eth_rss_conf *rss_con return -ENOMEM; } - hw_hf = zxdh_rss_hf_to_hw(old_rss_conf->rss_hf); - rss_conf->rss_hf = zxdh_rss_hf_to_eth(hw_hf); + if (hw->rss_enable == 0) { + rss_conf->rss_hf = 0; + return 0; + } - zxdh_msg_head_build(hw, ZXDH_RSS_HF_GET, &msg); - if (hw->is_pf) { - ret = zxdh_get_port_attr(hw, hw->vport.vport, &port_attr); - if (ret) { - PMD_DRV_LOG(ERR, "rss hash factor set failed"); - return -EINVAL; - } - ZXDH_SET(rss_hf, rss_hf_msg_addr, rss_hf, port_attr.rss_hash_factor); - } else { - ret = zxdh_vf_send_msg_to_pf(dev, &msg, sizeof(struct zxdh_msg_info), - zxdh_msg_reply_info, ZXDH_ST_SZ_BYTES(msg_reply_info)); - if (ret) { - PMD_DRV_LOG(ERR, "rss hash factor set failed"); - return -EINVAL; + if (old_rss_conf->rss_hf == 0) + need_update_hf = 1; + + if (!need_update_hf) { + hw_hf = zxdh_rss_hf_to_hw(old_rss_conf->rss_hf); + rss_conf->rss_hf = zxdh_rss_hf_to_eth(hw_hf); + } + + if (need_update_hf) { + zxdh_msg_head_build(hw, ZXDH_RSS_HF_GET, &msg); + if (hw->is_pf) { + ret = zxdh_get_port_attr(hw, hw->vport.vport, &port_attr); + if (ret) { + PMD_DRV_LOG(ERR, "rss hash factor set failed"); + return -EINVAL; + } + ZXDH_SET(rss_hf, rss_hf_msg_addr, rss_hf, port_attr.rss_hash_factor); + } else { + ret = zxdh_vf_send_msg_to_pf(dev, &msg, sizeof(struct zxdh_msg_info), + zxdh_msg_reply_info, ZXDH_ST_SZ_BYTES(msg_reply_info)); + if (ret) { + PMD_DRV_LOG(ERR, "rss hash factor set failed"); + return -EINVAL; + } } + rss_hf = ZXDH_GET(rss_hf, rss_hf_msg_addr, rss_hf); + rss_conf->rss_hf = zxdh_rss_hf_to_eth(rss_hf); + old_rss_conf->rss_hf = zxdh_rss_hf_to_eth(hw_hf); } - rss_hf = ZXDH_GET(rss_hf, rss_hf_msg_addr, rss_hf); - rss_conf->rss_hf = zxdh_rss_hf_to_eth(rss_hf); return 0; } @@ -1352,7 +1369,6 @@ zxdh_rss_configure(struct rte_eth_dev *dev) if (curr_rss_enable && hw->rss_init == 0) { /* config hash factor */ - dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf = ZXDH_HF_F5_ETH; hw_hf = zxdh_rss_hf_to_hw(dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf); memset(&msg, 0, sizeof(msg)); if (hw->is_pf) { diff --git a/drivers/net/zxdh/zxdh_msg.c b/drivers/net/zxdh/zxdh_msg.c index e607ea1dab..b378a99a7e 100644 --- a/drivers/net/zxdh/zxdh_msg.c +++ b/drivers/net/zxdh/zxdh_msg.c @@ -1713,12 +1713,14 @@ zxdh_vf_rss_table_get(struct zxdh_hw *hw, uint16_t vport, void *cfg_data __rte_u if (ret) sprintf(str, "set rss reta tbl failed, code:%d", ret); - *res_len = strlen(str) + sizeof(uint8_t); - if (ret == 0) + if (ret == 0) { + *res_len = ZXDH_ST_SZ_BYTES(rss_reta) + sizeof(uint8_t); ZXDH_SET(msg_reply_body, reply, flag, ZXDH_REPS_SUCC); - else + } else { + *res_len = strlen(str) + sizeof(uint8_t); ZXDH_SET(msg_reply_body, reply, flag, ZXDH_REPS_FAIL); - memcpy(reply_data_addr, str, strlen(str) + 1); + memcpy(reply_data_addr, str, strlen(str) + 1); + } return ret; } -- 2.27.0 [-- Attachment #1.1.2: Type: text/html , Size: 13714 bytes --] ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v2 5/5] net/zxdh: add support VLAN TPID set ops 2025-06-17 2:04 ` [PATCH v2 1/5] net/zxdh: fix meson.build issus in compilation Junlong Wang ` (2 preceding siblings ...) 2025-06-17 2:05 ` [PATCH v2 4/5] net/zxdh: modify RSS " Junlong Wang @ 2025-06-17 2:05 ` Junlong Wang 2025-06-17 3:32 ` zhoumin 3 siblings, 1 reply; 14+ messages in thread From: Junlong Wang @ 2025-06-17 2:05 UTC (permalink / raw) To: stephen; +Cc: dev, Junlong Wang [-- Attachment #1.1.1: Type: text/plain, Size: 6034 bytes --] provided vlan tpid set ops implementations. Signed-off-by: Junlong Wang <wang.junlong1@zte.com.cn> --- 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 [-- Attachment #1.1.2: Type: text/html , Size: 12576 bytes --] ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 5/5] net/zxdh: add support VLAN TPID set ops 2025-06-17 2:05 ` [PATCH v2 5/5] net/zxdh: add support VLAN TPID set ops Junlong Wang @ 2025-06-17 3:32 ` zhoumin 0 siblings, 0 replies; 14+ messages in thread From: zhoumin @ 2025-06-17 3:32 UTC (permalink / raw) To: dev Recheck-request: rebase=main, loongarch-compilation ^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2025-06-17 3:32 UTC | newest] Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2025-06-07 2:30 [PATCH v1 1/3] net/zxdh: modify some MAC config issues Junlong Wang 2025-06-07 2:30 ` [PATCH v1 2/3] net/zxdh: modify some VLAN related issues Junlong Wang 2025-06-16 16:20 ` Stephen Hemminger 2025-06-07 2:30 ` [PATCH v1 3/3] net/zxdh: modify RSS " Junlong Wang 2025-06-16 16:22 ` Stephen Hemminger 2025-06-12 0:14 ` [PATCH v1 1/3] net/zxdh: modify some MAC config issues Thomas Monjalon 2025-06-12 1:18 ` Junlong Wang 2025-06-16 16:16 ` Stephen Hemminger 2025-06-17 2:04 ` [PATCH v2 1/5] net/zxdh: fix meson.build issus in compilation Junlong Wang 2025-06-17 2:05 ` [PATCH v2 2/5] net/zxdh: modify some MAC config issues Junlong Wang 2025-06-17 2:05 ` [PATCH v2 3/5] net/zxdh: modify some VLAN related issues Junlong Wang 2025-06-17 2:05 ` [PATCH v2 4/5] net/zxdh: modify RSS " Junlong Wang 2025-06-17 2:05 ` [PATCH v2 5/5] net/zxdh: add support VLAN TPID set ops Junlong Wang 2025-06-17 3:32 ` zhoumin
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).