summaryrefslogtreecommitdiff
path: root/drivers/char/rio/rio.h
blob: 7f45e1ab53325fd5d49726fd9cef44dd7a833a0d (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
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
/*
** -----------------------------------------------------------------------------
**
**  Perle Specialix driver for Linux
**  Ported from existing RIO Driver for SCO sources.
 *
 *  (C) 1990 - 1998 Specialix International Ltd., Byfleet, Surrey, UK.
 *
 *      This program is free software; you can redistribute it and/or modify
 *      it under the terms of the GNU General Public License as published by
 *      the Free Software Foundation; either version 2 of the License, or
 *      (at your option) any later version.
 *
 *      This program is distributed in the hope that it will be useful,
 *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *      GNU General Public License for more details.
 *
 *      You should have received a copy of the GNU General Public License
 *      along with this program; if not, write to the Free Software
 *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
**
**	Module		: rio.h
**	SID		: 1.3
**	Last Modified	: 11/6/98 11:34:13
**	Retrieved	: 11/6/98 11:34:22
**
**  ident @(#)rio.h	1.3
**
** -----------------------------------------------------------------------------
*/

#ifndef	__rio_rio_h__
#define	__rio_rio_h__

#ifdef SCCS_LABELS
static char *_rio_h_sccs_ = "@(#)rio.h	1.3";
#endif

/*
** 30.09.1998 ARG -
** Introduced driver version and host card type strings
*/
#define RIO_DRV_STR "Specialix RIO Driver"
#define RIO_AT_HOST_STR "ISA"
#define RIO_PCI_HOST_STR "PCI"


/*
** rio_info_store() commands (arbitary values) :
*/
#define RIO_INFO_PUT	0xA4B3C2D1
#define RIO_INFO_GET	0xF1E2D3C4


/*
** anything that I couldn't cram in somewhere else
*/
/*
#ifndef RIODEBUG
#define debug
#else
#define debug rioprint
#endif
*/


/*
**	Maximum numbers of things
*/
#define	RIO_SLOTS	4	/* number of configuration slots */
#define	RIO_HOSTS	4	/* number of hosts that can be found */
#define	PORTS_PER_HOST	128	/* number of ports per host */
#define	LINKS_PER_UNIT	4	/* number of links from a host */
#define	RIO_PORTS	(PORTS_PER_HOST * RIO_HOSTS)	/* max. no. of ports */
#define	RTAS_PER_HOST	(MAX_RUP)	/* number of RTAs per host */
#define	PORTS_PER_RTA	(PORTS_PER_HOST/RTAS_PER_HOST)	/* ports on a rta */
#define	PORTS_PER_MODULE 4	/* number of ports on a plug-in module */
				/* number of modules on an RTA */
#define	MODULES_PER_RTA	 (PORTS_PER_RTA/PORTS_PER_MODULE)
#define MAX_PRODUCT	16	/* numbr of different product codes */
#define MAX_MODULE_TYPES 16	/* number of different types of module */

#define RIO_CONTROL_DEV	128	/* minor number of host/control device */
#define RIO_INVALID_MAJOR 0	/* test first host card's major no for validity */

/*
** number of RTAs that can be bound to a master
*/
#define MAX_RTA_BINDINGS (MAX_RUP * RIO_HOSTS)

/*
**	Unit types
*/
#define PC_RTA16	0x90000000
#define PC_RTA8		0xe0000000
#define TYPE_HOST	0
#define TYPE_RTA8	1
#define TYPE_RTA16	2

/*
**	Flag values returned by functions
*/
#define	RIO_FAIL	-1
#define	RIO_SUCCESS	0
#define	COPYFAIL	-1	/* copy[in|out] failed */

/*
** SysPort value for something that hasn't any ports
*/
#define	NO_PORT	0xFFFFFFFF

/*
** Unit ID Of all hosts
*/
#define	HOST_ID	0

/*
** Break bytes into nybles
*/
#define	LONYBLE(X)	((X) & 0xF)
#define	HINYBLE(X)	(((X)>>4) & 0xF)

/*
** Flag values passed into some functions
*/
#define	DONT_SLEEP	0
#define	OK_TO_SLEEP	1

#define	DONT_PRINT	1
#define	DO_PRINT	0

#define PRINT_TO_LOG_CONS	0
#define PRINT_TO_CONS	1
#define PRINT_TO_LOG	2

/*
** Timeout has trouble with times of less than 3 ticks...
*/
#define	MIN_TIMEOUT	3

/*
**	Generally useful constants
*/
#define	HALF_A_SECOND		((HZ)>>1)
#define	A_SECOND		(HZ)
#define	HUNDRED_HZ		((HZ/100)?(HZ/100):1)
#define	FIFTY_HZ		((HZ/50)?(HZ/50):1)
#define	TWENTY_HZ		((HZ/20)?(HZ/20):1)
#define	TEN_HZ			((HZ/10)?(HZ/10):1)
#define	FIVE_HZ			((HZ/5)?(HZ/5):1)
#define	HUNDRED_MS		TEN_HZ
#define	FIFTY_MS		TWENTY_HZ
#define	TWENTY_MS		FIFTY_HZ
#define	TEN_MS			HUNDRED_HZ
#define	TWO_SECONDS		((A_SECOND)*2)
#define	FIVE_SECONDS		((A_SECOND)*5)
#define	TEN_SECONDS		((A_SECOND)*10)
#define	FIFTEEN_SECONDS		((A_SECOND)*15)
#define	TWENTY_SECONDS		((A_SECOND)*20)
#define	HALF_A_MINUTE		(A_MINUTE>>1)
#define	A_MINUTE		(A_SECOND*60)
#define	FIVE_MINUTES		(A_MINUTE*5)
#define	QUARTER_HOUR		(A_MINUTE*15)
#define	HALF_HOUR		(A_MINUTE*30)
#define	HOUR			(A_MINUTE*60)

#define	SIXTEEN_MEG		0x1000000
#define	ONE_MEG			0x100000
#define	SIXTY_FOUR_K		0x10000

#define	RIO_AT_MEM_SIZE		SIXTY_FOUR_K
#define	RIO_EISA_MEM_SIZE	SIXTY_FOUR_K
#define	RIO_MCA_MEM_SIZE	SIXTY_FOUR_K

#define	POLL_VECTOR		0x100

#define	COOK_WELL		0
#define	COOK_MEDIUM		1
#define	COOK_RAW		2

/*
**	Pointer manipulation stuff
**	RIO_PTR takes hostp->Caddr and the offset into the DP RAM area
**	and produces a UNIX caddr_t (pointer) to the object
**	RIO_OBJ takes hostp->Caddr and a UNIX pointer to an object and
**	returns the offset into the DP RAM area.
*/
#define	RIO_PTR(C,O) (((caddr_t)(C))+(0xFFFF&(O)))
#define	RIO_OFF(C,O) ((int)(O)-(int)(C))

/*
**	How to convert from various different device number formats:
**	DEV is a dev number, as passed to open, close etc - NOT a minor
**	number!
**
**	Note:	LynxOS only gives us 8 bits for the device minor number,
**		so all this crap here to deal with 'modem' bits etc. is
**		just a load of irrelevant old bunkum!
**		This however does not stop us needing to define a value
**		for RIO_MODEMOFFSET which is required by the 'riomkdev'
**		utility in the New Config Utilities suite.
*/
/* 0-511: direct 512-1023: modem */
#define	RIO_MODEMOFFSET		0x200	/* doesn't mean anything */
#define	RIO_MODEM_MASK		0x1FF
#define	RIO_MODEM_BIT		0x200
#define	RIO_UNMODEM(DEV)	(MINOR(DEV) & RIO_MODEM_MASK)
#define	RIO_ISMODEM(DEV)	(MINOR(DEV) & RIO_MODEM_BIT)
#define RIO_PORT(DEV,FIRST_MAJ)	( (MAJOR(DEV) - FIRST_MAJ) * PORTS_PER_HOST) \
					+ MINOR(DEV)

#define	splrio	spltty

#define	RIO_IPL	5
#define	RIO_PRI	(PZERO+10)
#define RIO_CLOSE_PRI	PZERO-1	/* uninterruptible sleeps for close */

typedef struct DbInf {
	uint Flag;
	char Name[8];
} DbInf;

#ifndef TRUE
#define	TRUE (1==1)
#endif
#ifndef FALSE
#define	FALSE	(!TRUE)
#endif

#define CSUM(pkt_ptr)  (((ushort *)(pkt_ptr))[0] + ((ushort *)(pkt_ptr))[1] + \
			((ushort *)(pkt_ptr))[2] + ((ushort *)(pkt_ptr))[3] + \
			((ushort *)(pkt_ptr))[4] + ((ushort *)(pkt_ptr))[5] + \
			((ushort *)(pkt_ptr))[6] + ((ushort *)(pkt_ptr))[7] + \
			((ushort *)(pkt_ptr))[8] + ((ushort *)(pkt_ptr))[9] )

