Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]

Diff markup

Differences between /linux/drivers/isdn/hardware/eicon/divasfunc.c (Version 2.6.25) and /linux/drivers/isdn/hardware/eicon/divasfunc.c (Version 2.6.25.8)


  1 /* $Id: divasfunc.c,v 1.23.4.2 2004/08/28 20:0      1 /* $Id: divasfunc.c,v 1.23.4.2 2004/08/28 20:03:53 armin Exp $
  2  *                                                  2  *
  3  * Low level driver for Eicon DIVA Server ISDN      3  * Low level driver for Eicon DIVA Server ISDN cards.
  4  *                                                  4  *
  5  * Copyright 2000-2003 by Armin Schindler (mac      5  * Copyright 2000-2003 by Armin Schindler (mac@melware.de)
  6  * Copyright 2000-2003 Cytronics & Melware (in      6  * Copyright 2000-2003 Cytronics & Melware (info@melware.de)
  7  *                                                  7  *
  8  * This software may be used and distributed a      8  * This software may be used and distributed according to the terms
  9  * of the GNU General Public License, incorpor      9  * of the GNU General Public License, incorporated herein by reference.
 10  */                                                10  */
 11                                                    11 
 12 #include "platform.h"                              12 #include "platform.h"
 13 #include "di_defs.h"                               13 #include "di_defs.h"
 14 #include "pc.h"                                    14 #include "pc.h"
 15 #include "di.h"                                    15 #include "di.h"
 16 #include "io.h"                                    16 #include "io.h"
 17 #include "divasync.h"                              17 #include "divasync.h"
 18 #include "diva.h"                                  18 #include "diva.h"
 19 #include "xdi_vers.h"                              19 #include "xdi_vers.h"
 20                                                    20 
 21 #define DBG_MINIMUM  (DL_LOG + DL_FTL + DL_ERR     21 #define DBG_MINIMUM  (DL_LOG + DL_FTL + DL_ERR)
 22 #define DBG_DEFAULT  (DBG_MINIMUM + DL_XLOG +      22 #define DBG_DEFAULT  (DBG_MINIMUM + DL_XLOG + DL_REG)
 23                                                    23 
 24 static int debugmask;                              24 static int debugmask;
 25                                                    25 
 26 extern void DIVA_DIDD_Read(void *, int);           26 extern void DIVA_DIDD_Read(void *, int);
 27                                                    27 
 28 extern PISDN_ADAPTER IoAdapters[MAX_ADAPTER];      28 extern PISDN_ADAPTER IoAdapters[MAX_ADAPTER];
 29                                                    29 
 30 extern char *DRIVERRELEASE_DIVAS;                  30 extern char *DRIVERRELEASE_DIVAS;
 31                                                    31 
 32 static dword notify_handle;                        32 static dword notify_handle;
 33 static DESCRIPTOR DAdapter;                        33 static DESCRIPTOR DAdapter;
 34 static DESCRIPTOR MAdapter;                        34 static DESCRIPTOR MAdapter;
 35                                                    35 
 36 /* -------------------------------------------     36 /* --------------------------------------------------------------------------
 37     MAINT driver connector section                 37     MAINT driver connector section
 38    -------------------------------------------     38    -------------------------------------------------------------------------- */
 39 static void no_printf(unsigned char *x, ...)       39 static void no_printf(unsigned char *x, ...)
 40 {                                                  40 {
 41         /* dummy debug function */                 41         /* dummy debug function */
 42 }                                                  42 }
 43                                                    43 
 44 #include "debuglib.c"                              44 #include "debuglib.c"
 45                                                    45 
 46 /*                                                 46 /*
 47  * get the adapters serial number                  47  * get the adapters serial number
 48  */                                                48  */
 49 void diva_get_vserial_number(PISDN_ADAPTER IoA     49 void diva_get_vserial_number(PISDN_ADAPTER IoAdapter, char *buf)
 50 {                                                  50 {
 51         int contr = 0;                             51         int contr = 0;
 52                                                    52 
 53         if ((contr = ((IoAdapter->serialNo & 0     53         if ((contr = ((IoAdapter->serialNo & 0xff000000) >> 24))) {
 54                 sprintf(buf, "%d-%d",              54                 sprintf(buf, "%d-%d",
 55                         IoAdapter->serialNo &      55                         IoAdapter->serialNo & 0x00ffffff, contr + 1);
 56         } else {                                   56         } else {
 57                 sprintf(buf, "%d", IoAdapter->     57                 sprintf(buf, "%d", IoAdapter->serialNo);
 58         }                                          58         }
 59 }                                                  59 }
 60                                                    60 
 61 /*                                                 61 /*
 62  * register a new adapter                          62  * register a new adapter
 63  */                                                63  */
 64 void diva_xdi_didd_register_adapter(int card)      64 void diva_xdi_didd_register_adapter(int card)
 65 {                                                  65 {
 66         DESCRIPTOR d;                              66         DESCRIPTOR d;
 67         IDI_SYNC_REQ req;                          67         IDI_SYNC_REQ req;
 68                                                    68 
 69         if (card && ((card - 1) < MAX_ADAPTER)     69         if (card && ((card - 1) < MAX_ADAPTER) &&
 70             IoAdapters[card - 1] && Requests[c     70             IoAdapters[card - 1] && Requests[card - 1]) {
 71                 d.type = IoAdapters[card - 1]-     71                 d.type = IoAdapters[card - 1]->Properties.DescType;
 72                 d.request = Requests[card - 1]     72                 d.request = Requests[card - 1];
 73                 d.channels = IoAdapters[card -     73                 d.channels = IoAdapters[card - 1]->Properties.Channels;
 74                 d.features = IoAdapters[card -     74                 d.features = IoAdapters[card - 1]->Properties.Features;
 75                 DBG_TRC(("DIDD register A(%d)      75                 DBG_TRC(("DIDD register A(%d) channels=%d", card,
 76                          d.channels))              76                          d.channels))
 77                     /* workaround for differen     77                     /* workaround for different Name in structure */
 78                     strlcpy(IoAdapters[card -      78                     strlcpy(IoAdapters[card - 1]->Name,
 79                             IoAdapters[card -      79                             IoAdapters[card - 1]->Properties.Name,
 80                             sizeof(IoAdapters[     80                             sizeof(IoAdapters[card - 1]->Name));
 81                 req.didd_remove_adapter.e.Req      81                 req.didd_remove_adapter.e.Req = 0;
 82                 req.didd_add_adapter.e.Rc = ID     82                 req.didd_add_adapter.e.Rc = IDI_SYNC_REQ_DIDD_ADD_ADAPTER;
 83                 req.didd_add_adapter.info.desc     83                 req.didd_add_adapter.info.descriptor = (void *) &d;
 84                 DAdapter.request((ENTITY *) &      84                 DAdapter.request((ENTITY *) & req);
 85                 if (req.didd_add_adapter.e.Rc      85                 if (req.didd_add_adapter.e.Rc != 0xff) {
 86                         DBG_ERR(("DIDD registe     86                         DBG_ERR(("DIDD register A(%d) failed !", card))
 87                 }                                  87                 }
 88                 IoAdapters[card - 1]->os_trap_     88                 IoAdapters[card - 1]->os_trap_nfy_Fnc = NULL;
 89         }                                          89         }
 90 }                                                  90 }
 91                                                    91 
 92 /*                                                 92 /*
 93  * remove an adapter                               93  * remove an adapter
 94  */                                                94  */
 95 void diva_xdi_didd_remove_adapter(int card)        95 void diva_xdi_didd_remove_adapter(int card)
 96 {                                                  96 {
 97         IDI_SYNC_REQ req;                          97         IDI_SYNC_REQ req;
 98         ADAPTER *a = &IoAdapters[card - 1]->a;     98         ADAPTER *a = &IoAdapters[card - 1]->a;
 99                                                    99 
100         IoAdapters[card - 1]->os_trap_nfy_Fnc     100         IoAdapters[card - 1]->os_trap_nfy_Fnc = NULL;
101         DBG_TRC(("DIDD de-register A(%d)", car    101         DBG_TRC(("DIDD de-register A(%d)", card))
102         req.didd_remove_adapter.e.Req = 0;        102         req.didd_remove_adapter.e.Req = 0;
103         req.didd_remove_adapter.e.Rc = IDI_SYN    103         req.didd_remove_adapter.e.Rc = IDI_SYNC_REQ_DIDD_REMOVE_ADAPTER;
104         req.didd_remove_adapter.info.p_request    104         req.didd_remove_adapter.info.p_request =
105             (IDI_CALL) Requests[card - 1];        105             (IDI_CALL) Requests[card - 1];
106         DAdapter.request((ENTITY *) & req);       106         DAdapter.request((ENTITY *) & req);
107         memset(&(a->IdTable), 0x00, 256);         107         memset(&(a->IdTable), 0x00, 256);
108 }                                                 108 }
109                                                   109 
110 /*                                                110 /*
111  * start debug                                    111  * start debug
112  */                                               112  */
113 static void start_dbg(void)                       113 static void start_dbg(void)
114 {                                                 114 {
115         DbgRegister("DIVAS", DRIVERRELEASE_DIV    115         DbgRegister("DIVAS", DRIVERRELEASE_DIVAS, (debugmask) ? debugmask : DBG_DEFAULT);
116         DBG_LOG(("DIVA ISDNXDI BUILD (%s[%s]-%    116         DBG_LOG(("DIVA ISDNXDI BUILD (%s[%s]-%s-%s)",
117                  DIVA_BUILD, diva_xdi_common_c    117                  DIVA_BUILD, diva_xdi_common_code_build, __DATE__,
118                  __TIME__))                       118                  __TIME__))
119 }                                                 119 }
120                                                   120 
121 /*                                                121 /*
122  * stop debug                                     122  * stop debug
123  */                                               123  */
124 static void stop_dbg(void)                        124 static void stop_dbg(void)
125 {                                                 125 {
126         DbgDeregister();                          126         DbgDeregister();
127         memset(&MAdapter, 0, sizeof(MAdapter))    127         memset(&MAdapter, 0, sizeof(MAdapter));
128         dprintf = no_printf;                      128         dprintf = no_printf;
129 }                                                 129 }
130                                                   130 
131 /*                                                131 /*
132  * didd callback function                         132  * didd callback function
133  */                                               133  */
134 static void *didd_callback(void *context, DESC    134 static void *didd_callback(void *context, DESCRIPTOR * adapter,
135                            int removal)           135                            int removal)
136 {                                                 136 {
137         if (adapter->type == IDI_DADAPTER) {      137         if (adapter->type == IDI_DADAPTER) {
138                 DBG_ERR(("Notification about I    138                 DBG_ERR(("Notification about IDI_DADAPTER change ! Oops."));
139                 return (NULL);                    139                 return (NULL);
140         }                                         140         }
141                                                   141 
142         if (adapter->type == IDI_DIMAINT) {       142         if (adapter->type == IDI_DIMAINT) {
143                 if (removal) {                    143                 if (removal) {
144                         stop_dbg();               144                         stop_dbg();
145                 } else {                          145                 } else {
146                         memcpy(&MAdapter, adap    146                         memcpy(&MAdapter, adapter, sizeof(MAdapter));
147                         dprintf = (DIVA_DI_PRI    147                         dprintf = (DIVA_DI_PRINTF) MAdapter.request;
148                         start_dbg();              148                         start_dbg();
149                 }                                 149                 }
150         }                                         150         }
151         return (NULL);                            151         return (NULL);
152 }                                                 152 }
153                                                   153 
154 /*                                                154 /*
155  * connect to didd                                155  * connect to didd
156  */                                               156  */
157 static int DIVA_INIT_FUNCTION connect_didd(voi    157 static int DIVA_INIT_FUNCTION connect_didd(void)
158 {                                                 158 {
159         int x = 0;                                159         int x = 0;
160         int dadapter = 0;                         160         int dadapter = 0;
161         IDI_SYNC_REQ req;                         161         IDI_SYNC_REQ req;
162         DESCRIPTOR DIDD_Table[MAX_DESCRIPTORS]    162         DESCRIPTOR DIDD_Table[MAX_DESCRIPTORS];
163                                                   163 
164         DIVA_DIDD_Read(DIDD_Table, sizeof(DIDD    164         DIVA_DIDD_Read(DIDD_Table, sizeof(DIDD_Table));
165                                                   165 
166         for (x = 0; x < MAX_DESCRIPTORS; x++)     166         for (x = 0; x < MAX_DESCRIPTORS; x++) {
167                 if (DIDD_Table[x].type == IDI_    167                 if (DIDD_Table[x].type == IDI_DADAPTER) {       /* DADAPTER found */
168                         dadapter = 1;             168                         dadapter = 1;
169                         memcpy(&DAdapter, &DID    169                         memcpy(&DAdapter, &DIDD_Table[x], sizeof(DAdapter));
170                         req.didd_notify.e.Req     170                         req.didd_notify.e.Req = 0;
171                         req.didd_notify.e.Rc =    171                         req.didd_notify.e.Rc =
172                             IDI_SYNC_REQ_DIDD_    172                             IDI_SYNC_REQ_DIDD_REGISTER_ADAPTER_NOTIFY;
173                         req.didd_notify.info.c    173                         req.didd_notify.info.callback = (void *)didd_callback;
174                         req.didd_notify.info.c    174                         req.didd_notify.info.context = NULL;
175                         DAdapter.request((ENTI    175                         DAdapter.request((ENTITY *) & req);
176                         if (req.didd_notify.e.    176                         if (req.didd_notify.e.Rc != 0xff) {
177                                 stop_dbg();       177                                 stop_dbg();
178                                 return (0);       178                                 return (0);
179                         }                         179                         }
180                         notify_handle = req.di    180                         notify_handle = req.didd_notify.info.handle;
181                 } else if (DIDD_Table[x].type     181                 } else if (DIDD_Table[x].type == IDI_DIMAINT) { /* MAINT found */
182                         memcpy(&MAdapter, &DID    182                         memcpy(&MAdapter, &DIDD_Table[x], sizeof(DAdapter));
183                         dprintf = (DIVA_DI_PRI    183                         dprintf = (DIVA_DI_PRINTF) MAdapter.request;
184                         start_dbg();              184                         start_dbg();
185                 }                                 185                 }
186         }                                         186         }
187                                                   187 
188         if (!dadapter) {                          188         if (!dadapter) {
189                 stop_dbg();                       189                 stop_dbg();
190         }                                         190         }
191                                                   191 
192         return (dadapter);                        192         return (dadapter);
193 }                                                 193 }
194                                                   194 
195 /*                                                195 /*
196  * disconnect from didd                           196  * disconnect from didd
197  */                                               197  */
198 static void disconnect_didd(void)                 198 static void disconnect_didd(void)
199 {                                                 199 {
200         IDI_SYNC_REQ req;                         200         IDI_SYNC_REQ req;
201                                                   201 
202         stop_dbg();                               202         stop_dbg();
203                                                   203 
204         req.didd_notify.e.Req = 0;                204         req.didd_notify.e.Req = 0;
205         req.didd_notify.e.Rc = IDI_SYNC_REQ_DI    205         req.didd_notify.e.Rc = IDI_SYNC_REQ_DIDD_REMOVE_ADAPTER_NOTIFY;
206         req.didd_notify.info.handle = notify_h    206         req.didd_notify.info.handle = notify_handle;
207         DAdapter.request((ENTITY *) & req);       207         DAdapter.request((ENTITY *) & req);
208 }                                                 208 }
209                                                   209 
210 /*                                                210 /*
211  * init                                           211  * init
212  */                                               212  */
213 int DIVA_INIT_FUNCTION divasfunc_init(int dbgm    213 int DIVA_INIT_FUNCTION divasfunc_init(int dbgmask)
214 {                                                 214 {
215         char *version;                            215         char *version;
216                                                   216 
217         debugmask = dbgmask;                      217         debugmask = dbgmask;
218                                                   218         
219         if (!connect_didd()) {                    219         if (!connect_didd()) {
220                 DBG_ERR(("divasfunc: failed to    220                 DBG_ERR(("divasfunc: failed to connect to DIDD."))
221                 return (0);                       221                 return (0);
222         }                                         222         }
223                                                   223 
224         version = diva_xdi_common_code_build;     224         version = diva_xdi_common_code_build;
225                                                   225 
226         divasa_xdi_driver_entry();                226         divasa_xdi_driver_entry();
227                                                   227 
228         return (1);                               228         return (1);
229 }                                                 229 }
230                                                   230 
231 /*                                                231 /*
232  * exit                                           232  * exit
233  */                                               233  */
234 void divasfunc_exit(void)                         234 void divasfunc_exit(void)
235 {                                                 235 {
236         divasa_xdi_driver_unload();               236         divasa_xdi_driver_unload();
237         disconnect_didd();                        237         disconnect_didd();
238 }                                                 238 }
239                                                   239 
  This page was automatically generated by the LXR engine.