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