xref: /dragonfly/sys/dev/serial/sio/sio_private.h (revision ef3ac1d1)
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);
179