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 49unsigned int irda_debug = IRDA_DEBUG_LEVEL; 50module_param_named(debug, irda_debug, uint, 0); 51MODULE_PARM_DESC(debug, "IRDA debugging level"); 52EXPORT_SYMBOL(irda_debug); 53#endif 54 55/* Packet type handler. 56 * Tell the kernel how IrDA packets should be handled. 57 */ 58static 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 */ 69void 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} 81EXPORT_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 */ 89static 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 */ 163static 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 */ 205subsys_initcall(irda_init); 206module_exit(irda_cleanup); 207 208MODULE_AUTHOR("Dag Brattli <dagb@cs.uit.no> & Jean Tourrilhes <jt@hpl.hp.com>"); 209MODULE_DESCRIPTION("The Linux IrDA Protocol Stack"); 210MODULE_LICENSE("GPL"); 211MODULE_ALIAS_NETPROTO(PF_IRDA); 212