Path: blob/master/drivers/isdn/hardware/eicon/diva_didd.c
15115 views
/* $Id: diva_didd.c,v 1.13.6.4 2005/02/11 19:40:25 armin Exp $1*2* DIDD Interface module for Eicon active cards.3*4* Functions are in dadapter.c5*6* Copyright 2002-2003 by Armin Schindler ([email protected])7* Copyright 2002-2003 Cytronics & Melware ([email protected])8*9* This software may be used and distributed according to the terms10* of the GNU General Public License, incorporated herein by reference.11*/1213#include <linux/module.h>14#include <linux/init.h>15#include <linux/kernel.h>16#include <linux/proc_fs.h>17#include <linux/seq_file.h>18#include <net/net_namespace.h>1920#include "platform.h"21#include "di_defs.h"22#include "dadapter.h"23#include "divasync.h"24#include "did_vers.h"2526static char *main_revision = "$Revision: 1.13.6.4 $";2728static char *DRIVERNAME =29"Eicon DIVA - DIDD table (http://www.melware.net)";30static char *DRIVERLNAME = "divadidd";31char *DRIVERRELEASE_DIDD = "2.0";3233MODULE_DESCRIPTION("DIDD table driver for diva drivers");34MODULE_AUTHOR("Cytronics & Melware, Eicon Networks");35MODULE_SUPPORTED_DEVICE("Eicon diva drivers");36MODULE_LICENSE("GPL");3738#define DBG_MINIMUM (DL_LOG + DL_FTL + DL_ERR)39#define DBG_DEFAULT (DBG_MINIMUM + DL_XLOG + DL_REG)4041extern int diddfunc_init(void);42extern void diddfunc_finit(void);4344extern void DIVA_DIDD_Read(void *, int);4546static struct proc_dir_entry *proc_didd;47struct proc_dir_entry *proc_net_eicon = NULL;4849EXPORT_SYMBOL(DIVA_DIDD_Read);50EXPORT_SYMBOL(proc_net_eicon);5152static char *getrev(const char *revision)53{54char *rev;55char *p;56if ((p = strchr(revision, ':'))) {57rev = p + 2;58p = strchr(rev, '$');59*--p = 0;60} else61rev = "1.0";62return rev;63}6465static int divadidd_proc_show(struct seq_file *m, void *v)66{67char tmprev[32];6869strcpy(tmprev, main_revision);70seq_printf(m, "%s\n", DRIVERNAME);71seq_printf(m, "name : %s\n", DRIVERLNAME);72seq_printf(m, "release : %s\n", DRIVERRELEASE_DIDD);73seq_printf(m, "build : %s(%s)\n",74diva_didd_common_code_build, DIVA_BUILD);75seq_printf(m, "revision : %s\n", getrev(tmprev));7677return 0;78}7980static int divadidd_proc_open(struct inode *inode, struct file *file)81{82return single_open(file, divadidd_proc_show, NULL);83}8485static const struct file_operations divadidd_proc_fops = {86.owner = THIS_MODULE,87.open = divadidd_proc_open,88.read = seq_read,89.llseek = seq_lseek,90.release = single_release,91};9293static int DIVA_INIT_FUNCTION create_proc(void)94{95proc_net_eicon = proc_mkdir("eicon", init_net.proc_net);9697if (proc_net_eicon) {98proc_didd = proc_create(DRIVERLNAME, S_IRUGO, proc_net_eicon,99&divadidd_proc_fops);100return (1);101}102return (0);103}104105static void remove_proc(void)106{107remove_proc_entry(DRIVERLNAME, proc_net_eicon);108remove_proc_entry("eicon", init_net.proc_net);109}110111static int DIVA_INIT_FUNCTION divadidd_init(void)112{113char tmprev[32];114int ret = 0;115116printk(KERN_INFO "%s\n", DRIVERNAME);117printk(KERN_INFO "%s: Rel:%s Rev:", DRIVERLNAME, DRIVERRELEASE_DIDD);118strcpy(tmprev, main_revision);119printk("%s Build:%s(%s)\n", getrev(tmprev),120diva_didd_common_code_build, DIVA_BUILD);121122if (!create_proc()) {123printk(KERN_ERR "%s: could not create proc entry\n",124DRIVERLNAME);125ret = -EIO;126goto out;127}128129if (!diddfunc_init()) {130printk(KERN_ERR "%s: failed to connect to DIDD.\n",131DRIVERLNAME);132#ifdef MODULE133remove_proc();134#endif135ret = -EIO;136goto out;137}138139out:140return (ret);141}142143static void DIVA_EXIT_FUNCTION divadidd_exit(void)144{145diddfunc_finit();146remove_proc();147printk(KERN_INFO "%s: module unloaded.\n", DRIVERLNAME);148}149150module_init(divadidd_init);151module_exit(divadidd_exit);152153154