From: ftillier Date: Wed, 6 Jul 2005 19:06:21 +0000 (+0000) Subject: - Fix bug in resize CQ where UVP private buffer size was advertised as larger X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=46948e03784702260aacbbb5314c3a4f7f2722a8;p=~shefty%2Frdma-win.git - Fix bug in resize CQ where UVP private buffer size was advertised as larger than allocated, causing errors when buffering in the kernel proxy. - Kill dead code. git-svn-id: svn://openib.tc.cornell.edu/gen1@25 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- diff --git a/branches/fab_cm_branch/hw/mt23108/kernel/hca_data.c b/branches/fab_cm_branch/hw/mt23108/kernel/hca_data.c index 46cbfe5c..f7228c92 100644 --- a/branches/fab_cm_branch/hw/mt23108/kernel/hca_data.c +++ b/branches/fab_cm_branch/hw/mt23108/kernel/hca_data.c @@ -1428,73 +1428,6 @@ mlnx_map_vapi_rna_type( } } -///////////////////////////////////////////////////////// -// Convert a Mellanox CQE into IBAL format -///////////////////////////////////////////////////////// -void -mlnx_conv_vapi_cqe( - IN VAPI_wc_desc_t *desc_p, - OUT ib_wc_t *wc_p ) -{ - wc_p->wr_id = desc_p->id; - - wc_p->status = mlnx_map_vapi_cqe_status(desc_p->status); - wc_p->wc_type = mlnx_map_vapi_cqe_type(desc_p->opcode); - - wc_p->length = (IB_COMP_SUCCESS == desc_p->status) ? desc_p->byte_len : 0; - wc_p->recv.conn.recv_opt = 0; // TBD: RC support, SE - - CL_TRACE(MLNX_DBG_DIRECT, g_mlnx_dbg_lvl, ("cqe type %d length 0x%x\n", wc_p->wc_type, wc_p->length)); - - // Immediate data - if (desc_p->imm_data_valid) - { - wc_p->recv.conn.recv_opt |= IB_RECV_OPT_IMMEDIATE; - wc_p->recv.conn.immediate_data = cl_ntoh32 (desc_p->imm_data); - } - // GRH - if (desc_p->grh_flag) - { - wc_p->recv.conn.recv_opt |= IB_RECV_OPT_GRH_VALID; - } - - switch(desc_p->remote_node_addr.type) - { - case VAPI_RNA_RD: - // TBD: RD Support - CL_TRACE(MLNX_DBG_DIRECT, g_mlnx_dbg_lvl, ("Unsupported RD\n")); - break; - - case VAPI_RNA_UD: - // CL_TRACE(MLNX_DBG_DIRECT, g_mlnx_dbg_lvl, ("Supported UD\n")); - wc_p->recv.ud.remote_qp = cl_ntoh32(desc_p->remote_node_addr.qp_ety.qp); - wc_p->recv.ud.pkey_index = (uint16_t)desc_p->pkey_ix; - wc_p->recv.ud.remote_lid = cl_ntoh16(desc_p->remote_node_addr.slid); - wc_p->recv.ud.remote_sl = desc_p->remote_node_addr.sl; - // wc_p->recv.ud.path_bits = desc_p->remote_node_addr.ee_dlid.dst_path_bits; // PATH: - wc_p->recv.ud.path_bits = 0; -#if 0 - printk ("********* MLNX *************\n"); - printk ("rem_qp = 0x%x pbits = 0x%x pkey_idx = 0x%x\n", - wc_p->recv.ud.remote_qp, wc_p->recv.ud.path_bits, - wc_p->recv.ud.pkey_index ); - printk ("GOT PBITS 0x%x\n", desc_p->remote_node_addr.ee_dlid.dst_path_bits); - printk ("*****************\n"); -#endif - - break; - - case VAPI_RNA_RAW_ETY: - // TBD: RAW ETH - break; - - case VAPI_RNA_RAW_IPV6: - // TBD: RAW IPV6 - default: - break; - } -} - ////////////////////////////////////////////////////////////// // Convert from VAPI memory-region attributes to IBAL ////////////////////////////////////////////////////////////// diff --git a/branches/fab_cm_branch/hw/mt23108/kernel/hca_data.h b/branches/fab_cm_branch/hw/mt23108/kernel/hca_data.h index 83cef33b..15193593 100644 --- a/branches/fab_cm_branch/hw/mt23108/kernel/hca_data.h +++ b/branches/fab_cm_branch/hw/mt23108/kernel/hca_data.h @@ -494,11 +494,6 @@ int mlnx_map_vapi_rna_type( IN VAPI_remote_node_addr_type_t rna); -void -mlnx_conv_vapi_cqe( - IN VAPI_wc_desc_t *desc_p, - OUT ib_wc_t *wc_p ); - void mlnx_conv_vapi_mr_attr( IN ib_pd_handle_t pd_h, diff --git a/branches/fab_cm_branch/hw/mt23108/kernel/hca_direct.c b/branches/fab_cm_branch/hw/mt23108/kernel/hca_direct.c index 7148c35a..7bbdc3b2 100644 --- a/branches/fab_cm_branch/hw/mt23108/kernel/hca_direct.c +++ b/branches/fab_cm_branch/hw/mt23108/kernel/hca_direct.c @@ -392,42 +392,8 @@ mlnx_poll_cq ( hhul_cq_hndl = hobul_p->cq_info_tbl[cq_idx].hhul_cq_hndl; -#if MLNX_POLL_NATIVE return THHUL_cqm_poll4wc(hobul_p->hhul_hndl, hhul_cq_hndl, pp_free_wclist, pp_done_wclist ); -#else - for (wc_p = *pp_free_wclist; wc_p; wc_p = wc_p->p_next) { - // Terminate the completed list (MUST be here) - *pp_done_wclist = NULL; - - ret = THHUL_cqm_poll4cqe(hobul_p->hhul_hndl, hhul_cq_hndl, &comp_desc); - // CQ_EMPTY is not an error - if (HH_CQ_EMPTY == ret) { - status = IB_NOT_FOUND; // This is a successful completion (no entries) - break; - } - // Handle real errors - if (HH_OK != ret) { - status = IB_ERROR; - goto cleanup; - } - - status = IB_SUCCESS; - - // Convert the CQE and add to list (no memset()) - mlnx_conv_vapi_cqe( &comp_desc, wc_p ); - *pp_done_wclist = wc_p; - pp_done_wclist = &wc_p->p_next; - CL_TRACE(MLNX_DBG_INFO, g_mlnx_dbg_lvl, ("status %d done_list 0x%p\n", comp_desc.status, *pp_done_wclist)); - } - - Update free list to point to the first unused qce - if (IB_NOT_FOUND == status && wc_p != *pp_free_wclist) - status = IB_SUCCESS; - *pp_free_wclist = wc_p; - - return status; -#endif cleanup: CL_TRACE(CL_DBG_ERROR, g_mlnx_dbg_lvl, ("completes with ERROR status %d\n", status)); diff --git a/branches/fab_cm_branch/hw/mt23108/kernel/hca_verbs.c b/branches/fab_cm_branch/hw/mt23108/kernel/hca_verbs.c index 4369a784..84ffb14a 100644 --- a/branches/fab_cm_branch/hw/mt23108/kernel/hca_verbs.c +++ b/branches/fab_cm_branch/hw/mt23108/kernel/hca_verbs.c @@ -2043,12 +2043,13 @@ mlnx_resize_cq ( if( p_umv_buf && p_umv_buf->command ) { // For user mode calls - obtain and verify the vendor information - if ((p_umv_buf->input_size - sizeof (u_int32_t)) != hobul_p->cq_ul_resources_sz || - NULL == p_umv_buf->p_inout_buf) { - status = IB_INVALID_PARAMETER; - goto cleanup_locked; - } - cq_ul_resources_p = (void *)p_umv_buf->p_inout_buf; + if( p_umv_buf->input_size != hobul_p->cq_ul_resources_sz || + NULL == p_umv_buf->p_inout_buf ) + { + status = IB_INVALID_PARAMETER; + goto cleanup_locked; + } + cq_ul_resources_p = (void *)p_umv_buf->p_inout_buf; } else { // for kernel mode calls - obtain the saved app resources. Use prep->call->done sequence @@ -2249,7 +2250,7 @@ setup_ci_interface( IN const ib_net64_t ca_guid, IN OUT ci_interface_t *p_interface ) { - cl_memclr(p_interface, sizeof(p_interface)); + cl_memclr(p_interface, sizeof(*p_interface)); /* Guid of the CA. */ p_interface->guid = ca_guid; diff --git a/branches/fab_cm_branch/hw/mt23108/user/mlnx_ual_cq.c b/branches/fab_cm_branch/hw/mt23108/user/mlnx_ual_cq.c index 282529e0..32473df4 100644 --- a/branches/fab_cm_branch/hw/mt23108/user/mlnx_ual_cq.c +++ b/branches/fab_cm_branch/hw/mt23108/user/mlnx_ual_cq.c @@ -357,7 +357,7 @@ mlnx_pre_resize_cq ( ("After resize_cq_prep *p_size = %d\n", *p_size)); p_umv_buf->p_inout_buf = p_cq_ul_resources; - p_umv_buf->input_size = (uint32_t)p_hobul->p_hca_ul_info->cq_ul_resources_sz + sizeof(uint32_t); + p_umv_buf->input_size = (uint32_t)p_hobul->p_hca_ul_info->cq_ul_resources_sz; p_umv_buf->output_size = p_umv_buf->input_size; p_umv_buf->command = TRUE; @@ -404,7 +404,7 @@ mlnx_post_resize_cq ( break; } else if (p_umv_buf->output_size != - (p_hobul->p_hca_ul_info->cq_ul_resources_sz + sizeof(uint32_t)) ) + (p_hobul->p_hca_ul_info->cq_ul_resources_sz) ) { CL_TRACE (MLNX_TRACE_LVL_1, mlnx_dbg_lvl, ("Bad priv buf size %ld\n", p_umv_buf->output_size)); diff --git a/branches/fab_cm_branch/hw/mt23108/user/mlnx_ual_osbypass.c b/branches/fab_cm_branch/hw/mt23108/user/mlnx_ual_osbypass.c index c02ed4c9..3637bd3c 100644 --- a/branches/fab_cm_branch/hw/mt23108/user/mlnx_ual_osbypass.c +++ b/branches/fab_cm_branch/hw/mt23108/user/mlnx_ual_osbypass.c @@ -265,68 +265,6 @@ map_mtoi_cqe_type ( } -void -map_mtoi_wcqe ( - IN VAPI_wc_desc_t *p_m_cqe, - OUT ib_wc_t *p_i_cqe) -{ - p_i_cqe->wr_id = p_m_cqe->id; - p_i_cqe->status = map_mtoi_cqe_status (p_m_cqe->status); - p_i_cqe->wc_type = map_mtoi_cqe_type (p_m_cqe->opcode); - p_i_cqe->length = (IB_COMP_SUCCESS == p_m_cqe->status) ? - p_m_cqe->byte_len : 0; - - CL_TRACE (MLNX_TRACE_LVL_8, mlnx_dbg_lvl, - ("cqe type %d length 0x%x status %d\n", - p_i_cqe->wc_type, p_i_cqe->length, p_i_cqe->status)); - - /* - * FIXME: RC case - */ - p_i_cqe->recv.conn.recv_opt = 0; - - if (p_m_cqe->imm_data_valid) - { - p_i_cqe->recv.conn.recv_opt |= IB_RECV_OPT_IMMEDIATE; - p_i_cqe->recv.conn.immediate_data = CL_NTOH32 (p_m_cqe->imm_data); - } - - if (p_m_cqe->grh_flag) - { - p_i_cqe->recv.conn.recv_opt |= IB_RECV_OPT_GRH_VALID; - } - - switch (p_m_cqe->remote_node_addr.type) - { - case VAPI_RNA_UD: - p_i_cqe->recv.ud.remote_qp = - CL_NTOH32 (p_m_cqe->remote_node_addr.qp_ety.qp); - p_i_cqe->recv.ud.pkey_index = (uint16_t)p_m_cqe->pkey_ix; - p_i_cqe->recv.ud.remote_lid = - CL_NTOH16 (p_m_cqe->remote_node_addr.slid); - p_i_cqe->recv.ud.remote_sl = p_m_cqe->remote_node_addr.sl; - p_i_cqe->recv.ud.path_bits = 0; - break; - - case VAPI_RNA_RD: - CL_TRACE (MLNX_TRACE_LVL_8, mlnx_dbg_lvl, ("Unsupported RD\n")); - break; - - case VAPI_RNA_RAW_ETY: - CL_TRACE (MLNX_TRACE_LVL_8, mlnx_dbg_lvl, ("Unsupported RAW_ETY\n")); - break; - - case VAPI_RNA_RAW_IPV6: - CL_TRACE (MLNX_TRACE_LVL_8, mlnx_dbg_lvl, ("Unsupported RAW_IPV6\n")); - break; - - default: - CL_TRACE (MLNX_TRACE_LVL_8, mlnx_dbg_lvl, ("Unknown type\n")); - break; - } -} - - static VAPI_mrw_acl_t map_itom_access_ctrl ( IN ib_access_t i_acl) @@ -492,50 +430,10 @@ mlnx_poll_cq ( status = IB_INVALID_PARAMETER; return status; } -#if TRUE - status = THHUL_cqm_poll4wc(p_hobul->hhul_hca_hndl, p_cq_info->hhul_cq_hndl, - pp_free_wclist, pp_done_wclist ); -#else - for (p_i_cqe = *pp_free_wclist; p_i_cqe; p_i_cqe = p_i_cqe->p_next) - { - *pp_done_wclist = NULL; - - hh_ret = THHUL_cqm_poll4cqe (p_hobul->hhul_hca_hndl, - p_cq_info->hhul_cq_hndl, - &m_cqe); - if (HH_CQ_EMPTY == hh_ret) - { - status = IB_NOT_FOUND; - break; - } - - /* - * Errors cases - */ - if (HH_OK != hh_ret) - { - CL_TRACE (MLNX_TRACE_LVL_1, mlnx_dbg_lvl, - ("poll4cqe get error status %d\n", hh_ret)); - status = IB_ERROR; - return status; - } - map_mtoi_wcqe (&m_cqe, p_i_cqe); - *pp_done_wclist = p_i_cqe; - pp_done_wclist = (ib_wc_t **)&p_i_cqe->p_next; - status = IB_SUCCESS; - } + status = THHUL_cqm_poll4wc(p_hobul->hhul_hca_hndl, p_cq_info->hhul_cq_hndl, + pp_free_wclist, pp_done_wclist ); - /* - * Update free list to point to the first unused cqe - */ - if (IB_NOT_FOUND == status && p_i_cqe != *pp_free_wclist) - { - status = IB_SUCCESS; - } - - *pp_free_wclist = p_i_cqe; -#endif FUNC_EXIT; return status; } diff --git a/branches/fab_cm_branch/hw/mt23108/vapi/Hca/hcahal/tavor/thhul_cqm/thhul_cqm.c b/branches/fab_cm_branch/hw/mt23108/vapi/Hca/hcahal/tavor/thhul_cqm/thhul_cqm.c index 16635716..942ef9fd 100644 --- a/branches/fab_cm_branch/hw/mt23108/vapi/Hca/hcahal/tavor/thhul_cqm/thhul_cqm.c +++ b/branches/fab_cm_branch/hw/mt23108/vapi/Hca/hcahal/tavor/thhul_cqm/thhul_cqm.c @@ -1243,185 +1243,6 @@ static MT_bool cq_transition_to_resized_buf( #define CQE_OPCODE_BIT_MASK MASK32(MT_BIT_SIZE(tavorprm_completion_queue_entry_st,opcode)) #define CQE_OPCODE_DWORD_OFFSET MT_BYTE_OFFSET(tavorprm_completion_queue_entry_st,opcode)>>2 #define CQE_OPCODE_SHIFT (MT_BIT_OFFSET(tavorprm_completion_queue_entry_st,opcode) & MASK32(5)) -HH_ret_t THHUL_cqm_poll4cqe( - /*IN*/ HHUL_hca_hndl_t hca_hndl, - /*IN*/ HHUL_cq_hndl_t cq, - /*OUT*/ VAPI_wc_desc_t *vapi_cqe_p -) -{ - THHUL_cq_t *thhul_cq_p= (THHUL_cq_t*)cq; - volatile u_int32_t *cur_cqe; - u_int32_t wqe_addr_32lsb,next_wqe_addr_32lsb; - IB_wqpn_t qpn; - u_int8_t opcode; - u_int8_t dbd_bit; - VAPI_special_qp_t qp_type; - VAPI_ts_type_t qp_ts_type; - u_int32_t i,dbd_cnt; - HH_ret_t rc; - u_int32_t cqe_cpy[CQE_SZ>>2]; /* CQE copy */ - /* The CQE copy is required for 2 reasons: - * 1) Hold in CPU endianess. - * 2) Free real CQE as soon as possible in order to release CQ lock quickly. - */ - - if (MOSAL_EXPECT_FALSE(thhul_cq_p == NULL)) { - MTL_ERROR1("THHUL_cqm_poll4cqe: NULL CQ handle.\n"); - return HH_EINVAL_CQ_HNDL; - } - - MOSAL_spinlock_dpc_lock(&(thhul_cq_p->cq_lock)); - - /* Check if CQE at consumer index is valid */ - cur_cqe= (volatile u_int32_t *) - (thhul_cq_p->cur_buf.cqe_buf_base + (thhul_cq_p->cur_buf.consumer_index << LOG2_CQE_SZ)); - if (is_cqe_hw_own(cur_cqe) && /* CQE is still in HW ownership */ - (!cq_transition_to_resized_buf(thhul_cq_p, &cur_cqe)) ) { - - MOSAL_spinlock_unlock(&(thhul_cq_p->cq_lock)); -#if 0 - THHUL_cqm_dump_cq(cq); -#endif - return HH_CQ_EMPTY; - } - - /* Remove Copy of all cqe, copy as nedded only */ -#if 0 /* original code */ - /* Make CQE copy in correct endianess */ - for (i= 0; i < (CQE_SZ>>2); i++) { - cqe_cpy[i]= MOSAL_be32_to_cpu(cur_cqe[i]); - } - /* Extract QP/WQE context fields from the CQE */ - wqe_addr_32lsb= (cqe_cpy[MT_BYTE_OFFSET(tavorprm_completion_queue_entry_st,wqe_adr)>>2] & - (~MASK32(CQE_WQE_ADR_BIT_SZ)) ); - qpn= (cqe_cpy[MT_BYTE_OFFSET(tavorprm_completion_queue_entry_st,my_qpn)>>2] & MASK32(24) ); - vapi_cqe_p->local_qp_num= qpn; - /* new CQE: completion status is taken from "opcode" field */ - opcode= MT_EXTRACT_ARRAY32(cqe_cpy, - MT_BIT_OFFSET(tavorprm_completion_queue_entry_st,opcode), - MT_BIT_SIZE(tavorprm_completion_queue_entry_st,opcode)); -#endif - - /* Extract QP/WQE context fields from the CQE */ - /* Byte 6 */ - wqe_addr_32lsb= MOSAL_be32_to_cpu(cur_cqe[CQE_WQE_ADDR_BYTE_OFFSET]) & - CQE_WQE_ADDR_BIT_MASK; - - /* Byte 0*/ - qpn= MOSAL_be32_to_cpu(cur_cqe[CQE_MY_QPN_BYTE_OFFSET]) & CQE_MY_QPN_BYTE_BIT_MASK; - - /* Byte 1 */ - cqe_cpy[CQE_MY_EE_DWORD_OFFSET] = MOSAL_be32_to_cpu(cur_cqe[CQE_MY_EE_DWORD_OFFSET]); - /* Byte 2 */ - cqe_cpy[CQE_RQPN_DWORD_OFFSET] = MOSAL_be32_to_cpu(cur_cqe[CQE_RQPN_DWORD_OFFSET]); - /* Byte 3 */ - cqe_cpy[CQE_RLID_DWORD_OFFSET] = MOSAL_be32_to_cpu(cur_cqe[CQE_RLID_DWORD_OFFSET]); - /* Byte 7 Convert S,Opcode,Owner fileld to Be */ - cqe_cpy[CQE_S_DWORD_OFFSET] = MOSAL_be32_to_cpu(cur_cqe[CQE_S_DWORD_OFFSET]); - - /* Byte 4 */ - vapi_cqe_p->imm_data = MOSAL_be32_to_cpu(cur_cqe[CQE_IMMEDIATE_DWORD_OFFSET]); - /* Byte 5 */ - vapi_cqe_p->byte_len= MOSAL_be32_to_cpu(cur_cqe[CQE_BYTE_CNT_DWORD_OFFSET]); - - /* new CQE: completion status is taken from "opcode" field */ - - opcode=(cqe_cpy[CQE_OPCODE_DWORD_OFFSET]>>CQE_OPCODE_SHIFT) & CQE_OPCODE_BIT_MASK; - - - if (MOSAL_EXPECT_TRUE((opcode & CQE_ERROR_STATUS_MASK) != CQE_ERROR_STATUS_MASK)) { /* Completed OK */ - MTPERF_TIME_START(free_cqe); - free_cqe(thhul_cq_p,cur_cqe); /* Free original CQE and update consumer index */ - MTPERF_TIME_END(free_cqe); - - /* DEBUG: Sanity check that the same WQE is not used twice simultaneosly */ -#ifdef THHUL_CQM_DEBUG_WQE_REUSE - /* Get next CQE and check if valid and NDA equals freed CQE's */ - cur_cqe= (volatile u_int32_t *) - (thhul_cq_p->cur_buf.cqe_buf_base + (thhul_cq_p->cur_buf.consumer_index << LOG2_CQE_SZ)); - if ((!is_cqe_hw_own(cur_cqe)) && - ( (MOSAL_be32_to_cpu( - cur_cqe[MT_BYTE_OFFSET(tavorprm_completion_queue_entry_st,wqe_adr)>>2]) & - (~MASK32(CQE_WQE_ADR_BIT_SZ)) ) == wqe_addr_32lsb) ){ - MTL_ERROR1(MT_FLFMT("%s: Duplicate NDA on next CQE (NDA=0x%X , consumer index=%u,%u)"), - __func__, wqe_addr_32lsb, - thhul_cq_p->cur_buf.consumer_index-1, thhul_cq_p->cur_buf.consumer_index); - THHUL_cqm_dump_cq(cq); - } -#endif - -#ifndef IVAPI_THH - rc= THHUL_qpm_comp_ok(thhul_cq_p->qpm, qpn, wqe_addr_32lsb, - &qp_type,&qp_ts_type,&(vapi_cqe_p->id),&(vapi_cqe_p->free_res_count)); -#else - rc= THHUL_qpm_comp_ok(thhul_cq_p->qpm, qpn, wqe_addr_32lsb, - &qp_type,&qp_ts_type,&(vapi_cqe_p->id),&(vapi_cqe_p->free_res_count),NULL); -#endif - - MOSAL_spinlock_unlock(&(thhul_cq_p->cq_lock)); - - if (MOSAL_EXPECT_FALSE(rc != HH_OK)) { - MTL_ERROR1("THHUL_cqm_poll4cqe: Failed updating associated QP.\n"); - for (i= 0; i < (CQE_SZ>>2); i++) { - MTL_ERROR1(MT_FLFMT("CQ[0x%X][%u][%u]=0x%X"),thhul_cq_p->cq_num, - (thhul_cq_p->cur_buf.consumer_index - 1) & MASK32(thhul_cq_p->cur_buf.log2_num_o_cqes), - i, cqe_cpy[i]); - } - return HH_EFATAL; /* unexpected error */ - } - /* Extract the rest of the CQE fields into vapi_cqe_p*/ - rc= extract_cqe_new(cqe_cpy,vapi_cqe_p,qp_type,qp_ts_type,opcode); - vapi_cqe_p->status= VAPI_SUCCESS; - - } else { /* Completion with error */ - - /* Make CQE copy in correct endianess */ - for (i= 0; i < (CQE_SZ>>2); i++) { - cqe_cpy[i]= MOSAL_be32_to_cpu(cur_cqe[i]); - } - - MTL_DEBUG4("THHUL_cqm_poll4cqe: completion with error: cq=%d consumer_index=%d\n", - thhul_cq_p->cq_num,thhul_cq_p->cur_buf.consumer_index); - DUMP_CQE(thhul_cq_p->cq_num,thhul_cq_p->cur_buf.consumer_index,cur_cqe); - rc= THHUL_qpm_comp_err(thhul_cq_p->qpm, qpn, wqe_addr_32lsb, - &(vapi_cqe_p->id),&(vapi_cqe_p->free_res_count),&next_wqe_addr_32lsb,&dbd_bit); - if (rc != HH_OK) { - MTL_ERROR1("THHUL_cqm_poll4cqe: Failed updating associated QP (QPn=0x%X , CQn=0x%X).\n", - qpn, thhul_cq_p->cq_num); - MOSAL_spinlock_unlock(&(thhul_cq_p->cq_lock)); - return HH_EFATAL; /* unexpected error */ - } - vapi_cqe_p->status= decode_error_syndrome((tavor_if_comp_status_t)MT_EXTRACT_ARRAY32(cqe_cpy, - CQE_ERROR_SYNDROM_BIT_OFFSET, CQE_ERROR_SYNDROM_BIT_SIZE) ); - vapi_cqe_p->vendor_err_syndrome= MT_EXTRACT_ARRAY32(cqe_cpy, - CQE_ERROR_VENDOR_SYNDROM_BIT_OFFSET, CQE_ERROR_VENDOR_SYNDROM_BIT_SIZE); - dbd_cnt= MT_EXTRACT_ARRAY32(cqe_cpy,CQE_ERROR_DBDCNT_BIT_OFFSET, CQE_ERROR_DBDCNT_BIT_SIZE); - if ((next_wqe_addr_32lsb == THHUL_QPM_END_OF_WQE_CHAIN) || /* End of WQE chain */ - ((dbd_cnt + 1 - dbd_bit) == 0) ) { /* or dbd counter reached 0 */ - if ((next_wqe_addr_32lsb == THHUL_QPM_END_OF_WQE_CHAIN) && (dbd_cnt > 0)) { - MTL_ERROR1(MT_FLFMT("%s: CQ[0x%X]:CQE[0x%X]: Reached end of chain while dbd_cnt==%u"), - __func__, thhul_cq_p->cq_num, thhul_cq_p->cur_buf.consumer_index, dbd_cnt); - } - MTPERF_TIME_START(free_cqe); - free_cqe(thhul_cq_p,cur_cqe); /* Free original CQE and update consumer index */ - MTPERF_TIME_END(free_cqe); - } else { - recycle_cqe(cur_cqe, next_wqe_addr_32lsb, dbd_cnt - dbd_bit); - } - MOSAL_spinlock_unlock(&(thhul_cq_p->cq_lock)); - /* Only WQE-ID, free_res_count and status are required for completion with error. - * No other CQE fields are extracted (see IB-spec. 11.4.2.1). - * Even though, for the sake of some legacy code: - * ...putting an opcode to distinguish completion of SQ from RQ*/ - if (opcode == CQE_ERROR_ON_SQ) { - vapi_cqe_p->opcode= VAPI_CQE_SQ_SEND_DATA; - } else { /* receive queue completion */ - vapi_cqe_p->opcode= VAPI_CQE_RQ_SEND_DATA; - } - } - - return rc; -} #ifdef WIN32 /* Successful completion */ @@ -1822,185 +1643,6 @@ static void rearm_cq(THHUL_cq_t *cq_p, MT_bool solicitedNotification) { } -/* This code is mainly from poll4cqe with rearm_cqe if next_cqe available - */ -HH_ret_t THHUL_cqm_poll_and_rearm_cq( - /*IN*/ HHUL_hca_hndl_t hca_hndl, - /*IN*/ HHUL_cq_hndl_t cq, - /*IN*/ int solicitedNotification, - /*OUT*/ VAPI_wc_desc_t *vapi_cqe_p -) -{ - - THHUL_cq_t *thhul_cq_p= (THHUL_cq_t*)cq; - volatile u_int32_t *cur_cqe; - u_int32_t wqe_addr_32lsb,next_wqe_addr_32lsb; - IB_wqpn_t qpn; - u_int8_t opcode; - u_int8_t dbd_bit; - VAPI_special_qp_t qp_type; - VAPI_ts_type_t qp_ts_type; - u_int32_t i,dbd_cnt; - HH_ret_t rc; - u_int32_t cqe_cpy[CQE_SZ>>2]; /* CQE copy */ - /* The CQE copy is required for 2 reasons: - * 1) Hold in CPU endianess. - * 2) Free real CQE as soon as possible in order to release CQ lock quickly. - */ - - if (MOSAL_EXPECT_FALSE(thhul_cq_p == NULL)) { - MTL_ERROR1("THHUL_cqm_poll4cqe: NULL CQ handle.\n"); - return HH_EINVAL_CQ_HNDL; - } - - MOSAL_spinlock_dpc_lock(&(thhul_cq_p->cq_lock)); - - /* Check if CQE at consumer index is valid */ - cur_cqe= (volatile u_int32_t *) - (thhul_cq_p->cur_buf.cqe_buf_base + (thhul_cq_p->cur_buf.consumer_index << LOG2_CQE_SZ)); - if (is_cqe_hw_own(cur_cqe)) { /* CQE is still in HW ownership */ - - rearm_cq(thhul_cq_p, (MT_bool)solicitedNotification); - /* Tavor actually solves the race condition where the s/w may have missed the - next valid entry being written, just prior to rearming the CQ. So we really - don't need to repoll the cq entry, since Tavor guarantees that we will see - an interrupt if it happened to go valid before or after rearming the CQ - */ - - MOSAL_spinlock_unlock(&(thhul_cq_p->cq_lock)); -#if 0 - THHUL_cqm_dump_cq(cq); -#endif - return HH_CQ_EMPTY; - } - - - /* Remove Copy of all cqe, copy as nedded only */ -#if 0 - /* Make CQE copy in correct endianess */ - for (i= 0; i < (CQE_SZ>>2); i++) { - cqe_cpy[i]= MOSAL_be32_to_cpu(cur_cqe[i]); - } -#endif - - /* Extract QP/WQE context fields from the CQE */ - - wqe_addr_32lsb= MOSAL_be32_to_cpu(cur_cqe[CQE_WQE_ADDR_BYTE_OFFSET]) & - CQE_WQE_ADDR_BIT_MASK; - - qpn= MOSAL_be32_to_cpu(cur_cqe[CQE_MY_QPN_BYTE_OFFSET]) & CQE_MY_QPN_BYTE_BIT_MASK; - - cqe_cpy[CQE_MY_EE_DWORD_OFFSET] = MOSAL_be32_to_cpu(cur_cqe[CQE_MY_EE_DWORD_OFFSET]); - cqe_cpy[CQE_RQPN_DWORD_OFFSET] = MOSAL_be32_to_cpu(cur_cqe[CQE_RQPN_DWORD_OFFSET]); - cqe_cpy[CQE_RLID_DWORD_OFFSET] = MOSAL_be32_to_cpu(cur_cqe[CQE_RLID_DWORD_OFFSET]); - cqe_cpy[CQE_S_DWORD_OFFSET] = MOSAL_be32_to_cpu(cur_cqe[CQE_S_DWORD_OFFSET]); - - vapi_cqe_p->imm_data = MOSAL_be32_to_cpu(cur_cqe[CQE_IMMEDIATE_DWORD_OFFSET]); - vapi_cqe_p->byte_len= MOSAL_be32_to_cpu(cur_cqe[CQE_BYTE_CNT_DWORD_OFFSET]); - - /* new CQE: completion status is taken from "opcode" field */ - - opcode=(cqe_cpy[CQE_OPCODE_DWORD_OFFSET]>>CQE_OPCODE_SHIFT) & CQE_OPCODE_BIT_MASK; - - - if (MOSAL_EXPECT_TRUE((opcode & CQE_ERROR_STATUS_MASK) != CQE_ERROR_STATUS_MASK)) { /* Completed OK */ - HH_ret_t rc_rearm; - volatile u_int32_t *next_cqe; - - MTPERF_TIME_START(free_cqe); - free_cqe(thhul_cq_p,cur_cqe); /* Free original CQE and update consumer index */ - MTPERF_TIME_END(free_cqe); - - // form pointer to next cqe that would be serviced next - next_cqe= (volatile u_int32_t *) - (thhul_cq_p->cur_buf.cqe_buf_base + (thhul_cq_p->cur_buf.consumer_index << LOG2_CQE_SZ)); - - - if (is_cqe_hw_own(next_cqe)) { /* CQE is still in HW ownership */ - rearm_cq(thhul_cq_p, (MT_bool)solicitedNotification); - // check again - next_cqe= (volatile u_int32_t *) - (thhul_cq_p->cur_buf.cqe_buf_base + (thhul_cq_p->cur_buf.consumer_index << LOG2_CQE_SZ)); - if (is_cqe_hw_own(next_cqe)) { /* CQE is still in HW ownership */ - rc_rearm = HH_COMPLETED; - } else { - rc_rearm = HH_POLL_NEEDED; - } - } - else - { - rc_rearm = HH_OK; - } - - - MOSAL_spinlock_unlock(&(thhul_cq_p->cq_lock)); -#ifndef IVAPI_THH - rc= THHUL_qpm_comp_ok(thhul_cq_p->qpm, qpn, wqe_addr_32lsb, - &qp_type,&qp_ts_type,&(vapi_cqe_p->id),&(vapi_cqe_p->free_res_count)); -#else - rc= THHUL_qpm_comp_ok(thhul_cq_p->qpm, qpn, wqe_addr_32lsb, - &qp_type,&qp_ts_type,&(vapi_cqe_p->id),&(vapi_cqe_p->free_res_count),NULL); -#endif - - if (MOSAL_EXPECT_FALSE(rc != HH_OK)) { - MTL_ERROR1("THHUL_cqm_poll4cqe: Failed updating associated QP.\n"); - DUMP_CQE(thhul_cq_p->cq_num,thhul_cq_p->cur_buf.consumer_index,cur_cqe); - return rc; - } - /* Extract the rest of the CQE fields into vapi_cqe_p*/ - - rc= extract_cqe_new(cqe_cpy,vapi_cqe_p,qp_type,qp_ts_type,opcode); - vapi_cqe_p->status= VAPI_SUCCESS; - if(MOSAL_EXPECT_FALSE(rc != HH_OK)) { - return rc; - } - else - return rc_rearm; - - - } else { /* Completion with error */ - /* Make CQE copy in correct endianess */ - for (i= 0; i < (CQE_SZ>>2); i++) { - cqe_cpy[i]= MOSAL_be32_to_cpu(cur_cqe[i]); - } - MTL_DEBUG4("THHUL_cqm_poll4cqe: completion with error: cq=%d consumer_index=%d\n", - thhul_cq_p->cq_num,thhul_cq_p->cur_buf.consumer_index); - DUMP_CQE(thhul_cq_p->cq_num,thhul_cq_p->cur_buf.consumer_index,cur_cqe); - rc= THHUL_qpm_comp_err(thhul_cq_p->qpm, qpn, wqe_addr_32lsb, - &(vapi_cqe_p->id),&(vapi_cqe_p->free_res_count),&next_wqe_addr_32lsb,&dbd_bit); - if (rc != HH_OK) { - MTL_ERROR1("THHUL_cqm_poll4cqe: Failed updating associated QP.\n"); - return rc; - } - vapi_cqe_p->status= decode_error_syndrome(MT_EXTRACT_ARRAY32(cqe_cpy, - CQE_ERROR_SYNDROM_BIT_OFFSET, CQE_ERROR_SYNDROM_BIT_SIZE) ); - vapi_cqe_p->vendor_err_syndrome= MT_EXTRACT_ARRAY32(cqe_cpy, - CQE_ERROR_VENDOR_SYNDROM_BIT_OFFSET, CQE_ERROR_VENDOR_SYNDROM_BIT_SIZE); - dbd_cnt= MT_EXTRACT_ARRAY32(cqe_cpy,CQE_ERROR_DBDCNT_BIT_OFFSET, CQE_ERROR_DBDCNT_BIT_SIZE); - if ((next_wqe_addr_32lsb == THHUL_QPM_END_OF_WQE_CHAIN) || /* End of WQE chain */ - ((dbd_cnt + 1 - dbd_bit) == 0) ) { /* or dbd counter reached 0 */ - MTPERF_TIME_START(free_cqe); - free_cqe(thhul_cq_p,cur_cqe); /* Free original CQE and update consumer index */ - MTPERF_TIME_END(free_cqe); - } else { - recycle_cqe(cur_cqe, next_wqe_addr_32lsb, dbd_cnt - dbd_bit); - } - MOSAL_spinlock_unlock(&(thhul_cq_p->cq_lock)); - /* Only WQE-ID, free_res_count and status are required for completion with error. - * No other CQE fields are extracted (see IB-spec. 11.4.2.1). - * Even though, for the sake of some legacy code: - * ...putting an opcode to distinguish completion of SQ from RQ*/ - if (opcode == CQE_ERROR_ON_SQ) { - vapi_cqe_p->opcode= VAPI_CQE_SQ_SEND_DATA; - } else { /* receive queue completion */ - vapi_cqe_p->opcode= VAPI_CQE_RQ_SEND_DATA; - } - } - - return rc; - -} - HH_ret_t THHUL_cqm_req_comp_notif( /*IN*/ HHUL_hca_hndl_t hca_hndl, diff --git a/branches/fab_cm_branch/hw/mt23108/vapi/Hca/hcahal/tavor/thhul_cqm/thhul_cqm.h b/branches/fab_cm_branch/hw/mt23108/vapi/Hca/hcahal/tavor/thhul_cqm/thhul_cqm.h index 5b05e3e1..f0271689 100644 --- a/branches/fab_cm_branch/hw/mt23108/vapi/Hca/hcahal/tavor/thhul_cqm/thhul_cqm.h +++ b/branches/fab_cm_branch/hw/mt23108/vapi/Hca/hcahal/tavor/thhul_cqm/thhul_cqm.h @@ -94,13 +94,6 @@ DLL_API HH_ret_t THHUL_cqm_cq_cleanup( /*IN*/ HHUL_srq_hndl_t srq ); - -DLL_API HH_ret_t THHUL_cqm_poll4cqe( - /*IN*/ HHUL_hca_hndl_t hca_hndl, - /*IN*/ HHUL_cq_hndl_t cq, - /*OUT*/ VAPI_wc_desc_t *vapi_cqe_p -); - #ifdef WIN32 #include DLL_API ib_api_status_t @@ -117,13 +110,6 @@ THHUL_cqm_count_cqe( OUT uint32_t* const p_n_cqes ); #endif -DLL_API HH_ret_t THHUL_cqm_poll_and_rearm_cq( - /*IN*/ HHUL_hca_hndl_t hca_hndl, - /*IN*/ HHUL_cq_hndl_t cq, - /*IN*/ int solicitedNotification, - /*OUT*/ VAPI_wc_desc_t *vapi_cqe_p -); - DLL_API HH_ret_t THHUL_cqm_peek_cq( /*IN*/ HHUL_hca_hndl_t hca_hndl, /*IN*/ HHUL_cq_hndl_t cq, diff --git a/branches/fab_cm_branch/hw/mt23108/vapi/Hca/hcahal/tavor/thhul_hob/thhul_hob.c b/branches/fab_cm_branch/hw/mt23108/vapi/Hca/hcahal/tavor/thhul_hob/thhul_hob.c index f2324640..f49bf701 100644 --- a/branches/fab_cm_branch/hw/mt23108/vapi/Hca/hcahal/tavor/thhul_hob/thhul_hob.c +++ b/branches/fab_cm_branch/hw/mt23108/vapi/Hca/hcahal/tavor/thhul_hob/thhul_hob.c @@ -83,8 +83,8 @@ static HHUL_if_ops_t thhul_ops= THHUL_cqm_create_cq_done /* HHULIF_create_cq_done */, THHUL_cqm_resize_cq_prep /* HHULIF_resize_cq_prep */, THHUL_cqm_resize_cq_done /* HHULIF_resize_cq_done */, - THHUL_cqm_poll4cqe /* HHULIF_poll4cqe */, - THHUL_cqm_poll_and_rearm_cq /* HHULIF_poll_and_rearm_cq */, + NULL /* HHULIF_poll4cqe */, + NULL /* HHULIF_poll_and_rearm_cq */, THHUL_cqm_peek_cq /* HHULIF_peek_cq */, THHUL_cqm_req_comp_notif /* HHULIF_req_comp_notif */, THHUL_cqm_req_ncomp_notif /* HHULIF_req_ncomp_notif */,