Linux Audio

Check our new training course

Embedded Linux Audio

Check our new training course
with Creative Commons CC-BY-SA
lecture materials

Bootlin logo

Elixir Cross Referencer

Loading...
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
/* $Id: eicon.h,v 1.19 2000/01/23 21:21:23 armin Exp $
 *
 * ISDN low-level module for Eicon active ISDN-Cards.
 *
 * Copyright 1998    by Fritz Elfert (fritz@isdn4linux.de)
 * Copyright 1998-2000  by Armin Schindler (mac@melware.de) 
 * Copyright 1999,2000  Cytronics & Melware (info@melware.de)
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 
 *
 * $Log: eicon.h,v $
 * Revision 1.19  2000/01/23 21:21:23  armin
 * Added new trace capability and some updates.
 * DIVA Server BRI now supports data for ISDNLOG.
 *
 * Revision 1.18  1999/11/25 11:43:27  armin
 * Fixed statectrl and connect message.
 * X.75 fix and HDLC/transparent with autoconnect.
 * Minor cleanup.
 *
 * Revision 1.17  1999/10/26 21:15:33  armin
 * using define for checking phone number len to avoid buffer overflow.
 *
 * Revision 1.16  1999/10/08 22:09:33  armin
 * Some fixes of cards interface handling.
 * Bugfix of NULL pointer occurence.
 * Changed a few log outputs.
 *
 * Revision 1.15  1999/09/26 14:17:53  armin
 * Improved debug and log via readstat()
 *
 * Revision 1.14  1999/09/08 20:17:31  armin
 * Added microchannel patch from Erik Weber.
 *
 * Revision 1.13  1999/09/06 07:29:35  fritz
 * Changed my mail-address.
 *
 * Revision 1.12  1999/09/04 06:20:05  keil
 * Changes from kernel set_current_state()
 *
 * Revision 1.11  1999/08/29 17:23:44  armin
 * New setup compat.
 * Bugfix if compile as not module.
 *
 * Revision 1.10  1999/08/22 20:26:41  calle
 * backported changes from kernel 2.3.14:
 * - several #include "config.h" gone, others come.
 * - "struct device" changed to "struct net_device" in 2.3.14, added a
 *   define in isdn_compat.h for older kernel versions.
 *
 * Revision 1.9  1999/08/18 20:16:57  armin
 * Added XLOG function for all cards.
 * Bugfix of alloc_skb NULL pointer.
 *
 * Revision 1.8  1999/07/25 15:12:01  armin
 * fix of some debug logs.
 * enabled ISA-cards option.
 *
 * Revision 1.7  1999/07/11 17:16:23  armin
 * Bugfixes in queue handling.
 * Added DSP-DTMF decoder functions.
 * Reorganized ack_handler.
 *
 * Revision 1.6  1999/06/09 19:31:24  armin
 * Wrong PLX size for request_region() corrected.
 * Added first MCA code from Erik Weber.
 *
 * Revision 1.5  1999/03/29 11:19:41  armin
 * I/O stuff now in seperate file (eicon_io.c)
 * Old ISA type cards (S,SX,SCOM,Quadro,S2M) implemented.
 *
 * Revision 1.4  1999/03/02 12:37:42  armin
 * Added some important checks.
 * Analog Modem with DSP.
 * Channels will be added to Link-Level after loading firmware.
 *
 * Revision 1.3  1999/01/24 20:14:07  armin
 * Changed and added debug stuff.
 * Better data sending. (still problems with tty's flip buffer)
 *
 * Revision 1.2  1999/01/10 18:46:04  armin
 * Bug with wrong values in HLC fixed.
 * Bytes to send are counted and limited now.
 *
 * Revision 1.1  1999/01/01 18:09:41  armin
 * First checkin of new eicon driver.
 * DIVA-Server BRI/PCI and PRI/PCI are supported.
 * Old diehl code is obsolete.
 *
 *
 */


#ifndef eicon_h
#define eicon_h

