Root/
1 | /********************************************************************* |
2 | * |
3 | * Filename: irmod.c |
4 | * Version: 0.9 |
5 | * Description: IrDA stack main entry points |
6 | * Status: Experimental. |
7 | * Author: Dag Brattli <dagb@cs.uit.no> |
8 | * Created at: Mon Dec 15 13:55:39 1997 |
9 | * Modified at: Wed Jan 5 15:12:41 2000 |
10 | * Modified by: Dag Brattli <dagb@cs.uit.no> |
11 | * |
12 | * Copyright (c) 1997, 1999-2000 Dag Brattli, All Rights Reserved. |
13 | * Copyright (c) 2000-2004 Jean Tourrilhes <jt@hpl.hp.com> |
14 | * |
15 | * This program is free software; you can redistribute it and/or |
16 | * modify it under the terms of the GNU General Public License as |
17 | * published by the Free Software Foundation; either version 2 of |
18 | * the License, or (at your option) any later version. |
19 | * |
20 | * Neither Dag Brattli nor University of Tromsø admit liability nor |
21 | * provide warranty for any of this software. This material is |
22 | * provided "AS-IS" and at no charge. |
23 | * |
24 | ********************************************************************/ |
25 | |
26 | /* |
27 | * This file contains the main entry points of the IrDA stack. |
28 | * They are in this file and not af_irda.c because some developpers |
29 | * are using the IrDA stack without the socket API (compiling out |
30 | * af_irda.c). |
31 | * Jean II |
32 | */ |
33 | |
34 | #include <linux/module.h> |
35 | #include <linux/moduleparam.h> |
36 | |
37 | #include <net/irda/irda.h> |
38 | #include <net/irda/irmod.h> /* notify_t */ |
39 | #include <net/irda/irlap.h> /* irlap_init */ |
40 | #include <net/irda/irlmp.h> /* irlmp_init */ |
41 | #include <net/irda/iriap.h> /* iriap_init */ |
42 | #include <net/irda/irttp.h> /* irttp_init */ |
43 | #include <net/irda/irda_device.h> /* irda_device_init */ |
44 | |
45 | /* |
46 | * Module parameters |
47 | */ |
48 | #ifdef CONFIG_IRDA_DEBUG |
49 | unsigned int irda_debug = IRDA_DEBUG_LEVEL; |
50 | module_param_named(debug, irda_debug, uint, 0); |
51 | MODULE_PARM_DESC(debug, "IRDA debugging level"); |
52 | EXPORT_SYMBOL(irda_debug); |
53 | #endif |
54 | |
55 | /* Packet type handler. |
56 | * Tell the kernel how IrDA packets should be handled. |
57 | */ |
58 | static struct packet_type irda_packet_type __read_mostly = { |
59 | .type = cpu_to_be16(ETH_P_IRDA), |
60 | .func = irlap_driver_rcv, /* Packet type handler irlap_frame.c */ |
61 | }; |
62 | |
63 | /* |
64 | * Function irda_notify_init (notify) |
65 | * |
66 | * Used for initializing the notify structure |
67 | * |
68 | */ |
69 | void irda_notify_init(notify_t *notify) |
70 | { |
71 | notify->data_indication = NULL; |
72 | notify->udata_indication = NULL; |
73 | notify->connect_confirm = NULL; |
74 | notify->connect_indication = NULL; |
75 | notify->disconnect_indication = NULL; |
76 | notify->flow_indication = NULL; |
77 | notify->status_indication = NULL; |
78 | notify->instance = NULL; |
79 | strlcpy(notify->name, "Unknown", sizeof(notify->name)); |
80 | } |
81 | EXPORT_SYMBOL(irda_notify_init); |
82 | |
83 | /* |
84 | * Function irda_init (void) |
85 | * |
86 | * Protocol stack initialisation entry point. |
87 | * Initialise the various components of the IrDA stack |
88 | */ |
89 | static int __init irda_init(void) |
90 | { |
91 | int ret = 0; |
92 | |
93 | IRDA_DEBUG(0, "%s()\n", __func__); |
94 | |
95 | /* Lower layer of the stack */ |
96 | irlmp_init(); |
97 | irlap_init(); |
98 | |
99 | /* Driver/dongle support */ |
100 | irda_device_init(); |
101 | |
102 | /* Higher layers of the stack */ |
103 | iriap_init(); |
104 | irttp_init(); |
105 | ret = irsock_init(); |
106 | if (ret < 0) |
107 | goto out_err_1; |
108 | |
109 | /* Add IrDA packet type (Start receiving packets) */ |
110 | dev_add_pack(&irda_packet_type); |
111 | |
112 | /* External APIs */ |
113 | #ifdef CONFIG_PROC_FS |
114 | irda_proc_register(); |
115 | #endif |
116 | #ifdef CONFIG_SYSCTL |
117 | ret = irda_sysctl_register(); |
118 | if (ret < 0) |
119 | goto out_err_2; |
120 | #endif |
121 | |
122 | ret = irda_nl_register(); |
123 | if (ret < 0) |
124 | goto out_err_3; |
125 | |
126 | return 0; |
127 | |
128 | out_err_3: |
129 | #ifdef CONFIG_SYSCTL |
130 | irda_sysctl_unregister(); |
131 | out_err_2: |
132 | #endif |
133 | #ifdef CONFIG_PROC_FS |
134 | irda_proc_unregister(); |
135 | #endif |
136 | |
137 | /* Remove IrDA packet type (stop receiving packets) */ |
138 | dev_remove_pack(&irda_packet_type); |
139 | |
140 | /* Remove higher layers */ |
141 | irsock_cleanup(); |
142 | out_err_1: |
143 | irttp_cleanup(); |
144 | iriap_cleanup(); |
145 | |
146 | /* Remove lower layers */ |
147 | irda_device_cleanup(); |
148 | irlap_cleanup(); /* Must be done before irlmp_cleanup()! DB */ |
149 | |
150 | /* Remove middle layer */ |
151 | irlmp_cleanup(); |
152 | |
153 | |
154 | return ret; |
155 | } |
156 | |
157 | /* |
158 | * Function irda_cleanup (void) |
159 | * |
160 | * Protocol stack cleanup/removal entry point. |
161 | * Cleanup the various components of the IrDA stack |
162 | */ |
163 | static void __exit irda_cleanup(void) |
164 | { |
165 | /* Remove External APIs */ |
166 | irda_nl_unregister(); |
167 | |
168 | #ifdef CONFIG_SYSCTL |
169 | irda_sysctl_unregister(); |
170 | #endif |
171 | #ifdef CONFIG_PROC_FS |
172 | irda_proc_unregister(); |
173 | #endif |
174 | |
175 | /* Remove IrDA packet type (stop receiving packets) */ |
176 | dev_remove_pack(&irda_packet_type); |
177 | |
178 | /* Remove higher layers */ |
179 | irsock_cleanup(); |
180 | irttp_cleanup(); |
181 | iriap_cleanup(); |
182 | |
183 | /* Remove lower layers */ |
184 | irda_device_cleanup(); |
185 | irlap_cleanup(); /* Must be done before irlmp_cleanup()! DB */ |
186 | |
187 | /* Remove middle layer */ |
188 | irlmp_cleanup(); |
189 | } |
190 | |
191 | /* |
192 | * The IrDA stack must be initialised *before* drivers get initialised, |
193 | * and *before* higher protocols (IrLAN/IrCOMM/IrNET) get initialised, |
194 | * otherwise bad things will happen (hashbins will be NULL for example). |
195 | * Those modules are at module_init()/device_initcall() level. |
196 | * |
197 | * On the other hand, it needs to be initialised *after* the basic |
198 | * networking, the /proc/net filesystem and sysctl module. Those are |
199 | * currently initialised in .../init/main.c (before initcalls). |
200 | * Also, IrDA drivers needs to be initialised *after* the random number |
201 | * generator (main stack and higher layer init don't need it anymore). |
202 | * |
203 | * Jean II |
204 | */ |
205 | subsys_initcall(irda_init); |
206 | module_exit(irda_cleanup); |
207 | |
208 | MODULE_AUTHOR("Dag Brattli <dagb@cs.uit.no> & Jean Tourrilhes <jt@hpl.hp.com>"); |
209 | MODULE_DESCRIPTION("The Linux IrDA Protocol Stack"); |
210 | MODULE_LICENSE("GPL"); |
211 | MODULE_ALIAS_NETPROTO(PF_IRDA); |
212 |
Branches:
ben-wpan
ben-wpan-stefan
javiroman/ks7010
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9