[ofw] [PATCH 3/12] events: allow callbacks per CQ, QP, or SRQ

Sean Hefty sean.hefty at intel.com
Mon Jul 21 09:12:30 PDT 2008


The underlying hardware drivers both support setting callbacks on a per
widget (CQ, QP, or SRQ) basis, but the verbs interface only allows one
global event handler and one completion handler for the HCA.  Modify the
verbs interface to allow setting events callbacks directly on the HCA
objects.  This allows the HCA to support multiple consumers of its
interface, and users can optimize their event handling based on the call.
For example, the HCA drivers can invoke callbacks directly to the ULPs
without the calls first being filtered by IBAL.  This will improve
completion event reporting.

To minimize changes to the existing stack, the current event handler is
used for all events, regardless of type.  Optimizations are left for a
separate patch.

Signed-off-by: Sean Hefty <sean.hefty at intel.com>
---
diff -up -r -X trunk\docs\dontdiff.txt -I '\$Id:' trunk/core/al/al_verbs.h branches\winverbs/core/al/al_verbs.h
--- trunk/core/al/al_verbs.h	2008-06-03 20:28:24.338500000 -0700
+++ branches\winverbs/core/al/al_verbs.h	2008-06-03 20:31:24.557250000 -0700
@@ -72,6 +72,9 @@
 	h_ca->obj.p_ci_ca->verbs.modify_ca( h_ca->obj.p_ci_ca->h_ci_ca,\
 		port_num, ca_mod, p_port_attr_mod )
 