#define EICON_IOCTL_SETMMIO   0
#define EICON_IOCTL_GETMMIO   1
#define EICON_IOCTL_SETIRQ    2
#define EICON_IOCTL_GETIRQ    3
#define EICON_IOCTL_LOADBOOT  4
#define EICON_IOCTL_ADDCARD   5
#define EICON_IOCTL_GETTYPE   6
#define EICON_IOCTL_LOADPCI   7 
#define EICON_IOCTL_LOADISA   8 
#define EICON_IOCTL_GETVER    9 
#define EICON_IOCTL_GETXLOG  10 

#define EICON_IOCTL_MANIF    90 

#define EICON_IOCTL_FREEIT   97
#define EICON_IOCTL_TEST     98
#define EICON_IOCTL_DEBUGVAR 99

/* Bus types */
#define EICON_BUS_ISA          1
#define EICON_BUS_MCA          2
#define EICON_BUS_PCI          3

/* Constants for describing Card-Type */
#define EICON_CTYPE_S            0
#define EICON_CTYPE_SX           1
#define EICON_CTYPE_SCOM         2
#define EICON_CTYPE_QUADRO       3
#define EICON_CTYPE_S2M          4
#define EICON_CTYPE_MAESTRA      5
#define EICON_CTYPE_MAESTRAQ     6
#define EICON_CTYPE_MAESTRAQ_U   7
#define EICON_CTYPE_MAESTRAP     8
#define EICON_CTYPE_ISABRI       0x10
#define EICON_CTYPE_ISAPRI       0x20
#define EICON_CTYPE_MASK         0x0f
#define EICON_CTYPE_QUADRO_NR(n) (n<<4)

#define MAX_HEADER_LEN 10

#define MAX_STATUS_BUFFER	150

/* Struct for adding new cards */
typedef struct eicon_cdef {
        int membase;
        int irq;
        char id[10];
} eicon_cdef;

#define EICON_ISA_BOOT_MEMCHK 1
#define EICON_ISA_BOOT_NORMAL 2

/* Struct for downloading protocol via ioctl for ISA cards */
/* same struct for downloading protocol via ioctl for MCA cards */
typedef struct {
	/* start-up parameters */
	unsigned char tei;
	unsigned char nt2;
	unsigned char skip1;
	unsigned char WatchDog;
	unsigned char Permanent;
	unsigned char XInterface;
	unsigned char StableL2;
	unsigned char NoOrderCheck;
	unsigned char HandsetType;
	unsigned char skip2;
	unsigned char LowChannel;
	unsigned char ProtVersion;
	unsigned char Crc4;
	unsigned char Loopback;
	unsigned char oad[32];
	unsigned char osa[32];
	unsigned char spid[32];
	unsigned char boot_opt;
	unsigned long bootstrap_len;
	unsigned long firmware_len;
	unsigned char code[1]; /* Rest (bootstrap- and firmware code) will be allocated */
} eicon_isa_codebuf;

/* Struct for downloading protocol via ioctl for PCI cards */
typedef struct {
        /* start-up parameters */
        unsigned char tei;
        unsigned char nt2;
        unsigned char WatchDog;
        unsigned char Permanent;
        unsigned char XInterface;
        unsigned char StableL2;
        unsigned char NoOrderCheck;
        unsigned char HandsetType;
        unsigned char LowChannel;
        unsigned char ProtVersion;
        unsigned char Crc4;
        unsigned char NoHscx30Mode;  /* switch PRI into No HSCX30 test mode */
        unsigned char Loopback;      /* switch card into Loopback mode */
        struct q931_link_s
        {
          unsigned char oad[32];
          unsigned char osa[32];
          unsigned char spid[32];
        } l[2];
        unsigned long protocol_len;
	unsigned int  dsp_code_num;
        unsigned long dsp_code_len[9];
        unsigned char code[1]; /* Rest (protocol- and dsp code) will be allocated */
} eicon_pci_codebuf;

