xref: /onnv-gate/usr/src/uts/common/sys/ib/clients/eoib/eib_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_EIB_IMPL_H
27*13101SVenki.Rajagopalan@Sun.COM #define	_SYS_IB_EOIB_EIB_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/mac.h>
35*13101SVenki.Rajagopalan@Sun.COM #include <sys/sunddi.h>
36*13101SVenki.Rajagopalan@Sun.COM #include <sys/varargs.h>
37*13101SVenki.Rajagopalan@Sun.COM #include <sys/vlan.h>
38*13101SVenki.Rajagopalan@Sun.COM #include <sys/ib/ibtl/ibti.h>
39*13101SVenki.Rajagopalan@Sun.COM #include <sys/ib/ibtl/ibvti.h>
40*13101SVenki.Rajagopalan@Sun.COM #include <sys/ib/ib_pkt_hdrs.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	EIB_E_SUCCESS			0
49*13101SVenki.Rajagopalan@Sun.COM #define	EIB_E_FAILURE			-1
50*13101SVenki.Rajagopalan@Sun.COM #define	EIB_MAX_LINE			128
51*13101SVenki.Rajagopalan@Sun.COM #define	EIB_MAX_SGL			59
52*13101SVenki.Rajagopalan@Sun.COM #define	EIB_MAX_POST_MULTIPLE		4
53*13101SVenki.Rajagopalan@Sun.COM #define	EIB_MAX_PAYLOAD_HDR_SZ		160
54*13101SVenki.Rajagopalan@Sun.COM #define	EIB_TX_COPY_THRESH		4096	/* greater than mtu */
55*13101SVenki.Rajagopalan@Sun.COM #define	EIB_MAX_VNICS			64	/* do not change this */
56*13101SVenki.Rajagopalan@Sun.COM #define	EIB_LOGIN_TIMEOUT_USEC		8000000
57*13101SVenki.Rajagopalan@Sun.COM #define	EIB_RWR_CHUNK_SZ		8
58*13101SVenki.Rajagopalan@Sun.COM #define	EIB_IPHDR_ALIGN_ROOM		32
59*13101SVenki.Rajagopalan@Sun.COM #define	EIB_IP_HDR_ALIGN		2
60*13101SVenki.Rajagopalan@Sun.COM #define	EIB_MAX_RX_PKTS_ONINTR		0x800
61*13101SVenki.Rajagopalan@Sun.COM #define	EIB_MAX_LOGIN_ATTEMPTS		3
62*13101SVenki.Rajagopalan@Sun.COM #define	EIB_MAX_VHUB_TBL_ATTEMPTS	3
63*13101SVenki.Rajagopalan@Sun.COM #define	EIB_MAX_KA_ATTEMPTS		3
64*13101SVenki.Rajagopalan@Sun.COM #define	EIB_MAX_ATTEMPTS		10
65*13101SVenki.Rajagopalan@Sun.COM #define	EIB_DELAY_HALF_SECOND		500000
66*13101SVenki.Rajagopalan@Sun.COM #define	EIB_GRH_SZ			(sizeof (ib_grh_t))
67*13101SVenki.Rajagopalan@Sun.COM 
68*13101SVenki.Rajagopalan@Sun.COM /*
69*13101SVenki.Rajagopalan@Sun.COM  * Debug messages
70*13101SVenki.Rajagopalan@Sun.COM  */
71*13101SVenki.Rajagopalan@Sun.COM #define	EIB_MSGS_CRIT		0x01
72*13101SVenki.Rajagopalan@Sun.COM #define	EIB_MSGS_ERR		0x02
73*13101SVenki.Rajagopalan@Sun.COM #define	EIB_MSGS_WARN		0x04
74*13101SVenki.Rajagopalan@Sun.COM #define	EIB_MSGS_DEBUG		0x08
75*13101SVenki.Rajagopalan@Sun.COM #define	EIB_MSGS_ARGS		0x10
76*13101SVenki.Rajagopalan@Sun.COM #define	EIB_MSGS_PKT		0x20
77*13101SVenki.Rajagopalan@Sun.COM #define	EIB_MSGS_VERBOSE	0x40
78*13101SVenki.Rajagopalan@Sun.COM #define	EIB_MSGS_DEFAULT	(EIB_MSGS_CRIT | EIB_MSGS_ERR | EIB_MSGS_WARN)
79*13101SVenki.Rajagopalan@Sun.COM 
80*13101SVenki.Rajagopalan@Sun.COM #define	EIB_LOGSZ_DEFAULT	0x20000
81*13101SVenki.Rajagopalan@Sun.COM 
82*13101SVenki.Rajagopalan@Sun.COM #define	EIB_DPRINTF_CRIT	eib_dprintf_crit
83*13101SVenki.Rajagopalan@Sun.COM #define	EIB_DPRINTF_ERR		eib_dprintf_err
84*13101SVenki.Rajagopalan@Sun.COM #define	EIB_DPRINTF_WARN	eib_dprintf_warn
85*13101SVenki.Rajagopalan@Sun.COM #ifdef EIB_DEBUG
86*13101SVenki.Rajagopalan@Sun.COM #define	EIB_DPRINTF_DEBUG	eib_dprintf_debug
87*13101SVenki.Rajagopalan@Sun.COM #define	EIB_DPRINTF_ARGS	eib_dprintf_args
88*13101SVenki.Rajagopalan@Sun.COM #define	EIB_DPRINTF_PKT		eib_dprintf_pkt
89*13101SVenki.Rajagopalan@Sun.COM #define	EIB_DPRINTF_VERBOSE	eib_dprintf_verbose
90*13101SVenki.Rajagopalan@Sun.COM #else
91*13101SVenki.Rajagopalan@Sun.COM #define	EIB_DPRINTF_DEBUG	0 &&
92*13101SVenki.Rajagopalan@Sun.COM #define	EIB_DPRINTF_ARGS	0 &&
93*13101SVenki.Rajagopalan@Sun.COM #define	EIB_DPRINTF_PKT		0 &&
94*13101SVenki.Rajagopalan@Sun.COM #define	EIB_DPRINTF_VERBOSE	0 &&
95*13101SVenki.Rajagopalan@Sun.COM #endif
96*13101SVenki.Rajagopalan@Sun.COM 
97*13101SVenki.Rajagopalan@Sun.COM /*
98*13101SVenki.Rajagopalan@Sun.COM  *  EoIB threads to provide various services
99*13101SVenki.Rajagopalan@Sun.COM  */
100*13101SVenki.Rajagopalan@Sun.COM #define	EIB_EVENTS_HDLR		"eib_events_handler"
101*13101SVenki.Rajagopalan@Sun.COM #define	EIB_RWQES_REFILLER	"eib_rwqes_refiller"
102*13101SVenki.Rajagopalan@Sun.COM #define	EIB_VNIC_CREATOR	"eib_vnic_creator"
103*13101SVenki.Rajagopalan@Sun.COM #define	EIB_TXWQES_MONITOR	"eib_txwqe_monitor"
104*13101SVenki.Rajagopalan@Sun.COM #define	EIB_LSOBUFS_MONITOR	"eib_lsobufs_monitor"
105*13101SVenki.Rajagopalan@Sun.COM 
106*13101SVenki.Rajagopalan@Sun.COM /*
107*13101SVenki.Rajagopalan@Sun.COM  * Macro for finding the least significant bit set in a 64-bit unsigned int
108*13101SVenki.Rajagopalan@Sun.COM  */
109*13101SVenki.Rajagopalan@Sun.COM #define	EIB_FIND_LSB_SET(val64)	eib_setbit_mod67[((-(val64) & (val64)) % 67)]
110*13101SVenki.Rajagopalan@Sun.COM 
111*13101SVenki.Rajagopalan@Sun.COM /*
112*13101SVenki.Rajagopalan@Sun.COM  * LSO buffers
113*13101SVenki.Rajagopalan@Sun.COM  *
114*13101SVenki.Rajagopalan@Sun.COM  * Under normal circumstances we should never need to use any buffer
115*13101SVenki.Rajagopalan@Sun.COM  * that's larger than MTU.  Unfortunately, IB HCA has limitations
116*13101SVenki.Rajagopalan@Sun.COM  * on the length of SGL that are much smaller than those for regular
117*13101SVenki.Rajagopalan@Sun.COM  * ethernet NICs.  Since the network layer doesn't care to limit the
118*13101SVenki.Rajagopalan@Sun.COM  * number of mblk fragments in any send mp chain, we end up having to
119*13101SVenki.Rajagopalan@Sun.COM  * use these larger buffers occasionally.
120*13101SVenki.Rajagopalan@Sun.COM  */
121*13101SVenki.Rajagopalan@Sun.COM #define	EIB_LSO_MAXLEN			65536
122*13101SVenki.Rajagopalan@Sun.COM #define	EIB_LSO_BUFSZ			8192
123*13101SVenki.Rajagopalan@Sun.COM #define	EIB_LSO_NUM_BUFS		1024
124*13101SVenki.Rajagopalan@Sun.COM #define	EIB_LSO_FREE_BUFS_THRESH	(EIB_LSO_NUM_BUFS >> 5)
125*13101SVenki.Rajagopalan@Sun.COM 
126*13101SVenki.Rajagopalan@Sun.COM typedef struct eib_lsobuf_s {
127*13101SVenki.Rajagopalan@Sun.COM 	struct eib_lsobuf_s *lb_next;
128*13101SVenki.Rajagopalan@Sun.COM 	uint8_t		*lb_buf;
129*13101SVenki.Rajagopalan@Sun.COM 	int		lb_isfree;
130*13101SVenki.Rajagopalan@Sun.COM } eib_lsobuf_t;
131*13101SVenki.Rajagopalan@Sun.COM 
132*13101SVenki.Rajagopalan@Sun.COM typedef struct eib_lsobkt_s {
133*13101SVenki.Rajagopalan@Sun.COM 	kmutex_t	bk_lock;
134*13101SVenki.Rajagopalan@Sun.COM 	kcondvar_t	bk_cv;
135*13101SVenki.Rajagopalan@Sun.COM 	uint_t		bk_status;
136*13101SVenki.Rajagopalan@Sun.COM 	uint8_t		*bk_mem;
137*13101SVenki.Rajagopalan@Sun.COM 	eib_lsobuf_t	*bk_bufl;
138*13101SVenki.Rajagopalan@Sun.COM 	eib_lsobuf_t	*bk_free_head;
139*13101SVenki.Rajagopalan@Sun.COM 	ibt_mr_hdl_t	bk_mr_hdl;
140*13101SVenki.Rajagopalan@Sun.COM 	ibt_lkey_t	bk_lkey;
141*13101SVenki.Rajagopalan@Sun.COM 	uint_t		bk_nelem;
142*13101SVenki.Rajagopalan@Sun.COM 	uint_t		bk_nfree;
143*13101SVenki.Rajagopalan@Sun.COM } eib_lsobkt_t;
144*13101SVenki.Rajagopalan@Sun.COM 
145*13101SVenki.Rajagopalan@Sun.COM #define	EIB_LBUF_SHORT		0x1
146*13101SVenki.Rajagopalan@Sun.COM #define	EIB_LBUF_MONITOR_DIE	0x2
147*13101SVenki.Rajagopalan@Sun.COM 
148*13101SVenki.Rajagopalan@Sun.COM /*
149*13101SVenki.Rajagopalan@Sun.COM  * The admin partition is only used for sending login and logout messages
150*13101SVenki.Rajagopalan@Sun.COM  * and receiving login acknowledgements from the gateway.  While packets
151*13101SVenki.Rajagopalan@Sun.COM  * going out on several vlans at the same time could result in multiple
152*13101SVenki.Rajagopalan@Sun.COM  * vnic creations happening at the same time (and therefore multiple login
153*13101SVenki.Rajagopalan@Sun.COM  * packets), we serialize the vnic creation via the vnic creator thread, so
154*13101SVenki.Rajagopalan@Sun.COM  * we shouldn't need a lot of send wqes or receive wqes.  Note also that we
155*13101SVenki.Rajagopalan@Sun.COM  * keep the cq size request to slightly less than a 2^n boundary to allow
156*13101SVenki.Rajagopalan@Sun.COM  * the alloc cq routine to return the closest 2^n boundary as the real cq
157*13101SVenki.Rajagopalan@Sun.COM  * size without wasting too much memory.
158*13101SVenki.Rajagopalan@Sun.COM  */
159*13101SVenki.Rajagopalan@Sun.COM #define	EIB_ADMIN_MAX_SWQE	30
160*13101SVenki.Rajagopalan@Sun.COM #define	EIB_ADMIN_MAX_RWQE	30
161*13101SVenki.Rajagopalan@Sun.COM #define	EIB_ADMIN_CQ_SIZE	(EIB_ADMIN_MAX_SWQE + EIB_ADMIN_MAX_RWQE + 1)
162*13101SVenki.Rajagopalan@Sun.COM 
163*13101SVenki.Rajagopalan@Sun.COM /*
164*13101SVenki.Rajagopalan@Sun.COM  * The control qp is per vhub partition, and is used to send and receive
165*13101SVenki.Rajagopalan@Sun.COM  * vhub control messages such as vhub table request/response, vhub
166*13101SVenki.Rajagopalan@Sun.COM  * update response and vnic alive messages.  While the vhub table response
167*13101SVenki.Rajagopalan@Sun.COM  * and vhub update messages might take a few rwqes, the vhub table request
168*13101SVenki.Rajagopalan@Sun.COM  * is made only once per vnic, and the vnic alive message is periodic
169*13101SVenki.Rajagopalan@Sun.COM  * and uses a single swqe as well.  Per vnic, we should certainly not need
170*13101SVenki.Rajagopalan@Sun.COM  * too many swqes/rwqes.
171*13101SVenki.Rajagopalan@Sun.COM  */
172*13101SVenki.Rajagopalan@Sun.COM #define	EIB_CTL_MAX_SWQE	30
173*13101SVenki.Rajagopalan@Sun.COM #define	EIB_CTL_MAX_RWQE	30
174*13101SVenki.Rajagopalan@Sun.COM #define	EIB_CTL_CQ_SIZE		(EIB_CTL_MAX_SWQE + EIB_CTL_MAX_RWQE + 1)
175*13101SVenki.Rajagopalan@Sun.COM 
176*13101SVenki.Rajagopalan@Sun.COM /*
177*13101SVenki.Rajagopalan@Sun.COM  * For the vNIC's data channel, there are three items that are of importance:
178*13101SVenki.Rajagopalan@Sun.COM  * the constraints defined below, the hca_max_chan_sz attribute and the value of
179*13101SVenki.Rajagopalan@Sun.COM  * (hca_max_cq_sz - 1).  The maximum limit on swqe/rwqe is set to the minimum
180*13101SVenki.Rajagopalan@Sun.COM  * of these three values.
181*13101SVenki.Rajagopalan@Sun.COM  *
182*13101SVenki.Rajagopalan@Sun.COM  * While the total number of RWQEs posted to the data channel of any vNIC will
183*13101SVenki.Rajagopalan@Sun.COM  * not exceed EIB_DATA_MAX_RWQE, we also do not want to acquire and post all of
184*13101SVenki.Rajagopalan@Sun.COM  * it during the data channel initialization, since that is a lot of wqes for
185*13101SVenki.Rajagopalan@Sun.COM  * one vnic to consume when we don't even know if the vnic will need it at all.
186*13101SVenki.Rajagopalan@Sun.COM  * We post an initial set of EIB_DATA_RWQE_BKT rwqes, and slowly post more and
187*13101SVenki.Rajagopalan@Sun.COM  * more sets as we see them being consumed, until we hit the hard limit of
188*13101SVenki.Rajagopalan@Sun.COM  * EIB_DATA_MAX_RWQE.
189*13101SVenki.Rajagopalan@Sun.COM  */
190*13101SVenki.Rajagopalan@Sun.COM #define	EIB_DATA_MAX_SWQE	4000
191*13101SVenki.Rajagopalan@Sun.COM #define	EIB_DATA_MAX_RWQE	4000
192*13101SVenki.Rajagopalan@Sun.COM #define	EIB_DATA_RWQE_BKT	512
193*13101SVenki.Rajagopalan@Sun.COM 
194*13101SVenki.Rajagopalan@Sun.COM /*
195*13101SVenki.Rajagopalan@Sun.COM  * vNIC data channel CQ moderation parameters
196*13101SVenki.Rajagopalan@Sun.COM  */
197*13101SVenki.Rajagopalan@Sun.COM #define	EIB_TX_COMP_COUNT		10
198*13101SVenki.Rajagopalan@Sun.COM #define	EIB_TX_COMP_USEC		300
199*13101SVenki.Rajagopalan@Sun.COM #define	EIB_RX_COMP_COUNT		4
200*13101SVenki.Rajagopalan@Sun.COM #define	EIB_RX_COMP_USEC		10
201*13101SVenki.Rajagopalan@Sun.COM 
202*13101SVenki.Rajagopalan@Sun.COM /*
203*13101SVenki.Rajagopalan@Sun.COM  * qe_info masks (blk:ndx:type:flags)
204*13101SVenki.Rajagopalan@Sun.COM  */
205*13101SVenki.Rajagopalan@Sun.COM #define	EIB_WQEBLK_SHIFT		24
206*13101SVenki.Rajagopalan@Sun.COM #define	EIB_WQEBLK_MASK			0xFF
207*13101SVenki.Rajagopalan@Sun.COM #define	EIB_WQENDX_SHIFT		16
208*13101SVenki.Rajagopalan@Sun.COM #define	EIB_WQENDX_MASK			0xFF
209*13101SVenki.Rajagopalan@Sun.COM #define	EIB_WQETYP_SHIFT		8
210*13101SVenki.Rajagopalan@Sun.COM #define	EIB_WQETYP_MASK			0xFF
211*13101SVenki.Rajagopalan@Sun.COM #define	EIB_WQEFLGS_SHIFT		0
212*13101SVenki.Rajagopalan@Sun.COM #define	EIB_WQEFLGS_MASK		0xFF
213*13101SVenki.Rajagopalan@Sun.COM 
214*13101SVenki.Rajagopalan@Sun.COM /*
215*13101SVenki.Rajagopalan@Sun.COM  * Macros to get the bit fields from qe_info
216*13101SVenki.Rajagopalan@Sun.COM  */
217*13101SVenki.Rajagopalan@Sun.COM #define	EIB_WQE_BLK(info)	(((info) >> EIB_WQEBLK_SHIFT) & EIB_WQEBLK_MASK)
218*13101SVenki.Rajagopalan@Sun.COM #define	EIB_WQE_NDX(info)	(((info) >> EIB_WQENDX_SHIFT) & EIB_WQENDX_MASK)
219*13101SVenki.Rajagopalan@Sun.COM #define	EIB_WQE_TYPE(info)	(((info) >> EIB_WQETYP_SHIFT) & EIB_WQETYP_MASK)
220*13101SVenki.Rajagopalan@Sun.COM #define	EIB_WQE_FLAGS(info)	((info) & EIB_WQEFLGS_MASK)
221*13101SVenki.Rajagopalan@Sun.COM 
222*13101SVenki.Rajagopalan@Sun.COM /*
223*13101SVenki.Rajagopalan@Sun.COM  * Values for type and flags in qe_info
224*13101SVenki.Rajagopalan@Sun.COM  */
225*13101SVenki.Rajagopalan@Sun.COM #define	EIB_WQE_TX			0x1
226*13101SVenki.Rajagopalan@Sun.COM #define	EIB_WQE_RX			0x2
227*13101SVenki.Rajagopalan@Sun.COM 
228*13101SVenki.Rajagopalan@Sun.COM /*
229*13101SVenki.Rajagopalan@Sun.COM  * Flags for rx wqes/buffers
230*13101SVenki.Rajagopalan@Sun.COM  */
231*13101SVenki.Rajagopalan@Sun.COM #define	EIB_WQE_FLG_POSTED_TO_HCA	0x1
232*13101SVenki.Rajagopalan@Sun.COM #define	EIB_WQE_FLG_WITH_NW		0x2
233*13101SVenki.Rajagopalan@Sun.COM 
234*13101SVenki.Rajagopalan@Sun.COM /*
235*13101SVenki.Rajagopalan@Sun.COM  * Flags for tx wqes/buffers
236*13101SVenki.Rajagopalan@Sun.COM  */
237*13101SVenki.Rajagopalan@Sun.COM #define	EIB_WQE_FLG_BUFTYPE_LSO		0x4
238*13101SVenki.Rajagopalan@Sun.COM #define	EIB_WQE_FLG_BUFTYPE_MAPPED	0x8
239*13101SVenki.Rajagopalan@Sun.COM 
240*13101SVenki.Rajagopalan@Sun.COM /*
241*13101SVenki.Rajagopalan@Sun.COM  * Send/Recv workq entries
242*13101SVenki.Rajagopalan@Sun.COM  */
243*13101SVenki.Rajagopalan@Sun.COM typedef struct eib_wqe_s {
244*13101SVenki.Rajagopalan@Sun.COM 	struct eib_wqe_pool_s	*qe_pool;
245*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			*qe_cpbuf;
246*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			*qe_payload_hdr;
247*13101SVenki.Rajagopalan@Sun.COM 	uint_t			qe_bufsz;
248*13101SVenki.Rajagopalan@Sun.COM 	uint_t			qe_info;
249*13101SVenki.Rajagopalan@Sun.COM 	int			qe_vnic_inst;
250*13101SVenki.Rajagopalan@Sun.COM 	ibt_ud_dest_hdl_t	qe_dest;
251*13101SVenki.Rajagopalan@Sun.COM 	frtn_t			qe_frp;
252*13101SVenki.Rajagopalan@Sun.COM 
253*13101SVenki.Rajagopalan@Sun.COM 	mblk_t			*qe_mp;
254*13101SVenki.Rajagopalan@Sun.COM 	ibt_mi_hdl_t		qe_iov_hdl;
255*13101SVenki.Rajagopalan@Sun.COM 	ibt_all_wr_t		qe_wr;
256*13101SVenki.Rajagopalan@Sun.COM 	ibt_wr_ds_t		qe_sgl;
257*13101SVenki.Rajagopalan@Sun.COM 	ibt_wr_ds_t		qe_big_sgl[EIB_MAX_SGL];
258*13101SVenki.Rajagopalan@Sun.COM 	struct eib_wqe_s	*qe_nxt_post;
259*13101SVenki.Rajagopalan@Sun.COM 	struct eib_chan_s	*qe_chan;
260*13101SVenki.Rajagopalan@Sun.COM } eib_wqe_t;
261*13101SVenki.Rajagopalan@Sun.COM 
262*13101SVenki.Rajagopalan@Sun.COM /*
263*13101SVenki.Rajagopalan@Sun.COM  * The wqe in-use/free status in EoIB is managed via a 2-level bitmap
264*13101SVenki.Rajagopalan@Sun.COM  * logic.
265*13101SVenki.Rajagopalan@Sun.COM  *
266*13101SVenki.Rajagopalan@Sun.COM  * Each set of 64 wqes (a "wqe block") is managed by a single 64-bit
267*13101SVenki.Rajagopalan@Sun.COM  * integer bitmap.  The free status of a set of 64 such wqe blocks (a
268*13101SVenki.Rajagopalan@Sun.COM  * "wqe pool") is managed by one 64-bit integer bitmap (if any wqe in
269*13101SVenki.Rajagopalan@Sun.COM  * the wqe block is free, the bit in the map is 1, otherwise it is 0).
270*13101SVenki.Rajagopalan@Sun.COM  *
271*13101SVenki.Rajagopalan@Sun.COM  * The maximum pool size is 4096 wqes, but this can easily be extended
272*13101SVenki.Rajagopalan@Sun.COM  * to support more wqes using additional pools of wqes.
273*13101SVenki.Rajagopalan@Sun.COM  *
274*13101SVenki.Rajagopalan@Sun.COM  * Note that an entire pool of wqes is allocated via a single allocation,
275*13101SVenki.Rajagopalan@Sun.COM  * the wqe addresses in a pool are all contiguous.  The tx/rx copy buffers
276*13101SVenki.Rajagopalan@Sun.COM  * for a wqe pool are also allocated via a single allocation.
277*13101SVenki.Rajagopalan@Sun.COM  */
278*13101SVenki.Rajagopalan@Sun.COM #define	EIB_BLKS_PER_POOL	64
279*13101SVenki.Rajagopalan@Sun.COM #define	EIB_WQES_PER_BLK	64	/* do not change this */
280*13101SVenki.Rajagopalan@Sun.COM #define	EIB_WQES_PER_POOL	(EIB_BLKS_PER_POOL * EIB_WQES_PER_BLK)
281*13101SVenki.Rajagopalan@Sun.COM 
282*13101SVenki.Rajagopalan@Sun.COM #define	EIB_WQE_SZ		(sizeof (eib_wqe_t))
283*13101SVenki.Rajagopalan@Sun.COM #define	EIB_WQEBLK_SZ		(EIB_WQES_PER_BLK * EIB_WQE_SZ)
284*13101SVenki.Rajagopalan@Sun.COM 
285*13101SVenki.Rajagopalan@Sun.COM typedef struct eib_wqe_pool_s {
286*13101SVenki.Rajagopalan@Sun.COM 	struct eib_wqe_pool_s	*wp_next;
287*13101SVenki.Rajagopalan@Sun.COM 	struct eib_s		*wp_ss;
288*13101SVenki.Rajagopalan@Sun.COM 	ib_vaddr_t		wp_vaddr;
289*13101SVenki.Rajagopalan@Sun.COM 	ib_memlen_t		wp_memsz;
290*13101SVenki.Rajagopalan@Sun.COM 	ibt_mr_hdl_t		wp_mr;
291*13101SVenki.Rajagopalan@Sun.COM 	ibt_lkey_t		wp_lkey;
292*13101SVenki.Rajagopalan@Sun.COM 	uint_t			wp_nfree_lwm;
293*13101SVenki.Rajagopalan@Sun.COM 	int			wp_type;
294*13101SVenki.Rajagopalan@Sun.COM 
295*13101SVenki.Rajagopalan@Sun.COM 	kmutex_t		wp_lock;
296*13101SVenki.Rajagopalan@Sun.COM 	kcondvar_t		wp_cv;
297*13101SVenki.Rajagopalan@Sun.COM 	uint_t			wp_status;
298*13101SVenki.Rajagopalan@Sun.COM 	uint_t			wp_nfree;
299*13101SVenki.Rajagopalan@Sun.COM 	uint64_t		wp_free_blks;
300*13101SVenki.Rajagopalan@Sun.COM 	uint64_t		wp_free_wqes[EIB_BLKS_PER_POOL];
301*13101SVenki.Rajagopalan@Sun.COM 	struct eib_wqe_s	*wp_wqe;
302*13101SVenki.Rajagopalan@Sun.COM } eib_wqe_pool_t;
303*13101SVenki.Rajagopalan@Sun.COM 
304*13101SVenki.Rajagopalan@Sun.COM /*
305*13101SVenki.Rajagopalan@Sun.COM  * Values for wp_type
306*13101SVenki.Rajagopalan@Sun.COM  */
307*13101SVenki.Rajagopalan@Sun.COM #define	EIB_WP_TYPE_TX		0x1
308*13101SVenki.Rajagopalan@Sun.COM #define	EIB_WP_TYPE_RX		0x2
309*13101SVenki.Rajagopalan@Sun.COM 
310*13101SVenki.Rajagopalan@Sun.COM /*
311*13101SVenki.Rajagopalan@Sun.COM  * Values for wp_status (bit fields)
312*13101SVenki.Rajagopalan@Sun.COM  */
313*13101SVenki.Rajagopalan@Sun.COM #define	EIB_TXWQE_SHORT		0x1	/* only for tx wqe pool */
314*13101SVenki.Rajagopalan@Sun.COM #define	EIB_TXWQE_MONITOR_DIE	0x2	/* only for tx wqe pool */
315*13101SVenki.Rajagopalan@Sun.COM 
316*13101SVenki.Rajagopalan@Sun.COM #define	EIB_RXWQE_SHORT		0x1	/* only for rx wqe pool */
317*13101SVenki.Rajagopalan@Sun.COM 
318*13101SVenki.Rajagopalan@Sun.COM /*
319*13101SVenki.Rajagopalan@Sun.COM  * The low-water-mark is an indication of when wqe grabs for low-priority
320*13101SVenki.Rajagopalan@Sun.COM  * qps should start to get refused (swqe grabs for control messages such
321*13101SVenki.Rajagopalan@Sun.COM  * as keepalives and rwqe grabs for posting back to control qps will still
322*13101SVenki.Rajagopalan@Sun.COM  * be allowed).  The high-water-mark is an indication of when normal
323*13101SVenki.Rajagopalan@Sun.COM  * behavior should resume.
324*13101SVenki.Rajagopalan@Sun.COM  */
325*13101SVenki.Rajagopalan@Sun.COM #define	EIB_NFREE_SWQES_LWM	(EIB_WQES_PER_POOL / 64)	/* 1/64 */
326*13101SVenki.Rajagopalan@Sun.COM #define	EIB_NFREE_SWQES_HWM	(EIB_WQES_PER_POOL / 32)	/* 1/32 */
327*13101SVenki.Rajagopalan@Sun.COM #define	EIB_NFREE_RWQES_LWM	(EIB_WQES_PER_POOL / 10)	/* 10% */
328*13101SVenki.Rajagopalan@Sun.COM #define	EIB_NFREE_RWQES_HWM	(EIB_WQES_PER_POOL / 5)		/* 20% */
329*13101SVenki.Rajagopalan@Sun.COM 
330*13101SVenki.Rajagopalan@Sun.COM /*
331*13101SVenki.Rajagopalan@Sun.COM  * The "rwqes low" is used to determine when we should start using allocb()
332*13101SVenki.Rajagopalan@Sun.COM  * to copy and send received mblks in the rx path.  It should be a little
333*13101SVenki.Rajagopalan@Sun.COM  * above the rwqes low-water-mark, but less than the high-water-mark.
334*13101SVenki.Rajagopalan@Sun.COM  */
335*13101SVenki.Rajagopalan@Sun.COM #define	EIB_NFREE_RWQES_LOW	\
336*13101SVenki.Rajagopalan@Sun.COM 	((EIB_NFREE_RWQES_LWM + EIB_NFREE_RWQES_HWM) / 2)
337*13101SVenki.Rajagopalan@Sun.COM 
338*13101SVenki.Rajagopalan@Sun.COM #define	EIB_WPRI_HI		1	/* for keepalive posts */
339*13101SVenki.Rajagopalan@Sun.COM #define	EIB_WPRI_LO		2	/* for all other posts */
340*13101SVenki.Rajagopalan@Sun.COM 
341*13101SVenki.Rajagopalan@Sun.COM /*
342*13101SVenki.Rajagopalan@Sun.COM  * Multicast GID Layout: the multicast gid is specified in big-endian
343*13101SVenki.Rajagopalan@Sun.COM  * representation, as a collection of different-sized fields in the
344*13101SVenki.Rajagopalan@Sun.COM  * EoIB specification.  On Solaris, the multicast gid is represented
345*13101SVenki.Rajagopalan@Sun.COM  * as a collection of two 8-byte fields (in ib_gid_t).
346*13101SVenki.Rajagopalan@Sun.COM  */
347*13101SVenki.Rajagopalan@Sun.COM typedef struct eib_mgid_spec_s {
348*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			sp_mgid_prefix[FIP_MGID_PREFIX_LEN];
349*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			sp_type;
350*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			sp_dmac[ETHERADDRL];
351*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			sp_rss_hash;
352*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			sp_vhub_id[FIP_VHUBID_LEN];
353*13101SVenki.Rajagopalan@Sun.COM } eib_mgid_spec_t;
354*13101SVenki.Rajagopalan@Sun.COM 
355*13101SVenki.Rajagopalan@Sun.COM /*
356*13101SVenki.Rajagopalan@Sun.COM  * Values for sp_type in mgid as per EoIB specification
357*13101SVenki.Rajagopalan@Sun.COM  */
358*13101SVenki.Rajagopalan@Sun.COM #define	EIB_MGID_VHUB_DATA	0x0
359*13101SVenki.Rajagopalan@Sun.COM #define	EIB_MGID_VHUB_UPDATE	0x2
360*13101SVenki.Rajagopalan@Sun.COM #define	EIB_MGID_VHUB_TABLE	0x3
361*13101SVenki.Rajagopalan@Sun.COM 
362*13101SVenki.Rajagopalan@Sun.COM typedef union eib_mgid_s {
363*13101SVenki.Rajagopalan@Sun.COM 	eib_mgid_spec_t		gd_spec;
364*13101SVenki.Rajagopalan@Sun.COM 	ib_gid_t		gd_sol;
365*13101SVenki.Rajagopalan@Sun.COM } eib_mgid_t;
366*13101SVenki.Rajagopalan@Sun.COM 
367*13101SVenki.Rajagopalan@Sun.COM /*
368*13101SVenki.Rajagopalan@Sun.COM  * Gateway properties handed over to us by the EoIB nexus
369*13101SVenki.Rajagopalan@Sun.COM  */
370*13101SVenki.Rajagopalan@Sun.COM typedef struct eib_gw_props_s {
371*13101SVenki.Rajagopalan@Sun.COM 	kmutex_t		pp_gw_lock;
372*13101SVenki.Rajagopalan@Sun.COM 
373*13101SVenki.Rajagopalan@Sun.COM 	ib_guid_t		pp_gw_system_guid;
374*13101SVenki.Rajagopalan@Sun.COM 	ib_guid_t		pp_gw_guid;
375*13101SVenki.Rajagopalan@Sun.COM 	ib_sn_prefix_t		pp_gw_sn_prefix;
376*13101SVenki.Rajagopalan@Sun.COM 
377*13101SVenki.Rajagopalan@Sun.COM 	uint_t			pp_gw_adv_period;
378*13101SVenki.Rajagopalan@Sun.COM 	uint_t			pp_gw_ka_period;
379*13101SVenki.Rajagopalan@Sun.COM 	uint_t			pp_vnic_ka_period;
380*13101SVenki.Rajagopalan@Sun.COM 
381*13101SVenki.Rajagopalan@Sun.COM 	ib_qpn_t		pp_gw_ctrl_qpn;
382*13101SVenki.Rajagopalan@Sun.COM 	ib_lid_t		pp_gw_lid;
383*13101SVenki.Rajagopalan@Sun.COM 	uint16_t		pp_gw_portid;
384*13101SVenki.Rajagopalan@Sun.COM 
385*13101SVenki.Rajagopalan@Sun.COM 	uint16_t		pp_gw_num_net_vnics;
386*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			pp_gw_flag_available;
387*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			pp_gw_is_host_adm_vnics;
388*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			pp_gw_sl;
389*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			pp_gw_n_rss_qpn;
390*13101SVenki.Rajagopalan@Sun.COM 
391*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			*pp_gw_system_name;
392*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			*pp_gw_port_name;
393*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			*pp_gw_vendor_id;
394*13101SVenki.Rajagopalan@Sun.COM 
395*13101SVenki.Rajagopalan@Sun.COM 	clock_t			pp_gw_ka_ticks;		/* 2.5 x gw_ka_period */
396*13101SVenki.Rajagopalan@Sun.COM 	clock_t			pp_vnic_ka_ticks;	/* vnic_ka_period */
397*13101SVenki.Rajagopalan@Sun.COM } eib_gw_props_t;
398*13101SVenki.Rajagopalan@Sun.COM 
399*13101SVenki.Rajagopalan@Sun.COM /*
400*13101SVenki.Rajagopalan@Sun.COM  * Port-specific properties
401*13101SVenki.Rajagopalan@Sun.COM  */
402*13101SVenki.Rajagopalan@Sun.COM typedef struct eib_props_s {
403*13101SVenki.Rajagopalan@Sun.COM 	uint64_t		ep_ifspeed;
404*13101SVenki.Rajagopalan@Sun.COM 	ib_guid_t		ep_hca_guid;
405*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			ep_port_num;
406*13101SVenki.Rajagopalan@Sun.COM 	ib_gid_t		ep_sgid;
407*13101SVenki.Rajagopalan@Sun.COM 	ib_lid_t		ep_blid;
408*13101SVenki.Rajagopalan@Sun.COM 	uint16_t		ep_mtu;
409*13101SVenki.Rajagopalan@Sun.COM 	ibt_srate_t		ep_srate;
410*13101SVenki.Rajagopalan@Sun.COM } eib_props_t;
411*13101SVenki.Rajagopalan@Sun.COM 
412*13101SVenki.Rajagopalan@Sun.COM /*
413*13101SVenki.Rajagopalan@Sun.COM  * Capabilities derived from HCA attributes
414*13101SVenki.Rajagopalan@Sun.COM  */
415*13101SVenki.Rajagopalan@Sun.COM typedef struct eib_caps_s {
416*13101SVenki.Rajagopalan@Sun.COM 	uint_t			cp_lso_maxlen;
417*13101SVenki.Rajagopalan@Sun.COM 	uint32_t		cp_cksum_flags;
418*13101SVenki.Rajagopalan@Sun.COM 	int			cp_resv_lkey_capab;
419*13101SVenki.Rajagopalan@Sun.COM 	ibt_lkey_t		cp_resv_lkey;
420*13101SVenki.Rajagopalan@Sun.COM 
421*13101SVenki.Rajagopalan@Sun.COM 	uint_t			cp_max_swqe;
422*13101SVenki.Rajagopalan@Sun.COM 	uint_t			cp_max_rwqe;
423*13101SVenki.Rajagopalan@Sun.COM 	uint_t			cp_max_sgl;
424*13101SVenki.Rajagopalan@Sun.COM 	uint_t			cp_hiwm_sgl;
425*13101SVenki.Rajagopalan@Sun.COM } eib_caps_t;
426*13101SVenki.Rajagopalan@Sun.COM 
427*13101SVenki.Rajagopalan@Sun.COM /*
428*13101SVenki.Rajagopalan@Sun.COM  * List of multicast groups the vnic joined
429*13101SVenki.Rajagopalan@Sun.COM  */
430*13101SVenki.Rajagopalan@Sun.COM typedef struct eib_mcg_s {
431*13101SVenki.Rajagopalan@Sun.COM 	struct eib_mcg_s	*mg_next;
432*13101SVenki.Rajagopalan@Sun.COM 	ib_gid_t		mg_rgid;
433*13101SVenki.Rajagopalan@Sun.COM 	ib_gid_t		mg_mgid;
434*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			mg_join_state;
435*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			mg_mac[ETHERADDRL];
436*13101SVenki.Rajagopalan@Sun.COM 	ibt_mcg_info_t		*mg_mcginfo;
437*13101SVenki.Rajagopalan@Sun.COM } eib_mcg_t;
438*13101SVenki.Rajagopalan@Sun.COM 
439*13101SVenki.Rajagopalan@Sun.COM /*
440*13101SVenki.Rajagopalan@Sun.COM  * Admin/control/data channel information
441*13101SVenki.Rajagopalan@Sun.COM  */
442*13101SVenki.Rajagopalan@Sun.COM typedef struct eib_chan_s {
443*13101SVenki.Rajagopalan@Sun.COM 	ibt_channel_hdl_t	ch_chan;
444*13101SVenki.Rajagopalan@Sun.COM 	ib_qpn_t		ch_qpn;
445*13101SVenki.Rajagopalan@Sun.COM 
446*13101SVenki.Rajagopalan@Sun.COM 	ibt_wc_t		*ch_wc;
447*13101SVenki.Rajagopalan@Sun.COM 	ibt_cq_hdl_t		ch_cq_hdl;
448*13101SVenki.Rajagopalan@Sun.COM 	uint_t			ch_cq_sz;
449*13101SVenki.Rajagopalan@Sun.COM 
450*13101SVenki.Rajagopalan@Sun.COM 	ibt_wc_t		*ch_rcv_wc;
451*13101SVenki.Rajagopalan@Sun.COM 	ibt_cq_hdl_t		ch_rcv_cq_hdl;
452*13101SVenki.Rajagopalan@Sun.COM 	uint_t			ch_rcv_cq_sz;
453*13101SVenki.Rajagopalan@Sun.COM 
454*13101SVenki.Rajagopalan@Sun.COM 	int			ch_vnic_inst;
455*13101SVenki.Rajagopalan@Sun.COM 	uint_t			ch_max_swqes;
456*13101SVenki.Rajagopalan@Sun.COM 	uint_t			ch_max_rwqes;
457*13101SVenki.Rajagopalan@Sun.COM 	uint_t			ch_lwm_rwqes;
458*13101SVenki.Rajagopalan@Sun.COM 	uint_t			ch_rwqe_bktsz;
459*13101SVenki.Rajagopalan@Sun.COM 	uint_t			ch_ip_hdr_align;
460*13101SVenki.Rajagopalan@Sun.COM 	boolean_t		ch_alloc_mp;
461*13101SVenki.Rajagopalan@Sun.COM 	boolean_t		ch_tear_down;
462*13101SVenki.Rajagopalan@Sun.COM 
463*13101SVenki.Rajagopalan@Sun.COM 	kmutex_t		ch_pkey_lock;
464*13101SVenki.Rajagopalan@Sun.COM 	ib_pkey_t		ch_pkey;
465*13101SVenki.Rajagopalan@Sun.COM 	uint16_t		ch_pkey_ix;
466*13101SVenki.Rajagopalan@Sun.COM 
467*13101SVenki.Rajagopalan@Sun.COM 	kmutex_t		ch_cep_lock;
468*13101SVenki.Rajagopalan@Sun.COM 	kcondvar_t		ch_cep_cv;
469*13101SVenki.Rajagopalan@Sun.COM 	ibt_cep_state_t		ch_cep_state;
470*13101SVenki.Rajagopalan@Sun.COM 
471*13101SVenki.Rajagopalan@Sun.COM 	kmutex_t		ch_tx_lock;
472*13101SVenki.Rajagopalan@Sun.COM 	kcondvar_t		ch_tx_cv;
473*13101SVenki.Rajagopalan@Sun.COM 	uint_t			ch_tx_posted;
474*13101SVenki.Rajagopalan@Sun.COM 	boolean_t		ch_tx_busy;
475*13101SVenki.Rajagopalan@Sun.COM 	struct eib_wqe_s	*ch_tx;
476*13101SVenki.Rajagopalan@Sun.COM 	struct eib_wqe_s	*ch_tx_tail;
477*13101SVenki.Rajagopalan@Sun.COM 
478*13101SVenki.Rajagopalan@Sun.COM 	kmutex_t		ch_rx_lock;
479*13101SVenki.Rajagopalan@Sun.COM 	kcondvar_t		ch_rx_cv;
480*13101SVenki.Rajagopalan@Sun.COM 	uint_t			ch_rx_posted;
481*13101SVenki.Rajagopalan@Sun.COM 	boolean_t		ch_rx_refilling;
482*13101SVenki.Rajagopalan@Sun.COM 
483*13101SVenki.Rajagopalan@Sun.COM 	kmutex_t		ch_vhub_lock;
484*13101SVenki.Rajagopalan@Sun.COM 	struct eib_mcg_s	*ch_vhub_table;
485*13101SVenki.Rajagopalan@Sun.COM 	struct eib_mcg_s	*ch_vhub_update;
486*13101SVenki.Rajagopalan@Sun.COM 	struct eib_mcg_s	*ch_vhub_data;
487*13101SVenki.Rajagopalan@Sun.COM 
488*13101SVenki.Rajagopalan@Sun.COM 	struct eib_chan_s	*ch_rxpost_next;
489*13101SVenki.Rajagopalan@Sun.COM } eib_chan_t;
490*13101SVenki.Rajagopalan@Sun.COM 
491*13101SVenki.Rajagopalan@Sun.COM /*
492*13101SVenki.Rajagopalan@Sun.COM  * States for vNIC state machine during login
493*13101SVenki.Rajagopalan@Sun.COM  */
494*13101SVenki.Rajagopalan@Sun.COM #define	EIB_LOGIN_INIT		0
495*13101SVenki.Rajagopalan@Sun.COM #define	EIB_LOGIN_ACK_WAIT	1
496*13101SVenki.Rajagopalan@Sun.COM #define	EIB_LOGIN_ACK_RCVD	2
497*13101SVenki.Rajagopalan@Sun.COM #define	EIB_LOGIN_NACK_RCVD	3
498*13101SVenki.Rajagopalan@Sun.COM #define	EIB_LOGIN_TBL_WAIT	4
499*13101SVenki.Rajagopalan@Sun.COM #define	EIB_LOGIN_TBL_INPROG	5
500*13101SVenki.Rajagopalan@Sun.COM #define	EIB_LOGIN_TBL_DONE	6
501*13101SVenki.Rajagopalan@Sun.COM #define	EIB_LOGIN_TBL_FAILED	7
502*13101SVenki.Rajagopalan@Sun.COM #define	EIB_LOGIN_DONE		8
503*13101SVenki.Rajagopalan@Sun.COM #define	EIB_LOGIN_TIMED_OUT	9
504*13101SVenki.Rajagopalan@Sun.COM #define	EIB_LOGOUT_DONE		10
505*13101SVenki.Rajagopalan@Sun.COM 
506*13101SVenki.Rajagopalan@Sun.COM typedef struct eib_login_data_s {
507*13101SVenki.Rajagopalan@Sun.COM 	ib_guid_t		ld_gw_guid;
508*13101SVenki.Rajagopalan@Sun.COM 	ib_lid_t		ld_gw_lid;
509*13101SVenki.Rajagopalan@Sun.COM 	uint_t			ld_syndrome;
510*13101SVenki.Rajagopalan@Sun.COM 	uint16_t		ld_gw_port_id;
511*13101SVenki.Rajagopalan@Sun.COM 	ib_qpn_t		ld_gw_data_qpn;
512*13101SVenki.Rajagopalan@Sun.COM 	ib_qpn_t		ld_gw_ctl_qpn;
513*13101SVenki.Rajagopalan@Sun.COM 	uint16_t		ld_vnic_id;	/* includes set msbit */
514*13101SVenki.Rajagopalan@Sun.COM 	uint16_t		ld_vhub_mtu;
515*13101SVenki.Rajagopalan@Sun.COM 	uint16_t		ld_vhub_pkey;
516*13101SVenki.Rajagopalan@Sun.COM 	uint16_t		ld_assigned_vlan;
517*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			ld_gw_sl;
518*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			ld_n_rss_mcgid;
519*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			ld_n_mac_mcgid;
520*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			ld_vnic_name[FIP_VNIC_NAME_LEN];
521*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			ld_assigned_mac[ETHERADDRL];
522*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			ld_gw_mgid_prefix[FIP_MGID_PREFIX_LEN];
523*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			ld_vlan_in_packets;
524*13101SVenki.Rajagopalan@Sun.COM 	uint32_t		ld_vhub_id;
525*13101SVenki.Rajagopalan@Sun.COM } eib_login_data_t;
526*13101SVenki.Rajagopalan@Sun.COM 
527*13101SVenki.Rajagopalan@Sun.COM #define	EIB_UNICAST_MAC(mac)		(((mac)[0] & 0x01) == 0)
528*13101SVenki.Rajagopalan@Sun.COM 
529*13101SVenki.Rajagopalan@Sun.COM /*
530*13101SVenki.Rajagopalan@Sun.COM  * Map to translate between DMAC and {qpn, lid, sl}
531*13101SVenki.Rajagopalan@Sun.COM  */
532*13101SVenki.Rajagopalan@Sun.COM typedef struct eib_vhub_map_s {
533*13101SVenki.Rajagopalan@Sun.COM 	struct eib_vhub_map_s	*mp_next;
534*13101SVenki.Rajagopalan@Sun.COM 	uint32_t		mp_tusn;
535*13101SVenki.Rajagopalan@Sun.COM 	ib_qpn_t		mp_qpn;
536*13101SVenki.Rajagopalan@Sun.COM 	ib_lid_t		mp_lid;
537*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			mp_mac[ETHERADDRL];
538*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			mp_sl;
539*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			mp_v_rss_type;
540*13101SVenki.Rajagopalan@Sun.COM } eib_vhub_map_t;
541*13101SVenki.Rajagopalan@Sun.COM 
542*13101SVenki.Rajagopalan@Sun.COM /*
543*13101SVenki.Rajagopalan@Sun.COM  * Per-vNIC vHUB Table
544*13101SVenki.Rajagopalan@Sun.COM  */
545*13101SVenki.Rajagopalan@Sun.COM #define	EIB_TB_NBUCKETS		13
546*13101SVenki.Rajagopalan@Sun.COM typedef struct eib_vhub_table_s {
547*13101SVenki.Rajagopalan@Sun.COM 	kmutex_t		tb_lock;
548*13101SVenki.Rajagopalan@Sun.COM 	struct eib_vhub_map_s	*tb_gateway;
549*13101SVenki.Rajagopalan@Sun.COM 	struct eib_vhub_map_s	*tb_unicast_miss;
550*13101SVenki.Rajagopalan@Sun.COM 	struct eib_vhub_map_s	*tb_vhub_multicast;
551*13101SVenki.Rajagopalan@Sun.COM 	struct eib_vhub_map_s	*tb_vnic_entry[EIB_TB_NBUCKETS];
552*13101SVenki.Rajagopalan@Sun.COM 	struct eib_vhub_map_s	*tb_mcast_entry[EIB_TB_NBUCKETS];
553*13101SVenki.Rajagopalan@Sun.COM 
554*13101SVenki.Rajagopalan@Sun.COM 	uint32_t		tb_tusn;
555*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			tb_eport_state;
556*13101SVenki.Rajagopalan@Sun.COM 
557*13101SVenki.Rajagopalan@Sun.COM 	uint16_t		tb_entries_seen;
558*13101SVenki.Rajagopalan@Sun.COM 	uint16_t		tb_entries_in_table;
559*13101SVenki.Rajagopalan@Sun.COM 	uint32_t		tb_checksum;
560*13101SVenki.Rajagopalan@Sun.COM } eib_vhub_table_t;
561*13101SVenki.Rajagopalan@Sun.COM 
562*13101SVenki.Rajagopalan@Sun.COM typedef struct eib_vhub_update_s {
563*13101SVenki.Rajagopalan@Sun.COM 	kmutex_t		up_lock;
564*13101SVenki.Rajagopalan@Sun.COM 	eib_vhub_map_t		*up_vnic_entry;
565*13101SVenki.Rajagopalan@Sun.COM 	uint32_t		up_tusn;
566*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			up_eport_state;
567*13101SVenki.Rajagopalan@Sun.COM } eib_vhub_update_t;
568*13101SVenki.Rajagopalan@Sun.COM 
569*13101SVenki.Rajagopalan@Sun.COM typedef struct eib_ether_hdr_s {
570*13101SVenki.Rajagopalan@Sun.COM 	int			eh_tagless;
571*13101SVenki.Rajagopalan@Sun.COM 	uint16_t		eh_ether_type;
572*13101SVenki.Rajagopalan@Sun.COM 	uint16_t		eh_vlan;
573*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			eh_dmac[ETHERADDRL];
574*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			eh_smac[ETHERADDRL];
575*13101SVenki.Rajagopalan@Sun.COM } eib_ether_hdr_t;
576*13101SVenki.Rajagopalan@Sun.COM 
577*13101SVenki.Rajagopalan@Sun.COM /*
578*13101SVenki.Rajagopalan@Sun.COM  * vNIC Information
579*13101SVenki.Rajagopalan@Sun.COM  */
580*13101SVenki.Rajagopalan@Sun.COM typedef struct eib_vnic_s {
581*13101SVenki.Rajagopalan@Sun.COM 	struct eib_s		*vn_ss;
582*13101SVenki.Rajagopalan@Sun.COM 	eib_chan_t		*vn_ctl_chan;
583*13101SVenki.Rajagopalan@Sun.COM 	eib_chan_t		*vn_data_chan;
584*13101SVenki.Rajagopalan@Sun.COM 	int			vn_instance;
585*13101SVenki.Rajagopalan@Sun.COM 	uint16_t		vn_vlan;
586*13101SVenki.Rajagopalan@Sun.COM 	uint16_t		vn_id;
587*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			vn_macaddr[ETHERADDRL];
588*13101SVenki.Rajagopalan@Sun.COM 	struct eib_login_data_s	vn_login_data;
589*13101SVenki.Rajagopalan@Sun.COM 
590*13101SVenki.Rajagopalan@Sun.COM 	kmutex_t		vn_lock;
591*13101SVenki.Rajagopalan@Sun.COM 	kcondvar_t		vn_cv;
592*13101SVenki.Rajagopalan@Sun.COM 	uint_t			vn_state;
593*13101SVenki.Rajagopalan@Sun.COM 	struct eib_vhub_table_s	*vn_vhub_table;
594*13101SVenki.Rajagopalan@Sun.COM 	struct eib_vhub_update_s *vn_vhub_update;
595*13101SVenki.Rajagopalan@Sun.COM 
596*13101SVenki.Rajagopalan@Sun.COM 	ddi_softint_handle_t    vn_ctl_si_hdl;
597*13101SVenki.Rajagopalan@Sun.COM 	ddi_softint_handle_t    vn_data_tx_si_hdl;
598*13101SVenki.Rajagopalan@Sun.COM 	ddi_softint_handle_t    vn_data_rx_si_hdl;
599*13101SVenki.Rajagopalan@Sun.COM } eib_vnic_t;
600*13101SVenki.Rajagopalan@Sun.COM 
601*13101SVenki.Rajagopalan@Sun.COM 
602*13101SVenki.Rajagopalan@Sun.COM /*
603*13101SVenki.Rajagopalan@Sun.COM  * Base NIC's mac state flags. The lock protects the starting/stopping
604*13101SVenki.Rajagopalan@Sun.COM  * bits.  Access to the rest of the mac state is protected by these
605*13101SVenki.Rajagopalan@Sun.COM  * two bits.
606*13101SVenki.Rajagopalan@Sun.COM  */
607*13101SVenki.Rajagopalan@Sun.COM #define	EIB_NIC_STARTING	0x01
608*13101SVenki.Rajagopalan@Sun.COM #define	EIB_NIC_STOPPING	0x02
609*13101SVenki.Rajagopalan@Sun.COM #define	EIB_NIC_STARTED		0x80
610*13101SVenki.Rajagopalan@Sun.COM #define	EIB_NIC_RESTARTING	(EIB_NIC_STARTING | EIB_NIC_STOPPING)
611*13101SVenki.Rajagopalan@Sun.COM 
612*13101SVenki.Rajagopalan@Sun.COM typedef struct eib_node_state_s {
613*13101SVenki.Rajagopalan@Sun.COM 	kmutex_t		ns_lock;
614*13101SVenki.Rajagopalan@Sun.COM 	kcondvar_t		ns_cv;
615*13101SVenki.Rajagopalan@Sun.COM 	uint_t			ns_nic_state;
616*13101SVenki.Rajagopalan@Sun.COM 	link_state_t		ns_link_state;
617*13101SVenki.Rajagopalan@Sun.COM } eib_node_state_t;
618*13101SVenki.Rajagopalan@Sun.COM 
619*13101SVenki.Rajagopalan@Sun.COM /*
620*13101SVenki.Rajagopalan@Sun.COM  * MIB-II statistics to report to the mac layer
621*13101SVenki.Rajagopalan@Sun.COM  */
622*13101SVenki.Rajagopalan@Sun.COM typedef struct eib_stats_s {
623*13101SVenki.Rajagopalan@Sun.COM 	uint64_t		st_obytes;	/* bytes sent out */
624*13101SVenki.Rajagopalan@Sun.COM 	uint64_t		st_opkts;	/* pkts sent out */
625*13101SVenki.Rajagopalan@Sun.COM 	uint64_t		st_brdcstxmit;	/* broadcast pkts transmitted */
626*13101SVenki.Rajagopalan@Sun.COM 	uint64_t		st_multixmit;	/* multicast pkts transmitted */
627*13101SVenki.Rajagopalan@Sun.COM 	uint64_t		st_oerrors;	/* transmit errors */
628*13101SVenki.Rajagopalan@Sun.COM 	uint64_t		st_noxmitbuf;	/* transmit pkts discarded */
629*13101SVenki.Rajagopalan@Sun.COM 
630*13101SVenki.Rajagopalan@Sun.COM 	uint64_t		st_rbytes;	/* bytes received */
631*13101SVenki.Rajagopalan@Sun.COM 	uint64_t		st_ipkts;	/* pkts received */
632*13101SVenki.Rajagopalan@Sun.COM 	uint64_t		st_brdcstrcv;	/* broadcast pkts received */
633*13101SVenki.Rajagopalan@Sun.COM 	uint64_t		st_multircv;	/* multicast pkts received */
634*13101SVenki.Rajagopalan@Sun.COM 	uint64_t		st_ierrors;	/* receive errors */
635*13101SVenki.Rajagopalan@Sun.COM 	uint64_t		st_norcvbuf;	/* receive pkts discarded */
636*13101SVenki.Rajagopalan@Sun.COM } eib_stats_t;
637*13101SVenki.Rajagopalan@Sun.COM 
638*13101SVenki.Rajagopalan@Sun.COM #define	EIB_UPDATE_COUNTER(addr, val)	(atomic_add_64((addr), (val)))
639*13101SVenki.Rajagopalan@Sun.COM #define	EIB_INCR_COUNTER(addr)		(atomic_inc_64((addr)))
640*13101SVenki.Rajagopalan@Sun.COM #define	EIB_DECR_COUNTER(addr)		(atomic_dec_64((addr)))
641*13101SVenki.Rajagopalan@Sun.COM 
642*13101SVenki.Rajagopalan@Sun.COM /*
643*13101SVenki.Rajagopalan@Sun.COM  * Cache of address vectors with dlid as the key. Currently we use
644*13101SVenki.Rajagopalan@Sun.COM  * eib state structure's  ei_lock to protect the individual address
645*13101SVenki.Rajagopalan@Sun.COM  * vector's fields.  This is a lock granularity that's slightly
646*13101SVenki.Rajagopalan@Sun.COM  * bigger than ideal, but it should do for now.
647*13101SVenki.Rajagopalan@Sun.COM  */
648*13101SVenki.Rajagopalan@Sun.COM #define	EIB_AV_NBUCKETS		17
649*13101SVenki.Rajagopalan@Sun.COM typedef struct eib_avect_s {
650*13101SVenki.Rajagopalan@Sun.COM 	struct eib_avect_s	*av_next;
651*13101SVenki.Rajagopalan@Sun.COM 	ibt_adds_vect_t		av_vect;
652*13101SVenki.Rajagopalan@Sun.COM 	uint_t			av_ref;
653*13101SVenki.Rajagopalan@Sun.COM } eib_avect_t;
654*13101SVenki.Rajagopalan@Sun.COM 
655*13101SVenki.Rajagopalan@Sun.COM /*
656*13101SVenki.Rajagopalan@Sun.COM  * vNIC creation and deletion are serialized by a non-zero value
657*13101SVenki.Rajagopalan@Sun.COM  * to the ei_vnic_state member (i.e. only one vnic may be created
658*13101SVenki.Rajagopalan@Sun.COM  * or deleted at a time). The code makes sure to access/update
659*13101SVenki.Rajagopalan@Sun.COM  * the ei_active_vnics member only after a successful setting of
660*13101SVenki.Rajagopalan@Sun.COM  * ei_vnic_state.
661*13101SVenki.Rajagopalan@Sun.COM  */
662*13101SVenki.Rajagopalan@Sun.COM #define	EIB_VN_BEING_CREATED	0x01
663*13101SVenki.Rajagopalan@Sun.COM #define	EIB_VN_BEING_DELETED	0x02
664*13101SVenki.Rajagopalan@Sun.COM #define	EIB_VN_BEING_MODIFIED	(EIB_VN_BEING_CREATED | EIB_VN_BEING_DELETED)
665*13101SVenki.Rajagopalan@Sun.COM 
666*13101SVenki.Rajagopalan@Sun.COM /*
667*13101SVenki.Rajagopalan@Sun.COM  * All possible EoIB event work items that need to be handled
668*13101SVenki.Rajagopalan@Sun.COM  */
669*13101SVenki.Rajagopalan@Sun.COM #define	EIB_EV_NONE		0
670*13101SVenki.Rajagopalan@Sun.COM #define	EIB_EV_PORT_DOWN	1
671*13101SVenki.Rajagopalan@Sun.COM #define	EIB_EV_PORT_UP		2
672*13101SVenki.Rajagopalan@Sun.COM #define	EIB_EV_PKEY_CHANGE	3
673*13101SVenki.Rajagopalan@Sun.COM #define	EIB_EV_SGID_CHANGE	4
674*13101SVenki.Rajagopalan@Sun.COM #define	EIB_EV_CLNT_REREG	5
675*13101SVenki.Rajagopalan@Sun.COM #define	EIB_EV_GW_EPORT_DOWN	6
676*13101SVenki.Rajagopalan@Sun.COM #define	EIB_EV_GW_DOWN		7
677*13101SVenki.Rajagopalan@Sun.COM #define	EIB_EV_GW_UP		8
678*13101SVenki.Rajagopalan@Sun.COM #define	EIB_EV_GW_INFO_UPDATE	9
679*13101SVenki.Rajagopalan@Sun.COM #define	EIB_EV_MCG_DELETED	10
680*13101SVenki.Rajagopalan@Sun.COM #define	EIB_EV_MCG_CREATED	11
681*13101SVenki.Rajagopalan@Sun.COM #define	EIB_EV_SHUTDOWN		12
682*13101SVenki.Rajagopalan@Sun.COM 
683*13101SVenki.Rajagopalan@Sun.COM typedef struct eib_event_s {
684*13101SVenki.Rajagopalan@Sun.COM 	struct eib_event_s	*ev_next;
685*13101SVenki.Rajagopalan@Sun.COM 	uint_t			ev_code;
686*13101SVenki.Rajagopalan@Sun.COM 	void			*ev_arg;
687*13101SVenki.Rajagopalan@Sun.COM } eib_event_t;
688*13101SVenki.Rajagopalan@Sun.COM 
689*13101SVenki.Rajagopalan@Sun.COM /*
690*13101SVenki.Rajagopalan@Sun.COM  * Work element for new vnic creation
691*13101SVenki.Rajagopalan@Sun.COM  */
692*13101SVenki.Rajagopalan@Sun.COM typedef struct eib_vnic_req_s {
693*13101SVenki.Rajagopalan@Sun.COM 	struct eib_vnic_req_s	*vr_next;
694*13101SVenki.Rajagopalan@Sun.COM 	uint_t			vr_req;
695*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			vr_mac[ETHERADDRL];
696*13101SVenki.Rajagopalan@Sun.COM 	uint16_t		vr_vlan;
697*13101SVenki.Rajagopalan@Sun.COM } eib_vnic_req_t;
698*13101SVenki.Rajagopalan@Sun.COM 
699*13101SVenki.Rajagopalan@Sun.COM /*
700*13101SVenki.Rajagopalan@Sun.COM  * Values for vr_req
701*13101SVenki.Rajagopalan@Sun.COM  */
702*13101SVenki.Rajagopalan@Sun.COM #define	EIB_CR_REQ_NEW_VNIC	1
703*13101SVenki.Rajagopalan@Sun.COM #define	EIB_CR_REQ_FLUSH	2
704*13101SVenki.Rajagopalan@Sun.COM #define	EIB_CR_REQ_DIE		3
705*13101SVenki.Rajagopalan@Sun.COM 
706*13101SVenki.Rajagopalan@Sun.COM /*
707*13101SVenki.Rajagopalan@Sun.COM  * Work element for vnics kept alive by the keepalive manager thread
708*13101SVenki.Rajagopalan@Sun.COM  * and bitfield values for ei_ka_vnics_event.
709*13101SVenki.Rajagopalan@Sun.COM  */
710*13101SVenki.Rajagopalan@Sun.COM typedef struct eib_ka_vnics_s {
711*13101SVenki.Rajagopalan@Sun.COM 	struct eib_ka_vnics_s	*ka_next;
712*13101SVenki.Rajagopalan@Sun.COM 	struct eib_vnic_s	*ka_vnic;
713*13101SVenki.Rajagopalan@Sun.COM } eib_ka_vnics_t;
714*13101SVenki.Rajagopalan@Sun.COM 
715*13101SVenki.Rajagopalan@Sun.COM #define	EIB_KA_VNICS_DIE	0x1
716*13101SVenki.Rajagopalan@Sun.COM #define	EIB_KA_VNICS_TIMED_OUT	0x2
717*13101SVenki.Rajagopalan@Sun.COM 
718*13101SVenki.Rajagopalan@Sun.COM /*
719*13101SVenki.Rajagopalan@Sun.COM  * EoIB per-instance state
720*13101SVenki.Rajagopalan@Sun.COM  */
721*13101SVenki.Rajagopalan@Sun.COM typedef struct eib_s {
722*13101SVenki.Rajagopalan@Sun.COM 	ibt_clnt_hdl_t		ei_ibt_hdl;
723*13101SVenki.Rajagopalan@Sun.COM 	ibt_hca_hdl_t		ei_hca_hdl;
724*13101SVenki.Rajagopalan@Sun.COM 	ibt_pd_hdl_t		ei_pd_hdl;
725*13101SVenki.Rajagopalan@Sun.COM 	mac_handle_t		ei_mac_hdl;
726*13101SVenki.Rajagopalan@Sun.COM 
727*13101SVenki.Rajagopalan@Sun.COM 	ddi_softint_handle_t    ei_admin_si_hdl;
728*13101SVenki.Rajagopalan@Sun.COM 	ddi_callback_id_t	ei_login_ack_cb;
729*13101SVenki.Rajagopalan@Sun.COM 	ddi_callback_id_t	ei_gw_alive_cb;
730*13101SVenki.Rajagopalan@Sun.COM 	ddi_callback_id_t	ei_gw_info_cb;
731*13101SVenki.Rajagopalan@Sun.COM 
732*13101SVenki.Rajagopalan@Sun.COM 	ibt_hca_attr_t		*ei_hca_attrs;
733*13101SVenki.Rajagopalan@Sun.COM 	dev_info_t		*ei_dip;
734*13101SVenki.Rajagopalan@Sun.COM 	uint_t			ei_instance;
735*13101SVenki.Rajagopalan@Sun.COM 
736*13101SVenki.Rajagopalan@Sun.COM 	struct eib_gw_props_s	*ei_gw_props;
737*13101SVenki.Rajagopalan@Sun.COM 	struct eib_props_s	*ei_props;
738*13101SVenki.Rajagopalan@Sun.COM 	struct eib_caps_s	*ei_caps;
739*13101SVenki.Rajagopalan@Sun.COM 	struct eib_stats_s	*ei_stats;
740*13101SVenki.Rajagopalan@Sun.COM 
741*13101SVenki.Rajagopalan@Sun.COM 	struct eib_node_state_s	*ei_node_state;
742*13101SVenki.Rajagopalan@Sun.COM 	struct eib_chan_s	*ei_admin_chan;
743*13101SVenki.Rajagopalan@Sun.COM 
744*13101SVenki.Rajagopalan@Sun.COM 	struct eib_wqe_pool_s	*ei_tx;
745*13101SVenki.Rajagopalan@Sun.COM 	struct eib_wqe_pool_s	*ei_rx;
746*13101SVenki.Rajagopalan@Sun.COM 	struct eib_lsobkt_s	*ei_lso;
747*13101SVenki.Rajagopalan@Sun.COM 
748*13101SVenki.Rajagopalan@Sun.COM 	kmutex_t		ei_vnic_lock;
749*13101SVenki.Rajagopalan@Sun.COM 	kcondvar_t		ei_vnic_cv;
750*13101SVenki.Rajagopalan@Sun.COM 	uint_t			ei_vnic_state;
751*13101SVenki.Rajagopalan@Sun.COM 	uint64_t		ei_active_vnics;
752*13101SVenki.Rajagopalan@Sun.COM 	uint64_t		ei_zombie_vnics;
753*13101SVenki.Rajagopalan@Sun.COM 	uint64_t		ei_rejoin_vnics;
754*13101SVenki.Rajagopalan@Sun.COM 	struct eib_vnic_s	*ei_vnic[EIB_MAX_VNICS];
755*13101SVenki.Rajagopalan@Sun.COM 	struct eib_vnic_s	*ei_vnic_pending;
756*13101SVenki.Rajagopalan@Sun.COM 	int64_t			ei_gw_last_heartbeat;
757*13101SVenki.Rajagopalan@Sun.COM 	boolean_t		ei_gw_unreachable;
758*13101SVenki.Rajagopalan@Sun.COM 	uint8_t			ei_gw_eport_state;
759*13101SVenki.Rajagopalan@Sun.COM 
760*13101SVenki.Rajagopalan@Sun.COM 	kmutex_t		ei_av_lock;
761*13101SVenki.Rajagopalan@Sun.COM 	struct eib_avect_s	*ei_av[EIB_AV_NBUCKETS];
762*13101SVenki.Rajagopalan@Sun.COM 
763*13101SVenki.Rajagopalan@Sun.COM 	kmutex_t		ei_ev_lock;
764*13101SVenki.Rajagopalan@Sun.COM 	kcondvar_t		ei_ev_cv;
765*13101SVenki.Rajagopalan@Sun.COM 	struct eib_event_s	*ei_event;
766*13101SVenki.Rajagopalan@Sun.COM 
767*13101SVenki.Rajagopalan@Sun.COM 	kmutex_t		ei_rxpost_lock;
768*13101SVenki.Rajagopalan@Sun.COM 	kcondvar_t		ei_rxpost_cv;
769*13101SVenki.Rajagopalan@Sun.COM 	uint_t			ei_rxpost_die;
770*13101SVenki.Rajagopalan@Sun.COM 	struct eib_chan_s	*ei_rxpost;
771*13101SVenki.Rajagopalan@Sun.COM 
772*13101SVenki.Rajagopalan@Sun.COM 	kmutex_t		ei_vnic_req_lock;
773*13101SVenki.Rajagopalan@Sun.COM 	kcondvar_t		ei_vnic_req_cv;
774*13101SVenki.Rajagopalan@Sun.COM 	struct eib_vnic_req_s	*ei_vnic_req;
775*13101SVenki.Rajagopalan@Sun.COM 	struct eib_vnic_req_s	*ei_failed_vnic_req;
776*13101SVenki.Rajagopalan@Sun.COM 	struct eib_vnic_req_s	*ei_pending_vnic_req;
777*13101SVenki.Rajagopalan@Sun.COM 
778*13101SVenki.Rajagopalan@Sun.COM 	kmutex_t		ei_ka_vnics_lock;
779*13101SVenki.Rajagopalan@Sun.COM 	kcondvar_t		ei_ka_vnics_cv;
780*13101SVenki.Rajagopalan@Sun.COM 	uint_t			ei_ka_vnics_event;
781*13101SVenki.Rajagopalan@Sun.COM 	struct eib_ka_vnics_s	*ei_ka_vnics;
782*13101SVenki.Rajagopalan@Sun.COM 
783*13101SVenki.Rajagopalan@Sun.COM 	kt_did_t		ei_txwqe_monitor;
784*13101SVenki.Rajagopalan@Sun.COM 	kt_did_t		ei_lsobufs_monitor;
785*13101SVenki.Rajagopalan@Sun.COM 	kt_did_t		ei_rwqes_refiller;
786*13101SVenki.Rajagopalan@Sun.COM 	kt_did_t		ei_vnic_creator;
787*13101SVenki.Rajagopalan@Sun.COM 	kt_did_t		ei_events_handler;
788*13101SVenki.Rajagopalan@Sun.COM 	kt_did_t		ei_keepalives_manager;
789*13101SVenki.Rajagopalan@Sun.COM } eib_t;
790*13101SVenki.Rajagopalan@Sun.COM 
791*13101SVenki.Rajagopalan@Sun.COM /*
792*13101SVenki.Rajagopalan@Sun.COM  * Private read-only datalink properties
793*13101SVenki.Rajagopalan@Sun.COM  */
794*13101SVenki.Rajagopalan@Sun.COM #define	EIB_DLPROP_GW_EPORT_STATE	"_eib_eport_state"
795*13101SVenki.Rajagopalan@Sun.COM #define	EIB_DLPROP_HCA_GUID		"_eib_hca_guid"
796*13101SVenki.Rajagopalan@Sun.COM #define	EIB_DLPROP_PORT_GUID		"_eib_port_guid"
797*13101SVenki.Rajagopalan@Sun.COM 
798*13101SVenki.Rajagopalan@Sun.COM /*
799*13101SVenki.Rajagopalan@Sun.COM  * FUNCTION PROTOTYPES FOR CROSS-FILE LINKAGE
800*13101SVenki.Rajagopalan@Sun.COM  */
801*13101SVenki.Rajagopalan@Sun.COM 
802*13101SVenki.Rajagopalan@Sun.COM /*
803*13101SVenki.Rajagopalan@Sun.COM  * FIP protocol related
804*13101SVenki.Rajagopalan@Sun.COM  */
805*13101SVenki.Rajagopalan@Sun.COM extern int eib_fip_login(eib_t *, eib_vnic_t *, int *);
806*13101SVenki.Rajagopalan@Sun.COM extern int eib_fip_heartbeat(eib_t *, eib_vnic_t *, int *);
807*13101SVenki.Rajagopalan@Sun.COM extern int eib_fip_vhub_table(eib_t *, eib_vnic_t *, int *);
808*13101SVenki.Rajagopalan@Sun.COM extern int eib_fip_logout(eib_t *, eib_vnic_t *, int *);
809*13101SVenki.Rajagopalan@Sun.COM extern int eib_fip_parse_login_ack(eib_t *, uint8_t *, eib_login_data_t *);
810*13101SVenki.Rajagopalan@Sun.COM extern int eib_fip_parse_ctl_pkt(uint8_t *, eib_vnic_t *);
811*13101SVenki.Rajagopalan@Sun.COM 
812*13101SVenki.Rajagopalan@Sun.COM /*
813*13101SVenki.Rajagopalan@Sun.COM  * Service threads and other handlers
814*13101SVenki.Rajagopalan@Sun.COM  */
815*13101SVenki.Rajagopalan@Sun.COM extern void eib_events_handler(eib_t *);
816*13101SVenki.Rajagopalan@Sun.COM extern void eib_svc_enqueue_event(eib_t *, eib_event_t *);
817*13101SVenki.Rajagopalan@Sun.COM extern void eib_refill_rwqes(eib_t *);
818*13101SVenki.Rajagopalan@Sun.COM extern void eib_vnic_creator(eib_t *);
819*13101SVenki.Rajagopalan@Sun.COM extern void eib_monitor_tx_wqes(eib_t *);
820*13101SVenki.Rajagopalan@Sun.COM extern void eib_monitor_lso_bufs(eib_t *);
821*13101SVenki.Rajagopalan@Sun.COM extern void eib_manage_keepalives(eib_t *);
822*13101SVenki.Rajagopalan@Sun.COM extern void eib_stop_events_handler(eib_t *);
823*13101SVenki.Rajagopalan@Sun.COM extern void eib_stop_refill_rwqes(eib_t *);
824*13101SVenki.Rajagopalan@Sun.COM extern void eib_stop_vnic_creator(eib_t *);
825*13101SVenki.Rajagopalan@Sun.COM extern void eib_stop_monitor_tx_wqes(eib_t *);
826*13101SVenki.Rajagopalan@Sun.COM extern int eib_stop_monitor_lso_bufs(eib_t *, boolean_t);
827*13101SVenki.Rajagopalan@Sun.COM extern void eib_stop_manage_keepalives(eib_t *);
828*13101SVenki.Rajagopalan@Sun.COM extern void eib_flush_vnic_reqs(eib_t *);
829*13101SVenki.Rajagopalan@Sun.COM extern void eib_gw_info_cb(dev_info_t *, ddi_eventcookie_t, void *, void *);
830*13101SVenki.Rajagopalan@Sun.COM extern void eib_gw_alive_cb(dev_info_t *, ddi_eventcookie_t, void *, void *);
831*13101SVenki.Rajagopalan@Sun.COM extern void eib_login_ack_cb(dev_info_t *, ddi_eventcookie_t, void *, void *);
832*13101SVenki.Rajagopalan@Sun.COM 
833*13101SVenki.Rajagopalan@Sun.COM /*
834*13101SVenki.Rajagopalan@Sun.COM  * Admin QP related
835*13101SVenki.Rajagopalan@Sun.COM  */
836*13101SVenki.Rajagopalan@Sun.COM extern int eib_adm_setup_qp(eib_t *, int *);
837*13101SVenki.Rajagopalan@Sun.COM extern uint_t eib_adm_comp_handler(caddr_t, caddr_t);
838*13101SVenki.Rajagopalan@Sun.COM extern void eib_rb_adm_setup_qp(eib_t *);
839*13101SVenki.Rajagopalan@Sun.COM 
840*13101SVenki.Rajagopalan@Sun.COM /*
841*13101SVenki.Rajagopalan@Sun.COM  * Control QP related
842*13101SVenki.Rajagopalan@Sun.COM  */
843*13101SVenki.Rajagopalan@Sun.COM extern int eib_ctl_create_qp(eib_t *, eib_vnic_t *, int *);
844*13101SVenki.Rajagopalan@Sun.COM extern uint_t eib_ctl_comp_handler(caddr_t, caddr_t);
845*13101SVenki.Rajagopalan@Sun.COM extern void eib_rb_ctl_create_qp(eib_t *, eib_vnic_t *);
846*13101SVenki.Rajagopalan@Sun.COM 
847*13101SVenki.Rajagopalan@Sun.COM /*
848*13101SVenki.Rajagopalan@Sun.COM  * Data QP related
849*13101SVenki.Rajagopalan@Sun.COM  */
850*13101SVenki.Rajagopalan@Sun.COM extern int eib_data_create_qp(eib_t *, eib_vnic_t *, int *);
851*13101SVenki.Rajagopalan@Sun.COM extern uint_t eib_data_rx_comp_handler(caddr_t, caddr_t);
852*13101SVenki.Rajagopalan@Sun.COM extern uint_t eib_data_tx_comp_handler(caddr_t, caddr_t);
853*13101SVenki.Rajagopalan@Sun.COM extern void eib_data_rx_recycle(caddr_t);
854*13101SVenki.Rajagopalan@Sun.COM extern void eib_data_post_tx(eib_vnic_t *, eib_wqe_t *);
855*13101SVenki.Rajagopalan@Sun.COM extern void eib_data_parse_ether_hdr(mblk_t *, eib_ether_hdr_t *);
856*13101SVenki.Rajagopalan@Sun.COM extern int eib_data_lookup_vnic(eib_t *, uint8_t *, uint16_t, eib_vnic_t **,
857*13101SVenki.Rajagopalan@Sun.COM     boolean_t *);
858*13101SVenki.Rajagopalan@Sun.COM extern int eib_data_prepare_frame(eib_vnic_t *, eib_wqe_t *, mblk_t *,
859*13101SVenki.Rajagopalan@Sun.COM     eib_ether_hdr_t *);
860*13101SVenki.Rajagopalan@Sun.COM extern void eib_rb_data_create_qp(eib_t *, eib_vnic_t *);
861*13101SVenki.Rajagopalan@Sun.COM 
862*13101SVenki.Rajagopalan@Sun.COM /*
863*13101SVenki.Rajagopalan@Sun.COM  * Resource related
864*13101SVenki.Rajagopalan@Sun.COM  */
865*13101SVenki.Rajagopalan@Sun.COM extern int eib_rsrc_setup_bufs(eib_t *, int *);
866*13101SVenki.Rajagopalan@Sun.COM extern int eib_rsrc_grab_swqes(eib_t *, eib_wqe_t **, uint_t, uint_t *, int);
867*13101SVenki.Rajagopalan@Sun.COM extern int eib_rsrc_grab_rwqes(eib_t *, eib_wqe_t **, uint_t, uint_t *, int);
868*13101SVenki.Rajagopalan@Sun.COM extern int eib_rsrc_grab_lsobufs(eib_t *, uint_t, ibt_wr_ds_t *, uint32_t *);
869*13101SVenki.Rajagopalan@Sun.COM extern eib_wqe_t *eib_rsrc_grab_swqe(eib_t *, int);
870*13101SVenki.Rajagopalan@Sun.COM extern eib_wqe_t *eib_rsrc_grab_rwqe(eib_t *, int);
871*13101SVenki.Rajagopalan@Sun.COM extern void eib_rsrc_return_swqe(eib_t *, eib_wqe_t *, eib_chan_t *);
872*13101SVenki.Rajagopalan@Sun.COM extern void eib_rsrc_return_rwqe(eib_t *, eib_wqe_t *, eib_chan_t *);
873*13101SVenki.Rajagopalan@Sun.COM extern void eib_rsrc_return_lsobufs(eib_t *, ibt_wr_ds_t *, uint32_t);
874*13101SVenki.Rajagopalan@Sun.COM extern void eib_rsrc_decr_posted_swqe(eib_t *, eib_chan_t *);
875*13101SVenki.Rajagopalan@Sun.COM extern void eib_rsrc_decr_posted_rwqe(eib_t *, eib_chan_t *);
876*13101SVenki.Rajagopalan@Sun.COM extern void eib_rsrc_txwqes_needed(eib_t *);
877*13101SVenki.Rajagopalan@Sun.COM extern void eib_rsrc_lsobufs_needed(eib_t *);
878*13101SVenki.Rajagopalan@Sun.COM extern boolean_t eib_rsrc_rxpool_low(eib_wqe_t *);
879*13101SVenki.Rajagopalan@Sun.COM extern void eib_rb_rsrc_setup_bufs(eib_t *, boolean_t);
880*13101SVenki.Rajagopalan@Sun.COM 
881*13101SVenki.Rajagopalan@Sun.COM /*
882*13101SVenki.Rajagopalan@Sun.COM  * IBT related
883*13101SVenki.Rajagopalan@Sun.COM  */
884*13101SVenki.Rajagopalan@Sun.COM extern int eib_ibt_hca_init(eib_t *);
885*13101SVenki.Rajagopalan@Sun.COM extern void eib_ibt_link_mod(eib_t *);
886*13101SVenki.Rajagopalan@Sun.COM extern int eib_ibt_modify_chan_pkey(eib_t *, eib_chan_t *, ib_pkey_t);
887*13101SVenki.Rajagopalan@Sun.COM extern eib_avect_t *eib_ibt_hold_avect(eib_t *, ib_lid_t, uint8_t);
888*13101SVenki.Rajagopalan@Sun.COM extern void eib_ibt_release_avect(eib_t *, eib_avect_t *);
889*13101SVenki.Rajagopalan@Sun.COM extern void eib_ibt_free_avects(eib_t *);
890*13101SVenki.Rajagopalan@Sun.COM extern void eib_ibt_async_handler(void *, ibt_hca_hdl_t, ibt_async_code_t,
891*13101SVenki.Rajagopalan@Sun.COM     ibt_async_event_t *);
892*13101SVenki.Rajagopalan@Sun.COM extern void eib_ibt_record_capab(eib_t *, ibt_hca_attr_t *, eib_caps_t *);
893*13101SVenki.Rajagopalan@Sun.COM extern void eib_rb_ibt_hca_init(eib_t *, uint_t);
894*13101SVenki.Rajagopalan@Sun.COM 
895*13101SVenki.Rajagopalan@Sun.COM /*
896*13101SVenki.Rajagopalan@Sun.COM  * Chan related
897*13101SVenki.Rajagopalan@Sun.COM  */
898*13101SVenki.Rajagopalan@Sun.COM extern eib_chan_t *eib_chan_init(void);
899*13101SVenki.Rajagopalan@Sun.COM extern void eib_chan_fini(eib_chan_t *);
900*13101SVenki.Rajagopalan@Sun.COM extern int eib_chan_post_rx(eib_t *, eib_chan_t *, uint_t *);
901*13101SVenki.Rajagopalan@Sun.COM extern int eib_chan_post_recv(eib_t *, eib_chan_t *, eib_wqe_t *);
902*13101SVenki.Rajagopalan@Sun.COM 
903*13101SVenki.Rajagopalan@Sun.COM /*
904*13101SVenki.Rajagopalan@Sun.COM  * Mac layer related
905*13101SVenki.Rajagopalan@Sun.COM  */
906*13101SVenki.Rajagopalan@Sun.COM extern void eib_mac_set_nic_state(eib_t *, uint_t);
907*13101SVenki.Rajagopalan@Sun.COM extern void eib_mac_clr_nic_state(eib_t *, uint_t);
908*13101SVenki.Rajagopalan@Sun.COM extern void eib_mac_upd_nic_state(eib_t *, uint_t, uint_t);
909*13101SVenki.Rajagopalan@Sun.COM extern uint_t eib_mac_get_nic_state(eib_t *);
910*13101SVenki.Rajagopalan@Sun.COM extern void eib_mac_link_state(eib_t *, link_state_t, boolean_t);
911*13101SVenki.Rajagopalan@Sun.COM extern void eib_mac_link_down(eib_t *, boolean_t);
912*13101SVenki.Rajagopalan@Sun.COM extern void eib_mac_link_up(eib_t *, boolean_t);
913*13101SVenki.Rajagopalan@Sun.COM extern int eib_mac_start(eib_t *);
914*13101SVenki.Rajagopalan@Sun.COM extern void eib_mac_stop(eib_t *);
915*13101SVenki.Rajagopalan@Sun.COM extern int eib_mac_multicast(eib_t *, boolean_t, uint8_t *);
916*13101SVenki.Rajagopalan@Sun.COM extern int eib_mac_promisc(eib_t *, boolean_t);
917*13101SVenki.Rajagopalan@Sun.COM extern int eib_mac_tx(eib_t *, mblk_t *);
918*13101SVenki.Rajagopalan@Sun.COM extern int eib_mac_hca_portstate(eib_t *, ib_lid_t *, int *);
919*13101SVenki.Rajagopalan@Sun.COM 
920*13101SVenki.Rajagopalan@Sun.COM /*
921*13101SVenki.Rajagopalan@Sun.COM  * VNIC related
922*13101SVenki.Rajagopalan@Sun.COM  */
923*13101SVenki.Rajagopalan@Sun.COM extern int eib_vnic_create(eib_t *, uint8_t *, uint16_t, eib_vnic_t **, int *);
924*13101SVenki.Rajagopalan@Sun.COM extern void eib_vnic_delete(eib_t *, eib_vnic_t *);
925*13101SVenki.Rajagopalan@Sun.COM extern int eib_vnic_wait_for_login_ack(eib_t *, eib_vnic_t *, int *);
926*13101SVenki.Rajagopalan@Sun.COM extern void eib_vnic_login_ack(eib_t *, eib_login_data_t *);
927*13101SVenki.Rajagopalan@Sun.COM extern int eib_vnic_wait_for_table(eib_t *, eib_vnic_t *, int *);
928*13101SVenki.Rajagopalan@Sun.COM extern void eib_vnic_vhub_table_done(eib_vnic_t *, uint_t);
929*13101SVenki.Rajagopalan@Sun.COM extern int eib_vnic_join_data_mcg(eib_t *, eib_vnic_t *, uint8_t *,
930*13101SVenki.Rajagopalan@Sun.COM     boolean_t, int *);
931*13101SVenki.Rajagopalan@Sun.COM extern int eib_vnic_setup_dest(eib_vnic_t *, eib_wqe_t *, uint8_t *, uint16_t);
932*13101SVenki.Rajagopalan@Sun.COM extern void eib_vnic_leave_data_mcg(eib_t *, eib_vnic_t *, uint8_t *);
933*13101SVenki.Rajagopalan@Sun.COM extern void eib_vnic_init_tables(eib_t *, eib_vnic_t *);
934*13101SVenki.Rajagopalan@Sun.COM extern void eib_vnic_fini_tables(eib_t *, eib_vnic_t *, boolean_t);
935*13101SVenki.Rajagopalan@Sun.COM extern eib_chan_t *eib_vnic_get_data_chan(eib_t *, int);
936*13101SVenki.Rajagopalan@Sun.COM extern void eib_vnic_need_new(eib_t *, uint8_t *, uint16_t);
937*13101SVenki.Rajagopalan@Sun.COM extern void eib_vnic_enqueue_req(eib_t *, eib_vnic_req_t *);
938*13101SVenki.Rajagopalan@Sun.COM extern void eib_vnic_resurrect_zombies(eib_t *, uint8_t *);
939*13101SVenki.Rajagopalan@Sun.COM extern void eib_vnic_restart(eib_t *, int, uint8_t *);
940*13101SVenki.Rajagopalan@Sun.COM extern void eib_vnic_rejoin_mcgs(eib_t *);
941*13101SVenki.Rajagopalan@Sun.COM extern void eib_rb_vnic_create(eib_t *, eib_vnic_t *, uint_t);
942*13101SVenki.Rajagopalan@Sun.COM 
943*13101SVenki.Rajagopalan@Sun.COM /*
944*13101SVenki.Rajagopalan@Sun.COM  * Logging and other stuff
945*13101SVenki.Rajagopalan@Sun.COM  */
946*13101SVenki.Rajagopalan@Sun.COM extern void eib_debug_init(void);
947*13101SVenki.Rajagopalan@Sun.COM extern void eib_debug_fini(void);
948*13101SVenki.Rajagopalan@Sun.COM extern void eib_dprintf_crit(int, const char *fmt, ...);
949*13101SVenki.Rajagopalan@Sun.COM extern void eib_dprintf_err(int, const char *fmt, ...);
950*13101SVenki.Rajagopalan@Sun.COM extern void eib_dprintf_warn(int, const char *fmt, ...);
951*13101SVenki.Rajagopalan@Sun.COM #ifdef EIB_DEBUG
952*13101SVenki.Rajagopalan@Sun.COM extern void eib_dprintf_debug(int, const char *fmt, ...);
953*13101SVenki.Rajagopalan@Sun.COM extern void eib_dprintf_args(int, const char *fmt, ...);
954*13101SVenki.Rajagopalan@Sun.COM extern void eib_dprintf_pkt(int, uint8_t *, uint_t);
955*13101SVenki.Rajagopalan@Sun.COM extern void eib_dprintf_verbose(int, const char *fmt, ...);
956*13101SVenki.Rajagopalan@Sun.COM #endif
957*13101SVenki.Rajagopalan@Sun.COM extern int eib_get_props(eib_t *);
958*13101SVenki.Rajagopalan@Sun.COM extern void eib_update_props(eib_t *, eib_gw_info_t *);
959*13101SVenki.Rajagopalan@Sun.COM extern void eib_rb_get_props(eib_t *);
960*13101SVenki.Rajagopalan@Sun.COM 
961*13101SVenki.Rajagopalan@Sun.COM /*
962*13101SVenki.Rajagopalan@Sun.COM  * EoIB specific global variables
963*13101SVenki.Rajagopalan@Sun.COM  */
964*13101SVenki.Rajagopalan@Sun.COM extern ib_gid_t eib_reserved_gid;
965*13101SVenki.Rajagopalan@Sun.COM extern uint8_t eib_zero_mac[];
966*13101SVenki.Rajagopalan@Sun.COM extern uint8_t eib_broadcast_mac[];
967*13101SVenki.Rajagopalan@Sun.COM extern int eib_setbit_mod67[];
968*13101SVenki.Rajagopalan@Sun.COM extern char *eib_pvt_props[];
969*13101SVenki.Rajagopalan@Sun.COM 
970*13101SVenki.Rajagopalan@Sun.COM /*
971*13101SVenki.Rajagopalan@Sun.COM  * HW/FW workarounds
972*13101SVenki.Rajagopalan@Sun.COM  */
973*13101SVenki.Rajagopalan@Sun.COM extern int eib_wa_no_desc_list_len;
974*13101SVenki.Rajagopalan@Sun.COM extern int eib_wa_no_cksum_offload;
975*13101SVenki.Rajagopalan@Sun.COM extern int eib_wa_no_lso;
976*13101SVenki.Rajagopalan@Sun.COM extern int eib_wa_no_mcast_entries;
977*13101SVenki.Rajagopalan@Sun.COM extern int eib_wa_no_av_discover;
978*13101SVenki.Rajagopalan@Sun.COM extern int eib_wa_no_good_vp_flag;
979*13101SVenki.Rajagopalan@Sun.COM extern int eib_wa_no_good_vhub_cksum;
980*13101SVenki.Rajagopalan@Sun.COM 
981*13101SVenki.Rajagopalan@Sun.COM /*
982*13101SVenki.Rajagopalan@Sun.COM  * Miscellaneous externs
983*13101SVenki.Rajagopalan@Sun.COM  */
984*13101SVenki.Rajagopalan@Sun.COM extern void freemsgchain(mblk_t *);
985*13101SVenki.Rajagopalan@Sun.COM extern pri_t minclsyspri;
986*13101SVenki.Rajagopalan@Sun.COM 
987*13101SVenki.Rajagopalan@Sun.COM #ifdef __cplusplus
988*13101SVenki.Rajagopalan@Sun.COM }
989*13101SVenki.Rajagopalan@Sun.COM #endif
990*13101SVenki.Rajagopalan@Sun.COM 
991*13101SVenki.Rajagopalan@Sun.COM #endif	/* _SYS_IB_EOIB_EIB_IMPL_H */
992