Both hardware and software structures for np driver; merged into one file to be consi...
authorKeith Sklower <sklower@ucbvax.Berkeley.EDU>
Tue, 18 Feb 1986 05:45:58 +0000 (21:45 -0800)
committerKeith Sklower <sklower@ucbvax.Berkeley.EDU>
Tue, 18 Feb 1986 05:45:58 +0000 (21:45 -0800)
SCCS-vsn: sys/vax/uba/npreg.h 6.1

usr/src/sys/vax/uba/npreg.h [new file with mode: 0644]

diff --git a/usr/src/sys/vax/uba/npreg.h b/usr/src/sys/vax/uba/npreg.h
new file mode 100644 (file)
index 0000000..45cbd67
--- /dev/null
@@ -0,0 +1,470 @@
+/*
+ * Copyright (c) 1986 MICOM-Interlan, Inc., Foxborough Mass
+ *
+ * This software is furnished under a license and may only be used
+ * or copied in accordance with the terms of that license.
+ *
+ *     @(#)npreg.h     6.1 (Berkeley) %G%
+ */
+
+/*
+ *                     NPREG.H
+ *
+ * This file contain definitions of specific hardware interest
+ * to be used when communicating with the NI1510 Network Processor
+ * Board. More complete information can be found in the NI1510
+ * Multibus compatible Ethernet Communications Processor Hardware 
+ * Specification.
+ */
+
+
+#define NNPCNN         4       /* Number of connections per board */
+#define NPUNIT(a)      ((minor(a) >> 4) & 0x0F)
+#define NPCONN(a)      ((minor(a)) & 0x03)
+
+#define TRUE           1
+#define FALSE          0
+
+#define IBOOTADDR      0xF8000l        /* Addr of 80186 Boot ROM */
+#define        INETBOOT        0xF8087l
+#define IXEQADDR       0x400           /* Where to begin Board image XEQ */
+#define DIAGTIME       1200            /* Time for timeout /HZ seconds */
+
+#define        DELAYTIME       1000000L                /* delay count */
+#define NPDELAY(N)     {register int n = (N) >> 1; while(--n > 0); }
+
+/* Handy macros for talking to the Board */
+
+#define RESET(x)       (WCSR3(x->iobase,0xff))
+#define CLEARINT(x)    {unsign16 y; y = RCSR2(x->iobase); }
+#define INTNI(x)       (WCSR1(x->iobase,0xFF))
+
+/* Command and Status Register (CSR) Definitions */
+
+/*
+ * CSR0 is the only direct means for data transfer between the host processor
+ * and the 3510. Access is controlled by the 80186 who sets the CSR1 Enable and
+ * Ready bits to allow writing here. Writing to this register will always
+ * result in an interrupt to the 80186.
+ */
+
+/* 
+ * Bit definitions for CSR1.
+ */
+
+#define NPRFU  0x01            /* Reserved for Future Use */
+#define NPHOK  0x02            /* Hardware OK */
+#define NPLAN  0x04            /* Logic 0 indicates operational LAN exists */
+#define NP_IP  0x08            /* Interrupt pending from this board */
+#define NP_IE  0x10            /* Interrupts enabled for this board */
+#define NPRDR  0x20            /* Set when 80186 writes data into CSR0 */
+#define NPRDY  0x40            /* CSR0 ready to accept data */
+#define NPENB  0x80            /* CSR0 available for use by the host */
+
+/*
+ * Bit defintions for CSR0 Command Block
+ */
+
+#define NPLST  0x20            /* Last Command */
+#define NPCMD  0x80            /* Shared Memory Address */
+#define NPBGN  0x200           /* Begin Execution in On-Board Memory */
+#define NPCBI  0x800           /* Interrupt at completion of Command Block */
+#define NPDMP  0x2000          /* Dump 80186 On-Board Memory to Multibus */
+#define NPLD   0x8000          /* Load 80186 On-board Memory from Multibus */
+
+/*
+ * CSR0 Count definitions. These are the lengths of the Command Blocks for the
+ * CSR0 commands above (not counting the Command Word itself).
+ */
+
+#define LSTCNT 0
+#define CMDCNT 2
+#define BGNCNT 2
+#define CBICNT 1
+#define DMPCNT 5
+#define LDCNT  5
+#define IOCNT  5
+
+/* Macros for reading and writing CSR's (Control and Status Registers) */
+
+#define        WCSR0(x,y)      ((x)->CSR0 = y)
+#define        WCSR1(x,y)      ((x)->CSR1 = y)
+#define        WCSR2(x,y)      ((x)->CSR2 = y)
+#define        WCSR3(x,y)      ((x)->CSR3 = y)
+
+#define        RCSR0(x)        ((x)->CSR0)
+#define        RCSR1(x)        ((x)->CSR1)
+#define        RCSR2(x)        ((x)->CSR2)
+#define        RCSR3(x)        ((x)->CSR3)
+
+#define NPRESET                0x01            /* reset the board */
+#define        NPSTART         0x04            /* start board execution */
+#define        NPGPANIC        0x05            /* Get panic message */
+#define        NPINIT          0x06            /* initialize software on board */
+#define NPSTATS        0x07
+#define        NPRCSR0         0x08            /* read CSR0 */
+#define        NPRCSR1         0x09            /* read CSR1 */
+#define        NPRCSR2         0x0a            /* read CSR2 */
+#define        NPRCSR3         0x0b            /* read CSR3 */
+#define        NPWCSR0         0x0c            /* write CSR0 */
+#define        NPWCSR1         0x0d            /* write CSR1 */
+#define        NPWCSR2         0x0e            /* write CSR2 */
+#define        NPWCSR3         0x0f            /* write CSR3 */
+#define NPPOLL         0x10
+#define NPKILL         0x11
+#define        NPSETPROT       0x12            /* set the protocol to use */
+#define        NPSETBOARD      0x13            /* set board to use */
+#define        NPSETNPDEB      0x14            /* set nc debuging level */
+#define        NPSETADDR       0x15            /* set host address */
+#define        NPNETBOOT       0x16            /* boot from the network */
+
+/* ICP Board Requests */
+
+#define ICPLOAD  0x02
+#define ICPDUMP  0x03
+#define ICPPANIC 0x05
+#define ICPPOLL  0x10
+
+/*
+ * Typedefs for the VAX 
+ */
+
+typedef short  sign16;                 /* 16 bit signed value */
+typedef unsigned short unsign16;       /* 16 bit unsigned value */
+typedef unsigned unsign32;             /* 32 bit unsigned value */
+typedef long paddr_t;                  /* Physical addresses */
+
+
+/*
+ * Tunables
+ */
+
+
+#define NUMCQE         40              /* Number of CQE's per board */
+
+/* Host configuration word in Status Block */
+
+/*
+ * To disable the lock/unlock internal function calls clear the 0x8000
+ * bit in the host configuration word (HOSTCONF)
+ */
+
+#define        HOSTCONF        0x0109  /* See above */
+#define        LOWBYTE         1
+#define        HIGHBYTE        0
+#define BUFFMAPPED     0
+
+/*
+ * Memory mapping definintions for PM68DUAL hardware.
+ */
+
+#ifdef PM68DUAL
+#define        PISHMEM         0x200000
+#define PISHMEMSIZE    2
+#define PIOFF          0x8000          /* change this to unique mem add. */
+#define PIWINDOW       MBUSBUFR + PIOFF
+#define WINDOWSIZE     2
+#endif
+#define        NPMAXXFR        32768           /* Maximum number of bytes / read */ 
+
+/*
+ * Define the protocols supported by the NP Driver.
+ */
+
+#define NONE           0x00    /* No protocols active for a process */
+#define NPMAINT                0x01    /* Maintenance protocol, superusers only */
+#define NPNTS          0x02    /* NTS Terminal Server */
+#define NPDLA          0x04    /* Direct Datalink Access */
+#define NPXNS          0x06    /* Xerox NS ITP */
+#define NPTCP          0x08    /* TCP/IP */
+#define NPISO          0x0A    /* ISO */
+#define NPCLCONN       0xFF    /* Closed connection, i.e. no protocol */
+
+/*
+ * Convert the protocol to a value used in the Device Protocol Mask field
+ * of the Shared Memory Status Block.
+ */
+
+#define PROTOMASK(x)   ( 1 << (x) )
+
+/*
+ * Special requests handled by the NP Driver
+ */
+
+#define OS_STP         03400   /* Shut down connection on I Board */
+#define NPSTOP         3       /* Conversion from above (OS_STP) */
+#define NPCHNGP                50      /* Change the protocol on a connection */
+#define NPCHNGB                51      /* Change the Board number */
+
+/*
+ * Miscellaneous
+ */
+
+#define ON             0x8000  /* Used for Command Q's scan and change flag */
+#define UBADDRMASK     0x3FFFF /* 18 bit UNIBUS address */
+#define INTMASK                0xFFFFFFFC /* Used for address validation */
+#define CMDMASK                0xFFFF  /* Mask ioctl cmd field (see ioctl.h) */
+#define NPPSADDR       0x324   /* Pointer to addr of on-board panic string */
+#define        PANLEN          133             /* length of the panic buffer */
+
+/*
+ * Map function code from user to I-Board format
+ */
+
+#define FUNCTMAP(x)    (((x) << 6) | 077) /* Maps user function to NP funcs */
+
+/*
+ * Round up to a 16 byte boundary
+ */
+
+#define ROUND16(x)     (((x) + 15) & (~0x0F)) /* Round to 16 byte boundary */
+#define ADDR24         1 /* Used by iomalloc() to specify 24 bit address */
+
+#define NPERRSHIFT     8       /* Used in function ReqDone() */
+#define NPOK           0
+
+#define LOWORD(X)      (((ushort *)&(X))[0])
+#define HIWORD(X)      (((ushort *)&(X))[1])
+
+/* Everyday flag settings */
+
+#define NPSET          1
+#define NPCLEAR                0
+
+/*
+ * Command Queue Elements are the primary data structure for passing data
+ * between the driver and the device.
+ */
+
+struct CQE {
+
+       struct npreq *cqe_reqid;/* Address of asssociated npreq */
+       unsign32 cqe_famid;     /* Family ID (Process ID) */
+       unsign16 cqe_func;      /* I/O function to be performed */
+#ifdef mc68000
+       char cqe_prot;          /* Protocol type for I/O request */
+       char cqe_lenrpb;        /* Length of the RPB in bytes */
+#else
+       char cqe_lenrpb;        /* Length of the RPB in bytes */
+       char cqe_prot;          /* Protocol type for I/O request */
+#endif
+       unsign16 cqe_ust0;      /* Protocol status return */
+       unsign16 cqe_ust1;      /* Protocol status return */
+       unsign16 cqe_devrsv;    /* Reserved for use by device only! */
+#ifdef mc68000
+       char cqe_char;          /* CQE characteristics */
+       char cqe_sts;           /* Status return from device to user */
+       char cqe_wind;          /* Buffer mapping window size (page units) */
+       char cqe_nbuf;          /* Number of data buffers for I/O */
+#else
+       char cqe_sts;           /* Status return from device to user */
+       char cqe_char;          /* CQE characteristics */
+       char cqe_nbuf;          /* Number of data buffers for I/O */
+       char cqe_wind;          /* Buffer mapping window size (page units) */
+#endif
+       unsign16 cqe_bcnt;      /* Total number of bytes in the data buffer */
+       unsign16 cqe_unused;    /* Unused */
+       unsign16 cqe_dma[2];    /* Address of the MULTIBUS data buffer */
+       unsign16 rpb1;          /* Word 1 of protocol parameters */
+       unsign16 rpb2;          /* Word 2 of protocol parameters */
+       unsign16 rpb3;          /* Word 3 of protocol parameters */
+       unsign16 rpb4;          /* Word 4 of protocol parameters */
+       unsign16 rpb5;          /* Word 5 of protocol parameters */
+       unsign16 rpb6;          /* Word 6 of protocol parameters */
+       unsign16 rpb7;          /* Word 7 of protocol parameters */
+       unsign16 rpb8;          /* Word 8 of protocol parameters */
+       unsign16 rpb9;          /* Word 9 of protocol parameters */
+       unsign16 rpb10;         /* Word 10 of protocol parameters */
+       unsign16 rpb11;         /* Word 11 of protocol parameters */
+       unsign16 rpb12;         /* Word 12 of protocol parameters */
+
+};
+
+/*
+ * NP Driver Request structure contains information about a request
+ * maintained solely by the driver. One per CQE, plus a header.
+ */
+
+struct npreq {
+
+       struct npreq *forw;     /* Forward pointer for active list */
+       struct npreq *back;     /* Backward pointer for active list */
+       struct npreq *free;     /* Next member on free list */
+       struct CQE *element;    /* CQE associated with this request */
+       int flags;              /* Always useful */
+       int reqcnt;             /* Request count for reqtab */
+       int bufoffset;          /* Offset into buffer for turns */
+       int     bytecnt;        /* Number of bytes to transfer */
+       caddr_t virtmem;        /* Virtual address of buffer */
+       int     mapbase;        /* Address of the mapping register */
+       int     mapsize;        /* Size of mapped area */
+       caddr_t bufaddr;        /* Address of the user buffer */
+       struct buf buf;         /* Buf structure needed for mem. mgmt */
+       struct proc *procp;     /* Pointer to process of requestor */
+       caddr_t user;           /* Structure passed by user from itpuser.h */
+       int     (*intr)();      /* Ptr to routine to call at interrupt time */
+};
+
+/*
+ * Npmaster structure, one per device, is used for boardwise centralization
+ * of relevant information including queues, I/O addresses and request pools.
+ */
+
+struct npmaster {
+
+       struct npmaster *next;  /* Linked list of these, NULL terminator */
+       struct npspace *shmemp; /* Shared memory address (driver <-> device) */
+       struct uba_device *devp; /* UBA Device for this unit */
+       struct NPREG   *iobase; /* I/O base address for this board */
+       struct npreq   *reqtab; /* Header for pool of CQE requests */
+       int     iomapbase;      /* Base index of I/O map reg's allocated */
+       int flags;              /* State of the Board */
+       int unit;               /* Unit number of this device */
+       int vector;             /* Interrupt vector for this unit */
+};
+
+struct npconn {
+
+       struct npmaster *unit;  /* Unit number (board) of this connection */
+       unsign16 protocol;      /* Protocol used on this connection */
+       struct buf np_wbuf;     /* write buf structure for raw access */
+       struct buf np_rbuf;     /* read buf structure for raw access */
+};
+
+struct NPREG {
+       unsign16 CSR0;          /* Control Status Register 0 */
+       unsign16 CSR1;          /* Control Status Register 1 */
+       unsign16 CSR2;          /* Control Status Register 2 */
+       unsign16 CSR3;          /* Control Status Register 3 */
+
+};
+
+/*
+ * The following structures are used for communicating with the
+ * Intelligent Board and are located in Shared Memory.
+ */
+
+/*
+ * Status Block
+ */
+
+struct NpStat{
+
+       unsign16 sb_drw;        /* Device Request Word */
+       unsign16 sb_hcw;        /* Host Configuration Word */
+       unsign16 sb_dcw;        /* Device Configuration Word */
+       unsign16 sb_dpm;        /* Device Protocol Mask */
+       unsign16 sb_dcq;        /* Offset to Device CQ */
+       unsign16 sb_hcq;        /* Offset to Host CQ */
+};
+
+/*
+ * Command Queue, two per device. One is owned by the driver and the other
+ * is owned by the device.
+ */
+
+struct CmdQue {
+
+       unsign16 scanflag;      /* Scan Flag, MSB set if being scanned */
+       unsign16 chngflag;      /* Change Flag, MSB set by initiator */
+       unsign16 cq_wrap;       /* Offset to last CQE entry +2 */
+       unsign16 cq_add;        /* Offset to add a CQE to the queue */
+       unsign16 cq_rem;        /* Offset to remove a CQE from the queue */
+       unsign16 cq_cqe[NUMCQE]; /* Command Queue Element Offsets */
+};
+
+/*
+ * Structure of the shared memory area per board. Declared this way to avoid
+ * compiler word alignment vagaries when computing offsets.
+ */
+
+struct npspace {
+
+       struct NpStat statblock;        /* Status Block */
+       struct CmdQue devcq;            /* Device's Command Queue */
+       struct CmdQue hostcq;           /* Host's Command Queue */
+       struct CQE elements[NUMCQE];    /* Shared Command Queue Elements */
+       unsign16 filler[8];             /* Here for 16 byte alignment */
+};
+
+/*
+ * Structure of array of base addresses of I-Board controllers
+ * (See global data definitions in np.c)
+ */
+
+struct npbase {
+       caddr_t baseaddr;
+};
+
+/* State of the NP Driver as kept in NpState */
+
+#define ICPAVAIL       0x01    /* ICP is waiting for a request */
+
+/* Tells ICP Process that there are no more requests for this board */
+
+#define BRDDONE 1
+
+/* Flags used by the driver (npreq structure) to monitor status of requests */
+
+#define REQDONE 0x01           /* Request completed */
+#define IOIFC   0x02           /* Internal Function Code Request */
+#define IOERR  0x04            /* Error on Request */
+#define NPPEND 0x08            /* Unused at this time */
+#define IOABORT 0x10           /* Request aborted by ICP */
+#define KERNREQ        0x20            /* Request was from the kernel */
+#define WANTREQ 0x40           /* Process is waiting for a npreq structure */
+#define NPUIO  0x80            /* Process doing physio */
+
+/* Service Request Commands from the Intelligent Board */
+
+#define NOREQ  0x00            /* No service requested */
+#define NPLOAD  0x01           /* Dump request */
+#define NPDUMP 0x02            /* Load request */
+#define NPPANIC        0x100           /* Panic request */
+
+/* Definitions of Status returned from the I-Board */
+
+#define NPDONE 0x01            /* Normal completion */
+#define NPIFC  0x00            /* Internal Function Code request */
+#define NPPERR  0x80           /* Protocol error */
+#define NPMERR 0x82            /* Memory allocation failure on I-Board */
+
+/* Definitions of IFC type requests from I-Board */
+
+#define NPLOCK 0x64            /* Lock the process's data area */
+#define NPUNLOCK 0xA4          /* Unlock the process */
+#define NPREMAP        0x124           /* Window turn */
+
+/* Definition of flags for the Npmaster structure */
+
+#define CSRPEND                0x01            /* CSR0 command pending */
+#define PANICREQ       0x02            /* Panic request */
+#define DUMPREQ                0x04            /* Dump request */
+#define LOADREQ                0x08            /* Load request */
+#define BOARDREQ       0x10            /* Any request by the board */
+#define BADBOARD       0x20            /* Board disabled */
+#define AVAILABLE      0x40            /* Board available */
+#define BRDRESET       0x80            /* Board is being reset */
+#define        PANIC1          0x100           /* Driver wants panic address */
+#define        PANIC2          0x200           /* Driver wants panic string */
+#define PANIC3         0x400           /* Clear first byte of panic string */
+
+/*
+ * Debugging Constants
+ */
+
+#define        DEBENTRY        0x0001          /* debug entry points */
+#define        DEBMEM          0x0002          /* debug memory */
+#define        DEBREQ          0x0004          /* debug requests */
+#define        DEBCQE          0x0008          /* debug cqe's */
+#define        DEBCQ           0x0010          /* debug cq's */
+#define        DEBMAINT        0x0020          /* debug maintainance requests */
+#define        DEBINTR         0x0040          /* debug interrupt routines */
+#define        DEBINIT         0x0080          /* debug initialization routines */
+#define        DEBIFC          0x0100          /* debug Internal function codes */
+#define        DEBIOCTL        0x0200          /* debug ioctl calls */
+#define        DEBOPEN         0x0400          /* debug open calls */
+#define        DEBIO           0x0800          /* debug read & write calls */
+#define        DEBCSR          0x1000          /* debug CSR commands */
+#define        DEBLOCK         0x2000          /* debug lock / unlock calls */
+#define NOBOARD                0x4000          /* debug user/host interface */