xref: /onnv-gate/usr/src/uts/common/sys/ib/clients/daplt/daplt.h (revision 9553:cc9b5e65ee4d)
19517SBill.Taylor@Sun.COM /*
29517SBill.Taylor@Sun.COM  * CDDL HEADER START
39517SBill.Taylor@Sun.COM  *
49517SBill.Taylor@Sun.COM  * The contents of this file are subject to the terms of the
59517SBill.Taylor@Sun.COM  * Common Development and Distribution License (the "License").
69517SBill.Taylor@Sun.COM  * You may not use this file except in compliance with the License.
79517SBill.Taylor@Sun.COM  *
89517SBill.Taylor@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
99517SBill.Taylor@Sun.COM  * or http://www.opensolaris.org/os/licensing.
109517SBill.Taylor@Sun.COM  * See the License for the specific language governing permissions
119517SBill.Taylor@Sun.COM  * and limitations under the License.
129517SBill.Taylor@Sun.COM  *
139517SBill.Taylor@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
149517SBill.Taylor@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
159517SBill.Taylor@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
169517SBill.Taylor@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
179517SBill.Taylor@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
189517SBill.Taylor@Sun.COM  *
199517SBill.Taylor@Sun.COM  * CDDL HEADER END
209517SBill.Taylor@Sun.COM  */
219517SBill.Taylor@Sun.COM 
229517SBill.Taylor@Sun.COM /*
23*9553SBill.Taylor@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
249517SBill.Taylor@Sun.COM  * Use is subject to license terms.
259517SBill.Taylor@Sun.COM  */
269517SBill.Taylor@Sun.COM 
279517SBill.Taylor@Sun.COM #ifndef	_DAPL_H_
289517SBill.Taylor@Sun.COM #define	_DAPL_H_
299517SBill.Taylor@Sun.COM 
309517SBill.Taylor@Sun.COM #ifdef __cplusplus
319517SBill.Taylor@Sun.COM extern "C" {
329517SBill.Taylor@Sun.COM #endif
339517SBill.Taylor@Sun.COM 
349517SBill.Taylor@Sun.COM #define	DAPLKA_VERSION		(1)
359517SBill.Taylor@Sun.COM #define	DAPLKA_TQ_NTHREADS	16
369517SBill.Taylor@Sun.COM #define	DAPLKA_STATE_DETACHED	0x0000
379517SBill.Taylor@Sun.COM #define	DAPLKA_STATE_ATTACHED	0x0001
389517SBill.Taylor@Sun.COM 
399517SBill.Taylor@Sun.COM /*
409517SBill.Taylor@Sun.COM  * HCA structure
419517SBill.Taylor@Sun.COM  */
429517SBill.Taylor@Sun.COM typedef struct daplka_hca {
439517SBill.Taylor@Sun.COM 	ib_guid_t		hca_guid;
449517SBill.Taylor@Sun.COM 	ibt_hca_hdl_t		hca_hdl;
459517SBill.Taylor@Sun.COM 	ibt_hca_attr_t		hca_attr;
469517SBill.Taylor@Sun.COM 	uint32_t		hca_nports;
479517SBill.Taylor@Sun.COM 	ibt_hca_portinfo_t	*hca_ports;
489517SBill.Taylor@Sun.COM 	size_t			hca_pinfosz;
499517SBill.Taylor@Sun.COM 	uint32_t		hca_qp_count;
509517SBill.Taylor@Sun.COM 	uint32_t		hca_cq_count;
519517SBill.Taylor@Sun.COM 	uint32_t		hca_pd_count;
529517SBill.Taylor@Sun.COM 	uint32_t		hca_mw_count;
539517SBill.Taylor@Sun.COM 	uint32_t		hca_mr_count;
549517SBill.Taylor@Sun.COM 	uint32_t		hca_srq_count;
559517SBill.Taylor@Sun.COM 	int			hca_ref_cnt;
569517SBill.Taylor@Sun.COM 	struct daplka_hca	*hca_next;
579517SBill.Taylor@Sun.COM } daplka_hca_t;
589517SBill.Taylor@Sun.COM _NOTE(SCHEME_PROTECTS_DATA("daplka", daplka_hca))
599517SBill.Taylor@Sun.COM 
609517SBill.Taylor@Sun.COM /*
619517SBill.Taylor@Sun.COM  * Per-Device instance state information.
629517SBill.Taylor@Sun.COM  */
639517SBill.Taylor@Sun.COM typedef struct daplka {
649517SBill.Taylor@Sun.COM 	kmutex_t		daplka_mutex;
659517SBill.Taylor@Sun.COM 	dev_info_t		*daplka_dip;
669517SBill.Taylor@Sun.COM 	ibt_clnt_hdl_t		daplka_clnt_hdl;
679517SBill.Taylor@Sun.COM 	daplka_hca_t		*daplka_hca_list_head;
689517SBill.Taylor@Sun.COM 	uint32_t		daplka_status;
699517SBill.Taylor@Sun.COM } daplka_t;
709517SBill.Taylor@Sun.COM 
719517SBill.Taylor@Sun.COM /*
729517SBill.Taylor@Sun.COM  * generic hash table
739517SBill.Taylor@Sun.COM  */
749517SBill.Taylor@Sun.COM typedef struct daplka_hash_entry {
759517SBill.Taylor@Sun.COM 	uint64_t			he_hkey;
769517SBill.Taylor@Sun.COM 	void				*he_objp;
779517SBill.Taylor@Sun.COM 	struct daplka_hash_entry	*he_next;
789517SBill.Taylor@Sun.COM } daplka_hash_entry_t;
799517SBill.Taylor@Sun.COM 
809517SBill.Taylor@Sun.COM typedef struct daplka_hash_bucket {
819517SBill.Taylor@Sun.COM 	uint32_t			hb_count;
829517SBill.Taylor@Sun.COM 	daplka_hash_entry_t		*hb_entries;
839517SBill.Taylor@Sun.COM } daplka_hash_bucket_t;
849517SBill.Taylor@Sun.COM 
859517SBill.Taylor@Sun.COM typedef struct daplka_hash_table {
869517SBill.Taylor@Sun.COM 	boolean_t			ht_initialized;
879517SBill.Taylor@Sun.COM 	uint32_t			ht_count;
889517SBill.Taylor@Sun.COM 	uint32_t			ht_nbuckets;
899517SBill.Taylor@Sun.COM 	uint64_t			ht_next_hkey;
909517SBill.Taylor@Sun.COM 	krwlock_t			ht_table_lock;
919517SBill.Taylor@Sun.COM 	kmutex_t			ht_key_lock;
929517SBill.Taylor@Sun.COM 	daplka_hash_bucket_t		*ht_buckets;
939517SBill.Taylor@Sun.COM 	void				(*ht_free_func)(void *);
949517SBill.Taylor@Sun.COM 	void				(*ht_lookup_func)(void *);
959517SBill.Taylor@Sun.COM } daplka_hash_table_t;
969517SBill.Taylor@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_hash_entry))
979517SBill.Taylor@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_hash_bucket))
989517SBill.Taylor@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_hash_table))
999517SBill.Taylor@Sun.COM _NOTE(MUTEX_PROTECTS_DATA(daplka_hash_table::ht_key_lock,
1009517SBill.Taylor@Sun.COM     daplka_hash_table::ht_next_hkey))
1019517SBill.Taylor@Sun.COM _NOTE(RWLOCK_PROTECTS_DATA(daplka_hash_table::ht_table_lock,
1029517SBill.Taylor@Sun.COM     daplka_hash_table::ht_buckets
1039517SBill.Taylor@Sun.COM     daplka_hash_table::ht_count))
1049517SBill.Taylor@Sun.COM 
1059517SBill.Taylor@Sun.COM /*
1069517SBill.Taylor@Sun.COM  * resource structure header
1079517SBill.Taylor@Sun.COM  */
1089517SBill.Taylor@Sun.COM typedef struct daplka_resource {
1099517SBill.Taylor@Sun.COM 	uint_t			rs_type;
1109517SBill.Taylor@Sun.COM 	minor_t			rs_rnum;
1119517SBill.Taylor@Sun.COM 	kmutex_t 		rs_reflock;
1129517SBill.Taylor@Sun.COM 	uint32_t		rs_refcnt;
1139517SBill.Taylor@Sun.COM 	uint32_t		rs_charged;
1149517SBill.Taylor@Sun.COM 	int			(*rs_free)(struct daplka_resource *);
1159517SBill.Taylor@Sun.COM } daplka_resource_t;
1169517SBill.Taylor@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_resource))
1179517SBill.Taylor@Sun.COM _NOTE(SCHEME_PROTECTS_DATA("daplka", daplka_resource::rs_charged))
1189517SBill.Taylor@Sun.COM _NOTE(MUTEX_PROTECTS_DATA(daplka_resource::rs_reflock,
1199517SBill.Taylor@Sun.COM     daplka_resource::rs_refcnt))
1209517SBill.Taylor@Sun.COM 
1219517SBill.Taylor@Sun.COM #define	DAPLKA_EP_HTBL_SZ	128
1229517SBill.Taylor@Sun.COM #define	DAPLKA_MR_HTBL_SZ	64
1239517SBill.Taylor@Sun.COM #define	DAPLKA_MW_HTBL_SZ	64
1249517SBill.Taylor@Sun.COM #define	DAPLKA_PD_HTBL_SZ	32
1259517SBill.Taylor@Sun.COM #define	DAPLKA_SP_HTBL_SZ	32
1269517SBill.Taylor@Sun.COM #define	DAPLKA_EVD_HTBL_SZ	32
1279517SBill.Taylor@Sun.COM #define	DAPLKA_G_SP_HTBL_SZ	512
1289517SBill.Taylor@Sun.COM #define	DAPLKA_TIMER_HTBL_SZ	512
1299517SBill.Taylor@Sun.COM #define	DAPLKA_CNO_HTBL_SZ	16
1309517SBill.Taylor@Sun.COM #define	DAPLKA_SRQ_HTBL_SZ	32
1319517SBill.Taylor@Sun.COM 
1329517SBill.Taylor@Sun.COM typedef struct daplka_async_evd_hkey_s {
1339517SBill.Taylor@Sun.COM 	struct daplka_async_evd_hkey_s	*aeh_next;
1349517SBill.Taylor@Sun.COM 	uint64_t			aeh_evd_hkey;
1359517SBill.Taylor@Sun.COM } daplka_async_evd_hkey_t;
1369517SBill.Taylor@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_async_evd_hkey_s))
1379517SBill.Taylor@Sun.COM 
1389517SBill.Taylor@Sun.COM /*
1399517SBill.Taylor@Sun.COM  * Various states IA can be in, this is primarily for handling race
1409517SBill.Taylor@Sun.COM  * between MW allocation and MR cleanup callback.
1419517SBill.Taylor@Sun.COM  */
1429517SBill.Taylor@Sun.COM typedef enum daplka_ia_state_e {
1439517SBill.Taylor@Sun.COM 	DAPLKA_IA_INIT = 0,
1449517SBill.Taylor@Sun.COM 	DAPLKA_IA_MW_ALLOC_IN_PROGRESS,
1459517SBill.Taylor@Sun.COM 	DAPLKA_IA_MW_FREEZE_IN_PROGRESS,
1469517SBill.Taylor@Sun.COM 	DAPLKA_IA_MW_FROZEN
1479517SBill.Taylor@Sun.COM } daplka_ia_state_t;
1489517SBill.Taylor@Sun.COM 
1499517SBill.Taylor@Sun.COM typedef struct daplka_ia_resource {
1509517SBill.Taylor@Sun.COM 	daplka_resource_t	header;
1519517SBill.Taylor@Sun.COM 	kmutex_t		ia_lock;
1529517SBill.Taylor@Sun.COM 	kcondvar_t		ia_cv;
1539517SBill.Taylor@Sun.COM 	daplka_ia_state_t	ia_state;
1549517SBill.Taylor@Sun.COM 	ibt_hca_hdl_t		ia_hca_hdl;
1559517SBill.Taylor@Sun.COM 	ib_gid_t		ia_hca_sgid;
1569517SBill.Taylor@Sun.COM 	daplka_hca_t		*ia_hca;
1579517SBill.Taylor@Sun.COM 	uint8_t			ia_port_num;
1589517SBill.Taylor@Sun.COM 	uint32_t		ia_port_pkey;
1599517SBill.Taylor@Sun.COM 	pid_t			ia_pid;
1609517SBill.Taylor@Sun.COM 	uint32_t		ia_mw_alloccnt; /* # mw allocs in progress */
1619517SBill.Taylor@Sun.COM 	daplka_async_evd_hkey_t	*ia_async_evd_hkeys; /* hash key of async evd */
1629517SBill.Taylor@Sun.COM 	daplka_hash_table_t	ia_ep_htbl;
1639517SBill.Taylor@Sun.COM 	daplka_hash_table_t	ia_mr_htbl;
1649517SBill.Taylor@Sun.COM 	daplka_hash_table_t	ia_mw_htbl;
1659517SBill.Taylor@Sun.COM 	daplka_hash_table_t	ia_pd_htbl;
1669517SBill.Taylor@Sun.COM 	daplka_hash_table_t	ia_evd_htbl;
1679517SBill.Taylor@Sun.COM 	daplka_hash_table_t	ia_sp_htbl;
1689517SBill.Taylor@Sun.COM 	daplka_hash_table_t	ia_cno_htbl;
1699517SBill.Taylor@Sun.COM 	daplka_hash_table_t	ia_srq_htbl;
1709517SBill.Taylor@Sun.COM 	uint8_t			ia_sadata[DAPL_ATS_NBYTES]; /* SA data */
1719517SBill.Taylor@Sun.COM 	boolean_t		ia_ar_registered;
1729517SBill.Taylor@Sun.COM } daplka_ia_resource_t;
1739517SBill.Taylor@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_ia_resource))
1749517SBill.Taylor@Sun.COM _NOTE(MUTEX_PROTECTS_DATA(daplka_ia_resource::ia_lock,
1759517SBill.Taylor@Sun.COM     daplka_ia_resource::ia_cv
1769517SBill.Taylor@Sun.COM     daplka_ia_resource::ia_async_evd_hkeys
1779517SBill.Taylor@Sun.COM     daplka_ia_resource::ia_mw_alloccnt
1789517SBill.Taylor@Sun.COM     daplka_ia_resource::ia_state
1799517SBill.Taylor@Sun.COM     daplka_async_evd_hkey_s))
1809517SBill.Taylor@Sun.COM 
1819517SBill.Taylor@Sun.COM typedef struct daplka_pd_resource {
1829517SBill.Taylor@Sun.COM 	daplka_resource_t	header;
1839517SBill.Taylor@Sun.COM 	daplka_hca_t		*pd_hca;
1849517SBill.Taylor@Sun.COM 	ibt_hca_hdl_t		pd_hca_hdl;
1859517SBill.Taylor@Sun.COM 	ibt_pd_hdl_t		pd_hdl;
1869517SBill.Taylor@Sun.COM } daplka_pd_resource_t;
1879517SBill.Taylor@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_pd_resource))
1889517SBill.Taylor@Sun.COM 
1899517SBill.Taylor@Sun.COM /*
1909517SBill.Taylor@Sun.COM  * Passive side EP cookies - this is generated at the connection request
1919517SBill.Taylor@Sun.COM  * time and unique for every CR. It gets associated with the EP that
1929517SBill.Taylor@Sun.COM  * is passed to the CR accept.
1939517SBill.Taylor@Sun.COM  *
1949517SBill.Taylor@Sun.COM  * daplka_psep_cookie contains the following information
1959517SBill.Taylor@Sun.COM  *   - 48 bit timestamp (unit = 1/10us)
1969517SBill.Taylor@Sun.COM  *   - 16 bit index in the psp backlog array corr to this CR event
1979517SBill.Taylor@Sun.COM  * this makes it unique for every CR.
1989517SBill.Taylor@Sun.COM  */
1999517SBill.Taylor@Sun.COM typedef uint64_t daplka_psep_cookie_t;
2009517SBill.Taylor@Sun.COM #define	DAPLKA_CREATE_PSEP_COOKIE(index)	\
2019517SBill.Taylor@Sun.COM 			((uint64_t)((gethrtime()/100)<<16 | (index)))
2029517SBill.Taylor@Sun.COM #define	DAPLKA_GET_PSEP_INDEX(cookie)					\
2039517SBill.Taylor@Sun.COM 					((uint16_t)((uint64_t)(cookie) &\
2049517SBill.Taylor@Sun.COM 						0xffff))
2059517SBill.Taylor@Sun.COM 
2069517SBill.Taylor@Sun.COM /*
2079517SBill.Taylor@Sun.COM  * daplka_evd_cme_t defines connection manager events that can be
2089517SBill.Taylor@Sun.COM  * chained to the daplka_evd_cme_list_t.
2099517SBill.Taylor@Sun.COM  */
2109517SBill.Taylor@Sun.COM typedef struct daplka_evd_cme_s {
2119517SBill.Taylor@Sun.COM 	dapl_ib_cm_event_type_t	ec_cm_ev_type;
2129517SBill.Taylor@Sun.COM 	/* ec_cm_cookie is the SP(passive)/EP(active) cookie */
2139517SBill.Taylor@Sun.COM 	uint64_t		ec_cm_cookie;
2149517SBill.Taylor@Sun.COM 	/* ec_cm_ev_session_id is the cookie for DEFER processing */
2159517SBill.Taylor@Sun.COM 	void			*ec_cm_ev_session_id;
2169517SBill.Taylor@Sun.COM 	/* true - passive side event, false - active side event */
2179517SBill.Taylor@Sun.COM 	boolean_t		ec_cm_is_passive;
2189517SBill.Taylor@Sun.COM 	daplka_psep_cookie_t	ec_cm_psep_cookie;
2199517SBill.Taylor@Sun.COM 	ib_gid_t		ec_cm_req_prim_addr; /* requestor gid */
2209517SBill.Taylor@Sun.COM 	ibt_priv_data_len_t	ec_cm_ev_priv_data_len;
2219517SBill.Taylor@Sun.COM 	void			*ec_cm_ev_priv_data;
2229517SBill.Taylor@Sun.COM } daplka_evd_cme_t;
2239517SBill.Taylor@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_evd_cme_s))
2249517SBill.Taylor@Sun.COM 
2259517SBill.Taylor@Sun.COM typedef enum daplka_evd_event_type_e {
2269517SBill.Taylor@Sun.COM 	DAPLKA_EVD_NO_EVENTS = 0x00,
2279517SBill.Taylor@Sun.COM 	DAPLKA_EVD_ULAND_EVENTS = 0x01, /* userland events ie. CQ or SE */
2289517SBill.Taylor@Sun.COM 	DAPLKA_EVD_CM_EVENTS = 0x02,
2299517SBill.Taylor@Sun.COM 	DAPLKA_EVD_ASYNC_EVENTS = 0x04
2309517SBill.Taylor@Sun.COM } daplka_evd_event_type_t;
2319517SBill.Taylor@Sun.COM 
2329517SBill.Taylor@Sun.COM /*
2339517SBill.Taylor@Sun.COM  * daplka_evd_event_t defines elements in the event list - this is
2349517SBill.Taylor@Sun.COM  * used for both async as well as connection manager events
2359517SBill.Taylor@Sun.COM  */
2369517SBill.Taylor@Sun.COM typedef struct daplka_evd_event_s {
2379517SBill.Taylor@Sun.COM 	struct daplka_evd_event_s	*ee_next;
2389517SBill.Taylor@Sun.COM 	union {
2399517SBill.Taylor@Sun.COM 		dapl_ib_async_event_t		aev;
2409517SBill.Taylor@Sun.COM 		daplka_evd_cme_t		cmev;
2419517SBill.Taylor@Sun.COM 	} ee_event;
2429517SBill.Taylor@Sun.COM #define	ee_aev	ee_event.aev
2439517SBill.Taylor@Sun.COM #define	ee_cmev	ee_event.cmev
2449517SBill.Taylor@Sun.COM } daplka_evd_event_t;
2459517SBill.Taylor@Sun.COM 
2469517SBill.Taylor@Sun.COM typedef struct daplka_evd_event_list_s {
2479517SBill.Taylor@Sun.COM 	daplka_evd_event_type_t	eel_event_type;
2489517SBill.Taylor@Sun.COM 	uint32_t		eel_num_elements;
2499517SBill.Taylor@Sun.COM 	daplka_evd_event_t	*eel_head;
2509517SBill.Taylor@Sun.COM 	daplka_evd_event_t	*eel_tail;
2519517SBill.Taylor@Sun.COM } daplka_evd_event_list_t;
2529517SBill.Taylor@Sun.COM 
2539517SBill.Taylor@Sun.COM typedef struct daplka_evd_resource {
2549517SBill.Taylor@Sun.COM 	daplka_resource_t	header;
2559517SBill.Taylor@Sun.COM 	kmutex_t		evd_lock;
2569517SBill.Taylor@Sun.COM 	kcondvar_t		evd_cv;
2579517SBill.Taylor@Sun.COM 	DAT_EVD_FLAGS		evd_flags;
2589517SBill.Taylor@Sun.COM 	daplka_evd_event_type_t	evd_newevents; /* DAPLKA_EVD_*_EVENTS */
2599517SBill.Taylor@Sun.COM 	ibt_cq_hdl_t		evd_cq_hdl;
2609517SBill.Taylor@Sun.COM 	uint32_t		evd_cq_real_size;
2619517SBill.Taylor@Sun.COM 	daplka_evd_event_list_t	evd_cr_events; /* connect request event */
2629517SBill.Taylor@Sun.COM 	daplka_evd_event_list_t	evd_conn_events; /* connection events */
2639517SBill.Taylor@Sun.COM 	daplka_evd_event_list_t	evd_async_events; /* aysnc events list */
2649517SBill.Taylor@Sun.COM 	ibt_hca_hdl_t		evd_hca_hdl;
2659517SBill.Taylor@Sun.COM 	daplka_hca_t		*evd_hca;
2669517SBill.Taylor@Sun.COM 	uint32_t		evd_waiters;
2679517SBill.Taylor@Sun.COM 	uint64_t		evd_cookie;
2689517SBill.Taylor@Sun.COM 	struct daplka_cno_resource	*evd_cno_res;
2699517SBill.Taylor@Sun.COM } daplka_evd_resource_t;
2709517SBill.Taylor@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_evd_event_s))
2719517SBill.Taylor@Sun.COM _NOTE(SCHEME_PROTECTS_DATA("daplka", daplka_evd_event_s))
2729517SBill.Taylor@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_evd_event_list_s))
2739517SBill.Taylor@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_evd_resource))
2749517SBill.Taylor@Sun.COM _NOTE(MUTEX_PROTECTS_DATA(daplka_evd_resource::evd_lock,
2759517SBill.Taylor@Sun.COM     daplka_evd_resource::evd_cv
2769517SBill.Taylor@Sun.COM     daplka_evd_resource::evd_flags
2779517SBill.Taylor@Sun.COM     daplka_evd_resource::evd_newevents
2789517SBill.Taylor@Sun.COM     daplka_evd_resource::evd_cr_events
2799517SBill.Taylor@Sun.COM     daplka_evd_resource::evd_conn_events
2809517SBill.Taylor@Sun.COM     daplka_evd_resource::evd_async_events
2819517SBill.Taylor@Sun.COM     daplka_evd_resource::evd_waiters))
2829517SBill.Taylor@Sun.COM 
2839517SBill.Taylor@Sun.COM typedef struct daplka_srq_resource {
2849517SBill.Taylor@Sun.COM 	daplka_resource_t	header;
2859517SBill.Taylor@Sun.COM 	kmutex_t		srq_lock;
2869517SBill.Taylor@Sun.COM 	daplka_hca_t		*srq_hca;
2879517SBill.Taylor@Sun.COM 	ibt_hca_hdl_t		srq_hca_hdl;
2889517SBill.Taylor@Sun.COM 	daplka_pd_resource_t	*srq_pd_res;
2899517SBill.Taylor@Sun.COM 	ibt_srq_hdl_t		srq_hdl;
2909517SBill.Taylor@Sun.COM 	uint32_t		srq_real_size;
2919517SBill.Taylor@Sun.COM } daplka_srq_resource_t;
2929517SBill.Taylor@Sun.COM _NOTE(SCHEME_PROTECTS_DATA("daplka", daplka_srq_resource))
2939517SBill.Taylor@Sun.COM 
2949517SBill.Taylor@Sun.COM #define	DAPLKA_EP_STATE_CLOSED		0x0001
2959517SBill.Taylor@Sun.COM #define	DAPLKA_EP_STATE_CONNECTING	0x0002
2969517SBill.Taylor@Sun.COM #define	DAPLKA_EP_STATE_ACCEPTING	0x0003
2979517SBill.Taylor@Sun.COM #define	DAPLKA_EP_STATE_CONNECTED	0x0004
2989517SBill.Taylor@Sun.COM #define	DAPLKA_EP_STATE_DISCONNECTING	0x0005
2999517SBill.Taylor@Sun.COM #define	DAPLKA_EP_STATE_ABORTING	0x0006
3009517SBill.Taylor@Sun.COM #define	DAPLKA_EP_STATE_DISCONNECTED	0x0007
3019517SBill.Taylor@Sun.COM #define	DAPLKA_EP_STATE_TRANSITIONING	0x0008
3029517SBill.Taylor@Sun.COM #define	DAPLKA_EP_STATE_FREED		0x0009
3039517SBill.Taylor@Sun.COM 
3049517SBill.Taylor@Sun.COM typedef struct daplka_ep_resource {
3059517SBill.Taylor@Sun.COM 	daplka_resource_t	header;
3069517SBill.Taylor@Sun.COM 	kmutex_t		ep_lock;
3079517SBill.Taylor@Sun.COM 	kcondvar_t		ep_cv;
3089517SBill.Taylor@Sun.COM 	uint64_t		ep_cookie; /* userland ep pointer */
3099517SBill.Taylor@Sun.COM 	daplka_hca_t		*ep_hca;
3109517SBill.Taylor@Sun.COM 	ibt_channel_hdl_t	ep_chan_hdl;
3119517SBill.Taylor@Sun.COM 	daplka_evd_resource_t	*ep_snd_evd;
3129517SBill.Taylor@Sun.COM 	daplka_evd_resource_t	*ep_rcv_evd;
3139517SBill.Taylor@Sun.COM 	daplka_evd_resource_t	*ep_conn_evd;
3149517SBill.Taylor@Sun.COM 	daplka_evd_resource_t	*ep_bind_evd;
3159517SBill.Taylor@Sun.COM 	daplka_pd_resource_t	*ep_pd_res;
3169517SBill.Taylor@Sun.COM 	daplka_srq_resource_t	*ep_srq_res;
3179517SBill.Taylor@Sun.COM 	uint32_t		ep_state;
3189517SBill.Taylor@Sun.COM 	uint64_t		ep_timer_hkey;
3199517SBill.Taylor@Sun.COM 	daplka_psep_cookie_t	ep_psep_cookie; /* passive side ep cookie */
3209517SBill.Taylor@Sun.COM 	ibt_priv_data_len_t	ep_priv_len;
3219517SBill.Taylor@Sun.COM 	uint8_t			ep_priv_data[IBT_REP_PRIV_DATA_SZ];
3229517SBill.Taylor@Sun.COM 	ib_gid_t		ep_sgid;
3239517SBill.Taylor@Sun.COM 	ib_gid_t		ep_dgid;
3249517SBill.Taylor@Sun.COM } daplka_ep_resource_t;
3259517SBill.Taylor@Sun.COM _NOTE(SCHEME_PROTECTS_DATA("daplka", daplka_ep_resource))
3269517SBill.Taylor@Sun.COM 
3279517SBill.Taylor@Sun.COM typedef struct daplka_timer_info {
3289517SBill.Taylor@Sun.COM 	daplka_ep_resource_t	*ti_ep_res;
3299517SBill.Taylor@Sun.COM 	timeout_id_t		ti_tmo_id;
3309517SBill.Taylor@Sun.COM } daplka_timer_info_t;
3319517SBill.Taylor@Sun.COM _NOTE(SCHEME_PROTECTS_DATA("daplka", daplka_timer_info))
3329517SBill.Taylor@Sun.COM 
3339517SBill.Taylor@Sun.COM typedef struct daplka_mr_resource {
3349517SBill.Taylor@Sun.COM 	daplka_resource_t		header;
3359517SBill.Taylor@Sun.COM 	daplka_pd_resource_t		*mr_pd_res;
3369517SBill.Taylor@Sun.COM 	daplka_hca_t			*mr_hca;
3379517SBill.Taylor@Sun.COM 	ibt_hca_hdl_t			mr_hca_hdl;
3389517SBill.Taylor@Sun.COM 	ibt_mr_hdl_t			mr_hdl;
3399517SBill.Taylor@Sun.COM 	ibt_mr_attr_t			mr_attr;
3409517SBill.Taylor@Sun.COM 	ibt_mr_desc_t			mr_desc;
3419517SBill.Taylor@Sun.COM 	kmutex_t			mr_lock;
3429517SBill.Taylor@Sun.COM 	struct daplka_mr_resource	*mr_next;
3439517SBill.Taylor@Sun.COM 	struct daplka_shared_mr		*mr_shared_mr;
3449517SBill.Taylor@Sun.COM } daplka_mr_resource_t;
3459517SBill.Taylor@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_mr_resource))
3469517SBill.Taylor@Sun.COM _NOTE(MUTEX_PROTECTS_DATA(daplka_mr_resource::mr_lock,
3479517SBill.Taylor@Sun.COM     daplka_mr_resource::mr_shared_mr))
3489517SBill.Taylor@Sun.COM 
3499517SBill.Taylor@Sun.COM typedef struct daplka_mw_resource {
3509517SBill.Taylor@Sun.COM 	daplka_resource_t	header;
3519517SBill.Taylor@Sun.COM 	daplka_pd_resource_t	*mw_pd_res;
3529517SBill.Taylor@Sun.COM 	daplka_hca_t		*mw_hca;
3539517SBill.Taylor@Sun.COM 	ibt_hca_hdl_t		mw_hca_hdl;
3549517SBill.Taylor@Sun.COM 	ibt_mw_hdl_t		mw_hdl;
3559517SBill.Taylor@Sun.COM 	kmutex_t		mw_lock;
3569517SBill.Taylor@Sun.COM } daplka_mw_resource_t;
3579517SBill.Taylor@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_mw_resource))
3589517SBill.Taylor@Sun.COM 
3599517SBill.Taylor@Sun.COM /*
3609517SBill.Taylor@Sun.COM  * This describes the elements in a connection pending list that each SP
3619517SBill.Taylor@Sun.COM  * maintains. Fields are protected using the sp_lock.
3629517SBill.Taylor@Sun.COM  */
3639517SBill.Taylor@Sun.COM typedef enum {
3649517SBill.Taylor@Sun.COM 	DAPLKA_SPCP_INIT = 0,
3659517SBill.Taylor@Sun.COM 	DAPLKA_SPCP_PENDING
3669517SBill.Taylor@Sun.COM } daplka_spcp_state_t;
3679517SBill.Taylor@Sun.COM 
3689517SBill.Taylor@Sun.COM typedef struct daplka_sp_conn_pend_s {
3699517SBill.Taylor@Sun.COM 	daplka_spcp_state_t	spcp_state;
3709517SBill.Taylor@Sun.COM 	void			*spcp_sid; /* session id for cm_proceed */
3719517SBill.Taylor@Sun.COM 	uint32_t		spcp_req_len; /* used by cr_handoff */
3729517SBill.Taylor@Sun.COM 	char			spcp_req_data[DAPL_MAX_PRIVATE_DATA_SIZE];
373*9553SBill.Taylor@Sun.COM 	uint8_t			spcp_rdma_ra_out;
374*9553SBill.Taylor@Sun.COM 	uint8_t			spcp_rdma_ra_in;
3759517SBill.Taylor@Sun.COM } daplka_sp_conn_pend_t;
3769517SBill.Taylor@Sun.COM 
3779517SBill.Taylor@Sun.COM #define	DAPLKA_DEFAULT_SP_BACKLOG	256
3789517SBill.Taylor@Sun.COM typedef struct daplka_sp_resource {
3799517SBill.Taylor@Sun.COM 	daplka_resource_t	header;
3809517SBill.Taylor@Sun.COM 	kmutex_t		sp_lock;
3819517SBill.Taylor@Sun.COM 	ibt_srv_hdl_t		sp_srv_hdl;
3829517SBill.Taylor@Sun.COM 	ibt_sbind_hdl_t		sp_bind_hdl;
3839517SBill.Taylor@Sun.COM 	uint64_t		sp_cookie; /* userland sp pointer */
3849517SBill.Taylor@Sun.COM 	int			sp_backlog_size; /* # elements backlog */
3859517SBill.Taylor@Sun.COM 	daplka_sp_conn_pend_t	*sp_backlog; /* pending conn backlog array */
3869517SBill.Taylor@Sun.COM 	daplka_evd_resource_t	*sp_evd_res;
3879517SBill.Taylor@Sun.COM 	ib_svc_id_t		sp_conn_qual;
3889517SBill.Taylor@Sun.COM 	uint64_t		sp_global_hkey;
3899517SBill.Taylor@Sun.COM 	uid_t			sp_ruid;
3909517SBill.Taylor@Sun.COM } daplka_sp_resource_t;
3919517SBill.Taylor@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_sp_resource))
3929517SBill.Taylor@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_sp_conn_pend_s))
3939517SBill.Taylor@Sun.COM _NOTE(MUTEX_PROTECTS_DATA(daplka_sp_resource::sp_lock,
3949517SBill.Taylor@Sun.COM     daplka_sp_resource::sp_backlog))
3959517SBill.Taylor@Sun.COM 
3969517SBill.Taylor@Sun.COM typedef struct daplka_cno_resource {
3979517SBill.Taylor@Sun.COM 	daplka_resource_t	header;
3989517SBill.Taylor@Sun.COM 	kmutex_t		cno_lock;
3999517SBill.Taylor@Sun.COM 	kcondvar_t		cno_cv;
4009517SBill.Taylor@Sun.COM 	uint64_t		cno_evd_cookie;
4019517SBill.Taylor@Sun.COM } daplka_cno_resource_t;
4029517SBill.Taylor@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_cno_resource))
4039517SBill.Taylor@Sun.COM _NOTE(MUTEX_PROTECTS_DATA(daplka_cno_resource::cno_lock,
4049517SBill.Taylor@Sun.COM     daplka_cno_resource::cno_cv
4059517SBill.Taylor@Sun.COM     daplka_cno_resource::cno_evd_cookie))
4069517SBill.Taylor@Sun.COM 
4079517SBill.Taylor@Sun.COM #define	DAPLKA_SMR_FREED		0x0000
4089517SBill.Taylor@Sun.COM #define	DAPLKA_SMR_TRANSITIONING	0x0001
4099517SBill.Taylor@Sun.COM #define	DAPLKA_SMR_READY		0x0002
4109517SBill.Taylor@Sun.COM typedef struct daplka_shared_mr {
4119517SBill.Taylor@Sun.COM 	avl_node_t		smr_node;
4129517SBill.Taylor@Sun.COM 	uint32_t		smr_refcnt;
4139517SBill.Taylor@Sun.COM 	uint32_t		smr_state;
4149517SBill.Taylor@Sun.COM 	daplka_mr_resource_t	*smr_mr_list;
4159517SBill.Taylor@Sun.COM 	kcondvar_t		smr_cv;
4169517SBill.Taylor@Sun.COM 	dapl_mr_cookie_t	smr_cookie;
4179517SBill.Taylor@Sun.COM } daplka_shared_mr_t;
4189517SBill.Taylor@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_shared_mr))
4199517SBill.Taylor@Sun.COM _NOTE(SCHEME_PROTECTS_DATA("daplka", daplka_shared_mr::smr_mr_list))
4209517SBill.Taylor@Sun.COM 
4219517SBill.Taylor@Sun.COM /*
4229517SBill.Taylor@Sun.COM  * resource table data structures
4239517SBill.Taylor@Sun.COM  */
4249517SBill.Taylor@Sun.COM #define	DAPLKA_RC_BLKSZ		16
4259517SBill.Taylor@Sun.COM #define	DAPLKA_RC_RESERVED	0xff
4269517SBill.Taylor@Sun.COM typedef struct daplka_resource_blk {
4279517SBill.Taylor@Sun.COM 	int			daplka_rcblk_avail;
4289517SBill.Taylor@Sun.COM 	daplka_resource_t	*daplka_rcblk_blks[DAPLKA_RC_BLKSZ];
4299517SBill.Taylor@Sun.COM } daplka_resource_blk_t;
4309517SBill.Taylor@Sun.COM 
4319517SBill.Taylor@Sun.COM struct daplka_resource_table {
4329517SBill.Taylor@Sun.COM 	krwlock_t	daplka_rct_lock;
4339517SBill.Taylor@Sun.COM 	int		daplka_rc_len;
4349517SBill.Taylor@Sun.COM 	int		daplka_rc_sz;
4359517SBill.Taylor@Sun.COM 	int		daplka_rc_cnt;
4369517SBill.Taylor@Sun.COM 	ushort_t	daplka_rc_flag;
4379517SBill.Taylor@Sun.COM 	daplka_resource_blk_t **daplka_rc_root;
4389517SBill.Taylor@Sun.COM };
4399517SBill.Taylor@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(daplka_resource_table))
4409517SBill.Taylor@Sun.COM _NOTE(RWLOCK_PROTECTS_DATA(daplka_resource_table::daplka_rct_lock,
4419517SBill.Taylor@Sun.COM     daplka_resource_table::daplka_rc_root))
4429517SBill.Taylor@Sun.COM 
4439517SBill.Taylor@Sun.COM #ifdef __cplusplus
4449517SBill.Taylor@Sun.COM }
4459517SBill.Taylor@Sun.COM #endif
4469517SBill.Taylor@Sun.COM 
4479517SBill.Taylor@Sun.COM #endif	/* _DAPL_H_ */
448