drp.h 26.5 KB
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 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693
/*
 *
 * Copyright 1999 Digi International (www.digi.com)
 *     Gene Olson  <gene at digi dot com>
 *     James Puzzo <jamesp at digi dot com>
 *     Scott Kilau <scottk at digi dot com>
 *
 * 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, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED; without even the
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
 * PURPOSE.  See the GNU General Public License for more details.
 *
 */

/************************************************************************
 * Master include file for Linux Realport Driver.
 ************************************************************************/

#ifndef __DRP_H
#define __DRP_H

#include <linux/types.h>
#include <linux/wait.h>
#include <linux/semaphore.h>
#include <linux/tty.h>


#include "digirp.h"

/************************************************************************
 * Tuning parameters.
 ************************************************************************/

#define CHAN_MAX	64		/* Max # ports per server */

#define SEQ_MAX		128		/* Max # transmit sequences (2^n) */
#define SEQ_MASK	(SEQ_MAX-1)	/* Sequence buffer modulus mask */

#define TBUF_MAX	4096		/* Size of transmit buffer (2^n) */
#define RBUF_MAX	4096		/* Size of receive buffer (2^n) */

#define TBUF_MASK	(TBUF_MAX-1)	/* Transmit buffer modulus mask */
#define RBUF_MASK	(RBUF_MAX-1)	/* Receive buffer modulus mask */

#define TBUF_LOW	1000		/* Transmit low water mark */

#define UIO_BASE	1000		/* Base for write operations */
#define UIO_MIN		2000		/* Minimum size application buffer */
#define UIO_MAX		8100		/* Unix I/O buffer size */

#define MON_MAX		65536		/* Monitor buffer size (2^n) */
#define MON_MASK	(MON_MAX-1)	/* Monitor wrap mask */

#define DPA_MAX		65536		/* DPA buffer size (2^n) */
#define DPA_MASK	(DPA_MAX-1)	/* DPA wrap mask */
#define DPA_HIGH_WATER	58000		/* Enforce flow control when
					 * over this amount
					 */

#define IDLE_MAX	(20 * HZ)	/* Max TCP link idle time */

#define MAX_DESC_LEN	100		/* Maximum length of stored PS
					 * description
					 */

#define WRITEBUFLEN	((4096) + 4)    /* 4 extra for alignment play space */

#define VPDSIZE		512

/************************************************************************
 * Minor device decoding conventions.
 ************************************************************************
 *
 * For Linux, the net and mon devices are handled via "proc", so we
 * only have to mux the "tty" devices.  Since every PortServer will
 * have an individual major number, the PortServer number does not
 * need to be encoded, and in fact, does not need to exist.
 *
 */

/*
 * Port device decoding conventions:
 *
 *	Device 00 - 3f        64 dial-in modem devices. (tty)
 *	Device 40 - 7f        64 dial-out tty devices.  (cu)
 *	Device 80 - bf        64 dial-out printer devices.
 *
 *  IS_PRINT(dev)		This is a printer device.
 *
 *  OPEN_CATEGORY(dev)		Specifies the device category.  No two
 *				devices of different categories may be open
 *				at the same time.
 *
 * The following require the category returned by OPEN_CATEGORY().
 *
 *  OPEN_WAIT_AVAIL(cat)	Waits on open until the device becomes
 *				available.  Fails if NDELAY specified.
 *
 *  OPEN_WAIT_CARRIER(cat)	Waits on open if carrier is not present.
 *				Succeeds if NDELAY is given.
 *
 *  OPEN_FORCES_CARRIER(cat)	Carrier is forced high on open.
 *
 */

#define PORT_NUM(dev)			((dev) & 0x3f)

#define OPEN_CATEGORY(dev)		((((dev) & 0x80) & 0x40))
#define IS_PRINT(dev)			(((dev) & 0xff) >= 0x80)

