19e39c5baSBill Taylor /*
29e39c5baSBill Taylor  * CDDL HEADER START
39e39c5baSBill Taylor  *
49e39c5baSBill Taylor  * The contents of this file are subject to the terms of the
59e39c5baSBill Taylor  * Common Development and Distribution License (the "License").
69e39c5baSBill Taylor  * You may not use this file except in compliance with the License.
79e39c5baSBill Taylor  *
89e39c5baSBill Taylor  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
99e39c5baSBill Taylor  * or http://www.opensolaris.org/os/licensing.
109e39c5baSBill Taylor  * See the License for the specific language governing permissions
119e39c5baSBill Taylor  * and limitations under the License.
129e39c5baSBill Taylor  *
139e39c5baSBill Taylor  * When distributing Covered Code, include this CDDL HEADER in each
149e39c5baSBill Taylor  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
159e39c5baSBill Taylor  * If applicable, add the following below this CDDL HEADER, with the
169e39c5baSBill Taylor  * fields enclosed by brackets "[]" replaced with your own identifying
179e39c5baSBill Taylor  * information: Portions Copyright [yyyy] [name of copyright owner]
189e39c5baSBill Taylor  *
199e39c5baSBill Taylor  * CDDL HEADER END
209e39c5baSBill Taylor  */
219e39c5baSBill Taylor 
229e39c5baSBill Taylor /*
23*05c0d196SBill Taylor  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
249e39c5baSBill Taylor  * Use is subject to license terms.
259e39c5baSBill Taylor  */
269e39c5baSBill Taylor 
279e39c5baSBill Taylor #ifndef	_DAPL_H_
289e39c5baSBill Taylor #define	_DAPL_H_
299e39c5baSBill Taylor 
309e39c5baSBill Taylor #ifdef __cplusplus
319e39c5baSBill Taylor extern "C" {
329e39c5baSBill Taylor #endif
339e39c5baSBill Taylor 
349e39c5baSBill Taylor #define	DAPLKA_VERSION		(1)
359e39c5baSBill Taylor #define	DAPLKA_TQ_NTHREADS	16
369e39c5baSBill Taylor #define	DAPLKA_STATE_DETACHED	0x0000
379e39c5baSBill Taylor #define	DAPLKA_STATE_ATTACHED	0x0001
389e39c5baSBill Taylor 
399e39c5baSBill Taylor /*
409e39c5baSBill Taylor  * HCA structure
419e39c5baSBill Taylor  */
429e39c5baSBill Taylor typedef struct daplka_hca {
439e39c5baSBill Taylor 	ib_guid_t		hca_guid;
449e39c5baSBill Taylor 	ibt_hca_hdl_t		hca_hdl;
459e39c5baSBill Taylor 	ibt_hca_attr_t		hca_attr;
469e39c5baSBill Taylor 	uint32_t		hca_nports;
479e39c5baSBill Taylor 	ibt_hca_portinfo_t	*hca_ports;
489e39c5baSBill Taylor 	size_t			hca_pinfosz;
499e39c5baSBill Taylor 	uint32_t		hca_qp_count;
509e39c5baSBill Taylor 	uint32_t		hca_cq_count;
519e39c5baSBill Taylor 	uint32_t		hca_pd_count;
529e39c5baSBill Taylor 	uint32_t		hca_mw_count;
539e39c5baSBill Taylor 	uint32_t		hca_mr_count;
549e39c5baSBill Taylor 	uint32_t		hca_srq_count;
559e39c5baSBill Taylor 	int			hca_ref_cnt;
569e39c5baSBill Taylor 	struct daplka_hca	*hca_next;
579e39c5baSBill Taylor } daplka_hca_t;
589e39c5baSBill Taylor _NOTE(SCHEME_PROTECTS_DATA("daplka", daplka_hca))
599e39c5baSBill Taylor 
609e39c5baSBill Taylor /*
619e39c5baSBill Taylor  * Per-Device instance state information.
629e39c5baSBill Taylor  */
639e39c5baSBill Taylor typedef struct daplka {
649e39c5baSBill Taylor 	kmutex_t		daplka_mutex;
659e39c5baSBill Taylor 	dev_info_t		*daplka_dip;
669e39c5baSBill Taylor 	ibt_clnt_hdl_t		daplka_clnt_hdl;
679e39c5baSBill Taylor 	daplka_hca_t		*daplka_hca_list_head;
689e39c5baSBill Taylor 	uint32_t		daplka_status;
699e39c5baSBill Taylor } daplka_t;
709e39c5baSBill Taylor 
719e39c5baSBill Taylor /*
729e39c5baSBill Taylor  * generic hash table
739e39c5baSBill Taylor  */
749e39c5baSBill Taylor typedef struct daplka_hash_entry {
759e39c5baSBill Taylor 	uint64_t			he_hkey;
769e39c5baSBill Taylor 	void				*he_objp;
779e39c5baSBill Taylor 	struct daplka_hash_entry	*he_next;
789e39c5baSBill Taylor } daplka_hash_entry_t;
799e39c5baSBill Taylor 
809e39c5baSBill Taylor typedef struct daplka_hash_bucket {
819e39c5baSBill Taylor 	uint32_t			hb_count;
829e39c5baSBill Taylor 	daplka_hash_entry_t		*hb_entries;
839e39c5baSBill Taylor } daplka_hash_bucket_t;
849e39c5baSBill Taylor 
859e39c5baSBill Taylor typedef struct daplka_hash_table {
869e39c5baSBill Taylor 	boolean_t			ht_initialized;
879e39c5baSBill Taylor 	uint32_t			ht_count;
889e39c5baSBill Taylor 	uint32_t			ht_nbuckets;
899e39c5baSBill Taylor 	uint64_t			ht_next_hkey;
909e39c5baSBill Taylor 	krwlock_t			ht_table_lock;
919e39c5baSBill Taylor 	kmutex_t			ht_key_lock;
929e39c5baSBill Taylor 	daplka_hash_bucket_t		*ht_buckets;
939e39c5baSBill Taylor 	void				(*ht_free_func)(void *);
949e39c5baSBill Taylor 	void				(*ht_lookup_func)(void *);
959e39c5baSBill Taylor } daplka_hash_table_t;
969e39c5baSBill Taylor _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_hash_entry))
979e39c5baSBill Taylor _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_hash_bucket))
989e39c5baSBill Taylor _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_hash_table))
999e39c5baSBill Taylor _NOTE(MUTEX_PROTECTS_DATA(daplka_hash_table::ht_key_lock,
1009e39c5baSBill Taylor     daplka_hash_table::ht_next_hkey))
1019e39c5baSBill Taylor _NOTE(RWLOCK_PROTECTS_DATA(daplka_hash_table::ht_table_lock,
1029e39c5baSBill Taylor     daplka_hash_table::ht_buckets
1039e39c5baSBill Taylor     daplka_hash_table::ht_count))
1049e39c5baSBill Taylor 
1059e39c5baSBill Taylor /*
1069e39c5baSBill Taylor  * resource structure header
1079e39c5baSBill Taylor  */
1089e39c5baSBill Taylor typedef struct daplka_resource {
1099e39c5baSBill Taylor 	uint_t			rs_type;
1109e39c5baSBill Taylor 	minor_t			rs_rnum;
1119e39c5baSBill Taylor 	kmutex_t 		rs_reflock;
1129e39c5baSBill Taylor 	uint32_t		rs_refcnt;
1139e39c5baSBill Taylor 	uint32_t		rs_charged;
1149e39c5baSBill Taylor 	int			(*rs_free)(struct daplka_resource *);
1159e39c5baSBill Taylor } daplka_resource_t;
1169e39c5baSBill Taylor _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_resource))
1179e39c5baSBill Taylor _NOTE(SCHEME_PROTECTS_DATA("daplka", daplka_resource::rs_charged))
1189e39c5baSBill Taylor _NOTE(MUTEX_PROTECTS_DATA(daplka_resource::rs_reflock,
1199e39c5baSBill Taylor     daplka_resource::rs_refcnt))
1209e39c5baSBill Taylor 
1219e39c5baSBill Taylor #define	DAPLKA_EP_HTBL_SZ	128
1229e39c5baSBill Taylor #define	DAPLKA_MR_HTBL_SZ	64
1239e39c5baSBill Taylor #define	DAPLKA_MW_HTBL_SZ	64
1249e39c5baSBill Taylor #define	DAPLKA_PD_HTBL_SZ	32
1259e39c5baSBill Taylor #define	DAPLKA_SP_HTBL_SZ	32
1269e39c5baSBill Taylor #define	DAPLKA_EVD_HTBL_SZ	32
1279e39c5baSBill Taylor #define	DAPLKA_G_SP_HTBL_SZ	512
1289e39c5baSBill Taylor #define	DAPLKA_TIMER_HTBL_SZ	512
1299e39c5baSBill Taylor #define	DAPLKA_CNO_HTBL_SZ	16
1309e39c5baSBill Taylor #define	DAPLKA_SRQ_HTBL_SZ	32
1319e39c5baSBill Taylor 
1329e39c5baSBill Taylor typedef struct daplka_async_evd_hkey_s {
1339e39c5baSBill Taylor 	struct daplka_async_evd_hkey_s	*aeh_next;
1349e39c5baSBill Taylor 	uint64_t			aeh_evd_hkey;
1359e39c5baSBill Taylor } daplka_async_evd_hkey_t;
1369e39c5baSBill Taylor _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_async_evd_hkey_s))
1379e39c5baSBill Taylor 
1389e39c5baSBill Taylor /*
1399e39c5baSBill Taylor  * Various states IA can be in, this is primarily for handling race
1409e39c5baSBill Taylor  * between MW allocation and MR cleanup callback.
1419e39c5baSBill Taylor  */
1429e39c5baSBill Taylor typedef enum daplka_ia_state_e {
1439e39c5baSBill Taylor 	DAPLKA_IA_INIT = 0,
1449e39c5baSBill Taylor 	DAPLKA_IA_MW_ALLOC_IN_PROGRESS,
1459e39c5baSBill Taylor 	DAPLKA_IA_MW_FREEZE_IN_PROGRESS,
1469e39c5baSBill Taylor 	DAPLKA_IA_MW_FROZEN
1479e39c5baSBill Taylor } daplka_ia_state_t;
1489e39c5baSBill Taylor 
1499e39c5baSBill Taylor typedef struct daplka_ia_resource {
1509e39c5baSBill Taylor 	daplka_resource_t	header;
1519e39c5baSBill Taylor 	kmutex_t		ia_lock;
1529e39c5baSBill Taylor 	kcondvar_t		ia_cv;
1539e39c5baSBill Taylor 	daplka_ia_state_t	ia_state;
1549e39c5baSBill Taylor 	ibt_hca_hdl_t		ia_hca_hdl;
1559e39c5baSBill Taylor 	ib_gid_t		ia_hca_sgid;
1569e39c5baSBill Taylor 	daplka_hca_t		*ia_hca;
1579e39c5baSBill Taylor 	uint8_t			ia_port_num;
1589e39c5baSBill Taylor 	uint32_t		ia_port_pkey;
1599e39c5baSBill Taylor 	pid_t			ia_pid;
1609e39c5baSBill Taylor 	uint32_t		ia_mw_alloccnt; /* # mw allocs in progress */
1619e39c5baSBill Taylor 	daplka_async_evd_hkey_t	*ia_async_evd_hkeys; /* hash key of async evd */
1629e39c5baSBill Taylor 	daplka_hash_table_t	ia_ep_htbl;
1639e39c5baSBill Taylor 	daplka_hash_table_t	ia_mr_htbl;
1649e39c5baSBill Taylor 	daplka_hash_table_t	ia_mw_htbl;
1659e39c5baSBill Taylor 	daplka_hash_table_t	ia_pd_htbl;
1669e39c5baSBill Taylor 	daplka_hash_table_t	ia_evd_htbl;
1679e39c5baSBill Taylor 	daplka_hash_table_t	ia_sp_htbl;
1689e39c5baSBill Taylor 	daplka_hash_table_t	ia_cno_htbl;
1699e39c5baSBill Taylor 	daplka_hash_table_t	ia_srq_htbl;
1709e39c5baSBill Taylor 	uint8_t			ia_sadata[DAPL_ATS_NBYTES]; /* SA data */
1719e39c5baSBill Taylor 	boolean_t		ia_ar_registered;
1729e39c5baSBill Taylor } daplka_ia_resource_t;
1739e39c5baSBill Taylor _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_ia_resource))
1749e39c5baSBill Taylor _NOTE(MUTEX_PROTECTS_DATA(daplka_ia_resource::ia_lock,
1759e39c5baSBill Taylor     daplka_ia_resource::ia_cv
1769e39c5baSBill Taylor     daplka_ia_resource::ia_async_evd_hkeys
1779e39c5baSBill Taylor     daplka_ia_resource::ia_mw_alloccnt
1789e39c5baSBill Taylor     daplka_ia_resource::ia_state
1799e39c5baSBill Taylor     daplka_async_evd_hkey_s))
1809e39c5baSBill Taylor 
1819e39c5baSBill Taylor typedef struct daplka_pd_resource {
1829e39c5baSBill Taylor 	daplka_resource_t	header;
1839e39c5baSBill Taylor 	daplka_hca_t		*pd_hca;
1849e39c5baSBill Taylor 	ibt_hca_hdl_t		pd_hca_hdl;
1859e39c5baSBill Taylor 	ibt_pd_hdl_t		pd_hdl;
1869e39c5baSBill Taylor } daplka_pd_resource_t;
1879e39c5baSBill Taylor _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_pd_resource))
1889e39c5baSBill Taylor 
1899e39c5baSBill Taylor /*
1909e39c5baSBill Taylor  * Passive side EP cookies - this is generated at the connection request
1919e39c5baSBill Taylor  * time and unique for every CR. It gets associated with the EP that
1929e39c5baSBill Taylor  * is passed to the CR accept.
1939e39c5baSBill Taylor  *
1949e39c5baSBill Taylor  * daplka_psep_cookie contains the following information
1959e39c5baSBill Taylor  *   - 48 bit timestamp (unit = 1/10us)
1969e39c5baSBill Taylor  *   - 16 bit index in the psp backlog array corr to this CR event
1979e39c5baSBill Taylor  * this makes it unique for every CR.
1989e39c5baSBill Taylor  */
1999e39c5baSBill Taylor typedef uint64_t daplka_psep_cookie_t;
2009e39c5baSBill Taylor #define	DAPLKA_CREATE_PSEP_COOKIE(index)	\
2019e39c5baSBill Taylor 			((uint64_t)((gethrtime()/100)<<16 | (index)))
2029e39c5baSBill Taylor #define	DAPLKA_GET_PSEP_INDEX(cookie)					\
2039e39c5baSBill Taylor 					((uint16_t)((uint64_t)(cookie) &\
2049e39c5baSBill Taylor 						0xffff))
2059e39c5baSBill Taylor 
2069e39c5baSBill Taylor /*
2079e39c5baSBill Taylor  * daplka_evd_cme_t defines connection manager events that can be
2089e39c5baSBill Taylor  * chained to the daplka_evd_cme_list_t.
2099e39c5baSBill Taylor  */
2109e39c5baSBill Taylor typedef struct daplka_evd_cme_s {
2119e39c5baSBill Taylor 	dapl_ib_cm_event_type_t	ec_cm_ev_type;
2129e39c5baSBill Taylor 	/* ec_cm_cookie is the SP(passive)/EP(active) cookie */
2139e39c5baSBill Taylor 	uint64_t		ec_cm_cookie;
2149e39c5baSBill Taylor 	/* ec_cm_ev_session_id is the cookie for DEFER processing */
2159e39c5baSBill Taylor 	void			*ec_cm_ev_session_id;
2169e39c5baSBill Taylor 	/* true - passive side event, false - active side event */
2179e39c5baSBill Taylor 	boolean_t		ec_cm_is_passive;
2189e39c5baSBill Taylor 	daplka_psep_cookie_t	ec_cm_psep_cookie;
2199e39c5baSBill Taylor 	ib_gid_t		ec_cm_req_prim_addr; /* requestor gid */
2209e39c5baSBill Taylor 	ibt_priv_data_len_t	ec_cm_ev_priv_data_len;
2219e39c5baSBill Taylor 	void			*ec_cm_ev_priv_data;
2229e39c5baSBill Taylor } daplka_evd_cme_t;
2239e39c5baSBill Taylor _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_evd_cme_s))
2249e39c5baSBill Taylor 
2259e39c5baSBill Taylor typedef enum daplka_evd_event_type_e {
2269e39c5baSBill Taylor 	DAPLKA_EVD_NO_EVENTS = 0x00,
2279e39c5baSBill Taylor 	DAPLKA_EVD_ULAND_EVENTS = 0x01, /* userland events ie. CQ or SE */
2289e39c5baSBill Taylor 	DAPLKA_EVD_CM_EVENTS = 0x02,
2299e39c5baSBill Taylor 	DAPLKA_EVD_ASYNC_EVENTS = 0x04
2309e39c5baSBill Taylor } daplka_evd_event_type_t;
2319e39c5baSBill Taylor 
2329e39c5baSBill Taylor /*
2339e39c5baSBill Taylor  * daplka_evd_event_t defines elements in the event list - this is
2349e39c5baSBill Taylor  * used for both async as well as connection manager events
2359e39c5baSBill Taylor  */
2369e39c5baSBill Taylor typedef struct daplka_evd_event_s {
2379e39c5baSBill Taylor 	struct daplka_evd_event_s	*ee_next;
2389e39c5baSBill Taylor 	union {
2399e39c5baSBill Taylor 		dapl_ib_async_event_t		aev;
2409e39c5baSBill Taylor 		daplka_evd_cme_t		cmev;
2419e39c5baSBill Taylor 	} ee_event;
2429e39c5baSBill Taylor #define	ee_aev	ee_event.aev
2439e39c5baSBill Taylor #define	ee_cmev	ee_event.cmev
2449e39c5baSBill Taylor } daplka_evd_event_t;
2459e39c5baSBill Taylor 
2469e39c5baSBill Taylor typedef struct daplka_evd_event_list_s {
2479e39c5baSBill Taylor 	daplka_evd_event_type_t	eel_event_type;
2489e39c5baSBill Taylor 	uint32_t		eel_num_elements;
2499e39c5baSBill Taylor 	daplka_evd_event_t	*eel_head;
2509e39c5baSBill Taylor 	daplka_evd_event_t	*eel_tail;
2519e39c5baSBill Taylor } daplka_evd_event_list_t;
2529e39c5baSBill Taylor 
2539e39c5baSBill Taylor typedef struct daplka_evd_resource {
2549e39c5baSBill Taylor 	daplka_resource_t	header;
2559e39c5baSBill Taylor 	kmutex_t		evd_lock;
2569e39c5baSBill Taylor 	kcondvar_t		evd_cv;
2579e39c5baSBill Taylor 	DAT_EVD_FLAGS		evd_flags;
2589e39c5baSBill Taylor 	daplka_evd_event_type_t	evd_newevents; /* DAPLKA_EVD_*_EVENTS */
2599e39c5baSBill Taylor 	ibt_cq_hdl_t		evd_cq_hdl;
2609e39c5baSBill Taylor 	uint32_t		evd_cq_real_size;
2619e39c5baSBill Taylor 	daplka_evd_event_list_t	evd_cr_events; /* connect request event */
2629e39c5baSBill Taylor 	daplka_evd_event_list_t	evd_conn_events; /* connection events */
2639e39c5baSBill Taylor 	daplka_evd_event_list_t	evd_async_events; /* aysnc events list */
2649e39c5baSBill Taylor 	ibt_hca_hdl_t		evd_hca_hdl;
2659e39c5baSBill Taylor 	daplka_hca_t		*evd_hca;
2669e39c5baSBill Taylor 	uint32_t		evd_waiters;
2679e39c5baSBill Taylor 	uint64_t		evd_cookie;
2689e39c5baSBill Taylor 	struct daplka_cno_resource	*evd_cno_res;
2699e39c5baSBill Taylor } daplka_evd_resource_t;
2709e39c5baSBill Taylor _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_evd_event_s))
2719e39c5baSBill Taylor _NOTE(SCHEME_PROTECTS_DATA("daplka", daplka_evd_event_s))
2729e39c5baSBill Taylor _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_evd_event_list_s))
2739e39c5baSBill Taylor _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_evd_resource))
2749e39c5baSBill Taylor _NOTE(MUTEX_PROTECTS_DATA(daplka_evd_resource::evd_lock,
2759e39c5baSBill Taylor     daplka_evd_resource::evd_cv
2769e39c5baSBill Taylor     daplka_evd_resource::evd_flags
2779e39c5baSBill Taylor     daplka_evd_resource::evd_newevents
2789e39c5baSBill Taylor     daplka_evd_resource::evd_cr_events
2799e39c5baSBill Taylor     daplka_evd_resource::evd_conn_events
2809e39c5baSBill Taylor     daplka_evd_resource::evd_async_events
2819e39c5baSBill Taylor     daplka_evd_resource::evd_waiters))
2829e39c5baSBill Taylor 
2839e39c5baSBill Taylor typedef struct daplka_srq_resource {
2849e39c5baSBill Taylor 	daplka_resource_t	header;
2859e39c5baSBill Taylor 	kmutex_t		srq_lock;
2869e39c5baSBill Taylor 	daplka_hca_t		*srq_hca;
2879e39c5baSBill Taylor 	ibt_hca_hdl_t		srq_hca_hdl;
2889e39c5baSBill Taylor 	daplka_pd_resource_t	*srq_pd_res;
2899e39c5baSBill Taylor 	ibt_srq_hdl_t		srq_hdl;
2909e39c5baSBill Taylor 	uint32_t		srq_real_size;
2919e39c5baSBill Taylor } daplka_srq_resource_t;
2929e39c5baSBill Taylor _NOTE(SCHEME_PROTECTS_DATA("daplka", daplka_srq_resource))
2939e39c5baSBill Taylor 
2949e39c5baSBill Taylor #define	DAPLKA_EP_STATE_CLOSED		0x0001
2959e39c5baSBill Taylor #define	DAPLKA_EP_STATE_CONNECTING	0x0002
2969e39c5baSBill Taylor #define	DAPLKA_EP_STATE_ACCEPTING	0x0003
2979e39c5baSBill Taylor #define	DAPLKA_EP_STATE_CONNECTED	0x0004
2989e39c5baSBill Taylor #define	DAPLKA_EP_STATE_DISCONNECTING	0x0005
2999e39c5baSBill Taylor #define	DAPLKA_EP_STATE_ABORTING	0x0006
3009e39c5baSBill Taylor #define	DAPLKA_EP_STATE_DISCONNECTED	0x0007
3019e39c5baSBill Taylor #define	DAPLKA_EP_STATE_TRANSITIONING	0x0008
3029e39c5baSBill Taylor #define	DAPLKA_EP_STATE_FREED		0x0009
3039e39c5baSBill Taylor 
3049e39c5baSBill Taylor typedef struct daplka_ep_resource {
3059e39c5baSBill Taylor 	daplka_resource_t	header;
3069e39c5baSBill Taylor 	kmutex_t		ep_lock;
3079e39c5baSBill Taylor 	kcondvar_t		ep_cv;
3089e39c5baSBill Taylor 	uint64_t		ep_cookie; /* userland ep pointer */
3099e39c5baSBill Taylor 	daplka_hca_t		*ep_hca;
3109e39c5baSBill Taylor 	ibt_channel_hdl_t	ep_chan_hdl;
3119e39c5baSBill Taylor 	daplka_evd_resource_t	*ep_snd_evd;
3129e39c5baSBill Taylor 	daplka_evd_resource_t	*ep_rcv_evd;
3139e39c5baSBill Taylor 	daplka_evd_resource_t	*ep_conn_evd;
3149e39c5baSBill Taylor 	daplka_evd_resource_t	*ep_bind_evd;
3159e39c5baSBill Taylor 	daplka_pd_resource_t	*ep_pd_res;
3169e39c5baSBill Taylor 	daplka_srq_resource_t	*ep_srq_res;
3179e39c5baSBill Taylor 	uint32_t		ep_state;
3189e39c5baSBill Taylor 	uint64_t		ep_timer_hkey;
3199e39c5baSBill Taylor 	daplka_psep_cookie_t	ep_psep_cookie; /* passive side ep cookie */
3209e39c5baSBill Taylor 	ibt_priv_data_len_t	ep_priv_len;
3219e39c5baSBill Taylor 	uint8_t			ep_priv_data[IBT_REP_PRIV_DATA_SZ];
3229e39c5baSBill Taylor 	ib_gid_t		ep_sgid;
3239e39c5baSBill Taylor 	ib_gid_t		ep_dgid;
3249e39c5baSBill Taylor } daplka_ep_resource_t;
3259e39c5baSBill Taylor _NOTE(SCHEME_PROTECTS_DATA("daplka", daplka_ep_resource))
3269e39c5baSBill Taylor 
3279e39c5baSBill Taylor typedef struct daplka_timer_info {
3289e39c5baSBill Taylor 	daplka_ep_resource_t	*ti_ep_res;
3299e39c5baSBill Taylor 	timeout_id_t		ti_tmo_id;
3309e39c5baSBill Taylor } daplka_timer_info_t;
3319e39c5baSBill Taylor _NOTE(SCHEME_PROTECTS_DATA("daplka", daplka_timer_info))
3329e39c5baSBill Taylor 
3339e39c5baSBill Taylor typedef struct daplka_mr_resource {
3349e39c5baSBill Taylor 	daplka_resource_t		header;
3359e39c5baSBill Taylor 	daplka_pd_resource_t		*mr_pd_res;
3369e39c5baSBill Taylor 	daplka_hca_t			*mr_hca;
3379e39c5baSBill Taylor 	ibt_hca_hdl_t			mr_hca_hdl;
3389e39c5baSBill Taylor 	ibt_mr_hdl_t			mr_hdl;
3399e39c5baSBill Taylor 	ibt_mr_attr_t			mr_attr;
3409e39c5baSBill Taylor 	ibt_mr_desc_t			mr_desc;
3419e39c5baSBill Taylor 	kmutex_t			mr_lock;
3429e39c5baSBill Taylor 	struct daplka_mr_resource	*mr_next;
3439e39c5baSBill Taylor 	struct daplka_shared_mr		*mr_shared_mr;
3449e39c5baSBill Taylor } daplka_mr_resource_t;
3459e39c5baSBill Taylor _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_mr_resource))
3469e39c5baSBill Taylor _NOTE(MUTEX_PROTECTS_DATA(daplka_mr_resource::mr_lock,
3479e39c5baSBill Taylor     daplka_mr_resource::mr_shared_mr))
3489e39c5baSBill Taylor 
3499e39c5baSBill Taylor typedef struct daplka_mw_resource {
3509e39c5baSBill Taylor 	daplka_resource_t	header;
3519e39c5baSBill Taylor 	daplka_pd_resource_t	*mw_pd_res;
3529e39c5baSBill Taylor 	daplka_hca_t		*mw_hca;
3539e39c5baSBill Taylor 	ibt_hca_hdl_t		mw_hca_hdl;
3549e39c5baSBill Taylor 	ibt_mw_hdl_t		mw_hdl;
3559e39c5baSBill Taylor 	kmutex_t		mw_lock;
3569e39c5baSBill Taylor } daplka_mw_resource_t;
3579e39c5baSBill Taylor _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_mw_resource))
3589e39c5baSBill Taylor 
3599e39c5baSBill Taylor /*
3609e39c5baSBill Taylor  * This describes the elements in a connection pending list that each SP
3619e39c5baSBill Taylor  * maintains. Fields are protected using the sp_lock.
3629e39c5baSBill Taylor  */
3639e39c5baSBill Taylor typedef enum {
3649e39c5baSBill Taylor 	DAPLKA_SPCP_INIT = 0,
3659e39c5baSBill Taylor 	DAPLKA_SPCP_PENDING
3669e39c5baSBill Taylor } daplka_spcp_state_t;
3679e39c5baSBill Taylor 
3689e39c5baSBill Taylor typedef struct daplka_sp_conn_pend_s {
3699e39c5baSBill Taylor 	daplka_spcp_state_t	spcp_state;
3709e39c5baSBill Taylor 	void			*spcp_sid; /* session id for cm_proceed */
3719e39c5baSBill Taylor 	uint32_t		spcp_req_len; /* used by cr_handoff */
3729e39c5baSBill Taylor 	char			spcp_req_data[DAPL_MAX_PRIVATE_DATA_SIZE];
373*05c0d196SBill Taylor 	uint8_t			spcp_rdma_ra_out;
374*05c0d196SBill Taylor 	uint8_t			spcp_rdma_ra_in;
3759e39c5baSBill Taylor } daplka_sp_conn_pend_t;
3769e39c5baSBill Taylor 
3779e39c5baSBill Taylor #define	DAPLKA_DEFAULT_SP_BACKLOG	256
3789e39c5baSBill Taylor typedef struct daplka_sp_resource {
3799e39c5baSBill Taylor 	daplka_resource_t	header;
3809e39c5baSBill Taylor 	kmutex_t		sp_lock;
3819e39c5baSBill Taylor 	ibt_srv_hdl_t		sp_srv_hdl;
3829e39c5baSBill Taylor 	ibt_sbind_hdl_t		sp_bind_hdl;
3839e39c5baSBill Taylor 	uint64_t		sp_cookie; /* userland sp pointer */
3849e39c5baSBill Taylor 	int			sp_backlog_size; /* # elements backlog */
3859e39c5baSBill Taylor 	daplka_sp_conn_pend_t	*sp_backlog; /* pending conn backlog array */
3869e39c5baSBill Taylor 	daplka_evd_resource_t	*sp_evd_res;
3879e39c5baSBill Taylor 	ib_svc_id_t		sp_conn_qual;
3889e39c5baSBill Taylor 	uint64_t		sp_global_hkey;
3899e39c5baSBill Taylor 	uid_t			sp_ruid;
3909e39c5baSBill Taylor } daplka_sp_resource_t;
3919e39c5baSBill Taylor _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_sp_resource))
3929e39c5baSBill Taylor _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_sp_conn_pend_s))
3939e39c5baSBill Taylor _NOTE(MUTEX_PROTECTS_DATA(daplka_sp_resource::sp_lock,
3949e39c5baSBill Taylor     daplka_sp_resource::sp_backlog))
3959e39c5baSBill Taylor 
3969e39c5baSBill Taylor typedef struct daplka_cno_resource {
3979e39c5baSBill Taylor 	daplka_resource_t	header;
3989e39c5baSBill Taylor 	kmutex_t		cno_lock;
3999e39c5baSBill Taylor 	kcondvar_t		cno_cv;
4009e39c5baSBill Taylor 	uint64_t		cno_evd_cookie;
4019e39c5baSBill Taylor } daplka_cno_resource_t;
4029e39c5baSBill Taylor _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_cno_resource))
4039e39c5baSBill Taylor _NOTE(MUTEX_PROTECTS_DATA(daplka_cno_resource::cno_lock,
4049e39c5baSBill Taylor     daplka_cno_resource::cno_cv
4059e39c5baSBill Taylor     daplka_cno_resource::cno_evd_cookie))
4069e39c5baSBill Taylor 
4079e39c5baSBill Taylor #define	DAPLKA_SMR_FREED		0x0000
4089e39c5baSBill Taylor #define	DAPLKA_SMR_TRANSITIONING	0x0001
4099e39c5baSBill Taylor #define	DAPLKA_SMR_READY		0x0002
4109e39c5baSBill Taylor typedef struct daplka_shared_mr {
4119e39c5baSBill Taylor 	avl_node_t		smr_node;
4129e39c5baSBill Taylor 	uint32_t		smr_refcnt;
4139e39c5baSBill Taylor 	uint32_t		smr_state;
4149e39c5baSBill Taylor 	daplka_mr_resource_t	*smr_mr_list;
4159e39c5baSBill Taylor 	kcondvar_t		smr_cv;
4169e39c5baSBill Taylor 	dapl_mr_cookie_t	smr_cookie;
4179e39c5baSBill Taylor } daplka_shared_mr_t;
4189e39c5baSBill Taylor _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_shared_mr))
4199e39c5baSBill Taylor _NOTE(SCHEME_PROTECTS_DATA("daplka", daplka_shared_mr::smr_mr_list))
4209e39c5baSBill Taylor 
4219e39c5baSBill Taylor /*
4229e39c5baSBill Taylor  * resource table data structures
4239e39c5baSBill Taylor  */
4249e39c5baSBill Taylor #define	DAPLKA_RC_BLKSZ		16
4259e39c5baSBill Taylor #define	DAPLKA_RC_RESERVED	0xff
4269e39c5baSBill Taylor typedef struct daplka_resource_blk {
4279e39c5baSBill Taylor 	int			daplka_rcblk_avail;
4289e39c5baSBill Taylor 	daplka_resource_t	*daplka_rcblk_blks[DAPLKA_RC_BLKSZ];
4299e39c5baSBill Taylor } daplka_resource_blk_t;
4309e39c5baSBill Taylor 
4319e39c5baSBill Taylor struct daplka_resource_table {
4329e39c5baSBill Taylor 	krwlock_t	daplka_rct_lock;
4339e39c5baSBill Taylor 	int		daplka_rc_len;
4349e39c5baSBill Taylor 	int		daplka_rc_sz;
4359e39c5baSBill Taylor 	int		daplka_rc_cnt;
4369e39c5baSBill Taylor 	ushort_t	daplka_rc_flag;
4379e39c5baSBill Taylor 	daplka_resource_blk_t **daplka_rc_root;
4389e39c5baSBill Taylor };
4399e39c5baSBill Taylor _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_resource_table))
4409e39c5baSBill Taylor _NOTE(RWLOCK_PROTECTS_DATA(daplka_resource_table::daplka_rct_lock,
4419e39c5baSBill Taylor     daplka_resource_table::daplka_rc_root))
4429e39c5baSBill Taylor 
4439e39c5baSBill Taylor #ifdef __cplusplus
4449e39c5baSBill Taylor }
4459e39c5baSBill Taylor #endif
4469e39c5baSBill Taylor 
4479e39c5baSBill Taylor #endif	/* _DAPL_H_ */
448