xref: /csrg-svn/sys/vax/if/if_exreg.h (revision 19883)
1*19883Skarels /*	@(#)if_exreg.h	6.1 (Berkeley) 05/01/85 */
2*19883Skarels /*	from @(#)if_exreg.h	1.2 (Excelan)	84/10/12 */
3*19883Skarels 
4*19883Skarels struct	exdevice {
5*19883Skarels 	char	xd_porta;	/* write on porta resets EXOS */
6*19883Skarels 	char	xd_pad_a;
7*19883Skarels 	char	xd_portb;	/* write on portb interrupts EXOS */
8*19883Skarels 				/* read on portb returns status bits */
9*19883Skarels 	char	xd_pad_b;
10*19883Skarels };
11*19883Skarels 
12*19883Skarels /* EXOS I/O PORT A write definitions */
13*19883Skarels #define	EX_RESET	0	/* value doesn't really matter... */
14*19883Skarels 
15*19883Skarels /* EXOS I/O PORT B write definitions */
16*19883Skarels #define	EX_NTRUPT	0
17*19883Skarels 
18*19883Skarels /* EXOS I/O PORT B read definitions */
19*19883Skarels #define	EX_TESTOK	1	/* set when self-diagnostics passed */
20*19883Skarels #define	EX_UNREADY	(1<<3)	/* set until EXOS ready to read from B */
21*19883Skarels 
22*19883Skarels /* message buffer status field definitions */
23*19883Skarels #define	MH_OWNER	1	/* mask for status bit for owner */
24*19883Skarels #define	MH_HOST		0	/* if 0, the host owns the buffer */
25*19883Skarels #define	MH_EXOS		1	/* if 1, the EXOS owns the buffer */
26*19883Skarels 
27*19883Skarels /* EXOS Link Level request codes */
28*19883Skarels #define	LLTRANSMIT	0xC	/* send a packet */
29*19883Skarels #define	LLRTRANSMIT	0xE	/* send a packet, and self-receive */
30*19883Skarels #define	LLRECEIVE	0xD	/* receive a packet */
31*19883Skarels #define	LLNET_MODE	0x8	/* read/write mode control objects */
32*19883Skarels #define	LLNET_ADDRS	0x9	/* read/write receive address slots */
33*19883Skarels #define	LLNET_RECV	0xA	/* read/alter receive slot enable bit */
34*19883Skarels #define	LLNET_STSTCS	0xB	/* read/reset network statistics objects */
35*19883Skarels 
36*19883Skarels /* Link Level return codes common to all requests */
37*19883Skarels #define	LL_OK		0	/* successful completion */
38*19883Skarels #define	LLX_MODE	0xA1	/* EXOS not in link level mode (impossible) */
39*19883Skarels 
40*19883Skarels /* LLTRANSMIT unique return codes */
41*19883Skarels #define	LLXM_1RTRY	0x1	/* successful xmission, 1 retry */
42*19883Skarels #define	LLXM_RTRYS	0x2	/* successful xmission, more than 1 retry */
43*19883Skarels #define	LLXM_NSQE	0x8	/* successful xmission, no SQE TEST signal */
44*19883Skarels #define	LLXM_CLSN	0x10	/* xmission failed, excess retries */
45*19883Skarels #define	LLXM_NCS	0x20	/* xmission failed, no carrier sense */
46*19883Skarels #define	LLXM_LNGTH	0x40	/* xmission failed, bad packet length */
47*19883Skarels #define	XMIT_BITS	"\7\7LENGTH\6CARRIER\5XCLSNS\4SQETST"
48*19883Skarels #define	LLXM_ERROR	(LLXM_NSQE|LLXM_CLSN|LLXM_NCS|LLXM_LNGTH)
49*19883Skarels 
50*19883Skarels /* LLRECEIVE unique return codes */
51*19883Skarels #define	LLRC_TRUNC	0x4	/* pkt received, but truncated to fit buffer */
52*19883Skarels #define	LLRC_ALIGN	0x10	/* pkt received, but with alignment error */
53*19883Skarels #define	LLRC_CRC	0x20	/* pkt received, but with CRC error */
54*19883Skarels #define	LLRC_BUFLEN	0x40	/* no pkt received, buffer less than 64 bytes */
55*19883Skarels 				/* this should never happen here */
56*19883Skarels #define	RECV_BITS	"\7\7BUFLEN\6CRC\5ALIGN\3TRUNC"
57*19883Skarels 
58*19883Skarels /* LLNET_ADDRS unique return codes */
59*19883Skarels #define	LLNA_BADSLOT	0xD1	/* slot doesn't exist or can't be accessed */
60*19883Skarels #define	LLNA_BADADDR	0xD3	/* invalid address for designated slot */
61*19883Skarels 
62*19883Skarels /* LLNET_RECV unique return codes */
63*19883Skarels #define	LLNR_BADSLOT	0xD1	/* slot doesn't exist or can't be accessed */
64*19883Skarels #define	LLNR_BADADDR	0xD2	/* designated slot was empty */
65*19883Skarels 
66*19883Skarels /* address slot object indices */
67*19883Skarels #define	NULLSLOT	0	/* the null slot */
68*19883Skarels #define	MINMCSLOT	1	/* minimum multicast slot index */
69*19883Skarels #define	MAXMCSLOT	8	/* default maximum multicast slot index */
70*19883Skarels #define	PHYSSLOT	253	/* physical slot index */
71*19883Skarels #define	UNVRSSLOT	254	/* universal slot index */
72*19883Skarels #define	BROADSLOT	255	/* broadcast slot index */
73*19883Skarels 
74*19883Skarels /* request mask bit definitions */
75*19883Skarels #define	WRITE_OBJ	1	/* write the object */
76*19883Skarels #define	READ_OBJ	2	/* read the object */
77*19883Skarels #define	ENABLE_RCV	4	/* enable reception on designated slot */
78*19883Skarels 
79*19883Skarels /* NET_MODE options mask bit definitions */
80*19883Skarels #define	OPT_ALIGN	0x10	/* receive packets with alignment errors */
81*19883Skarels #define	OPT_CRC		0x20	/* receive packets with CRC errors */
82*19883Skarels #define	OPT_DSABLE	0x80	/* disconnect controller hardware */
83*19883Skarels 
84*19883Skarels /* NET_MODE mode field value definitions */
85*19883Skarels #define	MODE_OFF	0	/* stop transmission and reception */
86*19883Skarels #define	MODE_PERF	1	/* perfect multicast address filtering */
87*19883Skarels #define	MODE_HW		2	/* hardware-only multicast address filtering */
88*19883Skarels #define	MODE_PROM	3	/* promiscuous reception */
89*19883Skarels 
90*19883Skarels #define	NFRAGMENTS 1	/* number fragments that the EXOS will scatter/gather */
91*19883Skarels #define	EXMAXRBUF 1520	/* per EXOS 101 manual 5.3.7 (maybe 1518 would do) */
92*19883Skarels 
93*19883Skarels /*
94*19883Skarels  * N.B.  Structures below are carefully constructed so that
95*19883Skarels  * they correspond to the message formats that NX firmware
96*19883Skarels  * defines.  None of them should contain any compiler-instigated
97*19883Skarels  * padding.  Be especially careful about VAX C longword alignment!
98*19883Skarels  */
99*19883Skarels 
100*19883Skarels struct	stat_array {
101*19883Skarels 	u_long	sa_fsent;	/* frames sent without errors */
102*19883Skarels 	u_long	sa_xsclsn;	/* frames aborted excess collisions */
103*19883Skarels 	u_long	sa_nsqe;	/* frames subject to heartbeat failure */
104*19883Skarels 	u_long	sa_undef;	/* undefined (TDR on EXOS 101) */
105*19883Skarels 	u_long	sa_frcvd;	/* frames received no errors */
106*19883Skarels 	u_long	sa_align;	/* frames received alignment error */
107*19883Skarels 	u_long	sa_crc;		/* frames received crc error */
108*19883Skarels 	u_long	sa_flost;	/* frames lost */
109*19883Skarels };
110*19883Skarels 
111*19883Skarels struct	buf_blk {		/* packet/buffer block descriptor */
112*19883Skarels 	u_short	bb_len;			/* length of block, in bytes */
113*19883Skarels 	u_short	bb_addr[2];		/* address of block */
114*19883Skarels 	/*
115*19883Skarels 	 * Array above is really a single u_long field.
116*19883Skarels 	 * We kludge its definition to defeat word-alignment.
117*19883Skarels 	 * Access would look like:
118*19883Skarels 	 *     longaddr = *(u_long *)bp->.mb_er.er_blks[0].bb_addr;
119*19883Skarels 	 */
120*19883Skarels };
121*19883Skarels 
122*19883Skarels struct	net_mode {		/* read/write mode control objects */
123*19883Skarels /*12*/	u_char	nm_rqst;	/* request code */
124*19883Skarels /*13*/	u_char	nm_rply;	/* reply code */
125*19883Skarels /*14*/	u_char	nm_mask;		/* bit-wise switches for read, write */
126*19883Skarels /*15*/	u_char	nm_optn;		/* acceptable packet reception errors */
127*19883Skarels /*16*/	u_char	nm_mode;		/* EXOS filtering mode */
128*19883Skarels /*17*/
129*19883Skarels };
130*19883Skarels 
131*19883Skarels struct	net_addrs {		/* read/write receive address slots */
132*19883Skarels /*12*/	u_char	na_rqst;	/* request code */
133*19883Skarels /*13*/	u_char	na_rply;	/* reply code */
134*19883Skarels /*14*/	u_char	na_mask;		/* bit-wise switches for read, write */
135*19883Skarels /*15*/	u_char	na_slot;		/* index of address slot */
136*19883Skarels /*16*/	u_char	na_addrs[6];		/* address read and/or written */
137*19883Skarels /*22*/
138*19883Skarels };
139*19883Skarels 
140*19883Skarels struct	net_recv {		/* read/alter receive slot enable bit */
141*19883Skarels /*12*/	u_char	nr_rqst;	/* request code */
142*19883Skarels /*13*/	u_char	nr_rply;	/* reply code */
143*19883Skarels /*14*/	u_char	nr_mask;		/* bit-wise switches for read, write */
144*19883Skarels /*15*/	u_char	nr_slot;		/* index of address slot */
145*19883Skarels /*16*/
146*19883Skarels };
147*19883Skarels 
148*19883Skarels struct	net_ststcs {		/* read/reset network statistics objects */
149*19883Skarels /*12*/	u_char	ns_rqst;	/* request code */
150*19883Skarels /*13*/	u_char	ns_rply;	/* reply code */
151*19883Skarels /*14*/	u_char	ns_mask;		/* bit-wise switches for read, write */
152*19883Skarels /*15*/	u_char	ns_rsrv;		/* reserved for EXOS */
153*19883Skarels /*16*/	u_short	ns_nobj;		/* number of objects to work on */
154*19883Skarels /*18*/	u_short	ns_xobj;		/* index of first object to work on */
155*19883Skarels /*20*/	u_long	ns_bufp;		/* pointer to statistics buffer */
156*19883Skarels /*24*/
157*19883Skarels };
158*19883Skarels 
159*19883Skarels struct	enet_xmit {		/* send a packet on the Ethernet */
160*19883Skarels /*12*/	u_char	et_rqst;	/* request code */
161*19883Skarels /*13*/	u_char	et_rply;	/* reply code */
162*19883Skarels /*14*/	u_char	et_slot;		/* address slot matching dest address */
163*19883Skarels /*15*/	u_char	et_nblock;		/* number of blocks composing packet */
164*19883Skarels /*16*/	struct	buf_blk et_blks[NFRAGMENTS];	/* array of block descriptors */
165*19883Skarels /*22-64*/
166*19883Skarels };
167*19883Skarels 
168*19883Skarels struct	enet_recv {		/* receive a packet on the Ethernet */
169*19883Skarels /*12*/	u_char	er_rqst;	/* request code */
170*19883Skarels /*13*/	u_char	er_rply;	/* reply code */
171*19883Skarels /*14*/	u_char	er_slot;		/* address slot matching dest address */
172*19883Skarels /*15*/	u_char	er_nblock;		/* number of blocks composing buffer */
173*19883Skarels /*16*/	struct	buf_blk er_blks[NFRAGMENTS];	/* array of block descriptors */
174*19883Skarels /*22-64*/
175*19883Skarels };
176*19883Skarels 
177*19883Skarels /* we send requests and receive replys with the EXOS using this structure */
178*19883Skarels struct	ex_msg {
179*19883Skarels /*00*/	u_short	mb_link;	/* address of next message buffer */
180*19883Skarels /*02*/	u_char	mb_rsrv;	/* reserved for use by EXOS */
181*19883Skarels /*03*/	u_char	mb_status;	/* used bit-wise for message protocol */
182*19883Skarels /*04*/	u_short	mb_length;	/* length, in bytes, of the rest */
183*19883Skarels /*06*/	short	mb_1rsrv;	/* reserved for used by EXOS */
184*19883Skarels /*08*/	long	mb_mid;		/* available to user */
185*19883Skarels /*12*/	union	mb_all {
186*19883Skarels 		struct	net_mode	mb_net_mode;
187*19883Skarels 		struct	net_addrs	mb_net_addrs;
188*19883Skarels 		struct	net_recv	mb_net_recv;
189*19883Skarels 		struct	net_ststcs	mb_net_ststcs;
190*19883Skarels 		struct	enet_xmit	mb_enet_xmit;
191*19883Skarels 		struct	enet_recv	mb_enet_recv;
192*19883Skarels 	} mb_all;
193*19883Skarels /* following field is used only by host, not read by board */
194*19883Skarels 	struct	ex_msg *mb_next;	/* host's pointer to next message */
195*19883Skarels };
196*19883Skarels #define	mb_nm	mb_all.mb_net_mode
197*19883Skarels #define	mb_na	mb_all.mb_net_addrs
198*19883Skarels #define	mb_nr	mb_all.mb_net_recv
199*19883Skarels #define	mb_ns	mb_all.mb_net_ststcs
200*19883Skarels #define	mb_et	mb_all.mb_enet_xmit
201*19883Skarels #define	mb_er	mb_all.mb_enet_recv
202*19883Skarels #define	mb_rqst	mb_nm.nm_rqst
203*19883Skarels #define	mb_rply	mb_nm.nm_rply
204*19883Skarels #define	MBDATALEN (sizeof(union mb_all)+6)
205*19883Skarels 
206*19883Skarels struct	confmsg {
207*19883Skarels /*00*/	u_short	cm_1rsrv;	/* reserved, must be 1 */
208*19883Skarels /*02*/	char	cm_vc[4];	/* returns ASCII version code */
209*19883Skarels /*06*/	u_char	cm_cc;		/* returns config completion code */
210*19883Skarels /*07*/	u_char	cm_opmode;	/* specifies operation mode */
211*19883Skarels /*08*/	u_short	cm_dfo;		/* specifies host data format option */
212*19883Skarels /*10*/	u_char	cm_dcn1;	/* reserved, must be 1 */
213*19883Skarels /*11*/	u_char	cm_2rsrv[2];	/* reserved, must be 0 */
214*19883Skarels /*13*/	u_char	cm_ham;		/* specifies host address mode */
215*19883Skarels /*14*/	u_char	cm_3rsrv;	/* reserved, must be 0 */
216*19883Skarels /*15*/	u_char	cm_mapsiz;	/* reserved, must be 0 */
217*19883Skarels /*16*/	u_char	cm_byteptrn[4];	/* host data format option test pattern */
218*19883Skarels /*20*/	u_short	cm_wordptrn[2];
219*19883Skarels /*24*/	u_long	cm_lwordptrn;
220*19883Skarels /*28*/	u_char	cm_rsrvd[20];
221*19883Skarels /*48*/	u_long	cm_mba;		/* use 0xFFFFFFFF in link level mode */
222*19883Skarels /*52*/	u_char	cm_nproc;	/* use 0xFF in link level mode */
223*19883Skarels /*53*/	u_char	cm_nmbox;	/* use 0xFF in link level mode */
224*19883Skarels /*54*/	u_char	cm_nmcast;	/* use 0xFF in link level mode */
225*19883Skarels /*55*/	u_char	cm_nhost;	/* use 1 in link level mode */
226*19883Skarels 
227*19883Skarels 	/* the next five parameters define the request message queue */
228*19883Skarels /*56*/	u_long	cm_h2xba;	/* base address of message queue */
229*19883Skarels /*60*/	u_short	cm_h2xhdr;	/* address offset of msg Q header */
230*19883Skarels /*62*/	u_char	cm_h2xtyp;	/* interrupt type */
231*19883Skarels /*63*/	u_char	cm_h2xval;	/* interrupt value (not used) */
232*19883Skarels /*64*/	u_short	cm_h2xaddr;	/* interrupt vector */
233*19883Skarels /*66*/	u_short	cm_h2xpad;	/* pad out unused portion of vector */
234*19883Skarels 
235*19883Skarels 	/* the next five parameters define the reply message queue */
236*19883Skarels /*68*/	u_long	cm_x2hba;	/* base address of message queue */
237*19883Skarels /*72*/	u_short	cm_x2hhdr;	/* address offset of msg Q header */
238*19883Skarels /*74*/	u_char	cm_x2htyp;	/* interrupt type */
239*19883Skarels /*75*/	u_char	cm_x2hval;	/* interrupt value (not used) */
240*19883Skarels /*76*/	u_short	cm_x2haddr;	/* interrupt vector */
241*19883Skarels /*78*/	u_short	cm_x2hpad;	/* pad out unused portion of vector */
242*19883Skarels /*80*/
243*19883Skarels };
244*19883Skarels 
245