optimize promisc ops.
Signed-off-by: Junlong Wang <wang.junlong1@zte.com.cn>
---
drivers/net/zxdh/zxdh_msg.c | 30 +++++++++++++++++++++
drivers/net/zxdh/zxdh_tables.c | 49 ++++++++++++++++++++++++++++++++++
drivers/net/zxdh/zxdh_tables.h | 3 ++-
3 files changed, 81 insertions(+), 1 deletion(-)
diff --git a/drivers/net/zxdh/zxdh_msg.c b/drivers/net/zxdh/zxdh_msg.c
index aa93c4c26a..e4a34f078a 100644
--- a/drivers/net/zxdh/zxdh_msg.c
+++ b/drivers/net/zxdh/zxdh_msg.c
@@ -1232,6 +1232,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,
@@ -1260,6 +1278,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);
@@ -1318,6 +1342,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;
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 7b876d504f..b4b65a5eb6 100644
--- a/drivers/net/zxdh/zxdh_tables.h
+++ b/drivers/net/zxdh/zxdh_tables.h
@@ -46,7 +46,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;
@@ -234,5 +234,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