1139749Simp/*-
2128967Srik * Cronyx Tau-PCI DDK definitions.
3128967Srik *
4128967Srik * Copyright (C) 1999-2003 Cronyx Engineering.
5128967Srik * Author: Serge Vakulenko, <vak@cronyx.ru>
6128967Srik *
7128967Srik * Copyright (C) 2000-2004 Cronyx Engineering.
8128967Srik * Author: Roman Kurakin, <rik@cronyx.ru>
9128967Srik *
10128967Srik * This software is distributed with NO WARRANTIES, not even the implied
11128967Srik * warranties for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12128967Srik *
13128967Srik * Authors grant any other persons or organisations a permission to use,
14128967Srik * modify and redistribute this software in source and binary forms,
15128967Srik * as long as this message is kept with the software, all derivative
16128967Srik * works or modified versions.
17128967Srik *
18138698Srik * $Cronyx: cpddk.h,v 1.8.4.20 2004/12/06 16:21:06 rik Exp $
19128967Srik * $FreeBSD$
20128967Srik */
21128967Srik#define NBRD		6	/* the maximum number of installed boards */
22128967Srik#define NCHAN		4	/* the number of channels on the board */
23128967Srik#define NRBUF		64	/* the number of receive buffers per channel,
24128967Srik				   min 2 */
25128967Srik#define NTBUF		4	/* the number of transmit buffers per channel */
26128967Srik#define BUFSZ		1664	/* i/o buffer size (26*64, min 1601) */
27128967Srik#define QSZ		128	/* intr queue size (multiple of 32, min 32) */
28128967Srik
29128967Srik#ifndef CPDDK_COBF_SAFE
30128967Srik#pragma pack(4)
31128967Srik
32128967Sriktypedef struct {
33128967Srik	unsigned long bpv;		/* bipolar violations */
34128967Srik	unsigned long fse;		/* frame sync errors */
35128967Srik	unsigned long crce;		/* CRC errors */
36128967Srik	unsigned long rcrce;		/* remote CRC errors (E-bit) */
37128967Srik	unsigned long uas;		/* unavailable seconds */
38128967Srik	unsigned long les;		/* line errored seconds */
39128967Srik	unsigned long es;		/* errored seconds */
40128967Srik	unsigned long bes;		/* bursty errored seconds */
41128967Srik	unsigned long ses;		/* severely errored seconds */
42128967Srik	unsigned long oofs;		/* out of frame seconds */
43128967Srik	unsigned long css;		/* controlled slip seconds */
44128967Srik	unsigned long dm;		/* degraded minutes */
45128967Srik} cp_gstat_t;
46128967Srik
47128967Sriktypedef struct {			/* cross-connector parameters */
48128967Srik	unsigned char ts [32];		/* timeslot number */
49128967Srik	unsigned char link [32];	/* E1 link number */
50128967Srik} cp_dxc_t;
51128967Srik
52128967Sriktypedef struct {
53128967Srik	unsigned long len;		/* data buffer length, fe, hold, hi */
54128967Srik#define DESC_FE		0x80000000
55128967Srik#define DESC_HOLD	0x40000000
56128967Srik#define DESC_HI		0x20000000
57128967Srik#define DESC_LEN(v)	((v) >> 16 & 0x1fff)
58128967Srik
59128967Srik	unsigned long next;		/* next descriptor pointer */
60128967Srik	unsigned long data;		/* pointer to data buffer */
61128967Srik	unsigned long status;		/* complete, receive abort, fe, len */
62128967Srik#define DESC_RA		0x00000200
63128967Srik#define DESC_C		0x40000000
64128967Srik
65128967Srik	unsigned long fe;		/* pointer to frame end descriptor */
66128967Srik} cp_desc_t;
67128967Srik
68128967Sriktypedef struct {
69128967Srik	cp_desc_t tdesc [NTBUF];	/* transmit buffer descriptors */
70128967Srik	cp_desc_t rdesc [NRBUF];	/* receive buffer descriptors */
71128967Srik	unsigned char tbuffer [NTBUF] [BUFSZ];	/* transmit buffers */
72128967Srik	unsigned char rbuffer [NRBUF] [BUFSZ];	/* receive buffers  */
73128967Srik} cp_buf_t;
74128967Srik
75128967Sriktypedef struct {
76128967Srik	unsigned long iqrx [NCHAN] [QSZ];	/* rx intr queue */
77128967Srik	unsigned long iqtx [NCHAN] [QSZ];	/* tx intr queue */
78128967Srik	unsigned long iqlx [QSZ];		/* LBI intr queue */
79128967Srik} cp_qbuf_t;
80128967Srik
81128967Sriktypedef struct _cp_chan_t {
82128967Srik	unsigned char *regs;	/* base addr of channel registers */
83128967Srik	volatile unsigned long *RXBAR, *TXBAR, *CFG;
84128967Srik	volatile unsigned long *BRDA, *FRDA, *LRDA, *BTDA, *FTDA, *LTDA;
85128967Srik	unsigned char CCR, CSR, GMD, GLS, E1CS, E1CR, E1EPS;
86128967Srik
87128967Srik	unsigned char num;		/* channel number, 0..1 */
88128967Srik	unsigned char type;		/* channel type */
89128967Srik#define T_NONE		0		/* no channel */
90128967Srik#define T_SERIAL	1		/* V.35/RS */
91128967Srik#define T_G703		2		/* G.703 */
92128967Srik#define T_E1		3		/* E1 */
93128967Srik#define T_E3		4		/* E3 */
94128967Srik#define T_HSSI		5		/* HSSI */
95128967Srik#define T_DATA		6		/* no physical interface */
96128967Srik#define	T_T3		7		/* T3 */
97128967Srik#define T_STS1		8		/* STS1 */
98128967Srik
99128967Srik	struct _cp_board_t *board;	/* board pointer */
100128967Srik
101128967Srik	unsigned char dtr;		/* DTR signal value */
102128967Srik	unsigned char rts;		/* RTS signal value */
103128967Srik	unsigned long baud;		/* data rate, bps */
104128967Srik	unsigned char dpll;		/* dpll mode */
105128967Srik	unsigned char nrzi;		/* nrzi mode */
106128967Srik	unsigned char invtxc;		/* invert tx clock */
107128967Srik	unsigned char invrxc;		/* invert rx clock */
108128967Srik	unsigned char lloop;		/* local loopback mode */
109128967Srik	unsigned char rloop;		/* remote loopback mode */
110128967Srik	unsigned char gsyn;		/* G.703 clock mode */
111128967Srik#define GSYN_INT	0		/* internal transmit clock source */
112128967Srik#define GSYN_RCV	1		/* transmit clock source = receive */
113128967Srik#define GSYN_RCV0	2		/* tclk = rclk from channel 0 */
114128967Srik#define GSYN_RCV1	3		/* ...from channel 1 */
115128967Srik#define GSYN_RCV2	4		/* ...from channel 2 */
116128967Srik#define GSYN_RCV3	5		/* ...from channel 3 */
117128967Srik
118128967Srik	unsigned char scrambler;	/* G.703 scrambler enable */
119128967Srik
120128967Srik	unsigned long ts;		/* E1 timeslot mask */
121128967Srik	unsigned char higain;		/* E1 high gain mode */
122128967Srik	unsigned char use16;		/* E1 use ts 16 */
123128967Srik	unsigned char crc4;		/* E1 enable CRC4 */
124128967Srik	unsigned char phony;		/* E1 phony mode */
125128967Srik	unsigned char unfram;		/* E1 unframed mode */
126128967Srik	unsigned char monitor;		/* E1 monitoring mode */
127128967Srik	unsigned char dir;		/* E1 direction mode */
128128967Srik	cp_dxc_t dxc;			/* E1 cross-connect params */
129128967Srik
130128967Srik	unsigned char ais;		/* E3 AIS */
131128967Srik	unsigned char losais;		/* E3 AIS on LOS*/
132128967Srik	unsigned char ber;		/* E3 BER */
133128967Srik	unsigned char cablen;		/* E3 cable length */
134128967Srik	unsigned char e3cr1;		/* e3cr1 clone */
135128967Srik
136128967Srik	unsigned char scc_ien;		/* SCC Interrupts enabled */
137128967Srik	unsigned char ds_ien;		/* DS Interrupts enabled */
138128967Srik
139128967Srik	unsigned long imr;
140128967Srik	unsigned char ccr;		/* CCR image */
141128967Srik	unsigned long ccr0;		/* CCR0 clone */
142128967Srik	unsigned long ccr1;		/* CCR1 clone */
143128967Srik	unsigned long ccr2;		/* CCR2 clone */
144128967Srik	unsigned char gmd;		/* G.703 MDi register image */
145128967Srik	unsigned char e1cr;		/* E1 CR register image */
146128967Srik	unsigned char ds21x54;		/* new tranceiver flag */
147128967Srik
148128967Srik	unsigned long rintr;		/* receive interrupts */
149128967Srik	unsigned long tintr;		/* transmit interrupts */
150128967Srik	ulong64 ibytes;			/* input bytes */
151128967Srik	ulong64 obytes;			/* output bytes */
152128967Srik	unsigned long ipkts;		/* input packets */
153128967Srik	unsigned long opkts;		/* output packets */
154128967Srik	unsigned long underrun;		/* output underrun errors */
155128967Srik	unsigned long overrun;		/* input overrun errors */
156128967Srik	unsigned long frame;		/* input frame errors */
157128967Srik	unsigned long crc;		/* input crc errors */
158128967Srik
159128967Srik	unsigned short status;		/* E1/G.703 line status bit mask */
160128967Srik#define ESTS_NOALARM	0x0001		/* no alarm present */
161128967Srik#define ESTS_FARLOF	0x0002		/* receiving far loss of framing */
162128967Srik#define ESTS_AIS	0x0008		/* receiving all ones */
163128967Srik#define ESTS_LOF	0x0020		/* loss of framing */
164128967Srik#define ESTS_LOS	0x0040		/* loss of signal */
165128967Srik#define ESTS_AIS16	0x0100		/* receiving all ones in timeslot 16 */
166128967Srik#define ESTS_FARLOMF	0x0200		/* receiving alarm in timeslot 16 */
167128967Srik#define ESTS_LOMF	0x0400		/* loss of multiframe sync */
168128967Srik#define ESTS_TSTREQ	0x0800		/* test code detected */
169128967Srik#define ESTS_TSTERR	0x1000		/* test error */
170128967Srik
171128967Srik	unsigned long totsec;		/* total seconds elapsed */
172128967Srik	unsigned long cursec;		/* current seconds elapsed */
173128967Srik	unsigned long degsec;		/* degraded seconds */
174128967Srik	unsigned long degerr;		/* errors during degraded seconds */
175128967Srik	cp_gstat_t currnt;		/* current 15-min interval data */
176128967Srik	cp_gstat_t total;		/* total statistics data */
177128967Srik	cp_gstat_t interval [48];	/* 12 hour period data */
178128967Srik	unsigned long e3status;		/* E3 status */
179128967Srik#define E3STS_LOS	0x00000002	/* Lost of synchronization */
180128967Srik#define E3STS_TXE	0x00000004	/* Transmit error */
181133848Srik#define E3STS_AIS	0x00000008	/* Transmit error */
182128967Srik	unsigned long e3csec_5;		/* 1/5 of second counter */
183128967Srik	unsigned long e3tsec;		/* total seconds coounter */
184128967Srik	unsigned long e3ccv;		/* E3 current 15-min cv errors */
185128967Srik	unsigned long e3tcv;		/* E3 total cv errors */
186128967Srik	unsigned long e3icv[48];	/* E3 12 hour period cv errors */
187128967Srik
188128967Srik	unsigned long *iqrx;		/* rx intr queue */
189128967Srik	unsigned long *iqtx;		/* tx intr queue */
190128967Srik	int irn, itn;
191128967Srik
192128967Srik	unsigned char *tbuf [NTBUF];	/* transmit buffers */
193128967Srik	cp_desc_t *tdesc;		/* transmit buffer descriptors */
194128967Srik	unsigned long tphys [NTBUF];	/* transmit buffer phys address */
195128967Srik	unsigned long tdphys [NTBUF];	/* transmit descr phys addresses */
196128967Srik	int tn;				/* first active transmit buffer */
197128967Srik	int te;				/* first empty transmit buffer */
198128967Srik
199128967Srik	unsigned char *rbuf [NRBUF];	/* receive buffers */
200128967Srik	cp_desc_t *rdesc;		/* receive buffer descriptors */
201128967Srik	unsigned long rphys [NRBUF];	/* receive buffer phys address */
202128967Srik	unsigned long rdphys [NRBUF];	/* receive descr phys addresses */
203128967Srik	int rn;				/* first active receive buffer */
204128967Srik
205128967Srik	void *tag [NTBUF];		/* system dependent data per buffer */
206128967Srik	void *sys;			/* system dependent data per channel */
207128967Srik	unsigned char debug;		/* debug level, 0..2 */
208180132Srik	unsigned char debug_shadow;	/* debug shadow */
209128967Srik
210128967Srik	void (*transmit) (struct _cp_chan_t *c, void *tag, int len);
211128967Srik	void (*receive) (struct _cp_chan_t *c, unsigned char *data, int len);
212128967Srik	void (*error) (struct _cp_chan_t *c, int reason);
213128967Srik#define CP_FRAME	 1
214128967Srik#define CP_CRC		 2
215128967Srik#define CP_UNDERRUN	 3
216128967Srik#define CP_OVERRUN	 4
217128967Srik#define CP_OVERFLOW	 5
218128967Srik} cp_chan_t;
219128967Srik
220128967Sriktypedef struct _cp_board_t {
221128967Srik	unsigned char *base;		/* base address of adapter registers */
222128967Srik	unsigned char num;		/* board number, 0..5 */
223128967Srik	unsigned char type;		/* board type Tau/TauE1/TauG703 */
224128967Srik#define B_TAUPCI	1		/* 2 channels V.35/RS */
225128967Srik#define B_TAUPCI_E3	2		/* 1 channel E3 */
226128967Srik#define B_TAUPCI_HSSI	3		/* 1 channel HSSI */
227128967Srik#define B_TAUPCI_G703	4		/* 2 channels G703 */
228128967Srik#define B_TAUPCI_E1	5		/* 2 channels E1 */
229128967Srik#define B_TAUPCI4	6		/* 4 channels V.35/RS */
230128967Srik#define B_TAUPCI4_G703	7		/* 2 channels G.703 + 2 channels V.35/RS */
231128967Srik#define B_TAUPCI4_4G703 8		/* 4 channels G.703 */
232128967Srik#define B_TAUPCI_2E1	9		/* 2 channels E1, 4 data ports */
233128967Srik#define B_TAUPCI4_E1	10		/* 2 channels E1 + 2 channels V.35/RS */
234128967Srik#define B_TAUPCI4_4E1	11		/* 4 channels E1 */
235138698Srik#define B_TAUPCI_L	12		/* 1 channel V.35/RS */
236128967Srik
237128967Srik	unsigned long osc;		/* oscillator frequency */
238128967Srik	char name[16];			/* board version name */
239128967Srik	cp_chan_t chan[NCHAN];		/* channel structures */
240128967Srik	unsigned char mux;		/* E1 mux mode */
241128967Srik	unsigned char dxc_cas;		/* CAS cross-connection */
242128967Srik	unsigned char bcr;		/* BCR image */
243128967Srik	unsigned char e1cfg;		/* E1 CFG register image */
244128967Srik	unsigned char gpidle;		/* idle bits of gp port */
245128967Srik	unsigned char E1DATA;
246128967Srik	unsigned long intr;		/* interrupt counter */
247128967Srik	unsigned long *iqlx;		/* LBI intr queue */
248128967Srik	int iln;
249128967Srik	unsigned char fw_type;		/* firmware type */
250128967Srik#define FW_TAUPCI_NONE	0
251133848Srik#define FW_TAUPCI_E3_B	1
252128967Srik#define FW_TAUPCI_2E1_B	2
253128967Srik#define FW_TAUPCI_2E1_A	3
254128967Srik#define FW_TAUPCI_4E1_B	6
255128967Srik#define FW_TAUPCI_4E1_A	7
256133848Srik	unsigned char *firmware[8];	/* external firmware */
257128967Srik	void *sys;
258128967Srik} cp_board_t;
259128967Srik
260128967Srik#pragma pack()
261128967Srik
262128967Srik/* PCI device identifiers. */
263128967Srikextern unsigned short cp_vendor_id;
264128967Srikextern unsigned short cp_device_id;
265128967Srik
266128967Srik/* Initialization. */
267128967Srikunsigned short cp_init (cp_board_t *b, int num, unsigned char *base);
268128967Srikvoid cp_reset (cp_board_t *b, cp_qbuf_t *buf, unsigned long phys);
269128967Srikvoid cp_hard_reset (cp_board_t *b);
270128967Srikunsigned long cp_regio (cp_chan_t *c, int op, int reg, unsigned long val);
271128967Srik#define REGIO_INB		0
272128967Srik#define REGIO_IN		1
273128967Srik#define REGIO_INS		2
274128967Srik#define REGIO_INX		3
275128967Srik#define REGIO_INB_OUTB		4
276128967Srik#define REGIO_OUTB		5
277128967Srik#define REGIO_OUTX		6
278128967Srik#define REGIO_R_W		7
279128967Srik#define REGIO_OUT_IN		8
280128967Srik#define REGIO_OUTB_INB		9
281128967Srik
282128967Srik/* Callback registration. */
283128967Srikvoid cp_register_transmit (cp_chan_t *c, void (*func) (cp_chan_t*, void*, int));
284128967Srikvoid cp_register_receive (cp_chan_t *c, void (*func) (cp_chan_t*,
285128967Srik							unsigned char*, int));
286128967Srikvoid cp_register_error (cp_chan_t *c, void (*func) (cp_chan_t*, int));
287128967Srik
288128967Srik/* Data transmittion. */
289128967Srikvoid cp_start_chan (cp_chan_t *c, int tx, int rx, cp_buf_t *cb, unsigned long phys);
290128967Srikvoid cp_stop_chan (cp_chan_t *c);
291128967Srikvoid cp_start_e1 (cp_chan_t *c);
292128967Srikvoid cp_stop_e1 (cp_chan_t *c);
293128967Srikint cp_transmit_space (cp_chan_t *c);
294128967Srikint cp_send_packet (cp_chan_t *c, unsigned char *data, int len, void *tag);
295128967Srik
296128967Srik/* Interrupt control. */
297128967Srikint cp_interrupt (cp_board_t *b);
298128967Srikint cp_interrupt_poll (cp_board_t *b, int ack);
299128967Srikvoid cp_handle_interrupt (cp_board_t *b);
300128967Srikvoid cp_enable_interrupt (cp_board_t *b, int on);
301128967Srik
302128967Srik/* G.703 timer. */
303128967Srikvoid cp_g703_timer (cp_chan_t *c);
304128967Srik
305128967Srik/* E1 timer. */
306128967Srikvoid cp_e1_timer (cp_chan_t *c);
307128967Srik
308128967Srik/* E3 timer. */
309128967Srikvoid cp_e3_timer (cp_chan_t *c);
310128967Srik
311128967Srik/* LED control. */
312128967Srikvoid cp_led (cp_board_t *b, int on);
313128967Srik
314128967Srik/* Modem signals. */
315128967Srikvoid cp_set_dtr (cp_chan_t *c, int on);
316128967Srikvoid cp_set_rts (cp_chan_t *c, int on);
317128967Srikint cp_get_dsr (cp_chan_t *c);
318128967Srikint cp_get_cd (cp_chan_t *c);
319128967Srikint cp_get_cts (cp_chan_t *c);
320128967Srikint cp_get_txcerr (cp_chan_t *c);
321128967Srikint cp_get_rxcerr (cp_chan_t *c);
322128967Srik
323128967Srik/* HDLC parameters. */
324128967Srikvoid cp_set_baud (cp_chan_t *c, int baud);
325128967Srikvoid cp_set_dpll (cp_chan_t *c, int on);
326128967Srikvoid cp_set_nrzi (cp_chan_t *c, int on);
327128967Srikvoid cp_set_invtxc (cp_chan_t *c, int on);
328128967Srikvoid cp_set_invrxc (cp_chan_t *c, int on);
329128967Srikvoid cp_set_lloop (cp_chan_t *c, int on);
330128967Srik
331128967Srik/* Channel status, cable type. */
332128967Srikint cp_get_rloop (cp_chan_t *c);
333128967Srikint cp_get_lq (cp_chan_t *c);
334128967Srikint cp_get_cable (cp_chan_t *c);
335128967Srik#define CABLE_RS232		0
336128967Srik#define CABLE_V35		1
337128967Srik#define CABLE_RS530		2
338128967Srik#define CABLE_X21		3
339128967Srik#define CABLE_RS485		4
340128967Srik#define CABLE_NOT_ATTACHED	9
341128967Srik#define CABLE_COAX		10
342128967Srik#define CABLE_TP		11
343128967Srik
344128967Srik/* E1/G.703 parameters. */
345128967Srikvoid cp_set_gsyn (cp_chan_t *c, int syn);
346128967Srikvoid cp_set_ts (cp_chan_t *c, unsigned long ts);
347128967Srikvoid cp_set_dir (cp_chan_t *c, int dir);
348128967Srikvoid cp_set_mux (cp_board_t *b, int on);
349128967Srikvoid cp_dxc_cas_enable (cp_board_t *b, int on);
350128967Srikvoid cp_set_dxc (cp_chan_t *c, cp_dxc_t *param);
351128967Srikvoid cp_set_higain (cp_chan_t *c, int on);
352128967Srikvoid cp_set_use16 (cp_chan_t *c, int on);
353128967Srikvoid cp_set_crc4 (cp_chan_t *c, int on);
354128967Srikvoid cp_set_phony (cp_chan_t *c, int on);
355128967Srikvoid cp_set_unfram (cp_chan_t *c, int on);
356128967Srikvoid cp_set_scrambler (cp_chan_t *c, int on);
357128967Srikvoid cp_set_monitor (cp_chan_t *c, int on);
358128967Srik
359128967Srik/* E3 parameters. */
360128967Srikvoid cp_set_rloop (cp_chan_t *c, int on);
361128967Srikvoid cp_set_ber (cp_chan_t *c, int on);
362128967Srikvoid cp_set_cablen (cp_chan_t *c, int on);
363128967Srikvoid cp_set_losais (cp_chan_t *c, int on);
364128967Srik
365128967Srik#endif /* CPDDK_COBF_SAFE */
366