#define OPEN_WAIT_AVAIL(cat)		(((cat) & 0x40) == 0x000)
#define OPEN_WAIT_CARRIER(cat)		(((cat) & 0x40) == 0x000)
#define OPEN_FORCES_CARRIER(cat)	(((cat) & 0x40) != 0x000)


/************************************************************************
 * Modem signal defines for 16450/16550 compatible FEP.
 * set in ch_mout, ch_mflow, ch_mlast etc
 ************************************************************************/

/* TODO : Re-verify that these modem signal definitions are correct */

#define DM_DTR		0x01
#define DM_RTS		0x02
#define DM_RTS_TOGGLE	0x04

#define DM_OUT1		0x04
#define DM_OUT2		0x08

#define DM_CTS		0x10
#define DM_DSR		0x20
#define DM_RI		0x40
#define DM_CD		0x80		/* This is the DCD flag */


/************************************************************************
 * Realport Event Flags.
 ************************************************************************/

#define EV_OPU		0x0001		/* Ouput paused by client */
#define EV_OPS		0x0002		/* Output paused by XOFF */
#define EV_OPX		0x0004		/* Output paused by XXOFF */
#define EV_OPH		0x0008		/* Output paused by MFLOW */
#define EV_IPU		0x0010		/* Input paused by client */
#define EV_IPS		0x0020		/* Input paused by hi/low water */
#define EV_TXB		0x0040		/* Transmit break pending */
#define EV_TXI		0x0080		/* Transmit immediate pending */
#define EV_TXF		0x0100		/* Transmit flow control pending */
#define EV_RXB		0x0200		/* Break received */


/************************************************************************
 * Realport CFLAGS.
 ************************************************************************/

#define CF_CS5		0x0000		/* 5 bit characters */
#define CF_CS6		0x0010		/* 6 bit characters */
#define CF_CS7		0x0020		/* 7 bit characters */
#define CF_CS8		0x0030		/* 8 bit characters */
#define CF_CSIZE	0x0030		/* Character size */
#define CF_CSTOPB	0x0040		/* Two stop bits */
#define CF_CREAD	0x0080		/* Enable receiver */
#define CF_PARENB	0x0100		/* Enable parity */
#define CF_PARODD	0x0200		/* Odd parity */
#define CF_HUPCL	0x0400		/* Drop DTR on close */


/************************************************************************
 * Realport XFLAGS.
 ************************************************************************/

#define XF_XPAR		0x0001		/* Enable Mark/Space Parity */
#define XF_XMODEM	0x0002		/* Enable in-band modem signalling */
#define XF_XCASE	0x0004		/* Convert special characters */
#define XF_XEDATA	0x0008		/* Error data in stream */
#define XF_XTOSS	0x0010		/* Toss IXANY characters */
#define XF_XIXON	0x0020		/* xxon/xxoff enable */


/************************************************************************
 * Realport IFLAGS.
 ************************************************************************/

#define IF_IGNBRK	0x0001		/* Ignore input break */
#define IF_BRKINT	0x0002		/* Break interrupt */
#define IF_IGNPAR	0x0004		/* Ignore error characters */
#define IF_PARMRK	0x0008		/* Error chars marked with 0xff */
#define IF_INPCK	0x0010		/* Input parity checking enabled */
#define IF_ISTRIP	0x0020		/* Input chars masked with 0x7F */
#define IF_IXON		0x0400		/* Output software flow control */
#define IF_IXANY	0x0800		/* Restart output on any char */
#define	IF_IXOFF	0x1000		/* Input software flow control */
#define IF_DOSMODE	0x8000		/* 16450-compatible errors */


/************************************************************************
 * Realport OFLAGS.
 ************************************************************************/

#define OF_OLCUC	0x0002		/* Map lower to upper case */
#define OF_ONLCR	0x0004		/* Map NL to CR-NL */
#define OF_OCRNL	0x0008		/* Map CR to NL */
#define OF_ONOCR	0x0010		/* No CR output at column 0 */
#define OF_ONLRET	0x0020		/* Assume NL does NL/CR */
#define OF_TAB3		0x1800		/* Tabs expand to 8 spaces */
#define OF_TABDLY	0x1800		/* Tab delay */

