root/sys/arch/mips/atheros/dev/aereg.h
/*      $NetBSD: aereg.h,v 1.3 2021/08/02 12:56:23 andvar Exp $ */

/*-
 * Copyright (c) 1999, 2000 The NetBSD Foundation, Inc.
 * All rights reserved.
 *
 * This code is derived from software contributed to The NetBSD Foundation
 * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
 * NASA Ames Research Center.
 *
 * 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.
 *
 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
 */

#ifndef _MIPS_ATHEROS_DEV_AEREG_H_
#define _MIPS_ATHEROS_DEV_AEREG_H_

/*
 * This device is much like a standard Tulip Ethernet chip, but it is
 * an on-chip core on the AR5312 processors.  It differs in having two
 * register windows, and the details of some of the contents of those
 * registers.  It has about 80% in common to a typical tulip.
 */

/*
 * Buffer descriptor.  Must be 4-byte aligned.
 *
 * Note for receive descriptors, the byte count fields must
 * be a multiple of 4.
 */
struct ae_desc {
        volatile u_int32_t ad_status;     /* Status */
        volatile u_int32_t ad_ctl;        /* Control and Byte Counts */
        volatile u_int32_t ad_bufaddr1; /* Buffer Address 1 */
        volatile u_int32_t ad_bufaddr2; /* Buffer Address 2 */
};

/*
 * Descriptor Status bits common to transmit and receive.
 */
#define ADSTAT_OWN      0x80000000      /* Tulip owns descriptor */
#define ADSTAT_ES       0x00008000      /* Error Summary */

/*
 * Descriptor Status bits for Receive Descriptor.
 */
#define ADSTAT_Rx_FF    0x40000000      /* Filtering Fail */
#define ADSTAT_Rx_FL    0x3fff0000      /* Frame Length including CRC */
#define ADSTAT_Rx_DE    0x00004000      /* Descriptor Error */
#define ADSTAT_Rx_LE    0x00001000      /* Length Error */
#define ADSTAT_Rx_RF    0x00000800      /* Runt Frame */
#define ADSTAT_Rx_MF    0x00000400      /* Multicast Frame */
#define ADSTAT_Rx_FS    0x00000200      /* First Descriptor */
#define ADSTAT_Rx_LS    0x00000100      /* Last Descriptor */
#define ADSTAT_Rx_TL    0x00000080      /* Frame Too Long */
#define ADSTAT_Rx_CS    0x00000040      /* Collision Seen */
#define ADSTAT_Rx_RT    0x00000020      /* Frame Type */
#define ADSTAT_Rx_RW    0x00000010      /* Receive Watchdog */
#define ADSTAT_Rx_RE    0x00000008      /* Report on MII Error */
#define ADSTAT_Rx_DB    0x00000004      /* Dribbling Bit */
#define ADSTAT_Rx_CE    0x00000002      /* CRC Error */
#define ADSTAT_Rx_ZER   0x00000001      /* Zero (always 0) */

#define ADSTAT_Rx_LENGTH(x)     (((x) & ADSTAT_Rx_FL) >> 16)

/*
 * Descriptor Status bits for Transmit Descriptor.
 */
#define ADSTAT_Tx_TO    0x00004000      /* Transmit Jabber Timeout */
#define ADSTAT_Tx_LO    0x00000800      /* Loss of Carrier */
#define ADSTAT_Tx_NC    0x00000400      /* No Carrier */
#define ADSTAT_Tx_LC    0x00000200      /* Late Collision */
#define ADSTAT_Tx_EC    0x00000100      /* Excessive Collisions */
#define ADSTAT_Tx_HF    0x00000080      /* Heartbeat Fail */
#define ADSTAT_Tx_CC    0x00000078      /* Collision Count */
#define ADSTAT_Tx_ED    0x00000004      /* Excessive Deferral */
#define ADSTAT_Tx_UF    0x00000002      /* Underflow Error */
#define ADSTAT_Tx_DE    0x00000001      /* Deferred */

#define ADSTAT_Tx_COLLISIONS(x) (((x) & ADSTAT_Tx_CC) >> 3)

/*
 * Descriptor Control bits common to transmit and receive.
 */
#define ADCTL_SIZE1     0x000007ff      /* Size of buffer 1 */
#define ADCTL_SIZE1_SHIFT 0

#define ADCTL_SIZE2     0x003ff800      /* Size of buffer 2 */
#define ADCTL_SIZE2_SHIFT 11

#define ADCTL_ER        0x02000000      /* End of Ring */
#define ADCTL_CH        0x01000000      /* Second Address Chained */

/*
 * Descriptor Control bits for Transmit Descriptor.
 */
