digi.h revision 91445
1/*-
2 * Copyright (c) 2001 Brian Somers <brian@Awfulhak.org>
3 *   based on work by Slawa Olhovchenkov
4 *                    John Prince <johnp@knight-trosoft.com>
5 *                    Eric Hernes
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 * $FreeBSD: head/sys/dev/digi/digi.h 91445 2002-02-27 23:47:45Z peter $
30 */
31
32#define	W(p)				(*(u_int16_t *)(p))
33#define	vW(p)				(*(u_int16_t volatile *)(p))
34#define	D(p)				(*(u_int32_t *)(p))
35#define	vD(p)				(*(u_int32_t volatile *)(p))
36
37#define	CE_OVERRUN			0
38#define	CE_INTERRUPT_BUF_OVERFLOW	1
39#define	CE_TTY_BUF_OVERFLOW		2
40#define	CE_NTYPES			3
41#define	CE_RECORD(com, errnum)		(++(com)->delta_error_counts[errnum])
42
43/*#define DIGI_INTERRUPT*/
44
45#ifndef DEBUG
46#define	DEBUG
47#endif
48
49#ifdef DEBUG
50extern unsigned digi_debug;
51#define	DLOG(level, args)	if (digi_debug & (level)) device_printf args
52#else
53#define	DLOG(level, args)
54#endif
55
56
57struct digi_softc;
58
59/* digiboard port structure */
60struct digi_p {
61	struct digi_softc *sc;
62
63	int status;
64#define ENABLED 1
65#define DIGI_DTR_OFF 2
66#define PAUSE_TX 8
67#define PAUSE_RX 16
68
69	int opencnt;
70	ushort txbufsize;
71	ushort rxbufsize;
72	volatile struct board_chan *bc;
73	struct tty *tp;
74
75	dev_t dev[6];
76
77	u_char *txbuf;
78	u_char *rxbuf;
79	u_char txwin;
80	u_char rxwin;
81
82	u_char pnum;		/* port number */
83
84	u_char modemfake;	/* Modem values to be forced */
85	u_char mstat;
86	u_char modem;		/* Force values */
87
88	int active_out;		/* nonzero if the callout device is open */
89	int dtr_wait;		/* time to hold DTR down on close (* 1/hz) */
90	u_int wopeners;		/* # processes waiting for DCD in open() */
91
92	/*
93	 * The high level of the driver never reads status registers directly
94	 * because there would be too many side effects to handle conveniently.
95	 * Instead, it reads copies of the registers stored here by the
96	 * interrupt handler.
97	 */
98	u_char last_modem_status;	/* last MSR read by intr handler */
99	u_char prev_modem_status;	/* last MSR handled by high level */
100
101
102	/* Initial state. */
103	struct termios it_in;		/* should be in struct tty */
104	struct termios it_out;
105
106	/* Lock state. */
107	struct termios lt_in;		/* should be in struct tty */
108	struct termios lt_out;
109
110	u_int do_timestamp;
111	u_int do_dcd_timestamp;
112	struct timeval dcd_timestamp;
113
114	u_long bytes_in, bytes_out;
115	u_int delta_error_counts[CE_NTYPES];
116	u_long error_counts;
117
118	tcflag_t c_iflag;		/* hold true IXON/IXOFF/IXANY */
119	int lcc, lostcc, lbuf;
120	u_char send_ring;
121
122	unsigned laltpin : 1;		/* Alternate pin settings locked */
123	unsigned ialtpin : 1;		/* Initial alternate pin settings */
124
125	int cd;				/* Depends on the altpin setting */
126	int dsr;
127};
128
129/*
130 * Map TIOCM_* values to digiboard values
131 */
132struct digi_control_signals {
133	int rts;
134	int cd;
135	int dsr;
136	int cts;
137	int ri;
138	int dtr;
139};
140
141enum digi_board_status {
142	DIGI_STATUS_NOTINIT,
143	DIGI_STATUS_ENABLED,
144	DIGI_STATUS_DISABLED
145};
146
147/* Digiboard per-board structure */
148struct digi_softc {
149	/* struct board_info */
150	device_t dev;
151
152	const char *name;
153	enum digi_board_status status;
154	ushort numports;		/* number of ports on card */
155	ushort port;			/* I/O port */
156	ushort wport;			/* window select I/O port */
157
158	struct {
159		struct resource *mem;
160		int mrid;
161		struct resource *irq;
162		int irqrid;
163		struct resource *io;
164		int iorid;
165		void *irqHandler;
166		int unit;
167		dev_t ctldev;
168	} res;
169
170	u_char *vmem;			/* virtual memory address */
171	u_char *memcmd;
172	volatile u_char *memevent;
173	long pmem;			/* physical memory address */
174
175	struct {
176		u_char *data;
177		size_t size;
178	} bios, fep, link;
179
180#ifdef DIGI_INTERRUPT
181	struct timeval intr_timestamp;
182#endif
183
184	struct digi_p *ports;	/* pointer to array of port descriptors */
185	struct tty *ttys;	/* pointer to array of TTY structures */
186	volatile struct global_data *gdata;
187	u_char window;		/* saved window */
188	int win_size;
189	int win_bits;
190	int mem_size;
191	int mem_seg;
192	enum digi_model model;
193	const struct digi_control_signals *csigs;
194	int opencnt;
195	unsigned pcibus : 1;		/* On a PCI bus ? */
196
197	struct callout_handle callout;	/* poll timeout handle */
198	struct callout_handle inttest;	/* int test timeout handle */
199	const char *module;
200
201	u_char *(*setwin)(struct digi_softc *_sc, unsigned _addr);
202	void	(*hidewin)(struct digi_softc *_sc);
203	void	(*towin)(struct digi_softc *_sc, int _win);
204#ifdef DEBUG
205	int	intr_count;
206#endif
207};
208
209extern devclass_t digi_devclass;
210
211extern const struct digi_control_signals digi_xixe_signals;
212extern const struct digi_control_signals digi_normal_signals;
213
214const char	*digi_errortxt(int _id);
215int		 digi_attach(struct digi_softc *);
216int		 digi_detach(device_t _dev);
217int		 digi_shutdown(device_t _dev);
218