/*
** This happy little macro copies SIZE bytes of data from FROM to TO
** quite well. SIZE must be a constant.
*/
#define CCOPY( FROM, TO, SIZE ) { *(struct s { char data[SIZE]; } *)(TO) = *(struct s *)(FROM); }

/*
** increment a buffer pointer modulo the size of the buffer...
*/
#define	BUMP( P, I )	((P) = (((P)+(I)) & RIOBufferMask))

#define INIT_PACKET( PK, PP ) \
{ \
	*((uint *)PK)    = PP->PacketInfo; \
}

#define	RIO_LINK_ENABLE	0x80FF	/* FF is a hack, mainly for Mips, to        */
			       /* prevent a really stupid race condition.  */

#define	NOT_INITIALISED	0
#define	INITIALISED	1

#define	NOT_POLLING	0
#define	POLLING		1

#define	NOT_CHANGED	0
#define	CHANGED		1

#define	NOT_INUSE	0

#define	DISCONNECT	0
#define	CONNECT		1


/*
** Machine types - these must NOT overlap with product codes 0-15
*/
#define	RIO_MIPS_R3230	31
#define	RIO_MIPS_R4030	32

#define	RIO_IO_UNKNOWN	-2

#undef	MODERN
#define	ERROR( E )	do { u.u_error = E; return OPENFAIL } while ( 0 )

/* Defines for MPX line discipline routines */

#define DIST_LINESW_OPEN	0x01
#define DIST_LINESW_CLOSE	0x02
#define DIST_LINESW_READ	0x04
#define DIST_LINESW_WRITE	0x08
#define DIST_LINESW_IOCTL	0x10
#define DIST_LINESW_INPUT	0x20
#define DIST_LINESW_OUTPUT	0x40
#define DIST_LINESW_MDMINT	0x80

#endif				/* __rio_h__ */