X-Git-Url: http://ftp.safe.ca/?a=blobdiff_plain;f=net%2Firda%2Firmod.c;h=303a68d92731085226366bbd72579ea4c7d97027;hb=13bad37b04c779d98983307a27f97e9caa36f9b1;hp=6ffaed4544e963bbd010b515977b3d2586cc5cf8;hpb=1da177e4c3f41524e886b7f1b8a0c1fc7321cac2;p=safe%2Fjmp%2Flinux-2.6 diff --git a/net/irda/irmod.c b/net/irda/irmod.c index 6ffaed4..303a68d 100644 --- a/net/irda/irmod.c +++ b/net/irda/irmod.c @@ -1,5 +1,5 @@ /********************************************************************* - * + * * Filename: irmod.c * Version: 0.9 * Description: IrDA stack main entry points @@ -8,19 +8,19 @@ * Created at: Mon Dec 15 13:55:39 1997 * Modified at: Wed Jan 5 15:12:41 2000 * Modified by: Dag Brattli - * + * * Copyright (c) 1997, 1999-2000 Dag Brattli, All Rights Reserved. * Copyright (c) 2000-2004 Jean Tourrilhes - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. - * - * Neither Dag Brattli nor University of Tromsø admit liability nor - * provide warranty for any of this software. This material is + * + * Neither Dag Brattli nor University of Tromsø admit liability nor + * provide warranty for any of this software. This material is * provided "AS-IS" and at no charge. - * + * ********************************************************************/ /* @@ -31,7 +31,6 @@ * Jean II */ -#include #include #include @@ -43,19 +42,6 @@ #include /* irttp_init */ #include /* irda_device_init */ -/* irproc.c */ -extern void irda_proc_register(void); -extern void irda_proc_unregister(void); -/* irsysctl.c */ -extern int irda_sysctl_register(void); -extern void irda_sysctl_unregister(void); -/* af_irda.c */ -extern int irsock_init(void); -extern void irsock_cleanup(void); -/* irlap_frame.c */ -extern int irlap_driver_rcv(struct sk_buff *, struct net_device *, - struct packet_type *); - /* * Module parameters */ @@ -69,8 +55,8 @@ EXPORT_SYMBOL(irda_debug); /* Packet type handler. * Tell the kernel how IrDA packets should be handled. */ -static struct packet_type irda_packet_type = { - .type = __constant_htons(ETH_P_IRDA), +static struct packet_type irda_packet_type __read_mostly = { + .type = cpu_to_be16(ETH_P_IRDA), .func = irlap_driver_rcv, /* Packet type handler irlap_frame.c */ }; @@ -102,32 +88,70 @@ EXPORT_SYMBOL(irda_notify_init); */ static int __init irda_init(void) { - IRDA_DEBUG(0, "%s()\n", __FUNCTION__); + int ret = 0; + + IRDA_DEBUG(0, "%s()\n", __func__); /* Lower layer of the stack */ - irlmp_init(); + irlmp_init(); irlap_init(); - + + /* Driver/dongle support */ + irda_device_init(); + /* Higher layers of the stack */ iriap_init(); - irttp_init(); - irsock_init(); - + irttp_init(); + ret = irsock_init(); + if (ret < 0) + goto out_err_1; + /* Add IrDA packet type (Start receiving packets) */ - dev_add_pack(&irda_packet_type); + dev_add_pack(&irda_packet_type); /* External APIs */ #ifdef CONFIG_PROC_FS irda_proc_register(); #endif #ifdef CONFIG_SYSCTL - irda_sysctl_register(); + ret = irda_sysctl_register(); + if (ret < 0) + goto out_err_2; #endif - /* Driver/dongle support */ - irda_device_init(); + ret = irda_nl_register(); + if (ret < 0) + goto out_err_3; return 0; + + out_err_3: +#ifdef CONFIG_SYSCTL + irda_sysctl_unregister(); + out_err_2: +#endif +#ifdef CONFIG_PROC_FS + irda_proc_unregister(); +#endif + + /* Remove IrDA packet type (stop receiving packets) */ + dev_remove_pack(&irda_packet_type); + + /* Remove higher layers */ + irsock_cleanup(); + out_err_1: + irttp_cleanup(); + iriap_cleanup(); + + /* Remove lower layers */ + irda_device_cleanup(); + irlap_cleanup(); /* Must be done before irlmp_cleanup()! DB */ + + /* Remove middle layer */ + irlmp_cleanup(); + + + return ret; } /* @@ -139,16 +163,18 @@ static int __init irda_init(void) static void __exit irda_cleanup(void) { /* Remove External APIs */ + irda_nl_unregister(); + #ifdef CONFIG_SYSCTL irda_sysctl_unregister(); -#endif +#endif #ifdef CONFIG_PROC_FS irda_proc_unregister(); #endif /* Remove IrDA packet type (stop receiving packets) */ - dev_remove_pack(&irda_packet_type); - + dev_remove_pack(&irda_packet_type); + /* Remove higher layers */ irsock_cleanup(); irttp_cleanup(); @@ -178,8 +204,8 @@ static void __exit irda_cleanup(void) */ subsys_initcall(irda_init); module_exit(irda_cleanup); - + MODULE_AUTHOR("Dag Brattli & Jean Tourrilhes "); -MODULE_DESCRIPTION("The Linux IrDA Protocol Stack"); +MODULE_DESCRIPTION("The Linux IrDA Protocol Stack"); MODULE_LICENSE("GPL"); MODULE_ALIAS_NETPROTO(PF_IRDA);