Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / drivers / isdn / hisax / hisax.h
diff --git a/kernel/drivers/isdn/hisax/hisax.h b/kernel/drivers/isdn/hisax/hisax.h
new file mode 100644 (file)
index 0000000..6ead631
--- /dev/null
@@ -0,0 +1,1352 @@
+/* $Id: hisax.h,v 2.64.2.4 2004/02/11 13:21:33 keil Exp $
+ *
+ * Basic declarations, defines and prototypes
+ *
+ * This software may be used and distributed according to the terms
+ * of the GNU General Public License, incorporated herein by reference.
+ *
+ */
+#include <linux/errno.h>
+#include <linux/fs.h>
+#include <linux/major.h>
+#include <asm/io.h>
+#include <linux/delay.h>
+#include <linux/kernel.h>
+#include <linux/signal.h>
+#include <linux/slab.h>
+#include <linux/mm.h>
+#include <linux/mman.h>
+#include <linux/interrupt.h>
+#include <linux/ioport.h>
+#include <linux/timer.h>
+#include <linux/wait.h>
+#include <linux/isdnif.h>
+#include <linux/tty.h>
+#include <linux/serial_reg.h>
+#include <linux/netdevice.h>
+
+#define ERROR_STATISTIC
+
+#define REQUEST                0
+#define CONFIRM                1
+#define INDICATION     2
+#define RESPONSE       3
+
+#define HW_ENABLE      0x0000
+#define HW_RESET       0x0004
+#define HW_POWERUP     0x0008
+#define HW_ACTIVATE    0x0010
+#define HW_DEACTIVATE  0x0018
+
+#define HW_INFO1       0x0010
+#define HW_INFO2       0x0020
+#define HW_INFO3       0x0030
+#define HW_INFO4       0x0040
+#define HW_INFO4_P8    0x0040
+#define HW_INFO4_P10   0x0048
+#define HW_RSYNC       0x0060
+#define HW_TESTLOOP    0x0070
+#define CARD_RESET     0x00F0
+#define CARD_INIT      0x00F2
+#define CARD_RELEASE   0x00F3
+#define CARD_TEST      0x00F4
+#define CARD_AUX_IND   0x00F5
+
+#define PH_ACTIVATE    0x0100
+#define PH_DEACTIVATE  0x0110
+#define PH_DATA                0x0120
+#define PH_PULL                0x0130
+#define PH_TESTLOOP    0x0140
+#define PH_PAUSE       0x0150
+#define MPH_ACTIVATE   0x0180
+#define MPH_DEACTIVATE 0x0190
+#define MPH_INFORMATION        0x01A0
+
+#define DL_ESTABLISH   0x0200
+#define DL_RELEASE     0x0210
+#define DL_DATA                0x0220
+#define DL_FLUSH       0x0224
+#define DL_UNIT_DATA   0x0230
+
+#define MDL_BC_RELEASE  0x0278  // Formula-n enter:now
+#define MDL_BC_ASSIGN   0x027C  // Formula-n enter:now
+#define MDL_ASSIGN     0x0280
+#define MDL_REMOVE     0x0284
+#define MDL_ERROR      0x0288
+#define MDL_INFO_SETUP 0x02E0
+#define MDL_INFO_CONN  0x02E4
+#define MDL_INFO_REL   0x02E8
+
+#define CC_SETUP       0x0300
+#define CC_RESUME      0x0304
+#define CC_MORE_INFO   0x0310
+#define CC_IGNORE      0x0320
+#define CC_REJECT      0x0324
+#define CC_SETUP_COMPL 0x0330
+#define CC_PROCEEDING  0x0340
+#define CC_ALERTING    0x0344
+#define CC_PROGRESS    0x0348
+#define CC_CONNECT     0x0350
+#define CC_CHARGE      0x0354
+#define CC_NOTIFY      0x0358
+#define CC_DISCONNECT  0x0360
+#define CC_RELEASE     0x0368
+#define CC_SUSPEND     0x0370
+#define CC_PROCEED_SEND 0x0374
+#define CC_REDIR        0x0378
+#define CC_T302                0x0382
+#define CC_T303                0x0383
+#define CC_T304                0x0384
+#define CC_T305                0x0385
+#define CC_T308_1      0x0388
+#define CC_T308_2      0x038A
+#define CC_T309         0x0309
+#define CC_T310                0x0390
+#define CC_T313                0x0393
+#define CC_T318                0x0398
+#define CC_T319                0x0399
+#define CC_TSPID       0x03A0
+#define CC_NOSETUP_RSP 0x03E0
+#define CC_SETUP_ERR   0x03E1
+#define CC_SUSPEND_ERR 0x03E2
+#define CC_RESUME_ERR  0x03E3
+#define CC_CONNECT_ERR 0x03E4
+#define CC_RELEASE_ERR 0x03E5
+#define CC_RESTART     0x03F4
+#define CC_TDSS1_IO     0x13F4    /* DSS1 IO user timer */
+#define CC_TNI1_IO      0x13F5    /* NI1 IO user timer */
+
+/* define maximum number of possible waiting incoming calls */
+#define MAX_WAITING_CALLS 2
+
+
+#ifdef __KERNEL__
+
+extern const char *CardType[];
+extern int nrcards;
+
+extern const char *l1_revision;
+extern const char *l2_revision;
+extern const char *l3_revision;
+extern const char *lli_revision;
+extern const char *tei_revision;
+
+/* include l3dss1 & ni1 specific process structures, but no other defines */
+#ifdef CONFIG_HISAX_EURO
+#define l3dss1_process
+#include "l3dss1.h"
+#undef  l3dss1_process
+#endif /* CONFIG_HISAX_EURO */
+
+#ifdef CONFIG_HISAX_NI1
+#define l3ni1_process
+#include "l3ni1.h"
+#undef  l3ni1_process
+#endif /* CONFIG_HISAX_NI1 */
+
+#define MAX_DFRAME_LEN 260
+#define MAX_DFRAME_LEN_L1      300
+#define HSCX_BUFMAX    4096
+#define MAX_DATA_SIZE  (HSCX_BUFMAX - 4)
+#define MAX_DATA_MEM   (HSCX_BUFMAX + 64)
+#define RAW_BUFMAX     (((HSCX_BUFMAX * 6) / 5) + 5)
+#define MAX_HEADER_LEN 4
+#define MAX_WINDOW     8
+#define MAX_MON_FRAME  32
+#define MAX_DLOG_SPACE 2048
+#define MAX_BLOG_SPACE 256
+
+/* #define I4L_IRQ_FLAG SA_INTERRUPT */
+#define I4L_IRQ_FLAG    0
+
+/*
+ * Statemachine
+ */
+
+struct FsmInst;
+
+typedef void (*FSMFNPTR)(struct FsmInst *, int, void *);
+
+struct Fsm {
+       FSMFNPTR *jumpmatrix;
+       int state_count, event_count;
+       char **strEvent, **strState;
+};
+
+struct FsmInst {
+       struct Fsm *fsm;
+       int state;
+       int debug;
+       void *userdata;
+       int userint;
+       void (*printdebug) (struct FsmInst *, char *, ...);
+};
+
+struct FsmNode {
+       int state, event;
+       void (*routine) (struct FsmInst *, int, void *);
+};
+
+struct FsmTimer {
+       struct FsmInst *fi;
+       struct timer_list tl;
+       int event;
+       void *arg;
+};
+
+struct L3Timer {
+       struct l3_process *pc;
+       struct timer_list tl;
+       int event;
+};
+
+#define FLG_L1_ACTIVATING      1
+#define FLG_L1_ACTIVATED       2
+#define FLG_L1_DEACTTIMER      3
+#define FLG_L1_ACTTIMER                4
+#define FLG_L1_T3RUN           5
+#define FLG_L1_PULL_REQ                6
+#define FLG_L1_UINT            7
+
+struct Layer1 {
+       void *hardware;
+       struct BCState *bcs;
+       struct PStack **stlistp;
+       unsigned long Flags;
+       struct FsmInst l1m;
+       struct FsmTimer timer;
+       void (*l1l2) (struct PStack *, int, void *);
+       void (*l1hw) (struct PStack *, int, void *);
+       void (*l1tei) (struct PStack *, int, void *);
+       int mode, bc;
+       int delay;
+};
+
+#define GROUP_TEI      127
+#define TEI_SAPI       63
+#define CTRL_SAPI      0
+#define PACKET_NOACK   7
+
+/* Layer2 Flags */
+
+#define FLG_LAPB       0
+#define FLG_LAPD       1
+#define FLG_ORIG       2
+#define FLG_MOD128     3
+#define FLG_PEND_REL   4
+#define FLG_L3_INIT    5
+#define FLG_T200_RUN   6
+#define FLG_ACK_PEND   7
+#define FLG_REJEXC     8
+#define FLG_OWN_BUSY   9
+#define FLG_PEER_BUSY  10
+#define FLG_DCHAN_BUSY 11
+#define FLG_L1_ACTIV   12
+#define FLG_ESTAB_PEND 13
+#define FLG_PTP                14
+#define FLG_FIXED_TEI  15
+#define FLG_L2BLOCK    16
+
+struct Layer2 {
+       int tei;
+       int sap;
+       int maxlen;
+       u_long flag;
+       spinlock_t lock;
+       u_int vs, va, vr;
+       int rc;
+       unsigned int window;
+       unsigned int sow;
+       struct sk_buff *windowar[MAX_WINDOW];
+       struct sk_buff_head i_queue;
+       struct sk_buff_head ui_queue;
+       void (*l2l1) (struct PStack *, int, void *);
+       void (*l2l3) (struct PStack *, int, void *);
+       void (*l2tei) (struct PStack *, int, void *);
+       struct FsmInst l2m;
+       struct FsmTimer t200, t203;
+       int T200, N200, T203;
+       int debug;
+       char debug_id[16];
+};
+
+struct Layer3 {
+       void (*l3l4) (struct PStack *, int, void *);
+       void (*l3ml3) (struct PStack *, int, void *);
+       void (*l3l2) (struct PStack *, int, void *);
+       struct FsmInst l3m;
+       struct FsmTimer l3m_timer;
+       struct sk_buff_head squeue;
+       struct l3_process *proc;
+       struct l3_process *global;
+       int N303;
+       int debug;
+       char debug_id[8];
+};
+
+struct LLInterface {
+       void (*l4l3) (struct PStack *, int, void *);
+       int  (*l4l3_proto) (struct PStack *, isdn_ctrl *);
+       void *userdata;
+       u_long flag;
+};
+
+#define        FLG_LLI_L1WAKEUP        1
+#define        FLG_LLI_L2WAKEUP        2
+
+struct Management {
+       int     ri;
+       struct FsmInst tei_m;
+       struct FsmTimer t202;
+       int T202, N202, debug;
+       void (*layer) (struct PStack *, int, void *);
+};
+
+#define NO_CAUSE 254
+
+struct Param {
+       u_char cause;
+       u_char loc;
+       u_char diag[6];
+       int bchannel;
+       int chargeinfo;
+       int spv;                /* SPV Flag */
+       setup_parm setup;       /* from isdnif.h numbers and Serviceindicator */
+       u_char moderate;        /* transfer mode and rate (bearer octet 4) */
+};
+
+
+struct PStack {
+       struct PStack *next;
+       struct Layer1 l1;
+       struct Layer2 l2;
+       struct Layer3 l3;
+       struct LLInterface lli;
+       struct Management ma;
+       int protocol;           /* EDSS1, 1TR6 or NI1 */
+
+       /* protocol specific data fields */
+       union
+       { u_char uuuu; /* only as dummy */
+#ifdef CONFIG_HISAX_EURO
+               dss1_stk_priv dss1; /* private dss1 data */
+#endif /* CONFIG_HISAX_EURO */
+#ifdef CONFIG_HISAX_NI1
+               ni1_stk_priv ni1; /* private ni1 data */
+#endif /* CONFIG_HISAX_NI1 */
+       } prot;
+};
+
+struct l3_process {
+       int callref;
+       int state;
+       struct L3Timer timer;
+       int N303;
+       int debug;
+       struct Param para;
+       struct Channel *chan;
+       struct PStack *st;
+       struct l3_process *next;
+       ulong redir_result;
+
+       /* protocol specific data fields */
+       union
+       { u_char uuuu; /* only when euro not defined, avoiding empty union */
+#ifdef CONFIG_HISAX_EURO
+               dss1_proc_priv dss1; /* private dss1 data */
+#endif /* CONFIG_HISAX_EURO */
+#ifdef CONFIG_HISAX_NI1
+               ni1_proc_priv ni1; /* private ni1 data */
+#endif /* CONFIG_HISAX_NI1 */
+       } prot;
+};
+
+struct hscx_hw {
+       int hscx;
+       int rcvidx;
+       int count;              /* Current skb sent count */
+       u_char *rcvbuf;         /* B-Channel receive Buffer */
+       u_char tsaxr0;
+       u_char tsaxr1;
+};
+
+struct w6692B_hw {
+       int bchan;
+       int rcvidx;
+       int count;              /* Current skb sent count */
+       u_char *rcvbuf;         /* B-Channel receive Buffer */
+};
+
+struct isar_reg {
+       unsigned long Flags;
+       volatile u_char bstat;
+       volatile u_char iis;
+       volatile u_char cmsb;
+       volatile u_char clsb;
+       volatile u_char par[8];
+};
+
+struct isar_hw {
+       int dpath;
+       int rcvidx;
+       int txcnt;
+       int mml;
+       u_char state;
+       u_char cmd;
+       u_char mod;
+       u_char newcmd;
+       u_char newmod;
+       char try_mod;
+       struct timer_list ftimer;
+       u_char *rcvbuf;         /* B-Channel receive Buffer */
+       u_char conmsg[16];
+       struct isar_reg *reg;
+};
+
+struct hdlc_stat_reg {
+#ifdef __BIG_ENDIAN
+       u_char fill;
+       u_char mode;
+       u_char xml;
+       u_char cmd;
+#else
+       u_char cmd;
+       u_char xml;
+       u_char mode;
+       u_char fill;
+#endif
+} __attribute__((packed));
+
+struct hdlc_hw {
+       union {
+               u_int ctrl;
+               struct hdlc_stat_reg sr;
+       } ctrl;
+       u_int stat;
+       int rcvidx;
+       int count;              /* Current skb sent count */
+       u_char *rcvbuf;         /* B-Channel receive Buffer */
+};
+
+struct hfcB_hw {
+       unsigned int *send;
+       int f1;
+       int f2;
+};
+
+struct tiger_hw {
+       u_int *send;
+       u_int *s_irq;
+       u_int *s_end;
+       u_int *sendp;
+       u_int *rec;
+       int free;
+       u_char *rcvbuf;
+       u_char *sendbuf;
+       u_char *sp;
+       int sendcnt;
+       u_int s_tot;
+       u_int r_bitcnt;
+       u_int r_tot;
+       u_int r_err;
+       u_int r_fcs;
+       u_char r_state;
+       u_char r_one;
+       u_char r_val;
+       u_char s_state;
+};
+
+struct amd7930_hw {
+       u_char *tx_buff;
+       u_char *rv_buff;
+       int rv_buff_in;
+       int rv_buff_out;
+       struct sk_buff *rv_skb;
+       struct hdlc_state *hdlc_state;
+       struct work_struct tq_rcv;
+       struct work_struct tq_xmt;
+};
+
+#define BC_FLG_INIT    1
+#define BC_FLG_ACTIV   2
+#define BC_FLG_BUSY    3
+#define BC_FLG_NOFRAME 4
+#define BC_FLG_HALF    5
+#define BC_FLG_EMPTY   6
+#define BC_FLG_ORIG    7
+#define BC_FLG_DLEETX  8
+#define BC_FLG_LASTDLE 9
+#define BC_FLG_FIRST   10
+#define BC_FLG_LASTDATA        11
+#define BC_FLG_NMD_DATA        12
+#define BC_FLG_FTI_RUN 13
+#define BC_FLG_LL_OK   14
+#define BC_FLG_LL_CONN 15
+#define BC_FLG_FTI_FTS 16
+#define BC_FLG_FRH_WAIT        17
+
+#define L1_MODE_NULL   0
+#define L1_MODE_TRANS  1
+#define L1_MODE_HDLC   2
+#define L1_MODE_EXTRN  3
+#define L1_MODE_HDLC_56K 4
+#define L1_MODE_MODEM  7
+#define L1_MODE_V32    8
+#define L1_MODE_FAX    9
+
+struct BCState {
+       int channel;
+       int mode;
+       u_long Flag;
+       struct IsdnCardState *cs;
+       int tx_cnt;             /* B-Channel transmit counter */
+       struct sk_buff *tx_skb; /* B-Channel transmit Buffer */
+       struct sk_buff_head rqueue;     /* B-Channel receive Queue */
+       struct sk_buff_head squeue;     /* B-Channel send Queue */
+       int ackcnt;
+       spinlock_t aclock;
+       struct PStack *st;
+       u_char *blog;
+       u_char *conmsg;
+       struct timer_list transbusy;
+       struct work_struct tqueue;
+       u_long event;
+       int  (*BC_SetStack) (struct PStack *, struct BCState *);
+       void (*BC_Close) (struct BCState *);
+#ifdef ERROR_STATISTIC
+       int err_crc;
+       int err_tx;
+       int err_rdo;
+       int err_inv;
+#endif
+       union {
+               struct hscx_hw hscx;
+               struct hdlc_hw hdlc;
+               struct isar_hw isar;
+               struct hfcB_hw hfc;
+               struct tiger_hw tiger;
+               struct amd7930_hw  amd7930;
+               struct w6692B_hw w6692;
+               struct hisax_b_if *b_if;
+       } hw;
+};
+
+struct Channel {
+       struct PStack *b_st, *d_st;
+       struct IsdnCardState *cs;
+       struct BCState *bcs;
+       int chan;
+       int incoming;
+       struct FsmInst fi;
+       struct FsmTimer drel_timer, dial_timer;
+       int debug;
+       int l2_protocol, l2_active_protocol;
+       int l3_protocol;
+       int data_open;
+       struct l3_process *proc;
+       setup_parm setup;       /* from isdnif.h numbers and Serviceindicator */
+       u_long Flags;           /* for remembering action done in l4 */
+       int leased;
+};
+
+struct elsa_hw {
+       struct pci_dev *dev;
+       unsigned long base;
+       unsigned int cfg;
+       unsigned int ctrl;
+       unsigned int ale;
+       unsigned int isac;
+       unsigned int itac;
+       unsigned int hscx;
+       unsigned int trig;
+       unsigned int timer;
+       unsigned int counter;
+       unsigned int status;
+       struct timer_list tl;
+       unsigned int MFlag;
+       struct BCState *bcs;
+       u_char *transbuf;
+       u_char *rcvbuf;
+       unsigned int transp;
+       unsigned int rcvp;
+       unsigned int transcnt;
+       unsigned int rcvcnt;
+       u_char IER;
+       u_char FCR;
+       u_char LCR;
+       u_char MCR;
+       u_char ctrl_reg;
+};
+
+struct teles3_hw {
+       unsigned int cfg_reg;
+       signed   int isac;
+       signed   int hscx[2];
+       signed   int isacfifo;
+       signed   int hscxfifo[2];
+};
+
+struct teles0_hw {
+       unsigned int cfg_reg;
+       void __iomem *membase;
+       unsigned long phymem;
+};
+
+struct avm_hw {
+       unsigned int cfg_reg;
+       unsigned int isac;
+       unsigned int hscx[2];
+       unsigned int isacfifo;
+       unsigned int hscxfifo[2];
+       unsigned int counter;
+       struct pci_dev *dev;
+};
+
+struct ix1_hw {
+       unsigned int cfg_reg;
+       unsigned int isac_ale;
+       unsigned int isac;
+       unsigned int hscx_ale;
+       unsigned int hscx;
+};
+
+struct diva_hw {
+       unsigned long cfg_reg;
+       unsigned long pci_cfg;
+       unsigned int ctrl;
+       unsigned long isac_adr;
+       unsigned int isac;
+       unsigned long hscx_adr;
+       unsigned int hscx;
+       unsigned int status;
+       struct timer_list tl;
+       u_char ctrl_reg;
+       struct pci_dev *dev;
+};
+
+struct asus_hw {
+       unsigned int cfg_reg;
+       unsigned int adr;
+       unsigned int isac;
+       unsigned int hscx;
+       unsigned int u7;
+       unsigned int pots;
+};
+
+
+struct hfc_hw {
+       unsigned int addr;
+       unsigned int fifosize;
+       unsigned char cirm;
+       unsigned char ctmt;
+       unsigned char cip;
+       u_char isac_spcr;
+       struct timer_list timer;
+};
+
+struct sedl_hw {
+       unsigned int cfg_reg;
+       unsigned int adr;
+       unsigned int isac;
+       unsigned int hscx;
+       unsigned int reset_on;
+       unsigned int reset_off;
+       struct isar_reg isar;
+       unsigned int chip;
+       unsigned int bus;
+       struct pci_dev *dev;
+};
+
+struct spt_hw {
+       unsigned int cfg_reg;
+       unsigned int isac;
+       unsigned int hscx[2];
+       unsigned char res_irq;
+};
+
+struct mic_hw {
+       unsigned int cfg_reg;
+       unsigned int adr;
+       unsigned int isac;
+       unsigned int hscx;
+};
+
+struct njet_hw {
+       unsigned long base;
+       unsigned int isac;
+       unsigned int auxa;
+       unsigned char auxd;
+       unsigned char dmactrl;
+       unsigned char ctrl_reg;
+       unsigned char irqmask0;
+       unsigned char irqstat0;
+       unsigned char last_is0;
+       struct pci_dev *dev;
+};
+
+struct hfcPCI_hw {
+       unsigned char cirm;
+       unsigned char ctmt;
+       unsigned char conn;
+       unsigned char mst_m;
+       unsigned char int_m1;
+       unsigned char int_m2;
+       unsigned char int_s1;
+       unsigned char sctrl;
+       unsigned char sctrl_r;
+       unsigned char sctrl_e;
+       unsigned char trm;
+       unsigned char stat;
+       unsigned char fifo;
+       unsigned char fifo_en;
+       unsigned char bswapped;
+       unsigned char nt_mode;
+       int nt_timer;
+       struct pci_dev *dev;
+       unsigned char *pci_io; /* start of PCI IO memory */
+       dma_addr_t dma; /* dma handle for Fifos */
+       void *fifos; /* FIFO memory */
+       int last_bfifo_cnt[2]; /* marker saving last b-fifo frame count */
+       struct timer_list timer;
+};
+
+struct hfcSX_hw {
+       unsigned long base;
+       unsigned char cirm;
+       unsigned char ctmt;
+       unsigned char conn;
+       unsigned char mst_m;
+       unsigned char int_m1;
+       unsigned char int_m2;
+       unsigned char int_s1;
+       unsigned char sctrl;
+       unsigned char sctrl_r;
+       unsigned char sctrl_e;
+       unsigned char trm;
+       unsigned char stat;
+       unsigned char fifo;
+       unsigned char bswapped;
+       unsigned char nt_mode;
+       unsigned char chip;
+       int b_fifo_size;
+       unsigned char last_fifo;
+       void *extra;
+       int nt_timer;
+       struct timer_list timer;
+};
+
+struct hfcD_hw {
+       unsigned int addr;
+       unsigned int bfifosize;
+       unsigned int dfifosize;
+       unsigned char cirm;
+       unsigned char ctmt;
+       unsigned char cip;
+       unsigned char conn;
+       unsigned char mst_m;
+       unsigned char int_m1;
+       unsigned char int_m2;
+       unsigned char int_s1;
+       unsigned char sctrl;
+       unsigned char stat;
+       unsigned char fifo;
+       unsigned char f1;
+       unsigned char f2;
+       unsigned int *send;
+       struct timer_list timer;
+};
+
+struct isurf_hw {
+       unsigned int reset;
+       unsigned long phymem;
+       void __iomem *isac;
+       void __iomem *isar;
+       struct isar_reg isar_r;
+};
+
+struct saphir_hw {
+       struct pci_dev *dev;
+       unsigned int cfg_reg;
+       unsigned int ale;
+       unsigned int isac;
+       unsigned int hscx;
+       struct timer_list timer;
+};
+
+struct bkm_hw {
+       struct pci_dev *dev;
+       unsigned long base;
+       /* A4T stuff */
+       unsigned long isac_adr;
+       unsigned int isac_ale;
+       unsigned long jade_adr;
+       unsigned int jade_ale;
+       /* Scitel Quadro stuff */
+       unsigned long plx_adr;
+       unsigned long data_adr;
+};
+
+struct gazel_hw {
+       struct pci_dev *dev;
+       unsigned int cfg_reg;
+       unsigned int pciaddr[2];
+       signed   int ipac;
+       signed   int isac;
+       signed   int hscx[2];
+       signed   int isacfifo;
+       signed   int hscxfifo[2];
+       unsigned char timeslot;
+       unsigned char iom2;
+};
+
+struct w6692_hw {
+       struct pci_dev *dev;
+       unsigned int iobase;
+       struct timer_list timer;
+};
+
+struct arcofi_msg {
+       struct arcofi_msg *next;
+       u_char receive;
+       u_char len;
+       u_char msg[10];
+};
+
+struct isac_chip {
+       int ph_state;
+       u_char *mon_tx;
+       u_char *mon_rx;
+       int mon_txp;
+       int mon_txc;
+       int mon_rxp;
+       struct arcofi_msg *arcofi_list;
+       struct timer_list arcofitimer;
+       wait_queue_head_t arcofi_wait;
+       u_char arcofi_bc;
+       u_char arcofi_state;
+       u_char mocr;
+       u_char adf2;
+};
+
+struct hfcd_chip {
+       int ph_state;
+};
+
+struct hfcpci_chip {
+       int ph_state;
+};
+
+struct hfcsx_chip {
+       int ph_state;
+};
+
+struct w6692_chip {
+       int ph_state;
+};
+
+struct amd7930_chip {
+       u_char lmr1;
+       u_char ph_state;
+       u_char old_state;
+       u_char flg_t3;
+       unsigned int tx_xmtlen;
+       struct timer_list timer3;
+       void (*ph_command) (struct IsdnCardState *, u_char, char *);
+       void (*setIrqMask) (struct IsdnCardState *, u_char);
+};
+
+struct icc_chip {
+       int ph_state;
+       u_char *mon_tx;
+       u_char *mon_rx;
+       int mon_txp;
+       int mon_txc;
+       int mon_rxp;
+       struct arcofi_msg *arcofi_list;
+       struct timer_list arcofitimer;
+       wait_queue_head_t arcofi_wait;
+       u_char arcofi_bc;
+       u_char arcofi_state;
+       u_char mocr;
+       u_char adf2;
+};
+
+#define HW_IOM1                        0
+#define HW_IPAC                        1
+#define HW_ISAR                        2
+#define HW_ARCOFI              3
+#define FLG_TWO_DCHAN          4
+#define FLG_L1_DBUSY           5
+#define FLG_DBUSY_TIMER                6
+#define FLG_LOCK_ATOMIC                7
+#define FLG_ARCOFI_TIMER       8
+#define FLG_ARCOFI_ERROR       9
+#define FLG_HW_L1_UINT         10
+
+struct IsdnCardState {
+       spinlock_t      lock;
+       u_char          typ;
+       u_char          subtyp;
+       int             protocol;
+       u_int           irq;
+       u_long          irq_flags;
+       u_long          HW_Flags;
+       int             *busy_flag;
+       int             chanlimit; /* limited number of B-chans to use */
+       int             logecho; /* log echo if supported by card */
+       union {
+               struct elsa_hw elsa;
+               struct teles0_hw teles0;
+               struct teles3_hw teles3;
+               struct avm_hw avm;
+               struct ix1_hw ix1;
+               struct diva_hw diva;
+               struct asus_hw asus;
+               struct hfc_hw hfc;
+               struct sedl_hw sedl;
+               struct spt_hw spt;
+               struct mic_hw mic;
+               struct njet_hw njet;
+               struct hfcD_hw hfcD;
+               struct hfcPCI_hw hfcpci;
+               struct hfcSX_hw hfcsx;
+               struct ix1_hw niccy;
+               struct isurf_hw isurf;
+               struct saphir_hw saphir;
+               struct bkm_hw ax;
+               struct gazel_hw gazel;
+               struct w6692_hw w6692;
+               struct hisax_d_if *hisax_d_if;
+       } hw;
+       int             myid;
+       isdn_if         iif;
+       spinlock_t      statlock;
+       u_char          *status_buf;
+       u_char          *status_read;
+       u_char          *status_write;
+       u_char          *status_end;
+       u_char          (*readisac) (struct IsdnCardState *, u_char);
+       void            (*writeisac) (struct IsdnCardState *, u_char, u_char);
+       void            (*readisacfifo) (struct IsdnCardState *, u_char *, int);
+       void            (*writeisacfifo) (struct IsdnCardState *, u_char *, int);
+       u_char          (*BC_Read_Reg) (struct IsdnCardState *, int, u_char);
+       void            (*BC_Write_Reg) (struct IsdnCardState *, int, u_char, u_char);
+       void            (*BC_Send_Data) (struct BCState *);
+       int             (*cardmsg) (struct IsdnCardState *, int, void *);
+       void            (*setstack_d) (struct PStack *, struct IsdnCardState *);
+       void            (*DC_Close) (struct IsdnCardState *);
+       irq_handler_t   irq_func;
+       int             (*auxcmd) (struct IsdnCardState *, isdn_ctrl *);
+       struct Channel  channel[2 + MAX_WAITING_CALLS];
+       struct BCState  bcs[2 + MAX_WAITING_CALLS];
+       struct PStack   *stlist;
+       struct sk_buff_head rq, sq; /* D-channel queues */
+       int             cardnr;
+       char            *dlog;
+       int             debug;
+       union {
+               struct isac_chip isac;
+               struct hfcd_chip hfcd;
+               struct hfcpci_chip hfcpci;
+               struct hfcsx_chip hfcsx;
+               struct w6692_chip w6692;
+               struct amd7930_chip amd7930;
+               struct icc_chip icc;
+       } dc;
+       u_char          *rcvbuf;
+       int             rcvidx;
+       struct sk_buff  *tx_skb;
+       int             tx_cnt;
+       u_long          event;
+       struct work_struct tqueue;
+       struct timer_list dbusytimer;
+       unsigned int    irq_cnt;
+#ifdef ERROR_STATISTIC
+       int             err_crc;
+       int             err_tx;
+       int             err_rx;
+#endif
+};
+
+
+#define schedule_event(s, ev)  do { test_and_set_bit(ev, &s->event); schedule_work(&s->tqueue); } while (0)
+
+#define  MON0_RX       1
+#define  MON1_RX       2
+#define  MON0_TX       4
+#define  MON1_TX       8
+
+
+#ifdef ISDN_CHIP_ISAC
+#undef ISDN_CHIP_ISAC
+#endif
+
+#ifdef CONFIG_HISAX_16_0
+#define  CARD_TELES0 1
+#ifndef ISDN_CHIP_ISAC
+#define ISDN_CHIP_ISAC 1
+#endif
+#else
+#define  CARD_TELES0  0
+#endif
+
+#ifdef CONFIG_HISAX_16_3
+#define  CARD_TELES3 1
+#ifndef ISDN_CHIP_ISAC
+#define ISDN_CHIP_ISAC 1
+#endif
+#else
+#define  CARD_TELES3  0
+#endif
+
+#ifdef CONFIG_HISAX_TELESPCI
+#define  CARD_TELESPCI 1
+#ifndef ISDN_CHIP_ISAC
+#define ISDN_CHIP_ISAC 1
+#endif
+#else
+#define  CARD_TELESPCI  0
+#endif
+
+#ifdef CONFIG_HISAX_AVM_A1
+#define  CARD_AVM_A1 1
+#ifndef ISDN_CHIP_ISAC
+#define ISDN_CHIP_ISAC 1
+#endif
+#else
+#define  CARD_AVM_A1  0
+#endif
+
+#ifdef CONFIG_HISAX_AVM_A1_PCMCIA
+#define  CARD_AVM_A1_PCMCIA 1
+#ifndef ISDN_CHIP_ISAC
+#define ISDN_CHIP_ISAC 1
+#endif
+#else
+#define  CARD_AVM_A1_PCMCIA  0
+#endif
+
+#ifdef CONFIG_HISAX_FRITZPCI
+#define  CARD_FRITZPCI 1
+#ifndef ISDN_CHIP_ISAC
+#define ISDN_CHIP_ISAC 1
+#endif
+#else
+#define  CARD_FRITZPCI  0
+#endif
+
+#ifdef CONFIG_HISAX_ELSA
+#define  CARD_ELSA 1
+#ifndef ISDN_CHIP_ISAC
+#define ISDN_CHIP_ISAC 1
+#endif
+#else
+#define  CARD_ELSA  0
+#endif
+
+#ifdef CONFIG_HISAX_IX1MICROR2
+#define        CARD_IX1MICROR2 1
+#ifndef ISDN_CHIP_ISAC
+#define ISDN_CHIP_ISAC 1
+#endif
+#else
+#define CARD_IX1MICROR2 0
+#endif
+
+#ifdef CONFIG_HISAX_DIEHLDIVA
+#define CARD_DIEHLDIVA 1
+#ifndef ISDN_CHIP_ISAC
+#define ISDN_CHIP_ISAC 1
+#endif
+#else
+#define CARD_DIEHLDIVA 0
+#endif
+
+#ifdef CONFIG_HISAX_ASUSCOM
+#define CARD_ASUSCOM 1
+#ifndef ISDN_CHIP_ISAC
+#define ISDN_CHIP_ISAC 1
+#endif
+#else
+#define CARD_ASUSCOM 0
+#endif
+
+#ifdef CONFIG_HISAX_TELEINT
+#define CARD_TELEINT 1
+#ifndef ISDN_CHIP_ISAC
+#define ISDN_CHIP_ISAC 1
+#endif
+#else
+#define CARD_TELEINT 0
+#endif
+
+#ifdef CONFIG_HISAX_SEDLBAUER
+#define CARD_SEDLBAUER 1
+#ifndef ISDN_CHIP_ISAC
+#define ISDN_CHIP_ISAC 1
+#endif
+#else
+#define CARD_SEDLBAUER 0
+#endif
+
+#ifdef CONFIG_HISAX_SPORTSTER
+#define CARD_SPORTSTER 1
+#ifndef ISDN_CHIP_ISAC
+#define ISDN_CHIP_ISAC 1
+#endif
+#else
+#define CARD_SPORTSTER 0
+#endif
+
+#ifdef CONFIG_HISAX_MIC
+#define CARD_MIC 1
+#ifndef ISDN_CHIP_ISAC
+#define ISDN_CHIP_ISAC 1
+#endif
+#else
+#define CARD_MIC 0
+#endif
+
+#ifdef CONFIG_HISAX_NETJET
+#define CARD_NETJET_S 1
+#ifndef ISDN_CHIP_ISAC
+#define ISDN_CHIP_ISAC 1
+#endif
+#else
+#define CARD_NETJET_S 0
+#endif
+
+#ifdef CONFIG_HISAX_HFCS
+#define  CARD_HFCS 1
+#else
+#define  CARD_HFCS 0
+#endif
+
+#ifdef CONFIG_HISAX_HFC_PCI
+#define  CARD_HFC_PCI 1
+#else
+#define  CARD_HFC_PCI 0
+#endif
+
+#ifdef CONFIG_HISAX_HFC_SX
+#define  CARD_HFC_SX 1
+#else
+#define  CARD_HFC_SX 0
+#endif
+
+#ifdef CONFIG_HISAX_NICCY
+#define        CARD_NICCY 1
+#ifndef ISDN_CHIP_ISAC
+#define ISDN_CHIP_ISAC 1
+#endif
+#else
+#define CARD_NICCY 0
+#endif
+
+#ifdef CONFIG_HISAX_ISURF
+#define        CARD_ISURF 1
+#ifndef ISDN_CHIP_ISAC
+#define ISDN_CHIP_ISAC 1
+#endif
+#else
+#define CARD_ISURF 0
+#endif
+
+#ifdef CONFIG_HISAX_S0BOX
+#define        CARD_S0BOX 1
+#ifndef ISDN_CHIP_ISAC
+#define ISDN_CHIP_ISAC 1
+#endif
+#else
+#define CARD_S0BOX 0
+#endif
+
+#ifdef CONFIG_HISAX_HSTSAPHIR
+#define        CARD_HSTSAPHIR 1
+#ifndef ISDN_CHIP_ISAC
+#define ISDN_CHIP_ISAC 1
+#endif
+#else
+#define CARD_HSTSAPHIR 0
+#endif
+
+#ifdef CONFIG_HISAX_BKM_A4T
+#define        CARD_BKM_A4T 1
+#ifndef ISDN_CHIP_ISAC
+#define ISDN_CHIP_ISAC 1
+#endif
+#else
+#define CARD_BKM_A4T 0
+#endif
+
+#ifdef CONFIG_HISAX_SCT_QUADRO
+#define        CARD_SCT_QUADRO 1
+#ifndef ISDN_CHIP_ISAC
+#define ISDN_CHIP_ISAC 1
+#endif
+#else
+#define CARD_SCT_QUADRO 0
+#endif
+
+#ifdef CONFIG_HISAX_GAZEL
+#define  CARD_GAZEL 1
+#ifndef ISDN_CHIP_ISAC
+#define ISDN_CHIP_ISAC 1
+#endif
+#else
+#define  CARD_GAZEL  0
+#endif
+
+#ifdef CONFIG_HISAX_W6692
+#define        CARD_W6692      1
+#ifndef        ISDN_CHIP_W6692
+#define        ISDN_CHIP_W6692 1
+#endif
+#else
+#define        CARD_W6692      0
+#endif
+
+#ifdef CONFIG_HISAX_NETJET_U
+#define CARD_NETJET_U 1
+#ifndef ISDN_CHIP_ICC
+#define ISDN_CHIP_ICC 1
+#endif
+#ifndef HISAX_UINTERFACE
+#define HISAX_UINTERFACE 1
+#endif
+#else
+#define CARD_NETJET_U 0
+#endif
+
+#ifdef CONFIG_HISAX_ENTERNOW_PCI
+#define CARD_FN_ENTERNOW_PCI 1
+#else
+#define CARD_FN_ENTERNOW_PCI 0
+#endif
+
+#define TEI_PER_CARD 1
+
+/* L1 Debug */
+#define        L1_DEB_WARN             0x01
+#define        L1_DEB_INTSTAT          0x02
+#define        L1_DEB_ISAC             0x04
+#define        L1_DEB_ISAC_FIFO        0x08
+#define        L1_DEB_HSCX             0x10
+#define        L1_DEB_HSCX_FIFO        0x20
+#define        L1_DEB_LAPD             0x40
+#define        L1_DEB_IPAC             0x80
+#define        L1_DEB_RECEIVE_FRAME    0x100
+#define L1_DEB_MONITOR         0x200
+#define DEB_DLOG_HEX           0x400
+#define DEB_DLOG_VERBOSE       0x800
+
+#define L2FRAME_DEBUG
+
+#ifdef L2FRAME_DEBUG
+extern void Logl2Frame(struct IsdnCardState *cs, struct sk_buff *skb, char *buf, int dir);
+#endif
+
+#include "hisax_cfg.h"
+
+void init_bcstate(struct IsdnCardState *cs, int bc);
+
+void setstack_HiSax(struct PStack *st, struct IsdnCardState *cs);
+void HiSax_addlist(struct IsdnCardState *sp, struct PStack *st);
+void HiSax_rmlist(struct IsdnCardState *sp, struct PStack *st);
+
+void setstack_l1_B(struct PStack *st);
+
+void setstack_tei(struct PStack *st);
+void setstack_manager(struct PStack *st);
+
+void setstack_isdnl2(struct PStack *st, char *debug_id);
+void releasestack_isdnl2(struct PStack *st);
+void setstack_transl2(struct PStack *st);
+void releasestack_transl2(struct PStack *st);
+void lli_writewakeup(struct PStack *st, int len);
+
+void setstack_l3dc(struct PStack *st, struct Channel *chanp);
+void setstack_l3bc(struct PStack *st, struct Channel *chanp);
+void releasestack_isdnl3(struct PStack *st);
+
+u_char *findie(u_char *p, int size, u_char ie, int wanted_set);
+int getcallref(u_char *p);
+int newcallref(void);
+
+int FsmNew(struct Fsm *fsm, struct FsmNode *fnlist, int fncount);
+void FsmFree(struct Fsm *fsm);
+int FsmEvent(struct FsmInst *fi, int event, void *arg);
+void FsmChangeState(struct FsmInst *fi, int newstate);
+void FsmInitTimer(struct FsmInst *fi, struct FsmTimer *ft);
+int FsmAddTimer(struct FsmTimer *ft, int millisec, int event,
+               void *arg, int where);
+void FsmRestartTimer(struct FsmTimer *ft, int millisec, int event,
+                    void *arg, int where);
+void FsmDelTimer(struct FsmTimer *ft, int where);
+int jiftime(char *s, long mark);
+
+int HiSax_command(isdn_ctrl *ic);
+int HiSax_writebuf_skb(int id, int chan, int ack, struct sk_buff *skb);
+__printf(3, 4)
+void HiSax_putstatus(struct IsdnCardState *cs, char *head, char *fmt, ...);
+__printf(3, 0)
+void VHiSax_putstatus(struct IsdnCardState *cs, char *head, char *fmt, va_list args);
+void HiSax_reportcard(int cardnr, int sel);
+int QuickHex(char *txt, u_char *p, int cnt);
+void LogFrame(struct IsdnCardState *cs, u_char *p, int size);
+void dlogframe(struct IsdnCardState *cs, struct sk_buff *skb, int dir);
+void iecpy(u_char *dest, u_char *iestart, int ieoffset);
+#endif /* __KERNEL__ */
+
+/*
+ * Busywait delay for `jiffs' jiffies
+ */
+#define HZDELAY(jiffs) do {                            \
+               int tout = jiffs;                       \
+                                                       \
+               while (tout--) {                        \
+                       int loops = USEC_PER_SEC / HZ;  \
+                       while (loops--)                 \
+                               udelay(1);              \
+               }                                       \
+       } while (0)
+
+int ll_run(struct IsdnCardState *cs, int addfeatures);
+int CallcNew(void);
+void CallcFree(void);
+int CallcNewChan(struct IsdnCardState *cs);
+void CallcFreeChan(struct IsdnCardState *cs);
+int Isdnl1New(void);
+void Isdnl1Free(void);
+int Isdnl2New(void);
+void Isdnl2Free(void);
+int Isdnl3New(void);
+void Isdnl3Free(void);
+void init_tei(struct IsdnCardState *cs, int protocol);
+void release_tei(struct IsdnCardState *cs);
+char *HiSax_getrev(const char *revision);
+int TeiNew(void);
+void TeiFree(void);
+
+#ifdef CONFIG_PCI
+
+#include <linux/pci.h>
+
+/* adaptation wrapper for old usage
+ * WARNING! This is unfit for use in a PCI hotplug environment,
+ * as the returned PCI device can disappear at any moment in time.
+ * Callers should be converted to use pci_get_device() instead.
+ */
+static inline struct pci_dev *hisax_find_pci_device(unsigned int vendor,
+                                                   unsigned int device,
+                                                   struct pci_dev *from)
+{
+       struct pci_dev *pdev;
+
+       pci_dev_get(from);
+       pdev = pci_get_subsys(vendor, device, PCI_ANY_ID, PCI_ANY_ID, from);
+       pci_dev_put(pdev);
+       return pdev;
+}
+
+#endif