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