xref: /onnv-gate/usr/src/uts/common/sys/ib/clients/eoib/enx_impl.h (revision 13101:da7b13ec3a28)
1*13101SVenki.Rajagopalan@Sun.COM /*
2*13101SVenki.Rajagopalan@Sun.COM  * CDDL HEADER START
3*13101SVenki.Rajagopalan@Sun.COM  *
4*13101SVenki.Rajagopalan@Sun.COM  * The contents of this file are subject to the terms of the
5*13101SVenki.Rajagopalan@Sun.COM  * Common Development and Distribution License (the "License").
6*13101SVenki.Rajagopalan@Sun.COM  * You may not use this file except in compliance with the License.
7*13101SVenki.Rajagopalan@Sun.COM  *
8*13101SVenki.Rajagopalan@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*13101SVenki.Rajagopalan@Sun.COM  * or http://www.opensolaris.org/os/licensing.
10*13101SVenki.Rajagopalan@Sun.COM  * See the License for the specific language governing permissions
11*13101SVenki.Rajagopalan@Sun.COM  * and limitations under the License.
12*13101SVenki.Rajagopalan@Sun.COM  *
13*13101SVenki.Rajagopalan@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
14*13101SVenki.Rajagopalan@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*13101SVenki.Rajagopalan@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
16*13101SVenki.Rajagopalan@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
17*13101SVenki.Rajagopalan@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
18*13101SVenki.Rajagopalan@Sun.COM  *
19*13101SVenki.Rajagopalan@Sun.COM  * CDDL HEADER END
20*13101SVenki.Rajagopalan@Sun.COM  */
21*13101SVenki.Rajagopalan@Sun.COM 
22*13101SVenki.Rajagopalan@Sun.COM /*
23*13101SVenki.Rajagopalan@Sun.COM  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
24*13101SVenki.Rajagopalan@Sun.COM  */
25*13101SVenki.Rajagopalan@Sun.COM 
26*13101SVenki.Rajagopalan@Sun.COM #ifndef _SYS_IB_EOIB_ENX_IMPL_H
27*13101SVenki.Rajagopalan@Sun.COM #define	_SYS_IB_EOIB_ENX_IMPL_H
28*13101SVenki.Rajagopalan@Sun.COM 
29*13101SVenki.Rajagopalan@Sun.COM #ifdef __cplusplus
30*13101SVenki.Rajagopalan@Sun.COM extern "C" {
31*13101SVenki.Rajagopalan@Sun.COM #endif
32*13101SVenki.Rajagopalan@Sun.COM 
33*13101SVenki.Rajagopalan@Sun.COM #include <sys/ddi.h>
34*13101SVenki.Rajagopalan@Sun.COM #include <sys/sunddi.h>
35*13101SVenki.Rajagopalan@Sun.COM #include <sys/varargs.h>
36*13101SVenki.Rajagopalan@Sun.COM #include <sys/ib/ibtl/ibti.h>
37*13101SVenki.Rajagopalan@Sun.COM #include <sys/ib/ibtl/ibvti.h>
38*13101SVenki.Rajagopalan@Sun.COM #include <sys/ib/ib_pkt_hdrs.h>
39*13101SVenki.Rajagopalan@Sun.COM #include <sys/ib/ibtl/impl/ibtl_ibnex.h>
40*13101SVenki.Rajagopalan@Sun.COM #include <sys/ib/mgt/sm_attr.h>
41*13101SVenki.Rajagopalan@Sun.COM 
42*13101SVenki.Rajagopalan@Sun.COM #include <sys/ib/clients/eoib/fip.h>
43*13101SVenki.Rajagopalan@Sun.COM #include <sys/ib/clients/eoib/eib.h>
44*13101SVenki.Rajagopalan@Sun.COM 
45*13101SVenki.Rajagopalan@Sun.COM /*
46*13101SVenki.Rajagopalan@Sun.COM  * Driver specific constants
47*13101SVenki.Rajagopalan@Sun.COM  */
48*13101SVenki.Rajagopalan@Sun.COM #define	ENX_E_SUCCESS		0
49*13101SVenki.Rajagopalan@Sun.COM #define	ENX_E_FAILURE		-1
50*13101SVenki.Rajagopalan@Sun.COM #define	ENX_MAX_LINE		128
51*13101SVenki.Rajagopalan@Sun.COM #define	ENX_GRH_SZ		(sizeof (ib_grh_t))
52*13101SVenki.Rajagopalan@Sun.COM 
53*13101SVenki.Rajagopalan@Sun.COM /*
54*13101SVenki.Rajagopalan@Sun.COM  * Debug messages
55*13101SVenki.Rajagopalan@Sun.COM  */
56*13101SVenki.Rajagopalan@Sun.COM #define	ENX_MSGS_CRIT		0x01
57*13101SVenki.Rajagopalan@Sun.COM #define	ENX_MSGS_ERR		0x02
58*13101SVenki.Rajagopalan@Sun.COM #define	ENX_MSGS_WARN		0x04
59*13101SVenki.Rajagopalan@Sun.COM #define	ENX_MSGS_DEBUG		0x08
60*13101SVenki.Rajagopalan@Sun.COM #define	ENX_MSGS_ARGS		0x10
61*13101SVenki.Rajagopalan@Sun.COM #define	ENX_MSGS_VERBOSE	0x20
62*13101SVenki.Rajagopalan@Sun.COM #define	ENX_MSGS_DEFAULT	(ENX_MSGS_CRIT | ENX_MSGS_ERR | ENX_MSGS_WARN)
63*13101SVenki.Rajagopalan@Sun.COM 
64*13101SVenki.Rajagopalan@Sun.COM #define	ENX_LOGSZ_DEFAULT	0x20000
65*13101SVenki.Rajagopalan@Sun.COM 
66*13101SVenki.Rajagopalan@Sun.COM #define	ENX_DPRINTF_CRIT	eibnx_dprintf_crit
67*13101SVenki.Rajagopalan@Sun.COM #define	ENX_DPRINTF_ERR		eibnx_dprintf_err
68*13101SVenki.Rajagopalan@Sun.COM #define	ENX_DPRINTF_WARN	eibnx_dprintf_warn
69*13101SVenki.Rajagopalan@Sun.COM #ifdef ENX_DEBUG
70*13101SVenki.Rajagopalan@Sun.COM #define	ENX_DPRINTF_DEBUG	eibnx_dprintf_debug
71*13101SVenki.Rajagopalan@Sun.COM #define	ENX_DPRINTF_ARGS	eibnx_dprintf_args
72*13101SVenki.Rajagopalan@Sun.COM #define	ENX_DPRINTF_VERBOSE	eibnx_dprintf_verbose
73*13101SVenki.Rajagopalan@Sun.COM #else
74*13101SVenki.Rajagopalan@Sun.COM #define	ENX_DPRINTF_DEBUG	0 &&
75*13101SVenki.Rajagopalan@Sun.COM #define	ENX_DPRINTF_ARGS	0 &&
76*13101SVenki.Rajagopalan@Sun.COM #define	ENX_DPRINTF_VERBOSE	0 &&
77*13101SVenki.Rajagopalan@Sun.COM #endif
78*13101SVenki.Rajagopalan@Sun.COM 
79*13101SVenki.Rajagopalan@Sun.COM /*
80*13101SVenki.Rajagopalan@Sun.COM  *  EoIB Nexus service threads
81*13101SVenki.Rajagopalan@Sun.COM  */
82*13101SVenki.Rajagopalan@Sun.COM #define	ENX_PORT_MONITOR	"eibnx_port_%d_monitor"
83*13101SVenki.Rajagopalan@Sun.COM #define	ENX_NODE_CREATOR	"eibnx_node_creator"
84*13101SVenki.Rajagopalan@Sun.COM 
85*13101SVenki.Rajagopalan@Sun.COM /*
86*13101SVenki.Rajagopalan@Sun.COM  * Default period (us) for unicast solicitations to discovered gateways.
87*13101SVenki.Rajagopalan@Sun.COM  * EoIB specification requires that hosts send solicitation atleast every
88*13101SVenki.Rajagopalan@Sun.COM  * 4 * GW_ADV_PERIOD.
89*13101SVenki.Rajagopalan@Sun.COM  */
90*13101SVenki.Rajagopalan@Sun.COM #define	ENX_DFL_SOLICIT_PERIOD_USEC	32000000
91*13101SVenki.Rajagopalan@Sun.COM 
92*13101SVenki.Rajagopalan@Sun.COM /*
93*13101SVenki.Rajagopalan@Sun.COM  * Portinfo list per HCA
94*13101SVenki.Rajagopalan@Sun.COM  */
95*13101SVenki.Rajagopalan@Sun.COM typedef struct eibnx_port_s {
96*13101SVenki.Rajagopalan@Sun.COM 	struct eibnx_port_s 	*po_next;
97*13101SVenki.Rajagopalan@Sun.COM 	ibt_hca_portinfo_t	*po_pi;
98*13101SVenki.Rajagopalan@Sun.COM 	uint_t			po_pi_size;
99*13101SVenki.Rajagopalan@Sun.COM } eibnx_port_t;
100*13101SVenki.Rajagopalan@Sun.COM 
101*13101SVenki.Rajagopalan@Sun.COM /*
102*13101SVenki.Rajagopalan@Sun.COM  * HCA details
103*13101SVenki.Rajagopalan@Sun.COM  */
104*13101SVenki.Rajagopalan@Sun.COM typedef struct eibnx_hca_s {
105*13101SVenki.Rajagopalan@Sun.COM 	struct eibnx_hca_s 	*hc_next;
106*13101SVenki.Rajagopalan@Sun.COM 	ib_guid_t		hc_guid;
107*13101SVenki.Rajagopalan@Sun.COM 	ibt_hca_hdl_t		hc_hdl;
108*13101SVenki.Rajagopalan@Sun.COM 	ibt_pd_hdl_t		hc_pd;
109*13101SVenki.Rajagopalan@Sun.COM 	eibnx_port_t		*hc_port;
110*13101SVenki.Rajagopalan@Sun.COM } eibnx_hca_t;
111*13101SVenki.Rajagopalan@Sun.COM 
112*13101SVenki.Rajagopalan@Sun.COM /*
113*13101SVenki.Rajagopalan@Sun.COM  * The port_monitor thread in EoIB nexus driver only sends two types of
114*13101SVenki.Rajagopalan@Sun.COM  * packets: multicast solicitation the first time around, and periodic
115*13101SVenki.Rajagopalan@Sun.COM  * unicast solicitations later to gateways that have been discovered. So
116*13101SVenki.Rajagopalan@Sun.COM  * we need a couple of send wqes for the multicast solicitation and
117*13101SVenki.Rajagopalan@Sun.COM  * probably as many send wqes as the number of gateways that may be
118*13101SVenki.Rajagopalan@Sun.COM  * discovered from each port, for sending the unicast solicitations.
119*13101SVenki.Rajagopalan@Sun.COM  * For unicast solicitations though, the UD destination needs to be set
120*13101SVenki.Rajagopalan@Sun.COM  * up at the time we receive the advertisement from the gateway, using
121*13101SVenki.Rajagopalan@Sun.COM  * ibt_modify_reply_ud_dest(), so we'll assign one send wqe for each
122*13101SVenki.Rajagopalan@Sun.COM  * gateway that we discover.  This means that we need to acquire these
123*13101SVenki.Rajagopalan@Sun.COM  * send wqe entries during rx processing in the completion handler, which
124*13101SVenki.Rajagopalan@Sun.COM  * means we must avoid sleeping in trying to acquire the swqe. Therefore,
125*13101SVenki.Rajagopalan@Sun.COM  * we'll pre-allocate these unicast solication send wqes to be atleast
126*13101SVenki.Rajagopalan@Sun.COM  * twice the number of recv wqes.
127*13101SVenki.Rajagopalan@Sun.COM  *
128*13101SVenki.Rajagopalan@Sun.COM  * The receive packets expected by the EoIB nexus driver are the multicast
129*13101SVenki.Rajagopalan@Sun.COM  * and unicast messages on the SOLICIT and ADVERTISE groups. These
130*13101SVenki.Rajagopalan@Sun.COM  * shouldn't be too many, and should be tuned as we gain experience on
131*13101SVenki.Rajagopalan@Sun.COM  * the traffic pattern.  We'll start with 16.
132*13101SVenki.Rajagopalan@Sun.COM  */
133*13101SVenki.Rajagopalan@Sun.COM #define	ENX_NUM_SWQE			46
134*13101SVenki.Rajagopalan@Sun.COM #define	ENX_NUM_RWQE			16
135*13101SVenki.Rajagopalan@Sun.COM #define	ENX_CQ_SIZE			(ENX_NUM_SWQE + ENX_NUM_RWQE + 2)
136*13101SVenki.Rajagopalan@Sun.COM 
137*13101SVenki.Rajagopalan@Sun.COM /*
138*13101SVenki.Rajagopalan@Sun.COM  * qe_type values
139*13101SVenki.Rajagopalan@Sun.COM  */
140*13101SVenki.Rajagopalan@Sun.COM #define	ENX_QETYP_RWQE			0x1
141*13101SVenki.Rajagopalan@Sun.COM #define	ENX_QETYP_SWQE			0x2
142*13101SVenki.Rajagopalan@Sun.COM 
143*13101SVenki.Rajagopalan@Sun.COM /*
144*13101SVenki.Rajagopalan@Sun.COM  * qe_flags bitmasks (protected by qe_lock). None of the
145*13101SVenki.Rajagopalan@Sun.COM  * flag values may be zero.
146*13101SVenki.Rajagopalan@Sun.COM  */
147*13101SVenki.Rajagopalan@Sun.COM #define	ENX_QEFL_INUSE			0x01
148*13101SVenki.Rajagopalan@Sun.COM #define	ENX_QEFL_POSTED			0x02
149*13101SVenki.Rajagopalan@Sun.COM #define	ENX_QEFL_RELONCOMP		0x04
150*13101SVenki.Rajagopalan@Sun.COM 
151*13101SVenki.Rajagopalan@Sun.COM /*
152*13101SVenki.Rajagopalan@Sun.COM  * Recv and send workq entries
153*13101SVenki.Rajagopalan@Sun.COM  */
154*13101SVenki.Rajagopalan@Sun.COM typedef struct eibnx_wqe_s {
155*13101SVenki.Rajagopalan@Sun.COM 	uint_t			qe_type;
156*13101SVenki.Rajagopalan@Sun.COM 	uint_t			qe_bufsz;
157*13101SVenki.Rajagopalan@Sun.COM 	ibt_wr_ds_t		qe_sgl;
158*13101SVenki.Rajagopalan@Sun.COM 	ibt_all_wr_t		qe_wr;
159*13101SVenki.Rajagopalan@Sun.COM 	kmutex_t		qe_lock;
160*13101SVenki.Rajagopalan@Sun.COM 	uint_t			qe_flags;
161*13101SVenki.Rajagopalan@Sun.COM } eibnx_wqe_t;
162*13101SVenki.Rajagopalan@Sun.COM 
163*13101SVenki.Rajagopalan@Sun.COM /*
164*13101SVenki.Rajagopalan@Sun.COM  * Tx descriptor
165*13101SVenki.Rajagopalan@Sun.COM  */
166*13101SVenki.Rajagopalan@Sun.COM typedef struct eibnx_tx_s {
167*13101SVenki.Rajagopalan@Sun.COM 	ib_vaddr_t		tx_vaddr;
168*13101SVenki.Rajagopalan@Sun.COM 	ibt_mr_hdl_t		tx_mr;
169*13101SVenki.Rajagopalan@Sun.COM 	ibt_lkey_t		tx_lkey;
170*13101SVenki.Rajagopalan@Sun.COM 	eibnx_wqe_t		tx_wqe[ENX_NUM_SWQE];
171*13101SVenki.Rajagopalan@Sun.COM } eibnx_tx_t;
172*13101SVenki.Rajagopalan@Sun.COM 
173*13101SVenki.Rajagopalan@Sun.COM /*
174*13101SVenki.Rajagopalan@Sun.COM  * Rx descriptor
175*13101SVenki.Rajagopalan@Sun.COM  */
176*13101SVenki.Rajagopalan@Sun.COM typedef struct eibnx_rx_s {
177*13101SVenki.Rajagopalan@Sun.COM 	ib_vaddr_t		rx_vaddr;
178*13101SVenki.Rajagopalan@Sun.COM 	ibt_mr_hdl_t		rx_mr;
179*13101SVenki.Rajagopalan@Sun.COM 	ibt_lkey_t		rx_lkey;
180*13101SVenki.Rajagopalan@Sun.COM 	eibnx_wqe_t		rx_wqe[ENX_NUM_RWQE];
181*13101SVenki.Rajagopalan@Sun.COM } eibnx_rx_t;
182*13101SVenki.Rajagopalan@Sun.COM 
183*13101SVenki.Rajagopalan@Sun.COM /*
184*13101SVenki.Rajagopalan@Sun.COM  * Details about the address of each gateway we discover.
185*13101SVenki.Rajagopalan@Sun.COM  */
186*13101SVenki.Rajagopalan@Sun.COM typedef struct eibnx_gw_addr_s {
187*13101SVenki.Rajagopalan@Sun.COM 	ibt_adds_vect_t		*ga_vect;
188*13101SVenki.Rajagopalan@Sun.COM 	ib_gid_t		ga_gid;
189*13101SVenki.Rajagopalan@Sun.COM 	ib_qpn_t		ga_qpn;
190*13101SVenki.Rajagopalan@Sun.COM 	ib_qkey_t		ga_qkey;
191*13101SVenki.Rajagopalan@Sun.COM 	ib_pkey_t		ga_pkey;
192*13101SVenki.Rajagopalan@Sun.COM } eibnx_gw_addr_t;
193*13101SVenki.Rajagopalan@Sun.COM 
194*13101SVenki.Rajagopalan@Sun.COM /*
195*13101SVenki.Rajagopalan@Sun.COM  * States for each GW
196*13101SVenki.Rajagopalan@Sun.COM  */
197*13101SVenki.Rajagopalan@Sun.COM #define	ENX_GW_STATE_UNAVAILABLE	1	/* GW nackd availability */
198*13101SVenki.Rajagopalan@Sun.COM #define	ENX_GW_STATE_AVAILABLE		2	/* GW mcasted availability */
199*13101SVenki.Rajagopalan@Sun.COM #define	ENX_GW_STATE_READY_TO_LOGIN	3	/* GW ucasted availability */
200*13101SVenki.Rajagopalan@Sun.COM 
201*13101SVenki.Rajagopalan@Sun.COM typedef struct eibnx_gw_info_s {
202*13101SVenki.Rajagopalan@Sun.COM 	struct eibnx_gw_info_s	*gw_next;
203*13101SVenki.Rajagopalan@Sun.COM 	eibnx_wqe_t		*gw_swqe;
204*13101SVenki.Rajagopalan@Sun.COM 	uint_t			gw_state;
205*13101SVenki.Rajagopalan@Sun.COM 
206*13101SVenki.Rajagopalan@Sun.COM 	kmutex_t		gw_adv_lock;
207*13101SVenki.Rajagopalan@Sun.COM 	uint_t			gw_adv_flag;
208*13101SVenki.Rajagopalan@Sun.COM 	int64_t			gw_adv_last_lbolt;
209*13101SVenki.Rajagopalan@Sun.COM 	int64_t			gw_adv_timeout_ticks;
210*13101SVenki.Rajagopalan@Sun.COM 
211*13101SVenki.Rajagopalan@Sun.COM 	eibnx_gw_addr_t		gw_addr;
212*13101SVenki.Rajagopalan@Sun.COM 
213*13101SVenki.Rajagopalan@Sun.COM 	ib_guid_t		gw_system_guid;
214*13101SVenki.Rajagopalan@Sun.COM 	ib_guid_t		gw_guid;
215*13101SVenki.Rajagopalan@Sun.COM 
216*13101SVenki.Rajagopalan@Sun.COM 	uint32_t		gw_adv_period;
217*13101SVenki.Rajagopalan@Sun.COM 	uint32_t		gw_ka_period;
218*13101SVenki.Rajagopalan@Sun.COM 	uint32_t		gw_vnic_ka_period;
219*13101SVenki.Rajagopalan@Sun.COM 	ib_qpn_t		gw_ctrl_qpn;
220*13101SVenki.Rajagopalan@Sun.COM 
221*13101SVenki.Rajagopalan@Sun.COM 	ib_lid_t		gw_lid;
222*13101SVenki.Rajagopalan@Sun.COM 	uint16_t		gw_portid;
223*13101SVenki.Rajagopalan@Sun.COM 	uint16_t		gw_num_net_vnics;
224*13101SVenki.Rajagopalan@Sun.COM 
225*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			gw_is_host_adm_vnics;
226*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			gw_sl;
227*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			gw_n_rss_qpn;
228*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			gw_flag_ucast_advt;
229*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			gw_flag_available;
230*13101SVenki.Rajagopalan@Sun.COM 
231*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			gw_system_name[EIB_GW_SYSNAME_LEN];
232*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			gw_port_name[EIB_GW_PORTNAME_LEN];
233*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			gw_vendor_id[EIB_GW_VENDOR_LEN];
234*13101SVenki.Rajagopalan@Sun.COM } eibnx_gw_info_t;
235*13101SVenki.Rajagopalan@Sun.COM 
236*13101SVenki.Rajagopalan@Sun.COM /*
237*13101SVenki.Rajagopalan@Sun.COM  * Values for gw_adv_flag (non-zero only)
238*13101SVenki.Rajagopalan@Sun.COM  */
239*13101SVenki.Rajagopalan@Sun.COM #define	ENX_GW_DEAD		1
240*13101SVenki.Rajagopalan@Sun.COM #define	ENX_GW_ALIVE		2
241*13101SVenki.Rajagopalan@Sun.COM #define	ENX_GW_AWARE		3
242*13101SVenki.Rajagopalan@Sun.COM 
243*13101SVenki.Rajagopalan@Sun.COM /*
244*13101SVenki.Rajagopalan@Sun.COM  * Currently, we only expect the advertisement type of packets
245*13101SVenki.Rajagopalan@Sun.COM  * from the gw. But we do get login acks from the gateway also
246*13101SVenki.Rajagopalan@Sun.COM  * here in the nexus, so we'll need an identifier for that.
247*13101SVenki.Rajagopalan@Sun.COM  */
248*13101SVenki.Rajagopalan@Sun.COM typedef enum {
249*13101SVenki.Rajagopalan@Sun.COM 	FIP_GW_ADVERTISE_MCAST = 0,
250*13101SVenki.Rajagopalan@Sun.COM 	FIP_GW_ADVERTISE_UCAST,
251*13101SVenki.Rajagopalan@Sun.COM 	FIP_VNIC_LOGIN_ACK
252*13101SVenki.Rajagopalan@Sun.COM } eibnx_gw_pkt_type_t;
253*13101SVenki.Rajagopalan@Sun.COM 
254*13101SVenki.Rajagopalan@Sun.COM /*
255*13101SVenki.Rajagopalan@Sun.COM  * Currently, the only gw response handled by the eibnx driver
256*13101SVenki.Rajagopalan@Sun.COM  * are the ucast/mcast advertisements.  Information collected from
257*13101SVenki.Rajagopalan@Sun.COM  * both these responses may be packed into a eibnx_gw_info_t.
258*13101SVenki.Rajagopalan@Sun.COM  * In the future, if we decide to handle other types of responses
259*13101SVenki.Rajagopalan@Sun.COM  * from the gw, we could simply add the new types to the union.
260*13101SVenki.Rajagopalan@Sun.COM  */
261*13101SVenki.Rajagopalan@Sun.COM typedef struct eibnx_gw_msg_s {
262*13101SVenki.Rajagopalan@Sun.COM 	eibnx_gw_pkt_type_t	gm_type;
263*13101SVenki.Rajagopalan@Sun.COM 	union {
264*13101SVenki.Rajagopalan@Sun.COM 		eibnx_gw_info_t	gm_info;
265*13101SVenki.Rajagopalan@Sun.COM 	} u;
266*13101SVenki.Rajagopalan@Sun.COM } eibnx_gw_msg_t;
267*13101SVenki.Rajagopalan@Sun.COM 
268*13101SVenki.Rajagopalan@Sun.COM /*
269*13101SVenki.Rajagopalan@Sun.COM  * List to hold the devinfo nodes of eoib instances
270*13101SVenki.Rajagopalan@Sun.COM  */
271*13101SVenki.Rajagopalan@Sun.COM typedef struct eibnx_child_s {
272*13101SVenki.Rajagopalan@Sun.COM 	struct eibnx_child_s	*ch_next;
273*13101SVenki.Rajagopalan@Sun.COM 	dev_info_t		*ch_dip;
274*13101SVenki.Rajagopalan@Sun.COM 	eibnx_gw_info_t		*ch_gwi;
275*13101SVenki.Rajagopalan@Sun.COM 	char			*ch_node_name;
276*13101SVenki.Rajagopalan@Sun.COM } eibnx_child_t;
277*13101SVenki.Rajagopalan@Sun.COM 
278*13101SVenki.Rajagopalan@Sun.COM /*
279*13101SVenki.Rajagopalan@Sun.COM  * Event bitmasks for the port-monitor to wait on. None of these flags
280*13101SVenki.Rajagopalan@Sun.COM  * may be zero.
281*13101SVenki.Rajagopalan@Sun.COM  */
282*13101SVenki.Rajagopalan@Sun.COM #define	ENX_EVENT_LINK_UP		0x01
283*13101SVenki.Rajagopalan@Sun.COM #define	ENX_EVENT_MCGS_AVAILABLE	0x02
284*13101SVenki.Rajagopalan@Sun.COM #define	ENX_EVENT_TIMED_OUT		0x04
285*13101SVenki.Rajagopalan@Sun.COM #define	ENX_EVENT_DIE			0x08
286*13101SVenki.Rajagopalan@Sun.COM #define	ENX_EVENT_COMPLETION		0x10
287*13101SVenki.Rajagopalan@Sun.COM 
288*13101SVenki.Rajagopalan@Sun.COM /*
289*13101SVenki.Rajagopalan@Sun.COM  * MCG Query/Join status
290*13101SVenki.Rajagopalan@Sun.COM  */
291*13101SVenki.Rajagopalan@Sun.COM #define	ENX_MCGS_FOUND			0x1
292*13101SVenki.Rajagopalan@Sun.COM #define	ENX_MCGS_JOINED			0x2
293*13101SVenki.Rajagopalan@Sun.COM 
294*13101SVenki.Rajagopalan@Sun.COM /*
295*13101SVenki.Rajagopalan@Sun.COM  * Information that each port-monitor thread cares about
296*13101SVenki.Rajagopalan@Sun.COM  */
297*13101SVenki.Rajagopalan@Sun.COM typedef struct eibnx_thr_info_s {
298*13101SVenki.Rajagopalan@Sun.COM 	struct eibnx_thr_info_s	*ti_next;
299*13101SVenki.Rajagopalan@Sun.COM 	uint_t			ti_progress;
300*13101SVenki.Rajagopalan@Sun.COM 
301*13101SVenki.Rajagopalan@Sun.COM 	/*
302*13101SVenki.Rajagopalan@Sun.COM 	 * Our kernel thread id
303*13101SVenki.Rajagopalan@Sun.COM 	 */
304*13101SVenki.Rajagopalan@Sun.COM 	kt_did_t		ti_kt_did;
305*13101SVenki.Rajagopalan@Sun.COM 
306*13101SVenki.Rajagopalan@Sun.COM 	/*
307*13101SVenki.Rajagopalan@Sun.COM 	 * HCA, port and protection domain information
308*13101SVenki.Rajagopalan@Sun.COM 	 */
309*13101SVenki.Rajagopalan@Sun.COM 	ib_guid_t		ti_hca_guid;
310*13101SVenki.Rajagopalan@Sun.COM 	ibt_hca_hdl_t		ti_hca;
311*13101SVenki.Rajagopalan@Sun.COM 	ibt_pd_hdl_t		ti_pd;
312*13101SVenki.Rajagopalan@Sun.COM 	ibt_hca_portinfo_t	*ti_pi;
313*13101SVenki.Rajagopalan@Sun.COM 	char			*ti_ident;
314*13101SVenki.Rajagopalan@Sun.COM 
315*13101SVenki.Rajagopalan@Sun.COM 	/*
316*13101SVenki.Rajagopalan@Sun.COM 	 * Well-known multicast groups for solicitations
317*13101SVenki.Rajagopalan@Sun.COM 	 * and advertisements.
318*13101SVenki.Rajagopalan@Sun.COM 	 */
319*13101SVenki.Rajagopalan@Sun.COM 	kmutex_t		ti_mcg_lock;
320*13101SVenki.Rajagopalan@Sun.COM 	uint_t			ti_mcg_status;
321*13101SVenki.Rajagopalan@Sun.COM 	ibt_mcg_info_t		*ti_advertise_mcg;
322*13101SVenki.Rajagopalan@Sun.COM 	ibt_mcg_info_t		*ti_solicit_mcg;
323*13101SVenki.Rajagopalan@Sun.COM 	uint_t			ti_mcast_done;
324*13101SVenki.Rajagopalan@Sun.COM 
325*13101SVenki.Rajagopalan@Sun.COM 	/*
326*13101SVenki.Rajagopalan@Sun.COM 	 * Completion queue stuff
327*13101SVenki.Rajagopalan@Sun.COM 	 */
328*13101SVenki.Rajagopalan@Sun.COM 	ibt_cq_hdl_t		ti_cq_hdl;
329*13101SVenki.Rajagopalan@Sun.COM 	uint_t			ti_cq_sz;
330*13101SVenki.Rajagopalan@Sun.COM 	ibt_wc_t		*ti_wc;
331*13101SVenki.Rajagopalan@Sun.COM 	ddi_softint_handle_t    ti_softint_hdl;
332*13101SVenki.Rajagopalan@Sun.COM 
333*13101SVenki.Rajagopalan@Sun.COM 	/*
334*13101SVenki.Rajagopalan@Sun.COM 	 * Channel related
335*13101SVenki.Rajagopalan@Sun.COM 	 */
336*13101SVenki.Rajagopalan@Sun.COM 	ibt_channel_hdl_t	ti_chan;
337*13101SVenki.Rajagopalan@Sun.COM 	ib_qpn_t		ti_qpn;
338*13101SVenki.Rajagopalan@Sun.COM 
339*13101SVenki.Rajagopalan@Sun.COM 	/*
340*13101SVenki.Rajagopalan@Sun.COM 	 * Transmit/Receive stuff
341*13101SVenki.Rajagopalan@Sun.COM 	 */
342*13101SVenki.Rajagopalan@Sun.COM 	eibnx_tx_t		ti_snd;
343*13101SVenki.Rajagopalan@Sun.COM 	eibnx_rx_t		ti_rcv;
344*13101SVenki.Rajagopalan@Sun.COM 
345*13101SVenki.Rajagopalan@Sun.COM 	/*
346*13101SVenki.Rajagopalan@Sun.COM 	 * GW related stuff
347*13101SVenki.Rajagopalan@Sun.COM 	 */
348*13101SVenki.Rajagopalan@Sun.COM 	kmutex_t		ti_gw_lock;
349*13101SVenki.Rajagopalan@Sun.COM 	eibnx_gw_info_t		*ti_gw;
350*13101SVenki.Rajagopalan@Sun.COM 
351*13101SVenki.Rajagopalan@Sun.COM 	/*
352*13101SVenki.Rajagopalan@Sun.COM 	 * Devinfo nodes for the eoib children
353*13101SVenki.Rajagopalan@Sun.COM 	 */
354*13101SVenki.Rajagopalan@Sun.COM 	kmutex_t		ti_child_lock;
355*13101SVenki.Rajagopalan@Sun.COM 	eibnx_child_t		*ti_child;
356*13101SVenki.Rajagopalan@Sun.COM 
357*13101SVenki.Rajagopalan@Sun.COM 	/*
358*13101SVenki.Rajagopalan@Sun.COM 	 * Events that we wait on and/or handle
359*13101SVenki.Rajagopalan@Sun.COM 	 */
360*13101SVenki.Rajagopalan@Sun.COM 	kmutex_t		ti_event_lock;
361*13101SVenki.Rajagopalan@Sun.COM 	kcondvar_t		ti_event_cv;
362*13101SVenki.Rajagopalan@Sun.COM 	uint_t			ti_event;
363*13101SVenki.Rajagopalan@Sun.COM } eibnx_thr_info_t;
364*13101SVenki.Rajagopalan@Sun.COM 
365*13101SVenki.Rajagopalan@Sun.COM /*
366*13101SVenki.Rajagopalan@Sun.COM  * Workq entry for creation of eoib nodes
367*13101SVenki.Rajagopalan@Sun.COM  */
368*13101SVenki.Rajagopalan@Sun.COM typedef struct eibnx_nodeq_s {
369*13101SVenki.Rajagopalan@Sun.COM 	struct eibnx_nodeq_s	*nc_next;
370*13101SVenki.Rajagopalan@Sun.COM 	eibnx_thr_info_t	*nc_info;
371*13101SVenki.Rajagopalan@Sun.COM 	eibnx_gw_info_t		*nc_gwi;
372*13101SVenki.Rajagopalan@Sun.COM } eibnx_nodeq_t;
373*13101SVenki.Rajagopalan@Sun.COM 
374*13101SVenki.Rajagopalan@Sun.COM /*
375*13101SVenki.Rajagopalan@Sun.COM  * Bus config status flags.  The in-prog is protected by
376*13101SVenki.Rajagopalan@Sun.COM  * nx_lock, and the rest of the flags (currently only
377*13101SVenki.Rajagopalan@Sun.COM  * buscfg-complete) is protected by the in-prog bit itself.
378*13101SVenki.Rajagopalan@Sun.COM  */
379*13101SVenki.Rajagopalan@Sun.COM #define	NX_FL_BUSOP_INPROG		0x1
380*13101SVenki.Rajagopalan@Sun.COM #define	NX_FL_BUSCFG_COMPLETE		0x2
381*13101SVenki.Rajagopalan@Sun.COM #define	NX_FL_BUSOP_MASK		0x3
382*13101SVenki.Rajagopalan@Sun.COM 
383*13101SVenki.Rajagopalan@Sun.COM /*
384*13101SVenki.Rajagopalan@Sun.COM  * EoIB nexus per-instance state
385*13101SVenki.Rajagopalan@Sun.COM  */
386*13101SVenki.Rajagopalan@Sun.COM typedef struct eibnx_s {
387*13101SVenki.Rajagopalan@Sun.COM 	dev_info_t		*nx_dip;
388*13101SVenki.Rajagopalan@Sun.COM 	ibt_clnt_hdl_t		nx_ibt_hdl;
389*13101SVenki.Rajagopalan@Sun.COM 
390*13101SVenki.Rajagopalan@Sun.COM 	kmutex_t		nx_lock;
391*13101SVenki.Rajagopalan@Sun.COM 	eibnx_hca_t		*nx_hca;
392*13101SVenki.Rajagopalan@Sun.COM 	eibnx_thr_info_t	*nx_thr_info;
393*13101SVenki.Rajagopalan@Sun.COM 	boolean_t		nx_monitors_up;
394*13101SVenki.Rajagopalan@Sun.COM 
395*13101SVenki.Rajagopalan@Sun.COM 	kmutex_t		nx_nodeq_lock;
396*13101SVenki.Rajagopalan@Sun.COM 	kcondvar_t		nx_nodeq_cv;
397*13101SVenki.Rajagopalan@Sun.COM 	eibnx_nodeq_t		*nx_nodeq;
398*13101SVenki.Rajagopalan@Sun.COM 	kt_did_t		nx_nodeq_kt_did;
399*13101SVenki.Rajagopalan@Sun.COM 	uint_t			nx_nodeq_thr_die;
400*13101SVenki.Rajagopalan@Sun.COM 
401*13101SVenki.Rajagopalan@Sun.COM 	kmutex_t		nx_busop_lock;
402*13101SVenki.Rajagopalan@Sun.COM 	kcondvar_t		nx_busop_cv;
403*13101SVenki.Rajagopalan@Sun.COM 	uint_t			nx_busop_flags;
404*13101SVenki.Rajagopalan@Sun.COM } eibnx_t;
405*13101SVenki.Rajagopalan@Sun.COM 
406*13101SVenki.Rajagopalan@Sun.COM 
407*13101SVenki.Rajagopalan@Sun.COM /*
408*13101SVenki.Rajagopalan@Sun.COM  * Event tags for EoIB Nexus events delivered to EoIB instances
409*13101SVenki.Rajagopalan@Sun.COM  */
410*13101SVenki.Rajagopalan@Sun.COM #define	ENX_EVENT_TAG_GW_INFO_UPDATE		0
411*13101SVenki.Rajagopalan@Sun.COM #define	ENX_EVENT_TAG_GW_AVAILABLE		1
412*13101SVenki.Rajagopalan@Sun.COM #define	ENX_EVENT_TAG_LOGIN_ACK			2
413*13101SVenki.Rajagopalan@Sun.COM 
414*13101SVenki.Rajagopalan@Sun.COM /*
415*13101SVenki.Rajagopalan@Sun.COM  * FUNCTION PROTOTYPES FOR CROSS-FILE LINKAGE
416*13101SVenki.Rajagopalan@Sun.COM  */
417*13101SVenki.Rajagopalan@Sun.COM 
418*13101SVenki.Rajagopalan@Sun.COM /*
419*13101SVenki.Rajagopalan@Sun.COM  * Threads and Event Handlers
420*13101SVenki.Rajagopalan@Sun.COM  */
421*13101SVenki.Rajagopalan@Sun.COM void eibnx_port_monitor(eibnx_thr_info_t *);
422*13101SVenki.Rajagopalan@Sun.COM void eibnx_subnet_notices_handler(void *, ib_gid_t, ibt_subnet_event_code_t,
423*13101SVenki.Rajagopalan@Sun.COM     ibt_subnet_event_t *);
424*13101SVenki.Rajagopalan@Sun.COM void eibnx_async_handler(void *, ibt_hca_hdl_t, ibt_async_code_t,
425*13101SVenki.Rajagopalan@Sun.COM     ibt_async_event_t *);
426*13101SVenki.Rajagopalan@Sun.COM boolean_t eibnx_is_gw_dead(eibnx_gw_info_t *);
427*13101SVenki.Rajagopalan@Sun.COM void eibnx_create_eoib_node(void);
428*13101SVenki.Rajagopalan@Sun.COM void eibnx_comp_intr(ibt_cq_hdl_t, void *);
429*13101SVenki.Rajagopalan@Sun.COM uint_t eibnx_comp_handler(caddr_t, caddr_t);
430*13101SVenki.Rajagopalan@Sun.COM 
431*13101SVenki.Rajagopalan@Sun.COM /*
432*13101SVenki.Rajagopalan@Sun.COM  * IBT related functions
433*13101SVenki.Rajagopalan@Sun.COM  */
434*13101SVenki.Rajagopalan@Sun.COM int eibnx_ibt_init(eibnx_t *);
435*13101SVenki.Rajagopalan@Sun.COM int eibnx_find_mgroups(eibnx_thr_info_t *);
436*13101SVenki.Rajagopalan@Sun.COM int eibnx_setup_cq(eibnx_thr_info_t *);
437*13101SVenki.Rajagopalan@Sun.COM int eibnx_setup_ud_channel(eibnx_thr_info_t *);
438*13101SVenki.Rajagopalan@Sun.COM int eibnx_setup_bufs(eibnx_thr_info_t *);
439*13101SVenki.Rajagopalan@Sun.COM int eibnx_setup_cq_handler(eibnx_thr_info_t *);
440*13101SVenki.Rajagopalan@Sun.COM int eibnx_join_mcgs(eibnx_thr_info_t *);
441*13101SVenki.Rajagopalan@Sun.COM int eibnx_rejoin_mcgs(eibnx_thr_info_t *);
442*13101SVenki.Rajagopalan@Sun.COM int eibnx_ibt_fini(eibnx_t *);
443*13101SVenki.Rajagopalan@Sun.COM 
444*13101SVenki.Rajagopalan@Sun.COM void eibnx_rb_find_mgroups(eibnx_thr_info_t *);
445*13101SVenki.Rajagopalan@Sun.COM void eibnx_rb_setup_cq(eibnx_thr_info_t *);
446*13101SVenki.Rajagopalan@Sun.COM void eibnx_rb_setup_ud_channel(eibnx_thr_info_t *);
447*13101SVenki.Rajagopalan@Sun.COM void eibnx_rb_setup_bufs(eibnx_thr_info_t *);
448*13101SVenki.Rajagopalan@Sun.COM void eibnx_rb_setup_cq_handler(eibnx_thr_info_t *);
449*13101SVenki.Rajagopalan@Sun.COM void eibnx_rb_join_mcgs(eibnx_thr_info_t *);
450*13101SVenki.Rajagopalan@Sun.COM 
451*13101SVenki.Rajagopalan@Sun.COM eibnx_hca_t *eibnx_prepare_hca(ib_guid_t);
452*13101SVenki.Rajagopalan@Sun.COM int eibnx_cleanup_hca(eibnx_hca_t *);
453*13101SVenki.Rajagopalan@Sun.COM 
454*13101SVenki.Rajagopalan@Sun.COM /*
455*13101SVenki.Rajagopalan@Sun.COM  * FIP packetizing related functions
456*13101SVenki.Rajagopalan@Sun.COM  */
457*13101SVenki.Rajagopalan@Sun.COM int eibnx_fip_solicit_mcast(eibnx_thr_info_t *);
458*13101SVenki.Rajagopalan@Sun.COM int eibnx_fip_solicit_ucast(eibnx_thr_info_t *, clock_t *);
459*13101SVenki.Rajagopalan@Sun.COM int eibnx_fip_parse_pkt(uint8_t *, eibnx_gw_msg_t *);
460*13101SVenki.Rajagopalan@Sun.COM 
461*13101SVenki.Rajagopalan@Sun.COM /*
462*13101SVenki.Rajagopalan@Sun.COM  * Queue and List related routines
463*13101SVenki.Rajagopalan@Sun.COM  */
464*13101SVenki.Rajagopalan@Sun.COM eibnx_wqe_t *eibnx_acquire_swqe(eibnx_thr_info_t *, int);
465*13101SVenki.Rajagopalan@Sun.COM void eibnx_return_swqe(eibnx_wqe_t *);
466*13101SVenki.Rajagopalan@Sun.COM void eibnx_return_rwqe(eibnx_thr_info_t *, eibnx_wqe_t *);
467*13101SVenki.Rajagopalan@Sun.COM void eibnx_release_swqe(eibnx_wqe_t *);
468*13101SVenki.Rajagopalan@Sun.COM 
469*13101SVenki.Rajagopalan@Sun.COM void eibnx_enqueue_child(eibnx_thr_info_t *, eibnx_gw_info_t *, char *,
470*13101SVenki.Rajagopalan@Sun.COM     dev_info_t *);
471*13101SVenki.Rajagopalan@Sun.COM int eibnx_update_child(eibnx_thr_info_t *, eibnx_gw_info_t *, dev_info_t *);
472*13101SVenki.Rajagopalan@Sun.COM dev_info_t *eibnx_find_child_dip_by_inst(eibnx_thr_info_t *, int);
473*13101SVenki.Rajagopalan@Sun.COM dev_info_t *eibnx_find_child_dip_by_gw(eibnx_thr_info_t *, uint16_t);
474*13101SVenki.Rajagopalan@Sun.COM 
475*13101SVenki.Rajagopalan@Sun.COM eibnx_gw_info_t *eibnx_find_gw_in_gwlist(eibnx_thr_info_t *, eibnx_gw_info_t *);
476*13101SVenki.Rajagopalan@Sun.COM eibnx_gw_info_t *eibnx_add_gw_to_gwlist(eibnx_thr_info_t *, eibnx_gw_info_t *,
477*13101SVenki.Rajagopalan@Sun.COM     ibt_wc_t *, uint8_t *);
478*13101SVenki.Rajagopalan@Sun.COM void eibnx_replace_gw_in_gwlist(eibnx_thr_info_t *, eibnx_gw_info_t *,
479*13101SVenki.Rajagopalan@Sun.COM     eibnx_gw_info_t *, ibt_wc_t *, uint8_t *, boolean_t *);
480*13101SVenki.Rajagopalan@Sun.COM void eibnx_queue_for_creation(eibnx_thr_info_t *, eibnx_gw_info_t *);
481*13101SVenki.Rajagopalan@Sun.COM 
482*13101SVenki.Rajagopalan@Sun.COM /*
483*13101SVenki.Rajagopalan@Sun.COM  * Logging and Error reporting routines
484*13101SVenki.Rajagopalan@Sun.COM  */
485*13101SVenki.Rajagopalan@Sun.COM void eibnx_debug_init(void);
486*13101SVenki.Rajagopalan@Sun.COM void eibnx_debug_fini(void);
487*13101SVenki.Rajagopalan@Sun.COM void eibnx_dprintf_crit(const char *fmt, ...);
488*13101SVenki.Rajagopalan@Sun.COM void eibnx_dprintf_err(const char *fmt, ...);
489*13101SVenki.Rajagopalan@Sun.COM void eibnx_dprintf_warn(const char *fmt, ...);
490*13101SVenki.Rajagopalan@Sun.COM #ifdef ENX_DEBUG
491*13101SVenki.Rajagopalan@Sun.COM void eibnx_dprintf_debug(const char *fmt, ...);
492*13101SVenki.Rajagopalan@Sun.COM void eibnx_dprintf_args(const char *fmt, ...);
493*13101SVenki.Rajagopalan@Sun.COM void eibnx_dprintf_verbose(const char *fmt, ...);
494*13101SVenki.Rajagopalan@Sun.COM #endif
495*13101SVenki.Rajagopalan@Sun.COM 
496*13101SVenki.Rajagopalan@Sun.COM /*
497*13101SVenki.Rajagopalan@Sun.COM  * Miscellaneous
498*13101SVenki.Rajagopalan@Sun.COM  */
499*13101SVenki.Rajagopalan@Sun.COM void eibnx_cleanup_port_nodes(eibnx_thr_info_t *);
500*13101SVenki.Rajagopalan@Sun.COM void eibnx_create_node_props(dev_info_t *, eibnx_thr_info_t *,
501*13101SVenki.Rajagopalan@Sun.COM     eibnx_gw_info_t *);
502*13101SVenki.Rajagopalan@Sun.COM int eibnx_name_child(dev_info_t *, char *, size_t);
503*13101SVenki.Rajagopalan@Sun.COM void eibnx_busop_inprog_enter(eibnx_t *);
504*13101SVenki.Rajagopalan@Sun.COM void eibnx_busop_inprog_exit(eibnx_t *);
505*13101SVenki.Rajagopalan@Sun.COM eibnx_thr_info_t *eibnx_start_port_monitor(eibnx_hca_t *, eibnx_port_t *);
506*13101SVenki.Rajagopalan@Sun.COM void eibnx_stop_port_monitor(eibnx_thr_info_t *);
507*13101SVenki.Rajagopalan@Sun.COM void eibnx_terminate_monitors(void);
508*13101SVenki.Rajagopalan@Sun.COM int eibnx_configure_node(eibnx_thr_info_t *, eibnx_gw_info_t *, dev_info_t **);
509*13101SVenki.Rajagopalan@Sun.COM int eibnx_unconfigure_node(eibnx_thr_info_t *, eibnx_gw_info_t *);
510*13101SVenki.Rajagopalan@Sun.COM int eibnx_locate_node_name(char *, eibnx_thr_info_t **, eibnx_gw_info_t **);
511*13101SVenki.Rajagopalan@Sun.COM int eibnx_locate_unconfigured_node(eibnx_thr_info_t **, eibnx_gw_info_t **);
512*13101SVenki.Rajagopalan@Sun.COM 
513*13101SVenki.Rajagopalan@Sun.COM /*
514*13101SVenki.Rajagopalan@Sun.COM  * Devctl cbops (currently dummy)
515*13101SVenki.Rajagopalan@Sun.COM  */
516*13101SVenki.Rajagopalan@Sun.COM int eibnx_devctl_open(dev_t *, int, int, cred_t *);
517*13101SVenki.Rajagopalan@Sun.COM int eibnx_devctl_close(dev_t, int, int, cred_t *);
518*13101SVenki.Rajagopalan@Sun.COM int eibnx_devctl_ioctl(dev_t, int, intptr_t, int, cred_t *, int *);
519*13101SVenki.Rajagopalan@Sun.COM 
520*13101SVenki.Rajagopalan@Sun.COM /*
521*13101SVenki.Rajagopalan@Sun.COM  * External variable references
522*13101SVenki.Rajagopalan@Sun.COM  */
523*13101SVenki.Rajagopalan@Sun.COM extern pri_t minclsyspri;
524*13101SVenki.Rajagopalan@Sun.COM extern eibnx_t *enx_global_ss;
525*13101SVenki.Rajagopalan@Sun.COM extern ib_gid_t enx_solicit_mgid;
526*13101SVenki.Rajagopalan@Sun.COM extern ib_gid_t enx_advertise_mgid;
527*13101SVenki.Rajagopalan@Sun.COM 
528*13101SVenki.Rajagopalan@Sun.COM #ifdef __cplusplus
529*13101SVenki.Rajagopalan@Sun.COM }
530*13101SVenki.Rajagopalan@Sun.COM #endif
531*13101SVenki.Rajagopalan@Sun.COM 
532*13101SVenki.Rajagopalan@Sun.COM #endif	/* _SYS_IB_EOIB_ENX_IMPL_H */
533