/* Data for downloading protocol via ioctl */
typedef union {
	eicon_isa_codebuf isa;
	eicon_isa_codebuf mca;
	eicon_pci_codebuf pci;
} eicon_codebuf;

/* Data for Management interface */
typedef struct {
	int count;
	int pos;
	int length[50];
	unsigned char data[700]; 
} eicon_manifbuf;


#ifdef __KERNEL__

/* Kernel includes */
#include <linux/config.h>
#include <linux/sched.h>
#include <linux/string.h>
#include <linux/tqueue.h>
#include <linux/interrupt.h>
#include <linux/skbuff.h>
#include <linux/errno.h>
#include <linux/fs.h>
#include <linux/major.h>
#include <asm/segment.h>
#include <asm/io.h>
#include <linux/kernel.h>
#include <linux/signal.h>
#include <linux/malloc.h>
#include <linux/mm.h>
#include <linux/mman.h>
#include <linux/ioport.h>
#include <linux/timer.h>
#include <linux/wait.h>
#include <linux/delay.h>
#include <linux/ctype.h>

#include <linux/isdn.h>
#include <linux/isdnif.h>


typedef struct {
  __u16 length __attribute__ ((packed)); /* length of data/parameter field */
  __u8  P[1];                          /* data/parameter field */
} eicon_PBUFFER;

#include "eicon_isa.h"

/* Macro for delay via schedule() */
#define SLEEP(j) {                     \
  set_current_state(TASK_UNINTERRUPTIBLE); \
  schedule_timeout(j);                 \
}

#endif /* KERNEL */

#define DIVAS_SHARED_OFFSET	(0x1000)

#define MIPS_BUFFER_SZ  128
#define MIPS_MAINT_OFFS 0xff00

#define XLOG_ERR_CARD_NUM       (13)
#define XLOG_ERR_DONE           (14)
#define XLOG_ERR_CMD            (15)
#define XLOG_ERR_TIMEOUT        (16)
#define XLOG_ERR_CARD_STATE     (17)
#define XLOG_ERR_UNKNOWN        (18)
#define XLOG_OK                  (0)

#define TRACE_OK                 (1)

typedef struct {
  __u8 Id	__attribute__ ((packed));
  __u8 uX	__attribute__ ((packed));
  __u8 listen	__attribute__ ((packed));
  __u8 active	__attribute__ ((packed));
  __u8 sin[3]	__attribute__ ((packed));
  __u8 bc[6]	__attribute__ ((packed));
  __u8 llc[6]	__attribute__ ((packed));
  __u8 hlc[6]	__attribute__ ((packed));
  __u8 oad[20]	__attribute__ ((packed));
}DSigStruc;

typedef struct {
  __u32 cx_b1	__attribute__ ((packed));
  __u32 cx_b2	__attribute__ ((packed));
  __u32 cr_b1	__attribute__ ((packed));
  __u32 cr_b2	__attribute__ ((packed));
  __u32 px_b1	__attribute__ ((packed));
  __u32 px_b2	__attribute__ ((packed));
  __u32 pr_b1	__attribute__ ((packed));
  __u32 pr_b2	__attribute__ ((packed));
  __u16 er_b1	__attribute__ ((packed));
  __u16 er_b2	__attribute__ ((packed));
}BL1Struc;

typedef struct {
  __u32 XTotal	__attribute__ ((packed));
  __u32 RTotal	__attribute__ ((packed));
  __u16 XError	__attribute__ ((packed));
  __u16 RError	__attribute__ ((packed));
}L2Struc;

typedef struct {
  __u16 free_n;
}OSStruc;

typedef union
{
  DSigStruc DSigStats;
  BL1Struc BL1Stats;
  L2Struc L2Stats;
  OSStruc OSStats;
  __u8   b[MIPS_BUFFER_SZ];
  __u16   w[MIPS_BUFFER_SZ>>1];
  __u16   l[MIPS_BUFFER_SZ>>2]; /* word is wrong, do not use! Use 'd' instead. */
  __u32  d[MIPS_BUFFER_SZ>>2];
} MIPS_BUFFER;