#define ADCTL_Tx_IC     0x80000000      /* Interrupt on Completion */
#define ADCTL_Tx_LS     0x40000000      /* Last Segment */
#define ADCTL_Tx_FS     0x20000000      /* First Segment */
#define ADCTL_Tx_AC     0x04000000      /* Add CRC Disable */
#define ADCTL_Tx_DPD    0x00800000      /* Disabled Padding */

/*
 * Control registers.
 */

/* these are registers only found on this part */
#define CSR_MACCTL      0x0000          /* mac control */
#define CSR_MACHI       0x0004
#define CSR_MACLO       0x0008
#define CSR_HTHI        0x000C          /* multicast table high */
#define CSR_HTLO        0x0010          /* multicast table low */
#define CSR_MIIADDR     0x0014          /* mii address */
#define CSR_MIIDATA     0x0018          /* mii data */
#define CSR_FLOWC       0x001C          /* flow control */
#define CSR_VL1         0x0020          /* vlan 1 tag */
        
/* these are more or less normal Tulip registers */
#define CSR_BUSMODE     0x1000          /* bus mode */
#define CSR_TXPOLL      0x1004          /* tx poll demand */
#define CSR_RXPOLL      0x1008          /* rx poll demand */
#define CSR_RXLIST      0x100C          /* rx base descriptor address */
#define CSR_TXLIST      0x1010          /* tx base descriptor address */
#define CSR_STATUS      0x1014          /* (interrupt) status */
#define CSR_OPMODE      0x1018          /* operation mode */
#define CSR_INTEN       0x101C          /* interrupt enable */
#define CSR_MISSED      0x1020          /* missed frame counter */
#define CSR_HTBA        0x1050          /* host tx buffer address (ro) */
#define CSR_HRBA        0x1054          /* host rx buffer address (ro) */

/* CSR_MACCTL - Mac Control */
#define MACCTL_RE               0x00000004      /* rx enable */
#define MACCTL_TE               0x00000008      /* tx enable */
#define MACCTL_DC               0x00000020      /* deferral check */
#define MACCTL_PSTR             0x00000100      /* automatic pad strip */
#define MACCTL_DTRY             0x00000400      /* disable retry */
#define MACCTL_DBF              0x00000800      /* disable broadcast frames */
#define MACCTL_LCC              0x00001000      /* late collision control */
#define MACCTL_HASH             0x00002000      /* hash filtering enable */
#define MACCTL_HO               0x00008000      /* disable perfect filtering */
#define MACCTL_PB               0x00010000      /* pass bad frames */
#define MACCTL_IF               0x00020000      /* inverse filtering */
#define MACCTL_PR               0x00040000      /* promiscuous mode */
#define MACCTL_PM               0x00080000      /* pass all multicast */
#define MACCTL_FDX              0x00100000      /* full duplex mode */
#define MACCTL_LOOP             0x00600000      /* loopback mask */
#define MACCTL_LOOP_INT         0x00200000      /* internal loopback */
#define MACCTL_LOOP_EXT         0x00400000      /* external loopback */
#define MACCTL_LOOP_NONE        0x00000000
#define MACCTL_DRO              0x00800000      /* disable receive own */
#define MACCTL_PS               0x08000000      /* port select, 0 = mii */
#define MACCTL_HBD              0x10000000      /* heartbeat disable */
#define MACCTL_BLE              0x40000000      /* mac big endian */
#define MACCTL_RA               0x80000000      /* receive all packets */

/* CSR_MIIADDR - MII Address */
#define MIIADDR_BUSY            0x00000001      /* mii busy */
#define MIIADDR_WRITE           0x00000002      /* mii write */
#define MIIADDR_REG_MASK        0x000007C0      /* mii register */
#define MIIADDR_REG_SHIFT       6
#define MIIADDR_PHY_MASK        0x0000F800      /* mii phy */
#define MIIADDR_PHY_SHIFT       11

#define MIIADDR_GETREG(x)       (((x) & MIIADDR_REG) >> 6)
#define MIIADDR_PUTREG(x)       (((x) << 6) & MIIADR_REG)
#define MIIADDR_GETPHY(x)       (((x) & MIIADDR_PHY) >> 11)
#define MIIADDR_PUTPHY(x)       (((x) << 6) & MIIADR_PHY)

/* CSR_FLOWC - Flow Control */
#define FLOWC_FCB               0x00000001      /* flow control busy */
#define FLOWC_FCE               0x00000002      /* flow control enable */
#define FLOWC_PCF               0x00000004      /* pass control frames */
#define FLOWC_PT                0xffff0000      /* pause time */

/* CSR_BUSMODE - Bus Mode */
#define BUSMODE_SWR             0x00000001      /* software reset */
#define BUSMODE_BAR             0x00000002      /* bus arbitration */
#define BUSMODE_DSL             0x0000007c      /* descriptor skip length */
#define BUSMODE_BLE             0x00000080      /* data buf endian */
                                                /* programmable burst length */