/************************************************************************
 * Unit flag definitions for un_flag.
 ************************************************************************/

/* These are the DIGI unit flags */
#define UN_EXCL		0x00010000	/* Exclusive open */
#define UN_STICKY	0x00020000	/* TTY Settings are now sticky */
#define UN_BUSY		0x00040000	/* Some work this channel */
#define UN_PWAIT	0x00080000	/* Printer waiting for terminal */
#define UN_TIME		0x00100000	/* Waiting on time */
#define UN_EMPTY	0x00200000	/* Waiting output queue empty */
#define UN_LOW		0x00400000	/* Waiting output low water */
#define UN_DIGI_MASK	0x00FF0000	/* Waiting output low water */

/*
 * Definitions for async_struct (and serial_struct) flags field
 *
 * these are the ASYNC flags copied from serial.h
 *
 */
#define UN_HUP_NOTIFY	0x0001 /* Notify getty on hangups and
				* closes on the callout port
				*/
#define UN_FOURPORT	0x0002	/* Set OU1, OUT2 per AST Fourport settings */
#define UN_SAK		0x0004	/* Secure Attention Key (Orange book) */
#define UN_SPLIT_TERMIOS 0x0008 /* Separate termios for dialin/callout */

#define UN_SPD_MASK	0x0030
#define UN_SPD_HI	0x0010	/* Use 56000 instead of 38400 bps */
#define UN_SPD_VHI	0x0020	/* Use 115200 instead of 38400 bps */
#define UN_SPD_CUST	0x0030	/* Use user-specified divisor */

#define UN_SKIP_TEST	0x0040 /* Skip UART test during autoconfiguration */
#define UN_AUTO_IRQ	0x0080 /* Do automatic IRQ during autoconfiguration */

#define UN_SESSION_LOCKOUT 0x0100 /* Lock out cua opens based on session */
#define UN_PGRP_LOCKOUT	   0x0200 /* Lock out cua opens based on pgrp */
#define UN_CALLOUT_NOHUP   0x0400 /* Don't do hangups for cua device */

#define UN_FLAGS	0x0FFF	/* Possible legal async flags */
#define UN_USR_MASK	0x0430	/* Legal flags that non-privileged
				 * users can set or reset
				 */

#define UN_INITIALIZED		0x80000000 /* Serial port was initialized */
#define UN_CALLOUT_ACTIVE	0x40000000 /* Call out device is active */
#define UN_NORMAL_ACTIVE	0x20000000 /* Normal device is active */
#define UN_BOOT_AUTOCONF	0x10000000 /* Autoconfigure port on bootup */
#define UN_CLOSING		0x08000000 /* Serial port is closing */
#define UN_CTS_FLOW		0x04000000 /* Do CTS flow control */
#define UN_CHECK_CD		0x02000000 /* i.e., CLOCAL */
#define UN_SHARE_IRQ		0x01000000 /* for multifunction cards */


/************************************************************************
 * Structure for terminal or printer unit.  struct un_struct
 *
 * Note that in some places the code assumes the "tty_t" is placed
 * first in the structure.
 ************************************************************************/

struct un_struct {
	struct tty_struct *un_tty;		/* System TTY struct */
	struct ch_struct *un_ch;		/* Associated channel */

	ushort     un_open_count;		/* Successful open count */
	int		un_flag;		/* Unit flags */
	ushort     un_tbusy;		/* Busy transmit count */

	wait_queue_head_t  un_open_wait;
	wait_queue_head_t  un_close_wait;
	ushort	un_type;
	struct device *un_sysfs;
};


/************************************************************************
 * Channel State Numbers for ch_state.
 ************************************************************************/

