include upstream ip1000a driver version 2.09f
[linux-2.4.git] / drivers / isdn / eicon / eicon.h
1 /* $Id: eicon.h,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
2  *
3  * ISDN low-level module for Eicon active ISDN-Cards.
4  *
5  * Copyright 1998       by Fritz Elfert (fritz@isdn4linux.de)
6  * Copyright 1998-2000  by Armin Schindler (mac@melware.de) 
7  * Copyright 1999,2000  Cytronics & Melware (info@melware.de)
8  *
9  * This software may be used and distributed according to the terms
10  * of the GNU General Public License, incorporated herein by reference.
11  *
12  */
13
14 #ifndef eicon_h
15 #define eicon_h
16
17 #define EICON_IOCTL_SETMMIO   0
18 #define EICON_IOCTL_GETMMIO   1
19 #define EICON_IOCTL_SETIRQ    2
20 #define EICON_IOCTL_GETIRQ    3
21 #define EICON_IOCTL_LOADBOOT  4
22 #define EICON_IOCTL_ADDCARD   5
23 #define EICON_IOCTL_GETTYPE   6
24 #define EICON_IOCTL_LOADPCI   7 
25 #define EICON_IOCTL_LOADISA   8 
26 #define EICON_IOCTL_GETVER    9 
27 #define EICON_IOCTL_GETXLOG  10 
28
29 #define EICON_IOCTL_MANIF    90 
30
31 #define EICON_IOCTL_FREEIT   97
32 #define EICON_IOCTL_TEST     98
33 #define EICON_IOCTL_DEBUGVAR 99
34
35 #define EICON_IOCTL_DIA_OFFSET  100
36
37 /* Bus types */
38 #define EICON_BUS_ISA          1
39 #define EICON_BUS_MCA          2
40 #define EICON_BUS_PCI          3
41
42 /* Constants for describing Card-Type */
43 #define EICON_CTYPE_S            0
44 #define EICON_CTYPE_SX           1
45 #define EICON_CTYPE_SCOM         2
46 #define EICON_CTYPE_QUADRO       3
47 #define EICON_CTYPE_S2M          4
48 #define EICON_CTYPE_MAESTRA      5
49 #define EICON_CTYPE_MAESTRAQ     6
50 #define EICON_CTYPE_MAESTRAQ_U   7
51 #define EICON_CTYPE_MAESTRAP     8
52 #define EICON_CTYPE_ISABRI       0x10
53 #define EICON_CTYPE_ISAPRI       0x20
54 #define EICON_CTYPE_MASK         0x0f
55 #define EICON_CTYPE_QUADRO_NR(n) (n<<4)
56
57 #define MAX_HEADER_LEN 10
58
59 #define MAX_STATUS_BUFFER       150
60
61 /* Struct for adding new cards */
62 typedef struct eicon_cdef {
63         int membase;
64         int irq;
65         char id[10];
66 } eicon_cdef;
67
68 #define EICON_ISA_BOOT_MEMCHK 1
69 #define EICON_ISA_BOOT_NORMAL 2
70
71 /* Struct for downloading protocol via ioctl for ISA cards */
72 /* same struct for downloading protocol via ioctl for MCA cards */
73 typedef struct {
74         /* start-up parameters */
75         unsigned char tei;
76         unsigned char nt2;
77         unsigned char skip1;
78         unsigned char WatchDog;
79         unsigned char Permanent;
80         unsigned char XInterface;
81         unsigned char StableL2;
82         unsigned char NoOrderCheck;
83         unsigned char HandsetType;
84         unsigned char skip2;
85         unsigned char LowChannel;
86         unsigned char ProtVersion;
87         unsigned char Crc4;
88         unsigned char Loopback;
89         unsigned char oad[32];
90         unsigned char osa[32];
91         unsigned char spid[32];
92         unsigned char boot_opt;
93         unsigned long bootstrap_len;
94         unsigned long firmware_len;
95         unsigned char code[1]; /* Rest (bootstrap- and firmware code) will be allocated */
96 } eicon_isa_codebuf;
97
98 /* Data for downloading protocol via ioctl */
99 typedef union {
100         eicon_isa_codebuf isa;
101         eicon_isa_codebuf mca;
102 } eicon_codebuf;
103
104 /* Data for Management interface */
105 typedef struct {
106         int count;
107         int pos;
108         int length[50];
109         unsigned char data[700]; 
110 } eicon_manifbuf;
111
112 #define TRACE_OK                 (1)
113
114 #ifdef __KERNEL__
115
116 /* Kernel includes */
117 #include <linux/config.h>
118 #include <linux/sched.h>
119 #include <linux/string.h>
120 #include <linux/tqueue.h>
121 #include <linux/interrupt.h>
122 #include <linux/skbuff.h>
123 #include <linux/errno.h>
124 #include <linux/fs.h>
125 #include <linux/major.h>
126 #include <asm/segment.h>
127 #include <asm/io.h>
128 #include <linux/kernel.h>
129 #include <linux/signal.h>
130 #include <linux/slab.h>
131 #include <linux/mm.h>
132 #include <linux/mman.h>
133 #include <linux/ioport.h>
134 #include <linux/timer.h>
135 #include <linux/wait.h>
136 #include <linux/delay.h>
137 #include <linux/ctype.h>
138 #include <linux/pci.h>
139
140 #include <linux/isdn.h>
141 #include <linux/isdnif.h>
142
143
144 typedef struct {
145   __u16 length __attribute__ ((packed)); /* length of data/parameter field */
146   __u8  P[1];                          /* data/parameter field */
147 } eicon_PBUFFER;
148
149 #include "eicon_isa.h"
150
151 #include "idi.h"
152
153 typedef struct {
154   __u16 NextReq  __attribute__ ((packed));  /* pointer to next Req Buffer */
155   __u16 NextRc   __attribute__ ((packed));  /* pointer to next Rc Buffer  */
156   __u16 NextInd  __attribute__ ((packed));  /* pointer to next Ind Buffer */
157   __u8 ReqInput;  /* number of Req Buffers sent */
158   __u8 ReqOutput; /* number of Req Buffers returned */
159   __u8 ReqReserved;/*number of Req Buffers reserved */
160   __u8 Int;       /* ISDN-P interrupt           */
161   __u8 XLock;     /* Lock field for arbitration */
162   __u8 RcOutput;  /* number of Rc buffers received */
163   __u8 IndOutput; /* number of Ind buffers received */
164   __u8 IMask;     /* Interrupt Mask Flag        */
165   __u8 Reserved1[2]; /* reserved field, do not use */
166   __u8 ReadyInt;  /* request field for ready int */
167   __u8 Reserved2[12]; /* reserved field, do not use */
168   __u8 InterfaceType; /* interface type 1=16K    */
169   __u16 Signature  __attribute__ ((packed));    /* ISDN-P initialized ind  */
170   __u8 B[1];                            /* buffer space for Req,Ind and Rc */
171 } eicon_pr_ram;
172
173 /* Macro for delay via schedule() */
174 #define SLEEP(j) {                     \
175   set_current_state(TASK_UNINTERRUPTIBLE); \
176   schedule_timeout(j);                 \
177 }
178
179 typedef struct {
180   __u8                  Req;            /* pending request          */
181   __u8                  Rc;             /* return code received     */
182   __u8                  Ind;            /* indication received      */
183   __u8                  ReqCh;          /* channel of current Req   */
184   __u8                  RcCh;           /* channel of current Rc    */
185   __u8                  IndCh;          /* channel of current Ind   */
186   __u8                  D3Id;           /* ID used by this entity   */
187   __u8                  B2Id;           /* ID used by this entity   */
188   __u8                  GlobalId;       /* reserved field           */
189   __u8                  XNum;           /* number of X-buffers      */
190   __u8                  RNum;           /* number of R-buffers      */
191   struct sk_buff_head   X;              /* X-buffer queue           */
192   struct sk_buff_head   R;              /* R-buffer queue           */
193   __u8                  RNR;            /* receive not ready flag   */
194   __u8                  complete;       /* receive complete status  */
195   __u8                  busy;           /* busy flag                */
196   __u16                 ref;            /* saved reference          */
197 } entity;
198
199 #define FAX_MAX_SCANLINE 256
200
201 typedef struct {
202         __u8            PrevObject;
203         __u8            NextObject;
204         __u8            abLine[FAX_MAX_SCANLINE];
205         __u8            abFrame[FAX_MAX_SCANLINE];
206         unsigned int    LineLen;
207         unsigned int    LineDataLen;
208         __u32           LineData;
209         unsigned int    NullBytesPos;
210         __u8            NullByteExist;
211         int             PageCount;
212         __u8            Dle;
213         __u8            Eop;
214 } eicon_ch_fax_buf;
215
216 typedef struct {
217         int            No;               /* Channel Number              */
218         unsigned short fsm_state;        /* Current D-Channel state     */
219         unsigned short statectrl;        /* State controling bits       */
220         unsigned short eazmask;          /* EAZ-Mask for this Channel   */
221         int             queued;          /* User-Data Bytes in TX queue */
222         int             pqueued;         /* User-Data Packets in TX queue */
223         int             waitq;           /* User-Data Bytes in wait queue */
224         int             waitpq;          /* User-Data Bytes in packet queue */
225         struct sk_buff *tskb1;           /* temp skb 1                  */
226         struct sk_buff *tskb2;           /* temp skb 2                  */
227         unsigned char  l2prot;           /* Layer 2 protocol            */
228         unsigned char  l3prot;           /* Layer 3 protocol            */
229 #ifdef CONFIG_ISDN_TTY_FAX
230         T30_s           *fax;            /* pointer to fax data in LL   */
231         eicon_ch_fax_buf fax2;           /* fax related struct          */
232 #endif
233         entity          e;               /* Native Entity               */
234         ENTITY          de;              /* Divas D Entity              */
235         ENTITY          be;              /* Divas B Entity              */
236         char            cpn[32];         /* remember cpn                */
237         char            oad[32];         /* remember oad                */
238         char            dsa[32];         /* remember dsa                */
239         char            osa[32];         /* remember osa                */
240         unsigned char   cause[2];        /* Last Cause                  */
241         unsigned char   si1;
242         unsigned char   si2;
243         unsigned char   plan;
244         unsigned char   screen;
245 } eicon_chan;
246
247 typedef struct {
248         eicon_chan *ptr;
249 } eicon_chan_ptr;
250
251 #include "eicon_pci.h"
252
253 #define EICON_FLAGS_RUNNING  1 /* Cards driver activated */
254 #define EICON_FLAGS_PVALID   2 /* Cards port is valid    */
255 #define EICON_FLAGS_IVALID   4 /* Cards irq is valid     */
256 #define EICON_FLAGS_MVALID   8 /* Cards membase is valid */
257 #define EICON_FLAGS_LOADED   8 /* Firmware loaded        */
258
259 /* D-Channel states */
260 #define EICON_STATE_NULL     0
261 #define EICON_STATE_ICALL    1
262 #define EICON_STATE_OCALL    2
263 #define EICON_STATE_IWAIT    3
264 #define EICON_STATE_OWAIT    4
265 #define EICON_STATE_IBWAIT   5
266 #define EICON_STATE_OBWAIT   6
267 #define EICON_STATE_BWAIT    7
268 #define EICON_STATE_BHWAIT   8
269 #define EICON_STATE_BHWAIT2  9
270 #define EICON_STATE_DHWAIT  10
271 #define EICON_STATE_DHWAIT2 11
272 #define EICON_STATE_BSETUP  12
273 #define EICON_STATE_ACTIVE  13
274 #define EICON_STATE_ICALLW  14
275 #define EICON_STATE_LISTEN  15
276 #define EICON_STATE_WMCONN  16
277
278 #define EICON_MAX_QUEUE  2138
279
280 typedef union {
281         eicon_isa_card isa;
282         eicon_pci_card pci;
283         eicon_isa_card mca;
284 } eicon_hwif;
285
286 typedef struct {
287         __u8 ret;
288         __u8 id;
289         __u8 ch;
290 } eicon_ack;
291
292 typedef struct {
293         __u8 code;
294         __u8 id;
295         __u8 ch;
296 } eicon_req;
297
298 typedef struct {
299         __u8 ret;
300         __u8 id;
301         __u8 ch;
302         __u8 more;
303 } eicon_indhdr;
304
305 /*
306  * Per card driver data
307  */
308 typedef struct eicon_card {
309         eicon_hwif hwif;                 /* Hardware dependant interface     */
310         DESCRIPTOR *d;                   /* IDI Descriptor                   */
311         u_char ptype;                    /* Protocol type (1TR6 or Euro)     */
312         u_char bus;                      /* Bustype (ISA, MCA, PCI)          */
313         u_char type;                     /* Cardtype (EICON_CTYPE_...)       */
314         struct eicon_card *qnext;        /* Pointer to next quadro adapter   */
315         int Feature;                     /* Protocol Feature Value           */
316         struct eicon_card *next;         /* Pointer to next device struct    */
317         int myid;                        /* Driver-Nr. assigned by linklevel */
318         unsigned long flags;             /* Statusflags                      */
319         struct sk_buff_head rcvq;        /* Receive-Message queue            */
320         struct sk_buff_head sndq;        /* Send-Message queue               */
321         struct sk_buff_head rackq;       /* Req-Ack-Message queue            */
322         struct sk_buff_head sackq;       /* Data-Ack-Message queue           */
323         struct sk_buff_head statq;       /* Status-Message queue             */
324         int statq_entries;
325         struct tq_struct snd_tq;         /* Task struct for xmit bh          */
326         struct tq_struct rcv_tq;         /* Task struct for rcv bh           */
327         struct tq_struct ack_tq;         /* Task struct for ack bh           */
328         eicon_chan*     IdTable[256];    /* Table to find entity   */
329         __u16  ref_in;
330         __u16  ref_out;
331         int    nchannels;                /* Number of B-Channels             */
332         int    ReadyInt;                 /* Ready Interrupt                  */
333         eicon_chan *bch;                 /* B-Channel status/control         */
334         DBUFFER *dbuf;                   /* Dbuffer for Diva Server          */
335         BUFFERS *sbuf;                   /* Buffer for Diva Server           */
336         char *sbufp;                     /* Data Buffer for Diva Server      */
337         isdn_if interface;               /* Interface to upper layer         */
338         char regname[35];                /* Drivers card name                */
339 #ifdef CONFIG_MCA
340         int     mca_slot;                /* # of cards MCA slot              */
341         int     mca_io;                  /* MCA cards IO port                */
342 #endif /* CONFIG_MCA */
343 } eicon_card;
344
345 #include "eicon_idi.h"
346
347 extern char *eicon_ctype_name[];
348
349
350 static inline void eicon_schedule_tx(eicon_card *card)
351 {
352         queue_task(&card->snd_tq, &tq_immediate);
353         mark_bh(IMMEDIATE_BH);
354 }
355
356 static inline void eicon_schedule_rx(eicon_card *card)
357 {
358         queue_task(&card->rcv_tq, &tq_immediate);
359         mark_bh(IMMEDIATE_BH);
360 }
361
362 static inline void eicon_schedule_ack(eicon_card *card)
363 {
364         queue_task(&card->ack_tq, &tq_immediate);
365         mark_bh(IMMEDIATE_BH);
366 }
367
368 extern int eicon_addcard(int, int, int, char *, int);
369 extern void eicon_io_transmit(eicon_card *card);
370 extern void eicon_irq(int irq, void *dev_id, struct pt_regs *regs);
371 extern void eicon_io_rcv_dispatch(eicon_card *ccard);
372 extern void eicon_io_ack_dispatch(eicon_card *ccard);
373 #ifdef CONFIG_MCA
374 extern int eicon_mca_find_card(int, int, int, char *);
375 extern int eicon_mca_probe(int, int, int, int, char *);
376 extern int eicon_info(char *, int , void *);
377 #endif /* CONFIG_MCA */
378
379 extern ulong DebugVar;
380 extern void eicon_log(eicon_card * card, int level, const char *fmt, ...);
381 extern void eicon_putstatus(eicon_card * card, char * buf);
382
383 extern spinlock_t eicon_lock;
384
385 #endif  /* __KERNEL__ */
386
387 #endif  /* eicon_h */