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