typedef struct
{
  __u8 req	__attribute__ ((packed));
  __u8 rc	__attribute__ ((packed));
  __u8 reserved[2]	__attribute__ ((packed));     /* R3000 alignment ... */
  __u8 *mem	__attribute__ ((packed));
  __u16 length	__attribute__ ((packed));		/* used to be short */
  __u16 port	__attribute__ ((packed));
  __u8 fill[4]	__attribute__ ((packed));         /* data at offset 16   */
  MIPS_BUFFER data	__attribute__ ((packed));
} mi_pc_maint_t;

typedef struct
{
        __u16 command;
        mi_pc_maint_t pcm;
}xlogreq_t;

typedef struct{
        __u16 code	__attribute__ ((packed));	/* used to be short */
        __u16 timeh	__attribute__ ((packed));
        __u16 timel	__attribute__ ((packed));
        char buffer[MIPS_BUFFER_SZ - 6];
}xlog_entry_t;


#define DSP_COMBIFILE_FORMAT_IDENTIFICATION_SIZE 48
#define DSP_COMBIFILE_FORMAT_VERSION_BCD    0x0100

#define DSP_FILE_FORMAT_IDENTIFICATION_SIZE 48
#define DSP_FILE_FORMAT_VERSION_BCD         0x0100

typedef struct tag_dsp_combifile_header
{
  char                  format_identification[DSP_COMBIFILE_FORMAT_IDENTIFICATION_SIZE] __attribute__ ((packed));
  __u16                  format_version_bcd             __attribute__ ((packed));
  __u16                  header_size                    __attribute__ ((packed));
  __u16                  combifile_description_size     __attribute__ ((packed));
  __u16                  directory_entries              __attribute__ ((packed));
  __u16                  directory_size                 __attribute__ ((packed));
  __u16                  download_count                 __attribute__ ((packed));
  __u16                  usage_mask_size                __attribute__ ((packed));
} t_dsp_combifile_header;

typedef struct tag_dsp_combifile_directory_entry
{
  __u16                  card_type_number               __attribute__ ((packed));
  __u16                  file_set_number                __attribute__ ((packed));
} t_dsp_combifile_directory_entry;

typedef struct tag_dsp_file_header
{
  char                  format_identification[DSP_FILE_FORMAT_IDENTIFICATION_SIZE] __attribute__ ((packed));
  __u16                 format_version_bcd              __attribute__ ((packed));
  __u16                 download_id                     __attribute__ ((packed));
  __u16                 download_flags                  __attribute__ ((packed));
  __u16                 required_processing_power       __attribute__ ((packed));
  __u16                 interface_channel_count         __attribute__ ((packed));
  __u16                 header_size                     __attribute__ ((packed));
  __u16                 download_description_size       __attribute__ ((packed));
  __u16                 memory_block_table_size         __attribute__ ((packed));
  __u16                 memory_block_count              __attribute__ ((packed));
  __u16                 segment_table_size              __attribute__ ((packed));
  __u16                 segment_count                   __attribute__ ((packed));
  __u16                 symbol_table_size               __attribute__ ((packed));
  __u16                 symbol_count                    __attribute__ ((packed));
  __u16                 total_data_size_dm              __attribute__ ((packed));
  __u16                 data_block_count_dm             __attribute__ ((packed));
  __u16                 total_data_size_pm              __attribute__ ((packed));
  __u16                 data_block_count_pm             __attribute__ ((packed));
} t_dsp_file_header;

typedef struct tag_dsp_memory_block_desc
{
  __u16                 alias_memory_block;
  __u16                 memory_type;
  __u16                 address;
  __u16                 size;             /* DSP words */
} t_dsp_memory_block_desc;

typedef struct tag_dsp_segment_desc
{
  __u16                 memory_block;
  __u16                 attributes;
  __u16                 base;
  __u16                 size;
  __u16                 alignment;        /* ==0 -> no other legal start address than base */
} t_dsp_segment_desc;

