Path: blob/master/drivers/isdn/hardware/eicon/divasfunc.c
15115 views
/* $Id: divasfunc.c,v 1.23.4.2 2004/08/28 20:03:53 armin Exp $1*2* Low level driver for Eicon DIVA Server ISDN cards.3*4* Copyright 2000-2003 by Armin Schindler ([email protected])5* Copyright 2000-2003 Cytronics & Melware ([email protected])6*7* This software may be used and distributed according to the terms8* of the GNU General Public License, incorporated herein by reference.9*/1011#include "platform.h"12#include "di_defs.h"13#include "pc.h"14#include "di.h"15#include "io.h"16#include "divasync.h"17#include "diva.h"18#include "xdi_vers.h"1920#define DBG_MINIMUM (DL_LOG + DL_FTL + DL_ERR)21#define DBG_DEFAULT (DBG_MINIMUM + DL_XLOG + DL_REG)2223static int debugmask;2425extern void DIVA_DIDD_Read(void *, int);2627extern PISDN_ADAPTER IoAdapters[MAX_ADAPTER];2829extern char *DRIVERRELEASE_DIVAS;3031static dword notify_handle;32static DESCRIPTOR DAdapter;33static DESCRIPTOR MAdapter;3435/* --------------------------------------------------------------------------36MAINT driver connector section37-------------------------------------------------------------------------- */38static void no_printf(unsigned char *x, ...)39{40/* dummy debug function */41}4243#include "debuglib.c"4445/*46* get the adapters serial number47*/48void diva_get_vserial_number(PISDN_ADAPTER IoAdapter, char *buf)49{50int contr = 0;5152if ((contr = ((IoAdapter->serialNo & 0xff000000) >> 24))) {53sprintf(buf, "%d-%d",54IoAdapter->serialNo & 0x00ffffff, contr + 1);55} else {56sprintf(buf, "%d", IoAdapter->serialNo);57}58}5960/*61* register a new adapter62*/63void diva_xdi_didd_register_adapter(int card)64{65DESCRIPTOR d;66IDI_SYNC_REQ req;6768if (card && ((card - 1) < MAX_ADAPTER) &&69IoAdapters[card - 1] && Requests[card - 1]) {70d.type = IoAdapters[card - 1]->Properties.DescType;71d.request = Requests[card - 1];72d.channels = IoAdapters[card - 1]->Properties.Channels;73d.features = IoAdapters[card - 1]->Properties.Features;74DBG_TRC(("DIDD register A(%d) channels=%d", card,75d.channels))76/* workaround for different Name in structure */77strlcpy(IoAdapters[card - 1]->Name,78IoAdapters[card - 1]->Properties.Name,79sizeof(IoAdapters[card - 1]->Name));80req.didd_remove_adapter.e.Req = 0;81req.didd_add_adapter.e.Rc = IDI_SYNC_REQ_DIDD_ADD_ADAPTER;82req.didd_add_adapter.info.descriptor = (void *) &d;83DAdapter.request((ENTITY *) & req);84if (req.didd_add_adapter.e.Rc != 0xff) {85DBG_ERR(("DIDD register A(%d) failed !", card))86}87IoAdapters[card - 1]->os_trap_nfy_Fnc = NULL;88}89}9091/*92* remove an adapter93*/94void diva_xdi_didd_remove_adapter(int card)95{96IDI_SYNC_REQ req;97ADAPTER *a = &IoAdapters[card - 1]->a;9899IoAdapters[card - 1]->os_trap_nfy_Fnc = NULL;100DBG_TRC(("DIDD de-register A(%d)", card))101req.didd_remove_adapter.e.Req = 0;102req.didd_remove_adapter.e.Rc = IDI_SYNC_REQ_DIDD_REMOVE_ADAPTER;103req.didd_remove_adapter.info.p_request =104(IDI_CALL) Requests[card - 1];105DAdapter.request((ENTITY *) & req);106memset(&(a->IdTable), 0x00, 256);107}108109/*110* start debug111*/112static void start_dbg(void)113{114DbgRegister("DIVAS", DRIVERRELEASE_DIVAS, (debugmask) ? debugmask : DBG_DEFAULT);115DBG_LOG(("DIVA ISDNXDI BUILD (%s[%s])",116DIVA_BUILD, diva_xdi_common_code_build))117}118119/*120* stop debug121*/122static void stop_dbg(void)123{124DbgDeregister();125memset(&MAdapter, 0, sizeof(MAdapter));126dprintf = no_printf;127}128129/*130* didd callback function131*/132static void *didd_callback(void *context, DESCRIPTOR * adapter,133int removal)134{135if (adapter->type == IDI_DADAPTER) {136DBG_ERR(("Notification about IDI_DADAPTER change ! Oops."));137return (NULL);138}139140if (adapter->type == IDI_DIMAINT) {141if (removal) {142stop_dbg();143} else {144memcpy(&MAdapter, adapter, sizeof(MAdapter));145dprintf = (DIVA_DI_PRINTF) MAdapter.request;146start_dbg();147}148}149return (NULL);150}151152/*153* connect to didd154*/155static int DIVA_INIT_FUNCTION connect_didd(void)156{157int x = 0;158int dadapter = 0;159IDI_SYNC_REQ req;160DESCRIPTOR DIDD_Table[MAX_DESCRIPTORS];161162DIVA_DIDD_Read(DIDD_Table, sizeof(DIDD_Table));163164for (x = 0; x < MAX_DESCRIPTORS; x++) {165if (DIDD_Table[x].type == IDI_DADAPTER) { /* DADAPTER found */166dadapter = 1;167memcpy(&DAdapter, &DIDD_Table[x], sizeof(DAdapter));168req.didd_notify.e.Req = 0;169req.didd_notify.e.Rc =170IDI_SYNC_REQ_DIDD_REGISTER_ADAPTER_NOTIFY;171req.didd_notify.info.callback = (void *)didd_callback;172req.didd_notify.info.context = NULL;173DAdapter.request((ENTITY *) & req);174if (req.didd_notify.e.Rc != 0xff) {175stop_dbg();176return (0);177}178notify_handle = req.didd_notify.info.handle;179} else if (DIDD_Table[x].type == IDI_DIMAINT) { /* MAINT found */180memcpy(&MAdapter, &DIDD_Table[x], sizeof(DAdapter));181dprintf = (DIVA_DI_PRINTF) MAdapter.request;182start_dbg();183}184}185186if (!dadapter) {187stop_dbg();188}189190return (dadapter);191}192193/*194* disconnect from didd195*/196static void disconnect_didd(void)197{198IDI_SYNC_REQ req;199200stop_dbg();201202req.didd_notify.e.Req = 0;203req.didd_notify.e.Rc = IDI_SYNC_REQ_DIDD_REMOVE_ADAPTER_NOTIFY;204req.didd_notify.info.handle = notify_handle;205DAdapter.request((ENTITY *) & req);206}207208/*209* init210*/211int DIVA_INIT_FUNCTION divasfunc_init(int dbgmask)212{213char *version;214215debugmask = dbgmask;216217if (!connect_didd()) {218DBG_ERR(("divasfunc: failed to connect to DIDD."))219return (0);220}221222version = diva_xdi_common_code_build;223224divasa_xdi_driver_entry();225226return (1);227}228229/*230* exit231*/232void divasfunc_exit(void)233{234divasa_xdi_driver_unload();235disconnect_didd();236}237238239