1 /*
2 ** -----------------------------------------------------------------------------
3 **
4 **  Perle Specialix driver for Linux
5 **  Ported from existing RIO Driver for SCO sources.
6  *
7  *  (C) 1990 - 2000 Specialix International Ltd., Byfleet, Surrey, UK.
8  *
9  *      This program is free software; you can redistribute it and/or modify
10  *      it under the terms of the GNU General Public License as published by
11  *      the Free Software Foundation; either version 2 of the License, or
12  *      (at your option) any later version.
13  *
14  *      This program is distributed in the hope that it will be useful,
15  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
16  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  *      GNU General Public License for more details.
18  *
19  *      You should have received a copy of the GNU General Public License
20  *      along with this program; if not, write to the Free Software
21  *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 **
23 **	Module		: port.h
24 **	SID		: 1.3
25 **	Last Modified	: 11/6/98 11:34:12
26 **	Retrieved	: 11/6/98 11:34:21
27 **
28 **  ident @(#)port.h	1.3
29 **
30 ** -----------------------------------------------------------------------------
31 */
32 
33 #ifndef	__rio_port_h__
34 #define	__rio_port_h__
35 
36 #ifdef SCCS_LABELS
37 static char *_port_h_sccs_ = "@(#)port.h	1.3";
38 #endif
39 
40 
41 #undef VPIX
42 
43 
44 /*
45 ** the port data structure - one per port in the system
46 */
47 
48 #ifdef STATS
49 struct RIOStats
50 {
51 	/*
52 	** interrupt statistics
53 	*/
54 	uint	BreakIntCnt;
55 	uint	ModemOffCnt;
56 	uint	ModemOnCnt;
57 	uint	RxIntCnt;
58 	uint	TxIntCnt;
59 	/*
60 	** throughput statistics
61 	*/
62 	uint	RxCharCnt;
63 	uint	RxPktCnt;
64 	uint	RxSaveCnt;
65 	uint	TxCharCnt;
66 	uint	TxPktCnt;
67 	/*
68 	** driver entry statistics
69 	*/
70 	uint	CloseCnt;
71 	uint	IoctlCnt;
72 	uint	OpenCnt;
73 	uint	ReadCnt;
74 	uint	WriteCnt;
75 	/*
76 	** proc statistics
77 	*/
78 	uint	BlockCnt;
79 	uint	OutputCnt;
80 	uint	ResumeCnt;
81 	uint	RflushCnt;
82 	uint	SuspendCnt;
83 	uint	TbreakCnt;
84 	uint	TimeoutCnt;
85 	uint	UnblockCnt;
86 	uint	WflushCnt;
87 	uint	WFBodgeCnt;
88 };
89 #endif
90 
91 /*
92 **	Port data structure
93 */
94 struct	Port
95 {
96   struct gs_port gs;
97   int				PortNum;	/* RIO port no., 0-511 */
98   struct Host	*HostP;
99   volatile caddr_t		Caddr;
100   ushort			HostPort;  /* Port number on host card */
101   uchar			RupNum;	/* Number of RUP for port */
102   uchar			ID2;	/* Second ID of RTA for port */
103   ulong			State;	/* FLAGS for open & xopen */
104 #define	RIO_LOPEN	0x00001		/* Local open */
105 #define	RIO_MOPEN	0x00002		/* Modem open */
106 #define	RIO_WOPEN	0x00004		/* Waiting for open */
107 #define	RIO_CLOSING	0x00008		/* The port is being close */
108 #define	RIO_XPBUSY	0x00010		/* Transparent printer busy */
109 #define	RIO_BREAKING	0x00020		/* Break in progress */
110 #define	RIO_DIRECT	0x00040		/* Doing Direct output */
111 #define	RIO_EXCLUSIVE	0x00080		/* Stream open for exclusive use */
112 #define	RIO_NDELAY	0x00100		/* Stream is open FNDELAY */
113 #define	RIO_CARR_ON	0x00200		/* Stream has carrier present */
114 #define	RIO_XPWANTR	0x00400		/* Stream wanted by Xprint */
115 #define	RIO_RBLK	0x00800		/* Stream is read-blocked */
116 #define	RIO_BUSY	0x01000		/* Stream is BUSY for write */
117 #define	RIO_TIMEOUT	0x02000		/* Stream timeout in progress */
118 #define	RIO_TXSTOP	0x04000		/* Stream output is stopped */
119 #define	RIO_WAITFLUSH	0x08000		/* Stream waiting for flush */
120 #define	RIO_DYNOROD	0x10000		/* Drain failed */
121 #define	RIO_DELETED	0x20000		/* RTA has been deleted */
122 #define RIO_ISSCANCODE	0x40000		/* This line is in scancode mode */
123 #define	RIO_USING_EUC	0x100000	/* Using extended Unix chars */
124 #define	RIO_CAN_COOK	0x200000	/* This line can do cooking */
125 #define RIO_TRIAD_MODE  0x400000        /* Enable TRIAD special ops. */
126 #define RIO_TRIAD_BLOCK 0x800000        /* Next read will block */
127 #define RIO_TRIAD_FUNC  0x1000000       /* Seen a function key coming in */
128 #define RIO_THROTTLE_RX 0x2000000       /* RX needs to be throttled. */
129 
130     ulong			Config;	/* FLAGS for NOREAD.... */
131 #define	RIO_NOREAD	0x0001		/* Are not allowed to read port */
132 #define	RIO_NOWRITE	0x0002		/* Are not allowed to write port */
133 #define	RIO_NOXPRINT	0x0004		/* Are not allowed to xprint port */
134 #define	RIO_NOMASK	0x0007		/* All not allowed things */
135 #define RIO_IXANY	0x0008          /* Port is allowed ixany */
136 #define	RIO_MODEM	0x0010		/* Stream is a modem device */
137 #define	RIO_IXON	0x0020		/* Port is allowed ixon */
138 #define RIO_WAITDRAIN	0x0040		/* Wait for port to completely drain */
139 #define RIO_MAP_50_TO_50	0x0080	/* Map 50 baud to 50 baud */
140 #define RIO_MAP_110_TO_110	0x0100	/* Map 110 baud to 110 baud */
141 
142 /*
143 ** 15.10.1998 ARG - ESIL 0761 prt fix
144 ** As LynxOS does not appear to support Hardware Flow Control .....
145 ** Define our own flow control flags in 'Config'.
146 */
147 #define RIO_CTSFLOW	0x0200		/* RIO's own CTSFLOW flag */
148 #define RIO_RTSFLOW	0x0400		/* RIO's own RTSFLOW flag */
149 
150 
151     struct PHB			*PhbP;	  /* pointer to PHB for port */
152     WORD                        *TxAdd;   /* Add packets here */
153     WORD                        *TxStart; /* Start of add array */
154     WORD                        *TxEnd;         /* End of add array */
155     WORD                        *RxRemove;      /* Remove packets here */
156     WORD                        *RxStart;       /* Start of remove array */
157     WORD                        *RxEnd;         /* End of remove array */
158     uint			RtaUniqueNum;	/* Unique number of RTA */
159     ushort			PortState;	/* status of port */
160     ushort			ModemState;	/* status of modem lines */
161     ulong			ModemLines;	/* Modem bits sent to RTA */
162     uchar			CookMode;	/* who expands CR/LF? */
163     uchar			ParamSem;	/* Prevent write during param */
164     uchar			Mapped;		/* if port mapped onto host */
165     uchar			SecondBlock;	/* if port belongs to 2nd block
166 						   of 16 port RTA */
167     uchar			InUse;		/* how many pre-emptive cmds */
168     uchar			Lock;		/* if params locked */
169     uchar			Store;	/* if params stored across closes */
170     uchar			FirstOpen; /* TRUE if first time port opened */
171     uchar			FlushCmdBodge;	/* if doing a (non)flush */
172     uchar			MagicFlags;	/* require intr processing */
173 #define	MAGIC_FLUSH	0x01	/* mirror of WflushFlag */
174 #define	MAGIC_REBOOT	0x02	/* RTA re-booted, re-open ports */
175 #define	MORE_OUTPUT_EYGOR 0x04	/* riotproc failed to empty clists */
176     uchar			WflushFlag;	/* 1 How many WFLUSHs active */
177 /*
178 ** Transparent print stuff
179 */
180     struct Xprint
181     {
182 #ifndef MAX_XP_CTRL_LEN
183 #define MAX_XP_CTRL_LEN		16		/* ALSO IN DAEMON.H */
184 #endif
185 	uint			XpCps;
186 	char			XpOn[MAX_XP_CTRL_LEN];
187 	char			XpOff[MAX_XP_CTRL_LEN];
188 	ushort			XpLen;		/* strlen(XpOn)+strlen(XpOff) */
189 	uchar			XpActive;
190 	uchar			XpLastTickOk;	/* TRUE if we can process */
191 #define	XP_OPEN		00001
192 #define	XP_RUNABLE	00002
193 	struct ttystatics 		*XttyP;
194     } Xprint;
195 #ifdef VPIX
196     v86_t			*StashP;
197     uint			IntMask;
198     struct termss 		VpixSs;
199     uchar			ModemStatusReg;	/* Modem status register */
200 #endif
201     uchar			RxDataStart;
202     uchar			Cor2Copy;	/* copy of COR2 */
203     char			*Name;		/* points to the Rta's name */
204 #ifdef STATS
205     struct RIOStats 		Stat;		/* ports statistics */
206 #endif
207     char			*TxRingBuffer;
208     ushort			TxBufferIn;	/* New data arrives here */
209     ushort			TxBufferOut;	/* Intr removes data here */
210     ushort			OldTxBufferOut;	/* Indicates if draining */
211     int				TimeoutId;	/* Timeout ID */
212     uint			Debug;
213     uchar			WaitUntilBooted; /* True if open should block */
214     uint			statsGather;	/* True if gathering stats */
215     ulong			txchars;	/* Chars transmitted */
216     ulong			rxchars;	/* Chars received */
217     ulong			opens;		/* port open count */
218     ulong			closes;		/* port close count */
219     ulong			ioctls;		/* ioctl count */
220     uchar			LastRxTgl;	/* Last state of rx toggle bit */
221   spinlock_t				portSem;	/* Lock using this sem */
222 	int				MonitorTstate;	/* Monitoring ? */
223 	int				timeout_id;	/* For calling 100 ms delays */
224 	int				timeout_sem;/* For calling 100 ms delays */
225 	int				firstOpen;	/* First time open ? */
226 	char *			p;			/* save the global struc here .. */
227 };
228 
229 struct ModuleInfo
230 {
231 	char	*Name;
232 	uint	Flags[4];	/* one per port on a module */
233 };
234 #endif
235 
236 /*
237 ** This struct is required because trying to grab an entire Port structure
238 ** runs into problems with differing struct sizes between driver and config.
239 */
240 struct PortParams {
241 	uint	Port;
242 	ulong	Config;
243 	ulong	State;
244 	struct ttystatics	*TtyP;
245 };
246