xref: /csrg-svn/sys/i386/isa/if_wereg.h (revision 41004)
1*41004Swilliam /*-
2*41004Swilliam  * Copyright (c) 1990 The Regents of the University of California.
3*41004Swilliam  * All rights reserved.
4*41004Swilliam  *
5*41004Swilliam  * This code is derived from software contributed to Berkeley by
6*41004Swilliam  * Tim L. Tucker
7*41004Swilliam  *
8*41004Swilliam  * %sccs.include.noredist.c%
9*41004Swilliam  *
10*41004Swilliam  *	@(#)if_wereg.h	5.1 (Berkeley) 04/22/90
11*41004Swilliam  */
12*41004Swilliam 
13*41004Swilliam /*
14*41004Swilliam  * Western Digital 8003 ethernet/starlan adapter
15*41004Swilliam  */
16*41004Swilliam 
17*41004Swilliam /*
18*41004Swilliam  * Memory Select Register (MSR)
19*41004Swilliam  */
20*41004Swilliam union wd_mem_sel {
21*41004Swilliam     struct memory_decode {
22*41004Swilliam         u_char msd_addr:6,		/* Memory decode bits		*/
23*41004Swilliam 	       msd_enable:1,		/* Memory (RAM) enable		*/
24*41004Swilliam 	       msd_reset:1;		/* Software reset 		*/
25*41004Swilliam     } msd_decode;
26*41004Swilliam #define ms_addr		msd_decode.msd_addr
27*41004Swilliam #define ms_enable	msd_decode.msd_enable
28*41004Swilliam #define ms_reset	msd_decode.msd_reset
29*41004Swilliam     u_char ms_byte;			/* entire byte			*/
30*41004Swilliam };
31*41004Swilliam 
32*41004Swilliam /*
33*41004Swilliam  * receive ring discriptor
34*41004Swilliam  *
35*41004Swilliam  * The National Semiconductor NS32490 Network interface controller uses
36*41004Swilliam  * the following receive ring headers.  The way this works is that the
37*41004Swilliam  * memory on the interface card is chopped up into 256 bytes blocks.
38*41004Swilliam  * A contiuguous portion of those blocks are marked for receive packets
39*41004Swilliam  * by setting start and end block #'s in the NIC.  For each packet that
40*41004Swilliam  * is put into the receive ring, one of these headers (4 bytes each) is
41*41004Swilliam  * tacked onto the front.
42*41004Swilliam  */
43*41004Swilliam struct wd_ring	{
44*41004Swilliam 	struct wdr_status {		/* received packet status	*/
45*41004Swilliam 	    u_char rs_prx:1,		    /* packet received intack	*/
46*41004Swilliam 		   rs_crc:1,		    /* crc error		*/
47*41004Swilliam 	           rs_fae:1,		    /* frame alignment error	*/
48*41004Swilliam 	           rs_fo:1,		    /* fifo overrun		*/
49*41004Swilliam 	           rs_mpa:1,		    /* packet received intack	*/
50*41004Swilliam 	           rs_phy:1,		    /* packet received intack	*/
51*41004Swilliam 	           rs_dis:1,		    /* packet received intack	*/
52*41004Swilliam 	           rs_dfr:1;		    /* packet received intack	*/
53*41004Swilliam 	} wd_rcv_status;		/* received packet status	*/
54*41004Swilliam 	u_char	wd_next_packet;		/* pointer to next packet	*/
55*41004Swilliam 	u_short	wd_count;		/* bytes in packet (length + 4)	*/
56*41004Swilliam };
57*41004Swilliam 
58*41004Swilliam /*
59*41004Swilliam  * Command word definition
60*41004Swilliam  */
61*41004Swilliam union wd_command {
62*41004Swilliam     struct command_decode {
63*41004Swilliam 	u_char csd_stp:1,		/* STOP!			*/
64*41004Swilliam 	       csd_sta:1,		/* START!			*/
65*41004Swilliam                csd_txp:1,		/* Transmit packet		*/
66*41004Swilliam                csd_rd:3,		/* Remote DMA command		*/
67*41004Swilliam                csd_ps:2;		/* Page select			*/
68*41004Swilliam     } csd_decode;
69*41004Swilliam #define cs_stp		csd_decode.csd_stp
70*41004Swilliam #define cs_sta		csd_decode.csd_sta
71*41004Swilliam #define cs_txp		csd_decode.csd_txp
72*41004Swilliam #define cs_rd		csd_decode.csd_rd
73*41004Swilliam #define cs_ps		csd_decode.csd_ps
74*41004Swilliam     u_char cs_byte;			/* entire command byte		*/
75*41004Swilliam };
76*41004Swilliam 
77*41004Swilliam /*
78*41004Swilliam  * Interrupt status definition
79*41004Swilliam  */
80*41004Swilliam union wd_interrupt {
81*41004Swilliam     struct interrupt_decode {
82*41004Swilliam 	u_char isd_prx:1,		/* Packet received		*/
83*41004Swilliam 	       isd_ptx:1,		/* Packet transmitted		*/
84*41004Swilliam                isd_rxe:1,		/* Receive error		*/
85*41004Swilliam                isd_txe:1,		/* Transmit error		*/
86*41004Swilliam                isd_ovw:1,		/* Overwrite warning		*/
87*41004Swilliam                isd_cnt:1,		/* Counter overflow		*/
88*41004Swilliam                isd_rdc:1,		/* Remote DMA complete		*/
89*41004Swilliam                isd_rst:1;		/* Reset status			*/
90*41004Swilliam     } isd_decode;
91*41004Swilliam #define is_prx		isd_decode.isd_prx
92*41004Swilliam #define is_ptx		isd_decode.isd_ptx
93*41004Swilliam #define is_rxe		isd_decode.isd_rxe
94*41004Swilliam #define is_txe		isd_decode.isd_txe
95*41004Swilliam #define is_ovw		isd_decode.isd_ovw
96*41004Swilliam #define is_cnt		isd_decode.isd_cnt
97*41004Swilliam #define is_rdc		isd_decode.isd_rdc
98*41004Swilliam #define is_rst		isd_decode.isd_rst
99*41004Swilliam     u_char is_byte;			/* entire interrupt byte	*/
100*41004Swilliam };
101*41004Swilliam 
102*41004Swilliam /*
103*41004Swilliam  * Status word definition (transmit)
104*41004Swilliam  */
105*41004Swilliam union wdt_status {
106*41004Swilliam     struct tstat {
107*41004Swilliam 	u_char tsd_ptx:1,		/* Packet transmitted intack	*/
108*41004Swilliam 	       tsd_dfr:1,		/* Non deferred transmition	*/
109*41004Swilliam                tsd_col:1,		/* Transmit Collided		*/
110*41004Swilliam                tsd_abt:1,		/* Transmit Aborted (coll > 16)	*/
111*41004Swilliam                tsd_crs:1,		/* Carrier Sense Lost		*/
112*41004Swilliam                tsd_fu:1,		/* Fifo Underrun		*/
113*41004Swilliam                tsd_chd:1,		/* CD Heartbeat			*/
114*41004Swilliam                tsd_owc:1;		/* Out of Window Collision	*/
115*41004Swilliam     } tsd_decode;
116*41004Swilliam #define ts_ptx		tsd_decode.tsd_ptx
117*41004Swilliam #define ts_dfr		tsd_decode.tsd_dfr
118*41004Swilliam #define ts_col		tsd_decode.tsd_col
119*41004Swilliam #define ts_abt		tsd_decode.tsd_abt
120*41004Swilliam #define ts_crs		tsd_decode.tsd_crs
121*41004Swilliam #define ts_fu		tsd_decode.tsd_fu
122*41004Swilliam #define ts_chd		tsd_decode.tsd_chd
123*41004Swilliam #define ts_owc		tsd_decode.tsd_owc
124*41004Swilliam     u_char ts_byte;			/* entire transmit byte		*/
125*41004Swilliam };
126*41004Swilliam 
127*41004Swilliam /*
128*41004Swilliam  * General constant definitions
129*41004Swilliam  */
130*41004Swilliam #define	WD_STARLAN	0x02		/* WD8003S Identification	*/
131*41004Swilliam #define	WD_ETHER	0x03		/* WD8003E Identification	*/
132*41004Swilliam #define WD_CHECKSUM	0xFF		/* Checksum byte		*/
133*41004Swilliam #define WD_PAGE_SIZE	256		/* Size of RAM pages in bytes	*/
134*41004Swilliam #define WD_TXBUF_SIZE	6		/* Size of TX buffer in pages	*/
135*41004Swilliam #define WD_ROM_OFFSET	8		/* i/o base offset to ROM	*/
136*41004Swilliam #define WD_IO_PORTS	32		/* # of i/o addresses used	*/
137*41004Swilliam #define WD_NIC_OFFSET	16		/* i/o base offset to NIC	*/
138*41004Swilliam 
139*41004Swilliam /*
140*41004Swilliam  * Page register offset values
141*41004Swilliam  */
142*41004Swilliam #define WD_P0_COMMAND	0x00		/* Command register 		*/
143*41004Swilliam #define WD_P0_PSTART	0x01		/* Page Start register		*/
144*41004Swilliam #define WD_P0_PSTOP	0x02		/* Page Stop register		*/
145*41004Swilliam #define WD_P0_BNRY	0x03		/* Boundary Pointer		*/
146*41004Swilliam #define WD_P0_TSR	0x04		/* Transmit Status (read-only)	*/
147*41004Swilliam #define WD_P0_TPSR	WD_P0_TSR	/* Transmit Page (write-only)	*/
148*41004Swilliam #define WD_P0_TBCR0	0x05		/* Transmit Byte count, low  WO	*/
149*41004Swilliam #define WD_P0_TBCR1	0x06		/* Transmit Byte count, high WO	*/
150*41004Swilliam #define WD_P0_ISR	0x07		/* Interrupt status register	*/
151*41004Swilliam #define WD_P0_RBCR0	0x0A		/* Remote byte count low     WO	*/
152*41004Swilliam #define WD_P0_RBCR1	0x0B		/* Remote byte count high    WO	*/
153*41004Swilliam #define WD_P0_RSR	0x0C		/* Receive status            RO	*/
154*41004Swilliam #define WD_P0_RCR	WD_P0_RSR	/* Receive configuration     WO */
155*41004Swilliam #define WD_P0_TCR	0x0D		/* Transmit configuration    WO */
156*41004Swilliam #define WD_P0_DCR	0x0E		/* Data configuration	     WO */
157*41004Swilliam #define WD_P0_IMR	0x0F		/* Interrupt masks	     WO	*/
158*41004Swilliam #define WD_P1_COMMAND	0x00		/* Command register 		*/
159*41004Swilliam #define WD_P1_PAR0	0x01		/* Physical address register 0	*/
160*41004Swilliam #define WD_P1_PAR1	0x02		/* Physical address register 1	*/
161*41004Swilliam #define WD_P1_PAR2	0x03		/* Physical address register 2	*/
162*41004Swilliam #define WD_P1_PAR3	0x04		/* Physical address register 3	*/
163*41004Swilliam #define WD_P1_PAR4	0x05		/* Physical address register 4	*/
164*41004Swilliam #define WD_P1_PAR5	0x06		/* Physical address register 5	*/
165*41004Swilliam #define WD_P1_CURR	0x07		/* Current page (receive unit)  */
166*41004Swilliam #define WD_P1_MAR0	0x08		/* Multicast address register 0	*/
167*41004Swilliam 
168*41004Swilliam /*
169*41004Swilliam  * Configuration constants (receive unit)
170*41004Swilliam  */
171*41004Swilliam #define WD_R_SEP	0x01		/* Save error packets		*/
172*41004Swilliam #define WD_R_AR		0x02		/* Accept Runt packets		*/
173*41004Swilliam #define WD_R_AB		0x04		/* Accept Broadcast packets	*/
174*41004Swilliam #define WD_R_AM		0x08		/* Accept Multicast packets	*/
175*41004Swilliam #define WD_R_PRO	0x10		/* Promiscuous physical		*/
176*41004Swilliam #define WD_R_MON	0x20		/* Monitor mode			*/
177*41004Swilliam #define WD_R_RES1	0x40		/* reserved...			*/
178*41004Swilliam #define WD_R_RES2	0x80		/* reserved...			*/
179*41004Swilliam #define	WD_R_CONFIG	(WD_R_AB)
180*41004Swilliam 
181*41004Swilliam /*
182*41004Swilliam  * Configuration constants (transmit unit)
183*41004Swilliam  */
184*41004Swilliam #define WD_T_CRC	0x01		/* Inhibit CRC			*/
185*41004Swilliam #define WD_T_LB0	0x02		/* Encoded Loopback Control	*/
186*41004Swilliam #define WD_T_LB1	0x04		/* Encoded Loopback Control	*/
187*41004Swilliam #define WD_T_ATD	0x08		/* Auto Transmit Disable	*/
188*41004Swilliam #define WD_T_OFST	0x10		/* Collision Offset Enable	*/
189*41004Swilliam #define WD_T_RES1	0x20		/* reserved...			*/
190*41004Swilliam #define WD_T_RES2	0x40		/* reserved...			*/
191*41004Swilliam #define WD_T_RES3	0x80		/* reserved...			*/
192*41004Swilliam #define	WD_T_CONFIG	(0)
193*41004Swilliam 
194*41004Swilliam /*
195*41004Swilliam  * Configuration constants (data unit)
196*41004Swilliam  */
197*41004Swilliam #define WD_D_WTS	0x01		/* Word Transfer Select		*/
198*41004Swilliam #define WD_D_BOS	0x02		/* Byte Order Select		*/
199*41004Swilliam #define WD_D_LAS	0x04		/* Long Address Select		*/
200*41004Swilliam #define WD_D_BMS	0x08		/* Burst Mode Select		*/
201*41004Swilliam #define WD_D_AR		0x10		/* Autoinitialize Remote	*/
202*41004Swilliam #define WD_D_FT0	0x20		/* Fifo Threshold Select	*/
203*41004Swilliam #define WD_D_FT1	0x40		/* Fifo Threshold Select	*/
204*41004Swilliam #define WD_D_RES	0x80		/* reserved...			*/
205*41004Swilliam #define	WD_D_CONFIG	(WD_D_FT1|WD_D_BMS)
206*41004Swilliam 
207*41004Swilliam /*
208*41004Swilliam  * Configuration constants (interrupt mask register)
209*41004Swilliam  */
210*41004Swilliam #define WD_I_PRXE	0x01		/* Packet received enable	*/
211*41004Swilliam #define WD_I_PTXE	0x02		/* Packet transmitted enable	*/
212*41004Swilliam #define WD_I_RXEE	0x04		/* Receive error enable		*/
213*41004Swilliam #define WD_I_TXEE	0x08		/* Transmit error enable	*/
214*41004Swilliam #define WD_I_OVWE	0x10		/* Overwrite warning enable	*/
215*41004Swilliam #define WD_I_CNTE	0x20		/* Counter overflow enable	*/
216*41004Swilliam #define WD_I_RDCE	0x40		/* Dma complete enable		*/
217*41004Swilliam #define WD_I_RES	0x80		/* reserved...			*/
218*41004Swilliam #define	WD_I_CONFIG	(WD_I_PRXE|WD_I_PTXE|WD_I_RXEE|WD_I_TXEE)
219