xref: /onnv-gate/usr/src/lib/udapl/udapl_tavor/common/dapl_init.c (revision 9517:b4839b0aa7a4)
1*9517SBill.Taylor@Sun.COM /*
2*9517SBill.Taylor@Sun.COM  * CDDL HEADER START
3*9517SBill.Taylor@Sun.COM  *
4*9517SBill.Taylor@Sun.COM  * The contents of this file are subject to the terms of the
5*9517SBill.Taylor@Sun.COM  * Common Development and Distribution License (the "License").
6*9517SBill.Taylor@Sun.COM  * You may not use this file except in compliance with the License.
7*9517SBill.Taylor@Sun.COM  *
8*9517SBill.Taylor@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*9517SBill.Taylor@Sun.COM  * or http://www.opensolaris.org/os/licensing.
10*9517SBill.Taylor@Sun.COM  * See the License for the specific language governing permissions
11*9517SBill.Taylor@Sun.COM  * and limitations under the License.
12*9517SBill.Taylor@Sun.COM  *
13*9517SBill.Taylor@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
14*9517SBill.Taylor@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*9517SBill.Taylor@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
16*9517SBill.Taylor@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
17*9517SBill.Taylor@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
18*9517SBill.Taylor@Sun.COM  *
19*9517SBill.Taylor@Sun.COM  * CDDL HEADER END
20*9517SBill.Taylor@Sun.COM  */
21*9517SBill.Taylor@Sun.COM 
22*9517SBill.Taylor@Sun.COM /*
23*9517SBill.Taylor@Sun.COM  * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.
24*9517SBill.Taylor@Sun.COM  */
25*9517SBill.Taylor@Sun.COM 
26*9517SBill.Taylor@Sun.COM /*
27*9517SBill.Taylor@Sun.COM  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
28*9517SBill.Taylor@Sun.COM  * Use is subject to license terms.
29*9517SBill.Taylor@Sun.COM  */
30*9517SBill.Taylor@Sun.COM 
31*9517SBill.Taylor@Sun.COM /*
32*9517SBill.Taylor@Sun.COM  *
33*9517SBill.Taylor@Sun.COM  * MODULE: dapl_init.c
34*9517SBill.Taylor@Sun.COM  *
35*9517SBill.Taylor@Sun.COM  * PURPOSE: Interface Adapter management
36*9517SBill.Taylor@Sun.COM  * Description: Interfaces in this file are completely described in
37*9517SBill.Taylor@Sun.COM  *		the DAPL 1.1 API, Chapter 6, section 2
38*9517SBill.Taylor@Sun.COM  *
39*9517SBill.Taylor@Sun.COM  * $Id: dapl_init.c,v 1.42 2003/06/30 15:38:20 sjs2 Exp $
40*9517SBill.Taylor@Sun.COM  */
41*9517SBill.Taylor@Sun.COM 
42*9517SBill.Taylor@Sun.COM #include "dapl.h"
43*9517SBill.Taylor@Sun.COM #include "dapl_hca_util.h"
44*9517SBill.Taylor@Sun.COM #include "dapl_init.h"
45*9517SBill.Taylor@Sun.COM #include "dapl_provider.h"
46*9517SBill.Taylor@Sun.COM #include "dapl_mr_util.h"
47*9517SBill.Taylor@Sun.COM #include "dapl_osd.h"			/* needed for g_daplDebugLevel */
48*9517SBill.Taylor@Sun.COM #include "dapl_adapter_util.h"
49*9517SBill.Taylor@Sun.COM #include "dapl_name_service.h"
50*9517SBill.Taylor@Sun.COM #include "dapl_vendor.h"
51*9517SBill.Taylor@Sun.COM 
52*9517SBill.Taylor@Sun.COM static void dapl_init(void);
53*9517SBill.Taylor@Sun.COM static void dapl_fini(void);
54*9517SBill.Taylor@Sun.COM 
55*9517SBill.Taylor@Sun.COM #pragma init(dapl_init)
56*9517SBill.Taylor@Sun.COM #pragma fini(dapl_fini)
57*9517SBill.Taylor@Sun.COM 
58*9517SBill.Taylor@Sun.COM /*
59*9517SBill.Taylor@Sun.COM  * dapl_init
60*9517SBill.Taylor@Sun.COM  *
61*9517SBill.Taylor@Sun.COM  * initialize this provider
62*9517SBill.Taylor@Sun.COM  * includes initialization of all global variables
63*9517SBill.Taylor@Sun.COM  * as well as registering all supported IAs with the dat registry
64*9517SBill.Taylor@Sun.COM  *
65*9517SBill.Taylor@Sun.COM  * This function needs to be called once when the provider is loaded.
66*9517SBill.Taylor@Sun.COM  *
67*9517SBill.Taylor@Sun.COM  * Input:
68*9517SBill.Taylor@Sun.COM  *	none
69*9517SBill.Taylor@Sun.COM  *
70*9517SBill.Taylor@Sun.COM  * Output:
71*9517SBill.Taylor@Sun.COM  *	none
72*9517SBill.Taylor@Sun.COM  *
73*9517SBill.Taylor@Sun.COM  * Return Values:
74*9517SBill.Taylor@Sun.COM  */
75*9517SBill.Taylor@Sun.COM static void
dapl_init(void)76*9517SBill.Taylor@Sun.COM dapl_init(void)
77*9517SBill.Taylor@Sun.COM {
78*9517SBill.Taylor@Sun.COM 	DAT_RETURN		dat_status;
79*9517SBill.Taylor@Sun.COM 
80*9517SBill.Taylor@Sun.COM 	dapl_dbg_log(DAPL_DBG_TYPE_UTIL, "DAPL: Started (dapl_init)\n");
81*9517SBill.Taylor@Sun.COM 
82*9517SBill.Taylor@Sun.COM #if defined(DAPL_DBG)
83*9517SBill.Taylor@Sun.COM 	/* set up debug type */
84*9517SBill.Taylor@Sun.COM 	g_dapl_dbg_type = dapl_os_get_env_val("DAPL_DBG_TYPE",
85*9517SBill.Taylor@Sun.COM 	    DAPL_DBG_TYPE_ERR | DAPL_DBG_TYPE_WARN);
86*9517SBill.Taylor@Sun.COM 	/* set up debug level */
87*9517SBill.Taylor@Sun.COM 	g_dapl_dbg_dest = dapl_os_get_env_val("DAPL_DBG_DEST",
88*9517SBill.Taylor@Sun.COM 	    DAPL_DBG_DEST_STDOUT);
89*9517SBill.Taylor@Sun.COM #endif /* DAPL_DBG */
90*9517SBill.Taylor@Sun.COM 
91*9517SBill.Taylor@Sun.COM 	/* See if the user is on a loopback setup */
92*9517SBill.Taylor@Sun.COM 	g_dapl_loopback_connection = dapl_os_get_env_bool("DAPL_LOOPBACK");
93*9517SBill.Taylor@Sun.COM 	dapl_dbg_log(DAPL_DBG_TYPE_UTIL, "DAPL: %s Setting Loopback\n",
94*9517SBill.Taylor@Sun.COM 	    g_dapl_loopback_connection ? "" : "NOT");
95*9517SBill.Taylor@Sun.COM 
96*9517SBill.Taylor@Sun.COM 	dapls_ib_state_init();
97*9517SBill.Taylor@Sun.COM 
98*9517SBill.Taylor@Sun.COM 	/* initialize the provider list */
99*9517SBill.Taylor@Sun.COM 	dat_status = dapl_provider_list_create();
100*9517SBill.Taylor@Sun.COM 	if (DAT_SUCCESS != dat_status) {
101*9517SBill.Taylor@Sun.COM 		dapl_dbg_log(DAPL_DBG_TYPE_ERR,
102*9517SBill.Taylor@Sun.COM 		    "dapl_provider_list_create failed %d\n", dat_status);
103*9517SBill.Taylor@Sun.COM 		goto bail;
104*9517SBill.Taylor@Sun.COM 	}
105*9517SBill.Taylor@Sun.COM 
106*9517SBill.Taylor@Sun.COM 	/* Set up name services */
107*9517SBill.Taylor@Sun.COM 	dat_status = dapls_ns_init();
108*9517SBill.Taylor@Sun.COM 
109*9517SBill.Taylor@Sun.COM 	if (DAT_SUCCESS != dat_status) {
110*9517SBill.Taylor@Sun.COM 		dapl_dbg_log(DAPL_DBG_TYPE_ERR, "dapls_ns_init failed %d\n",
111*9517SBill.Taylor@Sun.COM 		    dat_status);
112*9517SBill.Taylor@Sun.COM 		goto bail;
113*9517SBill.Taylor@Sun.COM 	}
114*9517SBill.Taylor@Sun.COM 
115*9517SBill.Taylor@Sun.COM 	return;
116*9517SBill.Taylor@Sun.COM 
117*9517SBill.Taylor@Sun.COM bail:
118*9517SBill.Taylor@Sun.COM 	dapl_dbg_log(DAPL_DBG_TYPE_ERR, "ERROR: dapl_init failed\n");
119*9517SBill.Taylor@Sun.COM 	dapl_fini();
120*9517SBill.Taylor@Sun.COM }
121*9517SBill.Taylor@Sun.COM 
122*9517SBill.Taylor@Sun.COM /*
123*9517SBill.Taylor@Sun.COM  * dapl_fini
124*9517SBill.Taylor@Sun.COM  *
125*9517SBill.Taylor@Sun.COM  * finalize this provider
126*9517SBill.Taylor@Sun.COM  * includes freeing of all global variables
127*9517SBill.Taylor@Sun.COM  * as well as deregistering all supported IAs from the dat registry
128*9517SBill.Taylor@Sun.COM  *
129*9517SBill.Taylor@Sun.COM  * This function needs to be called once when the provider is loaded.
130*9517SBill.Taylor@Sun.COM  *
131*9517SBill.Taylor@Sun.COM  * Input:
132*9517SBill.Taylor@Sun.COM  *	none
133*9517SBill.Taylor@Sun.COM  *
134*9517SBill.Taylor@Sun.COM  * Output:
135*9517SBill.Taylor@Sun.COM  *	none
136*9517SBill.Taylor@Sun.COM  *
137*9517SBill.Taylor@Sun.COM  * Return Values:
138*9517SBill.Taylor@Sun.COM  */
139*9517SBill.Taylor@Sun.COM static void
dapl_fini(void)140*9517SBill.Taylor@Sun.COM dapl_fini(void)
141*9517SBill.Taylor@Sun.COM {
142*9517SBill.Taylor@Sun.COM 	DAT_RETURN		dat_status;
143*9517SBill.Taylor@Sun.COM 
144*9517SBill.Taylor@Sun.COM 	dapl_dbg_log(DAPL_DBG_TYPE_UTIL, "DAPL: Stopped (dapl_fini)\n");
145*9517SBill.Taylor@Sun.COM 
146*9517SBill.Taylor@Sun.COM 	/*
147*9517SBill.Taylor@Sun.COM 	 * Free up hca related resources
148*9517SBill.Taylor@Sun.COM 	 */
149*9517SBill.Taylor@Sun.COM 	dapls_ib_state_fini();
150*9517SBill.Taylor@Sun.COM 
151*9517SBill.Taylor@Sun.COM 	dat_status = dapl_provider_list_destroy();
152*9517SBill.Taylor@Sun.COM 	if (DAT_SUCCESS != dat_status) {
153*9517SBill.Taylor@Sun.COM 		dapl_dbg_log(DAPL_DBG_TYPE_ERR,
154*9517SBill.Taylor@Sun.COM 		    "dapl_provider_list_destroy failed %d\n", dat_status);
155*9517SBill.Taylor@Sun.COM 	}
156*9517SBill.Taylor@Sun.COM }
157*9517SBill.Taylor@Sun.COM 
158*9517SBill.Taylor@Sun.COM /*
159*9517SBill.Taylor@Sun.COM  *
160*9517SBill.Taylor@Sun.COM  * This function is called by the registry to initialize a provider
161*9517SBill.Taylor@Sun.COM  *
162*9517SBill.Taylor@Sun.COM  * The instance data string is expected to have the following form:
163*9517SBill.Taylor@Sun.COM  *
164*9517SBill.Taylor@Sun.COM  * <hca name> <port number>
165*9517SBill.Taylor@Sun.COM  *
166*9517SBill.Taylor@Sun.COM  */
167*9517SBill.Taylor@Sun.COM /* ARGSUSED */
168*9517SBill.Taylor@Sun.COM void
dat_provider_init(IN const DAT_PROVIDER_INFO * provider_info,IN const char * instance_data)169*9517SBill.Taylor@Sun.COM dat_provider_init(
170*9517SBill.Taylor@Sun.COM     IN const DAT_PROVIDER_INFO 	*provider_info,
171*9517SBill.Taylor@Sun.COM     IN const char 		*instance_data)
172*9517SBill.Taylor@Sun.COM {
173*9517SBill.Taylor@Sun.COM 	DAT_PROVIDER		*provider;
174*9517SBill.Taylor@Sun.COM 	DAPL_HCA		*hca_ptr;
175*9517SBill.Taylor@Sun.COM 	DAT_RETURN		dat_status;
176*9517SBill.Taylor@Sun.COM 
177*9517SBill.Taylor@Sun.COM 	provider = NULL;
178*9517SBill.Taylor@Sun.COM 	hca_ptr = NULL;
179*9517SBill.Taylor@Sun.COM 
180*9517SBill.Taylor@Sun.COM 	dat_status = dapl_provider_list_insert(provider_info->ia_name,
181*9517SBill.Taylor@Sun.COM 	    &provider);
182*9517SBill.Taylor@Sun.COM 	if (DAT_SUCCESS != dat_status) {
183*9517SBill.Taylor@Sun.COM 		dapl_dbg_log(DAPL_DBG_TYPE_ERR,
184*9517SBill.Taylor@Sun.COM 		    "dat_provider_list_insert failed: %x\n", dat_status);
185*9517SBill.Taylor@Sun.COM 		goto bail;
186*9517SBill.Taylor@Sun.COM 	}
187*9517SBill.Taylor@Sun.COM 
188*9517SBill.Taylor@Sun.COM 	hca_ptr = dapl_hca_alloc((char *)provider_info->ia_name, 0);
189*9517SBill.Taylor@Sun.COM 	if (NULL == hca_ptr) {
190*9517SBill.Taylor@Sun.COM 		dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,
191*9517SBill.Taylor@Sun.COM 		    DAT_RESOURCE_MEMORY);
192*9517SBill.Taylor@Sun.COM 		goto bail;
193*9517SBill.Taylor@Sun.COM 	}
194*9517SBill.Taylor@Sun.COM 
195*9517SBill.Taylor@Sun.COM 	provider->extension = hca_ptr;
196*9517SBill.Taylor@Sun.COM 
197*9517SBill.Taylor@Sun.COM 	/* register providers with dat_registry */
198*9517SBill.Taylor@Sun.COM 	dat_status = dat_registry_add_provider(provider, provider_info);
199*9517SBill.Taylor@Sun.COM 	if (DAT_SUCCESS != dat_status) {
200*9517SBill.Taylor@Sun.COM 		dapl_dbg_log(DAPL_DBG_TYPE_ERR,
201*9517SBill.Taylor@Sun.COM 		    "dat_registry_add_provider failed: %x\n", dat_status);
202*9517SBill.Taylor@Sun.COM 		goto bail;
203*9517SBill.Taylor@Sun.COM 	}
204*9517SBill.Taylor@Sun.COM 
205*9517SBill.Taylor@Sun.COM bail:
206*9517SBill.Taylor@Sun.COM 	if (DAT_SUCCESS != dat_status) {
207*9517SBill.Taylor@Sun.COM 		if (NULL != provider) {
208*9517SBill.Taylor@Sun.COM 			(void) dapl_provider_list_remove(
209*9517SBill.Taylor@Sun.COM 			    provider_info->ia_name);
210*9517SBill.Taylor@Sun.COM 		}
211*9517SBill.Taylor@Sun.COM 
212*9517SBill.Taylor@Sun.COM 		if (NULL != hca_ptr) {
213*9517SBill.Taylor@Sun.COM 			dapl_hca_free(hca_ptr);
214*9517SBill.Taylor@Sun.COM 		}
215*9517SBill.Taylor@Sun.COM 	}
216*9517SBill.Taylor@Sun.COM }
217*9517SBill.Taylor@Sun.COM 
218*9517SBill.Taylor@Sun.COM 
219*9517SBill.Taylor@Sun.COM /*
220*9517SBill.Taylor@Sun.COM  *
221*9517SBill.Taylor@Sun.COM  * This function is called by the registry to de-initialize a provider
222*9517SBill.Taylor@Sun.COM  *
223*9517SBill.Taylor@Sun.COM  */
224*9517SBill.Taylor@Sun.COM void
dat_provider_fini(IN const DAT_PROVIDER_INFO * provider_info)225*9517SBill.Taylor@Sun.COM dat_provider_fini(
226*9517SBill.Taylor@Sun.COM     IN const DAT_PROVIDER_INFO 	*provider_info)
227*9517SBill.Taylor@Sun.COM {
228*9517SBill.Taylor@Sun.COM 	DAT_PROVIDER	*provider;
229*9517SBill.Taylor@Sun.COM 	DAT_RETURN	dat_status;
230*9517SBill.Taylor@Sun.COM 
231*9517SBill.Taylor@Sun.COM 	dat_status = dapl_provider_list_search(provider_info->ia_name,
232*9517SBill.Taylor@Sun.COM 	    &provider);
233*9517SBill.Taylor@Sun.COM 	if (DAT_SUCCESS != dat_status) {
234*9517SBill.Taylor@Sun.COM 		dapl_dbg_log(DAPL_DBG_TYPE_ERR,
235*9517SBill.Taylor@Sun.COM 		    "dat_registry_add_provider failed: %x\n", dat_status);
236*9517SBill.Taylor@Sun.COM 		return;
237*9517SBill.Taylor@Sun.COM 	}
238*9517SBill.Taylor@Sun.COM 
239*9517SBill.Taylor@Sun.COM 	dat_status = dat_registry_remove_provider(provider, provider_info);
240*9517SBill.Taylor@Sun.COM 	if (DAT_SUCCESS != dat_status) {
241*9517SBill.Taylor@Sun.COM 		dapl_dbg_log(DAPL_DBG_TYPE_ERR,
242*9517SBill.Taylor@Sun.COM 		    "dat_registry_add_provider failed: %x\n", dat_status);
243*9517SBill.Taylor@Sun.COM 	}
244*9517SBill.Taylor@Sun.COM 
245*9517SBill.Taylor@Sun.COM 	(void) dapl_provider_list_remove(provider_info->ia_name);
246*9517SBill.Taylor@Sun.COM }
247*9517SBill.Taylor@Sun.COM 
248*9517SBill.Taylor@Sun.COM 
249*9517SBill.Taylor@Sun.COM 
250*9517SBill.Taylor@Sun.COM /*
251*9517SBill.Taylor@Sun.COM  * Local variables:
252*9517SBill.Taylor@Sun.COM  *  c-indent-level: 4
253*9517SBill.Taylor@Sun.COM  *  c-basic-offset: 4
254*9517SBill.Taylor@Sun.COM  *  tab-width: 8
255*9517SBill.Taylor@Sun.COM  * End:
256*9517SBill.Taylor@Sun.COM  */
257