|  | /* | 
|  | *  linux/drivers/acorn/net/ether1.h | 
|  | * | 
|  | *  Copyright (C) 1996 Russell King | 
|  | * | 
|  | * This program is free software; you can redistribute it and/or modify | 
|  | * it under the terms of the GNU General Public License version 2 as | 
|  | * published by the Free Software Foundation. | 
|  | * | 
|  | *  Network driver for Acorn Ether1 cards. | 
|  | */ | 
|  |  | 
|  | #ifndef _LINUX_ether1_H | 
|  | #define _LINUX_ether1_H | 
|  |  | 
|  | #ifdef __ETHER1_C | 
|  | /* use 0 for production, 1 for verification, >2 for debug */ | 
|  | #ifndef NET_DEBUG | 
|  | #define NET_DEBUG 0 | 
|  | #endif | 
|  |  | 
|  | #define priv(dev)	((struct ether1_priv *)netdev_priv(dev)) | 
|  |  | 
|  | /* Page register */ | 
|  | #define REG_PAGE	(priv(dev)->base + 0x0000) | 
|  |  | 
|  | /* Control register */ | 
|  | #define REG_CONTROL	(priv(dev)->base + 0x0004) | 
|  | #define CTRL_RST	0x01 | 
|  | #define CTRL_LOOPBACK	0x02 | 
|  | #define CTRL_CA		0x04 | 
|  | #define CTRL_ACK	0x08 | 
|  |  | 
|  | #define ETHER1_RAM	(priv(dev)->base + 0x2000) | 
|  |  | 
|  | /* HW address */ | 
|  | #define IDPROM_ADDRESS	(priv(dev)->base + 0x0024) | 
|  |  | 
|  | struct ether1_priv { | 
|  | void __iomem *base; | 
|  | unsigned int tx_link; | 
|  | unsigned int tx_head; | 
|  | volatile unsigned int tx_tail; | 
|  | volatile unsigned int rx_head; | 
|  | volatile unsigned int rx_tail; | 
|  | unsigned char bus_type; | 
|  | unsigned char resetting; | 
|  | unsigned char initialising : 1; | 
|  | unsigned char restart      : 1; | 
|  | }; | 
|  |  | 
|  | #define I82586_NULL (-1) | 
|  |  | 
|  | typedef struct { /* tdr */ | 
|  | unsigned short tdr_status; | 
|  | unsigned short tdr_command; | 
|  | unsigned short tdr_link; | 
|  | unsigned short tdr_result; | 
|  | #define TDR_TIME	(0x7ff) | 
|  | #define TDR_SHORT	(1 << 12) | 
|  | #define TDR_OPEN	(1 << 13) | 
|  | #define TDR_XCVRPROB	(1 << 14) | 
|  | #define TDR_LNKOK	(1 << 15) | 
|  | } tdr_t; | 
|  |  | 
|  | typedef struct { /* transmit */ | 
|  | unsigned short tx_status; | 
|  | unsigned short tx_command; | 
|  | unsigned short tx_link; | 
|  | unsigned short tx_tbdoffset; | 
|  | } tx_t; | 
|  |  | 
|  | typedef struct { /* tbd */ | 
|  | unsigned short tbd_opts; | 
|  | #define TBD_CNT		(0x3fff) | 
|  | #define TBD_EOL		(1 << 15) | 
|  | unsigned short tbd_link; | 
|  | unsigned short tbd_bufl; | 
|  | unsigned short tbd_bufh; | 
|  | } tbd_t; | 
|  |  | 
|  | typedef struct { /* rfd */ | 
|  | unsigned short rfd_status; | 
|  | #define RFD_NOEOF	(1 << 6) | 
|  | #define RFD_FRAMESHORT	(1 << 7) | 
|  | #define RFD_DMAOVRN	(1 << 8) | 
|  | #define RFD_NORESOURCES	(1 << 9) | 
|  | #define RFD_ALIGNERROR	(1 << 10) | 
|  | #define RFD_CRCERROR	(1 << 11) | 
|  | #define RFD_OK		(1 << 13) | 
|  | #define RFD_FDCONSUMED	(1 << 14) | 
|  | #define RFD_COMPLETE	(1 << 15) | 
|  | unsigned short rfd_command; | 
|  | #define RFD_CMDSUSPEND	(1 << 14) | 
|  | #define RFD_CMDEL	(1 << 15) | 
|  | unsigned short rfd_link; | 
|  | unsigned short rfd_rbdoffset; | 
|  | unsigned char  rfd_dest[6]; | 
|  | unsigned char  rfd_src[6]; | 
|  | unsigned short rfd_len; | 
|  | } rfd_t; | 
|  |  | 
|  | typedef struct { /* rbd */ | 
|  | unsigned short rbd_status; | 
|  | #define RBD_ACNT	(0x3fff) | 
|  | #define RBD_ACNTVALID	(1 << 14) | 
|  | #define RBD_EOF		(1 << 15) | 
|  | unsigned short rbd_link; | 
|  | unsigned short rbd_bufl; | 
|  | unsigned short rbd_bufh; | 
|  | unsigned short rbd_len; | 
|  | } rbd_t; | 
|  |  | 
|  | typedef struct { /* nop */ | 
|  | unsigned short nop_status; | 
|  | unsigned short nop_command; | 
|  | unsigned short nop_link; | 
|  | } nop_t; | 
|  |  | 
|  | typedef struct { /* set multicast */ | 
|  | unsigned short mc_status; | 
|  | unsigned short mc_command; | 
|  | unsigned short mc_link; | 
|  | unsigned short mc_cnt; | 
|  | unsigned char  mc_addrs[1][6]; | 
|  | } mc_t; | 
|  |  | 
|  | typedef struct { /* set address */ | 
|  | unsigned short sa_status; | 
|  | unsigned short sa_command; | 
|  | unsigned short sa_link; | 
|  | unsigned char  sa_addr[6]; | 
|  | } sa_t; | 
|  |  | 
|  | typedef struct { /* config command */ | 
|  | unsigned short cfg_status; | 
|  | unsigned short cfg_command; | 
|  | unsigned short cfg_link; | 
|  | unsigned char  cfg_bytecnt;	/* size foll data: 4 - 12		 */ | 
|  | unsigned char  cfg_fifolim;	/* FIFO threshold			 */ | 
|  | unsigned char  cfg_byte8; | 
|  | #define CFG8_SRDY	(1 << 6) | 
|  | #define CFG8_SAVEBADF	(1 << 7) | 
|  | unsigned char  cfg_byte9; | 
|  | #define CFG9_ADDRLEN(x)	(x) | 
|  | #define CFG9_ADDRLENBUF	(1 << 3) | 
|  | #define CFG9_PREAMB2	(0 << 4) | 
|  | #define CFG9_PREAMB4	(1 << 4) | 
|  | #define CFG9_PREAMB8	(2 << 4) | 
|  | #define CFG9_PREAMB16	(3 << 4) | 
|  | #define CFG9_ILOOPBACK	(1 << 6) | 
|  | #define CFG9_ELOOPBACK	(1 << 7) | 
|  | unsigned char  cfg_byte10; | 
|  | #define CFG10_LINPRI(x)	(x) | 
|  | #define CFG10_ACR(x)	(x << 4) | 
|  | #define CFG10_BOFMET	(1 << 7) | 
|  | unsigned char  cfg_ifs; | 
|  | unsigned char  cfg_slotl; | 
|  | unsigned char  cfg_byte13; | 
|  | #define CFG13_SLOTH(x)	(x) | 
|  | #define CFG13_RETRY(x)	(x << 4) | 
|  | unsigned char  cfg_byte14; | 
|  | #define CFG14_PROMISC	(1 << 0) | 
|  | #define CFG14_DISBRD	(1 << 1) | 
|  | #define CFG14_MANCH	(1 << 2) | 
|  | #define CFG14_TNCRS	(1 << 3) | 
|  | #define CFG14_NOCRC	(1 << 4) | 
|  | #define CFG14_CRC16	(1 << 5) | 
|  | #define CFG14_BTSTF	(1 << 6) | 
|  | #define CFG14_FLGPAD	(1 << 7) | 
|  | unsigned char  cfg_byte15; | 
|  | #define CFG15_CSTF(x)	(x) | 
|  | #define CFG15_ICSS	(1 << 3) | 
|  | #define CFG15_CDTF(x)	(x << 4) | 
|  | #define CFG15_ICDS	(1 << 7) | 
|  | unsigned short cfg_minfrmlen; | 
|  | } cfg_t; | 
|  |  | 
|  | typedef struct { /* scb */ | 
|  | unsigned short scb_status;	/* status of 82586			*/ | 
|  | #define SCB_STRXMASK		(7 << 4)	/* Receive unit status		*/ | 
|  | #define SCB_STRXIDLE		(0 << 4)	/* Idle				*/ | 
|  | #define SCB_STRXSUSP		(1 << 4)	/* Suspended			*/ | 
|  | #define SCB_STRXNRES		(2 << 4)	/* No resources			*/ | 
|  | #define SCB_STRXRDY		(4 << 4)	/* Ready			*/ | 
|  | #define SCB_STCUMASK		(7 << 8)	/* Command unit status		*/ | 
|  | #define SCB_STCUIDLE		(0 << 8)	/* Idle				*/ | 
|  | #define SCB_STCUSUSP		(1 << 8)	/* Suspended			*/ | 
|  | #define SCB_STCUACTV		(2 << 8)	/* Active			*/ | 
|  | #define SCB_STRNR		(1 << 12)	/* Receive unit not ready	*/ | 
|  | #define SCB_STCNA		(1 << 13)	/* Command unit not ready	*/ | 
|  | #define SCB_STFR		(1 << 14)	/* Frame received		*/ | 
|  | #define SCB_STCX		(1 << 15)	/* Command completed		*/ | 
|  | unsigned short scb_command;	/* Next command				*/ | 
|  | #define SCB_CMDRXSTART		(1 << 4)	/* Start (at rfa_offset)	*/ | 
|  | #define SCB_CMDRXRESUME		(2 << 4)	/* Resume reception		*/ | 
|  | #define SCB_CMDRXSUSPEND	(3 << 4)	/* Suspend reception		*/ | 
|  | #define SCB_CMDRXABORT		(4 << 4)	/* Abort reception		*/ | 
|  | #define SCB_CMDCUCSTART		(1 << 8)	/* Start (at cbl_offset)	*/ | 
|  | #define SCB_CMDCUCRESUME	(2 << 8)	/* Resume execution		*/ | 
|  | #define SCB_CMDCUCSUSPEND	(3 << 8)	/* Suspend execution		*/ | 
|  | #define SCB_CMDCUCABORT		(4 << 8)	/* Abort execution		*/ | 
|  | #define SCB_CMDACKRNR		(1 << 12)	/* Ack RU not ready		*/ | 
|  | #define SCB_CMDACKCNA		(1 << 13)	/* Ack CU not ready		*/ | 
|  | #define SCB_CMDACKFR		(1 << 14)	/* Ack Frame received		*/ | 
|  | #define SCB_CMDACKCX		(1 << 15)	/* Ack Command complete		*/ | 
|  | unsigned short scb_cbl_offset;	/* Offset of first command unit		*/ | 
|  | unsigned short scb_rfa_offset;	/* Offset of first receive frame area	*/ | 
|  | unsigned short scb_crc_errors;	/* Properly aligned frame with CRC error*/ | 
|  | unsigned short scb_aln_errors;	/* Misaligned frames			*/ | 
|  | unsigned short scb_rsc_errors;	/* Frames lost due to no space		*/ | 
|  | unsigned short scb_ovn_errors;	/* Frames lost due to slow bus		*/ | 
|  | } scb_t; | 
|  |  | 
|  | typedef struct { /* iscp */ | 
|  | unsigned short iscp_busy;	/* set by CPU before CA			*/ | 
|  | unsigned short iscp_offset;	/* offset of SCB			*/ | 
|  | unsigned short iscp_basel;	/* base of SCB				*/ | 
|  | unsigned short iscp_baseh; | 
|  | } iscp_t; | 
|  |  | 
|  | /* this address must be 0xfff6 */ | 
|  | typedef struct { /* scp */ | 
|  | unsigned short scp_sysbus;	/* bus size */ | 
|  | #define SCP_SY_16BBUS	0x00 | 
|  | #define SCP_SY_8BBUS	0x01 | 
|  | unsigned short scp_junk[2];	/* junk */ | 
|  | unsigned short scp_iscpl;	/* lower 16 bits of iscp */ | 
|  | unsigned short scp_iscph;	/* upper 16 bits of iscp */ | 
|  | } scp_t; | 
|  |  | 
|  | /* commands */ | 
|  | #define CMD_NOP			0 | 
|  | #define CMD_SETADDRESS		1 | 
|  | #define CMD_CONFIG		2 | 
|  | #define CMD_SETMULTICAST	3 | 
|  | #define CMD_TX			4 | 
|  | #define CMD_TDR			5 | 
|  | #define CMD_DUMP		6 | 
|  | #define CMD_DIAGNOSE		7 | 
|  |  | 
|  | #define CMD_MASK		7 | 
|  |  | 
|  | #define CMD_INTR		(1 << 13) | 
|  | #define CMD_SUSP		(1 << 14) | 
|  | #define CMD_EOL			(1 << 15) | 
|  |  | 
|  | #define STAT_COLLISIONS		(15) | 
|  | #define STAT_COLLEXCESSIVE	(1 << 5) | 
|  | #define STAT_COLLAFTERTX	(1 << 6) | 
|  | #define STAT_TXDEFERRED		(1 << 7) | 
|  | #define STAT_TXSLOWDMA		(1 << 8) | 
|  | #define STAT_TXLOSTCTS		(1 << 9) | 
|  | #define STAT_NOCARRIER		(1 << 10) | 
|  | #define STAT_FAIL		(1 << 11) | 
|  | #define STAT_ABORTED		(1 << 12) | 
|  | #define STAT_OK			(1 << 13) | 
|  | #define STAT_BUSY		(1 << 14) | 
|  | #define STAT_COMPLETE		(1 << 15) | 
|  | #endif | 
|  | #endif | 
|  |  | 
|  | /* | 
|  | * Ether1 card definitions: | 
|  | * | 
|  | * FAST accesses: | 
|  | *	+0	Page register | 
|  | * 			16 pages | 
|  | *	+4	Control | 
|  | *			'1' = reset | 
|  | *			'2' = loopback | 
|  | *			'4' = CA | 
|  | *			'8' = int ack | 
|  | * | 
|  | * RAM at address + 0x2000 | 
|  | * Pod. Prod id = 3 | 
|  | * Words after ID block [base + 8 words] | 
|  | *	+0 pcb issue (0x0c and 0xf3 invalid) | 
|  | *	+1 - +6 eth hw address | 
|  | */ |