linux/drivers/isdn/hardware/eicon/diddfunc.c
<<
>>
Prefs
   1/* $Id: diddfunc.c,v 1.14.6.2 2004/08/28 20:03:53 armin Exp $
   2 *
   3 * DIDD Interface module for Eicon active cards.
   4 *
   5 * Functions are in dadapter.c
   6 *
   7 * Copyright 2002-2003 by Armin Schindler (mac@melware.de)
   8 * Copyright 2002-2003 Cytronics & Melware (info@melware.de)
   9 *
  10 * This software may be used and distributed according to the terms
  11 * of the GNU General Public License, incorporated herein by reference.
  12 */
  13
  14#include "platform.h"
  15#include "di_defs.h"
  16#include "dadapter.h"
  17#include "divasync.h"
  18
  19#define DBG_MINIMUM  (DL_LOG + DL_FTL + DL_ERR)
  20#define DBG_DEFAULT  (DBG_MINIMUM + DL_XLOG + DL_REG)
  21
  22
  23extern void DIVA_DIDD_Read(void *, int);
  24extern char *DRIVERRELEASE_DIDD;
  25static dword notify_handle;
  26static DESCRIPTOR _DAdapter;
  27
  28/*
  29 * didd callback function
  30 */
  31static void *didd_callback(void *context, DESCRIPTOR *adapter,
  32                           int removal)
  33{
  34        if (adapter->type == IDI_DADAPTER) {
  35                DBG_ERR(("Notification about IDI_DADAPTER change ! Oops."))
  36                        return (NULL);
  37        } else if (adapter->type == IDI_DIMAINT) {
  38                if (removal) {
  39                        DbgDeregister();
  40                } else {
  41                        DbgRegister("DIDD", DRIVERRELEASE_DIDD, DBG_DEFAULT);
  42                }
  43        }
  44        return (NULL);
  45}
  46
  47/*
  48 * connect to didd
  49 */
  50static int __init connect_didd(void)
  51{
  52        int x = 0;
  53        int dadapter = 0;
  54        IDI_SYNC_REQ req;
  55        DESCRIPTOR DIDD_Table[MAX_DESCRIPTORS];
  56
  57        DIVA_DIDD_Read(DIDD_Table, sizeof(DIDD_Table));
  58
  59        for (x = 0; x < MAX_DESCRIPTORS; x++) {
  60                if (DIDD_Table[x].type == IDI_DADAPTER) {       /* DADAPTER found */
  61                        dadapter = 1;
  62                        memcpy(&_DAdapter, &DIDD_Table[x], sizeof(_DAdapter));
  63                        req.didd_notify.e.Req = 0;
  64                        req.didd_notify.e.Rc =
  65                                IDI_SYNC_REQ_DIDD_REGISTER_ADAPTER_NOTIFY;
  66                        req.didd_notify.info.callback = (void *)didd_callback;
  67                        req.didd_notify.info.context = NULL;
  68                        _DAdapter.request((ENTITY *)&req);
  69                        if (req.didd_notify.e.Rc != 0xff)
  70                                return (0);
  71                        notify_handle = req.didd_notify.info.handle;
  72                } else if (DIDD_Table[x].type == IDI_DIMAINT) { /* MAINT found */
  73                        DbgRegister("DIDD", DRIVERRELEASE_DIDD, DBG_DEFAULT);
  74                }
  75        }
  76        return (dadapter);
  77}
  78
  79/*
  80 * disconnect from didd
  81 */
  82static void __exit disconnect_didd(void)
  83{
  84        IDI_SYNC_REQ req;
  85
  86        req.didd_notify.e.Req = 0;
  87        req.didd_notify.e.Rc = IDI_SYNC_REQ_DIDD_REMOVE_ADAPTER_NOTIFY;
  88        req.didd_notify.info.handle = notify_handle;
  89        _DAdapter.request((ENTITY *)&req);
  90}
  91
  92/*
  93 * init
  94 */
  95int __init diddfunc_init(void)
  96{
  97        diva_didd_load_time_init();
  98
  99        if (!connect_didd()) {
 100                DBG_ERR(("init: failed to connect to DIDD."))
 101                        diva_didd_load_time_finit();
 102                return (0);
 103        }
 104        return (1);
 105}
 106
 107/*
 108 * finit
 109 */
 110void __exit diddfunc_finit(void)
 111{
 112        DbgDeregister();
 113        disconnect_didd();
 114        diva_didd_load_time_finit();
 115}
 116