Fix the way <sys/ioccom.h> is included throughout our tree.
[dragonfly.git] / sys / dev / serial / 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: src/sys/dev/si/si.h,v 1.16 2000/01/24 07:24:00 peter Exp $
34  * $DragonFly: src/sys/dev/serial/si/si.h,v 1.4 2004/09/19 01:20:42 dillon Exp $
35  */
36
37 #include <sys/callout.h>
38 #include <sys/ioccom.h>
39
40 /*
41  * Macro to turn a device number into various parameters, and test for
42  * CONTROL device.
43  * max of 4 controllers with up to 32 ports per controller.
44  * minor device allocation is:
45  * adapter      port
46  *   0          0-31
47  *   1          32-63
48  *   2          64-95
49  *   3          96-127
50  */
51 #define SI_MAXPORTPERCARD       32
52 #define SI_MAXCONTROLLER        4
53
54
55 /*
56  * breakup of minor device number:
57  * lowest 5 bits:       port number on card             0x1f
58  * next 2 bits:         card number                     0x60
59  * top bit:             callout                         0x80
60  * next 8 bits is the major number
61  * next 2 bits select initial/lock states
62  * next 1 bit selects the master control device
63  */
64
65 #define SI_PORT_MASK            0x1f
66 #define SI_CARD_MASK            0x60
67 #define SI_TTY_MASK             0x7f
68 #define SI_CALLOUT_MASK         0x80
69 #define SI_INIT_STATE_MASK      0x10000
70 #define SI_LOCK_STATE_MASK      0x20000
71 #define SI_STATE_MASK           0x30000
72 #define SI_CONTROLDEV_MASK      0x40000
73 #define SI_SPECIAL_MASK         0x70000
74
75 #define SI_CARDSHIFT            5
76 #define SI_PORT(m)              (m & SI_PORT_MASK)
77 #define SI_CARD(m)              ((m & SI_CARD_MASK) >> SI_CARDSHIFT)
78 #define SI_TTY(m)               (m & SI_TTY_MASK)
79
80 #define IS_CALLOUT(m)           (m & SI_CALLOUT_MASK)
81 #define IS_STATE(m)             (m & SI_STATE_MASK)
82 #define IS_CONTROLDEV(m)        (m & SI_CONTROLDEV_MASK)
83 #define IS_SPECIAL(m)           (m & SI_SPECIAL_MASK)
84
85 #define MINOR2SC(m)     ((struct si_softc *)devclass_get_softc(si_devclass, SI_CARD(m)))
86 #define MINOR2PP(m)     (MINOR2SC((m))->sc_ports + SI_PORT((m)))
87 #define MINOR2TP(m)     (MINOR2PP((m))->sp_tty)
88 #define TP2PP(tp)       (MINOR2PP(SI_TTY(minor((tp)->t_dev))))
89
90 /* Buffer parameters */
91 #define SI_BUFFERSIZE   256
92
93 typedef unsigned char   BYTE;           /* Type cast for unsigned 8 bit */
94 typedef unsigned short  WORD;           /* Type cast for unsigned 16 bit */
95
96
97 /*
98  * Hardware `registers', stored in the shared memory.
99  * These are related to the firmware running on the Z280.
100  */
101
102 struct si_reg   {
103         BYTE    initstat;
104         BYTE    memsize;
105         WORD    int_count;
106         WORD    revision;
107         BYTE    rx_int_count;           /* isr_count on Jet */  
108         BYTE    main_count;             /* spare on Z-280 */
109         WORD    int_pending;
110         WORD    int_counter;
111         BYTE    int_scounter;
112         BYTE    res[0x80 - 13];
113 };
114
115 /*
116  *      Per module control structure, stored in shared memory.
117  */
118 struct si_module {
119         WORD    sm_next;                /* Next module */
120         BYTE    sm_type;                /* Number of channels */
121         BYTE    sm_number;              /* Module number on cable */
122         BYTE    sm_dsr;                 /* Private dsr copy */
123         BYTE    sm_res[0x80 - 5];       /* Reserve space to 128 bytes */
124 };
125
126 /*
127  *      The 'next' pointer & with 0x7fff + SI base addres give
128  *      the address of the next module block if fitted. (else 0)
129  *      Note that next points to the TX buffer so 0x60 must be
130  *      subtracted to find the true base.
131  */
132 #define TA4             0x00
133 #define TA8             0x08
134 #define TA4_ASIC        0x0A
135 #define TA8_ASIC        0x0B
136 #define MTA             0x28
137 #define SXDC            0x48
138
139 /*
140  *      Per channel(port) control structure, stored in shared memory.
141  */
142 struct  si_channel {
143         /*
144          * Generic stuff
145          */
146         WORD    next;                   /* Next Channel */
147         WORD    addr_uart;              /* Uart address */
148         WORD    module;                 /* address of module struct */
149         BYTE    type;                   /* Uart type */
150         BYTE    fill;
151         /*
152          * Uart type specific stuff
153          */
154         BYTE    x_status;               /* XON / XOFF status */
155         BYTE    c_status;               /* cooking status */
156         BYTE    hi_rxipos;              /* stuff into rx buff */
157         BYTE    hi_rxopos;              /* stuff out of rx buffer */
158         BYTE    hi_txopos;              /* Stuff into tx ptr */
159         BYTE    hi_txipos;              /* ditto out */
160         BYTE    hi_stat;                /* Command register */
161         BYTE    dsr_bit;                /* Magic bit for DSR */
162         BYTE    txon;                   /* TX XON char */
163         BYTE    txoff;                  /* ditto XOFF */
164         BYTE    rxon;                   /* RX XON char */
165         BYTE    rxoff;                  /* ditto XOFF */
166         BYTE    hi_mr1;                 /* mode 1 image */
167         BYTE    hi_mr2;                 /* mode 2 image */
168         BYTE    hi_csr;                 /* clock register */
169         BYTE    hi_op;                  /* Op control */
170         BYTE    hi_ip;                  /* Input pins */
171         BYTE    hi_state;               /* status */
172         BYTE    hi_prtcl;               /* Protocol */
173         BYTE    hi_txon;                /* host copy tx xon stuff */
174         BYTE    hi_txoff;
175         BYTE    hi_rxon;
176         BYTE    hi_rxoff;
177         BYTE    close_prev;             /* Was channel previously closed */
178         BYTE    hi_break;               /* host copy break process */
179         BYTE    break_state;            /* local copy ditto */
180         BYTE    hi_mask;                /* Mask for CS7 etc. */
181         BYTE    mask_z280;              /* Z280's copy */
182         BYTE    res[0x60 - 36];
183         BYTE    hi_txbuf[SI_BUFFERSIZE];
184         BYTE    hi_rxbuf[SI_BUFFERSIZE];
185         BYTE    res1[0xA0];
186 };
187
188 /*
189  *      Register definitions
190  */
191
192 /*
193  *      Break input control register definitions
194  */
195 #define BR_IGN          0x01    /* Ignore any received breaks */
196 #define BR_INT          0x02    /* Interrupt on received break */
197 #define BR_PARMRK       0x04    /* Enable parmrk parity error processing */
198 #define BR_PARIGN       0x08    /* Ignore chars with parity errors */
199
200 /*
201  *      Protocol register provided by host for XON/XOFF and cooking
202  */
203 #define SP_TANY         0x01    /* Tx XON any char */
204 #define SP_TXEN         0x02    /* Tx XON/XOFF enabled */
205 #define SP_CEN          0x04    /* Cooking enabled */
206 #define SP_RXEN         0x08    /* Rx XON/XOFF enabled */
207 #define SP_DCEN         0x20    /* DCD / DTR check */
208 #define SP_PAEN         0x80    /* Parity checking enabled */
209
210 /*
211  *      HOST STATUS / COMMAND REGISTER
212  */
213 #define IDLE_OPEN       0x00    /* Default mode, TX and RX polled
214                                    buffer updated etc */
215 #define LOPEN           0x02    /* Local open command (no modem ctl */
216 #define MOPEN           0x04    /* Open and monitor modem lines (blocks
217                                    for DCD */
218 #define MPEND           0x06    /* Wating for DCD */
219 #define CONFIG          0x08    /* Channel config has changed */
220 #define CLOSE           0x0A    /* Close channel */
221 #define SBREAK          0x0C    /* Start break */
222 #define EBREAK          0x0E    /* End break */
223 #define IDLE_CLOSE      0x10    /* Closed channel */
224 #define IDLE_BREAK      0x12    /* In a break */
225 #define FCLOSE          0x14    /* Force a close */
226 #define RESUME          0x16    /* Clear a pending xoff */
227 #define WFLUSH          0x18    /* Flush output buffer */
228 #define RFLUSH          0x1A    /* Flush input buffer */
229
230 /*
231  *      Host status register
232  */
233 #define ST_BREAK        0x01    /* Break received (clear with config) */
234
235 /*
236  *      OUTPUT PORT REGISTER
237  */
238 #define OP_CTS  0x01    /* Enable CTS */
239 #define OP_DSR  0x02    /* Enable DSR */
240 /*
241  *      INPUT PORT REGISTER
242  */
243 #define IP_DCD  0x04    /* DCD High */
244 #define IP_DTR  0x20    /* DTR High */
245 #define IP_RTS  0x02    /* RTS High */
246 #define IP_RI   0x40    /* RI  High */
247
248 /*
249  *      Mode register and uart specific stuff
250  */
251 /*
252  *      MODE REGISTER 1
253  */
254 #define MR1_5_BITS      0x00
255 #define MR1_6_BITS      0x01
256 #define MR1_7_BITS      0x02
257 #define MR1_8_BITS      0x03
258 /*
259  *      Parity
260  */
261 #define MR1_ODD         0x04
262 #define MR1_EVEN        0x00
263 /*
264  *      Parity mode
265  */
266 #define MR1_WITH        0x00
267 #define MR1_FORCE       0x08
268 #define MR1_NONE        0x10
269 #define MR1_SPECIAL     0x18
270 /*
271  *      Error mode
272  */
273 #define MR1_CHAR        0x00
274 #define MR1_BLOCK       0x20
275 /*
276  *      Request to send line automatic control
277  */
278 #define MR1_CTSCONT     0x80
279
280 /*
281  *      MODE REGISTER 2
282  */
283 /*
284  *      Number of stop bits
285  */
286 #define MR2_1_STOP      0x07
287 #define MR2_2_STOP      0x0F
288 /*
289  *      Clear to send automatic testing before character sent
290  */
291 #define MR2_RTSCONT     0x10
292 /*
293  *      Reset RTS automatically after sending character?
294  */
295 #define MR2_CTSCONT     0x20
296 /*
297  *      Channel mode
298  */
299 #define MR2_NORMAL      0x00
300 #define MR2_AUTO        0x40
301 #define MR2_LOCAL       0x80
302 #define MR2_REMOTE      0xC0
303
304 /*
305  *      CLOCK SELECT REGISTER - this and the code assumes ispeed == ospeed
306  */
307 /*
308  * Clocking rates are in lower and upper nibbles.. R = upper, T = lower
309  */
310 #define CLK75           0x0
311 #define CLK110          0x1     /* 110 on XIO!! */
312 #define CLK38400        0x2     /* out of sequence */
313 #define CLK150          0x3
314 #define CLK300          0x4
315 #define CLK600          0x5
316 #define CLK1200         0x6
317 #define CLK2000         0x7
318 #define CLK2400         0x8
319 #define CLK4800         0x9
320 #define CLK7200         0xa     /* unchecked */
321 #define CLK9600         0xb
322 #define CLK19200        0xc
323 #define CLK57600        0xd
324
325 /*
326  * Per-port (channel) soft information structure, stored in the driver.
327  * This is visible via ioctl()'s.
328  */
329 struct si_port {
330         volatile struct si_channel *sp_ccb;
331         struct tty      *sp_tty;
332         int             sp_pend;        /* pending command */
333         int             sp_last_hi_ip;  /* cached DCD */
334         int             sp_state;
335         int             sp_active_out;  /* callout is open */
336         int             sp_dtr_wait;    /* DTR holddown in hz */
337         int             sp_delta_overflows;
338         u_int           sp_wopeners;    /* # procs waiting DCD */
339         u_char          sp_hotchar;     /* ldisc specific ASAP char */
340         /* Initial state. */
341         struct termios  sp_iin;
342         struct termios  sp_iout;
343         /* Lock state. */
344         struct termios  sp_lin;
345         struct termios  sp_lout;
346         struct callout  lstart_ch;      /* For canceling our timeout */
347         struct callout  dtr_ch;         /* DTR wakeup */
348 #ifdef  SI_DEBUG
349         int             sp_debug;       /* debug mask */
350 #endif
351 };
352
353 /* sp_state */
354 #define SS_CLOSED       0x0000
355 #define SS_OPEN         0x0001  /* Port is active                       */
356 /*                      0x0002  --                                      */
357 /*                      0x0004  --                                      */
358 /*                      0x0008  --                                      */
359 /*                      0x0010  --                                      */
360 /*                      0x0020  --                                      */
361 /*                      0x0040  --                                      */
362 /*                      0x0080  --                                      */
363 #define SS_LSTART       0x0100  /* lstart timeout pending               */
364 #define SS_INLSTART     0x0200  /* running an lstart induced t_oproc    */
365 #define SS_CLOSING      0x0400  /* in the middle of a siclose()         */
366 /*                      0x0800  --                                      */
367 #define SS_WAITWRITE    0x1000
368 #define SS_BLOCKWRITE   0x2000
369 #define SS_DTR_OFF      0x4000  /* DTR held off                         */
370
371 /*
372  *      Command post flags
373  */
374 #define SI_NOWAIT       0x00    /* Don't wait for command */
375 #define SI_WAIT         0x01    /* Wait for complete */
376
377 /*
378  * Extensive debugging stuff - manipulated using siconfig(8)
379  */
380 #define DBG_ENTRY               0x00000001
381 #define DBG_DRAIN               0x00000002
382 #define DBG_OPEN                0x00000004
383 #define DBG_CLOSE               0x00000008
384 #define DBG_READ                0x00000010
385 #define DBG_WRITE               0x00000020
386 #define DBG_PARAM               0x00000040
387 #define DBG_INTR                0x00000080
388 #define DBG_IOCTL               0x00000100
389 /*                              0x00000200 */
390 #define DBG_SELECT              0x00000400
391 #define DBG_OPTIM               0x00000800
392 #define DBG_START               0x00001000
393 #define DBG_EXIT                0x00002000
394 #define DBG_FAIL                0x00004000
395 #define DBG_STOP                0x00008000
396 #define DBG_AUTOBOOT            0x00010000
397 #define DBG_MODEM               0x00020000
398 #define DBG_DOWNLOAD            0x00040000
399 #define DBG_LSTART              0x00080000
400 #define DBG_POLL                0x00100000
401 #define DBG_ALL                 0xffffffff
402
403 /*
404  *      SI ioctls
405  */
406 /*
407  * struct for use by Specialix ioctls - used by siconfig(8)
408  */
409 typedef struct {
410         unsigned char
411                 sid_port:5,                     /* 0 - 31 ports per card */
412                 sid_card:2,                     /* 0 - 3 cards */
413                 sid_control:1;                  /* controlling device (all cards) */
414 } sidev_t;
415 struct si_tcsi {
416         sidev_t tc_dev;
417         union {
418                 int     x_int;
419                 int     x_dbglvl;
420         }       tc_action;
421 #define tc_card         tc_dev.sid_card
422 #define tc_port         tc_dev.sid_port
423 #define tc_int          tc_action.x_int
424 #define tc_dbglvl       tc_action.x_dbglvl
425 };
426
427 struct si_pstat {
428         sidev_t tc_dev;
429         union {
430                 struct si_port    x_siport;
431                 struct si_channel x_ccb;
432                 struct tty        x_tty;
433         } tc_action;
434 #define tc_siport       tc_action.x_siport
435 #define tc_ccb          tc_action.x_ccb
436 #define tc_tty          tc_action.x_tty
437 };
438
439 #define IOCTL_MIN       96
440 #define TCSIDEBUG       _IOW('S', 96, struct si_tcsi)   /* Toggle debug */
441 #define TCSIRXIT        _IOW('S', 97, struct si_tcsi)   /* RX int throttle */
442 #define TCSIIT          _IOW('S', 98, struct si_tcsi)   /* TX int throttle */
443                         /* 99 defunct */
444                         /* 100 defunct */
445                         /* 101 defunct */
446                         /* 102 defunct */
447                         /* 103 defunct */
448                         /* 104 defunct */
449 #define TCSISTATE       _IOWR('S', 105, struct si_tcsi) /* get current state of RTS
450                                                    DCD and DTR pins */
451                         /* 106 defunct */
452 #define TCSIPORTS       _IOR('S', 107, int)     /* Number of ports found */
453 #define TCSISDBG_LEVEL  _IOW('S', 108, struct si_tcsi)  /* equivalent of TCSIDEBUG which sets a
454                                          * particular debug level (DBG_??? bit
455                                          * mask), default is 0xffff */
456 #define TCSIGDBG_LEVEL  _IOWR('S', 109, struct si_tcsi)
457 #define TCSIGRXIT       _IOWR('S', 110, struct si_tcsi)
458 #define TCSIGIT         _IOWR('S', 111, struct si_tcsi)
459                         /* 112 defunct */
460                         /* 113 defunct */
461                         /* 114 defunct */
462                         /* 115 defunct */
463                         /* 116 defunct */
464                         /* 117 defunct */
465
466 #define TCSISDBG_ALL    _IOW('S', 118, int)             /* set global debug level */
467 #define TCSIGDBG_ALL    _IOR('S', 119, int)             /* get global debug level */
468
469                         /* 120 defunct */
470                         /* 121 defunct */
471                         /* 122 defunct */
472                         /* 123 defunct */
473 #define TCSIMODULES     _IOR('S', 124, int)     /* Number of modules found */
474
475 /* Various stats and monitoring hooks per tty device */
476 #define TCSI_PORT       _IOWR('S', 125, struct si_pstat) /* get si_port */
477 #define TCSI_CCB        _IOWR('S', 126, struct si_pstat) /* get si_ccb */
478 #define TCSI_TTY        _IOWR('S', 127, struct si_pstat) /* get tty struct */
479
480 #define IOCTL_MAX       127
481
482 #define IS_SI_IOCTL(cmd)        ((u_int)((cmd)&0xff00) == ('S'<<8) && \
483                 (u_int)((cmd)&0xff) >= IOCTL_MIN && \
484                 (u_int)((cmd)&0xff) <= IOCTL_MAX)
485
486 #define CONTROLDEV      "/dev/si_control"