xref: /NextBSD/sys/dev/si/si.h (revision eb1a5f8de9f7ea602c373a710f531abbf81141c4)
1 /*-
2  * Device driver for Specialix range (SI/XIO) of serial line multiplexors.
3  * 'C' definitions for Specialix serial multiplex driver.
4  *
5  * Copyright (C) 1990, 1992, 1998 Specialix International,
6  * Copyright (C) 1993, Andy Rutter <andy@acronym.co.uk>
7  * Copyright (C) 1995, Peter Wemm <peter@netplex.com.au>
8  *
9  * Derived from:	SunOS 4.x version
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notices, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notices, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  * 3. All advertising materials mentioning features or use of this software
20  *    must display the following acknowledgement:
21  *	This product includes software developed by Andy Rutter of
22  *	Advanced Methods and Tools Ltd. based on original information
23  *	from Specialix International.
24  * 4. Neither the name of Advanced Methods and Tools, nor Specialix
25  *    International may be used to endorse or promote products derived from
26  *    this software without specific prior written permission.
27  *
28  * THIS SOFTWARE IS PROVIDED BY ``AS IS'' AND ANY EXPRESS OR IMPLIED
29  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
30  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
31  * NO EVENT SHALL THE AUTHORS BE LIABLE.
32  *
33  * $FreeBSD$
34  */
35 
36 #include <sys/callout.h>
37 
38 /*
39  * We name devices with %r in make_dev() with a radix of 32.
40  */
41 #define	SI_MAXPORTPERCARD	32
42 
43 /* Buffer parameters */
44 #define	SI_BUFFERSIZE	256
45 
46 typedef	uint8_t 	BYTE;		/* Type cast for unsigned 8 bit */
47 typedef	uint16_t 	WORD;		/* Type cast for unsigned 16 bit */
48 
49 /*
50  * Hardware `registers', stored in the shared memory.
51  * These are related to the firmware running on the Z280.
52  */
53 
54 struct si_reg	{
55 	BYTE	initstat;
56 	BYTE	memsize;
57 	WORD	int_count;
58 	WORD	revision;
59 	BYTE	rx_int_count;		/* isr_count on Jet */
60 	BYTE	main_count;		/* spare on Z-280 */
61 	WORD	int_pending;
62 	WORD	int_counter;
63 	BYTE	int_scounter;
64 	BYTE	res[0x80 - 13];
65 };
66 
67 /*
68  *	Per module control structure, stored in shared memory.
69  */
70 struct si_module {
71 	WORD	sm_next;		/* Next module */
72 	BYTE	sm_type;		/* Number of channels */
73 	BYTE	sm_number;		/* Module number on cable */
74 	BYTE	sm_dsr;			/* Private dsr copy */
75 	BYTE	sm_res[0x80 - 5];	/* Reserve space to 128 bytes */
76 };
77 
78 /*
79  *	The 'next' pointer & with 0x7fff + SI base addres give
80  *	the address of the next module block if fitted. (else 0)
81  *	Note that next points to the TX buffer so 0x60 must be
82  *	subtracted to find the true base.
83  */
84 #define TA4		0x00
85 #define TA8		0x08
86 #define TA4_ASIC	0x0A
87 #define TA8_ASIC	0x0B
88 #define MTA		0x28
89 #define SXDC		0x48
90 
91 /*
92  *	Per channel(port) control structure, stored in shared memory.
93  */
94 struct	si_channel {
95 	/*
96 	 * Generic stuff
97 	 */
98 	WORD	next;			/* Next Channel */
99 	WORD	addr_uart;		/* Uart address */
100 	WORD	module;			/* address of module struct */
101 	BYTE 	type;			/* Uart type */
102 	BYTE	fill;
103 	/*
104 	 * Uart type specific stuff
105 	 */
106 	BYTE	x_status;		/* XON / XOFF status */
107 	BYTE	c_status;		/* cooking status */
108 	BYTE	hi_rxipos;		/* stuff into rx buff */
109 	BYTE	hi_rxopos;		/* stuff out of rx buffer */
110 	BYTE	hi_txopos;		/* Stuff into tx ptr */
111 	BYTE	hi_txipos;		/* ditto out */
112 	BYTE	hi_stat;		/* Command register */
113 	BYTE	dsr_bit;		/* Magic bit for DSR */
114 	BYTE	txon;			/* TX XON char */
115 	BYTE	txoff;			/* ditto XOFF */
116 	BYTE	rxon;			/* RX XON char */
117 	BYTE	rxoff;			/* ditto XOFF */
118 	BYTE	hi_mr1;			/* mode 1 image */
119 	BYTE	hi_mr2;			/* mode 2 image */
120         BYTE	hi_csr;			/* clock register */
121 	BYTE	hi_op;			/* Op control */
122 	BYTE	hi_ip;			/* Input pins */
123 	BYTE	hi_state;		/* status */
124 	BYTE	hi_prtcl;		/* Protocol */
125 	BYTE	hi_txon;		/* host copy tx xon stuff */
126 	BYTE	hi_txoff;
127 	BYTE	hi_rxon;
128 	BYTE	hi_rxoff;
129 	BYTE	close_prev;		/* Was channel previously closed */
130 	BYTE	hi_break;		/* host copy break process */
131 	BYTE	break_state;		/* local copy ditto */
132 	BYTE	hi_mask;		/* Mask for CS7 etc. */
133 	BYTE	mask_z280;		/* Z280's copy */
134 	BYTE	res[0x60 - 36];
135 	BYTE	hi_txbuf[SI_BUFFERSIZE];
136 	BYTE	hi_rxbuf[SI_BUFFERSIZE];
137 	BYTE	res1[0xA0];
138 };
139 
140 /*
141  *	Register definitions
142  */
143 
144 /*
145  *	Break input control register definitions
146  */
147 #define	BR_IGN		0x01	/* Ignore any received breaks */
148 #define	BR_INT		0x02	/* Interrupt on received break */
149 #define BR_PARMRK	0x04	/* Enable parmrk parity error processing */
150 #define	BR_PARIGN	0x08	/* Ignore chars with parity errors */
151 
152 /*
153  *	Protocol register provided by host for XON/XOFF and cooking
154  */
155 #define	SP_TANY		0x01	/* Tx XON any char */
156 #define	SP_TXEN		0x02	/* Tx XON/XOFF enabled */
157 #define	SP_CEN		0x04	/* Cooking enabled */
158 #define	SP_RXEN		0x08	/* Rx XON/XOFF enabled */
159 #define	SP_DCEN		0x20	/* DCD / DTR check */
160 #define	SP_PAEN		0x80	/* Parity checking enabled */
161 
162 /*
163  *	HOST STATUS / COMMAND REGISTER
164  */
165 #define	IDLE_OPEN	0x00	/* Default mode, TX and RX polled
166 				   buffer updated etc */
167 #define	LOPEN		0x02	/* Local open command (no modem ctl */
168 #define MOPEN		0x04	/* Open and monitor modem lines (blocks
169 				   for DCD */
170 #define MPEND		0x06	/* Wating for DCD */
171 #define CONFIG		0x08	/* Channel config has changed */
172 #define CLOSE		0x0A	/* Close channel */
173 #define SBREAK		0x0C	/* Start break */
174 #define EBREAK		0x0E	/* End break */
175 #define IDLE_CLOSE	0x10	/* Closed channel */
176 #define IDLE_BREAK	0x12	/* In a break */
177 #define FCLOSE		0x14	/* Force a close */
178 #define RESUME		0x16	/* Clear a pending xoff */
179 #define WFLUSH		0x18	/* Flush output buffer */
180 #define RFLUSH		0x1A	/* Flush input buffer */
181 
182 /*
183  *	Host status register
184  */
185 #define	ST_BREAK	0x01	/* Break received (clear with config) */
186 
187 /*
188  *	OUTPUT PORT REGISTER
189  */
190 #define	OP_CTS	0x01	/* Enable CTS */
191 #define OP_DSR	0x02	/* Enable DSR */
192 /*
193  *	INPUT PORT REGISTER
194  */
195 #define	IP_DCD	0x04	/* DCD High */
196 #define IP_DTR	0x20	/* DTR High */
197 #define IP_RTS	0x02	/* RTS High */
198 #define	IP_RI	0x40	/* RI  High */
199 
200 /*
201  *	Mode register and uart specific stuff
202  */
203 /*
204  *	MODE REGISTER 1
205  */
206 #define	MR1_5_BITS	0x00
207 #define	MR1_6_BITS	0x01
208 #define	MR1_7_BITS	0x02
209 #define	MR1_8_BITS	0x03
210 /*
211  *	Parity
212  */
213 #define	MR1_ODD		0x04
214 #define	MR1_EVEN	0x00
215 /*
216  *	Parity mode
217  */
218 #define	MR1_WITH	0x00
219 #define	MR1_FORCE	0x08
220 #define	MR1_NONE	0x10
221 #define	MR1_SPECIAL	0x18
222 /*
223  *	Error mode
224  */
225 #define	MR1_CHAR	0x00
226 #define	MR1_BLOCK	0x20
227 /*
228  *	Request to send line automatic control
229  */
230 #define	MR1_CTSCONT	0x80
231 
232 /*
233  *	MODE REGISTER 2
234  */
235 /*
236  *	Number of stop bits
237  */
238 #define	MR2_1_STOP	0x07
239 #define	MR2_2_STOP	0x0F
240 /*
241  *	Clear to send automatic testing before character sent
242  */
243 #define	MR2_RTSCONT	0x10
244 /*
245  *	Reset RTS automatically after sending character?
246  */
247 #define	MR2_CTSCONT	0x20
248 /*
249  *	Channel mode
250  */
251 #define	MR2_NORMAL	0x00
252 #define	MR2_AUTO	0x40
253 #define	MR2_LOCAL	0x80
254 #define	MR2_REMOTE	0xC0
255 
256 /*
257  *	CLOCK SELECT REGISTER - this and the code assumes ispeed == ospeed
258  */
259 /*
260  * Clocking rates are in lower and upper nibbles.. R = upper, T = lower
261  */
262 #define	CLK75		0x0
263 #define	CLK110		0x1	/* 110 on XIO!! */
264 #define	CLK38400	0x2	/* out of sequence */
265 #define	CLK150		0x3
266 #define	CLK300		0x4
267 #define	CLK600		0x5
268 #define	CLK1200		0x6
269 #define	CLK2000		0x7
270 #define	CLK2400		0x8
271 #define	CLK4800		0x9
272 #define	CLK7200		0xa	/* unchecked */
273 #define	CLK9600		0xb
274 #define	CLK19200	0xc
275 #define	CLK57600	0xd
276 
277 /*
278  * Per-port (channel) soft information structure, stored in the driver.
279  * This is visible via ioctl()'s.
280  */
281 struct si_port {
282 	volatile struct si_channel *sp_ccb;
283 	struct tty	*sp_tty;
284 	int		sp_pend;	/* pending command */
285 	int		sp_last_hi_ip;	/* cached DCD */
286 	int		sp_state;
287 	int		sp_delta_overflows;
288 	struct callout_handle lstart_ch;/* For canceling our timeout */
289 	int		sp_debug;	/* debug mask */
290 	char		sp_name[5];
291 };
292 
293 /* sp_state */
294 /*			0x0001	--					*/
295 /*			0x0002	--					*/
296 /*			0x0004	--					*/
297 /*			0x0008	--					*/
298 /*			0x0010	--					*/
299 /*			0x0020	--					*/
300 /*			0x0040	-- 	 				*/
301 /*			0x0080	-- 	 				*/
302 #define SS_LSTART	0x0100	/* lstart timeout pending		*/
303 /*			0x0200	--					*/
304 /*			0x0400	--					*/
305 /*			0x0800	--					*/
306 
307 /*
308  *	Command post flags
309  */
310 #define	SI_NOWAIT	0x00	/* Don't wait for command */
311 #define SI_WAIT		0x01	/* Wait for complete */
312 
313 /*
314  *	SI ioctls
315  */
316 /*
317  * struct for use by Specialix ioctls - used by siconfig(8)
318  */
319 typedef struct {
320 	unsigned char
321 		sid_port:5,			/* 0 - 31 ports per card */
322 		sid_card:2,			/* 0 - 3 cards */
323 		sid_control:1;			/* controlling device (all cards) */
324 } sidev_t;
325 struct si_tcsi {
326 	sidev_t	tc_dev;
327 	union {
328 		int	x_int;
329 		int	x_dbglvl;
330 	}	tc_action;
331 #define	tc_card		tc_dev.sid_card
332 #define	tc_port		tc_dev.sid_port
333 #define	tc_int		tc_action.x_int
334 #define	tc_dbglvl	tc_action.x_dbglvl
335 };
336 
337 struct si_pstat {
338 	sidev_t	tc_dev;
339 	union {
340 		struct si_port    x_siport;
341 		struct si_channel x_ccb;
342 		struct tty        x_tty;
343 	} tc_action;
344 #define tc_siport	tc_action.x_siport
345 #define tc_ccb		tc_action.x_ccb
346 #define tc_tty		tc_action.x_tty
347 };
348 
349 #define	IOCTL_MIN	96
350 #define	TCSIDEBUG	_IOW('S', 96, struct si_tcsi)	/* Toggle debug */
351 #define	TCSIRXIT	_IOW('S', 97, struct si_tcsi)	/* RX int throttle */
352 #define	TCSIIT		_IOW('S', 98, struct si_tcsi)	/* TX int throttle */
353 			/* 99 defunct */
354 			/* 100 defunct */
355 			/* 101 defunct */
356 			/* 102 defunct */
357 			/* 103 defunct */
358 			/* 104 defunct */
359 #define	TCSISTATE	_IOWR('S', 105, struct si_tcsi)	/* get current state of RTS
360 						   DCD and DTR pins */
361 			/* 106 defunct */
362 #define	TCSIPORTS	_IOR('S', 107, int)	/* Number of ports found */
363 #define	TCSISDBG_LEVEL	_IOW('S', 108, struct si_tcsi)	/* equivalent of TCSIDEBUG which sets a
364 					 * particular debug level (DBG_??? bit
365 					 * mask), default is 0xffff */
366 #define	TCSIGDBG_LEVEL	_IOWR('S', 109, struct si_tcsi)
367 #define	TCSIGRXIT	_IOWR('S', 110, struct si_tcsi)
368 #define	TCSIGIT		_IOWR('S', 111, struct si_tcsi)
369 			/* 112 defunct */
370 			/* 113 defunct */
371 			/* 114 defunct */
372 			/* 115 defunct */
373 			/* 116 defunct */
374 			/* 117 defunct */
375 
376 #define	TCSISDBG_ALL	_IOW('S', 118, int)		/* set global debug level */
377 #define	TCSIGDBG_ALL	_IOR('S', 119, int)		/* get global debug level */
378 
379 			/* 120 defunct */
380 			/* 121 defunct */
381 			/* 122 defunct */
382 			/* 123 defunct */
383 #define	TCSIMODULES	_IOR('S', 124, int)	/* Number of modules found */
384 
385 /* Various stats and monitoring hooks per tty device */
386 #define	TCSI_PORT	_IOWR('S', 125, struct si_pstat) /* get si_port */
387 #define	TCSI_CCB	_IOWR('S', 126, struct si_pstat) /* get si_ccb */
388 
389 #define	IOCTL_MAX	127
390 
391 #define	IS_SI_IOCTL(cmd)	((u_int)((cmd)&0xff00) == ('S'<<8) && \
392 		(u_int)((cmd)&0xff) >= IOCTL_MIN && \
393 		(u_int)((cmd)&0xff) <= IOCTL_MAX)
394 
395 #define	CONTROLDEV	"/dev/si_control"
396