/*
 * The ordering is important.
 *
 *    state <= CS_WAIT_CANCEL implies the channel is definitely closed.
 *
 *    state >= CS_WAIT_FAIL  implies the channel is definitely open.
 *
 *    state >= CS_READY implies data is allowed on the channel.
 */

enum dgrp_ch_state_t {
	CS_IDLE = 0,	    /* Channel is idle */
	CS_WAIT_OPEN = 1,   /* Waiting for Immediate Open Resp */
	CS_WAIT_CANCEL = 2, /* Waiting for Per/Incom Cancel Resp */
	CS_WAIT_FAIL = 3,   /* Waiting for Immed Open Failure */
	CS_SEND_QUERY = 4,  /* Ready to send Port Query */
	CS_WAIT_QUERY = 5,  /* Waiting for Port Query Response */
	CS_READY = 6,	    /* Ready to accept commands and data */
	CS_SEND_CLOSE =	7,  /* Ready to send Close Request */
	CS_WAIT_CLOSE =	8   /* Waiting for Close Response */
};

/************************************************************************
 * Device flag definitions for ch_flag.
 ************************************************************************/

/*
 *  Note that the state of the two carrier based flags is key.	When
 *  we check for carrier state transitions, we look at the current
 *  physical state of the DCD line and compare it with PHYS_CD (which
 *  was the state the last time we checked), and we also determine
 *  a new virtual state (composite of the physical state, FORCEDCD,
 *  CLOCAL, etc.) and compare it with VIRT_CD.
 *
 *  VIRTUAL transitions high will have the side effect of waking blocked
 *  opens.
 *
 *  PHYSICAL transitions low will cause hangups to occur _IF_ the virtual
 *  state is also low.	We DON'T want to hangup on a PURE virtual drop.
 */

#define CH_HANGUP	0x00002		/* Server port ready to close */

#define CH_VIRT_CD	0x00004		/* Carrier was virtually present */
#define CH_PHYS_CD	0x00008		/* Carrier was physically present */

#define CH_CLOCAL	0x00010		/* CLOCAL set in cflags */
#define CH_BAUD0	0x00020		/* Baud rate zero hangup */

#define CH_FAST_READ	0x00040		/* Fast reads are enabled */
#define CH_FAST_WRITE	0x00080		/* Fast writes are enabled */

#define CH_PRON		0x00100		/* Printer on string active */
#define CH_RX_FLUSH	0x00200		/* Flushing receive data */
#define CH_LOW		0x00400		/* Thread waiting for LOW water */
#define CH_EMPTY	0x00800		/* Thread waiting for EMPTY */
#define CH_DRAIN	0x01000		/* Close is waiting to drain */
#define CH_INPUT	0x02000		/* Thread waiting for INPUT */
#define CH_RXSTOP	0x04000		/* Stop output to ldisc */
#define CH_PARAM	0x08000		/* A parameter was updated */
#define CH_WAITING_SYNC 0x10000		/* A pending sync was assigned
					 * to this port.
					 */
#define CH_PORT_GONE	0x20000		/* Port has disappeared */
#define CH_TX_BREAK	0x40000		/* TX Break to be sent,
					 * but has not yet.
					 */

/************************************************************************
 * Types of Open Requests for ch_otype.
 ************************************************************************/

#define OTYPE_IMMEDIATE	  0		/* Immediate Open */
#define OTYPE_PERSISTENT  1		/* Persistent Open */
#define OTYPE_INCOMING	  2		/* Incoming Open */


/************************************************************************
 * Request/Response flags.
 ************************************************************************/

#define RR_SEQUENCE	0x0001		/* Get server RLAST, TIN */
#define RR_STATUS	0x0002		/* Get server MINT, EINT */
#define RR_BUFFER	0x0004		/* Get server RSIZE, TSIZE */
#define RR_CAPABILITY	0x0008		/* Get server port capabilities */

