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
30extern "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
68typedef unsigned int gfp_t;
69
70typedef 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