1 /* $Id: divasfunc.c,v 1.23 2004/04/08 01:17:57 armin Exp $
3 * Low level driver for Eicon DIVA Server ISDN cards.
5 * Copyright 2000-2003 by Armin Schindler (mac@melware.de)
6 * Copyright 2000-2003 Cytronics & Melware (info@melware.de)
8 * This software may be used and distributed according to the terms
9 * of the GNU General Public License, incorporated herein by reference.
21 #define DBG_MINIMUM (DL_LOG + DL_FTL + DL_ERR)
22 #define DBG_DEFAULT (DBG_MINIMUM + DL_XLOG + DL_REG)
26 extern void DIVA_DIDD_Read(void *, int);
28 extern PISDN_ADAPTER IoAdapters[MAX_ADAPTER];
30 #define MAX_DESCRIPTORS 32
32 extern char *DRIVERRELEASE_DIVAS;
34 static dword notify_handle;
35 static DESCRIPTOR DAdapter;
36 static DESCRIPTOR MAdapter;
38 /* --------------------------------------------------------------------------
39 MAINT driver connector section
40 -------------------------------------------------------------------------- */
41 static void no_printf(unsigned char *x, ...)
43 /* dummy debug function */
49 * get the adapters serial number
51 void diva_get_vserial_number(PISDN_ADAPTER IoAdapter, char *buf)
55 if ((contr = ((IoAdapter->serialNo & 0xff000000) >> 24))) {
57 IoAdapter->serialNo & 0x00ffffff, contr + 1);
59 sprintf(buf, "%d", IoAdapter->serialNo);
64 * register a new adapter
66 void diva_xdi_didd_register_adapter(int card)
71 if (card && ((card - 1) < MAX_ADAPTER) &&
72 IoAdapters[card - 1] && Requests[card - 1]) {
73 d.type = IoAdapters[card - 1]->Properties.DescType;
74 d.request = Requests[card - 1];
75 d.channels = IoAdapters[card - 1]->Properties.Channels;
76 d.features = IoAdapters[card - 1]->Properties.Features;
77 DBG_TRC(("DIDD register A(%d) channels=%d", card,
79 /* workaround for different Name in structure */
80 strlcpy(IoAdapters[card - 1]->Name,
81 IoAdapters[card - 1]->Properties.Name,
82 sizeof(IoAdapters[card - 1]->Name));
83 req.didd_remove_adapter.e.Req = 0;
84 req.didd_add_adapter.e.Rc = IDI_SYNC_REQ_DIDD_ADD_ADAPTER;
85 req.didd_add_adapter.info.descriptor = (void *) &d;
86 DAdapter.request((ENTITY *) & req);
87 if (req.didd_add_adapter.e.Rc != 0xff) {
88 DBG_ERR(("DIDD register A(%d) failed !", card))
90 IoAdapters[card - 1]->os_trap_nfy_Fnc = NULL;
97 void diva_xdi_didd_remove_adapter(int card)
100 ADAPTER *a = &IoAdapters[card - 1]->a;
102 IoAdapters[card - 1]->os_trap_nfy_Fnc = NULL;
103 DBG_TRC(("DIDD de-register A(%d)", card))
104 req.didd_remove_adapter.e.Req = 0;
105 req.didd_remove_adapter.e.Rc = IDI_SYNC_REQ_DIDD_REMOVE_ADAPTER;
106 req.didd_remove_adapter.info.p_request =
107 (IDI_CALL) Requests[card - 1];
108 DAdapter.request((ENTITY *) & req);
109 memset(&(a->IdTable), 0x00, 256);
115 static void start_dbg(void)
117 DbgRegister("DIVAS", DRIVERRELEASE_DIVAS, (debugmask) ? debugmask : DBG_DEFAULT);
118 DBG_LOG(("DIVA ISDNXDI BUILD (%s[%s]-%s-%s)",
119 DIVA_BUILD, diva_xdi_common_code_build, __DATE__,
126 static void stop_dbg(void)
129 memset(&MAdapter, 0, sizeof(MAdapter));
134 * didd callback function
136 static void *didd_callback(void *context, DESCRIPTOR * adapter,
139 if (adapter->type == IDI_DADAPTER) {
140 DBG_ERR(("Notification about IDI_DADAPTER change ! Oops."));
144 if (adapter->type == IDI_DIMAINT) {
148 memcpy(&MAdapter, adapter, sizeof(MAdapter));
149 dprintf = (DIVA_DI_PRINTF) MAdapter.request;
159 static int DIVA_INIT_FUNCTION connect_didd(void)
164 DESCRIPTOR DIDD_Table[MAX_DESCRIPTORS];
166 DIVA_DIDD_Read(DIDD_Table, sizeof(DIDD_Table));
168 for (x = 0; x < MAX_DESCRIPTORS; x++) {
169 if (DIDD_Table[x].type == IDI_DADAPTER) { /* DADAPTER found */
171 memcpy(&DAdapter, &DIDD_Table[x], sizeof(DAdapter));
172 req.didd_notify.e.Req = 0;
173 req.didd_notify.e.Rc =
174 IDI_SYNC_REQ_DIDD_REGISTER_ADAPTER_NOTIFY;
175 req.didd_notify.info.callback = (void *)didd_callback;
176 req.didd_notify.info.context = NULL;
177 DAdapter.request((ENTITY *) & req);
178 if (req.didd_notify.e.Rc != 0xff) {
182 notify_handle = req.didd_notify.info.handle;
183 } else if (DIDD_Table[x].type == IDI_DIMAINT) { /* MAINT found */
184 memcpy(&MAdapter, &DIDD_Table[x], sizeof(DAdapter));
185 dprintf = (DIVA_DI_PRINTF) MAdapter.request;
198 * disconnect from didd
200 static void DIVA_EXIT_FUNCTION disconnect_didd(void)
206 req.didd_notify.e.Req = 0;
207 req.didd_notify.e.Rc = IDI_SYNC_REQ_DIDD_REMOVE_ADAPTER_NOTIFY;
208 req.didd_notify.info.handle = notify_handle;
209 DAdapter.request((ENTITY *) & req);
215 int DIVA_INIT_FUNCTION divasfunc_init(int dbgmask)
221 if (!connect_didd()) {
222 DBG_ERR(("divasfunc: failed to connect to DIDD."))
226 version = diva_xdi_common_code_build;
228 divasa_xdi_driver_entry();
236 void DIVA_EXIT_FUNCTION divasfunc_exit(void)
238 divasa_xdi_driver_unload();