summaryrefslogtreecommitdiff
path: root/sys/dev/pci/musyccreg.h
blob: c3b39740b1d38b9779d348ff0b7318c900a827d4 (plain)
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
/*	$OpenBSD: musyccreg.h,v 1.3 2005/08/27 12:53:17 claudio Exp $ */

/*
 * Copyright (c) 2004,2005  Internet Business Solutions AG, Zurich, Switzerland
 * Written by: Claudio Jeker <jeker@accoom.net>
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */
#ifndef __MUSYCCREG_H__
#define __MUSYCCREG_H__

#define	MUSYCC_PCI_BAR	0x10	/* offset of Base Address Register */

/* Group Base Pointer -- per Group unique */
#define	MUSYCC_GROUPBASE(x)	(0x0800 * (x))
/* Dual Address Cycle Base Pointer */
#define MUSYCC_DACB_PTR		0x0004
/* Service Request Descriptor -- per Group unique */
#define MUSYCC_SERREQ(x)	(0x0008 + 0x0800 * (x))
/* Interrupt Status Descriptor */
#define MUSYCC_INTRSTATUS	0x000c
#define MUSYCC_INTCNT_MASK	0x00007fff
#define MUSYCC_INTFULL		0x00008000
#define MUSYCC_NEXTINT_GET(x)	(((x) >> 16) & 0x7fff)
#define MUSYCC_NEXTINT_SET(x)	(((x) & 0x7fff) << 16)

/* Global Configuration Descriptor */
#define MUSYCC_GLOBALCONF	0x0600
/* Interrupt Queue Descriptor */
#define MUSYCC_INTQPTR		0x0604
#define MUSYCC_INTQLEN		0x0608

/* group structure [page 5-6], this puppy needs to be 2k aligned */
struct musycc_grpdesc {
	u_int32_t		tx_headp[32];	/* transmit head ptr */
	u_int32_t		tx_msgp[32];	/* transmit msg ptr */
	u_int32_t		rx_headp[32];	/* receive head ptr */
	u_int32_t		rx_msgp[32];	/* receive msg ptr */
	u_int8_t		tx_tsmap[128];	/* transmit timeslot map */
	u_int8_t		tx_submap[256];	/* transmit sub channel map */
	u_int32_t		tx_cconf[32];	/* transmit channel config */
	u_int8_t		rx_tsmap[128];	/* receive timeslot map */
	u_int8_t		rx_submap[256];	/* receive sub channel map */
	u_int32_t		rx_cconf[32];	/* receive channel config */
	u_int32_t		global_conf;	/* global config */
	u_int32_t		int_queuep;	/* interrupt queue ptr */
	u_int32_t		int_queuelen;	/* interrupt queue len */
	u_int32_t		group_conf;	/* group config */
	u_int32_t		memprot;	/* memory protection */
	u_int32_t		msglen_conf;	/* message length config */
	u_int32_t		port_conf;	/* serial port config */
};

/* Global Configuration Descriptor [page 5-10] */
#define MUSYCC_CONF_PORTMAP	0x00000003	/* group -> port mapping */
#define MUSYCC_CONF_INTB	0x00000004	/* if set INTB is disabled */
#define MUSYCC_CONF_INTA	0x00000008	/* if set INTA is disabled */
#define MUSYCC_CONF_ELAPSE_GET(x)	\
    (((x) >> 4) & 0x7)				/* get elapse value */
#define MUSYCC_CONF_ELAPSE_SET(x)	\
    ((x & 0x7) << 4)				/* set elapse value */
#define MUSYCC_CONF_ALAPSE_GET(x)	\
    (((x) >> 8) & 0x3)				/* get alapse value */
#define MUSYCC_CONF_ALAPSE_SET(x)	\
    ((x & 0x3) << 8)				/* set alapse value */
#define MUSYCC_CONF_MPUSEL	0x00000400	/* EBUS mode, 1 = intel style */
#define MUSYCC_CONF_ECKEN	0x00000800	/* EBUS clock enable */
#define MUSYCC_CONF_BLAPSE_GET(x)	\
    (((x) >> 12) & 0x7)				/* get blapse value */
