FreeBSD/Linux Kernel Cross Reference
sys/dev/si/si.h
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"
Cache object: 07f88bf01d53fe684593aad423ac0e49
|