+void ci_ca_comp_cb(void *cq_context);
+void ci_ca_async_event_cb(ib_event_rec_t* p_event_record);
+
 static inline ib_api_status_t
 verbs_create_cq(
 	IN		const	ib_ca_handle_t FUNC_PTR64				h_ca,
@@ -81,7 +84,8 @@ verbs_create_cq(
 {
 	return h_ca->obj.p_ci_ca->verbs.create_cq(
 		(p_umv_buf) ? h_ca->h_um_ca : h_ca->obj.p_ci_ca->h_ci_ca,
-		h_cq, &p_cq_create->size, &h_cq->h_ci_cq, p_umv_buf );
+		h_cq, ci_ca_async_event_cb, ci_ca_comp_cb, &p_cq_create->size,
+		&h_cq->h_ci_cq, p_umv_buf );
 }
 
 #define verbs_check_cq(h_cq)	((h_cq)->h_ci_cq)
@@ -241,7 +245,7 @@ verbs_create_srq(
 	ib_api_status_t		status;
 
 	status = h_srq->obj.p_ci_ca->verbs.create_srq(
-		h_pd->h_ci_pd, h_srq, p_srq_attr,
+		h_pd->h_ci_pd, h_srq, ci_ca_async_event_cb, p_srq_attr,
 		&h_srq->h_ci_srq, p_umv_buf );
 
 	h_srq->h_recv_srq = h_srq->h_ci_srq;
@@ -286,7 +290,7 @@ verbs_get_spl_qp(
 	ib_api_status_t		status;
 
 	status = h_qp->obj.p_ci_ca->verbs.create_spl_qp(
-		h_pd->h_ci_pd, port_num, h_qp, p_qp_create,
+		h_pd->h_ci_pd, port_num, h_qp, ci_ca_async_event_cb, p_qp_create,
 		p_qp_attr, &h_qp->h_ci_qp );
 
 	h_qp->h_recv_qp = h_qp->h_ci_qp;
@@ -309,7 +313,7 @@ verbs_create_qp(
 	ib_api_status_t		status;
 
 	status = h_qp->obj.p_ci_ca->verbs.create_qp(
-		h_pd->h_ci_pd, h_qp, p_qp_create, p_qp_attr,
+		h_pd->h_ci_pd, h_qp, ci_ca_async_event_cb, p_qp_create, p_qp_attr,
 		&h_qp->h_ci_qp, p_umv_buf );
 
 	h_qp->h_recv_qp = h_qp->h_ci_qp;
diff -up -r -X trunk\docs\dontdiff.txt -I '\$Id:' trunk/core/al/kernel/al_ci_ca.c branches\winverbs/core/al/kernel/al_ci_ca.c
--- trunk/core/al/kernel/al_ci_ca.c	2008-06-03 20:28:24.354125000 -0700
+++ branches\winverbs/core/al/kernel/al_ci_ca.c	2008-06-03 20:31:24.557250000 -0700
@@ -76,7 +76,7 @@ ci_ca_async_proc_cb(
 
 void
 ci_ca_async_event_cb(
-	IN		const	ib_event_rec_t* const		p_event_record );
+	IN				ib_event_rec_t*				p_event_record );
 
 
 
@@ -154,7 +154,7 @@ create_ci_ca(
 	p_ci_ca->dereg_async_item.pfn_callback = ci_ca_async_proc_cb;
 
 	/* Open the CI CA. */
-	status = p_ci_ca->verbs.open_ca( p_ci_ca->verbs.guid, ci_ca_comp_cb,
+	status = p_ci_ca->verbs.open_ca( p_ci_ca->verbs.guid,
 		ci_ca_async_event_cb, p_ci_ca, &p_ci_ca->h_ci_ca );
 	if( status != IB_SUCCESS )
 	{
@@ -335,7 +335,7 @@ ci_ca_comp_cb(
  */
 void
 ci_ca_async_event_cb(
-	IN		const	ib_event_rec_t* const		p_event_record )
+	IN		ib_event_rec_t*		p_event_record )
 {
 	ib_async_event_rec_t	event_rec;
 
diff -up -r -X trunk\docs\dontdiff.txt -I '\$Id:' trunk/hw/mlx4/kernel/bus/ib/cq.c branches\winverbs/hw/mlx4/kernel/bus/ib/cq.c
--- trunk/hw/mlx4/kernel/bus/ib/cq.c	2008-06-03 20:28:24.385375000 -0700
+++ branches\winverbs/hw/mlx4/kernel/bus/ib/cq.c	2008-06-03 20:31:24.572875000 -0700
@@ -38,12 +38,12 @@
 static void mlx4_ib_cq_comp(struct mlx4_cq *cq)
 {
 	struct ib_cq *ibcq = &to_mibcq(cq)->ibcq;
-	ibcq->comp_handler(ibcq, ibcq->cq_context);
+	ibcq->comp_handler(ibcq->cq_context);
 }
 
 static void mlx4_ib_cq_event(struct mlx4_cq *cq, enum mlx4_event type)
 {
-	struct ib_event event;
+	ib_event_rec_t event;
 	struct ib_cq *ibcq;
 
 	if (type != MLX4_EVENT_TYPE_CQ_ERROR) {
@@ -53,12 +53,10 @@ static void mlx4_ib_cq_event(struct mlx4
 	}
 
 	ibcq = &to_mibcq(cq)->ibcq;
-	if (ibcq->event_handler) {
-		event.device     = ibcq->device;
-		event.event      = IB_EVENT_CQ_ERR;
-		event.element.cq = ibcq;
-		ibcq->event_handler(&event, ibcq->cq_context);
-	}
+	event.type = IB_EVENT_CQ_ERR;
+	event.context = ibcq->cq_context;
+	event.vendor_specific = type;
+	ibcq->event_handler(&event);
 }
 
 static void *get_cqe_from_buf(struct mlx4_ib_cq_buf *buf, int n)
diff -up -r -X trunk\docs\dontdiff.txt -I '\$Id:' trunk/hw/mlx4/kernel/bus/ib/qp.c branches\winverbs/hw/mlx4/kernel/bus/ib/qp.c
--- trunk/hw/mlx4/kernel/bus/ib/qp.c	2008-06-03 20:28:24.416625000 -0700
+++ branches\winverbs/hw/mlx4/kernel/bus/ib/qp.c	2008-06-03 20:31:24.572875000 -0700
@@ -127,48 +127,45 @@ static void stamp_send_wqe(struct mlx4_i
 
 static void mlx4_ib_qp_event(struct mlx4_qp *qp, enum mlx4_event type)
 {
-	struct ib_event event;
+	ib_event_rec_t event;
 	struct ib_qp *ibqp = &to_mibqp(qp)->ibqp;
 
 	if (type == MLX4_EVENT_TYPE_PATH_MIG)
 		to_mibqp(qp)->port = to_mibqp(qp)->alt_port;
 
-	if (ibqp->event_handler) {
-		event.device     = ibqp->device;
-		event.element.qp = ibqp;
-		switch (type) {
-		case MLX4_EVENT_TYPE_PATH_MIG:
-			event.event = IB_EVENT_PATH_MIG;
-			break;
-		case MLX4_EVENT_TYPE_COMM_EST:
-			event.event = IB_EVENT_COMM_EST;
-			break;
-		case MLX4_EVENT_TYPE_SQ_DRAINED:
-			event.event = IB_EVENT_SQ_DRAINED;
-			break;
-		case MLX4_EVENT_TYPE_SRQ_QP_LAST_WQE:
-			event.event = IB_EVENT_QP_LAST_WQE_REACHED;
-			break;
-		case MLX4_EVENT_TYPE_WQ_CATAS_ERROR:
-			event.event = IB_EVENT_QP_FATAL;
-			break;
-		case MLX4_EVENT_TYPE_PATH_MIG_FAILED:
-			event.event = IB_EVENT_PATH_MIG_ERR;
-			break;
-		case MLX4_EVENT_TYPE_WQ_INVAL_REQ_ERROR:
-			event.event = IB_EVENT_QP_REQ_ERR;
-			break;
-		case MLX4_EVENT_TYPE_WQ_ACCESS_ERROR:
-			event.event = IB_EVENT_QP_ACCESS_ERR;
-			break;
-		default:
-			printk(KERN_WARNING "mlx4_ib: Unexpected event type %d "
-			       "on QP %06x\n", type, qp->qpn);
-			return;
-		}
-
-		ibqp->event_handler(&event, ibqp->qp_context);
+	switch (type) {
+	case MLX4_EVENT_TYPE_PATH_MIG:
+		event.type = IB_EVENT_PATH_MIG;
+		break;
+	case MLX4_EVENT_TYPE_COMM_EST:
+		event.type = IB_EVENT_COMM_EST;
+		break;
+	case MLX4_EVENT_TYPE_SQ_DRAINED:
+		event.type = IB_EVENT_SQ_DRAINED;
+		break;
+	case MLX4_EVENT_TYPE_SRQ_QP_LAST_WQE:
+		event.type = IB_EVENT_QP_LAST_WQE_REACHED;
+		break;
+	case MLX4_EVENT_TYPE_WQ_CATAS_ERROR:
+		event.type = IB_EVENT_QP_FATAL;
+		break;
+	case MLX4_EVENT_TYPE_PATH_MIG_FAILED:
+		event.type = IB_EVENT_PATH_MIG_ERR;
+		break;
+	case MLX4_EVENT_TYPE_WQ_INVAL_REQ_ERROR:
+		event.type = IB_EVENT_QP_REQ_ERR;
+		break;
+	case MLX4_EVENT_TYPE_WQ_ACCESS_ERROR:
+		event.type = IB_EVENT_QP_ACCESS_ERR;
+		break;
+	default:
+		printk(KERN_WARNING "mlx4_ib: Unexpected event type %d "
+		       "on QP %06x\n", type, qp->qpn);
+		return;
 	}
+
+	event.context = ibqp->qp_context;
+	ibqp->event_handler(&event);
 }
 
 static int send_wqe_overhead(enum ib_qp_type type)
diff -up -r -X trunk\docs\dontdiff.txt -I '\$Id:' trunk/hw/mlx4/kernel/bus/ib/srq.c branches\winverbs/hw/mlx4/kernel/bus/ib/srq.c
--- trunk/hw/mlx4/kernel/bus/ib/srq.c	2008-06-03 20:28:24.447875000 -0700
+++ branches\winverbs/hw/mlx4/kernel/bus/ib/srq.c	2008-06-03 20:31:24.572875000 -0700
@@ -48,27 +48,24 @@ static void *get_wqe(struct mlx4_ib_srq 
 
 static void mlx4_ib_srq_event(struct mlx4_srq *srq, enum mlx4_event type)
 {
-	struct ib_event event;
+	ib_event_rec_t event;
 	struct ib_srq *ibsrq = &to_mibsrq(srq)->ibsrq;
 
-	if (ibsrq->event_handler) {
-		event.device      = ibsrq->device;
-		event.element.srq = ibsrq;
-		switch (type) {
-		case MLX4_EVENT_TYPE_SRQ_LIMIT:
-			event.event = IB_EVENT_SRQ_LIMIT_REACHED;
-			break;
-		case MLX4_EVENT_TYPE_SRQ_CATAS_ERROR:
-			event.event = IB_EVENT_SRQ_ERR;
-			break;
-		default:
-			printk(KERN_WARNING "mlx4_ib: Unexpected event type %d "
-			       "on SRQ %06x\n", type, srq->srqn);
-			return;
-		}
-
-		ibsrq->event_handler(&event, ibsrq->srq_context);
+	switch (type) {
+	case MLX4_EVENT_TYPE_SRQ_LIMIT:
+		event.type = IB_EVENT_SRQ_LIMIT_REACHED;
+		break;
+	case MLX4_EVENT_TYPE_SRQ_CATAS_ERROR:
+		event.type = IB_EVENT_SRQ_ERR;
+		break;
+	default:
+		printk(KERN_WARNING "mlx4_ib: Unexpected event type %d "
+		       "on SRQ %06x\n", type, srq->srqn);
+		return;
 	}
+
+	event.context = ibsrq->srq_context;
+	ibsrq->event_handler(&event);
 }
 
 struct ib_srq *mlx4_ib_create_srq(struct ib_pd *pd,
diff -up -r -X trunk\docs\dontdiff.txt -I '\$Id:' trunk/hw/mlx4/kernel/bus/inc/ib_verbs.h
branches\winverbs/hw/mlx4/kernel/bus/inc/ib_verbs.h
--- trunk/hw/mlx4/kernel/bus/inc/ib_verbs.h	2008-06-03 20:28:24.463500000 -0700
+++ branches\winverbs/hw/mlx4/kernel/bus/inc/ib_verbs.h	2008-06-03 20:31:24.588500000 -0700
@@ -446,7 +446,7 @@ struct ib_srq_attr {
 };
 
 struct ib_srq_init_attr {
-	void		      (*event_handler)(struct ib_event *, void *);
+	void		      (*event_handler)(ib_event_rec_t *);
 	void		       *srq_context;
 	struct ib_srq_attr	attr;
 };
@@ -481,7 +481,7 @@ enum ib_qp_type {
 };
 
 struct ib_qp_init_attr {
-	void                  (*event_handler)(struct ib_event *, void *);
+	void                  (*event_handler)(ib_event_rec_t *);
 	void		       *qp_context;
 	struct ib_cq	       *send_cq;
 	struct ib_cq	       *recv_cq;
@@ -729,13 +729,13 @@ struct ib_ah {
 	struct ib_ucontext	*p_uctx;
 };
 
-typedef void (*ib_comp_handler)(struct ib_cq *cq, void *cq_context);
+typedef void (*ib_comp_handler)(void *cq_context);
 
 struct ib_cq {
 	struct ib_device       *device;
 	struct ib_ucontext     *p_uctx;
 	ib_comp_handler   	comp_handler;
-	void                  (*event_handler)(struct ib_event *, void *);
+	void                  (*event_handler)(ib_event_rec_t *);
 	void *            	cq_context;
 	int               	cqe;
 	atomic_t          	usecnt; /* count number of work queues */
@@ -746,7 +746,7 @@ struct ib_srq {
 	struct ib_device       *device;
 	struct ib_pd	       *pd;
 	struct ib_ucontext     *p_uctx;
-	void		      (*event_handler)(struct ib_event *, void *);
+	void		      (*event_handler)(ib_event_rec_t *);
 	void		       *srq_context;
 	atomic_t		usecnt;
 	struct ib_srq_ex        x;
@@ -759,7 +759,7 @@ struct ib_qp {
 	struct ib_cq	       *recv_cq;
 	struct ib_srq	       *srq;
 	struct ib_ucontext     *p_uctx;
-	void                  (*event_handler)(struct ib_event *, void *);
+	void                  (*event_handler)(ib_event_rec_t *);
 	void		       *qp_context;
 	u32			qp_num;
 	enum ib_qp_type		qp_type;
@@ -1358,7 +1358,7 @@ static inline int ib_post_recv(struct ib
  */
 struct ib_cq *ib_create_cq(struct ib_device *device,
 			   ib_comp_handler comp_handler,
-			   void (*event_handler)(struct ib_event *, void *),
+			   void (*event_handler)(ib_event_rec_t *),
 			   void *cq_context, int cqe, int comp_vector);
 
 /**
diff -up -r -X trunk\docs\dontdiff.txt -I '\$Id:' trunk/hw/mlx4/kernel/hca/ca.c branches\winverbs/hw/mlx4/kernel/hca/ca.c
--- trunk/hw/mlx4/kernel/hca/ca.c	2008-06-03 20:28:24.479125000 -0700
+++ branches\winverbs/hw/mlx4/kernel/hca/ca.c	2008-06-03 20:31:24.588500000 -0700
@@ -42,7 +42,6 @@
 ib_api_status_t
 mlnx_open_ca (
 	IN		const	ib_net64_t					ca_guid, // IN  const char *
ca_name,
-	IN		const	ci_completion_cb_t			pfn_completion_cb,
 	IN		const	ci_async_event_cb_t			pfn_async_event_cb,
 	IN		const	void*const					ca_context,
 		OUT			ib_ca_handle_t				*ph_ca)
@@ -75,7 +74,6 @@ mlnx_open_ca (
 	HCA_PRINT(TRACE_LEVEL_INFORMATION  ,HCA_DBG_SHIM,
 		("context 0x%p\n", ca_context));
 	status = mlnx_set_cb(p_hca,
-		pfn_completion_cb,
 		pfn_async_event_cb,
 		ca_context);
 	if (IB_SUCCESS != status) {
diff -up -r -X trunk\docs\dontdiff.txt -I '\$Id:' trunk/hw/mlx4/kernel/hca/cq.c branches\winverbs/hw/mlx4/kernel/hca/cq.c
--- trunk/hw/mlx4/kernel/hca/cq.c	2008-06-03 20:28:24.494750000 -0700
+++ branches\winverbs/hw/mlx4/kernel/hca/cq.c	2008-06-03 20:31:24.588500000 -0700
@@ -43,6 +43,8 @@ ib_api_status_t
 mlnx_create_cq (
 	IN		const	ib_ca_handle_t				h_ca,
 	IN		const	void						*cq_context,
+	IN				ci_async_event_cb_t			event_handler,
+	IN				ci_completion_cb_t			cq_comp_handler,
 	IN	OUT			uint32_t					*p_size,
 		OUT			ib_cq_handle_t				*ph_cq,
 	IN	OUT			ci_umv_buf_t				*p_umv_buf )
@@ -86,7 +88,7 @@ mlnx_create_cq (
 
 	// allocate cq	
 	p_ib_cq = ibv_create_cq(p_ibdev, 
-		cq_comp_handler, cq_event_handler,
+		cq_comp_handler, event_handler,
 		p_hca, *p_size, p_uctx, p_umv_buf );
 	if (IS_ERR(p_ib_cq)) {
 		err = PTR_ERR(p_ib_cq);
diff -up -r -X trunk\docs\dontdiff.txt -I '\$Id:' trunk/hw/mlx4/kernel/hca/data.c branches\winverbs/hw/mlx4/kernel/hca/data.c
--- trunk/hw/mlx4/kernel/hca/data.c	2008-06-03 20:31:11.104125000 -0700
+++ branches\winverbs/hw/mlx4/kernel/hca/data.c	2008-06-03 20:31:24.604125000 -0700
@@ -107,7 +107,6 @@ mlnx_hcas_init( void )
 ib_api_status_t
 mlnx_set_cb(
 	IN				mlnx_hca_t				*	p_hca, 
-	IN				ci_completion_cb_t			comp_cb_p,
 	IN				ci_async_event_cb_t			async_cb_p,
 	IN		const	void* const					ib_context)
 {
@@ -132,7 +131,6 @@ mlnx_set_cb(
 		}
 	}
 
-	p_hca->comp_cb_p	= comp_cb_p;
 	p_hca->async_cb_p = async_cb_p;
 	p_hca->ca_context = ib_context; // This is the context our CB forwards to IBAL
 	return IB_SUCCESS;
@@ -152,7 +150,6 @@ mlnx_reset_cb(
 	p_async_proc = p_hca->async_proc_mgr_p;
 	p_hca->async_proc_mgr_p = NULL;
 
-	p_hca->comp_cb_p = NULL;
 	p_hca->async_cb_p = NULL;
 	p_hca->ca_context = NULL;
 	p_hca->cl_device_h = NULL;
@@ -295,21 +292,6 @@ from_hca_cap(
 	}
 }
 
-void cq_comp_handler(struct ib_cq *cq, void *context)
-{
-	mlnx_hca_t *p_hca = (mlnx_hca_t *)context;
-	struct ib_cq *p_ib_cq =(struct ib_cq *)cq; 
-	HCA_ENTER(HCA_DBG_CQ);
-	if (p_hca && p_hca->comp_cb_p) {
-		HCA_PRINT(TRACE_LEVEL_INFORMATION ,HCA_DBG_CQ ,("Invoking completion callback\n"));
-		(p_hca->comp_cb_p)(p_ib_cq->x.ctx);
-	}
-	else {
-		HCA_PRINT(TRACE_LEVEL_ERROR ,HCA_DBG_CQ ,("Incorrect context. Completion callback was not invoked\n"));
-	}
-	HCA_EXIT(HCA_DBG_CQ);
-}
-
 void ca_event_handler(struct ib_event *ev, void *context)
 {
 	mlnx_hca_t *p_hca = (mlnx_hca_t *)context;
@@ -333,67 +315,6 @@ void ca_event_handler(struct ib_event *e
 	}
 }
 
-void srq_event_handler(struct ib_event *ev, void *context)
-{
-	mlnx_hca_t *p_hca = (mlnx_hca_t *)context;
-	ib_event_rec_t event_rec;
-	struct ib_srq *p_srq;
-
-	// prepare parameters
-	event_rec.type = ev->event;
-	// TODO: who fills x.vendor_specific
-	event_rec.vendor_specific = ev->x.vendor_specific;
-	p_srq = (struct ib_srq *)ev->element.srq;
-	event_rec.context = p_srq->x.ctx;
-
-	// call the user callback
-	if (p_hca)
-		(p_hca->async_cb_p)(&event_rec);
-	else {
-		HCA_PRINT(TRACE_LEVEL_ERROR ,HCA_DBG_SHIM ,("Incorrect context. Async callback was not invoked\n"));
-	}
-}
-
-
-void qp_event_handler(struct ib_event *ev, void *context)
-{
-	mlnx_hca_t *p_hca = (mlnx_hca_t *)context;
-	ib_event_rec_t event_rec;
-	struct ib_qp *p_ib_qp;
-
-	// prepare parameters
-	event_rec.type = ev->event;
-	event_rec.vendor_specific = ev->x.vendor_specific;
-	p_ib_qp = (struct ib_qp *)ev->element.qp;
-	event_rec.context = p_ib_qp->x.ctx;
-
-	// call the user callback
-	if (p_hca)
-		(p_hca->async_cb_p)(&event_rec);
-	else {
-		HCA_PRINT(TRACE_LEVEL_ERROR ,HCA_DBG_SHIM ,("Incorrect context. Async callback was not invoked\n"));
-	}
-}
-
-void cq_event_handler(struct ib_event *ev, void *context)
-{
-	mlnx_hca_t *p_hca = (mlnx_hca_t *)context;
-	ib_event_rec_t event_rec;
-	struct ib_cq *p_ib_cq;
-
-	// prepare parameters
-	event_rec.type = ev->event;
-	p_ib_cq = (struct ib_cq *)ev->element.cq;
-	event_rec.context = p_ib_cq->x.ctx;
-
-	// call the user callback
-	if (p_hca)
-		(p_hca->async_cb_p)(&event_rec);
-	else {
-		HCA_PRINT(TRACE_LEVEL_ERROR ,HCA_DBG_SHIM ,("Incorrect context. Async callback was not invoked\n"));
-	}
-}
-
 enum ib_rate to_rate(uint8_t rate)
 {
 	if (rate == IB_PATH_RECORD_RATE_2_5_GBS) return IB_RATE_2_5_GBPS;
diff -up -r -X trunk\docs\dontdiff.txt -I '\$Id:' trunk/hw/mlx4/kernel/hca/data.h branches\winverbs/hw/mlx4/kernel/hca/data.h
--- trunk/hw/mlx4/kernel/hca/data.h	2008-06-03 20:28:24.526000000 -0700
+++ branches\winverbs/hw/mlx4/kernel/hca/data.h	2008-06-03 20:31:24.604125000 -0700
@@ -155,7 +155,6 @@ typedef struct _mlnx_hca_t {
 	net64_t			guid;					// HCA node Guid
 	uint32_t			hw_ver;				// HCA HW version
 	// HOB
-	ci_completion_cb_t  comp_cb_p;
 	ci_async_event_cb_t async_cb_p;
 	const void          *ca_context;
 	void                *cl_device_h;
@@ -196,7 +195,6 @@ mlnx_hcas_init( void );
 ib_api_status_t
 mlnx_set_cb(
 	IN				mlnx_hca_t				*	p_hca, 
-	IN				ci_completion_cb_t			comp_cb_p,
 	IN				ci_async_event_cb_t			async_cb_p,
 	IN		const	void* const					ib_context);
 
@@ -229,16 +227,8 @@ fw_access_ctrl(
 
 void unmap_crspace_for_all( struct ib_ucontext *p_context );
 
-void cq_comp_handler(struct ib_cq *cq, void *context);
-
 void ca_event_handler(struct ib_event *ev, void *context);
 
-void srq_event_handler(struct ib_event *ev, void *context);
-
-void qp_event_handler(struct ib_event *ev, void *context);
-
-void cq_event_handler(struct ib_event *ev, void *context);
-
 ib_api_status_t
 to_qp_attr(
 	IN	 const	struct ib_qp *ib_qp_p,
diff -up -r -X trunk\docs\dontdiff.txt -I '\$Id:' trunk/hw/mlx4/kernel/hca/qp.c branches\winverbs/hw/mlx4/kernel/hca/qp.c
--- trunk/hw/mlx4/kernel/hca/qp.c	2008-06-03 20:28:24.541625000 -0700
+++ branches\winverbs/hw/mlx4/kernel/hca/qp.c	2008-06-03 20:31:24.619750000 -0700
@@ -87,6 +87,7 @@ __create_qp (
 	IN		const	ib_pd_handle_t				h_pd,
 	IN		const	uint8_t						port_num,
 	IN		const	void						*qp_uctx,
+	IN				ci_async_event_cb_t			event_handler,
 	IN		const	ib_qp_create_t				*p_create_attr,
 		OUT			ib_qp_attr_t				*p_qp_attr,
 		OUT			ib_qp_handle_t				*ph_qp,
@@ -118,7 +119,7 @@ __create_qp (
 
 	// prepare the parameters
 	RtlZeroMemory(&qp_init_attr, sizeof(qp_init_attr));
-	qp_init_attr.event_handler = qp_event_handler;
+	qp_init_attr.event_handler = event_handler;
 	qp_init_attr.qp_context = p_hca;
 	qp_init_attr.send_cq = (struct ib_cq *)p_create_attr->h_sq_cq;
 	qp_init_attr.recv_cq = (struct ib_cq *)p_create_attr->h_rq_cq;
@@ -186,6 +187,7 @@ mlnx_create_spl_qp (
 	IN		const	ib_pd_handle_t				h_pd,
 	IN		const	uint8_t						port_num,
 	IN		const	void						*qp_uctx,
+	IN				ci_async_event_cb_t			event_handler,
 	IN		const	ib_qp_create_t				*p_create_attr,
 		OUT			ib_qp_attr_t				*p_qp_attr,
 		OUT			ib_qp_handle_t				*ph_qp )
@@ -195,7 +197,7 @@ mlnx_create_spl_qp (
 	HCA_ENTER(HCA_DBG_SHIM);
 
 	status = __create_qp( h_pd, port_num,
-		qp_uctx, p_create_attr, p_qp_attr, ph_qp, NULL );
+		qp_uctx, event_handler, p_create_attr, p_qp_attr, ph_qp, NULL );
 		
 	if (status != IB_SUCCESS)
 		HCA_PRINT(TRACE_LEVEL_ERROR,HCA_DBG_QP,
@@ -208,6 +210,7 @@ ib_api_status_t
 mlnx_create_qp (
 	IN		const	ib_pd_handle_t				h_pd,
 	IN		const	void						*qp_uctx,
+	IN				ci_async_event_cb_t			event_handler,
 	IN		const	ib_qp_create_t				*p_create_attr,
 		OUT			ib_qp_attr_t				*p_qp_attr,
 		OUT			ib_qp_handle_t				*ph_qp,
@@ -223,7 +226,7 @@ mlnx_create_qp (
 	HCA_ENTER(HCA_DBG_QP);
 
 	status = __create_qp( h_pd, port_num,
-		qp_uctx, p_create_attr, p_qp_attr, ph_qp, p_umv_buf );
+		qp_uctx, event_handler, p_create_attr, p_qp_attr, ph_qp, p_umv_buf );
 		
 	if (status != IB_SUCCESS)
 		HCA_PRINT(TRACE_LEVEL_ERROR,HCA_DBG_QP,
diff -up -r -X trunk\docs\dontdiff.txt -I '\$Id:' trunk/hw/mlx4/kernel/hca/srq.c branches\winverbs/hw/mlx4/kernel/hca/srq.c
--- trunk/hw/mlx4/kernel/hca/srq.c	2008-06-03 20:28:24.541625000 -0700
+++ branches\winverbs/hw/mlx4/kernel/hca/srq.c	2008-06-03 20:31:24.635375000 -0700
@@ -44,6 +44,7 @@ ib_api_status_t
 mlnx_create_srq (
 	IN		const	ib_pd_handle_t			h_pd,
 	IN		const	void						*srq_context,
+	IN				ci_async_event_cb_t			event_handler,
 	IN		const	ib_srq_attr_t * const		p_srq_attr,
 		OUT			ib_srq_handle_t			*ph_srq,
 	IN	OUT			ci_umv_buf_t				*p_umv_buf )
@@ -73,7 +74,7 @@ mlnx_create_srq (
 
 	// prepare the parameters
 	RtlZeroMemory(&srq_init_attr, sizeof(srq_init_attr));
-	srq_init_attr.event_handler = srq_event_handler;
+	srq_init_attr.event_handler = event_handler;
 	srq_init_attr.srq_context = p_hca;
 	srq_init_attr.attr.max_wr = p_srq_attr->max_wr;
 	srq_init_attr.attr.max_sge = p_srq_attr->max_sge;
diff -up -r -X trunk\docs\dontdiff.txt -I '\$Id:' trunk/hw/mlx4/kernel/hca/verbs.c branches\winverbs/hw/mlx4/kernel/hca/verbs.c
--- trunk/hw/mlx4/kernel/hca/verbs.c	2008-06-03 20:28:24.557250000 -0700
+++ branches\winverbs/hw/mlx4/kernel/hca/verbs.c	2008-06-03 20:31:24.651000000 -0700
@@ -166,7 +166,7 @@ static void release_user_cq_qp_resources
 
 struct ib_cq *ibv_create_cq(struct ib_device *p_ibdev,
 			   ib_comp_handler comp_handler,
-			   void (*event_handler)(struct ib_event *, void *),
+			   void (*event_handler)(ib_event_rec_t *),
 			   void *cq_context, int cqe, 
 			   struct ib_ucontext *p_uctx, ci_umv_buf_t* const p_umv_buf)
 {
diff -up -r -X trunk\docs\dontdiff.txt -I '\$Id:' trunk/hw/mlx4/kernel/hca/verbs.h branches\winverbs/hw/mlx4/kernel/hca/verbs.h
--- trunk/hw/mlx4/kernel/hca/verbs.h	2008-06-03 20:28:24.572875000 -0700
+++ branches\winverbs/hw/mlx4/kernel/hca/verbs.h	2008-06-03 20:31:24.651000000 -0700
@@ -50,7 +50,7 @@ struct ib_mr *ibv_reg_mr(struct ib_pd *p
 
 struct ib_cq *ibv_create_cq(struct ib_device *p_ibdev,
 			   ib_comp_handler comp_handler,
-			   void (*event_handler)(struct ib_event *, void *),
+			   void (*event_handler)(ib_event_rec_t *),
 			   void *cq_context, int cqe, 
 			   struct ib_ucontext *p_uctx, ci_umv_buf_t* const p_umv_buf);
 
diff -up -r -X trunk\docs\dontdiff.txt -I '\$Id:' trunk/hw/mthca/kernel/hca_data.c branches\winverbs/hw/mthca/kernel/hca_data.c
--- trunk/hw/mthca/kernel/hca_data.c	2008-06-03 20:31:11.119750000 -0700
+++ branches\winverbs/hw/mthca/kernel/hca_data.c	2008-06-03 20:31:24.651000000 -0700
@@ -137,7 +137,6 @@ mlnx_hcas_init( void )
 ib_api_status_t
 mlnx_hobs_set_cb(
 	IN				mlnx_hob_t					*hob_p, 
-	IN				ci_completion_cb_t			comp_cb_p,
 	IN				ci_async_event_cb_t			async_cb_p,
 	IN		const	void* const					ib_context)
 {
@@ -162,7 +161,6 @@ mlnx_hobs_set_cb(
 		}
 	}
 
-	hob_p->comp_cb_p	= comp_cb_p;
 	hob_p->async_cb_p = async_cb_p;
 	hob_p->ca_context = ib_context; // This is the context our CB forwards to IBAL
 	HCA_PRINT(TRACE_LEVEL_INFORMATION, HCA_DBG_SHIM,("CL: hca_idx %d context 0x%p\n", (int)(hob_p - mlnx_hob_array),
ib_context));
@@ -185,7 +183,6 @@ mlnx_hobs_remove(
 	p_async_proc = hob_p->async_proc_mgr_p;
 	hob_p->async_proc_mgr_p = NULL;
 
-	hob_p->comp_cb_p = NULL;
 	hob_p->async_cb_p = NULL;
 	hob_p->ca_context = NULL;
 	hob_p->cl_device_h = NULL;
@@ -332,21 +329,6 @@ mlnx_conv_hca_cap(
 	}
 }
 
-void cq_comp_handler(struct ib_cq *cq, void *context)
-{
-	mlnx_hob_t *hob_p = (mlnx_hob_t *)context;
-	struct mthca_cq *mcq =(struct mthca_cq *)cq; 
-	HCA_ENTER(HCA_DBG_CQ);
-	if (hob_p && hob_p->comp_cb_p) {
-		HCA_PRINT(TRACE_LEVEL_INFORMATION ,HCA_DBG_CQ ,("Invoking completion callback\n"));
-		(hob_p->comp_cb_p)(mcq->cq_context);
-	}
-	else {
-		HCA_PRINT(TRACE_LEVEL_ERROR ,HCA_DBG_CQ ,("Incorrect context. Completion callback was not invoked\n"));
-	}
-	HCA_EXIT(HCA_DBG_CQ);
-}
-
 void ca_event_handler(struct ib_event *ev, void *context)
 {
 	mlnx_hob_t *hob_p = (mlnx_hob_t *)context;
@@ -370,66 +352,6 @@ void ca_event_handler(struct ib_event *e
 	}
 }
 
-void srq_event_handler(struct ib_event *ev, void *context)
-{
-	mlnx_hob_t *hob_p = (mlnx_hob_t *)context;
-	ib_event_rec_t event_rec;
-	struct mthca_srq *srq_p;
-
-	// prepare parameters
-	event_rec.type = ev->event;
-	event_rec.vendor_specific = ev->vendor_specific;
-	srq_p = (struct mthca_srq *)ev->element.srq;
-	event_rec.context = srq_p->srq_context;
-
-	// call the user callback
-	if (hob_p)
-		(hob_p->async_cb_p)(&event_rec);
-	else {
-		HCA_PRINT(TRACE_LEVEL_ERROR ,HCA_DBG_SHIM ,("Incorrect context. Async callback was not invoked\n"));
-	}
-}
-
-
-void qp_event_handler(struct ib_event *ev, void *context)
-{
-	mlnx_hob_t *hob_p = (mlnx_hob_t *)context;
-	ib_event_rec_t event_rec;
-	struct mthca_qp *qp_p;
-
-	// prepare parameters
-	event_rec.type = ev->event;
-	event_rec.vendor_specific = ev->vendor_specific;
-	qp_p = (struct mthca_qp *)ev->element.qp;
-	event_rec.context = qp_p->qp_context;
-
-	// call the user callback
-	if (hob_p)
-		(hob_p->async_cb_p)(&event_rec);
-	else {
-		HCA_PRINT(TRACE_LEVEL_ERROR ,HCA_DBG_SHIM ,("Incorrect context. Async callback was not invoked\n"));
-	}
-}
-
-void cq_event_handler(struct ib_event *ev, void *context)
-{
-	mlnx_hob_t *hob_p = (mlnx_hob_t *)context;
-	ib_event_rec_t event_rec;
-	struct mthca_cq *cq_p;
-
-	// prepare parameters
-	event_rec.type = ev->event;
-	cq_p = (struct mthca_cq *)ev->element.cq;
-	event_rec.context = cq_p->cq_context;
-
-	// call the user callback
-	if (hob_p)
-		(hob_p->async_cb_p)(&event_rec);
-	else {
-		HCA_PRINT(TRACE_LEVEL_ERROR ,HCA_DBG_SHIM ,("Incorrect context. Async callback was not invoked\n"));
-	}
-}
-
 ib_qp_state_t mlnx_qps_to_ibal(enum ib_qp_state qps)
 {
 #define MAP_QPS(val1,val2) case val1: ib_qps = val2; break
diff -up -r -X trunk\docs\dontdiff.txt -I '\$Id:' trunk/hw/mthca/kernel/hca_data.h branches\winverbs/hw/mthca/kernel/hca_data.h
--- trunk/hw/mthca/kernel/hca_data.h	2008-06-03 20:28:24.588500000 -0700
+++ branches\winverbs/hw/mthca/kernel/hca_data.h	2008-06-03 20:31:24.666625000 -0700
@@ -171,7 +171,6 @@ typedef struct _attr_cache
 
 typedef struct _ib_ca {
 	ENUM_MARK           mark;
-	ci_completion_cb_t  comp_cb_p;
 	ci_async_event_cb_t async_cb_p;
 	const void          *ca_context;
 	void                *cl_device_h;
@@ -275,7 +274,6 @@ mlnx_hobs_insert(
 ib_api_status_t
 mlnx_hobs_set_cb(
 	IN				mlnx_hob_t					*hob_p, 
-	IN				ci_completion_cb_t			comp_cb_p,
 	IN				ci_async_event_cb_t			async_cb_p,
 	IN		const	void* const					ib_context);
 
@@ -351,16 +349,8 @@ fw_access_ctrl(
 
 void unmap_crspace_for_all( struct ib_ucontext *p_context );
 
-void cq_comp_handler(struct ib_cq *cq, void *context);
-
 void ca_event_handler(struct ib_event *ev, void *context);
 
-void srq_event_handler(struct ib_event *ev, void *context);
-
-void qp_event_handler(struct ib_event *ev, void *context);
-
-void cq_event_handler(struct ib_event *ev, void *context);
-
 ib_qp_state_t mlnx_qps_to_ibal(enum ib_qp_state qps);
 
 enum ib_qp_state mlnx_qps_from_ibal(ib_qp_state_t ib_qps);
diff -up -r -X trunk\docs\dontdiff.txt -I '\$Id:' trunk/hw/mthca/kernel/hca_verbs.c branches\winverbs/hw/mthca/kernel/hca_verbs.c
--- trunk/hw/mthca/kernel/hca_verbs.c	2008-06-03 20:28:24.604125000 -0700
+++ branches\winverbs/hw/mthca/kernel/hca_verbs.c	2008-06-03 20:31:24.666625000 -0700
@@ -58,7 +58,6 @@ mlnx_query_qp (
 ib_api_status_t
 mlnx_open_ca (
 	IN		const	ib_net64_t					ca_guid, // IN  const char *
ca_name,
-	IN		const	ci_completion_cb_t			pfn_completion_cb,
 	IN		const	ci_async_event_cb_t			pfn_async_event_cb,
 	IN		const	void*const					ca_context,
 		OUT			ib_ca_handle_t FUNC_PTR64				*ph_ca)
@@ -91,7 +90,6 @@ mlnx_open_ca (
 	HCA_PRINT(TRACE_LEVEL_INFORMATION  ,HCA_DBG_SHIM,
 		("context 0x%p\n", ca_context));
 	status = mlnx_hobs_set_cb(&p_hca->hob,
-		pfn_completion_cb,
 		pfn_async_event_cb,
 		ca_context);
 	if (IB_SUCCESS != status) {
@@ -836,6 +834,7 @@ ib_api_status_t
 mlnx_create_srq (
 	IN		const	ib_pd_handle_t FUNC_PTR64			h_pd,
 	IN		const	void						*srq_context,
+	IN				ci_async_event_cb_t		event_handler,
 	IN		const	ib_srq_attr_t * const		p_srq_attr,
 		OUT			ib_srq_handle_t FUNC_PTR64			*ph_srq,
 	IN	OUT			ci_umv_buf_t				*p_umv_buf )
@@ -866,7 +865,7 @@ mlnx_create_srq (
 
 	// prepare the parameters
 	RtlZeroMemory(&srq_init_attr, sizeof(srq_init_attr));
-	srq_init_attr.event_handler = srq_event_handler;
+	srq_init_attr.event_handler = event_handler;
 	srq_init_attr.srq_context = hob_p;
 	srq_init_attr.attr = *p_srq_attr;
 
@@ -1003,6 +1002,7 @@ _create_qp (
 	IN		const	ib_pd_handle_t FUNC_PTR64				h_pd,
 	IN		const	uint8_t						port_num,
 	IN		const	void						*qp_context,
+	IN				ci_async_event_cb_t			event_handler,
 	IN		const	ib_qp_create_t				*p_create_attr,
 		OUT			ib_qp_attr_t				*p_qp_attr,
 		OUT			ib_qp_handle_t FUNC_PTR64				*ph_qp,
@@ -1034,7 +1034,7 @@ _create_qp (
 	// prepare the parameters
 	RtlZeroMemory(&qp_init_attr, sizeof(qp_init_attr));
 	qp_init_attr.qp_type = p_create_attr->qp_type;
-	qp_init_attr.event_handler = qp_event_handler;
+	qp_init_attr.event_handler = event_handler;
 	qp_init_attr.qp_context = hob_p;
 	qp_init_attr.recv_cq = (struct ib_cq *)p_create_attr->h_rq_cq;
 	qp_init_attr.send_cq = (struct ib_cq *)p_create_attr->h_sq_cq;
@@ -1096,6 +1096,7 @@ mlnx_create_spl_qp (
 	IN		const	ib_pd_handle_t FUNC_PTR64				h_pd,
 	IN		const	uint8_t						port_num,
 	IN		const	void						*qp_context,
+	IN				ci_async_event_cb_t			event_handler,
 	IN		const	ib_qp_create_t				*p_create_attr,
 		OUT			ib_qp_attr_t				*p_qp_attr,
 		OUT			ib_qp_handle_t FUNC_PTR64				*ph_qp )
@@ -1106,7 +1107,7 @@ mlnx_create_spl_qp (
 	HCA_ENTER(HCA_DBG_SHIM);
 
 	status =	_create_qp( h_pd, port_num,
-		qp_context, p_create_attr, p_qp_attr, ph_qp, NULL );
+		qp_context, event_handler, p_create_attr, p_qp_attr, ph_qp, NULL );
 		
 	if (status != IB_SUCCESS)
 	{
@@ -1121,6 +1122,7 @@ ib_api_status_t
 mlnx_create_qp (
 	IN		const	ib_pd_handle_t FUNC_PTR64				h_pd,
 	IN		const	void						*qp_context,
+	IN				ci_async_event_cb_t			event_handler,
 	IN		const	ib_qp_create_t				*p_create_attr,
 		OUT			ib_qp_attr_t				*p_qp_attr,
 		OUT			ib_qp_handle_t FUNC_PTR64				*ph_qp,
@@ -1137,7 +1139,7 @@ mlnx_create_qp (
 	HCA_ENTER(HCA_DBG_QP);
 
 	status = _create_qp( h_pd, port_num,
-		qp_context, p_create_attr, p_qp_attr, ph_qp, p_umv_buf );
+		qp_context, event_handler, p_create_attr, p_qp_attr, ph_qp, p_umv_buf );
 		
 	if (status != IB_SUCCESS)
 	{
@@ -1362,6 +1364,8 @@ ib_api_status_t
 mlnx_create_cq (
 	IN		const	ib_ca_handle_t FUNC_PTR64				h_ca,
 	IN		const	void						*cq_context,
+	IN				ci_async_event_cb_t			event_handler,
+	IN				ci_completion_cb_t			cq_comp_handler,
 	IN	OUT			uint32_t					*p_size,
 		OUT			ib_cq_handle_t FUNC_PTR64				*ph_cq,
 	IN	OUT			ci_umv_buf_t				*p_umv_buf )
@@ -1404,7 +1408,7 @@ mlnx_create_cq (
 
 	// allocate cq	
 	ib_cq_p = ibv_create_cq(ib_dev, 
-		cq_comp_handler, cq_event_handler,
+		cq_comp_handler, event_handler,
 		hob_p, *p_size, p_context, p_umv_buf );
 	if (IS_ERR(ib_cq_p)) {
 		err = PTR_ERR(ib_cq_p);
diff -up -r -X trunk\docs\dontdiff.txt -I '\$Id:' trunk/hw/mthca/kernel/ib_verbs.h branches\winverbs/hw/mthca/kernel/ib_verbs.h
--- trunk/hw/mthca/kernel/ib_verbs.h	2008-06-03 20:28:24.619750000 -0700
+++ branches\winverbs/hw/mthca/kernel/ib_verbs.h	2008-06-03 20:31:24.682250000 -0700
@@ -308,7 +308,7 @@ enum ib_cq_notify {
 };
 
 struct ib_srq_init_attr {
-	void					(*event_handler)(struct ib_event *, void *);
+	void					(*event_handler)(ib_event_rec_t *);
 	void					*srq_context;
 	ib_srq_attr_t			attr;
 };
@@ -327,7 +327,7 @@ enum ib_sig_type {
 };
 
 struct ib_qp_init_attr {
-	void                  (*event_handler)(struct ib_event *, void *);
+	void                  (*event_handler)(ib_event_rec_t *);
 	void		       *qp_context;
 	struct ib_cq	       *send_cq;
 	struct ib_cq	       *recv_cq;
@@ -546,14 +546,14 @@ struct ib_ah {
 	struct ib_ucontext      *ucontext;
 };
 
-typedef void (*ib_comp_handler)(struct ib_cq *cq, void *cq_context);
+typedef void (*ib_comp_handler)(void *cq_context);
 
 struct ib_cq {
 	struct ib_device       *device;
 	struct ib_ucontext	*ucontext;
 	struct ib_mr *ib_mr;
 	ib_comp_handler   	comp_handler;
-	void                  (*event_handler)(struct ib_event *, void *);
+	void					(*event_handler)(ib_event_rec_t *);
 	void *            	cq_context;
 	int               	cqe;
 	atomic_t          	usecnt; /* count number of work queues */
@@ -564,7 +564,7 @@ struct ib_srq {
 	struct ib_pd	       *pd;
 	struct ib_ucontext	*ucontext;
 	struct ib_mr *ib_mr;
-	void		      (*event_handler)(struct ib_event *, void *);
+	void					(*event_handler)(ib_event_rec_t *);
 	void		       *srq_context;
 	atomic_t          	usecnt; /* count number of work queues */
 };
@@ -577,7 +577,7 @@ struct ib_qp {
 	struct ib_srq	       *srq;
 	struct ib_ucontext	*ucontext;
 	struct ib_mr *ib_mr;
-	void                  (*event_handler)(struct ib_event *, void *);
+	void					(*event_handler)(ib_event_rec_t *);
 	void		       *qp_context;
 	u32			qp_num;
 	enum ib_qp_type_t		qp_type;
@@ -1055,7 +1055,7 @@ static inline int ib_post_recv(struct ib
  */
 struct ib_cq *ibv_create_cq(struct ib_device *device,
 			   ib_comp_handler comp_handler,
-			   void (*event_handler)(struct ib_event *, void *),
+			   void (*event_handler)(ib_event_rec_t *),
 			   void *cq_context, int cqe, 
 			   struct ib_ucontext *context, ci_umv_buf_t* const p_umv_buf);
 
diff -up -r -X trunk\docs\dontdiff.txt -I '\$Id:' trunk/hw/mthca/kernel/mt_verbs.c branches\winverbs/hw/mthca/kernel/mt_verbs.c
--- trunk/hw/mthca/kernel/mt_verbs.c	2008-06-03 20:28:24.635375000 -0700
+++ branches\winverbs/hw/mthca/kernel/mt_verbs.c	2008-06-03 20:31:24.682250000 -0700
@@ -580,7 +580,7 @@ int ibv_destroy_qp(struct ib_qp *qp)
 
 struct ib_cq *ibv_create_cq(struct ib_device *device,
 			   ib_comp_handler comp_handler,
-			   void (*event_handler)(struct ib_event *, void *),
+			   void (*event_handler)(ib_event_rec_t *),
 			   void *cq_context, int cqe, 
 			   struct ib_ucontext *context, ci_umv_buf_t* const p_umv_buf)
 {
diff -up -r -X trunk\docs\dontdiff.txt -I '\$Id:' trunk/hw/mthca/kernel/mthca_cq.c branches\winverbs/hw/mthca/kernel/mthca_cq.c
--- trunk/hw/mthca/kernel/mthca_cq.c	2008-06-03 20:28:24.651000000 -0700
+++ branches\winverbs/hw/mthca/kernel/mthca_cq.c	2008-06-03 20:31:24.682250000 -0700
@@ -237,14 +237,14 @@ void mthca_cq_completion(struct mthca_de
 			++cq->arm_sn;
 	}
 
-	cq->ibcq.comp_handler(&cq->ibcq, cq->ibcq.cq_context);
+	cq->ibcq.comp_handler(cq->cq_context);
 }
 
 void mthca_cq_event(struct mthca_dev *dev, u32 cqn,
 		    enum ib_event_type event_type)
 {
 	struct mthca_cq *cq;
-	struct ib_event event;
+	ib_event_rec_t event;
 	SPIN_LOCK_PREP(lh);
 
 	spin_lock(&dev->cq_table.lock, &lh);
@@ -260,11 +260,10 @@ void mthca_cq_event(struct mthca_dev *de
 		return;
 	}
 
-	event.device      = &dev->ib_dev;
-	event.event       = event_type;
-	event.element.cq  = &cq->ibcq;
-	if (cq->ibcq.event_handler)
-		cq->ibcq.event_handler(&event, cq->ibcq.cq_context);
+	event.type = event_type;
+	event.context = cq->ibcq.cq_context;
+	event.vendor_specific = 0;
+	cq->ibcq.event_handler(&event);
 
 	if (atomic_dec_and_test(&cq->refcount))
 		wake_up(&cq->wait);
diff -up -r -X trunk\docs\dontdiff.txt -I '\$Id:' trunk/hw/mthca/kernel/mthca_qp.c branches\winverbs/hw/mthca/kernel/mthca_qp.c
--- trunk/hw/mthca/kernel/mthca_qp.c	2008-06-03 20:28:24.666625000 -0700
+++ branches\winverbs/hw/mthca/kernel/mthca_qp.c	2008-06-03 20:31:24.697875000 -0700
@@ -391,7 +391,7 @@ void mthca_qp_event(struct mthca_dev *de
 		    enum ib_event_type event_type, u8 vendor_code)
 {
 	struct mthca_qp *qp;
-	struct ib_event event;
+	ib_event_rec_t event;
 	SPIN_LOCK_PREP(lh);
 
 	spin_lock(&dev->qp_table.lock, &lh);
@@ -405,14 +405,12 @@ void mthca_qp_event(struct mthca_dev *de
 		return;
 	}
 
-	event.device      = &dev->ib_dev;
-	event.event       = event_type;
-	event.element.qp  = &qp->ibqp;
+	event.type = event_type;
+	event.context = qp->ibqp.qp_context;
 	event.vendor_specific = vendor_code;
 	HCA_PRINT(TRACE_LEVEL_WARNING,HCA_DBG_QP,("QP %06x Async event  event_type 0x%x vendor_code 0x%x\n",
 		qpn,event_type,vendor_code));
-	if (qp->ibqp.event_handler)
-		qp->ibqp.event_handler(&event, qp->ibqp.qp_context);
+	qp->ibqp.event_handler(&event);
 
 	if (atomic_dec_and_test(&qp->refcount))
 		wake_up(&qp->wait);
diff -up -r -X trunk\docs\dontdiff.txt -I '\$Id:' trunk/hw/mthca/kernel/mthca_srq.c branches\winverbs/hw/mthca/kernel/mthca_srq.c
--- trunk/hw/mthca/kernel/mthca_srq.c	2008-06-03 20:28:24.666625000 -0700
+++ branches\winverbs/hw/mthca/kernel/mthca_srq.c	2008-06-03 20:31:24.697875000 -0700
@@ -432,7 +432,7 @@ void mthca_srq_event(struct mthca_dev *d
 		     enum ib_event_type event_type, u8 vendor_code)
 {
 	struct mthca_srq *srq;
-	struct ib_event event;
+	ib_event_rec_t event;
 	SPIN_LOCK_PREP(lh);
 
 	spin_lock(&dev->srq_table.lock, &lh);
@@ -449,15 +449,13 @@ void mthca_srq_event(struct mthca_dev *d
 	if (!srq->ibsrq.event_handler)
 		goto out;
 
-	event.device      = &dev->ib_dev;
-	event.event       = event_type;
-	event.element.srq = &srq->ibsrq;
+	event.type = event_type;
+	event.context = srq->ibsrq.srq_context;
 	event.vendor_specific = vendor_code;
 	HCA_PRINT(TRACE_LEVEL_WARNING,HCA_DBG_SRQ,
 		("SRQ %06x Async event  event_type 0x%x vendor_code 0x%x\n",
 		srqn,event_type,vendor_code));
-	if (srq->ibsrq.event_handler)
-		srq->ibsrq.event_handler(&event, srq->ibsrq.srq_context);
+	srq->ibsrq.event_handler(&event);
 
 out:
 	if (atomic_dec_and_test(&srq->refcount))
diff -up -r -X trunk\docs\dontdiff.txt -I '\$Id:' trunk/inc/iba/ib_ci.h branches\winverbs/inc/iba/ib_ci.h
--- trunk/inc/iba/ib_ci.h	2008-06-03 20:28:24.682250000 -0700
+++ branches\winverbs/inc/iba/ib_ci.h	2008-06-03 20:31:24.713500000 -0700
@@ -161,11 +161,11 @@ typedef void
 * RETURN VALUE
 *	None
 * NOTES
-*	The consumer only gets the cq_context and ca_context. It is the client
+*	The consumer only gets the cq_context. It is the client
 *	responsibility to store the cq_handle in the context after the creation
 *	time. So it can call ci_poll_cq() after the arrival of the notification.
 * SEE ALSO
-*	ci_open_ca, ci_create_cq
+*	ci_create_cq
 ******
 */
 
@@ -181,7 +181,7 @@ typedef void
 */
 typedef void
 (*ci_async_event_cb_t)(
-	IN	const	ib_event_rec_t* const			p_event_record );
+	IN		ib_event_rec_t*		p_event_record );
 /*
 * PARAMETERS
 *	p_event_record
@@ -204,7 +204,6 @@ typedef void
 typedef ib_api_status_t
 (*ci_open_ca) (
 	IN		const	ib_net64_t					ca_guid,
-	IN		const	ci_completion_cb_t			pfn_completion_cb,
 	IN		const	ci_async_event_cb_t			pfn_async_event_cb,
 	IN		const	void* const					ca_context,
 		OUT			ib_ca_handle_t FUNC_PTR64				*ph_ca );
@@ -222,8 +221,6 @@ typedef ib_api_status_t
 *		guids in a system, e.g. GetCaGuids(), maintained by the IB
 *		Access Layer. User mode consumers also have the same mechanism
 *		to retrieve this information.
-*	pfn_completion_cb
-*		[in] Completion Handler, one per open instance.
 *	pfn_async_event_cb
 *		[in] Asynchronous event handler, one per open instance.
 *	ca_context
@@ -707,6 +704,7 @@ typedef ib_api_status_t
 (*ci_create_srq) (
 	IN		const	ib_pd_handle_t FUNC_PTR64			h_pd,
 	IN		const	void						*srq_context,
+	IN		const	ci_async_event_cb_t			pfn_async_event_cb,
 	IN		const	ib_srq_attr_t * const		p_srq_attr,
 		OUT			ib_srq_handle_t FUNC_PTR64			*ph_srq,
 	IN	OUT			ci_umv_buf_t				*p_umv_buf OPTIONAL );
@@ -720,6 +718,8 @@ typedef ib_api_status_t
 *		[in] Handle to Protection Domain
 *	srq_context
 *		[in] A user specified context passed in a asynchronous error callback.
+*	pfn_async_event_cb
+*		[in] Asynchronous event handler.
 *	p_srq_attr
 *		[in out] Initial attributes with which the srq must be created.
 *	ph_srq
@@ -890,6 +890,7 @@ typedef ib_api_status_t
 (*ci_create_qp) (
 	IN		const	ib_pd_handle_t FUNC_PTR64				h_pd,
 	IN		const	void						*qp_context,
+	IN		const	ci_async_event_cb_t			pfn_async_event_cb,
 	IN		const	ib_qp_create_t				*p_create_attr,
 		OUT			ib_qp_attr_t				*p_qp_attr,
 		OUT			ib_qp_handle_t FUNC_PTR64				*ph_qp,
@@ -905,6 +906,8 @@ typedef ib_api_status_t
 *		[in] Handle to Protection Domain
 *	qp_context
 *		[in] A user specified context passed in a asynchronous error callback.
+*	pfn_async_event_cb
+*		[in] Asynchronous event handler.
 *	p_create_attr
 *		[in] Initial attributes with which the qp must be created.
 *	p_qp_attr
@@ -953,6 +956,7 @@ typedef ib_api_status_t
 	IN		const	ib_pd_handle_t FUNC_PTR64		h_pd,
 	IN		const	uint8_t				port_num,
 	IN		const	void				*qp_context,
+	IN		const	ci_async_event_cb_t			pfn_async_event_cb,
 	IN		const	ib_qp_create_t		*p_create_attr,
 		OUT			ib_qp_attr_t		*p_qp_attr,
 		OUT			ib_qp_handle_t FUNC_PTR64		*ph_qp );
@@ -969,6 +973,8 @@ typedef ib_api_status_t
 *	qp_context
 *		[in] User specified context passed during the async error callback
 *		routine.
+*	pfn_async_event_cb
+*		[in] Asynchronous event handler.
 *	p_create_attr
 *		[in] Initial set of attributes with which the queue pair is to be
 *		created.
@@ -1217,6 +1223,8 @@ typedef ib_api_status_t
 (*ci_create_cq) (
 	IN		const	ib_ca_handle_t FUNC_PTR64				h_ca,
 	IN		const	void						*cq_context,
+	IN		const	ci_async_event_cb_t			pfn_async_event_cb,
+	IN				ci_completion_cb_t			completion_cb,
 	IN	OUT			uint32_t* const				p_size,
 		OUT			ib_cq_handle_t FUNC_PTR64				*ph_cq,
 	IN	OUT			ci_umv_buf_t				*p_umv_buf OPTIONAL );
@@ -1231,6 +1239,10 @@ typedef ib_api_status_t
 *		[in] A handle to the open HCA
 *	cq_context
 *		[in] The context that is passed during the completion callbacks.
+*	pfn_async_event_cb
+*		[in] Asynchronous event handler.
+*	completion_cb
+*		[in] Callback for completion events
 *	p_size
 *		[in out] Points to a variable containing the number of CQ entries
 *		requested by the consumer. On completion points to the size of the





More information about the ofw mailing list