#define MUSYCC_CONF_BLAPSE_SET(x)	\
    ((x & 0x7) << 12)				/* set blapse value */

/* Interrupt Descriptor [page 5-41] */
#define	MUSYCC_INTD_BLEN	0x00001fff	/* size of data on EOB & EOM */
#define	MUSYCC_INTD_ILOST	0x00008000	/* Interrupt Lost */
#define	MUSYCC_INTD_DIR		0x80000000	/* transmit specific int */
#define	MUSYCC_INTD_GRP(x)	\
    ((((x) >> 29) & 0x3) | (((x) >> 12) & 0x4))	/* Group Number [0-7] */
#define	MUSYCC_INTD_CHAN(x)	\
    (((x) >> 24) & 0x1f)			/* Channel Number [0-31] */
#define	MUSYCC_INTD_EVENT(x)	\
    (((x) >> 20) & 0xf)				/* Event that caused the int */
#define	MUSYCC_INTD_ERROR(x)	\
    (((x) >> 16) & 0xf)				/* Error that caused the int */

/* possible Interrupt Events */
#define	MUSYCC_INTEV_NONE	0		/* No Event to report */
#define	MUSYCC_INTEV_SACK	1		/* Service Request Ack */
#define MUSYCC_INTEV_EOB	2		/* End of Buffer */
#define MUSYCC_INTEV_EOM	3		/* End of Message */
#define MUSYCC_INTEV_EOP	4		/* End of Padfill */
#define MUSYCC_INTEV_CHABT	5		/* Change to Abort Code */
#define MUSYCC_INTEV_CHIC	6		/* Change to Idle Code */
#define MUSYCC_INTEV_FREC	7		/* Frame Recovery */
#define MUSYCC_INTEV_SINC	8		/* SS7 SUERM Octet Count inc */
#define MUSYCC_INTEV_SDEC	9		/* SS7 SUERM Octet Count dec */
#define MUSYCC_INTEV_SFILT	10		/* SS7 Filtered Message */

/* possible Interrupt Errors */
#define	MUSYCC_INTERR_NONE	0		/* No Error to report */
#define	MUSYCC_INTERR_BUFF	1		/* Buffer Error */
#define	MUSYCC_INTERR_COFA	2		/* Change of Frame Alignment */
#define	MUSYCC_INTERR_ONR	3		/* Owner-Bit Error */
#define	MUSYCC_INTERR_PROT	4		/* Mem Protection Violation */
#define	MUSYCC_INTERR_OOF	8		/* Out of Frame */
#define	MUSYCC_INTERR_FCS	9		/* Frame Check Sequence Error */
#define	MUSYCC_INTERR_ALIGN	10		/* Octet Alignment Error */
#define	MUSYCC_INTERR_ABT	11		/* Abort Termination */
#define	MUSYCC_INTERR_LNG	12		/* Long Message */
#define	MUSYCC_INTERR_SHT	13		/* Short Message */
#define	MUSYCC_INTERR_SUERR	14		/* SS7 Signal Unit Error */
#define	MUSYCC_INTERR_PERR	15		/* PCI Bus Parity Error */

/* Service Request Descriptor [page 5-14] */
#define MUSYCC_SREQ_MASK	0x001f		/* Generic SREQ/Channel Mask */
#define MUSYCC_SREQ_CHSET(x)		\
    ((x) & MUSYCC_SREQ_MASK)			/* shortcut */
#define MUSYCC_SREQ_TXDIR	0x0020		/* Transmit Direction */
#define MUSYCC_SREQ_SET(x)		\
    (((x) & MUSYCC_SREQ_MASK) << 8)		/* Service Request */

#define MUSYCC_SREQ_RX		0x1		/* Receive Request */
#define MUSYCC_SREQ_TX		0x2		/* Transmit Request */
#define MUSYCC_SREQ_BOTH	0x3		/* both directions */
#define MUSYCC_SREQ_NOWAIT	0x8
#define MUSYCC_SREQ_NONE	0xffffffff

