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