xref: /onnv-gate/usr/src/uts/common/io/ib/clients/eoib/eib_cmn.c (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 #include <sys/types.h>
27*13101SVenki.Rajagopalan@Sun.COM #include <sys/kmem.h>
28*13101SVenki.Rajagopalan@Sun.COM #include <sys/conf.h>
29*13101SVenki.Rajagopalan@Sun.COM #include <sys/ddi.h>
30*13101SVenki.Rajagopalan@Sun.COM #include <sys/sunddi.h>
31*13101SVenki.Rajagopalan@Sun.COM #include <sys/ksynch.h>
32*13101SVenki.Rajagopalan@Sun.COM 
33*13101SVenki.Rajagopalan@Sun.COM #include <sys/ib/clients/eoib/eib_impl.h>
34*13101SVenki.Rajagopalan@Sun.COM 
35*13101SVenki.Rajagopalan@Sun.COM /*
36*13101SVenki.Rajagopalan@Sun.COM  * Definitions private to this file
37*13101SVenki.Rajagopalan@Sun.COM  */
38*13101SVenki.Rajagopalan@Sun.COM ib_gid_t eib_reserved_gid;
39*13101SVenki.Rajagopalan@Sun.COM 
40*13101SVenki.Rajagopalan@Sun.COM uint8_t eib_zero_mac[] = {
41*13101SVenki.Rajagopalan@Sun.COM 	0x0, 0x0, 0x0, 0x0, 0x0, 0x0
42*13101SVenki.Rajagopalan@Sun.COM };
43*13101SVenki.Rajagopalan@Sun.COM 
44*13101SVenki.Rajagopalan@Sun.COM uint8_t eib_broadcast_mac[] = {
45*13101SVenki.Rajagopalan@Sun.COM 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff
46*13101SVenki.Rajagopalan@Sun.COM };
47*13101SVenki.Rajagopalan@Sun.COM 
48*13101SVenki.Rajagopalan@Sun.COM int eib_setbit_mod67[] = {
49*13101SVenki.Rajagopalan@Sun.COM 	-1,  0,  1, 39,  2, 15, 40, 23,
50*13101SVenki.Rajagopalan@Sun.COM 	3,  12, 16, 59, 41, 19, 24, 54,
51*13101SVenki.Rajagopalan@Sun.COM 	4,  -1, 13, 10, 17, 62, 60, 28,
52*13101SVenki.Rajagopalan@Sun.COM 	42, 30, 20, 51, 25, 44, 55, 47,
53*13101SVenki.Rajagopalan@Sun.COM 	5,  32, -1, 38, 14, 22, 11, 58,
54*13101SVenki.Rajagopalan@Sun.COM 	18, 53, 63,  9, 61, 27, 29, 50,
55*13101SVenki.Rajagopalan@Sun.COM 	43, 46, 31, 37, 21, 57, 52,  8,
56*13101SVenki.Rajagopalan@Sun.COM 	26, 49, 45, 36, 56,  7, 48, 35,
57*13101SVenki.Rajagopalan@Sun.COM 	6,  34, 33
58*13101SVenki.Rajagopalan@Sun.COM };
59*13101SVenki.Rajagopalan@Sun.COM 
60*13101SVenki.Rajagopalan@Sun.COM char *eib_pvt_props[] = {
61*13101SVenki.Rajagopalan@Sun.COM 	EIB_DLPROP_GW_EPORT_STATE,
62*13101SVenki.Rajagopalan@Sun.COM 	EIB_DLPROP_HCA_GUID,
63*13101SVenki.Rajagopalan@Sun.COM 	EIB_DLPROP_PORT_GUID,
64*13101SVenki.Rajagopalan@Sun.COM 	NULL
65*13101SVenki.Rajagopalan@Sun.COM };
66*13101SVenki.Rajagopalan@Sun.COM 
67*13101SVenki.Rajagopalan@Sun.COM #define	eib_prop_get_and_test(inst, dp, propname, propval)		\
68*13101SVenki.Rajagopalan@Sun.COM {                                                                       \
69*13101SVenki.Rajagopalan@Sun.COM 	(propval) = ddi_prop_get_int(DDI_DEV_T_ANY, (dp),               \
70*13101SVenki.Rajagopalan@Sun.COM 	    DDI_PROP_DONTPASS | DDI_PROP_NOTPROM, (propname), -1);      \
71*13101SVenki.Rajagopalan@Sun.COM 	if ((propval) == -1) {                                          \
72*13101SVenki.Rajagopalan@Sun.COM 		EIB_DPRINTF_WARN((inst), "eib_get_props: "		\
73*13101SVenki.Rajagopalan@Sun.COM 		    "ddi_prop_get_int() could not find "		\
74*13101SVenki.Rajagopalan@Sun.COM 		    "property '%s'", (propname));			\
75*13101SVenki.Rajagopalan@Sun.COM 		goto get_props_fail;                                    \
76*13101SVenki.Rajagopalan@Sun.COM 	}                                                               \
77*13101SVenki.Rajagopalan@Sun.COM }
78*13101SVenki.Rajagopalan@Sun.COM 
79*13101SVenki.Rajagopalan@Sun.COM #define	eib_prop64_get_and_test(inst, dp, propname, propval)		\
80*13101SVenki.Rajagopalan@Sun.COM {                                                                       \
81*13101SVenki.Rajagopalan@Sun.COM 	(propval) = ddi_prop_get_int64(DDI_DEV_T_ANY, (dp),             \
82*13101SVenki.Rajagopalan@Sun.COM 	    DDI_PROP_DONTPASS | DDI_PROP_NOTPROM, (propname), -1);      \
83*13101SVenki.Rajagopalan@Sun.COM 	if ((propval) == -1) {                                          \
84*13101SVenki.Rajagopalan@Sun.COM 		EIB_DPRINTF_WARN((inst), "eib_get_props: "		\
85*13101SVenki.Rajagopalan@Sun.COM 		    "ddi_prop_get_int64() could not find "		\
86*13101SVenki.Rajagopalan@Sun.COM 		    "property '%s'", (propname));			\
87*13101SVenki.Rajagopalan@Sun.COM 		goto get_props_fail;                                    \
88*13101SVenki.Rajagopalan@Sun.COM 	}                                                               \
89*13101SVenki.Rajagopalan@Sun.COM }
90*13101SVenki.Rajagopalan@Sun.COM 
91*13101SVenki.Rajagopalan@Sun.COM #define	eib_propstr_get_and_test(inst, dp, propname, propval_p)		\
92*13101SVenki.Rajagopalan@Sun.COM {                                                                       \
93*13101SVenki.Rajagopalan@Sun.COM 	int rv;                                                         \
94*13101SVenki.Rajagopalan@Sun.COM 									\
95*13101SVenki.Rajagopalan@Sun.COM 	*(propval_p) = NULL;                                            \
96*13101SVenki.Rajagopalan@Sun.COM 									\
97*13101SVenki.Rajagopalan@Sun.COM 	rv = ddi_prop_lookup_string(DDI_DEV_T_ANY, (dp),                \
98*13101SVenki.Rajagopalan@Sun.COM 	    DDI_PROP_DONTPASS | DDI_PROP_NOTPROM, (propname),           \
99*13101SVenki.Rajagopalan@Sun.COM 	    (propval_p));                                               \
100*13101SVenki.Rajagopalan@Sun.COM 	if (rv != DDI_PROP_SUCCESS) {                                   \
101*13101SVenki.Rajagopalan@Sun.COM 		EIB_DPRINTF_WARN((inst), "eib_get_props: "		\
102*13101SVenki.Rajagopalan@Sun.COM 		    "ddi_prop_lookup_string() could not find "		\
103*13101SVenki.Rajagopalan@Sun.COM 		    "property '%s'", (propname));			\
104*13101SVenki.Rajagopalan@Sun.COM 		goto get_props_fail;                                    \
105*13101SVenki.Rajagopalan@Sun.COM 	}                                                               \
106*13101SVenki.Rajagopalan@Sun.COM }
107*13101SVenki.Rajagopalan@Sun.COM 
108*13101SVenki.Rajagopalan@Sun.COM /*
109*13101SVenki.Rajagopalan@Sun.COM  * HW/FW workarounds
110*13101SVenki.Rajagopalan@Sun.COM  */
111*13101SVenki.Rajagopalan@Sun.COM 
112*13101SVenki.Rajagopalan@Sun.COM /*
113*13101SVenki.Rajagopalan@Sun.COM  * 1. Verification of descriptor list length in the received packets is
114*13101SVenki.Rajagopalan@Sun.COM  *    disabled, since experimentation shows that BX does not set the desc
115*13101SVenki.Rajagopalan@Sun.COM  *    list length correctly. True for EoIB nexus as well.
116*13101SVenki.Rajagopalan@Sun.COM  */
117*13101SVenki.Rajagopalan@Sun.COM int eib_wa_no_desc_list_len = 1;
118*13101SVenki.Rajagopalan@Sun.COM 
119*13101SVenki.Rajagopalan@Sun.COM /*
120*13101SVenki.Rajagopalan@Sun.COM  * 2. LSO/Checksum_Offload for EoIB packets does not seem to be supported
121*13101SVenki.Rajagopalan@Sun.COM  *    currently, so we'll disable both temporarily.
122*13101SVenki.Rajagopalan@Sun.COM  */
123*13101SVenki.Rajagopalan@Sun.COM int eib_wa_no_cksum_offload = 1;
124*13101SVenki.Rajagopalan@Sun.COM int eib_wa_no_lso = 1;
125*13101SVenki.Rajagopalan@Sun.COM 
126*13101SVenki.Rajagopalan@Sun.COM /*
127*13101SVenki.Rajagopalan@Sun.COM  * 3. The "multicast entry" types are not clearly defined in the spec
128*13101SVenki.Rajagopalan@Sun.COM  *    at the moment.  The current BX software/firmware appears to ignore
129*13101SVenki.Rajagopalan@Sun.COM  *    the type of the context table entries, so we will treat these
130*13101SVenki.Rajagopalan@Sun.COM  *    addresses just like regular vnic addresses.
131*13101SVenki.Rajagopalan@Sun.COM  */
132*13101SVenki.Rajagopalan@Sun.COM int eib_wa_no_mcast_entries = 1;
133*13101SVenki.Rajagopalan@Sun.COM 
134*13101SVenki.Rajagopalan@Sun.COM /*
135*13101SVenki.Rajagopalan@Sun.COM  * 4. VHUB updates from the gateways provide us with destination LIDs,
136*13101SVenki.Rajagopalan@Sun.COM  *    and we will hand-create these address vectors.
137*13101SVenki.Rajagopalan@Sun.COM  */
138*13101SVenki.Rajagopalan@Sun.COM int eib_wa_no_av_discover = 1;
139*13101SVenki.Rajagopalan@Sun.COM 
140*13101SVenki.Rajagopalan@Sun.COM /*
141*13101SVenki.Rajagopalan@Sun.COM  * 5. The older BX software does not seem to set the VP flag correctly
142*13101SVenki.Rajagopalan@Sun.COM  *    in the login acknowledgements even when it successfully allocates
143*13101SVenki.Rajagopalan@Sun.COM  *    a vlan, so we will ignore it for now.
144*13101SVenki.Rajagopalan@Sun.COM  */
145*13101SVenki.Rajagopalan@Sun.COM int eib_wa_no_good_vp_flag = 1;
146*13101SVenki.Rajagopalan@Sun.COM 
147*13101SVenki.Rajagopalan@Sun.COM /*
148*13101SVenki.Rajagopalan@Sun.COM  * 6. Each vhub table is expected to carry a checksum at the end to
149*13101SVenki.Rajagopalan@Sun.COM  *    verify the contents of the received vhub table. The current BX
150*13101SVenki.Rajagopalan@Sun.COM  *    software/firmware does not seem to fill this field with the
151*13101SVenki.Rajagopalan@Sun.COM  *    correct value (and/or the spec description is ambiguous). We
152*13101SVenki.Rajagopalan@Sun.COM  *    will ignore the vhub table checksum verification for now.
153*13101SVenki.Rajagopalan@Sun.COM  */
154*13101SVenki.Rajagopalan@Sun.COM int eib_wa_no_good_vhub_cksum = 1;
155*13101SVenki.Rajagopalan@Sun.COM 
156*13101SVenki.Rajagopalan@Sun.COM int
eib_get_props(eib_t * ss)157*13101SVenki.Rajagopalan@Sun.COM eib_get_props(eib_t *ss)
158*13101SVenki.Rajagopalan@Sun.COM {
159*13101SVenki.Rajagopalan@Sun.COM 	int val;
160*13101SVenki.Rajagopalan@Sun.COM 	int64_t val64;
161*13101SVenki.Rajagopalan@Sun.COM 	char *str;
162*13101SVenki.Rajagopalan@Sun.COM 	clock_t gw_ka_usecs;
163*13101SVenki.Rajagopalan@Sun.COM 	clock_t vnic_ka_usecs;
164*13101SVenki.Rajagopalan@Sun.COM 
165*13101SVenki.Rajagopalan@Sun.COM 	ss->ei_gw_props = kmem_zalloc(sizeof (eib_gw_props_t), KM_SLEEP);
166*13101SVenki.Rajagopalan@Sun.COM 	ss->ei_props = kmem_zalloc(sizeof (eib_props_t), KM_SLEEP);
167*13101SVenki.Rajagopalan@Sun.COM 
168*13101SVenki.Rajagopalan@Sun.COM 	mutex_init(&ss->ei_gw_props->pp_gw_lock, NULL, MUTEX_DRIVER, NULL);
169*13101SVenki.Rajagopalan@Sun.COM 
170*13101SVenki.Rajagopalan@Sun.COM 	/*
171*13101SVenki.Rajagopalan@Sun.COM 	 * The interface speed is currently set to 10Gb/s, since we don't
172*13101SVenki.Rajagopalan@Sun.COM 	 * have a way yet to figure this virtual-wire specific data from
173*13101SVenki.Rajagopalan@Sun.COM 	 * the gateway.  The rest of the properties are handed over to us
174*13101SVenki.Rajagopalan@Sun.COM 	 * by the EoIB nexus.
175*13101SVenki.Rajagopalan@Sun.COM 	 */
176*13101SVenki.Rajagopalan@Sun.COM 	ss->ei_props->ep_ifspeed = 10000000000;
177*13101SVenki.Rajagopalan@Sun.COM 
178*13101SVenki.Rajagopalan@Sun.COM 	eib_prop64_get_and_test(ss->ei_instance, ss->ei_dip,
179*13101SVenki.Rajagopalan@Sun.COM 	    EIB_PROP_HCA_GUID, val64);
180*13101SVenki.Rajagopalan@Sun.COM 	ss->ei_props->ep_hca_guid = (ib_guid_t)val64;
181*13101SVenki.Rajagopalan@Sun.COM 
182*13101SVenki.Rajagopalan@Sun.COM 	eib_prop64_get_and_test(ss->ei_instance, ss->ei_dip,
183*13101SVenki.Rajagopalan@Sun.COM 	    EIB_PROP_GW_SYS_GUID, val64);
184*13101SVenki.Rajagopalan@Sun.COM 	ss->ei_gw_props->pp_gw_system_guid = (ib_guid_t)val64;
185*13101SVenki.Rajagopalan@Sun.COM 
186*13101SVenki.Rajagopalan@Sun.COM 	eib_prop64_get_and_test(ss->ei_instance, ss->ei_dip,
187*13101SVenki.Rajagopalan@Sun.COM 	    EIB_PROP_GW_GUID, val64);
188*13101SVenki.Rajagopalan@Sun.COM 	ss->ei_gw_props->pp_gw_guid = (ib_guid_t)val64;
189*13101SVenki.Rajagopalan@Sun.COM 
190*13101SVenki.Rajagopalan@Sun.COM 	eib_prop64_get_and_test(ss->ei_instance, ss->ei_dip,
191*13101SVenki.Rajagopalan@Sun.COM 	    EIB_PROP_GW_SN_PREFIX, val64);
192*13101SVenki.Rajagopalan@Sun.COM 	ss->ei_gw_props->pp_gw_sn_prefix = (ib_sn_prefix_t)val64;
193*13101SVenki.Rajagopalan@Sun.COM 
194*13101SVenki.Rajagopalan@Sun.COM 	eib_prop_get_and_test(ss->ei_instance, ss->ei_dip,
195*13101SVenki.Rajagopalan@Sun.COM 	    EIB_PROP_GW_ADV_PERIOD, val);
196*13101SVenki.Rajagopalan@Sun.COM 	ss->ei_gw_props->pp_gw_adv_period = (uint_t)val;
197*13101SVenki.Rajagopalan@Sun.COM 
198*13101SVenki.Rajagopalan@Sun.COM 	eib_prop_get_and_test(ss->ei_instance, ss->ei_dip,
199*13101SVenki.Rajagopalan@Sun.COM 	    EIB_PROP_GW_KA_PERIOD, val);
200*13101SVenki.Rajagopalan@Sun.COM 	ss->ei_gw_props->pp_gw_ka_period = (uint_t)val;
201*13101SVenki.Rajagopalan@Sun.COM 
202*13101SVenki.Rajagopalan@Sun.COM 	gw_ka_usecs = ss->ei_gw_props->pp_gw_ka_period * 1000;
203*13101SVenki.Rajagopalan@Sun.COM 	gw_ka_usecs = ((gw_ka_usecs << 2) + gw_ka_usecs) >> 1;
204*13101SVenki.Rajagopalan@Sun.COM 	ss->ei_gw_props->pp_gw_ka_ticks = drv_usectohz(gw_ka_usecs);
205*13101SVenki.Rajagopalan@Sun.COM 
206*13101SVenki.Rajagopalan@Sun.COM 	eib_prop_get_and_test(ss->ei_instance, ss->ei_dip,
207*13101SVenki.Rajagopalan@Sun.COM 	    EIB_PROP_VNIC_KA_PERIOD, val);
208*13101SVenki.Rajagopalan@Sun.COM 	ss->ei_gw_props->pp_vnic_ka_period = (uint_t)val;
209*13101SVenki.Rajagopalan@Sun.COM 
210*13101SVenki.Rajagopalan@Sun.COM 	vnic_ka_usecs = ss->ei_gw_props->pp_vnic_ka_period * 1000;
211*13101SVenki.Rajagopalan@Sun.COM 	ss->ei_gw_props->pp_vnic_ka_ticks = drv_usectohz(vnic_ka_usecs);
212*13101SVenki.Rajagopalan@Sun.COM 
213*13101SVenki.Rajagopalan@Sun.COM 	eib_prop_get_and_test(ss->ei_instance, ss->ei_dip,
214*13101SVenki.Rajagopalan@Sun.COM 	    EIB_PROP_GW_CTRL_QPN, val);
215*13101SVenki.Rajagopalan@Sun.COM 	ss->ei_gw_props->pp_gw_ctrl_qpn = (ib_qpn_t)val;
216*13101SVenki.Rajagopalan@Sun.COM 
217*13101SVenki.Rajagopalan@Sun.COM 	eib_prop_get_and_test(ss->ei_instance, ss->ei_dip,
218*13101SVenki.Rajagopalan@Sun.COM 	    EIB_PROP_GW_LID, val);
219*13101SVenki.Rajagopalan@Sun.COM 	ss->ei_gw_props->pp_gw_lid = (ib_lid_t)val;
220*13101SVenki.Rajagopalan@Sun.COM 
221*13101SVenki.Rajagopalan@Sun.COM 	eib_prop_get_and_test(ss->ei_instance, ss->ei_dip,
222*13101SVenki.Rajagopalan@Sun.COM 	    EIB_PROP_GW_PORTID, val);
223*13101SVenki.Rajagopalan@Sun.COM 	ss->ei_gw_props->pp_gw_portid = (uint16_t)val;
224*13101SVenki.Rajagopalan@Sun.COM 
225*13101SVenki.Rajagopalan@Sun.COM 	eib_prop_get_and_test(ss->ei_instance, ss->ei_dip,
226*13101SVenki.Rajagopalan@Sun.COM 	    EIB_PROP_GW_NUM_NET_VNICS, val);
227*13101SVenki.Rajagopalan@Sun.COM 	ss->ei_gw_props->pp_gw_num_net_vnics = (uint16_t)val;
228*13101SVenki.Rajagopalan@Sun.COM 
229*13101SVenki.Rajagopalan@Sun.COM 	eib_prop_get_and_test(ss->ei_instance, ss->ei_dip,
230*13101SVenki.Rajagopalan@Sun.COM 	    EIB_PROP_GW_AVAILABLE, val);
231*13101SVenki.Rajagopalan@Sun.COM 	ss->ei_gw_props->pp_gw_flag_available = (uint8_t)val;
232*13101SVenki.Rajagopalan@Sun.COM 
233*13101SVenki.Rajagopalan@Sun.COM 	eib_prop_get_and_test(ss->ei_instance, ss->ei_dip,
234*13101SVenki.Rajagopalan@Sun.COM 	    EIB_PROP_GW_HOST_VNICS, val);
235*13101SVenki.Rajagopalan@Sun.COM 	ss->ei_gw_props->pp_gw_is_host_adm_vnics = (uint8_t)val;
236*13101SVenki.Rajagopalan@Sun.COM 
237*13101SVenki.Rajagopalan@Sun.COM 	eib_prop_get_and_test(ss->ei_instance, ss->ei_dip,
238*13101SVenki.Rajagopalan@Sun.COM 	    EIB_PROP_GW_SL, val);
239*13101SVenki.Rajagopalan@Sun.COM 	ss->ei_gw_props->pp_gw_sl = (uint8_t)val;
240*13101SVenki.Rajagopalan@Sun.COM 
241*13101SVenki.Rajagopalan@Sun.COM 	eib_prop_get_and_test(ss->ei_instance, ss->ei_dip,
242*13101SVenki.Rajagopalan@Sun.COM 	    EIB_PROP_GW_N_RSS_QPN, val);
243*13101SVenki.Rajagopalan@Sun.COM 	ss->ei_gw_props->pp_gw_n_rss_qpn = (uint8_t)val;
244*13101SVenki.Rajagopalan@Sun.COM 
245*13101SVenki.Rajagopalan@Sun.COM 	eib_prop_get_and_test(ss->ei_instance, ss->ei_dip,
246*13101SVenki.Rajagopalan@Sun.COM 	    EIB_PROP_HCA_PORTNUM, val);
247*13101SVenki.Rajagopalan@Sun.COM 	ss->ei_props->ep_port_num = (uint8_t)val;
248*13101SVenki.Rajagopalan@Sun.COM 
249*13101SVenki.Rajagopalan@Sun.COM 	eib_propstr_get_and_test(ss->ei_instance, ss->ei_dip,
250*13101SVenki.Rajagopalan@Sun.COM 	    EIB_PROP_GW_SYS_NAME, &str);
251*13101SVenki.Rajagopalan@Sun.COM 	ss->ei_gw_props->pp_gw_system_name = (uint8_t *)str;
252*13101SVenki.Rajagopalan@Sun.COM 
253*13101SVenki.Rajagopalan@Sun.COM 	eib_propstr_get_and_test(ss->ei_instance, ss->ei_dip,
254*13101SVenki.Rajagopalan@Sun.COM 	    EIB_PROP_GW_PORT_NAME, &str);
255*13101SVenki.Rajagopalan@Sun.COM 	ss->ei_gw_props->pp_gw_port_name = (uint8_t *)str;
256*13101SVenki.Rajagopalan@Sun.COM 
257*13101SVenki.Rajagopalan@Sun.COM 	eib_propstr_get_and_test(ss->ei_instance, ss->ei_dip,
258*13101SVenki.Rajagopalan@Sun.COM 	    EIB_PROP_GW_VENDOR_ID, &str);
259*13101SVenki.Rajagopalan@Sun.COM 	ss->ei_gw_props->pp_gw_vendor_id = (uint8_t *)str;
260*13101SVenki.Rajagopalan@Sun.COM 
261*13101SVenki.Rajagopalan@Sun.COM 	return (EIB_E_SUCCESS);
262*13101SVenki.Rajagopalan@Sun.COM 
263*13101SVenki.Rajagopalan@Sun.COM get_props_fail:
264*13101SVenki.Rajagopalan@Sun.COM 	eib_rb_get_props(ss);
265*13101SVenki.Rajagopalan@Sun.COM 	return (EIB_E_FAILURE);
266*13101SVenki.Rajagopalan@Sun.COM }
267*13101SVenki.Rajagopalan@Sun.COM 
268*13101SVenki.Rajagopalan@Sun.COM void
eib_update_props(eib_t * ss,eib_gw_info_t * new_gw_info)269*13101SVenki.Rajagopalan@Sun.COM eib_update_props(eib_t *ss, eib_gw_info_t *new_gw_info)
270*13101SVenki.Rajagopalan@Sun.COM {
271*13101SVenki.Rajagopalan@Sun.COM 	eib_gw_props_t *gwp = ss->ei_gw_props;
272*13101SVenki.Rajagopalan@Sun.COM 	dev_info_t *dip = ss->ei_dip;
273*13101SVenki.Rajagopalan@Sun.COM 	char *str;
274*13101SVenki.Rajagopalan@Sun.COM 
275*13101SVenki.Rajagopalan@Sun.COM 	ASSERT(gwp != NULL && dip != NULL);
276*13101SVenki.Rajagopalan@Sun.COM 
277*13101SVenki.Rajagopalan@Sun.COM 	mutex_enter(&gwp->pp_gw_lock);
278*13101SVenki.Rajagopalan@Sun.COM 
279*13101SVenki.Rajagopalan@Sun.COM 	gwp->pp_gw_system_guid = new_gw_info->gi_system_guid;
280*13101SVenki.Rajagopalan@Sun.COM 	(void) ddi_prop_update_int64(DDI_DEV_T_NONE, dip, EIB_PROP_GW_SYS_GUID,
281*13101SVenki.Rajagopalan@Sun.COM 	    gwp->pp_gw_system_guid);
282*13101SVenki.Rajagopalan@Sun.COM 
283*13101SVenki.Rajagopalan@Sun.COM 	gwp->pp_gw_guid = new_gw_info->gi_guid;
284*13101SVenki.Rajagopalan@Sun.COM 	(void) ddi_prop_update_int64(DDI_DEV_T_NONE, dip, EIB_PROP_GW_GUID,
285*13101SVenki.Rajagopalan@Sun.COM 	    gwp->pp_gw_guid);
286*13101SVenki.Rajagopalan@Sun.COM 
287*13101SVenki.Rajagopalan@Sun.COM 	gwp->pp_gw_sn_prefix = new_gw_info->gi_sn_prefix;
288*13101SVenki.Rajagopalan@Sun.COM 	(void) ddi_prop_update_int64(DDI_DEV_T_NONE, dip, EIB_PROP_GW_SN_PREFIX,
289*13101SVenki.Rajagopalan@Sun.COM 	    gwp->pp_gw_sn_prefix);
290*13101SVenki.Rajagopalan@Sun.COM 
291*13101SVenki.Rajagopalan@Sun.COM 	gwp->pp_gw_adv_period = new_gw_info->gi_adv_period;
292*13101SVenki.Rajagopalan@Sun.COM 	(void) ddi_prop_update_int(DDI_DEV_T_NONE, dip, EIB_PROP_GW_ADV_PERIOD,
293*13101SVenki.Rajagopalan@Sun.COM 	    gwp->pp_gw_adv_period);
294*13101SVenki.Rajagopalan@Sun.COM 
295*13101SVenki.Rajagopalan@Sun.COM 	gwp->pp_gw_ka_period = new_gw_info->gi_ka_period;
296*13101SVenki.Rajagopalan@Sun.COM 	(void) ddi_prop_update_int(DDI_DEV_T_NONE, dip, EIB_PROP_GW_KA_PERIOD,
297*13101SVenki.Rajagopalan@Sun.COM 	    gwp->pp_gw_ka_period);
298*13101SVenki.Rajagopalan@Sun.COM 
299*13101SVenki.Rajagopalan@Sun.COM 	gwp->pp_vnic_ka_period = new_gw_info->gi_vnic_ka_period;
300*13101SVenki.Rajagopalan@Sun.COM 	(void) ddi_prop_update_int(DDI_DEV_T_NONE, dip, EIB_PROP_VNIC_KA_PERIOD,
301*13101SVenki.Rajagopalan@Sun.COM 	    gwp->pp_vnic_ka_period);
302*13101SVenki.Rajagopalan@Sun.COM 
303*13101SVenki.Rajagopalan@Sun.COM 	gwp->pp_gw_ctrl_qpn = new_gw_info->gi_ctrl_qpn;
304*13101SVenki.Rajagopalan@Sun.COM 	(void) ddi_prop_update_int(DDI_DEV_T_NONE, dip, EIB_PROP_GW_CTRL_QPN,
305*13101SVenki.Rajagopalan@Sun.COM 	    gwp->pp_gw_ctrl_qpn);
306*13101SVenki.Rajagopalan@Sun.COM 
307*13101SVenki.Rajagopalan@Sun.COM 	gwp->pp_gw_lid = new_gw_info->gi_lid;
308*13101SVenki.Rajagopalan@Sun.COM 	(void) ddi_prop_update_int(DDI_DEV_T_NONE, dip, EIB_PROP_GW_LID,
309*13101SVenki.Rajagopalan@Sun.COM 	    gwp->pp_gw_lid);
310*13101SVenki.Rajagopalan@Sun.COM 
311*13101SVenki.Rajagopalan@Sun.COM 	gwp->pp_gw_portid = new_gw_info->gi_portid;
312*13101SVenki.Rajagopalan@Sun.COM 	(void) ddi_prop_update_int(DDI_DEV_T_NONE, dip, EIB_PROP_GW_PORTID,
313*13101SVenki.Rajagopalan@Sun.COM 	    gwp->pp_gw_portid);
314*13101SVenki.Rajagopalan@Sun.COM 
315*13101SVenki.Rajagopalan@Sun.COM 	gwp->pp_gw_num_net_vnics = new_gw_info->gi_num_net_vnics;
316*13101SVenki.Rajagopalan@Sun.COM 	(void) ddi_prop_update_int(DDI_DEV_T_NONE, dip,
317*13101SVenki.Rajagopalan@Sun.COM 	    EIB_PROP_GW_NUM_NET_VNICS, gwp->pp_gw_num_net_vnics);
318*13101SVenki.Rajagopalan@Sun.COM 
319*13101SVenki.Rajagopalan@Sun.COM 	gwp->pp_gw_flag_available = new_gw_info->gi_flag_available;
320*13101SVenki.Rajagopalan@Sun.COM 	(void) ddi_prop_update_int(DDI_DEV_T_NONE, dip, EIB_PROP_GW_AVAILABLE,
321*13101SVenki.Rajagopalan@Sun.COM 	    gwp->pp_gw_flag_available);
322*13101SVenki.Rajagopalan@Sun.COM 
323*13101SVenki.Rajagopalan@Sun.COM 	gwp->pp_gw_is_host_adm_vnics = new_gw_info->gi_is_host_adm_vnics;
324*13101SVenki.Rajagopalan@Sun.COM 	(void) ddi_prop_update_int(DDI_DEV_T_NONE, dip, EIB_PROP_GW_HOST_VNICS,
325*13101SVenki.Rajagopalan@Sun.COM 	    gwp->pp_gw_is_host_adm_vnics);
326*13101SVenki.Rajagopalan@Sun.COM 
327*13101SVenki.Rajagopalan@Sun.COM 	gwp->pp_gw_sl = new_gw_info->gi_sl;
328*13101SVenki.Rajagopalan@Sun.COM 	(void) ddi_prop_update_int(DDI_DEV_T_NONE, dip, EIB_PROP_GW_SL,
329*13101SVenki.Rajagopalan@Sun.COM 	    gwp->pp_gw_sl);
330*13101SVenki.Rajagopalan@Sun.COM 
331*13101SVenki.Rajagopalan@Sun.COM 	gwp->pp_gw_n_rss_qpn = new_gw_info->gi_n_rss_qpn;
332*13101SVenki.Rajagopalan@Sun.COM 	(void) ddi_prop_update_int(DDI_DEV_T_NONE, dip, EIB_PROP_GW_N_RSS_QPN,
333*13101SVenki.Rajagopalan@Sun.COM 	    gwp->pp_gw_n_rss_qpn);
334*13101SVenki.Rajagopalan@Sun.COM 
335*13101SVenki.Rajagopalan@Sun.COM 	(void) ddi_prop_update_string(DDI_DEV_T_NONE, dip,
336*13101SVenki.Rajagopalan@Sun.COM 	    EIB_PROP_GW_SYS_NAME, (char *)(new_gw_info->gi_system_name));
337*13101SVenki.Rajagopalan@Sun.COM 	(void) ddi_prop_lookup_string(DDI_DEV_T_ANY, dip,
338*13101SVenki.Rajagopalan@Sun.COM 	    DDI_PROP_DONTPASS | DDI_PROP_NOTPROM, EIB_PROP_GW_SYS_NAME, &str);
339*13101SVenki.Rajagopalan@Sun.COM 	if (gwp->pp_gw_system_name) {
340*13101SVenki.Rajagopalan@Sun.COM 		ddi_prop_free(gwp->pp_gw_system_name);
341*13101SVenki.Rajagopalan@Sun.COM 	}
342*13101SVenki.Rajagopalan@Sun.COM 	gwp->pp_gw_system_name = (uint8_t *)str;
343*13101SVenki.Rajagopalan@Sun.COM 
344*13101SVenki.Rajagopalan@Sun.COM 	(void) ddi_prop_update_string(DDI_DEV_T_NONE, dip,
345*13101SVenki.Rajagopalan@Sun.COM 	    EIB_PROP_GW_PORT_NAME, (char *)(new_gw_info->gi_port_name));
346*13101SVenki.Rajagopalan@Sun.COM 	(void) ddi_prop_lookup_string(DDI_DEV_T_ANY, dip,
347*13101SVenki.Rajagopalan@Sun.COM 	    DDI_PROP_DONTPASS | DDI_PROP_NOTPROM, EIB_PROP_GW_PORT_NAME, &str);
348*13101SVenki.Rajagopalan@Sun.COM 	if (gwp->pp_gw_port_name) {
349*13101SVenki.Rajagopalan@Sun.COM 		ddi_prop_free(gwp->pp_gw_port_name);
350*13101SVenki.Rajagopalan@Sun.COM 	}
351*13101SVenki.Rajagopalan@Sun.COM 	gwp->pp_gw_port_name = (uint8_t *)str;
352*13101SVenki.Rajagopalan@Sun.COM 
353*13101SVenki.Rajagopalan@Sun.COM 	(void) ddi_prop_update_string(DDI_DEV_T_NONE, dip,
354*13101SVenki.Rajagopalan@Sun.COM 	    EIB_PROP_GW_VENDOR_ID, (char *)(new_gw_info->gi_vendor_id));
355*13101SVenki.Rajagopalan@Sun.COM 	(void) ddi_prop_lookup_string(DDI_DEV_T_ANY, dip,
356*13101SVenki.Rajagopalan@Sun.COM 	    DDI_PROP_DONTPASS | DDI_PROP_NOTPROM, EIB_PROP_GW_VENDOR_ID, &str);
357*13101SVenki.Rajagopalan@Sun.COM 	if (gwp->pp_gw_vendor_id) {
358*13101SVenki.Rajagopalan@Sun.COM 		ddi_prop_free(gwp->pp_gw_vendor_id);
359*13101SVenki.Rajagopalan@Sun.COM 	}
360*13101SVenki.Rajagopalan@Sun.COM 	gwp->pp_gw_vendor_id = (uint8_t *)str;
361*13101SVenki.Rajagopalan@Sun.COM 
362*13101SVenki.Rajagopalan@Sun.COM 	mutex_exit(&gwp->pp_gw_lock);
363*13101SVenki.Rajagopalan@Sun.COM }
364*13101SVenki.Rajagopalan@Sun.COM 
365*13101SVenki.Rajagopalan@Sun.COM void
eib_rb_get_props(eib_t * ss)366*13101SVenki.Rajagopalan@Sun.COM eib_rb_get_props(eib_t *ss)
367*13101SVenki.Rajagopalan@Sun.COM {
368*13101SVenki.Rajagopalan@Sun.COM 	/*
369*13101SVenki.Rajagopalan@Sun.COM 	 * Free any allocations
370*13101SVenki.Rajagopalan@Sun.COM 	 */
371*13101SVenki.Rajagopalan@Sun.COM 	if (ss->ei_gw_props->pp_gw_vendor_id) {
372*13101SVenki.Rajagopalan@Sun.COM 		ddi_prop_free(ss->ei_gw_props->pp_gw_vendor_id);
373*13101SVenki.Rajagopalan@Sun.COM 		ss->ei_gw_props->pp_gw_vendor_id = NULL;
374*13101SVenki.Rajagopalan@Sun.COM 	}
375*13101SVenki.Rajagopalan@Sun.COM 	if (ss->ei_gw_props->pp_gw_port_name) {
376*13101SVenki.Rajagopalan@Sun.COM 		ddi_prop_free(ss->ei_gw_props->pp_gw_port_name);
377*13101SVenki.Rajagopalan@Sun.COM 		ss->ei_gw_props->pp_gw_port_name = NULL;
378*13101SVenki.Rajagopalan@Sun.COM 	}
379*13101SVenki.Rajagopalan@Sun.COM 	if (ss->ei_gw_props->pp_gw_system_name) {
380*13101SVenki.Rajagopalan@Sun.COM 		ddi_prop_free(ss->ei_gw_props->pp_gw_system_name);
381*13101SVenki.Rajagopalan@Sun.COM 		ss->ei_gw_props->pp_gw_system_name = NULL;
382*13101SVenki.Rajagopalan@Sun.COM 	}
383*13101SVenki.Rajagopalan@Sun.COM 
384*13101SVenki.Rajagopalan@Sun.COM 	mutex_destroy(&ss->ei_gw_props->pp_gw_lock);
385*13101SVenki.Rajagopalan@Sun.COM 
386*13101SVenki.Rajagopalan@Sun.COM 	/*
387*13101SVenki.Rajagopalan@Sun.COM 	 * Free space allocated for holding the props
388*13101SVenki.Rajagopalan@Sun.COM 	 */
389*13101SVenki.Rajagopalan@Sun.COM 	kmem_free(ss->ei_props, sizeof (eib_props_t));
390*13101SVenki.Rajagopalan@Sun.COM 	kmem_free(ss->ei_gw_props, sizeof (eib_gw_props_t));
391*13101SVenki.Rajagopalan@Sun.COM 
392*13101SVenki.Rajagopalan@Sun.COM 	ss->ei_props = NULL;
393*13101SVenki.Rajagopalan@Sun.COM 	ss->ei_gw_props = NULL;
394*13101SVenki.Rajagopalan@Sun.COM }
395