#define RR_TX_FLUSH	0x0040		/* Flush output buffers */
#define RR_RX_FLUSH	0x0080		/* Flush input buffers */

#define RR_TX_STOP	0x0100		/* Pause output */
#define RR_RX_STOP	0x0200		/* Pause input */
#define RR_TX_START	0x0400		/* Start output */
#define RR_RX_START	0x0800		/* Start input */

#define RR_TX_BREAK	0x1000		/* Send BREAK */
#define RR_TX_ICHAR	0x2000		/* Send character immediate */


/************************************************************************
 * Channel information structure.   struct ch_struct
 ************************************************************************/

struct ch_struct {
	struct digi_struct ch_digi;		/* Digi variables */
	int	ch_edelay;		/* Digi edelay */

	struct tty_port port;
	struct un_struct ch_tun;	/* Terminal unit info */
	struct un_struct ch_pun;	/* Printer unit info */

	struct nd_struct *ch_nd;	/* Node pointer */
	u8  *ch_tbuf;		/* Local Transmit Buffer */
	u8  *ch_rbuf;		/* Local Receive Buffer */
	ulong	ch_cpstime;		/* Printer CPS time */
	ulong	ch_waketime;		/* Printer wake time */

	ulong	ch_flag;		/* CH_* flags */

	enum dgrp_ch_state_t ch_state;		/* CS_* Protocol state */
	ushort	ch_send;		/* Bit vector of RR_* requests */
	ushort	ch_expect;		/* Bit vector of RR_* responses */
	ushort	ch_wait_carrier;	/* Thread count waiting for carrier */
	ushort	ch_wait_count[3];	/* Thread count waiting by otype */

	ushort	ch_portnum;		/* Port number */
	ushort	ch_open_count;		/* Successful open count */
	ushort	ch_category;		/* Device category */
	ushort	ch_open_error;		/* Last open error number */
	ushort	ch_break_time;		/* Pending break request time */
	ushort	ch_cpsrem;		/* Printer CPS remainder */
	ushort	ch_ocook;		/* Realport fastcook oflags */
	ushort	ch_inwait;		/* Thread count in CLIST input */

	ushort	ch_tin;			/* Local transmit buffer in ptr */
	ushort	ch_tout;		/* Local transmit buffer out ptr */
	ushort	ch_s_tin;		/* Realport TIN */
	ushort	ch_s_tpos;		/* Realport TPOS */
	ushort	ch_s_tsize;		/* Realport TSIZE */
	ushort	ch_s_treq;		/* Realport TREQ */
	ushort	ch_s_elast;		/* Realport ELAST */

	ushort	ch_rin;			/* Local receive buffer in ptr */
	ushort	ch_rout;		/* Local receive buffer out ptr */
	ushort	ch_s_rin;		/* Realport RIN */
	/* David Fries 7-13-2001, ch_s_rin should be renamed ch_s_rout because
	 * the variable we want to represent is the PortServer's ROUT, which is
	 * the sequence number for the next byte the PortServer will send us.
	 * RIN is the sequence number for the next byte the PortServer will
	 * receive from the uart.  The port server will send data as long as
	 * ROUT is less than RWIN.  What would happen is the port is opened, it
	 * receives data, it gives the value of RIN, we set the RWIN to
	 * RIN+RBUF_MAX-1, it sends us RWIN-ROUT bytes which overflows.	 ROUT
	 * is set to zero when the port is opened, so we start at zero and
	 * count up as data is received.
	 */
	ushort	ch_s_rwin;		/* Realport RWIN */
	ushort	ch_s_rsize;		/* Realport RSIZE */

	ushort	ch_tmax;		/* Local TMAX */
	ushort	ch_ttime;		/* Local TTIME */
	ushort	ch_rmax;		/* Local RMAX */
	ushort	ch_rtime;		/* Local RTIME */
	ushort	ch_rlow;		/* Local RLOW */
	ushort	ch_rhigh;		/* Local RHIGH */

