1*b494511aSVenki Rajagopalan /*
2*b494511aSVenki Rajagopalan  * CDDL HEADER START
3*b494511aSVenki Rajagopalan  *
4*b494511aSVenki Rajagopalan  * The contents of this file are subject to the terms of the
5*b494511aSVenki Rajagopalan  * Common Development and Distribution License (the "License").
6*b494511aSVenki Rajagopalan  * You may not use this file except in compliance with the License.
7*b494511aSVenki Rajagopalan  *
8*b494511aSVenki Rajagopalan  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*b494511aSVenki Rajagopalan  * or http://www.opensolaris.org/os/licensing.
10*b494511aSVenki Rajagopalan  * See the License for the specific language governing permissions
11*b494511aSVenki Rajagopalan  * and limitations under the License.
12*b494511aSVenki Rajagopalan  *
13*b494511aSVenki Rajagopalan  * When distributing Covered Code, include this CDDL HEADER in each
14*b494511aSVenki Rajagopalan  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*b494511aSVenki Rajagopalan  * If applicable, add the following below this CDDL HEADER, with the
16*b494511aSVenki Rajagopalan  * fields enclosed by brackets "[]" replaced with your own identifying
17*b494511aSVenki Rajagopalan  * information: Portions Copyright [yyyy] [name of copyright owner]
18*b494511aSVenki Rajagopalan  *
19*b494511aSVenki Rajagopalan  * CDDL HEADER END
20*b494511aSVenki Rajagopalan  */
21*b494511aSVenki Rajagopalan 
22*b494511aSVenki Rajagopalan /*
23*b494511aSVenki Rajagopalan  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
24*b494511aSVenki Rajagopalan  */
25*b494511aSVenki Rajagopalan 
26*b494511aSVenki Rajagopalan #ifndef _SYS_IB_EOIB_EIB_H
27*b494511aSVenki Rajagopalan #define	_SYS_IB_EOIB_EIB_H
28*b494511aSVenki Rajagopalan 
29*b494511aSVenki Rajagopalan #ifdef __cplusplus
30*b494511aSVenki Rajagopalan extern "C" {
31*b494511aSVenki Rajagopalan #endif
32*b494511aSVenki Rajagopalan 
33*b494511aSVenki Rajagopalan /*
34*b494511aSVenki Rajagopalan  *
35*b494511aSVenki Rajagopalan  * EoIB Encapsulation Header Layout
36*b494511aSVenki Rajagopalan  *
37*b494511aSVenki Rajagopalan  *  31 30 29 28 27 26 25 24     22 21 20 ... 16 15                      0
38*b494511aSVenki Rajagopalan  * +-----+-----+-----+-----+--+---+--+---------+-------------------------+
39*b494511aSVenki Rajagopalan  * | sig | ver | TCP | IP  |  |fcs|ms| segment |       segment id        |
40*b494511aSVenki Rajagopalan  * |     |     | chk | chk |  |   |  | offset  |                         |
41*b494511aSVenki Rajagopalan  * +-----+-----+-----+-----+--+---+--+---------+-------------------------+
42*b494511aSVenki Rajagopalan  *
43*b494511aSVenki Rajagopalan  */
44*b494511aSVenki Rajagopalan #define	EIB_ENCAP_HDR_SZ		4
45*b494511aSVenki Rajagopalan 
46*b494511aSVenki Rajagopalan #define	EIB_ENCAP_SIGN_MASK		0x3
47*b494511aSVenki Rajagopalan #define	EIB_ENCAP_SIGN_SHIFT		30
48*b494511aSVenki Rajagopalan #define	EIB_ENCAP_VER_MASK		0x3
49*b494511aSVenki Rajagopalan #define	EIB_ENCAP_VER_SHIFT		28
50*b494511aSVenki Rajagopalan #define	EIB_ENCAP_TCPCHK_MASK		0x3
51*b494511aSVenki Rajagopalan #define	EIB_ENCAP_TCPCHK_SHIFT		26
52*b494511aSVenki Rajagopalan #define	EIB_ENCAP_IPCHK_MASK		0x3
53*b494511aSVenki Rajagopalan #define	EIB_ENCAP_IPCHK_SHIFT		24
54*b494511aSVenki Rajagopalan #define	EIB_ENCAP_FCS_B_SHIFT		22
55*b494511aSVenki Rajagopalan #define	EIB_ENCAP_MS_B_SHIFT		21
56*b494511aSVenki Rajagopalan #define	EIB_ENCAP_SEGOFF_MASK		0x1F
57*b494511aSVenki Rajagopalan #define	EIB_ENCAP_SEGOFF_SHIFT		16
58*b494511aSVenki Rajagopalan #define	EIB_ENCAP_SEGID_MASK		0xFFFF
59*b494511aSVenki Rajagopalan 
60*b494511aSVenki Rajagopalan /*
61*b494511aSVenki Rajagopalan  * Bit fields values definitions
62*b494511aSVenki Rajagopalan  */
63*b494511aSVenki Rajagopalan #define	EIB_EH_SIGNATURE		3
64*b494511aSVenki Rajagopalan #define	EIB_EH_VERSION			0
65*b494511aSVenki Rajagopalan #define	EIB_EH_CSUM_UNKNOWN		0
66*b494511aSVenki Rajagopalan #define	EIB_EH_TCPCSUM_OK		1
67*b494511aSVenki Rajagopalan #define	EIB_EH_UDPCSUM_OK		2
68*b494511aSVenki Rajagopalan #define	EIB_EH_CSUM_BAD			3
69*b494511aSVenki Rajagopalan #define	EIB_EH_IPCSUM_OK		1
70*b494511aSVenki Rajagopalan 
71*b494511aSVenki Rajagopalan /*
72*b494511aSVenki Rajagopalan  * Some shortcuts
73*b494511aSVenki Rajagopalan  */
74*b494511aSVenki Rajagopalan #define	EIB_TX_ENCAP_HDR		0xC0000000
75*b494511aSVenki Rajagopalan #define	EIB_RX_ENCAP_TCPIP_OK		0xC5000000
76*b494511aSVenki Rajagopalan #define	EIB_RX_ENCAP_UDPIP_OK		0xC9000000
77*b494511aSVenki Rajagopalan 
78*b494511aSVenki Rajagopalan /*
79*b494511aSVenki Rajagopalan  * Driver name
80*b494511aSVenki Rajagopalan  */
81*b494511aSVenki Rajagopalan #define	EIB_DRV_NAME			"eoib"
82*b494511aSVenki Rajagopalan 
83*b494511aSVenki Rajagopalan /*
84*b494511aSVenki Rajagopalan  * Currently, the gateway responds to login requests on the qpn that carried
85*b494511aSVenki Rajagopalan  * the solication request, rather than on the qpn that carried the login
86*b494511aSVenki Rajagopalan  * request.  This means that EoIB nexus receives the acknowledgements from
87*b494511aSVenki Rajagopalan  * gateways to login requests made by the individual EoIB instances, and must
88*b494511aSVenki Rajagopalan  * pass this login ack information back to the appropriate EoIB instance.
89*b494511aSVenki Rajagopalan  *
90*b494511aSVenki Rajagopalan  * Now, the only field in the login ack packet that could identify the
91*b494511aSVenki Rajagopalan  * individual EoIB instance is the vNIC id field, but this is a 16-bit field,
92*b494511aSVenki Rajagopalan  * with the MSB reserved to indicate whether the mac/vlan is host-managed
93*b494511aSVenki Rajagopalan  * or gateway-managed.  This leaves us with just 15-bits to encode the EoIB
94*b494511aSVenki Rajagopalan  * device instance and its Solaris vnic instance.  For now, we divide this
95*b494511aSVenki Rajagopalan  * field as a 6-bit vnic instance number (max Solaris vnics is 64) and a
96*b494511aSVenki Rajagopalan  * 9-bit device instance number (max EoIB pseudo-NICs in a system is 512).
97*b494511aSVenki Rajagopalan  *
98*b494511aSVenki Rajagopalan  * The long-term solution is to get the gateway to respond directly to the
99*b494511aSVenki Rajagopalan  * login requestor, so the requestor can use all 15-bits to identify its
100*b494511aSVenki Rajagopalan  * Solaris vnic instance (max 32K) and leave the device instance limit to
101*b494511aSVenki Rajagopalan  * the system limit.
102*b494511aSVenki Rajagopalan  */
103*b494511aSVenki Rajagopalan #define	EIB_DVI_SHIFT			6
104*b494511aSVenki Rajagopalan #define	EIB_DVI_MASK			0x1FF
105*b494511aSVenki Rajagopalan #define	EIB_VNI_MASK			0x03F
106*b494511aSVenki Rajagopalan 
107*b494511aSVenki Rajagopalan #define	EIB_VNIC_INSTANCE(id)		((id) & EIB_VNI_MASK)
108*b494511aSVenki Rajagopalan #define	EIB_DEVI_INSTANCE(id)		(((id) >> EIB_DVI_SHIFT) & EIB_DVI_MASK)
109*b494511aSVenki Rajagopalan #define	EIB_VNIC_ID(dvi, vni)		\
110*b494511aSVenki Rajagopalan 	((((dvi) & EIB_DVI_MASK) << EIB_DVI_SHIFT) | ((vni) & EIB_VNI_MASK))
111*b494511aSVenki Rajagopalan 
112*b494511aSVenki Rajagopalan /*
113*b494511aSVenki Rajagopalan  * Making VHUB_ID from vlan and portid
114*b494511aSVenki Rajagopalan  */
115*b494511aSVenki Rajagopalan #define	EIB_VHUB_ID(portid, vlan)	\
116*b494511aSVenki Rajagopalan 	((((uint_t)(portid) & 0xfff) << 12) | ((uint_t)(vlan) & 0xfff))
117*b494511aSVenki Rajagopalan 
118*b494511aSVenki Rajagopalan /*
119*b494511aSVenki Rajagopalan  * NDI Events that individual EoIB instance will be interested in
120*b494511aSVenki Rajagopalan  */
121*b494511aSVenki Rajagopalan #define	EIB_NDI_EVENT_GW_AVAILABLE	"SUNW,eoib:gateway-available"
122*b494511aSVenki Rajagopalan #define	EIB_NDI_EVENT_LOGIN_ACK		"SUNW,eoib:vnic-login-ack"
123*b494511aSVenki Rajagopalan #define	EIB_NDI_EVENT_GW_INFO_UPDATE	"SUNW,eoib:gateway-info-update"
124*b494511aSVenki Rajagopalan 
125*b494511aSVenki Rajagopalan /*
126*b494511aSVenki Rajagopalan  * Properties for each eoib node created
127*b494511aSVenki Rajagopalan  */
128*b494511aSVenki Rajagopalan #define	EIB_PROP_HCA_GUID		"hca-guid"
129*b494511aSVenki Rajagopalan #define	EIB_PROP_HCA_PORTNUM		"hca-port#"
130*b494511aSVenki Rajagopalan #define	EIB_PROP_GW_SYS_GUID		"gw-system-guid"
131*b494511aSVenki Rajagopalan #define	EIB_PROP_GW_GUID		"gw-guid"
132*b494511aSVenki Rajagopalan #define	EIB_PROP_GW_SN_PREFIX		"gw-sn-prefix"
133*b494511aSVenki Rajagopalan #define	EIB_PROP_GW_ADV_PERIOD		"gw-adv-period"
134*b494511aSVenki Rajagopalan #define	EIB_PROP_GW_KA_PERIOD		"gw-ka-period"
135*b494511aSVenki Rajagopalan #define	EIB_PROP_VNIC_KA_PERIOD		"vnic-ka-period"
136*b494511aSVenki Rajagopalan #define	EIB_PROP_GW_CTRL_QPN		"gw-ctrl-qpn"
137*b494511aSVenki Rajagopalan #define	EIB_PROP_GW_LID			"gw-lid"
138*b494511aSVenki Rajagopalan #define	EIB_PROP_GW_PORTID		"gw-portid"
139*b494511aSVenki Rajagopalan #define	EIB_PROP_GW_NUM_NET_VNICS	"gw-num-net-vnics"
140*b494511aSVenki Rajagopalan #define	EIB_PROP_GW_AVAILABLE		"gw-available?"
141*b494511aSVenki Rajagopalan #define	EIB_PROP_GW_HOST_VNICS		"gw-host-vnics?"
142*b494511aSVenki Rajagopalan #define	EIB_PROP_GW_SL			"gw-sl"
143*b494511aSVenki Rajagopalan #define	EIB_PROP_GW_N_RSS_QPN		"gw-n-rss-qpn"
144*b494511aSVenki Rajagopalan #define	EIB_PROP_GW_SYS_NAME		"gw-system-name"
145*b494511aSVenki Rajagopalan #define	EIB_PROP_GW_PORT_NAME		"gw-port-name"
146*b494511aSVenki Rajagopalan #define	EIB_PROP_GW_VENDOR_ID		"gw-vendor-id"
147*b494511aSVenki Rajagopalan 
148*b494511aSVenki Rajagopalan /*
149*b494511aSVenki Rajagopalan  * Gateway information passed by eibnx to eoib.  The lengths of character
150*b494511aSVenki Rajagopalan  * strings should be longer than what is defined for these objects in fip.h,
151*b494511aSVenki Rajagopalan  * to accomodate the terminating null.
152*b494511aSVenki Rajagopalan  */
153*b494511aSVenki Rajagopalan #define	EIB_GW_SYSNAME_LEN		40
154*b494511aSVenki Rajagopalan #define	EIB_GW_PORTNAME_LEN		12
155*b494511aSVenki Rajagopalan #define	EIB_GW_VENDOR_LEN		12
156*b494511aSVenki Rajagopalan 
157*b494511aSVenki Rajagopalan typedef struct eib_gw_info_s {
158*b494511aSVenki Rajagopalan 	ib_guid_t	gi_system_guid;
159*b494511aSVenki Rajagopalan 	ib_guid_t	gi_guid;
160*b494511aSVenki Rajagopalan 	ib_sn_prefix_t	gi_sn_prefix;
161*b494511aSVenki Rajagopalan 	uint32_t	gi_adv_period;
162*b494511aSVenki Rajagopalan 	uint32_t	gi_ka_period;
163*b494511aSVenki Rajagopalan 	uint32_t	gi_vnic_ka_period;
164*b494511aSVenki Rajagopalan 	ib_qpn_t	gi_ctrl_qpn;
165*b494511aSVenki Rajagopalan 	ib_lid_t	gi_lid;
166*b494511aSVenki Rajagopalan 	uint16_t	gi_portid;
167*b494511aSVenki Rajagopalan 	uint16_t	gi_num_net_vnics;
168*b494511aSVenki Rajagopalan 	uint8_t		gi_flag_available;
169*b494511aSVenki Rajagopalan 	uint8_t		gi_is_host_adm_vnics;
170*b494511aSVenki Rajagopalan 	uint8_t		gi_sl;
171*b494511aSVenki Rajagopalan 	uint8_t		gi_n_rss_qpn;
172*b494511aSVenki Rajagopalan 	uint8_t		gi_system_name[EIB_GW_SYSNAME_LEN];
173*b494511aSVenki Rajagopalan 	uint8_t		gi_port_name[EIB_GW_PORTNAME_LEN];
174*b494511aSVenki Rajagopalan 	uint8_t		gi_vendor_id[EIB_GW_VENDOR_LEN];
175*b494511aSVenki Rajagopalan } eib_gw_info_t;
176*b494511aSVenki Rajagopalan 
177*b494511aSVenki Rajagopalan /*
178*b494511aSVenki Rajagopalan  * Softint priority levels to use for data and control/admin cq handling
179*b494511aSVenki Rajagopalan  * in EoIB leaf and nexus drivers
180*b494511aSVenki Rajagopalan  */
181*b494511aSVenki Rajagopalan #define	EIB_SOFTPRI_DATA		(DDI_INTR_SOFTPRI_MIN)
182*b494511aSVenki Rajagopalan #define	EIB_SOFTPRI_CTL			(DDI_INTR_SOFTPRI_MIN + 1)
183*b494511aSVenki Rajagopalan #define	EIB_SOFTPRI_ADM			(DDI_INTR_SOFTPRI_MIN + 1)
184*b494511aSVenki Rajagopalan 
185*b494511aSVenki Rajagopalan #ifdef __cplusplus
186*b494511aSVenki Rajagopalan }
187*b494511aSVenki Rajagopalan #endif
188*b494511aSVenki Rajagopalan 
189*b494511aSVenki Rajagopalan #endif	/* _SYS_IB_EOIB_EIB_H */
190