4.4BSD/usr/src/sys/i386/isa/if_ecreg.h

/*
 * Copyright (c) 1991, 1993
 *	The Regents of the University of California.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *	This product includes software developed by the University of
 *	California, Berkeley and its contributors.
 * 4. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 *	@(#)if_ecreg.h	8.1 (Berkeley) 6/11/93
 */
/*
 * Device definitions for the i82586 generally and the 3com ec507
 * ISA bus ethernet controller.
 */
/*
 * Intermediate System Control Block pointer
 */
struct	ec_iscp {
	u_short	busy;
	u_short	scb_off;
	caddr_t	scb_base;
};
/*
 * System Control Block
 */
struct	ec_scb {
	u_short status;
#define CX		0x8000
#define FR		0x4000
#define CNA		0x2000
#define RNR		0x1000
#define CU_STATE	0x700
#define	CUS_IDLE	0x000
#define	CUS_SUSPENDED	0x100
#define	CUS_ACTIVE	0x200
#define RU_STATE	0x70
#define	RUS_IDLE	0x00
#define	RUS_SUSPENDED	0x10
#define	RUS_OVERRUN	0x20
#define	RUS_READY	0x40
	u_short command;
#define	CU_NOP		0
#define CU_START	0x100
#define RU_NOP		0
#define	RU_START	0x100
#define	RU_ABORT	0x400
#define	ACK_CX		0x8000
#define	ACK_RX		0x4000
#define ACK_CNA		0x2000
#define ACK_RNR		0x1000
	u_short	cbl_off;
	u_short	rfa_off;
	struct	errors {
		u_short crc;
		u_short alignment;
		u_short resource;
		u_short overrun;
	} scb_errs;
};

/*
 * Individual Address Setup
 */
struct ec_iasetup {
	u_short	com0;
#define	COM0_A	0x1000
#define	COM0_OK	0x2000
#define	COM0_B	0x4000
#define	COM0_C	0x8000
	u_short	com1;
#define	COM1_IASETUP	0x1
#define	COM1_I	0x2000
#define	COM1_S	0x4000
#define	COM1_EL	0x8000
	u_short	next_off;
	u_char	srcaddr[6];
};
	
/*
 * Load Multicast Addresses
 */

struct ec_mcsetup {
	u_short	com0;
	u_short	com1;
#define COM1_MCSETUP	0x3
	u_short	next_off;
	u_short	count;		/* number of bytes, 14 bits only */
	/* char	mcaddrs[6];	/* white lie, data goes here */
};

/*
 * Transmit Command
 */
struct	ec_transmit {
	u_short com0;
#define COLLISIONS(p) (p->com0 & 0xf)
#define EXCOL		0x10	/* Excessive Collisions, Aborted */
#define HEARTBEAT	0x20	/* CDT signal monitored and OK (good) */
#define TXDEFFERED	0x40	/* ``due to Previous Link Activity'' */
#define	DMALATE		0x80	/* DMA underrun */
#define	NOCTS		0x100	/* Transmission stopped due to ... */
#define	NOCARSENSE	0x200	/* Loss of Carrier sense during TX */
#define	LATECOLL	0x400	/* Late Collision detected */
#define TXERRS		0x7d0	/* Various Bad Things */
	u_short	com1;
#define COM1_TRANSMIT	0x4
	u_short	next_off;
	u_short tbd_off;
	u_char	dstaddr[6];
	u_short	proto;		/* Length for 802.3 */
/*
 * };	 struct	ec_tba {
 *
 * Transmit Buffer Descriptor
 * This really should be a separate structure,
 * but it will be convenient to lump them together.
 */
	u_short	count;
	u_short next_tbd_off;
	caddr_t	buffer;
};

/*
 * Receive Frame Descriptor
 */
struct	ec_rfd {
	u_short	rfd0;
	u_short rfd1;
	u_short	next_off;
	u_short rbd_off;
	struct	ether_header eh;
	u_short	mbz;
/*
 * };	struct	ec_rbd {
 *
 * Receive Buffer Descriptor
 */
	u_short	count;
#define RBD_EOF	0x8000
#define RBD_F	0x4000
	u_short	next_rbd_off;
	caddr_t	buffer;
	u_short	size;
	u_short	mbz2;
};

/*
 * Set Operating Parameters
 */
struct	ec_82586params {
	u_char	count;
	u_char	fifolimit;
	u_char	save_bad_frames;
	u_char	data1;		/* addr len, no src ins, lpbk, prmble */
	u_char	priority;
	u_char	ifspacing;
	u_char	mbz1;
	u_char	data2;		/* max restries, slot time high */
	u_char	promisc;	/* brddis, mnch/nrz, tnocr, crc16, bstf, pad */
#define M_PROMISC 1
#define M_TNOCR 8
	u_char	cdf_cds;	/* carrier detect/sense filter(length) & src */
	u_char	min_frame_len;
	u_char	mbz2[3];
};

struct	ec_configure {
	u_short	com0;
	u_short com1;
#define COM1_CONFIGURE	0x2
	u_short next_off;
	struct ec_82586params modes;
};
#define ECMTU	1518
#define ECMINSIZE 64
#define NTXBUF	2
#define	NRXBUF	8

struct	ec_mem {
	struct	ec_iscp iscp;
	struct	ec_scb scb;
	struct	ec_transmit tcom[NTXBUF];
	struct	ec_rfd rcom[NRXBUF];
	struct	ec_configure config;
	struct	ec_iasetup iasetup;
	struct	ec_mcsetup mcsetup;
	char	txbuf[NTXBUF][ECMTU];
	char	rxbuf[NRXBUF][ECMTU];
};

struct ec_ports {
	u_char	data[6];
	u_char	creg;
#define R_ECID	0x00
#define R_ETHER	0x01
#define R_REV	0x02
#define R_IEN	0x04
#define R_INT	0x08
#define R_LAD	0x10
#define R_LPB	0x20
#define R_CA	0x40
#define R_NORST	0x80
	u_char	mbz0[3];
	u_char	port_ic;
	u_char	port_ca;
	u_char	mbz1;
	u_char	rom_conf;
	u_char	ram_conf;
	u_char	int_conf;
};