#define BUSMODE_PBL_DEFAULT     0x00000000      /*     default value */
#define BUSMODE_PBL_1LW         0x00000100      /*     1 longword */
#define BUSMODE_PBL_2LW         0x00000200      /*     2 longwords */
#define BUSMODE_PBL_4LW         0x00000400      /*     4 longwords */
#define BUSMODE_PBL_8LW         0x00000800      /*     8 longwords */
#define BUSMODE_PBL_16LW        0x00001000      /*    16 longwords */
#define BUSMODE_PBL_32LW        0x00002000      /*    32 longwords */
#define BUSMODE_DBO             0x00100000      /* descriptor endian */
#define BUSMODE_ALIGN_16B       0x01000000      /* force oddhw rx buf align */

/* CSR_TXPOLL - Transmit Poll Demand */
#define TXPOLL_TPD              0x00000001      /* transmit poll demand */


/* CSR_RXPOLL - Receive Poll Demand */
#define RXPOLL_RPD              0x00000001      /* receive poll demand */

/* CSR_STATUS - Status */
#define STATUS_TI               0x00000001      /* transmit interrupt */
#define STATUS_TPS              0x00000002      /* transmit process stopped */
#define STATUS_TU               0x00000004      /* transmit buffer unavail */
#define STATUS_TJT              0x00000008      /* transmit jabber timeout */
#define STATUS_UNF              0x00000020      /* transmit underflow */
#define STATUS_RI               0x00000040      /* receive interrupt */
#define STATUS_RU               0x00000080      /* receive buffer unavail */
#define STATUS_RPS              0x00000100      /* receive process stopped */
#define STATUS_ETI              0x00000400      /* early transmit interrupt */
#define STATUS_SE               0x00002000      /* system error */
#define STATUS_ER               0x00004000      /* early receive (21041) */
#define STATUS_AIS              0x00008000      /* abnormal intr summary */
#define STATUS_NIS              0x00010000      /* normal interrupt summary */
#define STATUS_RS               0x000e0000      /* receive process state */
#define STATUS_RS_STOPPED       0x00000000      /* Stopped */
#define STATUS_RS_FETCH         0x00020000      /* Running - fetch receive
                                                   descriptor */
#define STATUS_RS_CHECK         0x00040000      /* Running - check for end
                                                   of receive */
#define STATUS_RS_WAIT          0x00060000      /* Running - wait for packet */
#define STATUS_RS_SUSPENDED     0x00080000      /* Suspended */
#define STATUS_RS_CLOSE         0x000a0000      /* Running - close receive
                                                   descriptor */
#define STATUS_RS_FLUSH         0x000c0000      /* Running - flush current
                                                   frame from FIFO */
#define STATUS_RS_QUEUE         0x000e0000      /* Running - queue current
                                                   frame from FIFO into
                                                   buffer */
#define STATUS_TS               0x00700000      /* transmit process state */
#define STATUS_TS_STOPPED       0x00000000      /* Stopped */
#define STATUS_TS_FETCH         0x00100000      /* Running - fetch transmit
                                                   descriptor */
#define STATUS_TS_WAIT          0x00200000      /* Running - wait for end
                                                   of transmission */
#define STATUS_TS_READING       0x00300000      /* Running - read buffer from
                                                   memory and queue into
                                                   FIFO */
#define STATUS_TS_SUSPENDED     0x00600000      /* Suspended */
#define STATUS_TS_CLOSE         0x00700000      /* Running - close transmit
                                                   descriptor */
#define STATUS_TX_ABORT         0x00800000      /* Transmit bus abort */
#define STATUS_RX_ABORT         0x01000000      /* Transmit bus abort */

/* CSR_OPMODE - Operation Mode */
#define OPMODE_SR               0x00000002      /* start receive */
#define OPMODE_OSF              0x00000004      /* operate on second frame */
#define OPMODE_ST               0x00002000      /* start transmitter */
#define OPMODE_TR               0x0000c000      /* threshold control */
#define OPMODE_TR_32            0x00000000      /*     32 words */
#define OPMODE_TR_64            0x00004000      /*     64 words */
#define OPMODE_TR_128           0x00008000      /*    128 words */
#define OPMODE_TR_256           0x0000c000      /*    256 words */
#define OPMODE_SF               0x00200000      /* store and forward mode */

/* CSR_INTEN - Interrupt Enable */
        /* See bits for CSR_STATUS -- Status */


/* CSR_MISSED - Missed Frames */
#define MISSED_MFC              0xffff0000      /* missed packet count */
#define MISSED_FOC              0x0000ffff      /* fifo overflow counter */

#define MISSED_GETMFC(x)        ((x) & MISSED_MFC)
#define MISSED_GETFOC(x)        (((x) & MISSED_FOC) >> 16)

#endif /* _MIPS_ATHEROS_DEV_AEREG_H_ */