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