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 (c) 1999-2000 by Sun Microsystems, Inc.
24 * All rights reserved.
25 */
26
27 #pragma ident "%Z%%M% %I% %E% SMI"
28
29 /*
30 * s1394.c
31 * 1394 Services Layer Initialization and Cleanup Routines
32 * The routines do all initialization and cleanup for the Sevices Layer
33 */
34
35 #include <sys/conf.h>
36 #include <sys/ddi.h>
37 #include <sys/sunddi.h>
38 #include <sys/types.h>
39 #include <sys/kmem.h>
40 #include <sys/tnf_probe.h>
41
42 #include <sys/1394/t1394.h>
43 #include <sys/1394/s1394.h>
44 #include <sys/1394/h1394.h>
45
46 /* Driver State Pointer */
47 s1394_state_t *s1394_statep;
48
49 /* Module Driver Info */
50 static struct modlmisc s1394_modlmisc = {
51 &mod_miscops,
52 "IEEE 1394 Services Library 1.0"
53 };
54
55 /* Module Linkage */
56 static struct modlinkage s1394_modlinkage = {
57 MODREV_1,
58 &s1394_modlmisc,
59 NULL
60 };
61
62 static int s1394_init();
63 static void s1394_fini();
64
65 #ifndef NPROBE
66 extern int tnf_mod_load(void);
67 extern int tnf_mod_unload(struct modlinkage *mlp);
68 #endif
69
70 int
_init()71 _init()
72 {
73 int status;
74
75 #ifndef NPROBE
76 (void) tnf_mod_load();
77 #endif
78 status = s1394_init();
79 if (status != 0) {
80 TNF_PROBE_1(_init_error, S1394_TNF_SL_ERROR, "",
81 tnf_string, msg, "s1394: failed in s1394_init");
82 #ifndef NPROBE
83 (void) tnf_mod_unload(&s1394_modlinkage);
84 #endif
85 return (status);
86 }
87
88 status = mod_install(&s1394_modlinkage);
89 if (status != 0) {
90 TNF_PROBE_1(_init_error, S1394_TNF_SL_ERROR, "",
91 tnf_string, msg, "s1394: failed in mod_install");
92 #ifndef NPROBE
93 (void) tnf_mod_unload(&s1394_modlinkage);
94 #endif
95 }
96 return (status);
97 }
98
99 int
_info(struct modinfo * modinfop)100 _info(struct modinfo *modinfop)
101 {
102 return (mod_info(&s1394_modlinkage, modinfop));
103 }
104
105 int
_fini()106 _fini()
107 {
108 int status;
109
110 status = mod_remove(&s1394_modlinkage);
111 if (status != 0) {
112 TNF_PROBE_1(_fini_error, S1394_TNF_SL_ERROR, "",
113 tnf_string, msg, "s1394: failed in mod_remove");
114 return (status);
115 }
116
117 s1394_fini();
118 #ifndef NPROBE
119 (void) tnf_mod_unload(&s1394_modlinkage);
120 #endif
121 return (status);
122 }
123
124 /*
125 * s1394_init()
126 * initializes the 1394 Software Framework's structures, i.e. the HAL list
127 * and associated mutex.
128 */
129 static int
s1394_init()130 s1394_init()
131 {
132 TNF_PROBE_0_DEBUG(s1394_init_enter, S1394_TNF_SL_STACK, "");
133
134 s1394_statep = kmem_zalloc(sizeof (s1394_state_t), KM_SLEEP);
135
136 s1394_statep->hal_head = NULL;
137 s1394_statep->hal_tail = NULL;
138 mutex_init(&s1394_statep->hal_list_mutex, NULL, MUTEX_DRIVER, NULL);
139
140 TNF_PROBE_0_DEBUG(s1394_init_exit, S1394_TNF_SL_STACK, "");
141 return (0);
142 }
143
144 /*
145 * s1394_fini()
146 * cleans up the 1394 Software Framework's structures that were allocated
147 * in s1394_init().
148 */
149 static void
s1394_fini()150 s1394_fini()
151 {
152 TNF_PROBE_0_DEBUG(s1394_fini_enter, S1394_TNF_SL_STACK, "");
153
154 mutex_destroy(&s1394_statep->hal_list_mutex);
155
156 kmem_free(s1394_statep, sizeof (s1394_state_t));
157
158 TNF_PROBE_0_DEBUG(s1394_fini_exit, S1394_TNF_SL_STACK, "");
159 }
160