aboutsummaryrefslogtreecommitdiff
path: root/drivers/char/rio/port.h
blob: c99b1e70fdc8bca7c212c319d089a116c22528e7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
/*
** -----------------------------------------------------------------------------
**
**  Perle Specialix driver for Linux
**  Ported from existing RIO Driver for SCO sources.
 *
 *  (C) 1990 - 2000 Specialix International Ltd., Byfleet, Surrey, UK.
 *
 *      This program is free software; you can redistribute it and/or modify
 *      it under the terms of the GNU General Public License as published by
 *      the Free Software Foundation; either version 2 of the License, or
 *      (at your option) any later version.
 *
 *      This program is distributed in the hope that it will be useful,
 *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *      GNU General Public License for more details.
 *
 *      You should have received a copy of the GNU General Public License
 *      along with this program; if not, write to the Free Software
 *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
**
**	Module		: port.h
**	SID		: 1.3
**	Last Modified	: 11/6/98 11:34:12
**	Retrieved	: 11/6/98 11:34:21
**
**  ident @(#)port.h	1.3
**
** -----------------------------------------------------------------------------
*/

#ifndef	__rio_port_h__
#define	__rio_port_h__

#ifdef SCCS_LABELS
static char *_port_h_sccs_ = "@(#)port.h	1.3";
#endif


#undef VPIX


/*
** the port data structure - one per port in the system
*/

#ifdef STATS
struct RIOStats {
	/*
	 ** interrupt statistics
	 */
	uint BreakIntCnt;
	uint ModemOffCnt;
	uint ModemOnCnt;
	uint RxIntCnt;
	uint TxIntCnt;
	/*
	 ** throughput statistics
	 */
	uint RxCharCnt;
	uint RxPktCnt;
	uint RxSaveCnt;
	uint TxCharCnt;
	uint TxPktCnt;
	/*
	 ** driver entry statistics
	 */
	uint CloseCnt;
	uint IoctlCnt;
	uint OpenCnt;
	uint ReadCnt;
	uint WriteCnt;
	/*
	 ** proc statistics
	 */
	uint BlockCnt;
	uint OutputCnt;
	uint ResumeCnt;
	uint RflushCnt;
	uint SuspendCnt;
	uint TbreakCnt;
	uint TimeoutCnt;
	uint UnblockCnt;
	uint WflushCnt;
	uint WFBodgeCnt;
};
#endif

/*
**	Port data structure
*/
struct Port {
	struct gs_port gs;
	int PortNum;		/* RIO port no., 0-511 */
	struct Host *HostP;
	volatile caddr_t Caddr;
	ushort HostPort;	/* Port number on host card */
	uchar RupNum;		/* Number of RUP for port */
	uchar ID2;		/* Second ID of RTA for port */
	ulong State;		/* FLAGS for open & xopen */
#define	RIO_LOPEN	0x00001	/* Local open */
#define	RIO_MOPEN	0x00002	/* Modem open */
#define	RIO_WOPEN	0x00004	/* Waiting for open */
#define	RIO_CLOSING	0x00008	/* The port is being close */
#define	RIO_XPBUSY	0x00010	/* Transparent printer busy */
#define	RIO_BREAKING	0x00020	/* Break in progress */
#define	RIO_DIRECT	0x00040	/* Doing Direct output */
#define	RIO_EXCLUSIVE	0x00080	/* Stream open for exclusive use */
#define	RIO_NDELAY	0x00100	/* Stream is open FNDELAY */
#define	RIO_CARR_ON	0x00200	/* Stream has carrier present */
#define	RIO_XPWANTR	0x00400	/* Stream wanted by Xprint */
#define	RIO_RBLK	0x00800	/* Stream is read-blocked */
#define	RIO_BUSY	0x01000	/* Stream is BUSY for write */
#define	RIO_TIMEOUT	0x02000	/* Stream timeout in progress */
#define	RIO_TXSTOP	0x04000	/* Stream output is stopped */
#define	RIO_WAITFLUSH	0x08000	/* Stream waiting for flush */
#define	RIO_DYNOROD	0x10000	/* Drain failed */
#define	RIO_DELETED	0x20000	/* RTA has been deleted */
#define RIO_ISSCANCODE	0x40000	/* This line is in scancode mode */
#define	RIO_USING_EUC	0x100000	/* Using extended Unix chars */
#define	RIO_CAN_COOK	0x200000	/* This line can do cooking */
#define RIO_TRIAD_MODE  0x400000	/* Enable TRIAD special ops. */
#define RIO_TRIAD_BLOCK 0x800000	/* Next read will block */
#define RIO_TRIAD_FUNC  0x1000000	/* Seen a function key coming in */
#define RIO_THROTTLE_RX 0x2000000	/* RX needs to be throttled. */

