10Sstevel@tonic-gate /* 20Sstevel@tonic-gate * CDDL HEADER START 30Sstevel@tonic-gate * 40Sstevel@tonic-gate * The contents of this file are subject to the terms of the 57387SRobert.Gordon@Sun.COM * Common Development and Distribution License (the "License"). 67387SRobert.Gordon@Sun.COM * You may not use this file except in compliance with the License. 70Sstevel@tonic-gate * 80Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 90Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 100Sstevel@tonic-gate * See the License for the specific language governing permissions 110Sstevel@tonic-gate * and limitations under the License. 120Sstevel@tonic-gate * 130Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 140Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 150Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 160Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 170Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 180Sstevel@tonic-gate * 190Sstevel@tonic-gate * CDDL HEADER END 200Sstevel@tonic-gate */ 210Sstevel@tonic-gate /* 22*12163SRamaswamy.Tummala@Sun.COM * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. 230Sstevel@tonic-gate */ 247387SRobert.Gordon@Sun.COM /* 257387SRobert.Gordon@Sun.COM * Copyright (c) 2007, The Ohio State University. All rights reserved. 267387SRobert.Gordon@Sun.COM * 277387SRobert.Gordon@Sun.COM * Portions of this source code is developed by the team members of 287387SRobert.Gordon@Sun.COM * The Ohio State University's Network-Based Computing Laboratory (NBCL), 297387SRobert.Gordon@Sun.COM * headed by Professor Dhabaleswar K. (DK) Panda. 307387SRobert.Gordon@Sun.COM * 317387SRobert.Gordon@Sun.COM * Acknowledgements to contributions from developors: 327387SRobert.Gordon@Sun.COM * Ranjit Noronha: noronha@cse.ohio-state.edu 337387SRobert.Gordon@Sun.COM * Lei Chai : chail@cse.ohio-state.edu 347387SRobert.Gordon@Sun.COM * Weikuan Yu : yuw@cse.ohio-state.edu 357387SRobert.Gordon@Sun.COM * 367387SRobert.Gordon@Sun.COM */ 377387SRobert.Gordon@Sun.COM 380Sstevel@tonic-gate 390Sstevel@tonic-gate #ifndef _IB_H 400Sstevel@tonic-gate #define _IB_H 410Sstevel@tonic-gate 420Sstevel@tonic-gate /* 430Sstevel@tonic-gate * ib.h, rpcib plugin interface. 440Sstevel@tonic-gate */ 450Sstevel@tonic-gate 460Sstevel@tonic-gate #include <sys/types.h> 470Sstevel@tonic-gate #include <sys/ddi.h> 480Sstevel@tonic-gate #include <sys/sunddi.h> 490Sstevel@tonic-gate #include <sys/conf.h> 500Sstevel@tonic-gate #include <sys/stat.h> 510Sstevel@tonic-gate #include <rpc/rpc.h> 520Sstevel@tonic-gate #include <rpc/rpc_rdma.h> 530Sstevel@tonic-gate #include <sys/ib/ibtl/ibti.h> 547387SRobert.Gordon@Sun.COM #include <sys/avl.h> 550Sstevel@tonic-gate 560Sstevel@tonic-gate #ifdef __cplusplus 570Sstevel@tonic-gate extern "C" { 580Sstevel@tonic-gate #endif 590Sstevel@tonic-gate 607387SRobert.Gordon@Sun.COM #define MAX_BUFS 1024 /* max no. of buffers per pool */ 617387SRobert.Gordon@Sun.COM 620Sstevel@tonic-gate #define DEF_CQ_SIZE 4096 - 1 /* default CQ size */ 630Sstevel@tonic-gate /* 640Sstevel@tonic-gate * Tavor returns the next higher power of 2 650Sstevel@tonic-gate * CQ entries than the requested size. 660Sstevel@tonic-gate * For instance, if you request (2^12 - 1) 670Sstevel@tonic-gate * CQ entries, Tavor returns 2^12 entries. 680Sstevel@tonic-gate * 4K CQ entries suffice. Hence, 4096 - 1. 690Sstevel@tonic-gate */ 700Sstevel@tonic-gate #define DEF_SQ_SIZE 128 /* default SendQ size */ 710Sstevel@tonic-gate #define DEF_RQ_SIZE 256 /* default RecvQ size */ 720Sstevel@tonic-gate #define DSEG_MAX 2 730Sstevel@tonic-gate #define RQ_DSEG_MAX 1 /* default RQ data seg */ 740Sstevel@tonic-gate #define IBSRM_HB 0x8000 /* high order bit of pkey */ 750Sstevel@tonic-gate 760Sstevel@tonic-gate /* max no. of refresh attempts on IBT_CM_CONN_STALE error */ 770Sstevel@tonic-gate #define REFRESH_ATTEMPTS 3 780Sstevel@tonic-gate 790Sstevel@tonic-gate typedef struct rib_hca_s rib_hca_t; 800Sstevel@tonic-gate typedef struct rib_qp_s rib_qp_t; 810Sstevel@tonic-gate typedef struct rib_cq_s rib_cq_t; 820Sstevel@tonic-gate 830Sstevel@tonic-gate /* 840Sstevel@tonic-gate * Notification for RDMA_DONE is based on xid 850Sstevel@tonic-gate */ 860Sstevel@tonic-gate struct rdma_done_list { 870Sstevel@tonic-gate uint32_t xid; /* XID waiting for RDMA_DONE */ 880Sstevel@tonic-gate kcondvar_t rdma_done_cv; /* cv for RDMA_DONE */ 890Sstevel@tonic-gate struct rdma_done_list *next; 900Sstevel@tonic-gate struct rdma_done_list *prev; 910Sstevel@tonic-gate }; 920Sstevel@tonic-gate 930Sstevel@tonic-gate /* 940Sstevel@tonic-gate * State of the plugin. 950Sstevel@tonic-gate * ACCEPT = accepting new connections and requests 960Sstevel@tonic-gate * NO_ACCEPT = not accepting new connection and requests 970Sstevel@tonic-gate */ 980Sstevel@tonic-gate #define ACCEPT 1 990Sstevel@tonic-gate #define NO_ACCEPT 2 1000Sstevel@tonic-gate 1010Sstevel@tonic-gate /* 1020Sstevel@tonic-gate * Send Wait states 1030Sstevel@tonic-gate */ 1040Sstevel@tonic-gate #define SEND_WAIT -1 1050Sstevel@tonic-gate 1060Sstevel@tonic-gate /* 1070Sstevel@tonic-gate * Reply states 1080Sstevel@tonic-gate */ 1090Sstevel@tonic-gate #define REPLY_WAIT -1 1100Sstevel@tonic-gate 1110Sstevel@tonic-gate typedef void * rib_pvoid; 1120Sstevel@tonic-gate typedef rib_pvoid RIB_SYNCMEM_HANDLE; 1130Sstevel@tonic-gate 1140Sstevel@tonic-gate /* 1150Sstevel@tonic-gate * IB buffer pool management structure 1160Sstevel@tonic-gate */ 1170Sstevel@tonic-gate 1180Sstevel@tonic-gate /* 1190Sstevel@tonic-gate * Buffer pool info 1200Sstevel@tonic-gate */ 1210Sstevel@tonic-gate typedef struct { 1220Sstevel@tonic-gate kmutex_t buflock; /* lock for this structure */ 1230Sstevel@tonic-gate caddr_t buf; /* pool address */ 1240Sstevel@tonic-gate uint32_t bufhandle; /* rkey for this pool */ 1250Sstevel@tonic-gate ulong_t bufsize; /* size of pool */ 1260Sstevel@tonic-gate int rsize; /* size of each element */ 1270Sstevel@tonic-gate int numelems; /* no. of elements allocated */ 1280Sstevel@tonic-gate int buffree; /* no. of free elements */ 1290Sstevel@tonic-gate void *buflist[1]; /* free elements in pool */ 1300Sstevel@tonic-gate } bufpool_t; 1310Sstevel@tonic-gate 1320Sstevel@tonic-gate typedef struct { 1330Sstevel@tonic-gate bufpool_t *bpool; 1340Sstevel@tonic-gate ibt_mr_hdl_t *mr_hdl; 1350Sstevel@tonic-gate ibt_mr_desc_t *mr_desc; /* vaddr, lkey, rkey */ 1360Sstevel@tonic-gate } rib_bufpool_t; 1370Sstevel@tonic-gate 1380Sstevel@tonic-gate /* 1390Sstevel@tonic-gate * ATS relsted defines and structures. 1400Sstevel@tonic-gate */ 1410Sstevel@tonic-gate #define ATS_AR_DATA_LEN 16 1420Sstevel@tonic-gate 1430Sstevel@tonic-gate 1440Sstevel@tonic-gate /* 1450Sstevel@tonic-gate * Service types supported by RPCIB 1460Sstevel@tonic-gate * For now only NFS is supported. 1470Sstevel@tonic-gate */ 1480Sstevel@tonic-gate #define NFS 1 1490Sstevel@tonic-gate #define NLM 2 1500Sstevel@tonic-gate 1510Sstevel@tonic-gate /* 1520Sstevel@tonic-gate * Tracks consumer state (client or server). 1530Sstevel@tonic-gate */ 1540Sstevel@tonic-gate typedef enum { 1550Sstevel@tonic-gate RIB_SERVER, 1560Sstevel@tonic-gate RIB_CLIENT 1570Sstevel@tonic-gate } rib_mode_t; 1580Sstevel@tonic-gate 1590Sstevel@tonic-gate /* 1600Sstevel@tonic-gate * CQ structure 1610Sstevel@tonic-gate */ 1620Sstevel@tonic-gate struct rib_cq_s { 1630Sstevel@tonic-gate rib_hca_t *rib_hca; 1640Sstevel@tonic-gate ibt_cq_hdl_t rib_cq_hdl; 1650Sstevel@tonic-gate }; 1660Sstevel@tonic-gate 1670Sstevel@tonic-gate /* 1689733SFaramarz.Jalalian@Sun.COM * Each registered service's data structure. 1699733SFaramarz.Jalalian@Sun.COM */ 1709733SFaramarz.Jalalian@Sun.COM typedef struct rib_service_s rib_service_t; 1719733SFaramarz.Jalalian@Sun.COM struct rib_service_s { 1729733SFaramarz.Jalalian@Sun.COM uint32_t srv_type; /* i.e, NFS, NLM, v4CBD */ 1739733SFaramarz.Jalalian@Sun.COM ibt_srv_hdl_t srv_hdl; /* from ibt_register call */ 1749733SFaramarz.Jalalian@Sun.COM ib_svc_id_t srv_id; 1759733SFaramarz.Jalalian@Sun.COM rib_service_t *next; 1769733SFaramarz.Jalalian@Sun.COM }; 1779733SFaramarz.Jalalian@Sun.COM 1789733SFaramarz.Jalalian@Sun.COM /* 1790Sstevel@tonic-gate * RPCIB plugin state 1800Sstevel@tonic-gate */ 1810Sstevel@tonic-gate typedef struct rpcib_state { 1820Sstevel@tonic-gate ibt_clnt_hdl_t ibt_clnt_hdl; 1830Sstevel@tonic-gate uint32_t hca_count; 1840Sstevel@tonic-gate uint32_t nhca_inited; 1859733SFaramarz.Jalalian@Sun.COM rib_hca_t *hcas_list; 1869733SFaramarz.Jalalian@Sun.COM krwlock_t hcas_list_lock; /* protects hcas_list */ 1870Sstevel@tonic-gate int refcount; 1880Sstevel@tonic-gate kmutex_t open_hca_lock; 1890Sstevel@tonic-gate queue_t *q; /* up queue for a serv_type */ 1900Sstevel@tonic-gate void *private; 1919733SFaramarz.Jalalian@Sun.COM rib_service_t *service_list; 1929733SFaramarz.Jalalian@Sun.COM krwlock_t service_list_lock; 1939733SFaramarz.Jalalian@Sun.COM kmutex_t listen_lock; 1940Sstevel@tonic-gate } rpcib_state_t; 1950Sstevel@tonic-gate 1960Sstevel@tonic-gate /* 1970Sstevel@tonic-gate * Connection lists 1980Sstevel@tonic-gate */ 1990Sstevel@tonic-gate typedef struct { 2000Sstevel@tonic-gate krwlock_t conn_lock; /* list lock */ 2010Sstevel@tonic-gate CONN *conn_hd; /* list head */ 2020Sstevel@tonic-gate } rib_conn_list_t; 2030Sstevel@tonic-gate 2040Sstevel@tonic-gate enum hca_state { 2058695SRajkumar.Sivaprakasam@Sun.COM HCA_DETACHED, /* hca in detached state */ 2060Sstevel@tonic-gate HCA_INITED, /* hca in up and running state */ 2070Sstevel@tonic-gate }; 2080Sstevel@tonic-gate 2099733SFaramarz.Jalalian@Sun.COM typedef struct rib_hca_service_s rib_hca_service_t; 2109733SFaramarz.Jalalian@Sun.COM struct rib_hca_service_s { 2119733SFaramarz.Jalalian@Sun.COM ib_svc_id_t srv_id; 2129733SFaramarz.Jalalian@Sun.COM ib_gid_t gid; 2139733SFaramarz.Jalalian@Sun.COM ibt_sbind_hdl_t sbind_hdl; 2149733SFaramarz.Jalalian@Sun.COM rib_hca_service_t *next; 2159733SFaramarz.Jalalian@Sun.COM }; 2169733SFaramarz.Jalalian@Sun.COM 2170Sstevel@tonic-gate /* 2180Sstevel@tonic-gate * RPCIB per HCA structure 2190Sstevel@tonic-gate */ 2200Sstevel@tonic-gate struct rib_hca_s { 2210Sstevel@tonic-gate ibt_clnt_hdl_t ibt_clnt_hdl; 2220Sstevel@tonic-gate 2230Sstevel@tonic-gate /* 2240Sstevel@tonic-gate * per HCA. 2250Sstevel@tonic-gate */ 2260Sstevel@tonic-gate ibt_hca_hdl_t hca_hdl; /* HCA handle */ 2270Sstevel@tonic-gate ibt_hca_attr_t hca_attrs; /* HCA attributes */ 2280Sstevel@tonic-gate ibt_pd_hdl_t pd_hdl; 2299733SFaramarz.Jalalian@Sun.COM rib_hca_service_t *bound_services; 2309733SFaramarz.Jalalian@Sun.COM krwlock_t bound_services_lock; 2310Sstevel@tonic-gate ib_guid_t hca_guid; 2320Sstevel@tonic-gate uint32_t hca_nports; 2330Sstevel@tonic-gate ibt_hca_portinfo_t *hca_ports; 2340Sstevel@tonic-gate size_t hca_pinfosz; 2350Sstevel@tonic-gate enum hca_state state; /* state of HCA */ 2360Sstevel@tonic-gate krwlock_t state_lock; /* protects state field */ 2370Sstevel@tonic-gate bool_t inuse; /* indicates HCA usage */ 2380Sstevel@tonic-gate kmutex_t inuse_lock; /* protects inuse field */ 2390Sstevel@tonic-gate 2400Sstevel@tonic-gate rib_conn_list_t cl_conn_list; /* client conn list */ 2410Sstevel@tonic-gate rib_conn_list_t srv_conn_list; /* server conn list */ 2420Sstevel@tonic-gate 2430Sstevel@tonic-gate rib_cq_t *clnt_scq; 2440Sstevel@tonic-gate rib_cq_t *clnt_rcq; 2450Sstevel@tonic-gate rib_cq_t *svc_scq; 2460Sstevel@tonic-gate rib_cq_t *svc_rcq; 2470Sstevel@tonic-gate kmutex_t cb_lock; 2480Sstevel@tonic-gate kcondvar_t cb_cv; 2490Sstevel@tonic-gate 2500Sstevel@tonic-gate rib_bufpool_t *recv_pool; /* recv buf pool */ 2510Sstevel@tonic-gate rib_bufpool_t *send_pool; /* send buf pool */ 2520Sstevel@tonic-gate 2530Sstevel@tonic-gate void *iblock; /* interrupt cookie */ 2547387SRobert.Gordon@Sun.COM 2557387SRobert.Gordon@Sun.COM kmem_cache_t *server_side_cache; /* long reply pool */ 2567387SRobert.Gordon@Sun.COM avl_tree_t avl_tree; 2577387SRobert.Gordon@Sun.COM kmutex_t avl_lock; 2587387SRobert.Gordon@Sun.COM krwlock_t avl_rw_lock; 2597387SRobert.Gordon@Sun.COM volatile bool_t avl_init; 2609733SFaramarz.Jalalian@Sun.COM kmutex_t cache_allocation_lock; 2619723SSiddheshwar.Mahesh@Sun.COM ddi_taskq_t *cleanup_helper; 2627387SRobert.Gordon@Sun.COM ib_svc_id_t srv_id; 2637387SRobert.Gordon@Sun.COM ibt_srv_hdl_t srv_hdl; 2647387SRobert.Gordon@Sun.COM uint_t reg_state; 2659733SFaramarz.Jalalian@Sun.COM 2669733SFaramarz.Jalalian@Sun.COM volatile uint64_t cache_allocation; 2679733SFaramarz.Jalalian@Sun.COM uint64_t cache_hits; 2689733SFaramarz.Jalalian@Sun.COM uint64_t cache_misses; 2699733SFaramarz.Jalalian@Sun.COM uint64_t cache_cold_misses; 2709733SFaramarz.Jalalian@Sun.COM uint64_t cache_hot_misses; 2719733SFaramarz.Jalalian@Sun.COM uint64_t cache_misses_above_the_limit; 2729733SFaramarz.Jalalian@Sun.COM 2739733SFaramarz.Jalalian@Sun.COM struct rib_hca_s *next; 2740Sstevel@tonic-gate }; 2750Sstevel@tonic-gate 2760Sstevel@tonic-gate 2770Sstevel@tonic-gate /* 2780Sstevel@tonic-gate * Structure on wait state of a post send 2790Sstevel@tonic-gate */ 2800Sstevel@tonic-gate struct send_wid { 2810Sstevel@tonic-gate uint32_t xid; 2820Sstevel@tonic-gate int cv_sig; 2830Sstevel@tonic-gate kmutex_t sendwait_lock; 2840Sstevel@tonic-gate kcondvar_t wait_cv; 2850Sstevel@tonic-gate uint_t status; 2860Sstevel@tonic-gate rib_qp_t *qp; 2870Sstevel@tonic-gate int nsbufs; /* # of send buffers posted */ 2880Sstevel@tonic-gate uint64_t sbufaddr[DSEG_MAX]; /* posted send buffers */ 2897387SRobert.Gordon@Sun.COM caddr_t c; 2907387SRobert.Gordon@Sun.COM caddr_t c1; 2917387SRobert.Gordon@Sun.COM int l1; 2927387SRobert.Gordon@Sun.COM caddr_t c2; 2937387SRobert.Gordon@Sun.COM int l2; 2947387SRobert.Gordon@Sun.COM int wl, rl; 2950Sstevel@tonic-gate }; 2960Sstevel@tonic-gate 2970Sstevel@tonic-gate /* 2980Sstevel@tonic-gate * Structure on reply descriptor for recv queue. 2990Sstevel@tonic-gate * Different from the above posting of a descriptor. 3000Sstevel@tonic-gate */ 3010Sstevel@tonic-gate struct reply { 3020Sstevel@tonic-gate uint32_t xid; 3030Sstevel@tonic-gate uint_t status; 3040Sstevel@tonic-gate uint64_t vaddr_cq; /* buf addr from CQ */ 3050Sstevel@tonic-gate uint_t bytes_xfer; 3060Sstevel@tonic-gate kcondvar_t wait_cv; 3070Sstevel@tonic-gate struct reply *next; 3080Sstevel@tonic-gate struct reply *prev; 3090Sstevel@tonic-gate }; 3100Sstevel@tonic-gate 3110Sstevel@tonic-gate struct svc_recv { 3120Sstevel@tonic-gate rib_qp_t *qp; 3130Sstevel@tonic-gate uint64_t vaddr; 3140Sstevel@tonic-gate uint_t bytes_xfer; 3150Sstevel@tonic-gate }; 3160Sstevel@tonic-gate 3170Sstevel@tonic-gate struct recv_wid { 3180Sstevel@tonic-gate uint32_t xid; 3190Sstevel@tonic-gate rib_qp_t *qp; 3200Sstevel@tonic-gate uint64_t addr; /* posted buf addr */ 3210Sstevel@tonic-gate }; 3220Sstevel@tonic-gate 3230Sstevel@tonic-gate /* 3240Sstevel@tonic-gate * Per QP data structure 3250Sstevel@tonic-gate */ 3260Sstevel@tonic-gate struct rib_qp_s { 3270Sstevel@tonic-gate rib_hca_t *hca; 3280Sstevel@tonic-gate rib_mode_t mode; /* RIB_SERVER or RIB_CLIENT */ 3290Sstevel@tonic-gate CONN rdmaconn; 3300Sstevel@tonic-gate ibt_channel_hdl_t qp_hdl; 3310Sstevel@tonic-gate uint_t port_num; 3320Sstevel@tonic-gate ib_qpn_t qpn; 3330Sstevel@tonic-gate int chan_flags; 3340Sstevel@tonic-gate clock_t timeout; 3350Sstevel@tonic-gate ibt_rc_chan_query_attr_t qp_q_attrs; 3360Sstevel@tonic-gate rib_cq_t *send_cq; /* send CQ */ 3370Sstevel@tonic-gate rib_cq_t *recv_cq; /* recv CQ */ 3380Sstevel@tonic-gate 3390Sstevel@tonic-gate /* 3400Sstevel@tonic-gate * Number of pre-posted rbufs 3410Sstevel@tonic-gate */ 3420Sstevel@tonic-gate uint_t n_posted_rbufs; 3430Sstevel@tonic-gate kcondvar_t posted_rbufs_cv; 3440Sstevel@tonic-gate kmutex_t posted_rbufs_lock; 3450Sstevel@tonic-gate 3460Sstevel@tonic-gate /* 3479723SSiddheshwar.Mahesh@Sun.COM * Number of SENDs pending completion 3489723SSiddheshwar.Mahesh@Sun.COM */ 3499723SSiddheshwar.Mahesh@Sun.COM 3509723SSiddheshwar.Mahesh@Sun.COM uint_t n_send_rbufs; 3519723SSiddheshwar.Mahesh@Sun.COM kcondvar_t send_rbufs_cv; 3529723SSiddheshwar.Mahesh@Sun.COM kmutex_t send_rbufs_lock; 3539723SSiddheshwar.Mahesh@Sun.COM 3549723SSiddheshwar.Mahesh@Sun.COM /* 3550Sstevel@tonic-gate * RPC reply 3560Sstevel@tonic-gate */ 3570Sstevel@tonic-gate uint_t rep_list_size; 3580Sstevel@tonic-gate struct reply *replylist; 3590Sstevel@tonic-gate kmutex_t replylist_lock; 3600Sstevel@tonic-gate 3610Sstevel@tonic-gate /* 3620Sstevel@tonic-gate * server only, RDMA_DONE 3630Sstevel@tonic-gate */ 3640Sstevel@tonic-gate struct rdma_done_list *rdlist; 3650Sstevel@tonic-gate kmutex_t rdlist_lock; 3660Sstevel@tonic-gate 3670Sstevel@tonic-gate kmutex_t cb_lock; 3680Sstevel@tonic-gate kcondvar_t cb_conn_cv; 3690Sstevel@tonic-gate 3700Sstevel@tonic-gate caddr_t q; /* upstream queue */ 3717387SRobert.Gordon@Sun.COM struct send_wid wd; 3720Sstevel@tonic-gate }; 3730Sstevel@tonic-gate 3740Sstevel@tonic-gate #define ctoqp(conn) ((rib_qp_t *)((conn)->c_private)) 3750Sstevel@tonic-gate #define qptoc(rqp) ((CONN *)&((rqp)->rdmaconn)) 3760Sstevel@tonic-gate 3770Sstevel@tonic-gate /* 3780Sstevel@tonic-gate * Timeout for various calls 3790Sstevel@tonic-gate */ 3800Sstevel@tonic-gate #define CONN_WAIT_TIME 40 3810Sstevel@tonic-gate #define SEND_WAIT_TIME 40 /* time for send completion */ 3820Sstevel@tonic-gate 3830Sstevel@tonic-gate #define REPLY_WAIT_TIME 40 /* time to get reply from remote QP */ 3840Sstevel@tonic-gate 3850Sstevel@tonic-gate #ifdef __cplusplus 3860Sstevel@tonic-gate } 3870Sstevel@tonic-gate #endif 3880Sstevel@tonic-gate 3890Sstevel@tonic-gate #endif /* !_IB_H */ 390