xref: /titanic_50/usr/src/uts/common/io/1394/s1394.c (revision da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0)
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
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
100 _info(struct modinfo *modinfop)
101 {
102 	return (mod_info(&s1394_modlinkage, modinfop));
103 }
104 
105 int
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
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
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