optimize promisc ops. Signed-off-by: Junlong Wang --- drivers/net/zxdh/zxdh_msg.c | 62 ++++++++++++++++++++++++++++++++++ drivers/net/zxdh/zxdh_tables.c | 49 +++++++++++++++++++++++++++ drivers/net/zxdh/zxdh_tables.h | 3 +- 3 files changed, 113 insertions(+), 1 deletion(-) diff --git a/drivers/net/zxdh/zxdh_msg.c b/drivers/net/zxdh/zxdh_msg.c index 7b3456248c..892d57a51e 100644 --- a/drivers/net/zxdh/zxdh_msg.c +++ b/drivers/net/zxdh/zxdh_msg.c @@ -1223,6 +1223,24 @@ zxdh_bar_chan_msg_recv_register(uint8_t module_id, zxdh_bar_chan_msg_recv_callba return ZXDH_BAR_MSG_OK; } +static int +zxdh_vf_promisc_init(struct zxdh_hw *hw, union zxdh_virport_num vport) +{ + int16_t ret; + + ret = zxdh_dev_broadcast_set(hw, vport.vport, true); + return ret; +} + +static int +zxdh_vf_promisc_uninit(struct zxdh_hw *hw, union zxdh_virport_num vport) +{ + int16_t ret; + + ret = zxdh_dev_broadcast_set(hw, vport.vport, false); + return ret; +} + static int zxdh_vf_port_init(struct zxdh_hw *pf_hw, uint16_t vport, void *cfg_data, struct zxdh_msg_reply_body *res_info __rte_unused, @@ -1251,6 +1269,12 @@ zxdh_vf_port_init(struct zxdh_hw *pf_hw, uint16_t vport, void *cfg_data, goto proc_end; } + ret = zxdh_vf_promisc_init(pf_hw, port); + if (ret) { + PMD_DRV_LOG(ERR, "vf_promisc_table_init failed, code:%d", ret); + goto proc_end; + } + res_info->flag = ZXDH_REPS_SUCC; *res_len = sizeof(res_info->flag); @@ -1309,6 +1333,12 @@ zxdh_vf_port_uninit(struct zxdh_hw *pf_hw, goto proc_end; } + ret = zxdh_vf_promisc_uninit(pf_hw, vport_num); + if (ret) { + PMD_DRV_LOG(ERR, "vf_promisc_table_uninit failed, code:%d", ret); + goto proc_end; + } + *res_len += strlen(str); rte_memcpy(&res_info->reply_data, str, strlen(str) + 1); res_info->flag = ZXDH_REPS_SUCC; @@ -1408,12 +1438,44 @@ zxdh_del_vf_mac_table(struct zxdh_hw *hw, uint16_t vport, void *cfg_data, return ret; } +static int +zxdh_vf_promisc_set(struct zxdh_hw *hw, uint16_t vport, void *cfg_data, + struct zxdh_msg_reply_body *reply, uint16_t *res_len) +{ + struct zxdh_port_promisc_msg *promisc_msg = (struct zxdh_port_promisc_msg *)cfg_data; + int ret = 0; + + RTE_ASSERT(!cfg_data || !hw || !res_info || !res_len); + + if (promisc_msg->mode == ZXDH_PROMISC_MODE) { + zxdh_dev_unicast_table_set(hw, vport, promisc_msg->value); + if (promisc_msg->mc_follow == 1) + ret = zxdh_dev_multicast_table_set(hw, vport, promisc_msg->value); + } else if (promisc_msg->mode == ZXDH_ALLMULTI_MODE) { + ret = zxdh_dev_multicast_table_set(hw, vport, promisc_msg->value); + } else { + PMD_DRV_LOG(ERR, "promisc_set_msg mode[%u] error", promisc_msg->mode); + goto proc_end; + } + + *res_len = sizeof(struct zxdh_port_attr_set_msg) + sizeof(enum zxdh_reps_flag); + reply->flag = ZXDH_REPS_SUCC; + + return ret; + +proc_end: + *res_len = sizeof(struct zxdh_port_attr_set_msg) + sizeof(enum zxdh_reps_flag); + reply->flag = ZXDH_REPS_FAIL; + return ret; +} + zxdh_msg_process_callback zxdh_proc_cb[] = { [ZXDH_NULL] = NULL, [ZXDH_VF_PORT_INIT] = zxdh_vf_port_init, [ZXDH_VF_PORT_UNINIT] = zxdh_vf_port_uninit, [ZXDH_MAC_ADD] = zxdh_add_vf_mac_table, [ZXDH_MAC_DEL] = zxdh_del_vf_mac_table, + [ZXDH_PORT_PROMISC_SET] = zxdh_vf_promisc_set, }; static inline int diff --git a/drivers/net/zxdh/zxdh_tables.c b/drivers/net/zxdh/zxdh_tables.c index bfc240a051..9838b8d103 100644 --- a/drivers/net/zxdh/zxdh_tables.c +++ b/drivers/net/zxdh/zxdh_tables.c @@ -595,6 +595,7 @@ zxdh_dev_unicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable) { struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd; 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; int16_t ret = 0; @@ -629,6 +630,20 @@ zxdh_dev_unicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable) PMD_DRV_LOG(ERR, "unicast_table_set_failed:%d", hw->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); + 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); + return -ret; + } + return 0; } @@ -852,3 +867,37 @@ zxdh_rss_table_get(struct zxdh_hw *hw, uint16_t vport, struct zxdh_rss_reta *rss } return 0; } + +int +zxdh_dev_broadcast_set(struct zxdh_hw *hw, uint16_t vport, bool enable) +{ + struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd; + struct zxdh_brocast_table brocast_table = {0}; + union zxdh_virport_num vport_num = (union zxdh_virport_num)vport; + int16_t vf_group_id = vport_num.vfid / 64; + int16_t ret = 0; + + ZXDH_DTB_ERAM_ENTRY_INFO_T eram_entry = { + ((hw->vfid - ZXDH_BASE_VFID) << 2) + vf_group_id, + (uint32_t *)&brocast_table}; + ZXDH_DTB_USER_ENTRY_T entry_get = { + .sdt_no = ZXDH_SDT_BROCAST_ATT_TABLE, + .p_entry_data = (void *)&eram_entry}; + + ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &entry_get, 1); + if (ret == 0) { + if (enable) + brocast_table.bitmap[(vport_num.vfid % 64) / 32] |= + ((UINT32_C(1) << (31 - (vport_num.vfid % 64) % 32))); + else + brocast_table.bitmap[(vport_num.vfid % 64) / 32] &= + ~((UINT32_C(1) << (31 - (vport_num.vfid % 64) % 32))); + + ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid, 1, &entry_get); + if (ret) { + PMD_DRV_LOG(ERR, "brocast_table_write_failed. code:%d", ret); + return -ret; + } + } + return 0; +} diff --git a/drivers/net/zxdh/zxdh_tables.h b/drivers/net/zxdh/zxdh_tables.h index de30474210..040867d333 100644 --- a/drivers/net/zxdh/zxdh_tables.h +++ b/drivers/net/zxdh/zxdh_tables.h @@ -60,7 +60,7 @@ struct zxdh_port_attr_table { uint8_t is_up: 1; uint8_t rsv1: 1; - uint8_t rsv3 : 1; + uint8_t promisc_enable : 1; uint8_t rdma_offload_enable: 1; uint8_t vlan_filter_enable: 1; uint8_t vlan_strip_offload: 1; @@ -248,5 +248,6 @@ int zxdh_rss_table_set(struct zxdh_hw *hw, uint16_t vport, struct zxdh_rss_reta int zxdh_rss_table_get(struct zxdh_hw *hw, uint16_t vport, struct zxdh_rss_reta *rss_reta); int zxdh_get_panel_attr(struct rte_eth_dev *dev, struct zxdh_panel_table *panel_attr); int zxdh_set_panel_attr(struct rte_eth_dev *dev, struct zxdh_panel_table *panel_attr); +int zxdh_dev_broadcast_set(struct zxdh_hw *hw, uint16_t vport, bool enable); #endif /* ZXDH_TABLES_H */ -- 2.27.0