| /* $Id divert_init.c,v 1.5.6.2 2001/01/24 22:18:17 kai Exp $ | 
 |  * | 
 |  * Module init for DSS1 diversion services for i4l. | 
 |  * | 
 |  * Copyright 1999       by Werner Cornelius (werner@isdn4linux.de) | 
 |  *  | 
 |  * This software may be used and distributed according to the terms | 
 |  * of the GNU General Public License, incorporated herein by reference. | 
 |  * | 
 |  */ | 
 |  | 
 | #include <linux/module.h> | 
 | #include <linux/init.h> | 
 | #include <linux/kernel.h> | 
 |  | 
 | #include "isdn_divert.h" | 
 |  | 
 | MODULE_DESCRIPTION("ISDN4Linux: Call diversion support"); | 
 | MODULE_AUTHOR("Werner Cornelius"); | 
 | MODULE_LICENSE("GPL"); | 
 |  | 
 | /****************************************/ | 
 | /* structure containing interface to hl */ | 
 | /****************************************/ | 
 | isdn_divert_if divert_if = | 
 |   { DIVERT_IF_MAGIC,  /* magic value */ | 
 |     DIVERT_CMD_REG,   /* register cmd */ | 
 |     ll_callback,      /* callback routine from ll */ | 
 |     NULL,             /* command still not specified */ | 
 |     NULL,             /* drv_to_name */ | 
 |     NULL,             /* name_to_drv */ | 
 |   }; | 
 |  | 
 | /*************************/ | 
 | /* Module interface code */ | 
 | /* no cmd line parms     */ | 
 | /*************************/ | 
 | static int __init divert_init(void) | 
 | { int i; | 
 |  | 
 |   if (divert_dev_init()) | 
 |    { printk(KERN_WARNING "dss1_divert: cannot install device, not loaded\n"); | 
 |      return(-EIO); | 
 |    } | 
 |   if ((i = DIVERT_REG_NAME(&divert_if)) != DIVERT_NO_ERR) | 
 |    { divert_dev_deinit(); | 
 |      printk(KERN_WARNING "dss1_divert: error %d registering module, not loaded\n",i); | 
 |      return(-EIO); | 
 |    }  | 
 |   printk(KERN_INFO "dss1_divert module successfully installed\n"); | 
 |   return(0); | 
 | } | 
 |  | 
 | /**********************/ | 
 | /* Module deinit code */ | 
 | /**********************/ | 
 | static void __exit divert_exit(void) | 
 | { | 
 |   unsigned long flags; | 
 |   int i; | 
 |  | 
 |   spin_lock_irqsave(&divert_lock, flags); | 
 |   divert_if.cmd = DIVERT_CMD_REL; /* release */ | 
 |   if ((i = DIVERT_REG_NAME(&divert_if)) != DIVERT_NO_ERR) | 
 |    { printk(KERN_WARNING "dss1_divert: error %d releasing module\n",i); | 
 |      spin_unlock_irqrestore(&divert_lock, flags); | 
 |      return; | 
 |    }  | 
 |   if (divert_dev_deinit())  | 
 |    { printk(KERN_WARNING "dss1_divert: device busy, remove cancelled\n"); | 
 |      spin_unlock_irqrestore(&divert_lock, flags); | 
 |      return; | 
 |    } | 
 |   spin_unlock_irqrestore(&divert_lock, flags); | 
 |   deleterule(-1); /* delete all rules and free mem */ | 
 |   deleteprocs(); | 
 |   printk(KERN_INFO "dss1_divert module successfully removed \n"); | 
 | } | 
 |  | 
 | module_init(divert_init); | 
 | module_exit(divert_exit); | 
 |  |