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 
  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 }