current version
[unix-history] / usr / src / sys / vax / uba / npreg.h
/*
* Copyright (c) 1986 MICOM-Interlan, Inc., Boxborough Mass
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*
* @(#)npreg.h 7.2 (Berkeley) %G%
*
* Merged header file for MICOM-Interlan NP100.
*/
/*
* np100.h version 1.3
*
* This version retrieved: 8/18/86 @ 18:58:44
* This delta created: 8/18/86 @ 18:27:32
*/
/*
* 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 NPIDP 0x04 /* Direct Datalink Access */
#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 */
union {
unsign32 cqe_Famid; /* Family ID (Process ID) - wn */
unsign16 cqe_PrtSig[2]; /* port and signal - tn */
} u1;
#define cqe_famid u1.cqe_Famid
#define cqe_port u1.cqe_PrtSig[0]
#define cqe_signal u1.cqe_PrtSig[1]
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
union {
unsign16 cqe_ustS[2]; /* Protocol status return */
unsign32 cqe_ustL; /* Protocol status return */
} u2;
#define cqe_ust0 u2.cqe_ustS[0]
#define cqe_ust1 u2.cqe_ustS[1]
#define cqe_usts u2.cqe_ustL
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 */
union {
unsign16 cqe_Unused; /* Unused */
struct {
char cqe_Maxbcnt; /* Maximum size of buffer */
char cqe_Bflags; /* Used by the SPI */
} s;
} u3;
#define cqe_unused u3.cqe_Unused
#define cqe_maxbcnt u3.s.cqe_Maxbcnt
#define cqe_bflags u3.s.cqe_Bflags
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 */
int int_param; /* Paramater to be used by above routine */
};
/*
* 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 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 */
#define REQALOC 0x100 /* Request has been allocated */
#define REQUSE 0x200 /* Request is in request queue */
/* 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 */
#define LSTCMD 0x800 /* Clear last command during NPIO */
#define SCANNING 0x1000 /* We are scanning for cqe's */
/*
* 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 */
#define DEBCANCEL 0x8000 /* debug cancel command */
/*
* npreg.h version 1.3
*
* This version retrieved: 8/18/86 @ 18:58:46
* This delta created: 8/18/86 @ 18:27:42
*/
/*
* 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.
*/
/*
* npcmd.h version 1.3
*
* This version retrieved: 8/18/86 @ 18:58:45
* This delta created: 8/18/86 @ 18:27:38
*/
#ifndef IOC_VOID
# ifdef KERNEL
# include "../h/ioctl.h"
# else
# include <sys/ioctl.h>
# endif
#endif
#ifdef KERNEL
# define IoVOID 0
#else
# define IoVOID IOC_VOID
#endif
#define NPRESET (IoVOID|0x01) /* reset the board */
#define NPSTART (IoVOID|0x04) /* start board execution */
#define NPGPANIC (IoVOID|0x05) /* Get panic message */
#define NPINIT (IoVOID|0x06) /* initialize software on board */
#define NPSTATS (IoVOID|0x07)
#define NPRCSR0 (IoVOID|0x08) /* read CSR0 */
#define NPRCSR1 (IoVOID|0x09) /* read CSR1 */
#define NPRCSR2 (IoVOID|0x0a) /* read CSR2 */
#define NPRCSR3 (IoVOID|0x0b) /* read CSR3 */
#define NPWCSR0 (IoVOID|0x0c) /* write CSR0 */
#define NPWCSR1 (IoVOID|0x0d) /* write CSR1 */
#define NPWCSR2 (IoVOID|0x0e) /* write CSR2 */
#define NPWCSR3 (IoVOID|0x0f) /* write CSR3 */
#define NPPOLL (IoVOID|0x10)
#define NPKILL (IoVOID|0x11)
#define NPSETPROT (IoVOID|0x12) /* set the protocol to use */
#define NPSETBOARD (IoVOID|0x13) /* set board to use */
#define NPSETNPDEB (IoVOID|0x14) /* set nc debuging level */
#define NPSETADDR (IoVOID|0x15) /* set host address */
#define NPNETBOOT (IoVOID|0x16) /* boot from the network */
#define NPSETLAST (IoVOID|0x17) /* set last command flag in NPIO */
#define NPCLRICNT (IoVOID|0x18) /* clear interupt count */
#define NPGETICNT (IoVOID|0x19) /* get interupt count */
#define NPGETIVEC (IoVOID|0x1a) /* get interupt vector */
#define NPMAPMEM (IoVOID|0x1b) /* map user memory to shmem */
#define NP_SET 1031 /* set memory mapping */
#define NP_USET 1032 /* unset memory mapping */
struct np_mem {
long mem_type;
char *mem_addr;
long mem_count;
} ;
#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)
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 */
};
/* ICP Board Requests */
#define ICPLOAD 0x02
#define ICPDUMP 0x03
#define ICPPANIC 0x05
#define ICPPOLL 0x10
/*
* npdebug.h version 1.3
*
* This version retrieved: 8/18/86 @ 18:58:46
* This delta created: 8/18/86 @ 18:27:39
*/
/*
* 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 */