typedef struct tag_dsp_symbol_desc
{
  __u16                 symbol_id;
  __u16                 segment;
  __u16                 offset;
  __u16                 size;             /* DSP words */
} t_dsp_symbol_desc;

typedef struct tag_dsp_data_block_header
{
  __u16                 attributes;
  __u16                 segment;
  __u16                 offset;
  __u16                 size;             /* DSP words */
} t_dsp_data_block_header;

typedef struct tag_dsp_download_desc      /* be sure to keep native alignment for MAESTRA's */
{
  __u16                 download_id;
  __u16                 download_flags;
  __u16                 required_processing_power;
  __u16                 interface_channel_count;
  __u16                 excess_header_size;
  __u16                 memory_block_count;
  __u16                 segment_count;
  __u16                 symbol_count;
  __u16                 data_block_count_dm;
  __u16                 data_block_count_pm;
  __u8  *            p_excess_header_data               __attribute__ ((packed));
  char  *            p_download_description             __attribute__ ((packed));
  t_dsp_memory_block_desc  *p_memory_block_table        __attribute__ ((packed));
  t_dsp_segment_desc  *p_segment_table                  __attribute__ ((packed));
  t_dsp_symbol_desc  *p_symbol_table                    __attribute__ ((packed));
  __u16 *            p_data_blocks_dm                   __attribute__ ((packed));
  __u16 *            p_data_blocks_pm                   __attribute__ ((packed));
} t_dsp_download_desc;


#ifdef __KERNEL__

typedef struct {
  __u8                  Req;            /* pending request          */
  __u8                  Rc;             /* return code received     */
  __u8                  Ind;            /* indication received      */
  __u8                  ReqCh;          /* channel of current Req   */
  __u8                  RcCh;           /* channel of current Rc    */
  __u8                  IndCh;          /* channel of current Ind   */
  __u8                  D3Id;           /* ID used by this entity   */
  __u8                  B2Id;           /* ID used by this entity   */
  __u8                  GlobalId;       /* reserved field           */
  __u8                  XNum;           /* number of X-buffers      */
  __u8                  RNum;           /* number of R-buffers      */
  struct sk_buff_head   X;              /* X-buffer queue           */
  struct sk_buff_head   R;              /* R-buffer queue           */
  __u8                  RNR;            /* receive not ready flag   */
  __u8                  complete;       /* receive complete status  */
  __u8                  busy;           /* busy flag                */
  __u16                 ref;            /* saved reference          */
} entity;

#define FAX_MAX_SCANLINE 256

typedef struct {
	__u8		PrevObject;
	__u8		NextObject;
	__u8		abLine[FAX_MAX_SCANLINE];
	__u8		abFrame[FAX_MAX_SCANLINE];
	unsigned int	LineLen;
	unsigned int	LineDataLen;
	__u32		LineData;
	unsigned int	NullBytesPos;
	__u8		NullByteExist;
	int		PageCount;
	__u8		Dle;
	__u8		Eop;
} eicon_ch_fax_buf;

typedef struct {
	int	       No;		 /* Channel Number	        */
	unsigned short fsm_state;        /* Current D-Channel state     */
	unsigned short statectrl;	 /* State controling bits	*/
	unsigned short eazmask;          /* EAZ-Mask for this Channel   */
	int		queued;          /* User-Data Bytes in TX queue */
	int		waitq;           /* User-Data Bytes in wait queue */
	int		waitpq;          /* User-Data Bytes in packet queue */
	struct sk_buff *tskb1;           /* temp skb 1			*/
	struct sk_buff *tskb2;           /* temp skb 2			*/
	unsigned char  l2prot;           /* Layer 2 protocol            */
	unsigned char  l3prot;           /* Layer 3 protocol            */
#ifdef CONFIG_ISDN_TTY_FAX
	T30_s		*fax;		 /* pointer to fax data in LL	*/
	eicon_ch_fax_buf fax2;		 /* fax related struct		*/
#endif
	entity		e;		 /* Entity  			*/
	char		cpn[32];	 /* remember cpn		*/
	char		oad[32];	 /* remember oad		*/
	char		dsa[32];	 /* remember dsa		*/
	char		osa[32];	 /* remember osa		*/
	unsigned char   cause[2];	 /* Last Cause			*/
	unsigned char	si1;
	unsigned char	si2;
	unsigned char	plan;
	unsigned char	screen;
} eicon_chan;

