if( h_cq->h_ci_cq && uvp_intf.pre_query_cq )\r
{\r
/* Pre call to the UVP library */\r
- status = uvp_intf.pre_query_cq( h_cq->h_ci_cq, &cq_ioctl.in.umv_buf );\r
+ status = uvp_intf.pre_query_cq(\r
+ h_cq->h_ci_cq, p_size, &cq_ioctl.in.umv_buf );\r
+ if( status == IB_VERBS_PROCESSING_DONE )\r
+ {\r
+ AL_EXIT( AL_DBG_CQ );\r
+ return IB_SUCCESS;\r
+ }\r
if( status != IB_SUCCESS )\r
{\r
AL_EXIT( AL_DBG_CQ );\r
status = IB_INVALID_PARAMETER;\r
goto cleanup;\r
}\r
+\r
+ /* Query is fully handled in user-mode. */\r
+ if( p_umv_buf && p_umv_buf->command )\r
+ {\r
+ status = IB_INVALID_CQ_HANDLE;\r
+ goto cleanup;\r
+ }\r
+\r
VALIDATE_INDEX(hca_idx, MLNX_MAX_HCA, IB_INVALID_CQ_HANDLE, cleanup);\r
hobul_p = mlnx_hobul_array[hca_idx];\r
if (NULL == hobul_p) {\r
cl_mutex_acquire(&hobul_p->cq_info_tbl[cq_idx].mutex);\r
\r
hhul_cq_hndl = hobul_p->cq_info_tbl[cq_idx].hhul_cq_hndl;\r
-\r
- if (HH_OK != THH_hob_query_cq(hobul_p->hh_hndl, cq_num, p_size)) {\r
+ if (HH_OK != THHUL_cqm_query_cq(hobul_p->hhul_hndl, hhul_cq_hndl, p_size)){\r
status = IB_ERROR;\r
goto cleanup_locked;\r
}\r
\r
cl_mutex_release(&hobul_p->cq_info_tbl[cq_idx].mutex);\r
\r
- if( p_umv_buf && p_umv_buf->command )\r
- {\r
- p_umv_buf->output_size = 0;\r
- p_umv_buf->status = IB_SUCCESS;\r
- }\r
CL_EXIT(MLNX_DBG_TRACE, g_mlnx_dbg_lvl);\r
return IB_SUCCESS;\r
\r
p_uvp->pre_create_cq = mlnx_pre_create_cq;\r
p_uvp->post_create_cq = mlnx_post_create_cq;\r
\r
- p_uvp->pre_query_cq = NULL;\r
+ p_uvp->pre_query_cq = mlnx_pre_query_cq;\r
p_uvp->post_query_cq = NULL;\r
\r
p_uvp->pre_resize_cq = mlnx_pre_resize_cq;\r
\r
ib_api_status_t\r
mlnx_pre_query_cq (\r
- IN const ib_cq_handle_t h_uvp_cq,\r
- IN OUT ci_umv_buf_t *p_umv_buf)\r
+ IN const ib_cq_handle_t h_uvp_cq,\r
+ OUT uint32_t* const p_size,\r
+ IN OUT ci_umv_buf_t *p_umv_buf)\r
{\r
- FUNC_ENTER;\r
- CL_ASSERT(p_umv_buf);\r
- p_umv_buf->command = TRUE;\r
- FUNC_EXIT;\r
- return IB_SUCCESS;\r
-}\r
+ mlnx_ual_cq_info_t *p_cq_info = (mlnx_ual_cq_info_t *)((void*) h_uvp_cq);\r
+\r
+ FUNC_ENTER;\r
\r
+ *p_size = p_cq_info->cq_size;\r
\r
-void\r
-mlnx_post_query_cq (\r
- IN const ib_cq_handle_t h_uvp_cq,\r
- IN ib_api_status_t ioctl_status,\r
- IN OUT ci_umv_buf_t *p_umv_buf)\r
-{\r
- FUNC_ENTER;\r
- FUNC_EXIT;\r
- return;\r
+ FUNC_EXIT;\r
+ return IB_VERBS_PROCESSING_DONE;\r
}\r
\r
\r
\r
ib_api_status_t \r
mlnx_pre_query_cq (\r
- IN const ib_cq_handle_t h_uvp_cq,\r
- IN OUT ci_umv_buf_t *p_umv_buf);\r
-\r
-void \r
-mlnx_post_query_cq (\r
- IN const ib_cq_handle_t h_uvp_cq,\r
- IN ib_api_status_t ioctl_status,\r
- IN OUT ci_umv_buf_t *p_umv_buf);\r
+ IN const ib_cq_handle_t h_uvp_cq,\r
+ OUT uint32_t* const p_size,\r
+ IN OUT ci_umv_buf_t *p_umv_buf);\r
\r
ib_api_status_t \r
mlnx_pre_destroy_cq (\r
\r
/* parameters checks */\r
if (cq_p == NULL) {\r
- MTL_ERROR1("THHUL_cqm_peek_cq: NULL CQ handle.\n");\r
+ MTL_ERROR1("THHUL_cqm_count_cqe: NULL CQ handle.\n");\r
return IB_INVALID_CQ_HANDLE;\r
}\r
\r
}\r
\r
\r
+HH_ret_t THHUL_cqm_query_cq( \r
+ /*IN*/ HHUL_hca_hndl_t hca_hndl, \r
+ /*IN*/ HHUL_cq_hndl_t cq, \r
+ /*OUT*/ VAPI_cqe_num_t *num_o_cqes_p)\r
+{\r
+ THHUL_cq_t *cq_p= (THHUL_cq_t*)cq;\r
+ HH_ret_t ret=HH_OK;\r
+\r
+ /* parameters checks */\r
+ if (cq_p == NULL) {\r
+ MTL_ERROR1("THHUL_cqm_query_cq: NULL CQ handle.\n");\r
+ return HH_EINVAL_CQ_HNDL;\r
+ }\r
+\r
+ /* Find CQE and check ownership */\r
+ MOSAL_spinlock_dpc_lock(&(cq_p->cq_lock));\r
+ *num_o_cqes_p= ((1U << cq_p->cur_buf.log2_num_o_cqes) -1 - cq_p->cur_buf.spare_cqes) ;\r
+ \r
+ MOSAL_spinlock_unlock(&(cq_p->cq_lock)); \r
+\r
+ return ret; \r
+}\r
+\r
static void rearm_cq(THHUL_cq_t *cq_p, MT_bool solicitedNotification) {\r
volatile u_int32_t chimeWords[2];\r
THH_uar_t uar = cq_p->uar;\r
OUT uint32_t* const p_n_cqes );\r
#endif\r
\r
+DLL_API HH_ret_t THHUL_cqm_query_cq( \r
+ /*IN*/ HHUL_hca_hndl_t hca_hndl, \r
+ /*IN*/ HHUL_cq_hndl_t cq, \r
+ /*OUT*/ VAPI_cqe_num_t *num_o_cqes_p\r
+);\r
+\r
DLL_API HH_ret_t THHUL_cqm_peek_cq( \r
/*IN*/ HHUL_hca_hndl_t hca_hndl, \r
/*IN*/ HHUL_cq_hndl_t cq, \r
typedef ib_api_status_t\r
(AL_API *uvp_pre_query_cq) (\r
IN const ib_cq_handle_t h_uvp_cq,\r
+ IN OUT uint32_t* const p_size,\r
IN OUT ci_umv_buf_t *p_umv_buf );\r
\r
/*\r
* h_uvp_cq\r
* [in] Vendor's Handle to the already created CQ (in user-mode library).\r
*\r
+* p_size\r
+* [out] Size of the CQ if processing ends in user-mode.\r
+*\r
* p_umv_buf\r
* [in out] On input, UAL provides this buffer template.\r
* On return from this function, p_umv_buf contains\r
* The CQ handle is invalid.\r
* IB_INSUFFICIENT_RESOURCES\r
* Insufficient resources in Vendor library to complete the call.\r
+* IB_VERBS_PROCESSING_DONE\r
+* The UVP fully processed the request. The post_query_cq handler\r
+* will not be invoked.\r
*\r
* PORTABILITY\r
* User mode.\r