	ushort	ch_s_tmax;		/* Realport TMAX */
	ushort	ch_s_ttime;		/* Realport TTIME */
	ushort	ch_s_rmax;		/* Realport RMAX */
	ushort	ch_s_rtime;		/* Realport RTIME */
	ushort	ch_s_rlow;		/* Realport RLOW */
	ushort	ch_s_rhigh;		/* Realport RHIGH */

	ushort	ch_brate;		/* Local baud rate */
	ushort	ch_cflag;		/* Local tty cflags */
	ushort	ch_iflag;		/* Local tty iflags */
	ushort	ch_oflag;		/* Local tty oflags */
	ushort	ch_xflag;		/* Local tty xflags */

	ushort	ch_s_brate;		/* Realport BRATE */
	ushort	ch_s_cflag;		/* Realport CFLAG */
	ushort	ch_s_iflag;		/* Realport IFLAG */
	ushort	ch_s_oflag;		/* Realport OFLAG */
	ushort	ch_s_xflag;		/* Realport XFLAG */

	u8	ch_otype;		/* Open request type */
	u8	ch_pscan_savechar;	/* Last character read by parity scan */
	u8	ch_pscan_state;		/* PScan State based on last 2 chars */
	u8	ch_otype_waiting;	/* Type of open pending in server */
	u8	ch_flush_seq;		/* Receive flush end sequence */
	u8	ch_s_mlast;		/* Realport MLAST */

	u8	ch_mout;		/* Local MOUT */
	u8	ch_mflow;		/* Local MFLOW */
	u8	ch_mctrl;		/* Local MCTRL */
	u8	ch_xon;			/* Local XON */
	u8	ch_xoff;		/* Local XOFF */
	u8	ch_lnext;		/* Local LNEXT */
	u8	ch_xxon;		/* Local XXON */
	u8	ch_xxoff;		/* Local XXOFF */

	u8	ch_s_mout;		/* Realport MOUT */
	u8	ch_s_mflow;		/* Realport MFLOW */
	u8	ch_s_mctrl;		/* Realport MCTRL */
	u8	ch_s_xon;		/* Realport XON */
	u8	ch_s_xoff;		/* Realport XOFF */
	u8	ch_s_lnext;		/* Realport LNEXT */
	u8	ch_s_xxon;		/* Realport XXON */
	u8	ch_s_xxoff;		/* Realport XXOFF */

	wait_queue_head_t ch_flag_wait;	/* Wait queue for ch_flag changes */
	wait_queue_head_t ch_sleep;	/* Wait queue for my_sleep() */

	int	ch_custom_speed;	/* Realport custom speed */
	int	ch_txcount;		/* Running TX count */
	int	ch_rxcount;		/* Running RX count */
};


/************************************************************************
 * Node State definitions.
 ************************************************************************/

enum dgrp_nd_state_t {
	NS_CLOSED = 0,	   /* Network device is closed */
	NS_IDLE = 1,	   /* Network connection inactive */
	NS_SEND_QUERY =	2, /* Send server query */
	NS_WAIT_QUERY =	3, /* Wait for query response */
	NS_READY = 4,	   /* Network ready */
	NS_SEND_ERROR =	5  /* Must send error hangup */
};

#define ND_STATE_STR(x) \
	((x) == NS_CLOSED     ? "CLOSED"     : \
	((x) == NS_IDLE	      ? "IDLE"	     : \
	((x) == NS_SEND_QUERY ? "SEND_QUERY" : \
	((x) == NS_WAIT_QUERY ? "WAIT_QUERY" : \
	((x) == NS_READY      ? "READY"	     : \
	((x) == NS_SEND_ERROR ? "SEND_ERROR" : "UNKNOWN"))))))

/************************************************************************
 * Node Flag definitions.
 ************************************************************************/

#define ND_SELECT	0x0001		/* Multiple net read selects */
#define ND_DEB_WAIT	0x0002		/* Debug Device waiting */