typedef struct {
	eicon_chan *ptr;
} eicon_chan_ptr;

#include "eicon_pci.h"

#define EICON_FLAGS_RUNNING  1 /* Cards driver activated */
#define EICON_FLAGS_PVALID   2 /* Cards port is valid    */
#define EICON_FLAGS_IVALID   4 /* Cards irq is valid     */
#define EICON_FLAGS_MVALID   8 /* Cards membase is valid */
#define EICON_FLAGS_LOADED   8 /* Firmware loaded        */

#define EICON_BCH            2 /* # of channels per card */

/* D-Channel states */
#define EICON_STATE_NULL     0
#define EICON_STATE_ICALL    1
#define EICON_STATE_OCALL    2
#define EICON_STATE_IWAIT    3
#define EICON_STATE_OWAIT    4
#define EICON_STATE_IBWAIT   5
#define EICON_STATE_OBWAIT   6
#define EICON_STATE_BWAIT    7
#define EICON_STATE_BHWAIT   8
#define EICON_STATE_BHWAIT2  9
#define EICON_STATE_DHWAIT  10
#define EICON_STATE_DHWAIT2 11
#define EICON_STATE_BSETUP  12
#define EICON_STATE_ACTIVE  13
#define EICON_STATE_ICALLW  14
#define EICON_STATE_LISTEN  15
#define EICON_STATE_WMCONN  16

#define EICON_MAX_QUEUE  2138

#define EICON_LOCK_TX 0
#define EICON_LOCK_RX 1

typedef union {
	eicon_isa_card isa;
	eicon_pci_card pci;
	eicon_isa_card mca;
} eicon_hwif;

typedef struct {
	__u8 ret;
	__u8 id;
	__u8 ch;
} eicon_ack;

typedef struct {
	__u8 code;
	__u8 id;
	__u8 ch;
} eicon_req;

typedef struct {
	__u8 ret;
	__u8 id;
	__u8 ch;
	__u8 more;
} eicon_indhdr;

typedef struct msn_entry {
	char eaz;
        char msn[16];
        struct msn_entry * next;
} msn_entry;

/*
 * Per card driver data
 */
typedef struct eicon_card {
	eicon_hwif hwif;                 /* Hardware dependant interface     */
        u_char ptype;                    /* Protocol type (1TR6 or Euro)     */
        u_char bus;                      /* Bustype (ISA, MCA, PCI)          */
        u_char type;                     /* Cardtype (EICON_CTYPE_...)       */
	struct eicon_card *qnext;  	 /* Pointer to next quadro adapter   */
        int Feature;                     /* Protocol Feature Value           */
        struct eicon_card *next;	 /* Pointer to next device struct    */
        int myid;                        /* Driver-Nr. assigned by linklevel */
        unsigned long flags;             /* Statusflags                      */
	struct sk_buff_head rcvq;        /* Receive-Message queue            */
	struct sk_buff_head sndq;        /* Send-Message queue               */
	struct sk_buff_head rackq;       /* Req-Ack-Message queue            */
	struct sk_buff_head sackq;       /* Data-Ack-Message queue           */
	struct sk_buff_head statq;       /* Status-Message queue             */
	int statq_entries;
	struct tq_struct snd_tq;         /* Task struct for xmit bh          */
	struct tq_struct rcv_tq;         /* Task struct for rcv bh           */
	struct tq_struct ack_tq;         /* Task struct for ack bh           */
	msn_entry *msn_list;
	eicon_chan*	IdTable[256];	 /* Table to find entity   */
	__u16  ref_in;
	__u16  ref_out;
	int    nchannels;                /* Number of B-Channels             */
	int    ReadyInt;		 /* Ready Interrupt		     */
	eicon_chan *bch;                 /* B-Channel status/control         */
	char   status_buf[256];          /* Buffer for status messages       */
	char   *status_buf_read;
	char   *status_buf_write;
	char   *status_buf_end;
        isdn_if interface;               /* Interface to upper layer         */
        char regname[35];                /* Name used for request_region     */
#ifdef CONFIG_MCA
        int	mca_slot;	 	 /* # of cards MCA slot              */
	int	mca_io;			 /* MCA cards IO port		     */
#endif /* CONFIG_MCA */
} eicon_card;