/* Group Configuration Descriptor [page 5-16] */
#define MUSYCC_GRCFG_RXENBL	0x0001		/* Receiver Enabled */
#define MUSYCC_GRCFG_TXENBL	0x0002		/* Transmitter Enabled */
#define MUSYCC_GRCFG_SUBDSBL	0x0004		/* Subchanneling Disabled */
#define MUSYCC_GRCFG_OOFABT	0x0008		/* OOF Message Processing */
#define MUSYCC_GRCFG_MSKOOF	0x0010		/* OOF Interrupt Disabled */
#define MUSYCC_GRCFG_MSKCOFA	0x0020		/* COFA Interrupt Disabled */
#define MUSYCC_GRCFG_MCENBL	0x0040		/* Msg Config Bits Copy */
#define MUSYCC_GRCFG_INHRBSD	0x0100		/* Inihibit RX Buf Stat Desc */
#define MUSYCC_GRCFG_INHTBSD	0x0200		/* Inihibit TX Buf Stat Desc */
#define MUSYCC_GRCFG_POLL16	0x0400		/* Poll at all 16 frame sync */
#define MUSYCC_GRCFG_POLL32	0x0800		/* Poll at all 32 frame sync */
#define MUSYCC_GRCFG_POLL64	0x0C00		/* Poll at all 64 frame sync */
#define MUSYCC_GRCFG_SFALIGN	0x8000		/* Super Frame Alignment */
#define MUSYCC_GRCFG_SUETMASK	0x3f0000	/* SS7 SUERR Threshold */

/* Port Configuration Descriptor [page 5-19] */
#define MUSYCC_PORT_MODEMASK	0x007		/* Port Mode Mask */
#define MUSYCC_PORT_MODE_T1	0		/* T1 - 24 time slots */
#define MUSYCC_PORT_MODE_E1	1		/* E1 - 32 time slots */
#define MUSYCC_PORT_MODE_2E1	2		/* 2*E1 - 64 time slots */
#define MUSYCC_PORT_MODE_4E1	3		/* 4*E1 - 128 time slots */
#define MUSYCC_PORT_MODE_N64	4		/* N*64 mode */
#define MUSYCC_PORT_TDAT_EDGE	0x010		/* TX Data on rising Edge */
#define MUSYCC_PORT_TSYNC_EDGE	0x020		/* TX Frame Sync on rising E */
#define MUSYCC_PORT_RDAT_EDGE	0x040		/* RX Data on rising Edge */
#define MUSYCC_PORT_RSYNC_EDGE	0x080		/* RX Frame Sync on rising E */
#define MUSYCC_PORT_ROOF_EDGE	0x100		/* RX OOF on rising Edge */
#define MUSYCC_PORT_TRITX	0x200		/* TX Three-state disabled */

/* Message Length Descriptor [page 5-20] */
#define MUSYCC_MAXFRM_MAX	4094		/* maximum message length */
#define MUSYCC_MAXFRM_MASK	0x0fff
#define MUSYCC_MAXFRM2_SHIFT	16

/* Time Slot Descriptor [page 5-23] */
#define MUSYCC_TSLOT_ENABLED	0x80		/* timeslot enabled */
#define MUSYCC_TSLOT_56K	0x20		/* 56kbps timeslots */
#define MUSYCC_TSLOT_SUB	0x40		/* subchannel timeslots */
#define MUSYCC_TSLOT_MASK	0x1f		/* channel number mask */
#define MUSYCC_TSLOT_CHAN(x)		\
    ((x) & MUSYCC_TSLOT_MASK)			/* masked channel number */

