Path: blob/master/drivers/isdn/hardware/eicon/diddfunc.c
15115 views
/* $Id: diddfunc.c,v 1.14.6.2 2004/08/28 20:03:53 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 "platform.h"14#include "di_defs.h"15#include "dadapter.h"16#include "divasync.h"1718#define DBG_MINIMUM (DL_LOG + DL_FTL + DL_ERR)19#define DBG_DEFAULT (DBG_MINIMUM + DL_XLOG + DL_REG)202122extern void DIVA_DIDD_Read(void *, int);23extern char *DRIVERRELEASE_DIDD;24static dword notify_handle;25static DESCRIPTOR _DAdapter;2627/*28* didd callback function29*/30static void *didd_callback(void *context, DESCRIPTOR * adapter,31int removal)32{33if (adapter->type == IDI_DADAPTER) {34DBG_ERR(("Notification about IDI_DADAPTER change ! Oops."))35return (NULL);36} else if (adapter->type == IDI_DIMAINT) {37if (removal) {38DbgDeregister();39} else {40DbgRegister("DIDD", DRIVERRELEASE_DIDD, DBG_DEFAULT);41}42}43return (NULL);44}4546/*47* connect to didd48*/49static int DIVA_INIT_FUNCTION connect_didd(void)50{51int x = 0;52int dadapter = 0;53IDI_SYNC_REQ req;54DESCRIPTOR DIDD_Table[MAX_DESCRIPTORS];5556DIVA_DIDD_Read(DIDD_Table, sizeof(DIDD_Table));5758for (x = 0; x < MAX_DESCRIPTORS; x++) {59if (DIDD_Table[x].type == IDI_DADAPTER) { /* DADAPTER found */60dadapter = 1;61memcpy(&_DAdapter, &DIDD_Table[x], sizeof(_DAdapter));62req.didd_notify.e.Req = 0;63req.didd_notify.e.Rc =64IDI_SYNC_REQ_DIDD_REGISTER_ADAPTER_NOTIFY;65req.didd_notify.info.callback = (void *)didd_callback;66req.didd_notify.info.context = NULL;67_DAdapter.request((ENTITY *) & req);68if (req.didd_notify.e.Rc != 0xff)69return (0);70notify_handle = req.didd_notify.info.handle;71} else if (DIDD_Table[x].type == IDI_DIMAINT) { /* MAINT found */72DbgRegister("DIDD", DRIVERRELEASE_DIDD, DBG_DEFAULT);73}74}75return (dadapter);76}7778/*79* disconnect from didd80*/81static void DIVA_EXIT_FUNCTION disconnect_didd(void)82{83IDI_SYNC_REQ req;8485req.didd_notify.e.Req = 0;86req.didd_notify.e.Rc = IDI_SYNC_REQ_DIDD_REMOVE_ADAPTER_NOTIFY;87req.didd_notify.info.handle = notify_handle;88_DAdapter.request((ENTITY *) & req);89}9091/*92* init93*/94int DIVA_INIT_FUNCTION diddfunc_init(void)95{96diva_didd_load_time_init();9798if (!connect_didd()) {99DBG_ERR(("init: failed to connect to DIDD."))100diva_didd_load_time_finit();101return (0);102}103return (1);104}105106/*107* finit108*/109void DIVA_EXIT_FUNCTION diddfunc_finit(void)110{111DbgDeregister();112disconnect_didd();113diva_didd_load_time_finit();114}115116117