delete port tables in host.<br /> <br />Signed-off-by: Junlong Wang <wang.junlong1@zte.com.cn> <br />---<br /> drivers/net/zxdh/zxdh_ethdev.c |  19 ++++++<br /> drivers/net/zxdh/zxdh_msg.h    |   1 +<br /> drivers/net/zxdh/zxdh_np.c     | 113 +++++++++++++++++++++++++++++++++<br /> drivers/net/zxdh/zxdh_np.h     |   9 +++<br /> drivers/net/zxdh/zxdh_tables.c |  33 +++++++++-<br /> drivers/net/zxdh/zxdh_tables.h |   1 +<br /> 6 files changed, 175 insertions(+), 1 deletion(-)<br /> <br />diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c<br />index 9f3a5bcf9c..63eac7781c 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev.c<br />+++ b/drivers/net/zxdh/zxdh_ethdev.c<br />@@ -842,6 +842,19 @@ zxdh_dev_configure(struct rte_eth_dev *dev)<br />     return ret;<br /> }<br />  <br />+static int<br />+zxdh_tables_uninit(struct rte_eth_dev *dev)<br />+{<br />+    int ret = 0;<br />+<br />+    ret = zxdh_port_attr_uninit(dev);<br />+    if (ret) {<br />+        PMD_DRV_LOG(ERR, "zxdh_port_attr_uninit failed");<br />+        return ret;<br />+    }<br />+    return ret;<br />+}<br />+<br /> static void<br /> zxdh_np_dtb_data_res_free(struct zxdh_hw *hw)<br /> {<br />@@ -893,6 +906,12 @@ zxdh_dev_close(struct rte_eth_dev *dev)<br />     struct zxdh_hw *hw = dev->data->dev_private;<br />     int ret = 0;<br />  <br />+    ret = zxdh_tables_uninit(dev);<br />+    if (ret != 0) {<br />+        PMD_DRV_LOG(ERR, "%s :unint port %s failed ", __func__, dev->device->name);<br />+        return -1;<br />+    }<br />+<br />     zxdh_intr_release(dev);<br />     zxdh_np_uninit(dev);<br />     zxdh_pci_reset(hw);<br />diff --git a/drivers/net/zxdh/zxdh_msg.h b/drivers/net/zxdh/zxdh_msg.h<br />index 35ed5d1a1c..9997417f28 100644<br />--- a/drivers/net/zxdh/zxdh_msg.h<br />+++ b/drivers/net/zxdh/zxdh_msg.h<br />@@ -167,6 +167,7 @@ enum pciebar_layout_type {<br /> enum zxdh_msg_type {<br />     ZXDH_NULL = 0,<br />     ZXDH_VF_PORT_INIT = 1,<br />+    ZXDH_VF_PORT_UNINIT = 2,<br />  <br />     ZXDH_MSG_TYPE_END,<br /> } __rte_packed;<br />diff --git a/drivers/net/zxdh/zxdh_np.c b/drivers/net/zxdh/zxdh_np.c<br />index 6b8168da6f..242a6901ed 100644<br />--- a/drivers/net/zxdh/zxdh_np.c<br />+++ b/drivers/net/zxdh/zxdh_np.c<br />@@ -22,6 +22,7 @@ ZXDH_PPU_CLS_BITMAP_T g_ppu_cls_bit_map[ZXDH_DEV_CHANNEL_MAX];<br /> ZXDH_DTB_MGR_T *p_dpp_dtb_mgr[ZXDH_DEV_CHANNEL_MAX]   = {NULL};<br /> ZXDH_RISCV_DTB_MGR *p_riscv_dtb_queue_mgr[ZXDH_DEV_CHANNEL_MAX] = {NULL};<br /> ZXDH_TLB_MGR_T *g_p_dpp_tlb_mgr[ZXDH_DEV_CHANNEL_MAX]   = {NULL};<br />+ZXDH_SDT_TBL_DATA_T  g_sdt_info[ZXDH_DEV_CHANNEL_MAX][ZXDH_DEV_SDT_ID_MAX];<br /> ZXDH_REG_T g_dpp_reg_info[4] = {0};<br /> ZXDH_DTB_TABLE_T g_dpp_dtb_table_info[4] = {0};<br />  <br />@@ -1497,3 +1498,115 @@ zxdh_np_dtb_table_entry_write(uint32_t dev_id,<br />  <br />     return rc;<br /> }<br />+<br />+static uint32_t<br />+zxdh_np_sdt_tbl_data_get(uint32_t dev_id, uint32_t sdt_no, ZXDH_SDT_TBL_DATA_T *p_sdt_data)<br />+{<br />+    uint32_t rc   = 0;<br />+<br />+    p_sdt_data->data_high32 = g_sdt_info[dev_id][sdt_no].data_high32;<br />+    p_sdt_data->data_low32  = g_sdt_info[dev_id][sdt_no].data_low32;<br />+<br />+    return rc;<br />+}<br />+<br />+int<br />+zxdh_np_dtb_table_entry_delete(uint32_t dev_id,<br />+             uint32_t queue_id,<br />+             uint32_t entrynum,<br />+             ZXDH_DTB_USER_ENTRY_T *delete_entries)<br />+{<br />+    uint32_t rc = 0;<br />+    uint32_t entry_index = 0;<br />+    uint32_t sdt_no = 0;<br />+    uint32_t tbl_type = 0;<br />+    uint32_t element_id = 0xff;<br />+    uint32_t one_dtb_len = 0;<br />+    uint32_t dtb_len = 0;<br />+    uint32_t addr_offset = 0;<br />+    uint32_t max_size = 0;<br />+    uint8_t *p_data_buff = NULL;<br />+    uint8_t *p_data_buff_ex = NULL;<br />+    ZXDH_DTB_LPM_ENTRY_T lpm_entry = {0};<br />+<br />+    uint8_t entry_cmd[ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8] = {0};<br />+    uint8_t entry_data[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};<br />+    ZXDH_SDT_TBL_DATA_T sdt_tbl = {0};<br />+    ZXDH_DTB_USER_ENTRY_T *pentry = NULL;<br />+    ZXDH_DTB_ENTRY_T   dtb_one_entry = {0};<br />+<br />+    ZXDH_COMM_CHECK_POINT(delete_entries);<br />+<br />+    p_data_buff = (uint8_t *)rte_malloc(NULL, ZXDH_DTB_TABLE_DATA_BUFF_SIZE, 0);<br />+    ZXDH_COMM_CHECK_POINT(p_data_buff);<br />+    memset(p_data_buff, 0, ZXDH_DTB_TABLE_DATA_BUFF_SIZE);<br />+<br />+    p_data_buff_ex =<br />+        (uint8_t *)rte_malloc(NULL, ZXDH_DTB_TABLE_DATA_BUFF_SIZE * sizeof(uint8_t), 0);<br />+    memset(p_data_buff_ex, 0, ZXDH_DTB_TABLE_DATA_BUFF_SIZE);<br />+<br />+    memset((uint8_t *)&lpm_entry, 0x0, sizeof(ZXDH_DTB_LPM_ENTRY_T));<br />+<br />+    memset((uint8_t *)&dtb_one_entry, 0x0, sizeof(ZXDH_DTB_ENTRY_T));<br />+    memset(entry_cmd, 0x0, sizeof(entry_cmd));<br />+    memset(entry_data, 0x0, sizeof(entry_data));<br />+    dtb_one_entry.cmd = entry_cmd;<br />+    dtb_one_entry.data = entry_data;<br />+<br />+    max_size = (ZXDH_DTB_TABLE_DATA_BUFF_SIZE / 16) - 1;<br />+<br />+    for (entry_index = 0; entry_index < entrynum; entry_index++) {<br />+        pentry = delete_entries + entry_index;<br />+<br />+        sdt_no = pentry->sdt_no;<br />+        rc = zxdh_np_sdt_tbl_data_get(dev_id, sdt_no, &sdt_tbl);<br />+        switch (tbl_type) {<br />+        case ZXDH_SDT_TBLT_ERAM:<br />+        {<br />+            rc = zxdh_np_dtb_eram_one_entry(dev_id, sdt_no, ZXDH_DTB_ITEM_DELETE,<br />+                pentry->p_entry_data, &one_dtb_len, &dtb_one_entry);<br />+            break;<br />+        }<br />+<br />+        default:<br />+        {<br />+            PMD_DRV_LOG(ERR, "SDT table_type[ %d ] is invalid!", tbl_type);<br />+            rte_free(p_data_buff);<br />+            rte_free(p_data_buff_ex);<br />+            return 1;<br />+        }<br />+        }<br />+<br />+        addr_offset = dtb_len * ZXDH_DTB_LEN_POS_SETP;<br />+        dtb_len += one_dtb_len;<br />+        if (dtb_len > max_size) {<br />+            rte_free(p_data_buff);<br />+            rte_free(p_data_buff_ex);<br />+            PMD_DRV_LOG(ERR, " %s error dtb_len>%u!", __func__,<br />+                max_size);<br />+            return ZXDH_RC_DTB_DOWN_LEN_INVALID;<br />+        }<br />+<br />+        rc = zxdh_np_dtb_data_write(p_data_buff, addr_offset, &dtb_one_entry);<br />+        memset(entry_cmd, 0x0, sizeof(entry_cmd));<br />+        memset(entry_data, 0x0, sizeof(entry_data));<br />+    }<br />+<br />+    if (dtb_len == 0) {<br />+        rte_free(p_data_buff);<br />+        rte_free(p_data_buff_ex);<br />+        return ZXDH_RC_DTB_DOWN_LEN_INVALID;<br />+    }<br />+<br />+    rc = zxdh_np_dtb_write_down_table_data(dev_id,<br />+                                      queue_id,<br />+                                      dtb_len * 16,<br />+                                      p_data_buff,<br />+                                      &element_id);<br />+    rte_free(p_data_buff);<br />+    ZXDH_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc,<br />+        "dpp_dtb_write_down_table_data", p_data_buff_ex);<br />+<br />+    rte_free(p_data_buff_ex);<br />+    return 0;<br />+}<br />diff --git a/drivers/net/zxdh/zxdh_np.h b/drivers/net/zxdh/zxdh_np.h<br />index 02c27df887..3cb9580254 100644<br />--- a/drivers/net/zxdh/zxdh_np.h<br />+++ b/drivers/net/zxdh/zxdh_np.h<br />@@ -54,6 +54,8 @@<br /> #define ZXDH_ACL_TBL_ID_MAX             (7)<br /> #define ZXDH_ACL_TBL_ID_NUM             (8U)<br /> #define ZXDH_ACL_BLOCK_NUM              (8U)<br />+#define ZXDH_SDT_H_TBL_TYPE_BT_POS      (29)<br />+#define ZXDH_SDT_H_TBL_TYPE_BT_LEN      (3)<br />  <br /> #define ZXDH_SMMU0_READ_REG_MAX_NUM              (4)<br />  <br />@@ -507,9 +509,16 @@ typedef struct zxdh_dtb_user_entry_t {<br />     void *p_entry_data;<br /> } ZXDH_DTB_USER_ENTRY_T;<br />  <br />+typedef struct zxdh_sdt_tbl_data_t {<br />+    uint32_t data_high32;<br />+    uint32_t data_low32;<br />+} ZXDH_SDT_TBL_DATA_T;<br />+<br /> int zxdh_np_host_init(uint32_t dev_id, ZXDH_DEV_INIT_CTRL_T *p_dev_init_ctrl);<br /> int zxdh_np_online_uninit(uint32_t dev_id, char *port_name, uint32_t queue_id);<br /> int zxdh_np_dtb_table_entry_write(uint32_t dev_id, uint32_t queue_id,<br />             uint32_t entrynum, ZXDH_DTB_USER_ENTRY_T *down_entries);<br />+int zxdh_np_dtb_table_entry_delete(uint32_t dev_id, uint32_t queue_id,<br />+             uint32_t entrynum, ZXDH_DTB_USER_ENTRY_T *delete_entries);<br />  <br /> #endif /* ZXDH_NP_H */<br />diff --git a/drivers/net/zxdh/zxdh_tables.c b/drivers/net/zxdh/zxdh_tables.c<br />index 4284fefe3a..e28823c657 100644<br />--- a/drivers/net/zxdh/zxdh_tables.c<br />+++ b/drivers/net/zxdh/zxdh_tables.c<br />@@ -70,7 +70,38 @@ zxdh_port_attr_init(struct rte_eth_dev *dev)<br />     return ret;<br /> };<br />  <br />-int zxdh_panel_table_init(struct rte_eth_dev *dev)<br />+int<br />+zxdh_port_attr_uninit(struct rte_eth_dev *dev)<br />+{<br />+    struct zxdh_hw *hw = dev->data->dev_private;<br />+    struct zxdh_msg_info msg_info = {0};<br />+    struct zxdh_port_attr_table port_attr = {0};<br />+    int ret = 0;<br />+<br />+    if (hw->is_pf == 1) {<br />+        ZXDH_DTB_ERAM_ENTRY_INFO_T port_attr_entry = {hw->vfid, (uint32_t *)&port_attr};<br />+        ZXDH_DTB_USER_ENTRY_T entry = {<br />+            .sdt_no = ZXDH_SDT_VPORT_ATT_TABLE,<br />+            .p_entry_data = (void *)&port_attr_entry<br />+        };<br />+        ret = zxdh_np_dtb_table_entry_delete(ZXDH_DEVICE_NO, g_dtb_data.queueid, 1, &entry);<br />+        if (ret) {<br />+            PMD_DRV_LOG(ERR, "delete port attr table failed");<br />+            return -ret;<br />+        }<br />+    } else {<br />+        zxdh_msg_head_build(hw, ZXDH_VF_PORT_UNINIT, &msg_info);<br />+        ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), NULL, 0);<br />+        if (ret) {<br />+            PMD_DRV_LOG(ERR, "vf port tables uninit failed");<br />+            return -ret;<br />+        }<br />+    }<br />+    return ret;<br />+}<br />+<br />+int<br />+zxdh_panel_table_init(struct rte_eth_dev *dev)<br /> {<br />     struct zxdh_hw *hw = dev->data->dev_private;<br />  <br />diff --git a/drivers/net/zxdh/zxdh_tables.h b/drivers/net/zxdh/zxdh_tables.h<br />index 5d34af2f05..5e9b36faee 100644<br />--- a/drivers/net/zxdh/zxdh_tables.h<br />+++ b/drivers/net/zxdh/zxdh_tables.h<br />@@ -144,5 +144,6 @@ struct zxdh_panel_table {<br /> int zxdh_port_attr_init(struct rte_eth_dev *dev);<br /> int zxdh_panel_table_init(struct rte_eth_dev *dev);<br /> int zxdh_set_port_attr(uint16_t vfid, struct zxdh_port_attr_table *port_attr);<br />+int zxdh_port_attr_uninit(struct rte_eth_dev *dev);<br />  <br /> #endif /* ZXDH_TABLES_H */<br />--  <br />2.27.0<br />