2005-04-17 02:20:36 +04:00
/*********************************************************************
2007-02-09 17:24:53 +03:00
*
2005-04-17 02:20:36 +04:00
* Filename : irmod . c
* Version : 0.9
* Description : IrDA stack main entry points
* Status : Experimental .
* Author : Dag Brattli < dagb @ cs . uit . no >
* Created at : Mon Dec 15 13 : 55 : 39 1997
* Modified at : Wed Jan 5 15 : 12 : 41 2000
* Modified by : Dag Brattli < dagb @ cs . uit . no >
2007-02-09 17:24:53 +03:00
*
2005-04-17 02:20:36 +04:00
* Copyright ( c ) 1997 , 1999 - 2000 Dag Brattli , All Rights Reserved .
* Copyright ( c ) 2000 - 2004 Jean Tourrilhes < jt @ hpl . hp . com >
2007-02-09 17:24:53 +03:00
*
* 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
2005-04-17 02:20:36 +04:00
* the License , or ( at your option ) any later version .
2007-02-09 17:24:53 +03:00
*
2007-10-20 01:21:04 +04:00
* Neither Dag Brattli nor University of Tromsø admit liability nor
2007-02-09 17:24:53 +03:00
* provide warranty for any of this software . This material is
2005-04-17 02:20:36 +04:00
* provided " AS-IS " and at no charge .
2007-02-09 17:24:53 +03:00
*
2005-04-17 02:20:36 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* This file contains the main entry points of the IrDA stack .
* They are in this file and not af_irda . c because some developpers
* are using the IrDA stack without the socket API ( compiling out
* af_irda . c ) .
* Jean II
*/
# include <linux/module.h>
# include <linux/moduleparam.h>
# include <net/irda/irda.h>
# include <net/irda/irmod.h> /* notify_t */
# include <net/irda/irlap.h> /* irlap_init */
# include <net/irda/irlmp.h> /* irlmp_init */
# include <net/irda/iriap.h> /* iriap_init */
# include <net/irda/irttp.h> /* irttp_init */
# include <net/irda/irda_device.h> /* irda_device_init */
/*
* Module parameters
*/
# ifdef CONFIG_IRDA_DEBUG
unsigned int irda_debug = IRDA_DEBUG_LEVEL ;
module_param_named ( debug , irda_debug , uint , 0 ) ;
MODULE_PARM_DESC ( debug , " IRDA debugging level " ) ;
EXPORT_SYMBOL ( irda_debug ) ;
# endif
/* Packet type handler.
* Tell the kernel how IrDA packets should be handled .
*/
2009-03-09 11:18:29 +03:00
static struct packet_type irda_packet_type __read_mostly = {
2009-02-01 11:45:17 +03:00
. type = cpu_to_be16 ( ETH_P_IRDA ) ,
2005-04-17 02:20:36 +04:00
. func = irlap_driver_rcv , /* Packet type handler irlap_frame.c */
} ;
/*
* Function irda_notify_init ( notify )
*
* Used for initializing the notify structure
*
*/
void irda_notify_init ( notify_t * notify )
{
notify - > data_indication = NULL ;
notify - > udata_indication = NULL ;
notify - > connect_confirm = NULL ;
notify - > connect_indication = NULL ;
notify - > disconnect_indication = NULL ;
notify - > flow_indication = NULL ;
notify - > status_indication = NULL ;
notify - > instance = NULL ;
strlcpy ( notify - > name , " Unknown " , sizeof ( notify - > name ) ) ;
}
EXPORT_SYMBOL ( irda_notify_init ) ;
/*
* Function irda_init ( void )
*
* Protocol stack initialisation entry point .
* Initialise the various components of the IrDA stack
*/
static int __init irda_init ( void )
{
2007-07-03 09:54:18 +04:00
int ret = 0 ;
2008-03-06 07:47:47 +03:00
IRDA_DEBUG ( 0 , " %s() \n " , __func__ ) ;
2005-04-17 02:20:36 +04:00
/* Lower layer of the stack */
2007-02-09 17:24:53 +03:00
irlmp_init ( ) ;
2005-04-17 02:20:36 +04:00
irlap_init ( ) ;
2007-02-09 17:24:53 +03:00
2007-07-03 09:54:18 +04:00
/* Driver/dongle support */
irda_device_init ( ) ;
2005-04-17 02:20:36 +04:00
/* Higher layers of the stack */
iriap_init ( ) ;
2007-02-09 17:24:53 +03:00
irttp_init ( ) ;
2007-07-03 09:54:18 +04:00
ret = irsock_init ( ) ;
if ( ret < 0 )
goto out_err_1 ;
2007-02-09 17:24:53 +03:00
2005-04-17 02:20:36 +04:00
/* Add IrDA packet type (Start receiving packets) */
2007-02-09 17:24:53 +03:00
dev_add_pack ( & irda_packet_type ) ;
2005-04-17 02:20:36 +04:00
/* External APIs */
# ifdef CONFIG_PROC_FS
irda_proc_register ( ) ;
# endif
# ifdef CONFIG_SYSCTL
2007-07-03 09:54:18 +04:00
ret = irda_sysctl_register ( ) ;
if ( ret < 0 )
goto out_err_2 ;
2005-04-17 02:20:36 +04:00
# endif
2007-07-03 09:54:18 +04:00
ret = irda_nl_register ( ) ;
if ( ret < 0 )
goto out_err_3 ;
2005-04-17 02:20:36 +04:00
return 0 ;
2007-07-03 09:54:18 +04:00
out_err_3 :
# ifdef CONFIG_SYSCTL
irda_sysctl_unregister ( ) ;
out_err_2 :
2007-08-21 11:10:50 +04:00
# endif
2007-07-03 09:54:18 +04:00
# 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 ;
2005-04-17 02:20:36 +04:00
}
/*
* Function irda_cleanup ( void )
*
* Protocol stack cleanup / removal entry point .
* Cleanup the various components of the IrDA stack
*/
static void __exit irda_cleanup ( void )
{
/* Remove External APIs */
2007-07-03 09:54:18 +04:00
irda_nl_unregister ( ) ;
2005-04-17 02:20:36 +04:00
# ifdef CONFIG_SYSCTL
irda_sysctl_unregister ( ) ;
2007-02-09 17:24:53 +03:00
# endif
2005-04-17 02:20:36 +04:00
# ifdef CONFIG_PROC_FS
irda_proc_unregister ( ) ;
# endif
/* Remove IrDA packet type (stop receiving packets) */
2007-02-09 17:24:53 +03:00
dev_remove_pack ( & irda_packet_type ) ;
2005-04-17 02:20:36 +04:00
/* Remove higher layers */
irsock_cleanup ( ) ;
irttp_cleanup ( ) ;
iriap_cleanup ( ) ;
/* Remove lower layers */
irda_device_cleanup ( ) ;
irlap_cleanup ( ) ; /* Must be done before irlmp_cleanup()! DB */
/* Remove middle layer */
irlmp_cleanup ( ) ;
}
/*
* The IrDA stack must be initialised * before * drivers get initialised ,
* and * before * higher protocols ( IrLAN / IrCOMM / IrNET ) get initialised ,
* otherwise bad things will happen ( hashbins will be NULL for example ) .
* Those modules are at module_init ( ) / device_initcall ( ) level .
*
* On the other hand , it needs to be initialised * after * the basic
* networking , the / proc / net filesystem and sysctl module . Those are
* currently initialised in . . . / init / main . c ( before initcalls ) .
* Also , IrDA drivers needs to be initialised * after * the random number
* generator ( main stack and higher layer init don ' t need it anymore ) .
*
* Jean II
*/
subsys_initcall ( irda_init ) ;
module_exit ( irda_cleanup ) ;
2007-02-09 17:24:53 +03:00
2005-04-17 02:20:36 +04:00
MODULE_AUTHOR ( " Dag Brattli <dagb@cs.uit.no> & Jean Tourrilhes <jt@hpl.hp.com> " ) ;
2007-02-09 17:24:53 +03:00
MODULE_DESCRIPTION ( " The Linux IrDA Protocol Stack " ) ;
2005-04-17 02:20:36 +04:00
MODULE_LICENSE ( " GPL " ) ;
MODULE_ALIAS_NETPROTO ( PF_IRDA ) ;