ibmf_mod.c revision 7c478bd95313f5f23a4c958a745db2134aa03244
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22/*
23 * Copyright 2003 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 */
26
27#pragma ident	"%Z%%M%	%I%	%E% SMI"
28
29/*
30 * This file implements the _init(9e), _info(9e) and _fini(9e) functions.
31 */
32
33#include <sys/ib/mgt/ibmf/ibmf_impl.h>
34
35/* Module Info */
36static struct modlmisc ibmf_modlmisc = {
37	&mod_miscops,
38	"IB Agent Interfaces 2.0"
39};
40
41/* Module linkage */
42static struct modlinkage ibmf_modlinkage = {
43	MODREV_1,
44	&ibmf_modlmisc,
45	NULL
46};
47
48static ibmf_state_t		ibmf_state;
49ibmf_state_t			*ibmf_statep;
50
51extern int ibmf_init();
52extern int ibmf_fini();
53extern int ibmf_saa_impl_init();
54extern int ibmf_saa_impl_fini();
55
56#ifndef	NPROBE
57extern int tnf_mod_load(void);
58extern int tnf_mod_unload(struct modlinkage *mlp);
59#endif
60
61int
62_init()
63{
64	int status;
65
66	/* CONSTCOND */
67	ASSERT(NO_COMPETING_THREADS);
68
69#ifndef	NPROBE
70	(void) tnf_mod_load();
71#endif
72	ibmf_statep = &ibmf_state;
73
74	/*
75	 * call ibmf_saa_init first so it can set up subnet list before being
76	 * contacted with ibt_async events
77	 */
78	status = ibmf_saa_impl_init();
79	if (status != IBMF_SUCCESS) {
80		TNF_PROBE_1(_init_error, IBMF_TNF_ERROR, "", tnf_string, msg,
81		    "ibmf_saa_impl_init failed");
82
83#ifndef	NPROBE
84		(void) tnf_mod_unload(&ibmf_modlinkage);
85#endif
86		return (EACCES);
87	}
88
89
90
91	status = ibmf_init();
92	if (status != 0) {
93		TNF_PROBE_1(_init_error, IBMF_TNF_ERROR, "", tnf_string, msg,
94		    "ibmf_init failed");
95
96		(void) ibmf_saa_impl_fini();
97
98#ifndef	NPROBE
99		(void) tnf_mod_unload(&ibmf_modlinkage);
100#endif
101		return (EACCES);
102	}
103
104	status = mod_install(&ibmf_modlinkage);
105	if (status != 0) {
106		TNF_PROBE_2(_init_error, IBMF_TNF_ERROR, "", tnf_string, msg,
107		    "mod_install failed", tnf_uint, status, status);
108#ifndef NPROBE
109		(void) tnf_mod_unload(&ibmf_modlinkage);
110#endif
111		(void) ibmf_fini();
112		ibmf_statep = (ibmf_state_t *)NULL;
113	}
114
115	return (status);
116}
117
118int
119_info(struct modinfo *modinfop)
120{
121	return (mod_info(&ibmf_modlinkage, modinfop));
122}
123
124int
125_fini()
126{
127	int status;
128	status = mod_remove(&ibmf_modlinkage);
129	if (status != 0) {
130		TNF_PROBE_2(_fini_error, IBMF_TNF_ERROR, "", tnf_string, msg,
131		    "mod_remove failed", tnf_uint, status, status);
132		return (status);
133	}
134
135	status = ibmf_saa_impl_fini();
136	if (status != 0) {
137
138		TNF_PROBE_2(_fini_error, IBMF_TNF_ERROR, "", tnf_string, msg,
139		    "ibmf_saa fini failed", tnf_uint, status, status);
140		return (status);
141	}
142
143	(void) ibmf_fini();
144	ibmf_statep = (ibmf_state_t *)NULL;
145#ifndef	NPROBE
146	(void) tnf_mod_unload(&ibmf_modlinkage);
147#endif
148	return (status);
149}
150