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