Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/drivers/isdn/hardware/eicon/diddfunc.c
15115 views
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 ([email protected])
8
* Copyright 2002-2003 Cytronics & Melware ([email protected])
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
23
extern void DIVA_DIDD_Read(void *, int);
24
extern char *DRIVERRELEASE_DIDD;
25
static dword notify_handle;
26
static DESCRIPTOR _DAdapter;
27
28
/*
29
* didd callback function
30
*/
31
static 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
*/
50
static int DIVA_INIT_FUNCTION 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
*/
82
static void DIVA_EXIT_FUNCTION 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
*/
95
int DIVA_INIT_FUNCTION 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
*/
110
void DIVA_EXIT_FUNCTION diddfunc_finit(void)
111
{
112
DbgDeregister();
113
disconnect_didd();
114
diva_didd_load_time_finit();
115
}
116
117