	ulong Config;		/* FLAGS for NOREAD.... */
#define	RIO_NOREAD	0x0001	/* Are not allowed to read port */
#define	RIO_NOWRITE	0x0002	/* Are not allowed to write port */
#define	RIO_NOXPRINT	0x0004	/* Are not allowed to xprint port */
#define	RIO_NOMASK	0x0007	/* All not allowed things */
#define RIO_IXANY	0x0008	/* Port is allowed ixany */
#define	RIO_MODEM	0x0010	/* Stream is a modem device */
#define	RIO_IXON	0x0020	/* Port is allowed ixon */
#define RIO_WAITDRAIN	0x0040	/* Wait for port to completely drain */
#define RIO_MAP_50_TO_50	0x0080	/* Map 50 baud to 50 baud */
#define RIO_MAP_110_TO_110	0x0100	/* Map 110 baud to 110 baud */

/*
** 15.10.1998 ARG - ESIL 0761 prt fix
** As LynxOS does not appear to support Hardware Flow Control .....
** Define our own flow control flags in 'Config'.
*/
#define RIO_CTSFLOW	0x0200	/* RIO's own CTSFLOW flag */
#define RIO_RTSFLOW	0x0400	/* RIO's own RTSFLOW flag */


	struct PHB *PhbP;	/* pointer to PHB for port */
	WORD *TxAdd;		/* Add packets here */
	WORD *TxStart;		/* Start of add array */
	WORD *TxEnd;		/* End of add array */
	WORD *RxRemove;		/* Remove packets here */
	WORD *RxStart;		/* Start of remove array */
	WORD *RxEnd;		/* End of remove array */
	uint RtaUniqueNum;	/* Unique number of RTA */
	ushort PortState;	/* status of port */
	ushort ModemState;	/* status of modem lines */
	ulong ModemLines;	/* Modem bits sent to RTA */
	uchar CookMode;		/* who expands CR/LF? */
	uchar ParamSem;		/* Prevent write during param */
	uchar Mapped;		/* if port mapped onto host */
	uchar SecondBlock;	/* if port belongs to 2nd block
				   of 16 port RTA */
	uchar InUse;		/* how many pre-emptive cmds */
	uchar Lock;		/* if params locked */
	uchar Store;		/* if params stored across closes */
	uchar FirstOpen;	/* TRUE if first time port opened */
	uchar FlushCmdBodge;	/* if doing a (non)flush */
	uchar MagicFlags;	/* require intr processing */
#define	MAGIC_FLUSH	0x01	/* mirror of WflushFlag */
#define	MAGIC_REBOOT	0x02	/* RTA re-booted, re-open ports */
#define	MORE_OUTPUT_EYGOR 0x04	/* riotproc failed to empty clists */
	uchar WflushFlag;	/* 1 How many WFLUSHs active */
/*
** Transparent print stuff
*/
	struct Xprint {
#ifndef MAX_XP_CTRL_LEN
#define MAX_XP_CTRL_LEN		16	/* ALSO IN DAEMON.H */
#endif
		uint XpCps;
		char XpOn[MAX_XP_CTRL_LEN];
		char XpOff[MAX_XP_CTRL_LEN];
		ushort XpLen;	/* strlen(XpOn)+strlen(XpOff) */
		uchar XpActive;
		uchar XpLastTickOk;	/* TRUE if we can process */
#define	XP_OPEN		00001
#define	XP_RUNABLE	00002
		struct ttystatics *XttyP;
	} Xprint;
#ifdef VPIX
	v86_t *StashP;
	uint IntMask;
	struct termss VpixSs;
	uchar ModemStatusReg;	/* Modem status register */
#endif
	uchar RxDataStart;
	uchar Cor2Copy;		/* copy of COR2 */
	char *Name;		/* points to the Rta's name */
#ifdef STATS
	struct RIOStats Stat;	/* ports statistics */
#endif
	char *TxRingBuffer;
	ushort TxBufferIn;	/* New data arrives here */
	ushort TxBufferOut;	/* Intr removes data here */
	ushort OldTxBufferOut;	/* Indicates if draining */
	int TimeoutId;		/* Timeout ID */
	uint Debug;
	uchar WaitUntilBooted;	/* True if open should block */
	uint statsGather;	/* True if gathering stats */
	ulong txchars;		/* Chars transmitted */
	ulong rxchars;		/* Chars received */
	ulong opens;		/* port open count */
	ulong closes;		/* port close count */
	ulong ioctls;		/* ioctl count */
	uchar LastRxTgl;	/* Last state of rx toggle bit */
	spinlock_t portSem;	/* Lock using this sem */
	int MonitorTstate;	/* Monitoring ? */
	int timeout_id;		/* For calling 100 ms delays */
	int timeout_sem;	/* For calling 100 ms delays */
	int firstOpen;		/* First time open ? */
	char *p;		/* save the global struc here .. */
};

struct ModuleInfo {
	char *Name;
	uint Flags[4];		/* one per port on a module */
};
#endif

/*
** This struct is required because trying to grab an entire Port structure
** runs into problems with differing struct sizes between driver and config.
*/
struct PortParams {
	uint Port;
	ulong Config;
	ulong State;
	struct ttystatics *TtyP;
};