xref: /dflybsd-src/sys/dev/serial/sio/sio_private.h (revision 2c64e990ea2bb1213bd0758af732469466873ba6)
18c5c0470SJoerg Sonnenberger /*-
28c5c0470SJoerg Sonnenberger  * Copyright (c) 1991 The Regents of the University of California.
38c5c0470SJoerg Sonnenberger  * All rights reserved.
48c5c0470SJoerg Sonnenberger  *
58c5c0470SJoerg Sonnenberger  * Redistribution and use in source and binary forms, with or without
68c5c0470SJoerg Sonnenberger  * modification, are permitted provided that the following conditions
78c5c0470SJoerg Sonnenberger  * are met:
88c5c0470SJoerg Sonnenberger  * 1. Redistributions of source code must retain the above copyright
98c5c0470SJoerg Sonnenberger  *    notice, this list of conditions and the following disclaimer.
108c5c0470SJoerg Sonnenberger  * 2. Redistributions in binary form must reproduce the above copyright
118c5c0470SJoerg Sonnenberger  *    notice, this list of conditions and the following disclaimer in the
128c5c0470SJoerg Sonnenberger  *    documentation and/or other materials provided with the distribution.
13*2c64e990Szrj  * 3. Neither the name of the University nor the names of its contributors
148c5c0470SJoerg Sonnenberger  *    may be used to endorse or promote products derived from this software
158c5c0470SJoerg Sonnenberger  *    without specific prior written permission.
168c5c0470SJoerg Sonnenberger  *
178c5c0470SJoerg Sonnenberger  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
188c5c0470SJoerg Sonnenberger  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
198c5c0470SJoerg Sonnenberger  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
208c5c0470SJoerg Sonnenberger  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
218c5c0470SJoerg Sonnenberger  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
228c5c0470SJoerg Sonnenberger  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
238c5c0470SJoerg Sonnenberger  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
248c5c0470SJoerg Sonnenberger  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
258c5c0470SJoerg Sonnenberger  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
268c5c0470SJoerg Sonnenberger  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
278c5c0470SJoerg Sonnenberger  * SUCH DAMAGE.
288c5c0470SJoerg Sonnenberger  *
29917e5fdaSMatthew Dillon  * $DragonFly: src/sys/dev/serial/sio/sio_private.h,v 1.2 2004/09/19 02:05:54 dillon Exp $
308c5c0470SJoerg Sonnenberger  */
318c5c0470SJoerg Sonnenberger 
328c5c0470SJoerg Sonnenberger #ifdef COM_MULTIPORT
338c5c0470SJoerg Sonnenberger /* checks in flags for multiport and which is multiport "master chip"
348c5c0470SJoerg Sonnenberger  * for a given card
358c5c0470SJoerg Sonnenberger  */
368c5c0470SJoerg Sonnenberger #define	COM_ISMULTIPORT(flags)	((flags) & 0x01)
378c5c0470SJoerg Sonnenberger #define	COM_MPMASTER(flags)	(((flags) >> 8) & 0x0ff)
388c5c0470SJoerg Sonnenberger #define	COM_NOTAST4(flags)	((flags) & 0x04)
398c5c0470SJoerg Sonnenberger #endif /* COM_MULTIPORT */
408c5c0470SJoerg Sonnenberger 
418c5c0470SJoerg Sonnenberger #define	COM_CONSOLE(flags)	((flags) & 0x10)
428c5c0470SJoerg Sonnenberger #define	COM_FORCECONSOLE(flags)	((flags) & 0x20)
438c5c0470SJoerg Sonnenberger #define	COM_LLCONSOLE(flags)	((flags) & 0x40)
448c5c0470SJoerg Sonnenberger #define	COM_DEBUGGER(flags)	((flags) & 0x80)
458c5c0470SJoerg Sonnenberger #define	COM_LOSESOUTINTS(flags)	((flags) & 0x08)
468c5c0470SJoerg Sonnenberger #define	COM_NOFIFO(flags)		((flags) & 0x02)
478c5c0470SJoerg Sonnenberger #define COM_ST16650A(flags)	((flags) & 0x20000)
488c5c0470SJoerg Sonnenberger #define COM_C_NOPROBE		(0x40000)
498c5c0470SJoerg Sonnenberger #define COM_NOPROBE(flags)	((flags) & COM_C_NOPROBE)
508c5c0470SJoerg Sonnenberger #define COM_C_IIR_TXRDYBUG	(0x80000)
518c5c0470SJoerg Sonnenberger #define COM_IIR_TXRDYBUG(flags)	((flags) & COM_C_IIR_TXRDYBUG)
528c5c0470SJoerg Sonnenberger #define	COM_TI16754(flags)	((flags) & 0x200000)
538c5c0470SJoerg Sonnenberger #define	COM_FIFOSIZE(flags)	(((flags) & 0xff000000) >> 24)
548c5c0470SJoerg Sonnenberger 
558c5c0470SJoerg Sonnenberger #define	CE_NTYPES			3
568c5c0470SJoerg Sonnenberger #define	CE_RECORD(com, errnum)		(++(com)->delta_error_counts[errnum])
578c5c0470SJoerg Sonnenberger 
588c5c0470SJoerg Sonnenberger /* types.  XXX - should be elsewhere */
598c5c0470SJoerg Sonnenberger typedef u_int	Port_t;		/* hardware port */
608c5c0470SJoerg Sonnenberger typedef u_char	bool_t;		/* boolean */
618c5c0470SJoerg Sonnenberger 
628c5c0470SJoerg Sonnenberger /* queue of linear buffers */
638c5c0470SJoerg Sonnenberger struct lbq {
648c5c0470SJoerg Sonnenberger 	u_char	*l_head;	/* next char to process */
658c5c0470SJoerg Sonnenberger 	u_char	*l_tail;	/* one past the last char to process */
668c5c0470SJoerg Sonnenberger 	struct lbq *l_next;	/* next in queue */
678c5c0470SJoerg Sonnenberger 	bool_t	l_queued;	/* nonzero if queued */
688c5c0470SJoerg Sonnenberger };
698c5c0470SJoerg Sonnenberger 
708c5c0470SJoerg Sonnenberger /* com device structure */
718c5c0470SJoerg Sonnenberger struct com_s {
728c5c0470SJoerg Sonnenberger 	u_int	flags;		/* Copy isa device flags */
738c5c0470SJoerg Sonnenberger 	u_char	state;		/* miscellaneous flag bits */
748c5c0470SJoerg Sonnenberger 	bool_t  active_out;	/* nonzero if the callout device is open */
758c5c0470SJoerg Sonnenberger 	u_char	cfcr_image;	/* copy of value written to CFCR */
768c5c0470SJoerg Sonnenberger #ifdef COM_ESP
778c5c0470SJoerg Sonnenberger 	bool_t	esp;		/* is this unit a hayes esp board? */
788c5c0470SJoerg Sonnenberger #endif
798c5c0470SJoerg Sonnenberger 	u_char	extra_state;	/* more flag bits, separate for order trick */
808c5c0470SJoerg Sonnenberger 	u_char	fifo_image;	/* copy of value written to FIFO */
818c5c0470SJoerg Sonnenberger 	bool_t	hasfifo;	/* nonzero for 16550 UARTs */
828c5c0470SJoerg Sonnenberger 	bool_t	st16650a;	/* Is a Startech 16650A or RTS/CTS compat */
838c5c0470SJoerg Sonnenberger 	bool_t	loses_outints;	/* nonzero if device loses output interrupts */
848c5c0470SJoerg Sonnenberger 	u_char	mcr_image;	/* copy of value written to MCR */
858c5c0470SJoerg Sonnenberger #ifdef COM_MULTIPORT
868c5c0470SJoerg Sonnenberger 	bool_t	multiport;	/* is this unit part of a multiport device? */
878c5c0470SJoerg Sonnenberger #endif /* COM_MULTIPORT */
888c5c0470SJoerg Sonnenberger 	bool_t	no_irq;		/* nonzero if irq is not attached */
898c5c0470SJoerg Sonnenberger 	bool_t  gone;		/* hardware disappeared */
908c5c0470SJoerg Sonnenberger 	bool_t	poll;		/* nonzero if polling is required */
918c5c0470SJoerg Sonnenberger 	bool_t	poll_output;	/* nonzero if polling for output is required */
928c5c0470SJoerg Sonnenberger 	int	unit;		/* unit	number */
938c5c0470SJoerg Sonnenberger 	int	dtr_wait;	/* time to hold DTR down on close (* 1/hz) */
94917e5fdaSMatthew Dillon 	struct callout dtr_ch;
95917e5fdaSMatthew Dillon 	struct callout busy_ch;
968c5c0470SJoerg Sonnenberger 	u_int	tx_fifo_size;
978c5c0470SJoerg Sonnenberger 	u_int	wopeners;	/* # processes waiting for DCD in open() */
988c5c0470SJoerg Sonnenberger 
998c5c0470SJoerg Sonnenberger 	/*
1008c5c0470SJoerg Sonnenberger 	 * The high level of the driver never reads status registers directly
1018c5c0470SJoerg Sonnenberger 	 * because there would be too many side effects to handle conveniently.
1028c5c0470SJoerg Sonnenberger 	 * Instead, it reads copies of the registers stored here by the
1038c5c0470SJoerg Sonnenberger 	 * interrupt handler.
1048c5c0470SJoerg Sonnenberger 	 */
1058c5c0470SJoerg Sonnenberger 	u_char	last_modem_status;	/* last MSR read by intr handler */
1068c5c0470SJoerg Sonnenberger 	u_char	prev_modem_status;	/* last MSR handled by high level */
1078c5c0470SJoerg Sonnenberger 
1088c5c0470SJoerg Sonnenberger 	u_char	hotchar;	/* ldisc-specific char to be handled ASAP */
1098c5c0470SJoerg Sonnenberger 	u_char	*ibuf;		/* start of input buffer */
1108c5c0470SJoerg Sonnenberger 	u_char	*ibufend;	/* end of input buffer */
1118c5c0470SJoerg Sonnenberger 	u_char	*ibufold;	/* old input buffer, to be freed */
1128c5c0470SJoerg Sonnenberger 	u_char	*ihighwater;	/* threshold in input buffer */
1138c5c0470SJoerg Sonnenberger 	u_char	*iptr;		/* next free spot in input buffer */
1148c5c0470SJoerg Sonnenberger 	int	ibufsize;	/* size of ibuf (not include error bytes) */
1158c5c0470SJoerg Sonnenberger 	int	ierroff;	/* offset of error bytes in ibuf */
1168c5c0470SJoerg Sonnenberger 
1178c5c0470SJoerg Sonnenberger 	struct lbq	obufq;	/* head of queue of output buffers */
1188c5c0470SJoerg Sonnenberger 	struct lbq	obufs[2];	/* output buffers */
1198c5c0470SJoerg Sonnenberger 
1208c5c0470SJoerg Sonnenberger 	bus_space_tag_t		bst;
1218c5c0470SJoerg Sonnenberger 	bus_space_handle_t	bsh;
1228c5c0470SJoerg Sonnenberger 
1238c5c0470SJoerg Sonnenberger 	Port_t	data_port;	/* i/o ports */
1248c5c0470SJoerg Sonnenberger #ifdef COM_ESP
1258c5c0470SJoerg Sonnenberger 	Port_t	esp_port;
1268c5c0470SJoerg Sonnenberger #endif
1278c5c0470SJoerg Sonnenberger 	Port_t	int_id_port;
1288c5c0470SJoerg Sonnenberger 	Port_t	modem_ctl_port;
1298c5c0470SJoerg Sonnenberger 	Port_t	line_status_port;
1308c5c0470SJoerg Sonnenberger 	Port_t	modem_status_port;
1318c5c0470SJoerg Sonnenberger 	Port_t	intr_ctl_port;	/* Ports of IIR register */
1328c5c0470SJoerg Sonnenberger 
1338c5c0470SJoerg Sonnenberger 	struct tty	*tp;	/* cross reference */
1348c5c0470SJoerg Sonnenberger 
1358c5c0470SJoerg Sonnenberger 	/* Initial state. */
1368c5c0470SJoerg Sonnenberger 	struct termios	it_in;	/* should be in struct tty */
1378c5c0470SJoerg Sonnenberger 	struct termios	it_out;
1388c5c0470SJoerg Sonnenberger 
1398c5c0470SJoerg Sonnenberger 	/* Lock state. */
1408c5c0470SJoerg Sonnenberger 	struct termios	lt_in;	/* should be in struct tty */
1418c5c0470SJoerg Sonnenberger 	struct termios	lt_out;
1428c5c0470SJoerg Sonnenberger 
1438c5c0470SJoerg Sonnenberger 	bool_t	do_timestamp;
1448c5c0470SJoerg Sonnenberger 	bool_t	do_dcd_timestamp;
1458c5c0470SJoerg Sonnenberger 	struct timeval	timestamp;
1468c5c0470SJoerg Sonnenberger 	struct timeval	dcd_timestamp;
1478c5c0470SJoerg Sonnenberger 	struct	pps_state pps;
1488c5c0470SJoerg Sonnenberger 
1498c5c0470SJoerg Sonnenberger 	u_long	bytes_in;	/* statistics */
1508c5c0470SJoerg Sonnenberger 	u_long	bytes_out;
1518c5c0470SJoerg Sonnenberger 	u_int	delta_error_counts[CE_NTYPES];
1528c5c0470SJoerg Sonnenberger 	u_long	error_counts[CE_NTYPES];
1538c5c0470SJoerg Sonnenberger 
1548c5c0470SJoerg Sonnenberger 	u_long	rclk;
1558c5c0470SJoerg Sonnenberger 
1568c5c0470SJoerg Sonnenberger 	struct resource *irqres;
1578c5c0470SJoerg Sonnenberger 	struct resource *ioportres;
1588c5c0470SJoerg Sonnenberger 	void *cookie;
1598c5c0470SJoerg Sonnenberger 
1608c5c0470SJoerg Sonnenberger 	/*
1618c5c0470SJoerg Sonnenberger 	 * Data area for output buffers.  Someday we should build the output
1628c5c0470SJoerg Sonnenberger 	 * buffer queue without copying data.
1638c5c0470SJoerg Sonnenberger 	 */
1648c5c0470SJoerg Sonnenberger 	u_char	obuf1[256];
1658c5c0470SJoerg Sonnenberger 	u_char	obuf2[256];
1668c5c0470SJoerg Sonnenberger };
1678c5c0470SJoerg Sonnenberger 
1688c5c0470SJoerg Sonnenberger #define SET_FLAG(dev, bit) device_set_flags(dev, device_get_flags(dev) | (bit))
1698c5c0470SJoerg Sonnenberger #define CLR_FLAG(dev, bit) device_set_flags(dev, device_get_flags(dev) & ~(bit))
1708c5c0470SJoerg Sonnenberger 
1718c5c0470SJoerg Sonnenberger extern devclass_t	sio_devclass;
1728c5c0470SJoerg Sonnenberger 
1738c5c0470SJoerg Sonnenberger int	sioattach	(device_t dev, int rid, u_long rclk);
1748c5c0470SJoerg Sonnenberger int	sioprobe	(device_t dev, int xrid, u_long rclk);
175