1/******************************************************************************* 2* 3* (c) 1998 by Computone Corporation 4* 5******************************************************************************** 6* 7* 8* PACKAGE: Linux tty Device Driver for IntelliPort II family of multiport 9* serial I/O controllers. 10* 11* DESCRIPTION: Header file for high level library functions 12* 13*******************************************************************************/ 14#ifndef I2LIB_H 15#define I2LIB_H 1 16//------------------------------------------------------------------------------ 17// I2LIB.H 18// 19// IntelliPort-II and IntelliPort-IIEX 20// 21// Defines, structure definitions, and external declarations for i2lib.c 22//------------------------------------------------------------------------------ 23//-------------------------------------- 24// Mandatory Includes: 25//-------------------------------------- 26#include "ip2types.h" 27#include "i2ellis.h" 28#include "i2pack.h" 29#include "i2cmd.h" 30#include <linux/workqueue.h> 31 32//------------------------------------------------------------------------------ 33// i2ChanStr -- Channel Structure: 34// Used to track per-channel information for the library routines using standard 35// loadware. Note also, a pointer to an array of these structures is patched 36// into the i2eBordStr (see i2ellis.h) 37//------------------------------------------------------------------------------ 38// 39// If we make some limits on the maximum block sizes, we can avoid dealing with 40// buffer wrap. The wrapping of the buffer is based on where the start of the 41// packet is. Then there is always room for the packet contiguously. 42// 43// Maximum total length of an outgoing data or in-line command block. The limit 44// of 36 on data is quite arbitrary and based more on DOS memory limitations 45// than the board interface. However, for commands, the maximum packet length is 46// MAX_CMD_PACK_SIZE, because the field size for the count is only a few bits 47// (see I2PACK.H) in such packets. For data packets, the count field size is not 48// the limiting factor. As of this writing, MAX_OBUF_BLOCK < MAX_CMD_PACK_SIZE, 49// but be careful if wanting to modify either. 50// 51#define MAX_OBUF_BLOCK 36 52 53// Another note on maximum block sizes: we are buffering packets here. Data is 54// put into the buffer (if there is room) regardless of the credits from the 55// board. The board sends new credits whenever it has removed from his buffers a 56// number of characters equal to 80% of total buffer size. (Of course, the total 57// buffer size is what is reported when the very first set of flow control 58// status packets are received from the board. Therefore, to be robust, you must 59// always fill the board to at least 80% of the current credit limit, else you 60// might not give it enough to trigger a new report. These conditions are 61// obtained here so long as the maximum output block size is less than 20% the 62// size of the board's output buffers. This is true at present by "coincidence" 63// or "infernal knowledge": the board's output buffers are at least 700 bytes 64// long (20% = 140 bytes, at least). The 80% figure is "official", so the safest 65// strategy might be to trap the first flow control report and guarantee that 66// the effective maxObufBlock is the minimum of MAX_OBUF_BLOCK and 20% of first 67// reported buffer credit. 68// 69#define MAX_CBUF_BLOCK 6 // Maximum total length of a bypass command block 70 71#define IBUF_SIZE 512 // character capacity of input buffer per channel 72#define OBUF_SIZE 1024// character capacity of output buffer per channel 73#define CBUF_SIZE 10 // character capacity of output bypass buffer 74 75typedef struct _i2ChanStr 76{ 77 // First, back-pointers so that given a pointer to this structure, you can 78 // determine the correct board and channel number to reference, (say, when 79 // issuing commands, etc. (Note, channel number is in infl.hd.i2sChannel.) 80 81 int port_index; // Index of port in channel structure array attached 82 // to board structure. 83 PTTY pTTY; // Pointer to tty structure for port (OS specific) 84 USHORT validity; // Indicates whether the given channel has been 85 // initialized, really exists (or is a missing 86 // channel, e.g. channel 9 on an 8-port box.) 87 88 i2eBordStrPtr pMyBord; // Back-pointer to this channel's board structure 89 90 int wopen; // waiting fer carrier 91 92 int throttled; // Set if upper layer can take no data 93 94 int flags; // Defined in tty.h 95 96 PWAITQ open_wait; // Pointer for OS sleep function. 97 PWAITQ close_wait; // Pointer for OS sleep function. 98 PWAITQ delta_msr_wait;// Pointer for OS sleep function. 99 PWAITQ dss_now_wait; // Pointer for OS sleep function. 100 101 struct timer_list BookmarkTimer; // Used by i2DrainOutput 102 wait_queue_head_t pBookmarkWait; // Used by i2DrainOutput 103 104 int BaudBase; 105 int BaudDivisor; 106 107 USHORT ClosingDelay; 108 USHORT ClosingWaitTime; 109 110 volatile 111 flowIn infl; // This structure is initialized as a completely 112 // formed flow-control command packet, and as such 113 // has the channel number, also the capacity and 114 // "as-of" data needed continuously. 115 116 USHORT sinceLastFlow; // Counts the number of characters read from input 117 // buffers, since the last time flow control info 118 // was sent. 119 120 USHORT whenSendFlow; // Determines when new flow control is to be sent to 121 // the board. Note unlike earlier manifestations of 122 // the driver, these packets can be sent from 123 // in-place. 124 125 USHORT channelNeeds; // Bit map of important things which must be done 126 // for this channel. (See bits below ) 127 128 volatile 129 flowStat outfl; // Same type of structure is used to hold current 130 // flow control information used to control our 131 // output. "asof" is kept updated as data is sent, 132 // and "room" never goes to zero. 133 134 // The incoming ring buffer 135 // Unlike the outgoing buffers, this holds raw data, not packets. The two 136 // extra bytes are used to hold the byte-padding when there is room for an 137 // odd number of bytes before we must wrap. 138 // 139 UCHAR Ibuf[IBUF_SIZE + 2]; 140 volatile 141 USHORT Ibuf_stuff; // Stuffing index 142 volatile 143 USHORT Ibuf_strip; // Stripping index 144 145 // The outgoing ring-buffer: Holds Data and command packets. N.B., even 146 // though these are in the channel structure, the channel is also written 147 // here, the easier to send it to the fifo when ready. HOWEVER, individual 148 // packets here are NOT padded to even length: the routines for writing 149 // blocks to the fifo will pad to even byte counts. 150 // 151 UCHAR Obuf[OBUF_SIZE+MAX_OBUF_BLOCK+4]; 152 volatile 153 USHORT Obuf_stuff; // Stuffing index 154 volatile 155 USHORT Obuf_strip; // Stripping index 156 int Obuf_char_count; 157 158 // The outgoing bypass-command buffer. Unlike earlier manifestations, the 159 // flow control packets are sent directly from the structures. As above, the 160 // channel number is included in the packet, but they are NOT padded to even 161 // size. 162 // 163 UCHAR Cbuf[CBUF_SIZE+MAX_CBUF_BLOCK+2]; 164 volatile 165 USHORT Cbuf_stuff; // Stuffing index 166 volatile 167 USHORT Cbuf_strip; // Stripping index 168 169 // The temporary buffer for the Linux tty driver PutChar entry. 170 // 171 UCHAR Pbuf[MAX_OBUF_BLOCK - sizeof (i2DataHeader)]; 172 volatile 173 USHORT Pbuf_stuff; // Stuffing index 174 175 // The state of incoming data-set signals 176 // 177 USHORT dataSetIn; // Bit-mapped according to below. Also indicates 178 // whether a break has been detected since last 179 // inquiry. 180 181 // The state of outcoming data-set signals (as far as we can tell!) 182 // 183 USHORT dataSetOut; // Bit-mapped according to below. 184 185 // Most recent hot-key identifier detected 186 // 187 USHORT hotKeyIn; // Hot key as sent by the board, HOT_CLEAR indicates 188 // no hot key detected since last examined. 189 190 // Counter of outstanding requests for bookmarks 191 // 192 short bookMarks; // Number of outstanding bookmark requests, (+ive 193 // whenever a bookmark request if queued up, -ive 194 // whenever a bookmark is received). 195 196 // Misc options 197 // 198 USHORT channelOptions; // See below 199 200 // To store various incoming special packets 201 // 202 debugStat channelStatus; 203 cntStat channelRcount; 204 cntStat channelTcount; 205 failStat channelFail; 206 207 // To store the last values for line characteristics we sent to the board. 208 // 209 int speed; 210 211 int flush_flags; 212 213 void (*trace)(unsigned short,unsigned char,unsigned char,unsigned long,...); 214 215 /* 216 * Kernel counters for the 4 input interrupts 217 */ 218 struct async_icount icount; 219 220 /* 221 * Task queues for processing input packets from the board. 222 */ 223 struct work_struct tqueue_input; 224 struct work_struct tqueue_status; 225 struct work_struct tqueue_hangup; 226 227 rwlock_t Ibuf_spinlock; 228 rwlock_t Obuf_spinlock; 229 rwlock_t Cbuf_spinlock; 230 rwlock_t Pbuf_spinlock; 231 232} i2ChanStr, *i2ChanStrPtr; 233 234//--------------------------------------------------- 235// Manifests and bit-maps for elements in i2ChanStr 236//--------------------------------------------------- 237// 238// flush flags 239// 240#define STARTFL_FLAG 1 241#define STOPFL_FLAG 2 242 243// validity 244// 245#define CHANNEL_MAGIC_BITS 0xff00 246#define CHANNEL_MAGIC 0x5300 // (validity & CHANNEL_MAGIC_BITS) == 247 // CHANNEL_MAGIC --> structure good 248 249#define CHANNEL_SUPPORT 0x0001 // Indicates channel is supported, exists, 250 // and passed P.O.S.T. 251 252// channelNeeds 253// 254#define NEED_FLOW 1 // Indicates flow control has been queued 255#define NEED_INLINE 2 // Indicates inline commands or data queued 256#define NEED_BYPASS 4 // Indicates bypass commands queued 257#define NEED_CREDIT 8 // Indicates would be sending except has not sufficient 258 // credit. The data is still in the channel structure, 259 // but the channel is not enqueued in the board 260 // structure again until there is a credit received from 261 // the board. 262 263// dataSetIn (Also the bits for i2GetStatus return value) 264// 265#define I2_DCD 1 266#define I2_CTS 2 267#define I2_DSR 4 268#define I2_RI 8 269 270// dataSetOut (Also the bits for i2GetStatus return value) 271// 272#define I2_DTR 1 273#define I2_RTS 2 274 275// i2GetStatus() can optionally clear these bits 276// 277#define I2_BRK 0x10 // A break was detected 278#define I2_PAR 0x20 // A parity error was received 279#define I2_FRA 0x40 // A framing error was received 280#define I2_OVR 0x80 // An overrun error was received 281 282// i2GetStatus() automatically clears these bits */ 283// 284#define I2_DDCD 0x100 // DCD changed from its former value 285#define I2_DCTS 0x200 // CTS changed from its former value 286#define I2_DDSR 0x400 // DSR changed from its former value 287#define I2_DRI 0x800 // RI changed from its former value 288 289// hotKeyIn 290// 291#define HOT_CLEAR 0x1322 // Indicates that no hot-key has been detected 292 293// channelOptions 294// 295#define CO_NBLOCK_WRITE 1 // Writes don't block waiting for buffer. (Default 296 // is, they do wait.) 297 298// fcmodes 299// 300#define I2_OUTFLOW_CTS 0x0001 301#define I2_INFLOW_RTS 0x0002 302#define I2_INFLOW_DSR 0x0004 303#define I2_INFLOW_DTR 0x0008 304#define I2_OUTFLOW_DSR 0x0010 305#define I2_OUTFLOW_DTR 0x0020 306#define I2_OUTFLOW_XON 0x0040 307#define I2_OUTFLOW_XANY 0x0080 308#define I2_INFLOW_XON 0x0100 309 310#define I2_CRTSCTS (I2_OUTFLOW_CTS|I2_INFLOW_RTS) 311#define I2_IXANY_MODE (I2_OUTFLOW_XON|I2_OUTFLOW_XANY) 312 313//------------------------------------------- 314// Macros used from user level like functions 315//------------------------------------------- 316 317// Macros to set and clear channel options 318// 319#define i2SetOption(pCh, option) pCh->channelOptions |= option 320#define i2ClrOption(pCh, option) pCh->channelOptions &= ~option 321 322// Macro to set fatal-error trap 323// 324#define i2SetFatalTrap(pB, routine) pB->i2eFatalTrap = routine 325 326//-------------------------------------------- 327// Declarations and prototypes for i2lib.c 328//-------------------------------------------- 329// 330static int i2InitChannels(i2eBordStrPtr, int, i2ChanStrPtr); 331static int i2QueueCommands(int, i2ChanStrPtr, int, int, cmdSyntaxPtr,...); 332static int i2GetStatus(i2ChanStrPtr, int); 333static int i2Input(i2ChanStrPtr); 334static int i2InputFlush(i2ChanStrPtr); 335static int i2Output(i2ChanStrPtr, const char *, int); 336static int i2OutputFree(i2ChanStrPtr); 337static int i2ServiceBoard(i2eBordStrPtr); 338static void i2DrainOutput(i2ChanStrPtr, int); 339 340#ifdef IP2DEBUG_TRACE 341void ip2trace(unsigned short,unsigned char,unsigned char,unsigned long,...); 342#else 343#define ip2trace(a,b,c,d...) do {} while (0) 344#endif 345 346// Argument to i2QueueCommands 347// 348#define C_IN_LINE 1 349#define C_BYPASS 0 350 351#endif // I2LIB_H 352