11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef _3c523_INCLUDE_
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _3c523_INCLUDE_
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	This is basically a hacked version of ni52.h, for the 3c523
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	Etherlink/MC.
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds*/
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Intel i82586 Ethernet definitions
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This is an extension to the Linux operating system, and is covered by the
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * same GNU General Public License that covers that work.
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright 1995 by Chris Beauregard (cpbeaure@undergrad.math.uwaterloo.ca)
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * See 3c523.c for details.
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * $Header: /home/chrisb/linux-1.2.13-3c523/drivers/net/RCS/3c523.h,v 1.6 1996/01/20 05:09:00 chrisb Exp chrisb $
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * where to find the System Configuration Pointer (SCP)
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SCP_DEFAULT_ADDRESS 0xfffff4
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * System Configuration Pointer Struct
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct scp_struct
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short zero_dum0;	/* has to be zero */
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char  sysbus;	/* 0=16Bit,1=8Bit */
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char  zero_dum1;	/* has to be zero for 586 */
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short zero_dum2;
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short zero_dum3;
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  char          *iscp;		/* pointer to the iscp-block */
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Intermediate System Configuration Pointer (ISCP)
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct iscp_struct
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char  busy;          /* 586 clears after successful init */
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char  zero_dummy;    /* hast to be zero */
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short scb_offset;    /* pointeroffset to the scb_base */
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  char          *scb_base;      /* base-address of all 16-bit offsets */
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * System Control Block (SCB)
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct scb_struct
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short status;        /* status word */
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short cmd;           /* command word */
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short cbl_offset;    /* pointeroffset, command block list */
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short rfa_offset;    /* pointeroffset, receive frame area */
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short crc_errs;      /* CRC-Error counter */
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short aln_errs;      /* alignmenterror counter */
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short rsc_errs;      /* Resourceerror counter */
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short ovrn_errs;     /* OVerrunerror counter */
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * possible command values for the command word
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RUC_MASK	0x0070	/* mask for RU commands */
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RUC_NOP		0x0000	/* NOP-command */
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RUC_START	0x0010	/* start RU */
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RUC_RESUME	0x0020	/* resume RU after suspend */
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RUC_SUSPEND	0x0030	/* suspend RU */
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RUC_ABORT	0x0040	/* abort receiver operation immediately */
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CUC_MASK	0x0700	/* mask for CU command */
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CUC_NOP		0x0000	/* NOP-command */
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CUC_START	0x0100	/* start execution of 1. cmd on the CBL */
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CUC_RESUME	0x0200	/* resume after suspend */
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CUC_SUSPEND	0x0300	/* Suspend CU */
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CUC_ABORT	0x0400	/* abort command operation immediately */
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ACK_MASK	0xf000	/* mask for ACK command */
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ACK_CX		0x8000	/* acknowledges STAT_CX */
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ACK_FR		0x4000	/* ack. STAT_FR */
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ACK_CNA		0x2000	/* ack. STAT_CNA */
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ACK_RNR		0x1000	/* ack. STAT_RNR */
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * possible status values for the status word
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STAT_MASK	0xf000	/* mask for cause of interrupt */
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STAT_CX		0x8000	/* CU finished cmd with its I bit set */
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STAT_FR		0x4000	/* RU finished receiving a frame */
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STAT_CNA	0x2000	/* CU left active state */
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STAT_RNR	0x1000	/* RU left ready state */
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CU_STATUS	0x700	/* CU status, 0=idle */
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CU_SUSPEND	0x100	/* CU is suspended */
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CU_ACTIVE	0x200	/* CU is active */
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RU_STATUS	0x70	/* RU status, 0=idle */
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RU_SUSPEND	0x10	/* RU suspended */
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RU_NOSPACE	0x20	/* RU no resources */
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RU_READY	0x40	/* RU is ready */
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Receive Frame Descriptor (RFD)
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct rfd_struct
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short status;	/* status word */
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short last;		/* Bit15,Last Frame on List / Bit14,suspend */
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short next;		/* linkoffset to next RFD */
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short rbd_offset;	/* pointeroffset to RBD-buffer */
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char  dest[6];	/* ethernet-address, destination */
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char  source[6];	/* ethernet-address, source */
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short length;	/* 802.3 frame-length */
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short zero_dummy;	/* dummy */
1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RFD_LAST     0x8000	/* last: last rfd in the list */
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RFD_SUSP     0x4000	/* last: suspend RU after  */
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RFD_ERRMASK  0x0fe1     /* status: errormask */
1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RFD_MATCHADD 0x0002     /* status: Destinationaddress !matches IA */
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RFD_RNR      0x0200	/* status: receiver out of resources */
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Receive Buffer Descriptor (RBD)
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1336aa20a2235535605db6d6d2bd850298b2fe7f31eJeff Garzikstruct rbd_struct
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short status;	/* status word,number of used bytes in buff */
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short next;		/* pointeroffset to next RBD */
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  char          *buffer;	/* receive buffer address pointer */
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short size;		/* size of this buffer */
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short zero_dummy;    /* dummy */
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RBD_LAST	0x8000	/* last buffer */
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RBD_USED	0x4000	/* this buffer has data */
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RBD_MASK	0x3fff	/* size-mask for length */
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Statusvalues for Commands/RFD
1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STAT_COMPL   0x8000	/* status: frame/command is complete */
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STAT_BUSY    0x4000	/* status: frame/command is busy */
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STAT_OK      0x2000	/* status: frame/command is ok */
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Action-Commands
1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMD_NOP		0x0000	/* NOP */
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMD_IASETUP	0x0001	/* initial address setup command */
1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMD_CONFIGURE	0x0002	/* configure command */
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMD_MCSETUP	0x0003	/* MC setup command */
1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMD_XMIT	0x0004	/* transmit command */
1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMD_TDR		0x0005	/* time domain reflectometer (TDR) command */
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMD_DUMP	0x0006	/* dump command */
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMD_DIAGNOSE	0x0007	/* diagnose command */
1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Action command bits
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMD_LAST	0x8000	/* indicates last command in the CBL */
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMD_SUSPEND	0x4000	/* suspend CU after this CB */
1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMD_INT		0x2000	/* generate interrupt after execution */
1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * NOP - command
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct nop_cmd_struct
1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short cmd_status;	/* status of this command */
1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short cmd_cmd;       /* the command itself (+bits) */
1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short cmd_link;      /* offsetpointer to next command */
1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * IA Setup command
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1856aa20a2235535605db6d6d2bd850298b2fe7f31eJeff Garzikstruct iasetup_cmd_struct
1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short cmd_status;
1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short cmd_cmd;
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short cmd_link;
1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char  iaddr[6];
1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1946aa20a2235535605db6d6d2bd850298b2fe7f31eJeff Garzik * Configure command
1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct configure_cmd_struct
1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short cmd_status;
1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short cmd_cmd;
2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short cmd_link;
2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char  byte_cnt;   /* size of the config-cmd */
2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char  fifo;       /* fifo/recv monitor */
2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char  sav_bf;     /* save bad frames (bit7=1)*/
2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char  adr_len;    /* adr_len(0-2),al_loc(3),pream(4-5),loopbak(6-7)*/
2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char  priority;   /* lin_prio(0-2),exp_prio(4-6),bof_metd(7) */
2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char  ifs;        /* inter frame spacing */
2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char  time_low;   /* slot time low */
2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char  time_high;  /* slot time high(0-2) and max. retries(4-7) */
2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char  promisc;    /* promisc-mode(0) , et al (1-7) */
2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char  carr_coll;  /* carrier(0-3)/collision(4-7) stuff */
2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char  fram_len;   /* minimal frame len */
2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char  dummy;	     /* dummy */
2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
2166aa20a2235535605db6d6d2bd850298b2fe7f31eJeff Garzik * Multicast Setup command
2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
2186aa20a2235535605db6d6d2bd850298b2fe7f31eJeff Garzikstruct mcsetup_cmd_struct
2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short cmd_status;
2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short cmd_cmd;
2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short cmd_link;
2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short mc_cnt;		/* number of bytes in the MC-List */
2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char  mc_list[0][6];  	/* pointer to 6 bytes entries */
2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
2286aa20a2235535605db6d6d2bd850298b2fe7f31eJeff Garzik * transmit command
2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
2306aa20a2235535605db6d6d2bd850298b2fe7f31eJeff Garzikstruct transmit_cmd_struct
2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short cmd_status;
2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short cmd_cmd;
2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short cmd_link;
2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short tbd_offset;	/* pointeroffset to TBD */
2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char  dest[6];       /* destination address of the frame */
2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short length;	/* user defined: 802.3 length / Ether type */
2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TCMD_ERRMASK     0x0fa0
2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TCMD_MAXCOLLMASK 0x000f
2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TCMD_MAXCOLL     0x0020
2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TCMD_HEARTBEAT   0x0040
2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TCMD_DEFERRED    0x0080
2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TCMD_UNDERRUN    0x0100
2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TCMD_LOSTCTS     0x0200
2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TCMD_NOCARRIER   0x0400
2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TCMD_LATECOLL    0x0800
2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct tdr_cmd_struct
2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short cmd_status;
2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short cmd_cmd;
2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short cmd_link;
2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short status;
2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TDR_LNK_OK	0x8000	/* No link problem identified */
2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TDR_XCVR_PRB	0x4000	/* indicates a transceiver problem */
2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TDR_ET_OPN	0x2000	/* open, no correct termination */
2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TDR_ET_SRT	0x1000	/* TDR detected a short circuit */
2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TDR_TIMEMASK	0x07ff	/* mask for the time field */
2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Transmit Buffer Descriptor (TBD)
2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct tbd_struct
2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short size;		/* size + EOF-Flag(15) */
2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short next;          /* pointeroffset to next TBD */
2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  char          *buffer;        /* pointer to buffer */
2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TBD_LAST 0x8000         /* EOF-Flag, indicates last buffer in list */
2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*************************************************************************/
2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsVerbatim from the Crynwyr stuff:
2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    The 3c523 responds with adapter code 0x6042 at slot
2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsregisters xxx0 and xxx1.  The setup register is at xxx2 and
2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldscontains the following bits:
2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds0: card enable
2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds2,1: csr address select
2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    00 = 0300
2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    01 = 1300
2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    10 = 2300
2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    11 = 3300
2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds4,3: shared memory address select
2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    00 = 0c0000
2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    01 = 0c8000
2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    10 = 0d0000
2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    11 = 0d8000
2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds5: set to disable on-board thinnet
2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds7,6: (read-only) shows selected irq
2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    00 = 12
2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    01 = 7
2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    10 = 3
3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    11 = 9
3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsThe interrupt-select register is at xxx3 and uses one bit per irq.
3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds0: int 12
3051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds1: int 7
3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds2: int 3
3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds3: int 9
3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    Again, the documentation stresses that the setup register
3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsshould never be written.  The interrupt-select register may be
3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldswritten with the value corresponding to bits 7.6 in
3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsthe setup register to insure corret setup.
3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds*/
3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Offsets from the base I/O address. */
3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define	ELMC_SA		0	/* first 6 bytes are IEEE network address */
3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ELMC_CTRL	6	/* control & status register */
3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ELMC_REVISION	7	/* revision register, first 4 bits only */
3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ELMC_IO_EXTENT  8
3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* these are the bit selects for the port register 2 */
3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ELMC_STATUS_ENABLED	0x01
3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ELMC_STATUS_CSR_SELECT	0x06
3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ELMC_STATUS_MEMORY_SELECT	0x18
3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ELMC_STATUS_DISABLE_THIN	0x20
3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ELMC_STATUS_IRQ_SELECT	0xc0
3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* this is the card id used in the detection code.  You might recognize
3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsit from @6042.adf */
3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ELMC_MCA_ID 0x6042
3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   The following define the bits for the control & status register
3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   The bank select registers can be used if more than 16K of memory is
3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   on the card.  For some stupid reason, bank 3 is the one for the
3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   bottom 16K, and the card defaults to bank 0.  So we have to set the
3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   bank to 3 before the card will even think of operating.  To get bank
3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   3, set BS0 and BS1 to high (of course...)
3401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds*/
3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ELMC_CTRL_BS0	0x01	/* RW bank select */
3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ELMC_CTRL_BS1	0x02	/* RW bank select */
3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ELMC_CTRL_INTE	0x04	/* RW interrupt enable, assert high */
3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ELMC_CTRL_INT	0x08	/* R interrupt active, assert high */
3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*#define ELMC_CTRL_*	0x10*/	/* reserved */
3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ELMC_CTRL_LBK	0x20	/* RW loopback enable, assert high */
3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ELMC_CTRL_CA	0x40	/* RW channel attention, assert high */
3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ELMC_CTRL_RST	0x80	/* RW 82586 reset, assert low */
3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* some handy compound bits */
3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* normal operation should have bank 3 and RST high, ints enabled */
3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ELMC_NORMAL (ELMC_CTRL_INTE|ELMC_CTRL_RST|0x3)
3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* _3c523_INCLUDE_ */
356