/* Channel Configuration Descriptor [page 5-27] */
#define MUSYCC_CHAN_MSKBUFF	0x00000002	/* BUFF & ONR Intr disabled */
#define MUSYCC_CHAN_MSKEOM	0x00000004	/* EOM Interrupt disabled */
#define MUSYCC_CHAN_MSKMSG	0x00000008	/* LNG, FCS, ALIGN, ABT mask */
#define MUSYCC_CHAN_MSKIDLE	0x00000010	/* CHABT, CHIC, SHT Intr mask */
#define MUSYCC_CHAN_MSKSFILT	0x00000020	/* SS7 SFILT Interrupt mask */
#define MUSYCC_CHAN_MSKSDEC	0x00000040	/* SS7 SDEC Interrupt mask */
#define MUSYCC_CHAN_MSKSINC	0x00000080	/* SS7 SINC Interrupt mask */
#define MUSYCC_CHAN_MSKSUERR	0x00000100	/* SS7 SUERR Interrupt mask */
#define MUSYCC_CHAN_FCS		0x00000200	/* FCS checksum disable */
#define MUSYCC_CHAN_MAXLEN1	0x00000400	/* Msg Len Max via MAXFRM1 */
#define MUSYCC_CHAN_MAXLEN2	0x00000800	/* Msg Len Max via MAXFRM1 */
#define MUSYCC_CHAN_EOPI	0x00008000	/* End of Padfill Int enable */
#define MUSYCC_CHAN_INV		0x00800000	/* Data Inversion */
#define MUSYCC_CHAN_PADJ	0x80000000	/* Pad Count Adjust enabled */

#define MUSYCC_CHAN_PROTO_GET(x)	\
    (((x) >> 12) & 0x7)				/* get line protocol */
#define MUSYCC_CHAN_PROTO_SET(x)	\
    ((x & 0x7) << 12)				/* set line protocol */
#define MUSYCC_PROTO_TRANSPARENT	0	/* raw stream */
#define MUSYCC_PROTO_SS7HDLC		1	/* SS7 HDLC messages */
#define MUSYCC_PROTO_HDLC16		2	/* basic HDLC with 16 bit FCS */
#define MUSYCC_PROTO_HDLC32		3	/* basic HDLC with 32 bit FCS */

#define MUSYCC_CHAN_BUFLEN_GET(x)	\
    (((x) >> 16) & 0x3f)			/* get FIFO Buffer Length */
#define MUSYCC_CHAN_BUFLEN_SET(x)	\
    (((x) & 0x3F) << 16)			/* set FIFO Buffer Length */
#define MUSYCC_CHAN_BUFIDX_GET(x)	\
    (((x) >> 24) & 0x3f)			/* get FIFO Buffer Index */
#define MUSYCC_CHAN_BUFIDX_SET(x)	\
    (((x) & 0x3F) << 24)			/* set FIFO Buffer Index */


/* Tx / Rx Buffer Descriptor [page 5-33] */
#define MUSYCC_STATUS_LEN(x)		\
    ((x) & 0x3fff)				/* length of dma buffer */
#define MUSYCC_STATUS_REPEAT	0x00008000	/* repeat buffer */
#define MUSYCC_STATUS_ERROR	0x000f0000
#define MUSYCC_STATUS_EOBI	0x10000000	/* end of buffer interrupt */
#define MUSYCC_STATUS_EOM	0x20000000	/* end of message */
#define MUSYCC_STATUS_NOPOLL	0x40000000	/* don't poll for new descr */
#define MUSYCC_STATUS_OWNER	0x80000000


/*
 * ROM data structures
 */

struct musycc_rom {
	u_int16_t	magic;
#define MUSYCC_ROM_MAGIC	(htons(0xacc0))
	u_int8_t	rev;			/* rev. of the card */
	u_int8_t	vers;			/* version of the rom */
	char		product[64];
	u_int8_t	portmap;		/* portmap config */
	u_int8_t	portmode;		/* port mode e.g. 2*E1 */
	u_int8_t	numframer;		/* # of sub-configs */
	u_int8_t	ledmask;		/* mask for led register */
	u_int32_t	ledbase;		/* base of the led register */
	u_int32_t	rfu[2];			/* RFU */
};

struct musycc_rom_framer {
	u_int32_t	type;
	u_int32_t	base;
	u_int32_t	size;
	u_int8_t	gnum;
	u_int8_t	port;
	char		slot;
	u_int8_t	flags;
	u_int32_t	rfu[2];			/* RFU */
};
#endif