xref: /csrg-svn/sys/i386/isa/if_wereg.h (revision 63364)
141004Swilliam /*-
2*63364Sbostic  * Copyright (c) 1991, 1993
3*63364Sbostic  *	The Regents of the University of California.  All rights reserved.
441004Swilliam  *
541004Swilliam  * This code is derived from software contributed to Berkeley by
649617Sbostic  * Tim L. Tucker.
741004Swilliam  *
849617Sbostic  * %sccs.include.redist.c%
941004Swilliam  *
10*63364Sbostic  *	@(#)if_wereg.h	8.1 (Berkeley) 06/11/93
1141004Swilliam  */
1241004Swilliam 
1341004Swilliam /*
1441004Swilliam  * Western Digital 8003 ethernet/starlan adapter
1541004Swilliam  */
1641004Swilliam 
1741004Swilliam /*
1841004Swilliam  * Memory Select Register (MSR)
1941004Swilliam  */
2045542Sbill union we_mem_sel {
2141004Swilliam     struct memory_decode {
2241004Swilliam         u_char msd_addr:6,		/* Memory decode bits		*/
2341004Swilliam 	       msd_enable:1,		/* Memory (RAM) enable		*/
2441004Swilliam 	       msd_reset:1;		/* Software reset 		*/
2541004Swilliam     } msd_decode;
2641004Swilliam #define ms_addr		msd_decode.msd_addr
2741004Swilliam #define ms_enable	msd_decode.msd_enable
2841004Swilliam #define ms_reset	msd_decode.msd_reset
2941004Swilliam     u_char ms_byte;			/* entire byte			*/
3041004Swilliam };
3141004Swilliam 
3241004Swilliam /*
3341004Swilliam  * receive ring discriptor
3441004Swilliam  *
3545542Sbill  * The National Semiconductor DS8390 Network interface controller uses
3641004Swilliam  * the following receive ring headers.  The way this works is that the
3741004Swilliam  * memory on the interface card is chopped up into 256 bytes blocks.
3845542Sbill  * A contiguous portion of those blocks are marked for receive packets
3941004Swilliam  * by setting start and end block #'s in the NIC.  For each packet that
4041004Swilliam  * is put into the receive ring, one of these headers (4 bytes each) is
4141004Swilliam  * tacked onto the front.
4241004Swilliam  */
4345542Sbill struct we_ring	{
4445542Sbill 	struct wer_status {		/* received packet status	*/
4541004Swilliam 	    u_char rs_prx:1,		    /* packet received intack	*/
4641004Swilliam 		   rs_crc:1,		    /* crc error		*/
4741004Swilliam 	           rs_fae:1,		    /* frame alignment error	*/
4841004Swilliam 	           rs_fo:1,		    /* fifo overrun		*/
4941004Swilliam 	           rs_mpa:1,		    /* packet received intack	*/
5041004Swilliam 	           rs_phy:1,		    /* packet received intack	*/
5141004Swilliam 	           rs_dis:1,		    /* packet received intack	*/
5241004Swilliam 	           rs_dfr:1;		    /* packet received intack	*/
5345542Sbill 	} we_rcv_status;		/* received packet status	*/
5445542Sbill 	u_char	we_next_packet;		/* pointer to next packet	*/
5545542Sbill 	u_short	we_count;		/* bytes in packet (length + 4)	*/
5641004Swilliam };
5741004Swilliam 
5841004Swilliam /*
5941004Swilliam  * Command word definition
6041004Swilliam  */
6145542Sbill union we_command {
6241004Swilliam     struct command_decode {
6341004Swilliam 	u_char csd_stp:1,		/* STOP!			*/
6441004Swilliam 	       csd_sta:1,		/* START!			*/
6541004Swilliam                csd_txp:1,		/* Transmit packet		*/
6641004Swilliam                csd_rd:3,		/* Remote DMA command		*/
6741004Swilliam                csd_ps:2;		/* Page select			*/
6841004Swilliam     } csd_decode;
6941004Swilliam #define cs_stp		csd_decode.csd_stp
7041004Swilliam #define cs_sta		csd_decode.csd_sta
7141004Swilliam #define cs_txp		csd_decode.csd_txp
7241004Swilliam #define cs_rd		csd_decode.csd_rd
7341004Swilliam #define cs_ps		csd_decode.csd_ps
7441004Swilliam     u_char cs_byte;			/* entire command byte		*/
7541004Swilliam };
7641004Swilliam 
7741004Swilliam /*
7841004Swilliam  * Interrupt status definition
7941004Swilliam  */
8045542Sbill union we_interrupt {
8141004Swilliam     struct interrupt_decode {
8241004Swilliam 	u_char isd_prx:1,		/* Packet received		*/
8341004Swilliam 	       isd_ptx:1,		/* Packet transmitted		*/
8441004Swilliam                isd_rxe:1,		/* Receive error		*/
8541004Swilliam                isd_txe:1,		/* Transmit error		*/
8641004Swilliam                isd_ovw:1,		/* Overwrite warning		*/
8741004Swilliam                isd_cnt:1,		/* Counter overflow		*/
8841004Swilliam                isd_rdc:1,		/* Remote DMA complete		*/
8941004Swilliam                isd_rst:1;		/* Reset status			*/
9041004Swilliam     } isd_decode;
9141004Swilliam #define is_prx		isd_decode.isd_prx
9241004Swilliam #define is_ptx		isd_decode.isd_ptx
9341004Swilliam #define is_rxe		isd_decode.isd_rxe
9441004Swilliam #define is_txe		isd_decode.isd_txe
9541004Swilliam #define is_ovw		isd_decode.isd_ovw
9641004Swilliam #define is_cnt		isd_decode.isd_cnt
9741004Swilliam #define is_rdc		isd_decode.isd_rdc
9841004Swilliam #define is_rst		isd_decode.isd_rst
9941004Swilliam     u_char is_byte;			/* entire interrupt byte	*/
10041004Swilliam };
10141004Swilliam 
10241004Swilliam /*
10341004Swilliam  * Status word definition (transmit)
10441004Swilliam  */
10545542Sbill union wet_status {
10641004Swilliam     struct tstat {
10741004Swilliam 	u_char tsd_ptx:1,		/* Packet transmitted intack	*/
10841004Swilliam 	       tsd_dfr:1,		/* Non deferred transmition	*/
10941004Swilliam                tsd_col:1,		/* Transmit Collided		*/
11041004Swilliam                tsd_abt:1,		/* Transmit Aborted (coll > 16)	*/
11141004Swilliam                tsd_crs:1,		/* Carrier Sense Lost		*/
11241004Swilliam                tsd_fu:1,		/* Fifo Underrun		*/
11341004Swilliam                tsd_chd:1,		/* CD Heartbeat			*/
11441004Swilliam                tsd_owc:1;		/* Out of Window Collision	*/
11541004Swilliam     } tsd_decode;
11641004Swilliam #define ts_ptx		tsd_decode.tsd_ptx
11741004Swilliam #define ts_dfr		tsd_decode.tsd_dfr
11841004Swilliam #define ts_col		tsd_decode.tsd_col
11941004Swilliam #define ts_abt		tsd_decode.tsd_abt
12041004Swilliam #define ts_crs		tsd_decode.tsd_crs
12141004Swilliam #define ts_fu		tsd_decode.tsd_fu
12241004Swilliam #define ts_chd		tsd_decode.tsd_chd
12341004Swilliam #define ts_owc		tsd_decode.tsd_owc
12441004Swilliam     u_char ts_byte;			/* entire transmit byte		*/
12541004Swilliam };
12641004Swilliam 
12741004Swilliam /*
12841004Swilliam  * General constant definitions
12941004Swilliam  */
13041004Swilliam #define	WD_STARLAN	0x02		/* WD8003S Identification	*/
13141004Swilliam #define	WD_ETHER	0x03		/* WD8003E Identification	*/
13245542Sbill #define	WD_ETHER2	0x05		/* WD8003EBT Identification	*/
13341004Swilliam #define WD_CHECKSUM	0xFF		/* Checksum byte		*/
13441004Swilliam #define WD_PAGE_SIZE	256		/* Size of RAM pages in bytes	*/
13541004Swilliam #define WD_TXBUF_SIZE	6		/* Size of TX buffer in pages	*/
13641004Swilliam #define WD_ROM_OFFSET	8		/* i/o base offset to ROM	*/
13741004Swilliam #define WD_IO_PORTS	32		/* # of i/o addresses used	*/
13841004Swilliam #define WD_NIC_OFFSET	16		/* i/o base offset to NIC	*/
13941004Swilliam 
14041004Swilliam /*
14141004Swilliam  * Page register offset values
14241004Swilliam  */
14341004Swilliam #define WD_P0_COMMAND	0x00		/* Command register 		*/
14441004Swilliam #define WD_P0_PSTART	0x01		/* Page Start register		*/
14541004Swilliam #define WD_P0_PSTOP	0x02		/* Page Stop register		*/
14641004Swilliam #define WD_P0_BNRY	0x03		/* Boundary Pointer		*/
14741004Swilliam #define WD_P0_TSR	0x04		/* Transmit Status (read-only)	*/
14841004Swilliam #define WD_P0_TPSR	WD_P0_TSR	/* Transmit Page (write-only)	*/
14941004Swilliam #define WD_P0_TBCR0	0x05		/* Transmit Byte count, low  WO	*/
15041004Swilliam #define WD_P0_TBCR1	0x06		/* Transmit Byte count, high WO	*/
15141004Swilliam #define WD_P0_ISR	0x07		/* Interrupt status register	*/
15241004Swilliam #define WD_P0_RBCR0	0x0A		/* Remote byte count low     WO	*/
15341004Swilliam #define WD_P0_RBCR1	0x0B		/* Remote byte count high    WO	*/
15441004Swilliam #define WD_P0_RSR	0x0C		/* Receive status            RO	*/
15541004Swilliam #define WD_P0_RCR	WD_P0_RSR	/* Receive configuration     WO */
15641004Swilliam #define WD_P0_TCR	0x0D		/* Transmit configuration    WO */
15741004Swilliam #define WD_P0_DCR	0x0E		/* Data configuration	     WO */
15841004Swilliam #define WD_P0_IMR	0x0F		/* Interrupt masks	     WO	*/
15941004Swilliam #define WD_P1_COMMAND	0x00		/* Command register 		*/
16041004Swilliam #define WD_P1_PAR0	0x01		/* Physical address register 0	*/
16141004Swilliam #define WD_P1_PAR1	0x02		/* Physical address register 1	*/
16241004Swilliam #define WD_P1_PAR2	0x03		/* Physical address register 2	*/
16341004Swilliam #define WD_P1_PAR3	0x04		/* Physical address register 3	*/
16441004Swilliam #define WD_P1_PAR4	0x05		/* Physical address register 4	*/
16541004Swilliam #define WD_P1_PAR5	0x06		/* Physical address register 5	*/
16641004Swilliam #define WD_P1_CURR	0x07		/* Current page (receive unit)  */
16741004Swilliam #define WD_P1_MAR0	0x08		/* Multicast address register 0	*/
16841004Swilliam 
16941004Swilliam /*
17041004Swilliam  * Configuration constants (receive unit)
17141004Swilliam  */
17241004Swilliam #define WD_R_SEP	0x01		/* Save error packets		*/
17341004Swilliam #define WD_R_AR		0x02		/* Accept Runt packets		*/
17441004Swilliam #define WD_R_AB		0x04		/* Accept Broadcast packets	*/
17541004Swilliam #define WD_R_AM		0x08		/* Accept Multicast packets	*/
17641004Swilliam #define WD_R_PRO	0x10		/* Promiscuous physical		*/
17741004Swilliam #define WD_R_MON	0x20		/* Monitor mode			*/
17841004Swilliam #define WD_R_RES1	0x40		/* reserved...			*/
17941004Swilliam #define WD_R_RES2	0x80		/* reserved...			*/
18041004Swilliam #define	WD_R_CONFIG	(WD_R_AB)
18141004Swilliam 
18241004Swilliam /*
18341004Swilliam  * Configuration constants (transmit unit)
18441004Swilliam  */
18541004Swilliam #define WD_T_CRC	0x01		/* Inhibit CRC			*/
18641004Swilliam #define WD_T_LB0	0x02		/* Encoded Loopback Control	*/
18741004Swilliam #define WD_T_LB1	0x04		/* Encoded Loopback Control	*/
18841004Swilliam #define WD_T_ATD	0x08		/* Auto Transmit Disable	*/
18941004Swilliam #define WD_T_OFST	0x10		/* Collision Offset Enable	*/
19041004Swilliam #define WD_T_RES1	0x20		/* reserved...			*/
19141004Swilliam #define WD_T_RES2	0x40		/* reserved...			*/
19241004Swilliam #define WD_T_RES3	0x80		/* reserved...			*/
19341004Swilliam #define	WD_T_CONFIG	(0)
19441004Swilliam 
19541004Swilliam /*
19641004Swilliam  * Configuration constants (data unit)
19741004Swilliam  */
19841004Swilliam #define WD_D_WTS	0x01		/* Word Transfer Select		*/
19941004Swilliam #define WD_D_BOS	0x02		/* Byte Order Select		*/
20041004Swilliam #define WD_D_LAS	0x04		/* Long Address Select		*/
20141004Swilliam #define WD_D_BMS	0x08		/* Burst Mode Select		*/
20241004Swilliam #define WD_D_AR		0x10		/* Autoinitialize Remote	*/
20341004Swilliam #define WD_D_FT0	0x20		/* Fifo Threshold Select	*/
20441004Swilliam #define WD_D_FT1	0x40		/* Fifo Threshold Select	*/
20541004Swilliam #define WD_D_RES	0x80		/* reserved...			*/
20641004Swilliam #define	WD_D_CONFIG	(WD_D_FT1|WD_D_BMS)
20741004Swilliam 
20841004Swilliam /*
20941004Swilliam  * Configuration constants (interrupt mask register)
21041004Swilliam  */
21141004Swilliam #define WD_I_PRXE	0x01		/* Packet received enable	*/
21241004Swilliam #define WD_I_PTXE	0x02		/* Packet transmitted enable	*/
21341004Swilliam #define WD_I_RXEE	0x04		/* Receive error enable		*/
21441004Swilliam #define WD_I_TXEE	0x08		/* Transmit error enable	*/
21541004Swilliam #define WD_I_OVWE	0x10		/* Overwrite warning enable	*/
21641004Swilliam #define WD_I_CNTE	0x20		/* Counter overflow enable	*/
21741004Swilliam #define WD_I_RDCE	0x40		/* Dma complete enable		*/
21841004Swilliam #define WD_I_RES	0x80		/* reserved...			*/
21945542Sbill #define WD_I_CONFIG     (WD_I_PRXE|WD_I_PTXE|WD_I_RXEE|WD_I_TXEE)
220