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