Configure the storage address for<br />the dtb queue to save tables contents.<br /> <br />Signed-off-by: Bingbin Chen <chen.bingbin@zte.com.cn> <br />---<br /> drivers/net/zxdh/zxdh_np.c | 1137 ++++++++++++++++++++++++++++++++++++<br /> drivers/net/zxdh/zxdh_np.h |   91 +++<br /> 2 files changed, 1228 insertions(+)<br /> <br />diff --git a/drivers/net/zxdh/zxdh_np.c b/drivers/net/zxdh/zxdh_np.c<br />index 3f5d286ffe..98135b37a7 100644<br />--- a/drivers/net/zxdh/zxdh_np.c<br />+++ b/drivers/net/zxdh/zxdh_np.c<br />@@ -26,6 +26,7 @@ static uint64_t g_np_fw_compat_addr[ZXDH_DEV_CHANNEL_MAX];<br /> static const ZXDH_VERSION_COMPATIBLE_REG_T g_np_sdk_version = {<br />     ZXDH_NPSDK_COMPAT_ITEM_ID, 1, 0, 0, 0, {0} };<br /> static const uint32_t hardware_ep_id[5] = {5, 6, 7, 8, 9};<br />+static ZXDH_RB_CFG *g_dtb_dump_addr_rb[ZXDH_DEV_CHANNEL_MAX][ZXDH_DTB_QUEUE_NUM_MAX];<br />  <br /> static const ZXDH_FIELD_T g_smmu0_smmu0_cpu_ind_cmd_reg[] = {<br />     {"cpu_ind_rw", ZXDH_FIELD_FLAG_RW, 31, 1, 0x0, 0x0},<br />@@ -324,6 +325,51 @@ zxdh_np_dtb_tab_up_phy_addr_get(uint32_t DEV_ID, uint32_t QUEUE_ID,<br /> #define ZXDH_DTB_TAB_UP_PHY_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)     \<br />     zxdh_np_dtb_tab_up_phy_addr_get(DEV_ID, QUEUE_ID, INDEX)<br />  <br />+static inline void<br />+zxdh_np_init_d_node(ZXDH_D_NODE *ptr, void *pdata)<br />+{<br />+    ptr->data = pdata;<br />+    ptr->prev = NULL;<br />+    ptr->next = NULL;<br />+}<br />+<br />+static inline void<br />+zxdh_np_init_rbt_tn(ZXDH_RB_TN *p_tn, void *p_newkey)<br />+{<br />+    p_tn->p_key = p_newkey;<br />+    p_tn->color_lsv = 0;<br />+    p_tn->p_left = NULL;<br />+    p_tn->p_right = NULL;<br />+    p_tn->p_parent = NULL;<br />+    zxdh_np_init_d_node(&p_tn->tn_ln, p_tn);<br />+}<br />+<br />+static inline uint32_t<br />+zxdh_np_get_tn_lsv(ZXDH_RB_TN *p_tn)<br />+{<br />+    return p_tn->color_lsv >> 2;<br />+}<br />+<br />+static inline void<br />+zxdh_np_set_tn_lsv(ZXDH_RB_TN *p_tn, uint32_t list_val)<br />+{<br />+    p_tn->color_lsv &= 0x3;<br />+    p_tn->color_lsv |= (list_val << 2);<br />+}<br />+<br />+static inline void<br />+zxdh_np_set_tn_color(ZXDH_RB_TN *p_tn, uint32_t color)<br />+{<br />+    p_tn->color_lsv &= 0xfffffffc;<br />+    p_tn->color_lsv |= (color & 0x3);<br />+}<br />+<br />+static inline uint32_t<br />+zxdh_np_get_tn_color(ZXDH_RB_TN *p_tn)<br />+{<br />+    return ((p_tn == NULL) ? ZXDH_RBT_BLACK : (p_tn)->color_lsv & 0x3);<br />+}<br />+<br /> static ZXDH_FIELD_T g_stat_car0_cara_queue_ram0_159_0_reg[] = {<br />     {"cara_drop", ZXDH_FIELD_FLAG_RW, 147, 1, 0x0, 0x0},<br />     {"cara_plcr_en", ZXDH_FIELD_FLAG_RW, 146, 1, 0x0, 0x0},<br />@@ -465,6 +511,945 @@ zxdh_np_comm_swap(uint8_t *p_uc_data, uint32_t dw_byte_len)<br />     }<br /> }<br />  <br />+static uint32_t<br />+zxdh_comm_double_link_init(uint32_t elmemtnum, ZXDH_D_HEAD *p_head)<br />+{<br />+    uint32_t err_code = 0;<br />+<br />+    if (elmemtnum == 0) {<br />+        err_code = ZXDH_DOUBLE_LINK_INIT_ELEMENT_NUM_ERR;<br />+        PMD_DRV_LOG(ERR, "Error:[0x%x] doule_link_init Element Num Err !",<br />+            err_code);<br />+        return err_code;<br />+    }<br />+<br />+    p_head->maxnum   = elmemtnum;<br />+    p_head->used     = 0;<br />+    p_head->p_next   = NULL;<br />+    p_head->p_prev   = NULL;<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_comm_liststack_create(uint32_t element_num, ZXDH_LISTSTACK_MANAGER **p_list)<br />+{<br />+    ZXDH_LISTSTACK_MANAGER *p_local_list = NULL;<br />+    uint32_t dw_list_size = 0;<br />+    uint32_t dw_manage_size = 0;<br />+    uint32_t dw_actual_element_num = 0;<br />+    uint32_t i = 0;<br />+<br />+    if (p_list == NULL) {<br />+        PMD_DRV_LOG(ERR, " p_list is NULL!");<br />+        return ZXDH_LIST_STACK_POINT_NULL;<br />+    }<br />+    if (element_num <= 0) {<br />+        *p_list = NULL;<br />+        PMD_DRV_LOG(ERR, " FtmComm_ListStackCreat_dwElementNum <=0");<br />+        return ZXDH_LIST_STACK_ELEMENT_NUM_ERR;<br />+    }<br />+<br />+    if (element_num > ZXDH_LISTSTACK_MAX_ELEMENT - 1)<br />+        dw_actual_element_num = ZXDH_LISTSTACK_MAX_ELEMENT;<br />+    else<br />+        dw_actual_element_num = element_num + 1;<br />+<br />+    dw_list_size = (dw_actual_element_num * sizeof(ZXDH_COMM_FREELINK)) & 0xffffffff;<br />+    dw_manage_size = ((sizeof(ZXDH_LISTSTACK_MANAGER) & 0xFFFFFFFFU) + dw_list_size) & <br />+        0xffffffff;<br />+<br />+    p_local_list = rte_zmalloc(NULL, dw_manage_size, 0);<br />+    if (p_local_list == NULL) {<br />+        *p_list = NULL;<br />+        PMD_DRV_LOG(ERR, "malloc memory failed");<br />+        return ZXDH_LIST_STACK_ALLOC_MEMORY_FAIL;<br />+    }<br />+<br />+    p_local_list->p_array = (ZXDH_COMM_FREELINK *)((uint8_t *)p_local_list +<br />+        sizeof(ZXDH_LISTSTACK_MANAGER));<br />+<br />+    p_local_list->capacity = dw_actual_element_num;<br />+    p_local_list->free_num = dw_actual_element_num - 1;<br />+    p_local_list->used_num = 0;<br />+<br />+    for (i = 1; i < (dw_actual_element_num - 1); i++) {<br />+        p_local_list->p_array[i].index = i;<br />+        p_local_list->p_array[i].next = i + 1;<br />+    }<br />+<br />+    p_local_list->p_array[0].index = 0;<br />+    p_local_list->p_array[0].next =  0;<br />+<br />+    p_local_list->p_array[dw_actual_element_num - 1].index = dw_actual_element_num - 1;<br />+    p_local_list->p_array[dw_actual_element_num - 1].next = 0xffffffff;<br />+<br />+    p_local_list->p_head = p_local_list->p_array[1].index;<br />+<br />+    *p_list = p_local_list;<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_comm_liststack_alloc(ZXDH_LISTSTACK_MANAGER *p_list, uint32_t *p_index)<br />+{<br />+    uint32_t dw_alloc_index = 0;<br />+    uint32_t dw_next_free = 0;<br />+<br />+    if (p_list == NULL) {<br />+        *p_index = ZXDH_LISTSTACK_INVALID_INDEX;<br />+        return ZXDH_LIST_STACK_POINT_NULL;<br />+    }<br />+<br />+    if (p_list->p_head == ZXDH_LISTSTACK_INVALID_INDEX) {<br />+        *p_index = ZXDH_LISTSTACK_INVALID_INDEX;<br />+        return ZXDH_LIST_STACK_ISEMPTY_ERR;<br />+    }<br />+<br />+    dw_alloc_index = p_list->p_head;<br />+<br />+    dw_next_free = p_list->p_array[dw_alloc_index].next;<br />+    p_list->p_array[dw_alloc_index].next = ZXDH_LISTSTACK_INVALID_INDEX;<br />+<br />+    if (dw_next_free != 0xffffffff)<br />+        p_list->p_head = p_list->p_array[dw_next_free].index;<br />+    else<br />+        p_list->p_head = ZXDH_LISTSTACK_INVALID_INDEX;<br />+<br />+    *p_index = dw_alloc_index - 1;<br />+<br />+    p_list->free_num--;<br />+    p_list->used_num++;<br />+<br />+    if (p_list->free_num == 0 || (p_list->used_num == (p_list->capacity - 1)))<br />+        p_list->p_head = ZXDH_LISTSTACK_INVALID_INDEX;<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br />+static uint32_t<br />+zxdh_comm_liststack_free(ZXDH_LISTSTACK_MANAGER *p_list, uint32_t index)<br />+{<br />+    uint32_t     dw_free_index = 0;<br />+    uint32_t     dw_prev_free  = 0;<br />+    uint32_t     dw_index      = 0;<br />+<br />+    dw_index      = index + 1;<br />+<br />+    if (p_list == NULL) {<br />+        PMD_DRV_LOG(ERR, " p_list is null");<br />+        return ZXDH_LIST_STACK_POINT_NULL;<br />+    }<br />+<br />+    if (dw_index >= p_list->capacity) {<br />+        PMD_DRV_LOG(ERR, "dw_index is invalid");<br />+        return ZXDH_LIST_STACK_FREE_INDEX_INVALID;<br />+    }<br />+<br />+    if (p_list->p_array[dw_index].next != ZXDH_LISTSTACK_INVALID_INDEX)<br />+        return ZXDH_OK;<br />+<br />+    dw_free_index = dw_index;<br />+    dw_prev_free = p_list->p_head;<br />+<br />+    if (dw_prev_free != 0)<br />+        p_list->p_array[dw_free_index].next =  p_list->p_array[dw_prev_free].index;<br />+    else<br />+        p_list->p_array[dw_free_index].next = 0xffffffff;<br />+<br />+    p_list->p_head = p_list->p_array[dw_free_index].index;<br />+<br />+    p_list->free_num++;<br />+    p_list->used_num--;<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br />+static uint32_t<br />+zxdh_comm_double_link_insert_1st(ZXDH_D_NODE *p_newnode, ZXDH_D_HEAD *p_head)<br />+{<br />+    RTE_ASSERT(!(!p_head->p_next && p_head->p_prev));<br />+    RTE_ASSERT(!(p_head->p_next && !p_head->p_prev));<br />+<br />+    p_newnode->next = p_head->p_next;<br />+    p_newnode->prev = NULL;<br />+<br />+    if (p_head->p_next)<br />+        p_head->p_next->prev = p_newnode;<br />+    else<br />+        p_head->p_prev = p_newnode;<br />+<br />+    p_head->p_next = p_newnode;<br />+    p_head->used++;<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br />+static uint32_t<br />+zxdh_comm_double_link_insert_aft(ZXDH_D_NODE *p_newnode,<br />+                                ZXDH_D_NODE *p_oldnode,<br />+                                ZXDH_D_HEAD *p_head)<br />+{<br />+    RTE_ASSERT(!(!p_head->p_next && p_head->p_prev));<br />+    RTE_ASSERT(!(p_head->p_next && !p_head->p_prev));<br />+<br />+    p_newnode->next = p_oldnode->next;<br />+    p_newnode->prev = p_oldnode;<br />+<br />+    if (p_oldnode->next)<br />+        p_oldnode->next->prev = p_newnode;<br />+    else<br />+        p_head->p_prev = p_newnode;<br />+<br />+    p_oldnode->next = p_newnode;<br />+    p_head->used++;<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br />+static uint32_t<br />+zxdh_comm_double_link_insert_pre(ZXDH_D_NODE *p_newnode,<br />+    ZXDH_D_NODE *p_oldnode, ZXDH_D_HEAD *p_head)<br />+{<br />+    RTE_ASSERT(!(!p_head->p_next && p_head->p_prev));<br />+    RTE_ASSERT(!(p_head->p_next && !p_head->p_prev));<br />+<br />+    p_newnode->next = p_oldnode;<br />+    p_newnode->prev = p_oldnode->prev;<br />+<br />+    if (p_oldnode->prev)<br />+        p_oldnode->prev->next = p_newnode;<br />+    else<br />+        p_head->p_next = p_newnode;<br />+<br />+    p_oldnode->prev = p_newnode;<br />+    p_head->used++;<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br />+static uint32_t<br />+zxdh_comm_double_link_del(ZXDH_D_NODE *delnode, ZXDH_D_HEAD *p_head)<br />+{<br />+    ZXDH_D_NODE *next = NULL;<br />+    ZXDH_D_NODE *pre  = NULL;<br />+<br />+    next = delnode->next;<br />+    pre  = delnode->prev;<br />+<br />+    if (next)<br />+        next->prev = delnode->prev;<br />+    else<br />+        p_head->p_prev = delnode->prev;<br />+<br />+    if (pre)<br />+        pre->next = delnode->next;<br />+    else<br />+        p_head->p_next = delnode->next;<br />+<br />+    p_head->used--;<br />+    delnode->next = NULL;<br />+    delnode->prev = NULL;<br />+    return ZXDH_OK;<br />+}<br />+<br />+static int32_t<br />+zxdh_comm_rb_def_cmp(void *p_new, void *p_old, uint32_t key_size)<br />+{<br />+    return memcmp(p_new, p_old, key_size);<br />+}<br />+<br />+static void<br />+zxdh_comm_rb_switch_color(ZXDH_RB_TN  *p_tn1, ZXDH_RB_TN *p_tn2)<br />+{<br />+    uint32_t color1, color2;<br />+<br />+    color1 = zxdh_np_get_tn_color(p_tn1);<br />+    color2 = zxdh_np_get_tn_color(p_tn2);<br />+<br />+    zxdh_np_set_tn_color(p_tn1, color2);<br />+    zxdh_np_set_tn_color(p_tn2, color1);<br />+}<br />+<br />+static ZXDH_RB_TN *<br />+zxdh_comm_rb_get_brotn(ZXDH_RB_TN *p_cur_tn)<br />+{<br />+    return (p_cur_tn->p_parent->p_left == p_cur_tn) ? p_cur_tn->p_parent->p_right :<br />+        p_cur_tn->p_parent->p_left;<br />+}<br />+<br />+static uint32_t<br />+zxdh_comm_rb_handle_ins(__rte_unused ZXDH_RB_CFG *p_rb_cfg,<br />+                        ZXDH_RB_TN  ***stack_tn,<br />+                        uint32_t      stack_top)<br />+{<br />+    ZXDH_RB_TN  **pp_cur_tn        = NULL;<br />+    ZXDH_RB_TN  *p_cur_tn          = NULL;<br />+    ZXDH_RB_TN  **pp_tmp_tn        = NULL;<br />+    ZXDH_RB_TN  *p_tmp_tn          = NULL;<br />+<br />+    while (stack_top > 0) {<br />+        pp_cur_tn = stack_tn[stack_top];<br />+        p_cur_tn  = *pp_cur_tn;<br />+<br />+        if (!p_cur_tn->p_parent) {<br />+            zxdh_np_set_tn_color(p_cur_tn, ZXDH_RBT_BLACK);<br />+            break;<br />+        } else if (zxdh_np_get_tn_color(p_cur_tn->p_parent) == ZXDH_RBT_RED) {<br />+            ZXDH_RB_TN *p_unc_tn = zxdh_comm_rb_get_brotn(p_cur_tn->p_parent);<br />+<br />+            RTE_ASSERT(p_cur_tn->p_parent == *stack_tn[stack_top - 1]);<br />+<br />+            if (zxdh_np_get_tn_color(p_unc_tn) == ZXDH_RBT_RED) {<br />+                RTE_ASSERT(p_unc_tn);<br />+                zxdh_np_set_tn_color(p_cur_tn->p_parent, ZXDH_RBT_BLACK);<br />+                zxdh_np_set_tn_color(p_unc_tn, ZXDH_RBT_BLACK);<br />+<br />+                RTE_ASSERT(p_cur_tn->p_parent->p_parent ==<br />+                    *stack_tn[stack_top - 2]);<br />+<br />+                zxdh_np_set_tn_color(p_cur_tn->p_parent->p_parent, ZXDH_RBT_RED);<br />+                stack_top -= 2;<br />+            } else {<br />+                ZXDH_RB_TN *p_bro_tn = NULL;<br />+<br />+                pp_tmp_tn = stack_tn[stack_top - 2];<br />+                p_tmp_tn  = *pp_tmp_tn;<br />+<br />+                if (p_cur_tn->p_parent == p_tmp_tn->p_left && p_cur_tn ==<br />+                p_cur_tn->p_parent->p_left) {<br />+                    *pp_tmp_tn = p_cur_tn->p_parent;<br />+<br />+                    p_bro_tn  = zxdh_comm_rb_get_brotn(p_cur_tn);<br />+                    p_cur_tn->p_parent->p_parent = p_tmp_tn->p_parent;<br />+<br />+                    p_tmp_tn->p_left   = p_bro_tn;<br />+                    p_tmp_tn->p_parent = p_cur_tn->p_parent;<br />+                    p_cur_tn->p_parent->p_right = p_tmp_tn;<br />+<br />+                    if (p_bro_tn)<br />+                        p_bro_tn->p_parent  = p_tmp_tn;<br />+<br />+                    zxdh_comm_rb_switch_color(*pp_tmp_tn, p_tmp_tn);<br />+                } else if (p_cur_tn->p_parent == p_tmp_tn->p_left && p_cur_tn ==<br />+                p_cur_tn->p_parent->p_right) {<br />+                    *pp_tmp_tn = p_cur_tn;<br />+<br />+                    p_cur_tn->p_parent->p_right = p_cur_tn->p_left;<br />+<br />+                    if (p_cur_tn->p_left)<br />+                        p_cur_tn->p_left->p_parent = p_cur_tn->p_parent;<br />+<br />+                    p_cur_tn->p_parent->p_parent = p_cur_tn;<br />+                    p_tmp_tn->p_left = p_cur_tn->p_right;<br />+<br />+                    if (p_cur_tn->p_right)<br />+                        p_cur_tn->p_right->p_parent = p_tmp_tn;<br />+<br />+                    p_cur_tn->p_left = p_cur_tn->p_parent;<br />+                    p_cur_tn->p_right = p_tmp_tn;<br />+<br />+                    p_cur_tn->p_parent = p_tmp_tn->p_parent;<br />+                    p_tmp_tn->p_parent = p_cur_tn;<br />+<br />+                    zxdh_comm_rb_switch_color(*pp_tmp_tn, p_tmp_tn);<br />+                } else if (p_cur_tn->p_parent == p_tmp_tn->p_right && p_cur_tn ==<br />+                p_cur_tn->p_parent->p_right) {<br />+                    *pp_tmp_tn = p_cur_tn->p_parent;<br />+                    p_bro_tn  = zxdh_comm_rb_get_brotn(p_cur_tn);<br />+<br />+                    p_cur_tn->p_parent->p_parent = p_tmp_tn->p_parent;<br />+<br />+                    p_tmp_tn->p_right = p_cur_tn->p_parent->p_left;<br />+                    p_tmp_tn->p_parent = p_cur_tn->p_parent;<br />+                    p_cur_tn->p_parent->p_left = p_tmp_tn;<br />+<br />+                    if (p_bro_tn)<br />+                        p_bro_tn->p_parent  = p_tmp_tn;<br />+<br />+                    zxdh_comm_rb_switch_color(*pp_tmp_tn, p_tmp_tn);<br />+                } else {<br />+                    *pp_tmp_tn = p_cur_tn;<br />+                    p_cur_tn->p_parent->p_left = p_cur_tn->p_right;<br />+<br />+                    if (p_cur_tn->p_right)<br />+                        p_cur_tn->p_right->p_parent = p_cur_tn->p_parent;<br />+<br />+                    p_cur_tn->p_parent->p_parent = p_cur_tn;<br />+                    p_tmp_tn->p_right = p_cur_tn->p_left;<br />+<br />+                    if (p_cur_tn->p_left)<br />+                        p_cur_tn->p_left->p_parent = p_tmp_tn;<br />+<br />+                    p_cur_tn->p_right = p_cur_tn->p_parent;<br />+                    p_cur_tn->p_left = p_tmp_tn;<br />+<br />+                    p_cur_tn->p_parent = p_tmp_tn->p_parent;<br />+                    p_tmp_tn->p_parent = p_cur_tn;<br />+<br />+                    zxdh_comm_rb_switch_color(*pp_tmp_tn, p_tmp_tn);<br />+                }<br />+                break;<br />+            }<br />+        } else {<br />+            break;<br />+        }<br />+    }<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br />+static uint32_t<br />+zxdh_comm_rb_init(ZXDH_RB_CFG *p_rb_cfg,<br />+                uint32_t      total_num,<br />+                uint32_t      key_size,<br />+                ZXDH_RB_CMPFUN cmpfun)<br />+{<br />+    uint32_t      rtn  = ZXDH_OK;<br />+    uint32_t      malloc_size = 0;<br />+<br />+    if (p_rb_cfg->is_init) {<br />+        PMD_DRV_LOG(ERR, " p_rb_cfg already init!");<br />+        return ZXDH_OK;<br />+    }<br />+<br />+    p_rb_cfg->key_size =  key_size;<br />+    p_rb_cfg->p_root   =  NULL;<br />+<br />+    if (cmpfun)<br />+        p_rb_cfg->p_cmpfun =  cmpfun;<br />+    else<br />+        p_rb_cfg->p_cmpfun = zxdh_comm_rb_def_cmp;<br />+<br />+    if (total_num) {<br />+        p_rb_cfg->is_dynamic = 0;<br />+<br />+        rtn = zxdh_comm_double_link_init(total_num, &p_rb_cfg->tn_list);<br />+        ZXDH_COMM_CHECK_RC(rtn, "zxdh_comm_double_link_init");<br />+<br />+        rtn = zxdh_np_comm_liststack_create(total_num, &p_rb_cfg->p_lsm);<br />+        ZXDH_COMM_CHECK_RC(rtn, "zxdh_np_comm_liststack_create");<br />+<br />+        p_rb_cfg->p_keybase = rte_zmalloc(NULL,<br />+            total_num * p_rb_cfg->key_size, 0);<br />+        if (p_rb_cfg->p_keybase == NULL) {<br />+            PMD_DRV_LOG(ERR, "malloc memory failed");<br />+            return ZXDH_PAR_CHK_POINT_NULL;<br />+        }<br />+<br />+        malloc_size = ((sizeof(ZXDH_RB_TN) & 0xFFFFFFFFU) * total_num) & UINT32_MAX;<br />+<br />+        p_rb_cfg->p_tnbase  = rte_zmalloc(NULL, malloc_size, 0);<br />+        if (p_rb_cfg->p_tnbase == NULL) {<br />+            PMD_DRV_LOG(ERR, "malloc memory failed");<br />+            return ZXDH_PAR_CHK_POINT_NULL;<br />+        }<br />+    } else {<br />+        p_rb_cfg->is_dynamic = 1;<br />+<br />+        rtn = zxdh_comm_double_link_init(0xFFFFFFFF, &p_rb_cfg->tn_list);<br />+        ZXDH_COMM_CHECK_RC(rtn, "zxdh_comm_double_link_init");<br />+    }<br />+    p_rb_cfg->is_init = 1;<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br />+static uint32_t<br />+zxdh_comm_rb_insert(ZXDH_RB_CFG *p_rb_cfg,<br />+                         void       *p_key,<br />+                         void       *out_val)<br />+{<br />+    uint32_t     rtn            = 0;<br />+    uint32_t     stack_top      = 1;<br />+    int32_t         cmprtn         = 0;<br />+    uint32_t     lsm_out        = 0;<br />+<br />+    ZXDH_RB_TN  **stack_tn[ZXDH_RBT_MAX_DEPTH] = {0};<br />+    ZXDH_RB_TN  *p_cur_tn      = NULL;<br />+    ZXDH_RB_TN  *p_pre_tn      = NULL;<br />+    ZXDH_RB_TN **pp_cur_tn     = NULL;<br />+    void       *p_cur_key     = NULL;<br />+    ZXDH_RB_TN  *p_ins_tn      = p_key;<br />+<br />+    p_cur_key = p_rb_cfg->is_dynamic ? ((ZXDH_RB_TN *)p_key)->p_key : p_key;<br />+<br />+    pp_cur_tn = &p_rb_cfg->p_root;<br />+<br />+    for (;;) {<br />+        p_cur_tn = *pp_cur_tn;<br />+<br />+        if (!p_cur_tn) {<br />+            if (p_rb_cfg->is_dynamic == 0) {<br />+                rtn = zxdh_np_comm_liststack_alloc(p_rb_cfg->p_lsm, &lsm_out);<br />+<br />+                if (rtn == ZXDH_LIST_STACK_ISEMPTY_ERR)<br />+                    return ZXDH_RBT_RC_FULL;<br />+<br />+                ZXDH_COMM_CHECK_RC(rtn, "zxdh_np_comm_liststack_alloc");<br />+<br />+                p_ins_tn = p_rb_cfg->p_tnbase + lsm_out;<br />+<br />+                zxdh_np_init_rbt_tn(p_ins_tn, p_rb_cfg->key_size * lsm_out +<br />+                    p_rb_cfg->p_keybase);<br />+<br />+                memcpy(p_ins_tn->p_key, p_key, p_rb_cfg->key_size);<br />+<br />+                zxdh_np_set_tn_lsv(p_ins_tn, lsm_out);<br />+<br />+                if (out_val)<br />+                    *((uint32_t *)out_val) = lsm_out;<br />+            } else {<br />+                zxdh_np_init_d_node(&p_ins_tn->tn_ln, p_ins_tn);<br />+            }<br />+<br />+            zxdh_np_set_tn_color(p_ins_tn, ZXDH_RBT_RED);<br />+<br />+            if (cmprtn < 0) {<br />+                rtn = zxdh_comm_double_link_insert_pre(&p_ins_tn->tn_ln,<br />+                    &p_pre_tn->tn_ln, &p_rb_cfg->tn_list);<br />+                ZXDH_COMM_CHECK_RC(rtn, "zxdh_comm_double_link_insert_pre");<br />+            } else if (cmprtn > 0) {<br />+                rtn = zxdh_comm_double_link_insert_aft(&p_ins_tn->tn_ln,<br />+                    &p_pre_tn->tn_ln, &p_rb_cfg->tn_list);<br />+                ZXDH_COMM_CHECK_RC(rtn, "zxdh_comm_double_link_insert_aft");<br />+            } else {<br />+                RTE_ASSERT(!p_pre_tn);<br />+<br />+                rtn = zxdh_comm_double_link_insert_1st(&p_ins_tn->tn_ln,<br />+                    &p_rb_cfg->tn_list);<br />+                ZXDH_COMM_CHECK_RC(rtn, "zxdh_comm_double_link_insert_1st");<br />+            }<br />+<br />+            break;<br />+        }<br />+<br />+        stack_tn[stack_top++] =  pp_cur_tn;<br />+        p_pre_tn = p_cur_tn;<br />+        cmprtn = p_rb_cfg->p_cmpfun(p_cur_key, p_cur_tn->p_key, p_rb_cfg->key_size);<br />+<br />+        if (cmprtn > 0) {<br />+            pp_cur_tn = &p_cur_tn->p_right;<br />+        } else if (cmprtn < 0) {<br />+            pp_cur_tn = &p_cur_tn->p_left;<br />+        } else {<br />+            PMD_DRV_LOG(ERR, "rb_key is same");<br />+<br />+            if (p_rb_cfg->is_dynamic) {<br />+                if (out_val)<br />+                    *((ZXDH_RB_TN **)out_val) = p_cur_tn;<br />+            } else {<br />+                if (out_val)<br />+                    *((uint32_t *)out_val) = zxdh_np_get_tn_lsv(p_cur_tn);<br />+            }<br />+<br />+            return ZXDH_RBT_RC_UPDATE;<br />+        }<br />+    }<br />+<br />+    p_ins_tn->p_parent = (stack_top > 1) ? *stack_tn[stack_top - 1] : NULL;<br />+    stack_tn[stack_top] = pp_cur_tn;<br />+<br />+    *pp_cur_tn = p_ins_tn;<br />+<br />+    rtn = zxdh_comm_rb_handle_ins(p_rb_cfg, stack_tn, stack_top);<br />+    ZXDH_COMM_CHECK_RC(rtn, "zxdh_comm_rb_handle_ins");<br />+<br />+    if (p_rb_cfg->is_dynamic) {<br />+        if (out_val)<br />+            *((ZXDH_RB_TN **)out_val) = p_ins_tn;<br />+    }<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br />+static uint32_t<br />+zxdh_comm_rb_handle_del(__rte_unused ZXDH_RB_CFG *p_rb_cfg,<br />+                            ZXDH_RB_TN ***stack_tn,<br />+                            uint32_t   stack_top)<br />+{<br />+    ZXDH_RB_TN  **pp_cur_tn        = NULL;<br />+    ZXDH_RB_TN  *p_cur_tn          = NULL;<br />+    ZXDH_RB_TN  *p_tmp_tn          = NULL;<br />+    ZXDH_RB_TN  *p_unc_tn          = NULL;<br />+    ZXDH_RB_TN  *p_par_tn          = NULL;<br />+<br />+    while (stack_top > 1) {<br />+        pp_cur_tn =  stack_tn[stack_top];<br />+        p_cur_tn  = *pp_cur_tn;<br />+<br />+        p_par_tn  = *stack_tn[stack_top - 1];<br />+<br />+        if (p_cur_tn && p_cur_tn->p_parent) {<br />+            p_unc_tn  = zxdh_comm_rb_get_brotn(p_cur_tn);<br />+        } else if (p_cur_tn && !p_cur_tn->p_parent) {<br />+            RTE_ASSERT(p_par_tn == p_cur_tn->p_parent);<br />+<br />+            zxdh_np_set_tn_color(p_cur_tn, ZXDH_RBT_BLACK);<br />+<br />+            break;<br />+        }<br />+        if (!p_cur_tn) {<br />+            RTE_ASSERT(!p_cur_tn);<br />+<br />+            if (p_par_tn)<br />+                p_unc_tn = p_par_tn->p_left ? p_par_tn->p_left : p_par_tn->p_right;<br />+            else<br />+                break;<br />+        }<br />+<br />+        if (p_unc_tn)<br />+            RTE_ASSERT(p_unc_tn->p_parent == p_par_tn);<br />+<br />+        if (!p_unc_tn) {<br />+            RTE_ASSERT(0);<br />+            RTE_ASSERT(zxdh_np_get_tn_color(p_par_tn) ==  ZXDH_RBT_RED);<br />+<br />+            zxdh_np_set_tn_color(p_par_tn, ZXDH_RBT_BLACK);<br />+<br />+            break;<br />+        }<br />+        if (zxdh_np_get_tn_color(p_unc_tn) == ZXDH_RBT_RED) {<br />+            if (p_unc_tn == p_par_tn->p_left) {<br />+                *stack_tn[stack_top - 1] = p_unc_tn;<br />+                p_unc_tn->p_parent = p_par_tn->p_parent;<br />+                p_par_tn->p_left = p_unc_tn->p_right;<br />+<br />+                if (p_unc_tn->p_right)<br />+                    p_unc_tn->p_right->p_parent = p_par_tn;<br />+<br />+                p_par_tn->p_parent = p_unc_tn;<br />+                p_unc_tn->p_right = p_par_tn;<br />+<br />+                stack_tn[stack_top++] = &p_unc_tn->p_right;<br />+                stack_tn[stack_top]   = &p_par_tn->p_right;<br />+            } else {<br />+                RTE_ASSERT(p_unc_tn == p_par_tn->p_right);<br />+                *stack_tn[stack_top - 1] = p_unc_tn;<br />+                p_unc_tn->p_parent = p_par_tn->p_parent;<br />+                p_par_tn->p_right = p_unc_tn->p_left;<br />+<br />+                if (p_unc_tn->p_left)<br />+                    p_unc_tn->p_left->p_parent = p_par_tn;<br />+<br />+                p_par_tn->p_parent = p_unc_tn;<br />+                p_unc_tn->p_left  = p_par_tn;<br />+<br />+                stack_tn[stack_top++] = &p_unc_tn->p_left;<br />+                stack_tn[stack_top]   = &p_par_tn->p_left;<br />+            }<br />+<br />+            zxdh_comm_rb_switch_color(p_unc_tn, p_par_tn);<br />+        } else {<br />+            if (zxdh_np_get_tn_color(p_unc_tn->p_left) == ZXDH_RBT_BLACK && <br />+            zxdh_np_get_tn_color(p_unc_tn->p_right) == ZXDH_RBT_BLACK) {<br />+                if (zxdh_np_get_tn_color(p_unc_tn->p_parent) == ZXDH_RBT_BLACK) {<br />+                    zxdh_np_set_tn_color(p_unc_tn, ZXDH_RBT_RED);<br />+                    stack_top--;<br />+                } else {<br />+                    RTE_ASSERT(zxdh_np_get_tn_color(p_unc_tn->p_parent)<br />+                        == ZXDH_RBT_RED);<br />+<br />+                    zxdh_comm_rb_switch_color(p_unc_tn->p_parent, p_unc_tn);<br />+<br />+                    break;<br />+                }<br />+            } else if (p_unc_tn == p_par_tn->p_right) {<br />+                if (zxdh_np_get_tn_color(p_unc_tn->p_right) == ZXDH_RBT_RED) {<br />+                    *stack_tn[stack_top - 1] = p_unc_tn;<br />+                    p_unc_tn->p_parent = p_par_tn->p_parent;<br />+                    p_par_tn->p_right = p_unc_tn->p_left;<br />+<br />+                    if (p_unc_tn->p_left)<br />+                        p_unc_tn->p_left->p_parent = p_par_tn;<br />+<br />+                    p_par_tn->p_parent = p_unc_tn;<br />+                    p_unc_tn->p_left  = p_par_tn;<br />+<br />+                    zxdh_comm_rb_switch_color(p_unc_tn, p_par_tn);<br />+<br />+                    zxdh_np_set_tn_color(p_unc_tn->p_right, ZXDH_RBT_BLACK);<br />+<br />+                    break;<br />+                }<br />+                RTE_ASSERT(zxdh_np_get_tn_color(p_unc_tn->p_left)<br />+                    == ZXDH_RBT_RED);<br />+<br />+                p_tmp_tn = p_unc_tn->p_left;<br />+<br />+                p_par_tn->p_right  = p_tmp_tn;<br />+                p_tmp_tn->p_parent = p_par_tn;<br />+                p_unc_tn->p_left  = p_tmp_tn->p_right;<br />+<br />+                if (p_tmp_tn->p_right)<br />+                    p_tmp_tn->p_right->p_parent = p_unc_tn;<br />+<br />+                p_tmp_tn->p_right = p_unc_tn;<br />+                p_unc_tn->p_parent = p_tmp_tn;<br />+<br />+                zxdh_comm_rb_switch_color(p_tmp_tn, p_unc_tn);<br />+            } else {<br />+                RTE_ASSERT(p_unc_tn == p_par_tn->p_left);<br />+<br />+                if (zxdh_np_get_tn_color(p_unc_tn->p_left) == ZXDH_RBT_RED) {<br />+                    *stack_tn[stack_top - 1] = p_unc_tn;<br />+                    p_unc_tn->p_parent = p_par_tn->p_parent;<br />+                    p_par_tn->p_left  = p_unc_tn->p_right;<br />+<br />+                    if (p_unc_tn->p_right)<br />+                        p_unc_tn->p_right->p_parent = p_par_tn;<br />+<br />+                    p_par_tn->p_parent = p_unc_tn;<br />+                    p_unc_tn->p_right = p_par_tn;<br />+<br />+                    zxdh_comm_rb_switch_color(p_unc_tn, p_par_tn);<br />+<br />+                    zxdh_np_set_tn_color(p_unc_tn->p_left, ZXDH_RBT_BLACK);<br />+                    break;<br />+                }<br />+                RTE_ASSERT(zxdh_np_get_tn_color(p_unc_tn->p_right)<br />+                    == ZXDH_RBT_RED);<br />+<br />+                p_tmp_tn = p_unc_tn->p_right;<br />+<br />+                p_par_tn->p_left  = p_tmp_tn;<br />+                p_tmp_tn->p_parent = p_par_tn;<br />+                p_unc_tn->p_right  = p_tmp_tn->p_left;<br />+<br />+                if (p_tmp_tn->p_left)<br />+                    p_tmp_tn->p_left->p_parent = p_unc_tn;<br />+<br />+                p_tmp_tn->p_left = p_unc_tn;<br />+                p_unc_tn->p_parent = p_tmp_tn;<br />+<br />+                zxdh_comm_rb_switch_color(p_tmp_tn, p_unc_tn);<br />+            }<br />+        }<br />+    }<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br />+static uint32_t<br />+zxdh_comm_rb_delete(ZXDH_RB_CFG *p_rb_cfg,<br />+                         void       *p_key,<br />+                         void       *out_val)<br />+{<br />+    uint32_t     rtn            = 0;<br />+    uint32_t     stack_top      = 1;<br />+    int32_t    cmprtn         = 0;<br />+    uint32_t     rsv_stack      = 0;<br />+    uint32_t     del_is_red     = 0;<br />+    ZXDH_RB_TN  **stack_tn[ZXDH_RBT_MAX_DEPTH] = {0};<br />+    ZXDH_RB_TN  *p_cur_tn      = NULL;<br />+    ZXDH_RB_TN **pp_cur_tn     = NULL;<br />+    void       *p_cur_key     = NULL;<br />+    ZXDH_RB_TN  *p_rsv_tn      = NULL;<br />+    ZXDH_RB_TN  *p_del_tn      = NULL;<br />+<br />+    p_cur_key = p_key;<br />+<br />+    pp_cur_tn = &p_rb_cfg->p_root;<br />+<br />+    for (;;) {<br />+        p_cur_tn = *pp_cur_tn;<br />+<br />+        if (!p_cur_tn)<br />+            return ZXDH_RBT_RC_SRHFAIL;<br />+<br />+        stack_tn[stack_top++] = pp_cur_tn;<br />+<br />+        cmprtn = p_rb_cfg->p_cmpfun(p_cur_key, p_cur_tn->p_key, p_rb_cfg->key_size);<br />+<br />+        if (cmprtn > 0) {<br />+            pp_cur_tn = &p_cur_tn->p_right;<br />+        } else if (cmprtn < 0) {<br />+            pp_cur_tn = &p_cur_tn->p_left;<br />+        } else {<br />+            PMD_DRV_LOG(DEBUG, " find the key!");<br />+<br />+            break;<br />+        }<br />+    }<br />+<br />+    rsv_stack =  stack_top - 1;<br />+    p_rsv_tn  =  p_cur_tn;<br />+<br />+    pp_cur_tn = &p_cur_tn->p_right;<br />+    p_cur_tn  = *pp_cur_tn;<br />+<br />+    if (p_cur_tn) {<br />+        stack_tn[stack_top++] = pp_cur_tn;<br />+<br />+        pp_cur_tn = &p_cur_tn->p_left;<br />+        p_cur_tn  = *pp_cur_tn;<br />+<br />+        while (p_cur_tn) {<br />+            stack_tn[stack_top++] = pp_cur_tn;<br />+            pp_cur_tn = &p_cur_tn->p_left;<br />+            p_cur_tn  = *pp_cur_tn;<br />+        }<br />+<br />+        p_del_tn = *stack_tn[stack_top - 1];<br />+<br />+        *stack_tn[stack_top - 1] = p_del_tn->p_right;<br />+<br />+        if (p_del_tn->p_right)<br />+            p_del_tn->p_right->p_parent =  p_del_tn->p_parent;<br />+<br />+        if (zxdh_np_get_tn_color(p_del_tn) == ZXDH_RBT_RED)<br />+            del_is_red = 1;<br />+<br />+        *stack_tn[rsv_stack]   = p_del_tn;<br />+<br />+        stack_tn[rsv_stack + 1]  = &p_del_tn->p_right;<br />+<br />+        zxdh_np_set_tn_color(p_del_tn, zxdh_np_get_tn_color(p_rsv_tn));<br />+        p_del_tn->p_parent = p_rsv_tn->p_parent;<br />+<br />+        p_del_tn->p_left   = p_rsv_tn->p_left;<br />+<br />+        if (p_rsv_tn->p_left)<br />+            p_rsv_tn->p_left->p_parent = p_del_tn;<br />+<br />+        p_del_tn->p_right  = p_rsv_tn->p_right;<br />+<br />+        if (p_rsv_tn->p_right)<br />+            p_rsv_tn->p_right->p_parent = p_del_tn;<br />+    } else {<br />+        if (zxdh_np_get_tn_color(p_rsv_tn) == ZXDH_RBT_RED)<br />+            del_is_red = 1;<br />+<br />+        *stack_tn[stack_top - 1] = p_rsv_tn->p_left;<br />+<br />+        if (p_rsv_tn->p_left)<br />+            p_rsv_tn->p_left->p_parent = p_rsv_tn->p_parent;<br />+    }<br />+<br />+    stack_top--;<br />+    if (zxdh_np_get_tn_color(*stack_tn[stack_top]) == ZXDH_RBT_RED) {<br />+        zxdh_np_set_tn_color(*stack_tn[stack_top], ZXDH_RBT_BLACK);<br />+    } else if (!del_is_red) {<br />+        rtn = zxdh_comm_rb_handle_del(p_rb_cfg, stack_tn, stack_top);<br />+        ZXDH_COMM_CHECK_RC(rtn, "zxdh_comm_rb_handle_del");<br />+    }<br />+<br />+    rtn = zxdh_comm_double_link_del(&p_rsv_tn->tn_ln, &p_rb_cfg->tn_list);<br />+    ZXDH_COMM_CHECK_RC(rtn, "zxdh_comm_double_link_del");<br />+<br />+    if (p_rb_cfg->is_dynamic) {<br />+        *(ZXDH_RB_TN **)out_val = p_rsv_tn;<br />+    } else {<br />+        rtn = zxdh_comm_liststack_free(p_rb_cfg->p_lsm, zxdh_np_get_tn_lsv(p_rsv_tn));<br />+        ZXDH_COMM_CHECK_RC(rtn, "zxdh_comm_liststack_free");<br />+<br />+        *(uint32_t *)out_val = zxdh_np_get_tn_lsv(p_rsv_tn);<br />+<br />+        memset(p_rsv_tn->p_key, 0, p_rb_cfg->key_size);<br />+        memset(p_rsv_tn, 0, sizeof(ZXDH_RB_TN));<br />+    }<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br />+static uint32_t<br />+zxdh_comm_liststack_destroy(ZXDH_LISTSTACK_MANAGER *p_list)<br />+{<br />+    if (p_list == NULL) {<br />+        PMD_DRV_LOG(ERR, "p_list point null");<br />+        return ZXDH_LIST_STACK_POINT_NULL;<br />+    }<br />+    rte_free(p_list);<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br />+static uint32_t<br />+zxdh_comm_rb_destroy(ZXDH_RB_CFG *p_rb_cfg)<br />+{<br />+    uint32_t rtn = 0;<br />+<br />+    if (p_rb_cfg->is_dynamic == 0)<br />+        zxdh_comm_liststack_destroy(p_rb_cfg->p_lsm);<br />+<br />+    if (p_rb_cfg->p_keybase != NULL) {<br />+        rte_free(p_rb_cfg->p_keybase);<br />+        p_rb_cfg->p_keybase = NULL;<br />+    }<br />+<br />+    if (p_rb_cfg->p_tnbase != NULL) {<br />+        rte_free(p_rb_cfg->p_tnbase);<br />+        p_rb_cfg->p_tnbase = NULL;<br />+    }<br />+<br />+    memset(p_rb_cfg, 0, sizeof(ZXDH_RB_CFG));<br />+<br />+    return rtn;<br />+}<br />+<br />+static int<br />+zxdh_np_se_apt_key_default_cmp(void *p_new_key,<br />+    void *p_old_key, __rte_unused uint32_t key_len)<br />+{<br />+    return memcmp((uint32_t *)p_new_key, (uint32_t *)p_old_key, sizeof(uint32_t));<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_se_apt_rb_insert(ZXDH_RB_CFG *rb_cfg, void *p_data, uint32_t len)<br />+{<br />+    uint8_t *p_rb_key         = NULL;<br />+    ZXDH_RB_TN *p_rb_new     = NULL;<br />+    ZXDH_RB_TN *p_rb_rtn     = NULL;<br />+    uint32_t rc                 = ZXDH_OK;<br />+<br />+    p_rb_key = rte_zmalloc(NULL, len, 0);<br />+    if (p_rb_key == NULL) {<br />+        PMD_DRV_LOG(ERR, "malloc memory failed");<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+    memcpy(p_rb_key, p_data, len);<br />+<br />+    p_rb_new = rte_zmalloc(NULL, sizeof(ZXDH_RB_TN), 0);<br />+    if (NULL == (p_rb_new)) {<br />+        rte_free(p_rb_key);<br />+        PMD_DRV_LOG(ERR, "malloc memory failed");<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+    zxdh_np_init_rbt_tn(p_rb_new, p_rb_key);<br />+<br />+    rc = zxdh_comm_rb_insert(rb_cfg, p_rb_new, &p_rb_rtn);<br />+    if (rc == ZXDH_RBT_RC_UPDATE) {<br />+        if (p_rb_rtn == NULL) {<br />+            PMD_DRV_LOG(ERR, "p_rb_rtn point null!");<br />+            return ZXDH_PAR_CHK_POINT_NULL;<br />+        }<br />+<br />+        memcpy(p_rb_rtn->p_key, p_data, len);<br />+        rte_free(p_rb_new);<br />+        rte_free(p_rb_key);<br />+        PMD_DRV_LOG(DEBUG, "update exist entry!");<br />+        return ZXDH_OK;<br />+    }<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_se_apt_rb_delete(ZXDH_RB_CFG *rb_cfg, void *p_data, __rte_unused uint32_t len)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    ZXDH_RB_TN *p_rb_rtn     = NULL;<br />+<br />+    rc = zxdh_comm_rb_delete(rb_cfg, p_data, &p_rb_rtn);<br />+    if (rc != ZXDH_OK)<br />+        return rc;<br />+    rte_free(p_rb_rtn->p_key);<br />+    rte_free(p_rb_rtn);<br />+<br />+    return rc;<br />+}<br />+<br /> static uint32_t<br /> zxdh_np_dev_init(void)<br /> {<br />@@ -1976,10 +2961,112 @@ zxdh_np_dtb_queue_id_free(uint32_t dev_id,<br />  <br />     rc = zxdh_np_dtb_queue_unused_item_num_get(dev_id, queue_id, &item_num);<br />  <br />+    if (item_num != ZXDH_DTB_QUEUE_ITEM_NUM_MAX)<br />+        return ZXDH_RC_DTB_QUEUE_IS_WORKING;<br />+<br />     p_dtb_mgr->queue_info[queue_id].init_flag = 0;<br />     p_dtb_mgr->queue_info[queue_id].vport = 0;<br />     p_dtb_mgr->queue_info[queue_id].vector = 0;<br />  <br />+    memset(&p_dtb_mgr->queue_info[queue_id].tab_up, 0, sizeof(ZXDH_DTB_TAB_UP_INFO_T));<br />+    memset(&p_dtb_mgr->queue_info[queue_id].tab_down, 0, sizeof(ZXDH_DTB_TAB_DOWN_INFO_T));<br />+<br />+    return rc;<br />+}<br />+<br />+static ZXDH_RB_CFG *<br />+zxdh_np_dtb_dump_addr_rb_get(uint32_t dev_id, uint32_t queue_id)<br />+{<br />+    return g_dtb_dump_addr_rb[dev_id][queue_id];<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_dump_addr_rb_set(uint32_t dev_id, uint32_t queue_id, ZXDH_RB_CFG *p_dump_addr_rb)<br />+{<br />+    g_dtb_dump_addr_rb[dev_id][queue_id] = p_dump_addr_rb;<br />+    return ZXDH_OK;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_dump_sdt_addr_clear(uint32_t dev_id,<br />+                                uint32_t queue_id,<br />+                                uint32_t sdt_no)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+<br />+    ZXDH_DTB_ADDR_INFO_T dtb_dump_addr_info = {0};<br />+    ZXDH_RB_CFG *p_dtb_dump_addr_rb = NULL;<br />+<br />+    dtb_dump_addr_info.sdt_no = sdt_no;<br />+<br />+    p_dtb_dump_addr_rb = zxdh_np_dtb_dump_addr_rb_get(dev_id, queue_id);<br />+    rc = zxdh_np_se_apt_rb_delete(p_dtb_dump_addr_rb, &dtb_dump_addr_info,<br />+        sizeof(ZXDH_DTB_ADDR_INFO_T));<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_se_apt_rb_delete");<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_dump_addr_rb_destroy(uint32_t dev_id, uint32_t queue_id)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    ZXDH_D_NODE *p_node = NULL;<br />+    ZXDH_RB_TN *p_rb_tn = NULL;<br />+    ZXDH_DTB_ADDR_INFO_T *p_rbkey = NULL;<br />+    ZXDH_D_HEAD *p_head_dtb_rb = NULL;<br />+    ZXDH_RB_CFG *p_dtb_dump_addr_rb = NULL;<br />+    uint32_t sdt_no = 0;<br />+<br />+    p_dtb_dump_addr_rb = zxdh_np_dtb_dump_addr_rb_get(dev_id, queue_id);<br />+    ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_dtb_dump_addr_rb);<br />+<br />+    p_head_dtb_rb = &p_dtb_dump_addr_rb->tn_list;<br />+<br />+    while (p_head_dtb_rb->used) {<br />+        p_node = p_head_dtb_rb->p_next;<br />+        p_rb_tn = (ZXDH_RB_TN *)p_node->data;<br />+        p_rbkey = (ZXDH_DTB_ADDR_INFO_T *)p_rb_tn->p_key;<br />+<br />+        sdt_no = p_rbkey->sdt_no;<br />+        rc = zxdh_np_dtb_dump_sdt_addr_clear(dev_id, queue_id, sdt_no);<br />+<br />+        if (rc == ZXDH_HASH_RC_DEL_SRHFAIL)<br />+            PMD_DRV_LOG(ERR, "dtb dump delete key is not exist," <br />+                "std:%u", sdt_no);<br />+        else<br />+            ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_dump_sdt_addr_clear");<br />+    }<br />+<br />+    rc  =  zxdh_comm_rb_destroy(p_dtb_dump_addr_rb);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_rb_init");<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_dump_addr_rb_init(uint32_t dev_id, uint32_t queue_id)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+<br />+    ZXDH_RB_CFG *p_dtb_dump_addr_rb = NULL;<br />+    p_dtb_dump_addr_rb = zxdh_np_dtb_dump_addr_rb_get(dev_id, queue_id);<br />+<br />+    if (p_dtb_dump_addr_rb == NULL) {<br />+        p_dtb_dump_addr_rb = rte_zmalloc(NULL, sizeof(ZXDH_RB_CFG), 0);<br />+        if (p_dtb_dump_addr_rb == NULL) {<br />+            PMD_DRV_LOG(ERR, "malloc memory failed");<br />+            return ZXDH_PAR_CHK_POINT_NULL;<br />+        }<br />+<br />+        rc = zxdh_np_dtb_dump_addr_rb_set(dev_id, queue_id, p_dtb_dump_addr_rb);<br />+        ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_dump_addr_rb_set");<br />+    }<br />+<br />+    rc = zxdh_comm_rb_init(p_dtb_dump_addr_rb, 0,<br />+        sizeof(ZXDH_DTB_ADDR_INFO_T), zxdh_np_se_apt_key_default_cmp);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_rb_init");<br />+<br />     return rc;<br /> }<br />  <br />@@ -2009,6 +3096,9 @@ zxdh_np_dtb_queue_request(uint32_t dev_id, char p_name[32],<br />  <br />     PMD_DRV_LOG(DEBUG, "dtb request queue is %u.", queue_id);<br />  <br />+    rc = zxdh_np_dtb_dump_addr_rb_init(dev_id, queue_id);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_dump_addr_rb_init");<br />+<br />     *p_queue_id = queue_id;<br />  <br />     PMD_DRV_LOG(INFO, "dev_id %u vport 0x%x name %s queue_id %u done.",<br />@@ -2047,6 +3137,9 @@ zxdh_np_dtb_queue_release(uint32_t devid,<br />  <br />     rte_spinlock_unlock(&p_dtb_spinlock->spinlock);<br />  <br />+    rc = zxdh_np_dtb_dump_addr_rb_destroy(devid, queueid);<br />+    ZXDH_COMM_CHECK_DEV_RC(devid, rc, "zxdh_np_dtb_dump_addr_rb_destroy");<br />+<br />     rc = zxdh_np_dtb_queue_id_free(devid, queueid);<br />     ZXDH_COMM_CHECK_DEV_RC(devid, rc, "zxdh_np_dtb_queue_id_free");<br />  <br />@@ -3494,12 +4587,43 @@ zxdh_np_dtb_user_info_set(uint32_t dev_id, uint32_t queue_id, uint16_t vport, ui<br />     return rc;<br /> }<br />  <br />+static uint32_t<br />+zxdh_np_dtb_dump_sdt_addr_set(uint32_t dev_id,<br />+                            uint32_t queue_id,<br />+                            uint32_t sdt_no,<br />+                            uint64_t phy_addr,<br />+                            uint64_t vir_addr,<br />+                            uint32_t size)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+<br />+    ZXDH_DTB_ADDR_INFO_T dtb_dump_addr_info = {<br />+        .sdt_no = sdt_no,<br />+        .phy_addr = phy_addr,<br />+        .vir_addr = vir_addr,<br />+        .size = size,<br />+    };<br />+    ZXDH_RB_CFG *p_dtb_dump_addr_rb = NULL;<br />+<br />+    p_dtb_dump_addr_rb = zxdh_np_dtb_dump_addr_rb_get(dev_id, queue_id);<br />+    ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_dtb_dump_addr_rb);<br />+<br />+    rc = zxdh_np_se_apt_rb_insert(p_dtb_dump_addr_rb,<br />+        &dtb_dump_addr_info, sizeof(ZXDH_DTB_ADDR_INFO_T));<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_se_apt_rb_insert");<br />+<br />+    return rc;<br />+}<br />+<br /> static uint32_t<br /> zxdh_np_apt_dtb_res_init(uint32_t dev_id, ZXDH_DEV_INIT_CTRL_T *p_dev_init_ctrl)<br /> {<br />     uint32_t rc = ZXDH_OK;<br />  <br />     uint32_t queue_id = 0;<br />+    uint32_t index = 0;<br />+    uint32_t dump_sdt_num = 0;<br />+    ZXDH_DTB_ADDR_INFO_T *p_dump_info = NULL;<br />  <br />     rc = zxdh_np_dtb_queue_request(dev_id, p_dev_init_ctrl->port_name,<br />         p_dev_init_ctrl->vport, &queue_id);<br />@@ -3517,6 +4641,19 @@ zxdh_np_apt_dtb_res_init(uint32_t dev_id, ZXDH_DEV_INIT_CTRL_T *p_dev_init_ctrl)<br />     zxdh_np_dtb_dump_channel_addr_set(dev_id, queue_id,<br />         p_dev_init_ctrl->dump_phy_addr, p_dev_init_ctrl->dump_vir_addr, 0);<br />  <br />+    dump_sdt_num = p_dev_init_ctrl->dump_sdt_num;<br />+    for (index = 0; index < dump_sdt_num; index++) {<br />+        p_dump_info = p_dev_init_ctrl->dump_addr_info + index;<br />+        ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_dump_info);<br />+        rc = zxdh_np_dtb_dump_sdt_addr_set(dev_id,<br />+                            queue_id,<br />+                            p_dump_info->sdt_no,<br />+                            p_dump_info->phy_addr,<br />+                            p_dump_info->vir_addr,<br />+                            p_dump_info->size);<br />+        ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_dump_sdt_addr_set");<br />+    }<br />+<br />     return ZXDH_OK;<br /> }<br />  <br />diff --git a/drivers/net/zxdh/zxdh_np.h b/drivers/net/zxdh/zxdh_np.h<br />index 6cf8653670..36b7628bb7 100644<br />--- a/drivers/net/zxdh/zxdh_np.h<br />+++ b/drivers/net/zxdh/zxdh_np.h<br />@@ -123,6 +123,13 @@<br /> #define ZXDH_VFUNC_NUM(VPORT)                   (((VPORT) & 0x00FF))<br /> #define ZXDH_IS_PF(VPORT)                       (!ZXDH_VF_ACTIVE(VPORT))<br />  <br />+#define ZXDH_RBT_RED                            (0x1)<br />+#define ZXDH_RBT_BLACK                          (0x2)<br />+#define ZXDH_RBT_MAX_DEPTH                      (128)<br />+<br />+#define ZXDH_LISTSTACK_INVALID_INDEX            (0)<br />+#define ZXDH_LISTSTACK_MAX_ELEMENT                (0x0ffffffe)<br />+<br /> #define ZXDH_SDT_CFG_LEN                        (2)<br /> #define ZXDH_SDT_VALID                          (1)<br /> #define ZXDH_SDT_INVALID                        (0)<br />@@ -192,6 +199,26 @@<br /> #define ZXDH_SPIN_LOCK_ULOCK_FAIL               (ZXDH_SPIN_LOCK_BASE     | 0X003)<br /> #define ZXDH_SPIN_LOCK_DESTROY_FAIL             (ZXDH_SPIN_LOCK_BASE     | 0X004)<br />  <br />+#define ZXDH_DOUBLE_LINK_BASE                   (ZXDH_RC_BASE            | 0x500)<br />+#define ZXDH_DOUBLE_LINK_ELEMENT_NUM_ERR        (ZXDH_DOUBLE_LINK_BASE   | 0x001)<br />+#define ZXDH_DOUBLE_LINK_MALLOC_FAIL            (ZXDH_DOUBLE_LINK_BASE   | 0x002)<br />+#define ZXDH_DOUBLE_LINK_POINT_NULL             (ZXDH_DOUBLE_LINK_BASE   | 0x003)<br />+#define ZXDH_DOUBLE_LINK_CHK_SUM_ERR            (ZXDH_DOUBLE_LINK_BASE   | 0x004)<br />+#define ZXDH_DOUBLE_LINK_NO_EXIST_FREENODE      (ZXDH_DOUBLE_LINK_BASE   | 0x005)<br />+#define ZXDH_DOUBLE_LINK_FREE_INDX_INVALID      (ZXDH_DOUBLE_LINK_BASE   | 0x006)<br />+#define ZXDH_DOUBLE_LINK_NO_EXIST_PRENODE       (ZXDH_DOUBLE_LINK_BASE   | 0x007)<br />+#define ZXDH_DOUBLE_LINK_INPUT_INDX_INVALID     (ZXDH_DOUBLE_LINK_BASE   | 0x008)<br />+#define ZXDH_DOUBLE_LINK_INIT_ELEMENT_NUM_ERR   (ZXDH_DOUBLE_LINK_BASE   | 0x009)<br />+<br />+#define ZXDH_LIST_STACK_BASE                    (ZXDH_RC_BASE            | 0x800)<br />+#define ZXDH_LIST_STACK_ELEMENT_NUM_ERR         (ZXDH_LIST_STACK_BASE    | 0x001)<br />+#define ZXDH_LIST_STACK_POINT_NULL              (ZXDH_LIST_STACK_BASE    | 0x002)<br />+#define ZXDH_LIST_STACK_ALLOC_MEMORY_FAIL       (ZXDH_LIST_STACK_BASE    | 0x003)<br />+#define ZXDH_LIST_STACK_ISEMPTY_ERR             (ZXDH_LIST_STACK_BASE    | 0x004)<br />+#define ZXDH_LIST_STACK_FREE_INDEX_INVALID      (ZXDH_LIST_STACK_BASE    | 0x005)<br />+#define ZXDH_LIST_STACK_ALLOC_INDEX_INVALID     (ZXDH_LIST_STACK_BASE    | 0x006)<br />+#define ZXDH_LIST_STACK_ALLOC_INDEX_USED        (ZXDH_LIST_STACK_BASE    | 0x007)<br />+<br /> #define ZXDH_ERAM128_BADDR_MASK                 (0x3FFFF80)<br />  <br /> #define ZXDH_DTB_TABLE_MODE_ERAM                (0)<br />@@ -236,6 +263,34 @@<br /> #define ZXDH_RC_CTRLCH_MSG_OPER_NOT_SUPPORT     (ZXDH_RC_CTRLCH_BASE | 0x3)<br /> #define ZXDH_RC_CTRLCH_MSG_DROP                 (ZXDH_RC_CTRLCH_BASE | 0x4)<br />  <br />+#define ZXDH_RBT_RC_BASE                        (0x1000)<br />+#define ZXDH_RBT_RC_UPDATE                      (ZXDH_RBT_RC_BASE | 0x1)<br />+#define ZXDH_RBT_RC_SRHFAIL                     (ZXDH_RBT_RC_BASE | 0x2)<br />+#define ZXDH_RBT_RC_FULL                        (ZXDH_RBT_RC_BASE | 0x3)<br />+#define ZXDH_RBT_ISEMPTY_ERR                    (ZXDH_RBT_RC_BASE | 0x4)<br />+#define ZXDH_RBT_PARA_INVALID                   (ZXDH_RBT_RC_BASE | 0x5)<br />+<br />+#define ZXDH_SE_RC_BASE                         (0x50000)<br />+#define ZXDH_SE_RC_HASH_BASE                    (ZXDH_SE_RC_BASE | 0x4000)<br />+#define ZXDH_HASH_RC_INVALID_FUNCINFO           (ZXDH_SE_RC_HASH_BASE | 0x1)<br />+#define ZXDH_HASH_RC_INVALID_ZBLCK              (ZXDH_SE_RC_HASH_BASE | 0x2)<br />+#define ZXDH_HASH_RC_INVALID_ZCELL              (ZXDH_SE_RC_HASH_BASE | 0x3)<br />+#define ZXDH_HASH_RC_INVALID_KEY                (ZXDH_SE_RC_HASH_BASE | 0x4)<br />+#define ZXDH_HASH_RC_INVALID_TBL_ID_INFO        (ZXDH_SE_RC_HASH_BASE | 0x5)<br />+#define ZXDH_HASH_RC_RB_TREE_FULL               (ZXDH_SE_RC_HASH_BASE | 0x6)<br />+#define ZXDH_HASH_RC_INVALID_KEY_TYPE           (ZXDH_SE_RC_HASH_BASE | 0x7)<br />+#define ZXDH_HASH_RC_ADD_UPDATE                 (ZXDH_SE_RC_HASH_BASE | 0x8)<br />+#define ZXDH_HASH_RC_DEL_SRHFAIL                (ZXDH_SE_RC_HASH_BASE | 0x9)<br />+#define ZXDH_HASH_RC_ITEM_FULL                  (ZXDH_SE_RC_HASH_BASE | 0xa)<br />+#define ZXDH_HASH_RC_INVALID_DDR_WIDTH_MODE     (ZXDH_SE_RC_HASH_BASE | 0xb)<br />+#define ZXDH_HASH_RC_INVALID_PARA               (ZXDH_SE_RC_HASH_BASE | 0xc)<br />+#define ZXDH_HASH_RC_TBL_FULL                   (ZXDH_SE_RC_HASH_BASE | 0xd)<br />+#define ZXDH_HASH_RC_SRH_FAIL                   (ZXDH_SE_RC_HASH_BASE | 0xe)<br />+#define ZXDH_HASH_RC_MATCH_ITEM_FAIL            (ZXDH_SE_RC_HASH_BASE | 0xf)<br />+#define ZXDH_HASH_RC_DDR_WIDTH_MODE_ERR         (ZXDH_SE_RC_HASH_BASE | 0x10)<br />+#define ZXDH_HASH_RC_INVALID_ITEM_TYPE          (ZXDH_SE_RC_HASH_BASE | 0x11)<br />+#define ZXDH_HASH_RC_REPEAT_INIT                (ZXDH_SE_RC_HASH_BASE | 0x12)<br />+<br /> #define ZXDH_SCHE_RSP_LEN                       (2)<br /> #define ZXDH_G_PROFILE_ID_LEN                   (8)<br />  <br />@@ -372,6 +427,42 @@ typedef struct zxdh_d_head {<br />     ZXDH_D_NODE *p_prev;<br /> } ZXDH_D_HEAD;<br />  <br />+typedef struct zxdh_s_freelink {<br />+    uint32_t index;<br />+    uint32_t next;<br />+} ZXDH_COMM_FREELINK;<br />+<br />+typedef struct zxdh_s_list_stack_manager {<br />+    ZXDH_COMM_FREELINK  *p_array;<br />+    uint32_t capacity;<br />+    uint32_t p_head;<br />+    uint32_t free_num;<br />+    uint32_t used_num;<br />+} ZXDH_LISTSTACK_MANAGER;<br />+<br />+typedef struct zxdh_rb_tn {<br />+    void        *p_key;<br />+    uint32_t    color_lsv;<br />+    struct    zxdh_rb_tn   *p_left;<br />+    struct    zxdh_rb_tn   *p_right;<br />+    struct    zxdh_rb_tn   *p_parent;<br />+    ZXDH_D_NODE    tn_ln;<br />+} ZXDH_RB_TN;<br />+<br />+typedef int32_t  (*ZXDH_RB_CMPFUN)(void *p_new, void *p_old, uint32_t keysize);<br />+<br />+typedef struct _rb_cfg {<br />+    uint32_t                key_size;<br />+    uint32_t                is_dynamic;<br />+    ZXDH_RB_TN                *p_root;<br />+    ZXDH_D_HEAD                tn_list;<br />+    ZXDH_RB_CMPFUN            p_cmpfun;<br />+    ZXDH_LISTSTACK_MANAGER    *p_lsm;<br />+    uint8_t                    *p_keybase;<br />+    ZXDH_RB_TN                *p_tnbase;<br />+    uint32_t                is_init;<br />+} ZXDH_RB_CFG;<br />+<br /> typedef struct zxdh_dtb_tab_up_user_addr_t {<br />     uint32_t user_flag;<br />     uint64_t phy_addr;<br />--  <br />2.27.0<br />