Linux-2.6.12-rc2
[linux-flexiantxendom0-natty.git] / drivers / isdn / divert / divert_init.c
1 /* $Id divert_init.c,v 1.5.6.2 2001/01/24 22:18:17 kai Exp $
2  *
3  * Module init for DSS1 diversion services for i4l.
4  *
5  * Copyright 1999       by Werner Cornelius (werner@isdn4linux.de)
6  * 
7  * This software may be used and distributed according to the terms
8  * of the GNU General Public License, incorporated herein by reference.
9  *
10  */
11
12 #include <linux/module.h>
13 #include <linux/version.h>
14 #include <linux/init.h>
15 #include <linux/kernel.h>
16
17 #include "isdn_divert.h"
18
19 MODULE_DESCRIPTION("ISDN4Linux: Call diversion support");
20 MODULE_AUTHOR("Werner Cornelius");
21 MODULE_LICENSE("GPL");
22
23 /****************************************/
24 /* structure containing interface to hl */
25 /****************************************/
26 isdn_divert_if divert_if =
27   { DIVERT_IF_MAGIC,  /* magic value */
28     DIVERT_CMD_REG,   /* register cmd */
29     ll_callback,      /* callback routine from ll */
30     NULL,             /* command still not specified */
31     NULL,             /* drv_to_name */
32     NULL,             /* name_to_drv */
33   };
34
35 /*************************/
36 /* Module interface code */
37 /* no cmd line parms     */
38 /*************************/
39 static int __init divert_init(void)
40 { int i;
41
42   if (divert_dev_init())
43    { printk(KERN_WARNING "dss1_divert: cannot install device, not loaded\n");
44      return(-EIO);
45    }
46   if ((i = DIVERT_REG_NAME(&divert_if)) != DIVERT_NO_ERR)
47    { divert_dev_deinit();
48      printk(KERN_WARNING "dss1_divert: error %d registering module, not loaded\n",i);
49      return(-EIO);
50    } 
51   printk(KERN_INFO "dss1_divert module successfully installed\n");
52   return(0);
53 }
54
55 /**********************/
56 /* Module deinit code */
57 /**********************/
58 static void __exit divert_exit(void)
59 {
60   unsigned long flags;
61   int i;
62
63   spin_lock_irqsave(&divert_lock, flags);
64   divert_if.cmd = DIVERT_CMD_REL; /* release */
65   if ((i = DIVERT_REG_NAME(&divert_if)) != DIVERT_NO_ERR)
66    { printk(KERN_WARNING "dss1_divert: error %d releasing module\n",i);
67      spin_unlock_irqrestore(&divert_lock, flags);
68      return;
69    } 
70   if (divert_dev_deinit()) 
71    { printk(KERN_WARNING "dss1_divert: device busy, remove cancelled\n");
72      spin_unlock_irqrestore(&divert_lock, flags);
73      return;
74    }
75   spin_unlock_irqrestore(&divert_lock, flags);
76   deleterule(-1); /* delete all rules and free mem */
77   deleteprocs();
78   printk(KERN_INFO "dss1_divert module successfully removed \n");
79 }
80
81 module_init(divert_init);
82 module_exit(divert_exit);
83