xref: /csrg-svn/sys/tahoe/if/if_enpreg.h (revision 49425)
1*49425Sbostic /*-
2*49425Sbostic  * Copyright (c) 1991 The Regents of the University of California.
3*49425Sbostic  * All rights reserved.
4*49425Sbostic  *
5*49425Sbostic  * This code is derived from software contributed to Berkeley by
6*49425Sbostic  * Computer Consoles Inc.
7*49425Sbostic  *
8*49425Sbostic  * %sccs.include.redist.c%
9*49425Sbostic  *
10*49425Sbostic  *	@(#)if_enpreg.h	7.2 (Berkeley) 05/08/91
1134508Skarels  */
1229649Ssam 
1329649Ssam /*	Copyright (c) 1984 by Communication Machinery Corporation
1429649Ssam  *
1529649Ssam  *	This file contains material which is proprietary to
1629649Ssam  *	Communication Machinery Corporation (CMC) and which
1729649Ssam  *	may not be divulged without the written permission
1829649Ssam  *	of CMC.
1929649Ssam  *
2029649Ssam  *	ENP-10 Ram Definition
2129649Ssam  *
2229649Ssam  *	3/15/85 Jon Phares
2329649Ssam  *	Update 7/10/85 S. Holmgren
2429649Ssam  *	ENP-10 update 7/21/85 J. Mullen
2529649Ssam  *	ENP-20 update 8/11/85 J. Mullen
2629649Ssam  *	Mods for CCI TAHOE system 8/14/85 J. Mullen
2729649Ssam  */
2829649Ssam 
2929649Ssam #define K		*1024
3029649Ssam 
3130230Ssam struct ether_addr {
3229649Ssam 	u_char ea_addr[6];
3329649Ssam };
3429649Ssam 
3530230Ssam typedef struct ethlist {
3629649Ssam 	int	e_listsize;		/* active addr entries */
3730230Ssam 	struct	ether_addr e_baseaddr;	/* addr lance is working with */
3830230Ssam 	struct	ether_addr e_addrs[16];	/* possible addresses */
3929649Ssam } ETHLIST;
4029649Ssam 
4130230Ssam typedef struct {
4230230Ssam 	u_long	e_xmit_successful;	/* Successful transmissions */
4330230Ssam 	u_long	e_mult_retry;		/* multiple retries on xmit */
4430230Ssam 	u_long	e_one_retry;		/* single retries */
4530230Ssam 	u_long	e_fail_retry;		/* too many retries */
4630230Ssam 	u_long	e_deferrals;		/* xmit delayed 'cuz cable busy */
4730230Ssam 	u_long	e_xmit_buff_err;	/* xmit data chaining failed --
4829649Ssam 						   "can't happen" */
4930230Ssam 	u_long	e_silo_underrun;	/* transmit data fetch failed */
5030230Ssam 	u_long	e_late_coll;		/* collision after xmit */
5130230Ssam 	u_long	e_lost_carrier;
5230230Ssam 	u_long	e_babble;		/* xmit length > 1518 */
5330230Ssam 	u_long	e_collision;
5430230Ssam 	u_long	e_xmit_mem_err;
5530230Ssam 	u_long	e_rcv_successful;	/* good receptions */
5630230Ssam 	u_long	e_rcv_missed;		/* no recv buff available */
5730230Ssam 	u_long	e_crc_err;		/* checksum failed */
5830230Ssam 	u_long	e_frame_err;		/* crc error & data length != 0 mod 8 */
5930230Ssam 	u_long	e_rcv_buff_err;		/* rcv data chain failure --
6029649Ssam 						   "can't happen" */
6130230Ssam 	u_long	e_silo_overrun;		/* receive data store failed */
6230230Ssam 	u_long	e_rcv_mem_err;
6329649Ssam } ENPSTAT;
6429649Ssam 
6530230Ssam typedef struct RING {
6629649Ssam 	short	r_rdidx;
6729649Ssam 	short	r_wrtidx;
6829649Ssam 	short	r_size;
6929649Ssam 	short	r_pad;
7029649Ssam 	int	r_slot[1];
7129649Ssam } RING;
7229649Ssam 
7330230Ssam typedef struct RING32 {
7429649Ssam 	short	r_rdidx;
7529649Ssam 	short	r_wrtidx;
7629649Ssam 	short	r_size;
7729649Ssam 	short	r_pad;			/* to make VAXen happy */
7830230Ssam 	int	r_slot[32];
7929649Ssam } RING32;
8029649Ssam 
8129649Ssam /*
8230230Ssam  * ENP Ram data layout
8329649Ssam  */
8429649Ssam 
8530230Ssam /*
8630230Ssam  * Note: paged window (4 K) is identity mapped by ENP kernel to provide
8730230Ssam  * 124 K contiguous RAM (as reflected in RAM_SIZE)
8830230Ssam  */
8930230Ssam #define RAM_WINDOW	(128 K)
9030230Ssam #define IOACCESS_WINDOW (512)
9130230Ssam #define FIXED_WINDOW	(RAM_WINDOW - IOACCESS_WINDOW)
9230230Ssam #define RAMROM_SWAP	(4 K)
9330230Ssam #define RAM_SIZE	(FIXED_WINDOW - RAMROM_SWAP)
9430230Ssam 
9530230Ssam #define HOST_RAMSIZE	(48 K)
9630230Ssam #define ENP_RAMSIZE	(20 K)
9730230Ssam 
9830230Ssam typedef	struct iow20 {
9930230Ssam 	char	pad0;
10030230Ssam 	char	hst2enp_interrupt;
10130230Ssam 	char	pad1[510];
10230230Ssam } iow20;
10330230Ssam 
10430230Ssam struct enpdevice {
10529649Ssam #ifdef notdef
10629649Ssam 	char	enp_ram_rom[4 K];
10729649Ssam #endif notdef
10829649Ssam 	union {
10929649Ssam 		char	all_ram[RAM_SIZE];
11029649Ssam 		struct {
11130230Ssam 			u_int	t_go;
11230230Ssam 			u_int	t_pstart;
11329649Ssam 		} t;
11429649Ssam 		struct {
11529649Ssam 			char	nram[RAM_SIZE - (HOST_RAMSIZE + ENP_RAMSIZE)];
11629649Ssam 			char	hram[HOST_RAMSIZE];
11729649Ssam 			char	kram[ENP_RAMSIZE];
11829649Ssam 		} u_ram;
11930230Ssam 		struct {
12030230Ssam 			char	pad7[0x100];	/* starts 0x1100 - 0x2000 */
12129649Ssam 			short	e_enpstate;	/* 1102 */
12229649Ssam 			short	e_enpmode;	/* 1104 */
12329649Ssam 			int	e_enpbase;	/* 1104 */
12429649Ssam 			int	e_enprun;	/* 1108 */
12530230Ssam 			u_short	e_intrvec;
12630230Ssam 			u_short	e_dummy[3];
12729649Ssam 			RING32	h_toenp;	/* 110C */
12829649Ssam 			RING32	h_hostfree;
12929649Ssam 			RING32	e_tohost;
13029649Ssam 			RING32 	e_enpfree;
13129649Ssam 			ENPSTAT	e_stat;
13229649Ssam 			ETHLIST	e_netaddr;
13329649Ssam 		} iface;
13429649Ssam 	} enp_u;
13529649Ssam 	iow20	enp_iow;
13630230Ssam };
13729649Ssam 
13829649Ssam #define	enp_ram		enp_u.all_ram
13929649Ssam #define	enp_nram	enp_u.u_ram.nram
14029649Ssam #define	enp_hram	enp_u.u_ram.hram
14129649Ssam #define	enp_kram	enp_u.u_ram.kram
14229649Ssam #define	enp_go		enp_u.t.t_go
14329649Ssam #define	enp_prog_start	enp_u.t.t_pstart
14429649Ssam #define	enp_intrvec	enp_u.iface.e_intrvec
14529649Ssam #define enp_state	enp_u.iface.e_enpstate
14629649Ssam #define enp_mode	enp_u.iface.e_enpmode
14729649Ssam #define enp_base	enp_u.iface.e_enpbase
14829649Ssam #define enp_enprun	enp_u.iface.e_enprun
14929649Ssam #define enp_toenp	enp_u.iface.h_toenp
15029649Ssam #define enp_hostfree	enp_u.iface.h_hostfree
15129649Ssam #define enp_tohost	enp_u.iface.e_tohost
15229649Ssam #define enp_enpfree	enp_u.iface.e_enpfree
15329649Ssam #define enp_freembuf	enp_u.iface.h_freembuf
15429649Ssam #define enp_stat	enp_u.iface.e_stat
15529649Ssam #define enp_addr	enp_u.iface.e_netaddr
15629649Ssam 
15730230Ssam #define ENPVAL		0xff	/* enp_iow.hst2enp_interrupt poke value */
15830230Ssam #define RESETVAL	0x00	/* enp_iow.enp2hst_clear_intr poke value */
15929649Ssam 
16030230Ssam #define INTR_ENP(addr)		(addr->enp_iow.hst2enp_interrupt = ENPVAL)
16129649Ssam 
16229649Ssam #if ENP == 30
16330230Ssam #define ACK_ENP_INTR(addr)	(addr->enp_iow.enp2hst_clear_intr = RESETVAL)
16429649Ssam #define IS_ENP_INTR(addr)	(addr->enp_iow.enp2hst_clear_intr&0x80)
16530295Ssam #endif
16629649Ssam 
16729649Ssam #ifdef notdef
16830230Ssam #define RESET_ENP(addr)		(addr->enp_iow.hst2enp_reset = 01)
16930230Ssam #else
17034508Skarels #ifdef lint
17134508Skarels #define RESET_ENP(addr)		((addr) = (addr))
17234508Skarels #else
17329649Ssam #define RESET_ENP(addr)
17434508Skarels #endif lint
17529649Ssam #endif notdef
17629649Ssam 
17734508Skarels #ifdef tahoe
17830230Ssam #define ENP_GO(addr,start) { \
17930230Ssam 	int v = start; \
18030295Ssam 	enpcopy((u_char *)&v, (u_char *)&addr->enp_prog_start, sizeof(v) ); \
18130230Ssam 	v = 0x80800000; \
18230295Ssam 	enpcopy((u_char *)&v, (u_char *)&addr->enp_go, sizeof(v) ); \
18330230Ssam }
18429649Ssam #else
18530230Ssam #define ENP_GO(addr,start,intvec ) { \
18630230Ssam 	addr->enp_prog_start = (u_int)(start); \
18730230Ssam 	addr->enp_intrvec = (u_short) intvec; \
18830230Ssam 	addr->enp_go = 0x80800000; \
18930230Ssam }
19034508Skarels #endif tahoe
19129649Ssam 
19229649Ssam /*
19330230Ssam  * State bits
19429649Ssam  */
19529649Ssam #define S_ENPRESET	01		/* enp is in reset state */
19629649Ssam #define S_ENPRUN	02		/* enp is in run state */
19729649Ssam 
19829649Ssam /*
19930230Ssam  * Mode bits
20029649Ssam  */
20130230Ssam #define E_SWAP16	0x1		/* swap two octets within 16 */
20230230Ssam #define E_SWAP32	0x2		/* swap 16s within 32 */
20330230Ssam #define E_SWAPRD	0x4		/* swap on read */
20430230Ssam #define E_SWAPWRT	0x8		/* swap on write */
20530230Ssam #define E_DMA		0x10		/* enp does data moving */
20629649Ssam 
20730230Ssam #define E_EXAM_LIST	0x80000000	/* enp should examine addrlist */
20830230Ssam #define E_ADDR_SUPP	0x40000000	/* enp should use supplied addr */
20929649Ssam 
21029649Ssam /*
21130230Ssam  * Download ioctl definitions
21229649Ssam  */
21333091Sbostic #define ENPIOGO		_IO('S',1)		/* start the enp */
21433091Sbostic #define ENPIORESET	_IO('S',2)		/* reset the enp */
21529649Ssam 
21629649Ssam /*
21730230Ssam  * The ENP Data Buffer Structure
21829649Ssam  */
21930230Ssam typedef struct BCB {
22030230Ssam 	struct	BCB *b_link;
22129649Ssam 	short	 b_stat;
22229649Ssam 	short	 b_len;
22330295Ssam 	u_char	*b_addr;
22429649Ssam 	short	 b_msglen;
22529649Ssam 	short	 b_reserved;
22630230Ssam } BCB;
227