Commit | Line | Data |
---|---|---|
1da177e4 LT |
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) | |
475be4d8 | 6 | * |
1da177e4 LT |
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> | |
1da177e4 LT |
13 | #include <linux/init.h> |
14 | #include <linux/kernel.h> | |
15 | ||
16 | #include "isdn_divert.h" | |
17 | ||
18 | MODULE_DESCRIPTION("ISDN4Linux: Call diversion support"); | |
19 | MODULE_AUTHOR("Werner Cornelius"); | |
20 | MODULE_LICENSE("GPL"); | |
21 | ||
22 | /****************************************/ | |
23 | /* structure containing interface to hl */ | |
24 | /****************************************/ | |
03f18285 TS |
25 | isdn_divert_if divert_if = { |
26 | DIVERT_IF_MAGIC, /* magic value */ | |
27 | DIVERT_CMD_REG, /* register cmd */ | |
28 | ll_callback, /* callback routine from ll */ | |
29 | NULL, /* command still not specified */ | |
30 | NULL, /* drv_to_name */ | |
31 | NULL, /* name_to_drv */ | |
475be4d8 | 32 | }; |
1da177e4 LT |
33 | |
34 | /*************************/ | |
35 | /* Module interface code */ | |
36 | /* no cmd line parms */ | |
37 | /*************************/ | |
38 | static int __init divert_init(void) | |
03f18285 TS |
39 | { |
40 | int i; | |
1da177e4 | 41 | |
03f18285 TS |
42 | if (divert_dev_init()) { |
43 | printk(KERN_WARNING "dss1_divert: cannot install device, not loaded\n"); | |
475be4d8 JP |
44 | return (-EIO); |
45 | } | |
03f18285 TS |
46 | if ((i = DIVERT_REG_NAME(&divert_if)) != DIVERT_NO_ERR) { |
47 | divert_dev_deinit(); | |
475be4d8 JP |
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); | |
1da177e4 LT |
53 | } |
54 | ||
55 | /**********************/ | |
56 | /* Module deinit code */ | |
57 | /**********************/ | |
58 | static void __exit divert_exit(void) | |
59 | { | |
475be4d8 JP |
60 | unsigned long flags; |
61 | int i; | |
1da177e4 | 62 | |
475be4d8 JP |
63 | spin_lock_irqsave(&divert_lock, flags); |
64 | divert_if.cmd = DIVERT_CMD_REL; /* release */ | |
03f18285 TS |
65 | if ((i = DIVERT_REG_NAME(&divert_if)) != DIVERT_NO_ERR) { |
66 | printk(KERN_WARNING "dss1_divert: error %d releasing module\n", i); | |
475be4d8 JP |
67 | spin_unlock_irqrestore(&divert_lock, flags); |
68 | return; | |
69 | } | |
03f18285 TS |
70 | if (divert_dev_deinit()) { |
71 | printk(KERN_WARNING "dss1_divert: device busy, remove cancelled\n"); | |
475be4d8 JP |
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"); | |
1da177e4 LT |
79 | } |
80 | ||
81 | module_init(divert_init); | |
82 | module_exit(divert_exit); |