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