/* $NetBSD: if_aumacreg.h,v 1.1 2002/07/29 15:39:14 simonb Exp $ */
/*
* Copyright (c) 2001 Wasabi Systems, Inc.
* All rights reserved.
*
* Written by Jason R. Thorpe for Wasabi Systems, Inc.
*
* 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 for the NetBSD Project by
* Wasabi Systems, Inc.
* 4. The name of Wasabi Systems, Inc. may not be used to endorse
* or promote products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``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 WASABI SYSTEMS, INC
* 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.
*/
#ifndef _MIPS_ALCHEMY_DEV_AUMACREG_H_
#define _MIPS_ALCHEMY_DEV_AUMACREG_H_
/*
* Register description for the Alchemy Semiconductor Au1X00
* Ethernet Media Access Controllers.
*/
#define MAC_BUFLEN 0x0800
#define MAC_BUFLEN_JUMBO 0x2800
/*
* MAC registers.
*/
#define MAC_CONTROL 0x0000 /* MAC control */
#define CONTROL_RA (1U << 31) /* receive all */
#define CONTROL_EM (1U << 30) /* 1 = big endian */
#define CONTROL_DO (1U << 23) /* disable receive own */
#define CONTROL_LM(x) ((x) << 21) /* loopback mode */
/* 0 = normal */
/* 1 = internal loopback */
/* 2 = external loopback */
/* 3 = reserved */
#define CONTROL_F (1U << 20) /* full-duplex mode */
#define CONTROL_PM (1U << 19) /* pass all multicast */
#define CONTROL_PR (1U << 18) /* promiscuous mode */
#define CONTROL_IF (1U << 17) /* inverse filtering */
#define CONTROL_PB (1U << 16) /* pass bad frames */
#define CONTROL_HO (1U << 15) /* hash-only filtering */
#define CONTROL_HP (1U << 13) /* hash-perfect filtering */
#define CONTROL_LC (1U << 12) /* re-tx on late collision */
#define CONTROL_DB (1U << 11) /* disable broadcast frames */
#define CONTROL_DR (1U << 10) /* disable retry */
#define CONTROL_AP (1U << 8) /* automatic pad stripping */
#define CONTROL_BL(x) ((x) << 6) /* backoff limit */
#define CONTROL_DC (1U << 5) /* deferral check */
#define CONTROL_TE (1U << 3) /* transmitter enable */
#define CONTROL_RE (1U << 2) /* receiver enable */
#define MAC_ADDRHIGH 0x0004 /* high 16 bits of station address */
#define MAC_ADDRLOW 0x0008 /* low 32 bits of station address */
#define MAC_HASHHIGH 0x000c /* high 32 bits of multicast hash */
#define MAC_HASHLOW 0x0010 /* low 32 bits of multicast hash */
#define MAC_MIICTRL 0x0014 /* MII PHY control */
#define MIICTRL_PHYADDR(x) ((x) << 11) /* PHY address */
#define MIICTRL_MIIREG(x) ((x) << 6) /* MII register */
#define MIICTRL_MW (1U << 1) /* MII write */
#define MIICTRL_MB (1U << 0) /* MII busy */
#define MAC_MIIDATA 0x0018 /* MII PHY data */
#define MIIDATA_MASK 0xffff /* MII data bits */
#define MAC_FLOWCTRL 0x001c /* control frame generation control */
#define FLOWCTRL_PT(x) ((x) << 16) /* pause time */
#define FLOWCTRL_PC (1U << 2) /* pass control frame */
#define FLOWCTRL_FE (1U << 1) /* flow control enable */
#define FLOWCTRL_FB (1U << 0) /* flow control busy */
#define MAC_VLAN1 0x0020 /* VLAN1 tag */
#define MAC_VLAN2 0x0024 /* VLAN2 tag */
/*
* MAC Enable registers.
*/
#define MACEN_JP (1U << 6) /* jumbo packet enable */
#define MACEN_E2 (1U << 5) /* enable2 */
#define MACEN_E1 (1U << 4) /* enable1 */
#define MACEN_C (1U << 3) /* 0 == coherent */
#define MACEN_TS (1U << 2) /* disable toss */
#define MACEN_E0 (1U << 1) /* enable0 */
#define MACEN_CE (1U << 0) /* clock enable */
/*
* MAC DMA registers.
*/
#define MACDMA_TX_ENTRY(x) ((x) << 4)
#define MACDMA_RX_ENTRY(x) (((x) << 4) + 0x100)
#define MACDMA_TX_STAT(x) (MACDMA_TX_ENTRY(x) + 0x00)
#define MACDMA_TX_ADDR(x) (MACDMA_TX_ENTRY(x) + 0x04)
#define MACDMA_TX_LEN(x) (MACDMA_TX_ENTRY(x) + 0x08)
#define MACDMA_RX_STAT(x) (MACDMA_RX_ENTRY(x) + 0x00)
#define MACDMA_RX_ADDR(x) (MACDMA_RX_ENTRY(x) + 0x04)
#define RX_STAT_MI (1U << 31) /* missed frame */
#define RX_STAT_PF (1U << 30) /* packet filter pass */
#define RX_STAT_FF (1U << 29) /* filtering fail */
#define RX_STAT_BF (1U << 28) /* broadcast frame */
#define RX_STAT_MF (1U << 27) /* multicast frame */
#define RX_STAT_UC (1U << 26) /* unsupported control frame */
#define RX_STAT_CF (1U << 25) /* control frame */
#define RX_STAT_LE (1U << 24) /* length error */
#define RX_STAT_V2 (1U << 23) /* VLAN2 match */
#define RX_STAT_V1 (1U << 22) /* VLAN1 match */
#define RX_STAT_CR (1U << 21) /* CRC error */
#define RX_STAT_DB (1U << 20) /* dribbling bit */
#define RX_STAT_ME (1U << 19) /* MII error */
#define RX_STAT_FT (1U << 18) /* 0 = 802.3, 1 = Ethernet */
#define RX_STAT_CS (1U << 17) /* collision seen */
#define RX_STAT_FL (1U << 16) /* frame too long */
#define RX_STAT_RF (1U << 15) /* runt frame */
#define RX_STAT_WT (1U << 14) /* watchdog timeout */
#define RX_STAT_L(x) ((x) & 0x3fff) /* frame length */
#define RX_STAT_ERRS (RX_STAT_MI | RX_STAT_UC | RX_STAT_LE | RX_STAT_CR | \
RX_STAT_DB | RX_STAT_ME | RX_STAT_CS | RX_STAT_FL | \
RX_STAT_RF | RX_STAT_WT)
#define RX_ADDR_CB(x) (((x) >> 2) & 3)/* current buffer */
#define RX_ADDR_DN (1U << 1) /* transaction done */
#define RX_ADDR_EN (1U << 0) /* enable this buffer */
#define TX_STAT_PR (1U << 31) /* packet retry */
#define TX_STAT_CC(x) (((x) >> 10) & 0xf) /* collision count */
#define TX_STAT_LO (1U << 9) /* late collision observed */
#define TX_STAT_DF (1U << 8) /* deferred transmission */
#define TX_STAT_UR (1U << 7) /* data underrun */
#define TX_STAT_EC (1U << 6) /* excessive collisions */
#define TX_STAT_LC (1U << 5) /* late collision */
#define TX_STAT_ED (1U << 4) /* excessive deferral */
#define TX_STAT_LS (1U << 3) /* loss of carrier */
#define TX_STAT_NC (1U << 2) /* no carrier */
#define TX_STAT_JT (1U << 1) /* jabber timeout */
#define TX_STAT_FA (1U << 0) /* frame aborted */
#define TX_ADDR_CB(x) (((x) >> 2) & 3)/* current buffer */
#define TX_ADDR_DN (1U << 1) /* transaction done */
#define TX_ADDR_EN (1U << 0) /* enable this buffer */
#endif /* _MIPS_ALCHEMY_DEV_AUMACREG_H_ */