text: /* $Id: hisax.h,v 2.64.2.4 2004/02/11 13:21:33 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/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;
  #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);
  void HiSax_putstatus(struct IsdnCardState *cs, char *head, char *fmt, ...);
  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
  