Merge from vendor branch CVS:
[dragonfly.git] / sys / dev / serial / sio / sio_private.h
1 /*-
2  * Copyright (c) 1991 The Regents of the University of California.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *      This product includes software developed by the University of
16  *      California, Berkeley and its contributors.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  *
33  * $DragonFly: src/sys/dev/serial/sio/sio_private.h,v 1.2 2004/09/19 02:05:54 dillon Exp $
34  */
35
36 #ifdef COM_MULTIPORT
37 /* checks in flags for multiport and which is multiport "master chip"
38  * for a given card
39  */
40 #define COM_ISMULTIPORT(flags)  ((flags) & 0x01)
41 #define COM_MPMASTER(flags)     (((flags) >> 8) & 0x0ff)
42 #define COM_NOTAST4(flags)      ((flags) & 0x04)
43 #endif /* COM_MULTIPORT */
44
45 #define COM_CONSOLE(flags)      ((flags) & 0x10)
46 #define COM_FORCECONSOLE(flags) ((flags) & 0x20)
47 #define COM_LLCONSOLE(flags)    ((flags) & 0x40)
48 #define COM_DEBUGGER(flags)     ((flags) & 0x80)
49 #define COM_LOSESOUTINTS(flags) ((flags) & 0x08)
50 #define COM_NOFIFO(flags)               ((flags) & 0x02)
51 #define COM_ST16650A(flags)     ((flags) & 0x20000)
52 #define COM_C_NOPROBE           (0x40000)
53 #define COM_NOPROBE(flags)      ((flags) & COM_C_NOPROBE)
54 #define COM_C_IIR_TXRDYBUG      (0x80000)
55 #define COM_IIR_TXRDYBUG(flags) ((flags) & COM_C_IIR_TXRDYBUG)
56 #define COM_TI16754(flags)      ((flags) & 0x200000)
57 #define COM_FIFOSIZE(flags)     (((flags) & 0xff000000) >> 24)
58
59 #define CE_NTYPES                       3
60 #define CE_RECORD(com, errnum)          (++(com)->delta_error_counts[errnum])
61
62 /* types.  XXX - should be elsewhere */
63 typedef u_int   Port_t;         /* hardware port */
64 typedef u_char  bool_t;         /* boolean */
65
66 /* queue of linear buffers */
67 struct lbq {
68         u_char  *l_head;        /* next char to process */
69         u_char  *l_tail;        /* one past the last char to process */
70         struct lbq *l_next;     /* next in queue */
71         bool_t  l_queued;       /* nonzero if queued */
72 };
73
74 /* com device structure */
75 struct com_s {
76         u_int   flags;          /* Copy isa device flags */
77         u_char  state;          /* miscellaneous flag bits */
78         bool_t  active_out;     /* nonzero if the callout device is open */
79         u_char  cfcr_image;     /* copy of value written to CFCR */
80 #ifdef COM_ESP
81         bool_t  esp;            /* is this unit a hayes esp board? */
82 #endif
83         u_char  extra_state;    /* more flag bits, separate for order trick */
84         u_char  fifo_image;     /* copy of value written to FIFO */
85         bool_t  hasfifo;        /* nonzero for 16550 UARTs */
86         bool_t  st16650a;       /* Is a Startech 16650A or RTS/CTS compat */
87         bool_t  loses_outints;  /* nonzero if device loses output interrupts */
88         u_char  mcr_image;      /* copy of value written to MCR */
89 #ifdef COM_MULTIPORT
90         bool_t  multiport;      /* is this unit part of a multiport device? */
91 #endif /* COM_MULTIPORT */
92         bool_t  no_irq;         /* nonzero if irq is not attached */
93         bool_t  gone;           /* hardware disappeared */
94         bool_t  poll;           /* nonzero if polling is required */
95         bool_t  poll_output;    /* nonzero if polling for output is required */
96         int     unit;           /* unit number */
97         int     dtr_wait;       /* time to hold DTR down on close (* 1/hz) */
98         struct callout dtr_ch;
99         struct callout busy_ch;
100         u_int   tx_fifo_size;
101         u_int   wopeners;       /* # processes waiting for DCD in open() */
102
103         /*
104          * The high level of the driver never reads status registers directly
105          * because there would be too many side effects to handle conveniently.
106          * Instead, it reads copies of the registers stored here by the
107          * interrupt handler.
108          */
109         u_char  last_modem_status;      /* last MSR read by intr handler */
110         u_char  prev_modem_status;      /* last MSR handled by high level */
111
112         u_char  hotchar;        /* ldisc-specific char to be handled ASAP */
113         u_char  *ibuf;          /* start of input buffer */
114         u_char  *ibufend;       /* end of input buffer */
115         u_char  *ibufold;       /* old input buffer, to be freed */
116         u_char  *ihighwater;    /* threshold in input buffer */
117         u_char  *iptr;          /* next free spot in input buffer */
118         int     ibufsize;       /* size of ibuf (not include error bytes) */
119         int     ierroff;        /* offset of error bytes in ibuf */
120
121         struct lbq      obufq;  /* head of queue of output buffers */
122         struct lbq      obufs[2];       /* output buffers */
123
124         bus_space_tag_t         bst;
125         bus_space_handle_t      bsh;
126
127         Port_t  data_port;      /* i/o ports */
128 #ifdef COM_ESP
129         Port_t  esp_port;
130 #endif
131         Port_t  int_id_port;
132         Port_t  modem_ctl_port;
133         Port_t  line_status_port;
134         Port_t  modem_status_port;
135         Port_t  intr_ctl_port;  /* Ports of IIR register */
136
137         struct tty      *tp;    /* cross reference */
138
139         /* Initial state. */
140         struct termios  it_in;  /* should be in struct tty */
141         struct termios  it_out;
142
143         /* Lock state. */
144         struct termios  lt_in;  /* should be in struct tty */
145         struct termios  lt_out;
146
147         bool_t  do_timestamp;
148         bool_t  do_dcd_timestamp;
149         struct timeval  timestamp;
150         struct timeval  dcd_timestamp;
151         struct  pps_state pps;
152
153         u_long  bytes_in;       /* statistics */
154         u_long  bytes_out;
155         u_int   delta_error_counts[CE_NTYPES];
156         u_long  error_counts[CE_NTYPES];
157
158         u_long  rclk;
159
160         struct resource *irqres;
161         struct resource *ioportres;
162         void *cookie;
163
164         /*
165          * Data area for output buffers.  Someday we should build the output
166          * buffer queue without copying data.
167          */
168         u_char  obuf1[256];
169         u_char  obuf2[256];
170 };
171
172 #define SET_FLAG(dev, bit) device_set_flags(dev, device_get_flags(dev) | (bit))
173 #define CLR_FLAG(dev, bit) device_set_flags(dev, device_get_flags(dev) & ~(bit))
174
175 extern devclass_t       sio_devclass;
176
177 int     sioattach       (device_t dev, int rid, u_long rclk);
178 int     sioprobe        (device_t dev, int xrid, u_long rclk);