/************************************************************************
 * Monitoring flag definitions.
 ************************************************************************/

#define MON_WAIT_DATA	0x0001		/* Waiting for buffer data */
#define MON_WAIT_SPACE	0x0002		/* Waiting for buffer space */

/************************************************************************
 * DPA flag definitions.
 ************************************************************************/

#define DPA_WAIT_DATA	0x0001		/* Waiting for buffer data */
#define DPA_WAIT_SPACE	0x0002		/* Waiting for buffer space */


/************************************************************************
 * Definitions taken from Realport Dump.
 ************************************************************************/

#define RPDUMP_MAGIC	"Digi-RealPort-1.0"

#define RPDUMP_MESSAGE	0xE2		/* Descriptive message */
#define RPDUMP_RESET	0xE7		/* Connection reset */
#define RPDUMP_CLIENT	0xE8		/* Client data */
#define RPDUMP_SERVER	0xE9		/* Server data */


/************************************************************************
 * Node request/response definitions.
 ************************************************************************/

#define NR_ECHO		0x0001		/* Server echo packet */
#define NR_IDENT	0x0002		/* Server Product ID */
#define NR_CAPABILITY	0x0004		/* Server Capabilties */
#define NR_VPD		0x0008		/* Server VPD, if any */
#define NR_PASSWORD	0x0010		/* Server Password */

/************************************************************************
 * Registration status of the node's Linux struct tty_driver structures.
 ************************************************************************/
#define SERIAL_TTDRV_REG   0x0001     /* nd_serial_ttdriver registered	*/
#define CALLOUT_TTDRV_REG  0x0002     /* nd_callout_ttdriver registered */
#define XPRINT_TTDRV_REG   0x0004     /* nd_xprint_ttdriver registered	*/


/************************************************************************
 * Node structure.  There exists one of these for each associated
 * realport server.
 ************************************************************************/

struct nd_struct {
	struct list_head	list;
	long	      nd_major;		   /* Node's major number	    */
	long	      nd_ID;		   /* Node's ID code		    */

	char	      nd_serial_name[50];   /* "tty_dgrp_<id>_" + null	    */
	char	      nd_callout_name[50];  /* "cu_dgrp_<id>_" + null	    */
	char	      nd_xprint_name[50];   /* "pr_dgrp_<id>_" + null	    */

	char	     password[16];	  /* Password for server, if needed */
	int	     nd_tty_ref_cnt;	  /* Linux tty reference count	   */

	struct proc_dir_entry *nd_net_de; /* Dir entry for /proc/dgrp/net  */
	struct proc_dir_entry *nd_mon_de; /* Dir entry for /proc/dgrp/mon  */
	struct proc_dir_entry *nd_ports_de; /* Dir entry for /proc/dgrp/ports*/
	struct proc_dir_entry *nd_dpa_de; /* Dir entry for /proc/dgrp/dpa  */

	spinlock_t nd_lock;		  /* General node lock		   */

	struct semaphore nd_net_semaphore; /* Net read/write lock	    */
	struct semaphore nd_mon_semaphore; /* Monitor buffer lock	    */
	spinlock_t nd_dpa_lock;		/* DPA buffer lock	     */

	enum dgrp_nd_state_t nd_state;	  /* NS_* network state */
	int	      nd_chan_count;	   /* # active channels		    */
	int	      nd_flag;		   /* Node flags		    */
	int	      nd_send;		   /* Responses to send		    */
	int	      nd_expect;	   /* Responses we expect	    */

	u8	 *nd_iobuf;	       /* Network R/W Buffer		*/
	wait_queue_head_t nd_tx_waitq;	  /* Network select wait queue	   */

	u8	 *nd_inputbuf;	       /* Input Buffer			*/
	u8	 *nd_inputflagbuf;     /* Input Flags Buffer		*/

