ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / drivers / char / rio / port.h
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 };