1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
24  */
25 
26 #ifndef _SYS_IB_CLIENTS_OF_SOL_OFS_SOL_KVERB_IMPL_H
27 #define	_SYS_IB_CLIENTS_OF_SOL_OFS_SOL_KVERB_IMPL_H
28 
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32 
33 #include <sys/ib/ibtl/ibvti.h>
34 
35 /*
36  * If there is yet an active async event, hdl is not freed. However,
37  * if the device state is IB_DEV_CLOSE, the device is about to be closed
38  * so that the event should be discarded.
39  */
40 #define	FIRE_QP_EVENT(clnt, hdl, ib_event, qpp, type)			\
41 		rw_enter(&clnt->lock, RW_READER);			\
42 		if (qpp && qpp->event_handler &&			\
43 		    qpp->device->reg_state == IB_DEV_OPEN) {		\
44 			ib_event.device = qpp->device;			\
45 			ib_event.event = type;				\
46 			ib_event.element.qp = qpp;			\
47 			qpp->event_handler(&ib_event, qpp->qp_context);	\
48 		}							\
49 		rw_exit(&clnt->lock)
50 
51 #define	FIRE_CQ_EVENT(clnt, hdl, ib_event, cqp, type)			\
52 		rw_enter(&clnt->lock, RW_READER);			\
53 		if (cqp && cqp->event_handler &&			\
54 		    cqp->device->reg_state == IB_DEV_OPEN) {		\
55 			ib_event.device = cqp->device;			\
56 			ib_event.event = type;				\
57 			ib_event.element.cq = cqp;			\
58 			cqp->event_handler(&ib_event, cqp->cq_context);	\
59 		}							\
60 		rw_exit(&clnt->lock)
61 
62 #define	IBTF2OF_PGSZ(hca_page_sz)	((hca_page_sz) << 10)
63 #define	OF2IBTF_STATE(s)		((enum ibt_cep_state_e)(s))
64 #define	OF2IBTF_SRATE(r)		((enum ibt_srate_e)(r))
65 #define	OF2IBTF_PATH_MIG_STATE(s)	((ibt_cep_cmstate_t)((s)+1))
66 #define	OF2IBTF_PATH_MTU(m)		((ib_mtu_t)(m))
67 
68 typedef unsigned int gfp_t;
69 
70 typedef struct sol_ofs_client_s {
71 	ib_client_t		*ib_client;
72 	ibt_clnt_modinfo_t	ibt_client;
73 	ibt_clnt_hdl_t		ibt_hdl;
74 	uint_t			hca_num;
75 	uint_t			hca_open_num;
76 	llist_head_t		device_list;
77 	llist_head_t		client_list;
78 	krwlock_t		lock;
79 	enum {
80 				IB_OFS_CLNT_UNINITIALIZED,
81 				IB_OFS_CLNT_INITIALIZED
82 	} state;
83 } ofs_client_t;
84 
85 #ifdef	__cplusplus
86 }
87 #endif
88 
89 #endif	/* _SYS_IB_CLIENTS_OF_SOL_OFS_SOL_KVERB_IMPL_H */
90