optimize promisc ops.

Signed-off-by: Junlong Wang <wang.junlo...@zte.com.cn>
---
 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 a278e080e7..aa6982e7a8 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, uint16_t *res_len)
@@ -1250,6 +1268,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);
 
@@ -1307,6 +1331,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;
@@ -1406,12 +1436,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 || !reply || !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;
+}
+
 static const 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

Reply via email to