/* -----------------------------------------------------------**
** The PROTOCOL_FEATURE_STRING                                **
** defines capabilities and                                   **
** features of the actual protocol code. It's used as a bit   **
** mask.                                                      **
** The following Bits are defined:                            **
** -----------------------------------------------------------*/
#define PROTCAP_TELINDUS  0x0001  /* Telindus Variant of protocol code   */
#define PROTCAP_MANIF     0x0002  /* Management interface implemented    */
#define PROTCAP_V_42      0x0004  /* V42 implemented                     */
#define PROTCAP_V90D      0x0008  /* V.90D (implies up to 384k DSP code) */
#define PROTCAP_EXTD_FAX  0x0010  /* Extended FAX (ECM, 2D, T6, Polling) */
#define PROTCAP_FREE4     0x0020  /* not used                            */
#define PROTCAP_FREE5     0x0040  /* not used                            */
#define PROTCAP_FREE6     0x0080  /* not used                            */
#define PROTCAP_FREE7     0x0100  /* not used                            */
#define PROTCAP_FREE8     0x0200  /* not used                            */
#define PROTCAP_FREE9     0x0400  /* not used                            */
#define PROTCAP_FREE10    0x0800  /* not used                            */
#define PROTCAP_FREE11    0x1000  /* not used                            */
#define PROTCAP_FREE12    0x2000  /* not used                            */
#define PROTCAP_FREE13    0x4000  /* not used                            */
#define PROTCAP_EXTENSION 0x8000  /* used for future extentions          */

#include "eicon_idi.h"

extern eicon_card *cards;
extern char *eicon_ctype_name[];


extern __inline__ void eicon_schedule_tx(eicon_card *card)
{
        queue_task(&card->snd_tq, &tq_immediate);
        mark_bh(IMMEDIATE_BH);
}

extern __inline__ void eicon_schedule_rx(eicon_card *card)
{
        queue_task(&card->rcv_tq, &tq_immediate);
        mark_bh(IMMEDIATE_BH);
}

extern __inline__ void eicon_schedule_ack(eicon_card *card)
{
        queue_task(&card->ack_tq, &tq_immediate);
        mark_bh(IMMEDIATE_BH);
}

extern char *eicon_find_eaz(eicon_card *, char);
extern int eicon_addcard(int, int, int, char *);
extern void eicon_io_transmit(eicon_card *card);
extern void eicon_irq(int irq, void *dev_id, struct pt_regs *regs);
extern void eicon_io_rcv_dispatch(eicon_card *ccard);
extern void eicon_io_ack_dispatch(eicon_card *ccard);
extern int eicon_get_xlog(eicon_card *card, xlogreq_t *xlogreq);
#ifdef CONFIG_MCA
extern int eicon_mca_find_card(int, int, int, char *);
extern int eicon_mca_probe(int, int, int, int, char *);
extern int eicon_info(char *, int , void *);
#endif /* CONFIG_MCA */

extern ulong DebugVar;
extern void eicon_log(eicon_card * card, int level, const char *fmt, ...);
extern void eicon_putstatus(eicon_card * card, char * buf);

#endif  /* __KERNEL__ */

#endif	/* eicon_h */