aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/rio/port.h
blob: 8506af06aa9f6939d98449b99253c06817ee57ff (plain) (blame)
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
242
243
244
245
/*
** -----------------------------------------------------------------------------
**
**  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;
};