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
eicon_schedule_tx(eicon_card * card)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
eicon_schedule_rx(eicon_card * card)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
eicon_schedule_ack(eicon_card * card)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 */
388