	int	      nd_tx_deposit;	   /* Accumulated transmit deposits */
	int	      nd_tx_charge;	   /* Accumulated transmit charges  */
	int	      nd_tx_credit;	   /* Current TX credit		    */
	int	      nd_tx_ready;	   /* Ready to transmit		    */
	int	      nd_tx_work;	   /* TX work waiting		    */
	ulong	     nd_tx_time;	  /* Last transmit time		   */
	ulong	     nd_poll_time;	  /* Next scheduled poll time	   */

	int	      nd_delay;		   /* Current TX delay		    */
	int	      nd_rate;		   /* Current TX rate		    */
	struct link_struct nd_link;		/* Link speed params.		 */

	int	      nd_seq_in;	   /* TX seq in ptr		    */
	int	      nd_seq_out;	   /* TX seq out ptr		    */
	int	      nd_unack;		   /* Unacknowledged byte count	    */
	int	      nd_remain;	   /* Remaining receive bytes	    */
	int	      nd_tx_module;	   /* Current TX module #	    */
	int	      nd_rx_module;	   /* Current RX module #	    */
	char	     *nd_error;		   /* Protocol error message	    */

	int	      nd_write_count;	   /* drp_write() call count	    */
	int	      nd_read_count;	   /* drp_read() count		    */
	int	      nd_send_count;	   /* TCP message sent		    */
	int	      nd_tx_byte;	   /* Transmit byte count	    */
	int	      nd_rx_byte;	   /* Receive byte count	    */

	ulong	     nd_mon_lbolt;	 /* Monitor start time		   */
	int	      nd_mon_flag;	  /* Monitor flags		    */
	int	      nd_mon_in;	  /* Monitor in pointer		    */
	int	      nd_mon_out;	  /* Monitor out pointer	    */
	wait_queue_head_t nd_mon_wqueue;  /* Monitor wait queue (on flags)  */
	u8	 *nd_mon_buf;	      /* Monitor buffer			*/

	ulong	     nd_dpa_lbolt;	/* DPA start time	      */
	int	     nd_dpa_flag;	/* DPA flags		      */
	int	     nd_dpa_in;		/* DPA in pointer	      */
	int	     nd_dpa_out;	/* DPA out pointer	      */
	wait_queue_head_t nd_dpa_wqueue; /* DPA wait queue (on flags)  */
	u8	  *nd_dpa_buf;	/* DPA buffer		      */

	uint	     nd_dpa_debug;
	uint	     nd_dpa_port;

	wait_queue_head_t nd_seq_wque[SEQ_MAX];	  /* TX thread wait queues */
	u8	  nd_seq_wait[SEQ_MAX];	  /* Transmit thread wait count */

	ushort	     nd_seq_size[SEQ_MAX];   /* Transmit seq packet size   */
	ulong	     nd_seq_time[SEQ_MAX];   /* Transmit seq packet time   */

	ushort	     nd_hw_ver;		  /* HW version returned from PS   */
	ushort	     nd_sw_ver;		  /* SW version returned from PS   */
	uint	     nd_hw_id;		  /* HW ID returned from PS	   */
	u8	  nd_ps_desc[MAX_DESC_LEN];  /* Description from PS	*/
	uint	     nd_vpd_len;		/* VPD len, if any */
	u8	     nd_vpd[VPDSIZE];		/* VPD, if any */

	ulong	     nd_ttdriver_flags;	  /* Registration status	    */
	struct tty_driver *nd_serial_ttdriver;	/* Linux TTYDRIVER structure */
	struct tty_driver *nd_callout_ttdriver; /* Linux TTYDRIVER structure */
	struct tty_driver *nd_xprint_ttdriver;	/* Linux TTYDRIVER structure */

	u8	     *nd_writebuf;		/* Used to cache data read
						 * from user
						 */
	struct ch_struct nd_chan[CHAN_MAX];  /* Channel array		    */
	struct device *nd_class_dev;	/* Hang our sysfs stuff off of here */
};

#endif /* __DRP_H */