root/sys/dev/marvell/gtethreg.h
/*      $NetBSD: gtethreg.h,v 1.6 2021/11/10 17:19:30 msaitoh Exp $     */

/*
 * Copyright (c) 2002 Allegro Networks, Inc., Wasabi Systems, Inc.
 * 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 for the NetBSD Project by
 *      Allegro Networks, Inc., and Wasabi Systems, Inc.
 * 4. The name of Allegro Networks, Inc. may not be used to endorse
 *    or promote products derived from this software without specific prior
 *    written permission.
 * 5. 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 ALLEGRO NETWORKS, INC. AND
 * 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 EITHER ALLEGRO NETWORKS, INC. OR 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 _DEV_GTETHREG_H_
#define _DEV_GTETHREG_H_

#define ETH__BIT(bit)                   (1U << (bit))
#define ETH__LLBIT(bit)                 (1LLU << (bit))
#define ETH__MASK(bit)                  (ETH__BIT(bit) - 1)
#define ETH__LLMASK(bit)                (ETH__LLBIT(bit) - 1)
#define ETH__EXT(data, bit, len)        (((data) >> (bit)) & ETH__MASK(len))
#define ETH__LLEXT(data, bit, len)      (((data) >> (bit)) & ETH__LLMASK(len))
#define ETH__CLR(data, bit, len)        ((data) &= ~(ETH__MASK(len) << (bit)))
#define ETH__INS(new, bit)              ((new) << (bit))
#define ETH__LLINS(new, bit)            ((uint64_t)(new) << (bit))

/*
 * Descriptors used for both receive & transmit data.  Note that the descriptor
 * must start on a 4LW boundary.  Since the GT accesses the descriptor as
 * two 64-bit quantities, we must present them 32bit quantities in the right
 * order based on endianness.
 */

struct gt_eth_desc {
#if defined(BYTE_ORDER) && BYTE_ORDER == BIG_ENDIAN
        u_int32_t ed_lencnt;    /* length is hi 16 bits; count (rx) is lo 16 */
        u_int32_t ed_cmdsts;    /* command (hi16)/status (lo16) bits */
        u_int32_t ed_nxtptr;    /* next descriptor (must be 4LW aligned) */
        u_int32_t ed_bufptr;    /* pointer to packet buffer */
#endif
#if defined(BYTE_ORDER) && BYTE_ORDER == LITTLE_ENDIAN
        u_int32_t ed_cmdsts;    /* command (hi16)/status (lo16) bits */
        u_int32_t ed_lencnt;    /* length is hi 16 bits; count (rx) is lo 16 */
        u_int32_t ed_bufptr;    /* pointer to packet buffer */
        u_int32_t ed_nxtptr;    /* next descriptor (must be 4LW aligned) */
#endif
};

/* Table 578: Ethernet TX Descriptor - Command/Status word
 * All bits except F, EI, AM, O are only valid if TX_CMD_L is also set,
 * otherwise should be 0 (tx).
 */
#define TX_STS_LC       ETH__BIT(5)     /* Late Collision */
#define TX_STS_UR       ETH__BIT(6)     /* Underrun error */
#define TX_STS_RL       ETH__BIT(8)     /* Retransmit Limit (excession coll) */
#define TX_STS_COL      ETH__BIT(9)     /* Collision Occurred */
#define TX_STS_RC(v)    ETH__GETBITS(v, 10, 4)  /* Retransmit Count */
#define TX_STS_ES       ETH__BIT(15)    /* Error Summary (LC|UR|RL) */
#define TX_CMD_L        ETH__BIT(16)    /* Last - End Of Packet */
#define TX_CMD_F        ETH__BIT(17)    /* First - Start Of Packet */
#define TX_CMD_P        ETH__BIT(18)    /* Pad Packet */
#define TX_CMD_GC       ETH__BIT(22)    /* Generate CRC */
#define TX_CMD_EI       ETH__BIT(23)    /* Enable Interrupt */
#define TX_CMD_AM       ETH__BIT(30)    /* Auto Mode */
#define TX_CMD_O        ETH__BIT(31)    /* Ownership (1=GT 0=CPU) */

#define TX_CMD_FIRST    (TX_CMD_F|TX_CMD_O)
#define TX_CMD_LAST     (TX_CMD_L|TX_CMD_GC|TX_CMD_P|TX_CMD_O)

/* Table 582: Ethernet RX Descriptor - Command/Status Word
 * All bits except F, EI, AM, O are only valid if RX_CMD_L is also set,
 * otherwise should be ignored (rx).
 */
#define RX_STS_CE       ETH__BIT(0)     /* CRC Error */
#define RX_STS_COL      ETH__BIT(1)     /* Collision sensed during reception */
#define RX_STS_LC       ETH__BIT(5)     /* Late Collision (Reserved) */
#define RX_STS_OR       ETH__BIT(6)     /* Overrun Error */
#define RX_STS_MFL      ETH__BIT(7)     /* Max Frame Len Error */
#define RX_STS_SF       ETH__BIT(8)     /* Short Frame Error (< 64 bytes) */
#define RX_STS_FT       ETH__BIT(11)    /* Frame Type (1 = 802.3) */
#define RX_STS_M        ETH__BIT(12)    /* Missed Frame */
#define RX_STS_HE       ETH__BIT(13)    /* Hash Expired (manual match) */
#define RX_STS_IGMP     ETH__BIT(14)    /* IGMP Packet */
#define RX_STS_ES       ETH__BIT(15)    /* Error Summary (CE|COL|LC|OR|MFL|SF) */
#define RX_CMD_L        ETH__BIT(16)    /* Last - End Of Packet */
#define RX_CMD_F        ETH__BIT(17)    /* First - Start Of Packet */
#define RX_CMD_EI       ETH__BIT(23)    /* Enable Interrupt */
#define RX_CMD_AM       ETH__BIT(30)    /* Auto Mode */
#define RX_CMD_O        ETH__BIT(31)    /* Ownership (1=GT 0=CPU) */

/* Table 586: Hash Table Entry Fields
 */
#define HSH_V           ETH__LLBIT(0)   /* Entry is valid */
#define HSH_S           ETH__LLBIT(1)   /* Skip this entry */
#define HSH_RD          ETH__LLBIT(2)   /* Receive(1) / Discard (0) */
#define HSH_R           ETH__LLBIT(2)   /* Receive(1) */
#define HSH_PRIO_GET(v) ETH__LLEXT(v, 51, 2)
#define HSH_PRIO_INS(v) ETH__LLINS(v, 51)
#define HSH_ADDR_MASK   0x7fffff8LLU
#define HSH_LIMIT       12


#define ETHC_SIZE       0x4000          /* Register Space */

#define ETH_EPAR        0x2000          /* PHY Address Register */
#define ETH_ESMIR       0x2010          /* SMI Register */

#define ETH_BASE(u)     (ETH0_BASE + ((u) << 10)) /* Ethernet Register Base */
#define ETH_NUM         3
#define ETH_SIZE        0x0400                    /* Register Space */

#define ETH_EBASE       0x0000          /* Base of Registers */
#define ETH_EPCR        0x0000          /* Port Config. Register */
#define ETH_EPCXR       0x0008          /* Port Config. Extend Reg */
#define ETH_EPCMR       0x0010          /* Port Command Register */
#define ETH_EPSR        0x0018          /* Port Status Register */
#define ETH_ESPR        0x0020          /* Port Serial Parameters Reg */
#define ETH_EHTPR       0x0028          /* Port Hash Table Pointer Reg*/
#define ETH_EFCSAL      0x0030          /* Flow Control Src Addr Low */
#define ETH_EFCSAH      0x0038          /* Flow Control Src Addr High */
#define ETH_ESDCR       0x0040          /* SDMA Configuration Reg */
#define ETH_ESDCMR      0x0048          /* SDMA Command Register */
#define ETH_EICR        0x0050          /* Interrupt Cause Register */
#define ETH_EIMR        0x0058          /* Interrupt Mask Register */
#define ETH_EFRDP0      0x0080          /* First Rx Desc Pointer 0 */
#define ETH_EFRDP1      0x0084          /* First Rx Desc Pointer 1 */
#define ETH_EFRDP2      0x0088          /* First Rx Desc Pointer 2 */
#define ETH_EFRDP3      0x008c          /* First Rx Desc Pointer 3 */
#define ETH_ECRDP0      0x00a0          /* Current Rx Desc Pointer 0 */
#define ETH_ECRDP1      0x00a4          /* Current Rx Desc Pointer 1 */
#define ETH_ECRDP2      0x00a8          /* Current Rx Desc Pointer 2 */
#define ETH_ECRDP3      0x00ac          /* Current Rx Desc Pointer 3 */
#define ETH_ECTDP0      0x00e0          /* Current Tx Desc Pointer 0 */
#define ETH_ECTDP1      0x00e4          /* Current Tx Desc Pointer 1 */
#define ETH_EDSCP2P0L   0x0060          /* IP Differentiated Services
                                           CodePoint to Priority0 low */
#define ETH_EDSCP2P0H   0x0064          /* IP Differentiated Services
                                           CodePoint to Priority0 high*/
#define ETH_EDSCP2P1L   0x0068          /* IP Differentiated Services
                                           CodePoint to Priority1 low */
#define ETH_EDSCP2P1H   0x006c          /* IP Differentiated Services
                                           CodePoint to Priority1 high*/
#define ETH_EVPT2P      0x0068          /* VLAN Prio. Tag to Priority */
#define ETH_EMIBCTRS    0x0100          /* MIB Counters */


#define ETH_EPAR_PhyAD_GET(v, n)        (((v) >> ((n) * 5)) & 0x1f)

#define ETH_ESMIR_READ(phy, reg)        (ETH__INS(phy, 16)|\
                                         ETH__INS(reg, 21)|\
                                         ETH_ESMIR_ReadOpcode)
#define ETH_ESMIR_WRITE(phy, reg, val)  (ETH__INS(phy, 16)|\
                                         ETH__INS(reg, 21)|\
                                         ETH__INS(val,  0)|\
                                         ETH_ESMIR_WriteOpcode)
#define ETH_ESMIR_Value_GET(v)          ETH__EXT(v, 0, 16)
#define ETH_ESMIR_WriteOpcode           0
#define ETH_ESMIR_ReadOpcode            ETH__BIT(26)
#define ETH_ESMIR_ReadValid             ETH__BIT(27)
#define ETH_ESMIR_Busy                  ETH__BIT(28)

/*
 * Table 597: Port Configuration Register (PCR)
 * 00:00 PM                     Promiscuous mode
 *                              0: Normal mode (Frames are only received if the
 *                                 destination address is found in the hash
 *                                 table)
 *                              1: Promiscuous mode (Frames are received
 *                                 regardless of their destination address.
 *                                 Errored frames are discarded unless the Port
 *                                 Configuration register's PBF bit is set)
 * 01:01 RBM                    Reject Broadcast Mode
 *                              0: Receive broadcast address
 *                              1: Reject frames with broadcast address
 *                              Overridden by the promiscuous mode.
 * 02:02 PBF                    Pass Bad Frames
 *                              (0: Normal mode, 1: Pass bad Frames)
 *                              The Ethernet receiver passes to the CPU errored
 *                              frames (like fragments and collided packets)
 *                              that are normally rejected.
 *                              NOTE: Frames are only passed if they
 *                                    successfully pass address filtering.
 * 06:03 Reserved
 * 07:07 EN                     Enable (0: Disabled, 1: Enable)
 *                              When enabled, the ethernet port is ready to
 *                              transmit/receive.
 * 09:08 LPBK                   Loop Back Mode
 *                              00: Normal mode
 *                              01: Internal loop back mode (TX data is looped
 *                                  back to the RX lines. No transition is seen
 *                                  on the interface pins)
 *                              10: External loop back mode (TX data is looped
 *                                  back to the RX lines and also transmitted
 *                                  out to the MII interface pins)
 *                              11: Reserved
 * 10:10 FC                     Force Collision
 *                              0: Normal mode.
 *                              1: Force Collision on any TX frame.
 *                                 For RXM test (in Loopback mode).
 * 11:11 Reserved.
 * 12:12 HS                     Hash Size
 *                              0: 8K address filtering
 *                                 (256KB of memory space required).
 *                              1: 512 address filtering
 *                                 ( 16KB of memory space required).
 * 13:13 HM                     Hash Mode (0: Hash Func. 0; 1: Hash Func. 1)
 * 14:14 HDM                    Hash Default Mode
 *                              0: Discard addresses not found in address table
 *                              1: Pass addresses not found in address table
 * 15:15 HD                     Duplex Mode (0: Half Duplex, 1: Full Duplex)
 *                              NOTE: Valid only when auto-negotiation for
 *                                    duplex mode is disabled.
 * 30:16 Reserved
 * 31:31 ACCS                   Accelerate Slot Time
 *                              (0: Normal mode, 1: Reserved)
 */
#define ETH_EPCR_PM             ETH__BIT(0)
#define ETH_EPCR_RBM            ETH__BIT(1)
#define ETH_EPCR_PBF            ETH__BIT(2)
#define ETH_EPCR_EN             ETH__BIT(7)
#define ETH_EPCR_LPBK_GET(v)    ETH__BIT(v, 8, 2)
#define ETH_EPCR_LPBK_Normal    0
#define ETH_EPCR_LPBK_Internal  1
#define ETH_EPCR_LPBK_External  2
#define ETH_EPCR_FC             ETH__BIT(10)

#define ETH_EPCR_HS             ETH__BIT(12)
#define ETH_EPCR_HS_8K          0
#define ETH_EPCR_HS_512         ETH_EPCR_HS

#define ETH_EPCR_HM             ETH__BIT(13)
#define ETH_EPCR_HM_0           0
#define ETH_EPCR_HM_1           ETH_EPCR_HM

#define ETH_EPCR_HDM            ETH__BIT(14)
#define ETH_EPCR_HDM_Discard    0
#define ETH_EPCR_HDM_Pass       ETH_EPCR_HDM

#define ETH_EPCR_HD_Half        0
#define ETH_EPCR_HD_Full        ETH_EPCR_HD_Full

#define ETH_EPCR_ACCS           ETH__BIT(31)



/*
 * Table 598: Port Configuration Extend Register (PCXR)
 * 00:00 IGMP                   IGMP Packets Capture Enable
 *                              0: IGMP packets are treated as normal Multicast
 *                                 packets.
 *                              1: IGMP packets on IPv4/Ipv6 over Ethernet/802.3
 *                                 are trapped and sent to high priority RX
 *                                 queue.
 * 01:01 SPAN                   Spanning Tree Packets Capture Enable
 *                              0: BPDU (Bridge Protocol Data Unit) packets are
 *                                 treated as normal Multicast packets.
 *                              1: BPDU packets are trapped and sent to high
 *                                 priority RX queue.
 * 02:02 PAR                    Partition Enable (0: Normal, 1: Partition)
 *                              When more than 61 collisions occur while
 *                              transmitting, the port enters Partition mode.
 *                              It waits for the first good packet from the
 *                              wire and then goes back to Normal mode.  Under
 *                              Partition mode it continues transmitting, but
 *                              it does not receive.
 * 05:03 PRIOtx                 Priority weight in the round-robin between high
 *                              and low priority TX queues.
 *                              000: 1 pkt from HIGH, 1 pkt from LOW.
 *                              001: 2 pkt from HIGH, 1 pkt from LOW.
 *                              010: 4 pkt from HIGH, 1 pkt from LOW.
 *                              011: 6 pkt from HIGH, 1 pkt from LOW.
 *                              100: 8 pkt from HIGH, 1 pkt from LOW.
 *                              101: 10 pkt from HIGH, 1 pkt from LOW.
 *                              110: 12 pkt from HIGH, 1 pkt from LOW.
 *                              111: All pkt from HIGH, 0 pkt from LOW. LOW is
 *                                   served only if HIGH is empty.
 *                              NOTE: If the HIGH queue is emptied before
 *                                    finishing the count, the count is reset
 *                                    until the next first HIGH comes in.
 * 07:06 PRIOrx                 Default Priority for Packets Received on this
 *                              Port (00: Lowest priority, 11: Highest priority)
 * 08:08 PRIOrx_Override        Override Priority for Packets Received on this
 *                              Port (0: Do not override, 1: Override with
 *                              <PRIOrx> field)
 * 09:09 DPLXen                 Enable Auto-negotiation for Duplex Mode
 *                              (0: Enable, 1: Disable)
 * 11:10 FCTLen                 Enable Auto-negotiation for 802.3x Flow-control
 *                              0: Enable; When enabled, 1 is written (through
 *                                 SMI access) to the PHY's register 4 bit 10
 *                                 to advertise flow-control capability.
 *                              1: Disable; Only enables flow control after the
 *                                 PHY address is set by the CPU. When changing
 *                                 the PHY address the flow control
 *                                 auto-negotiation must be disabled.
 * 11:11 FLP                    Force Link Pass
 *                              (0: Force Link Pass, 1: Do NOT Force Link pass)
 * 12:12 FCTL                   802.3x Flow-Control Mode (0: Enable, 1: Disable)
 *                              NOTE: Only valid when auto negotiation for flow
 *                                    control is disabled.
 * 13:13 Reserved
 * 15:14 MFL                    Max Frame Length
 *                              Maximum packet allowed for reception (including
 *                              CRC):   00: 1518 bytes,   01: 1536 bytes,
 *                                      10: 2048 bytes,   11:  64K bytes
 * 16:16 MIBclrMode             MIB Counters Clear Mode (0: Clear, 1: No effect)
 * 17:17 MIBctrMode             Reserved. (MBZ)
 * 18:18 Speed                  Port Speed (0: 10Mbit/Sec, 1: 100Mbit/Sec)
 *                              NOTE: Only valid if SpeedEn bit is set.
 * 19:19 SpeedEn                Enable Auto-negotiation for Speed
 *                              (0: Enable, 1: Disable)
 * 20:20 RMIIen                 RMII enable
 *                              0: Port functions as MII port
 *                              1: Port functions as RMII port
 * 21:21 DSCPen                 DSCP enable
 *                              0: IP DSCP field decoding is disabled.
 *                              1: IP DSCP field decoding is enabled.
 * 31:22 Reserved
 */
#define ETH_EPCXR_IGMP                  ETH__BIT(0)
#define ETH_EPCXR_SPAN                  ETH__BIT(1)
#define ETH_EPCXR_PAR                   ETH__BIT(2)
#define ETH_EPCXR_PRIOtx_GET(v)         ETH__EXT(v, 3, 3)
#define ETH_EPCXR_PRIOrx_GET(v)         ETH__EXT(v, 3, 3)
#define ETH_EPCXR_PRIOrx_Override       ETH__BIT(8)
#define ETH_EPCXR_DLPXen                ETH__BIT(9)
#define ETH_EPCXR_FCTLen                ETH__BIT(10)
#define ETH_EPCXR_FLP                   ETH__BIT(11)
#define ETH_EPCXR_FCTL                  ETH__BIT(12)
#define ETH_EPCXR_MFL_GET(v)            ETH__EXT(v, 14, 2)
#define ETH_EPCXR_MFL_SET(v)            ((v) << 14)
#define ETH_EPCXR_MFL_MASK              0x3
#define ETH_EPCXR_MFL_1518              0
#define ETH_EPCXR_MFL_1536              1
#define ETH_EPCXR_MFL_2084              2
#define ETH_EPCXR_MFL_64K               3
#define ETH_EPCXR_MIBclrMode            ETH__BIT(16)
#define ETH_EPCXR_MIBctrMode            ETH__BIT(17)
#define ETH_EPCXR_Speed                 ETH__BIT(18)
#define ETH_EPCXR_SpeedEn               ETH__BIT(19)
#define ETH_EPCXR_RMIIEn                ETH__BIT(20)
#define ETH_EPCXR_DSCPEn                ETH__BIT(21)



/*
 * Table 599: Port Command Register (PCMR)
 * 14:00 Reserved
 * 15:15 FJ                     Force Jam / Flow Control
 *                              When in half-duplex mode, the CPU uses this bit
 *                              to force collisions on the Ethernet segment.
 *                              When the CPU recognizes that it is going to run
 *                              out of receive buffers, it can force the
 *                              transmitter to send jam frames, forcing
 *                              collisions on the wire.  To allow transmission
 *                              on the Ethernet segment, the CPU must clear the
 *                              FJ bit when more resources are available.  When
 *                              in full-duplex and flow-control is enabled, this
 *                              bit causes the port's transmitter to send
 *                              flow-control PAUSE packets. The CPU must reset
 *                              this bit when more resources are available.
 * 31:16 Reserved
 */

#define ETH_EPCMR_FJ            ETH__BIT(15)


/*
 * Table 600: Port Status Register (PSR) -- Read Only
 * 00:00 Speed                  Indicates Port Speed (0: 10Mbs, 1: 100Mbs)
 * 01:01 Duplex                 Indicates Port Duplex Mode (0: Half, 1: Full)
 * 02:02 Fctl                   Indicates Flow-control Mode
 *                              (0: enabled, 1: disabled)
 * 03:03 Link                   Indicates Link Status (0: down, 1: up)
 * 04:04 Pause                  Indicates that the port is in flow-control
 *                              disabled state.  This bit is set when an IEEE
 *                              802.3x flow-control PAUSE (XOFF) packet is
 *                              received (assuming that flow-control is
 *                              enabled and the port is in full-duplex mode).
 *                              Reset when XON is received, or when the XOFF
 *                              timer has expired.
 * 05:05 TxLow                  Tx Low Priority Status
 *                              Indicates the status of the low priority
 *                              transmit queue: (0: Stopped, 1: Running)
 * 06:06 TxHigh                 Tx High Priority Status
 *                              Indicates the status of the high priority
 *                              transmit queue: (0: Stopped, 1: Running)
 * 07:07 TXinProg               TX in Progress
 *                              Indicates that the port's transmitter is in an
 *                              active transmission state.
 * 31:08 Reserved
 */
#define ETH_EPSR_Speed          ETH__BIT(0)
#define ETH_EPSR_Duplex         ETH__BIT(1)
#define ETH_EPSR_Fctl           ETH__BIT(2)
#define ETH_EPSR_Link           ETH__BIT(3)
#define ETH_EPSR_Pause          ETH__BIT(4)
#define ETH_EPSR_TxLow          ETH__BIT(5)
#define ETH_EPSR_TxHigh         ETH__BIT(6)
#define ETH_EPSR_TXinProg       ETH__BIT(7)


/*
 * Table 601: Serial Parameters Register (SPR)
 * 01:00 JAM_LENGTH             Two bits to determine the JAM Length
 *                              (in Backpressure) as follows:
 *                                      00 = 12K bit-times
 *                                      01 = 24K bit-times
 *                                      10 = 32K bit-times
 *                                      11 = 48K bit-times
 * 06:02 JAM_IPG                Five bits to determine the JAM IPG.
 *                              The step is four bit-times. The value may vary
 *                              between 4 bit time to 124.
 * 11:07 IPG_JAM_TO_DATA        Five bits to determine the IPG JAM to DATA.
 *                              The step is four bit-times. The value may vary
 *                              between 4 bit time to 124.
 * 16:12 IPG_DATA               Inter-Packet Gap (IPG)
 *                              The step is four bit-times. The value may vary
 *                              between 12 bit time to 124.
 *                              NOTE: These bits may be changed only when the
 *                                    Ethernet ports is disabled.
 * 21:17 Data_Blind             Data Blinder
 *                              The number of nibbles from the beginning of the
 *                              IPG, in which the IPG counter is restarted when
 *                              detecting a carrier activity.  Following this
 *                              value, the port enters the Data Blinder zone and
 *                              does not reset the IPG counter. This ensures
 *                              fair access to the medium.
 *                              The default is 10 hex (64 bit times - 2/3 of the
 *                              default IPG).  The step is 4 bit-times. Valid
 *                              range is 3 to 1F hex nibbles.
 *                              NOTE: These bits may be only changed when the
 *                                    Ethernet port is disabled.
 * 22:22 Limit4                 The number of consecutive packet collisions that
 *                              occur before the collision counter is reset.
 *                                0: The port resets its collision counter after
 *                                   16 consecutive retransmit trials and
 *                                   restarts the Backoff algorithm.
 *                                1: The port resets its collision counter and
 *                                   restarts the Backoff algorithm after 4
 *                                   consecutive transmit trials.
 * 31:23 Reserved
 */
#define ETH_ESPR_JAM_LENGTH_GET(v)      ETH__EXT(v, 0, 2)
#define ETH_ESPR_JAM_IPG_GET(v)         ETH__EXT(v, 2, 5)
#define ETH_ESPR_IPG_JAM_TO_DATA_GET(v) ETH__EXT(v, 7, 5)
#define ETH_ESPR_IPG_DATA_GET(v)        ETH__EXT(v, 12, 5)
#define ETH_ESPR_Data_Bilnd_GET(v)      ETH__EXT(v, 17, 5)
#define ETH_ESPR_Limit4(v)              ETH__BIT(22)

/*
 * Table 602: Hash Table Pointer Register (HTPR)
 * 31:00 HTP                    32-bit pointer to the address table.
 *                              Bits [2:0] must be set to zero.
 */

/*
 * Table 603: Flow Control Source Address Low (FCSAL)
 * 15:0 SA[15:0]                Source Address
 *                              The least significant bits of the source
 *                              address for the port.  This address is used for
 *                              Flow Control.
 * 31:16 Reserved
 */

/*
 * Table 604: Flow Control Source Address High (FCSAH)
 * 31:0 SA[47:16]               Source Address
 *                              The most significant bits of the source address
 *                              for the port.  This address is used for Flow
 *                              Control.
 */


/*
 * Table 605: SDMA Configuration Register (SDCR)
 * 01:00 Reserved
 * 05:02 RC                     Retransmit Count
 *                              Sets the maximum number of retransmits per
 *                              packet.  After executing retransmit for RC
 *                              times, the TX SDMA closes the descriptor with a
 *                              Retransmit Limit error indication and processes
 *                              the next packet.  When RC is set to 0, the
 *                              number of retransmits is unlimited. In this
 *                              case, the retransmit process is only terminated
 *                              if CPU issues an Abort command.
 * 06:06 BLMR                   Big/Little Endian Receive Mode
 *                              The DMA supports Big or Little Endian
 *                              configurations on a per channel basis. The BLMR
 *                              bit only affects data transfer to memory.
 *                                      0: Big Endian
 *                                      1: Little Endian
 * 07:07 BLMT                   Big/Little Endian Transmit Mode
 *                              The DMA supports Big or Little Endian
 *                              configurations on a per channel basis. The BLMT
 *                              bit only affects data transfer from memory.
 *                                      0: Big Endian
 *                                      1: Little Endian
 * 08:08 POVR                   PCI Override
 *                              When set, causes the SDMA to direct all its
 *                              accesses in PCI_0 direction and overrides
 *                              normal address decoding process.
 * 09:09 RIFB                   Receive Interrupt on Frame Boundaries
 *                              When set, the SDMA Rx generates interrupts only
 *                              on frame boundaries (i.e. after writing the
 *                              frame status to the descriptor).
 * 11:10 Reserved
 * 13:12 BSZ                    Burst Size
 *                              Sets the maximum burst size for SDMA
 *                              transactions:
 *                                      00: Burst is limited to 1 64bit words.
 *                                      01: Burst is limited to 2 64bit words.
 *                                      10: Burst is limited to 4 64bit words.
 *                                      11: Burst is limited to 8 64bit words.
 * 31:14 Reserved
 */
#define ETH_ESDCR_RC_GET(v)             ETH__EXT(v, 2, 4)
#define ETH_ESDCR_BLMR                  ETH__BIT(6)
#define ETH_ESDCR_BLMT                  ETH__BIT(7)
#define ETH_ESDCR_POVR                  ETH__BIT(8)
#define ETH_ESDCR_RIFB                  ETH__BIT(9)
#define ETH_ESDCR_BSZ_GET(v)            ETH__EXT(v, 12, 2)
#define ETH_ESDCR_BSZ_SET(v, n)         (ETH__CLR(v, 12, 2),\
                                         (v) |= ETH__INS(n, 12))
#define ETH_ESDCR_BSZ_1                 0
#define ETH_ESDCR_BSZ_2                 1
#define ETH_ESDCR_BSZ_4                 2
#define ETH_ESDCR_BSZ_8                 3

#define ETH_ESDCR_BSZ_Strings           { "1 64-bit word", "2 64-bit words", \
                                          "4 64-bit words", "8 64-bit words" }

/*
 * Table 606: SDMA Command Register (SDCMR)
 * 06:00 Reserved
 * 07:07 ERD                    Enable RX DMA.
 *                              Set to 1 by the CPU to cause the SDMA to start
 *                              a receive process.  Cleared when the CPU issues
 *                              an Abort Receive command.
 * 14:08 Reserved
 * 15:15 AR                     Abort Receive
 *                              Set to 1 by the CPU to abort a receive SDMA
 *                              operation.  When the AR bit is set, the SDMA
 *                              aborts its current operation and moves to IDLE.
 *                              No descriptor is closed.  The AR bit is cleared
 *                              upon entering IDLE.  After setting the AR bit,
 *                              the CPU must poll the bit to verify that the
 *                              abort sequence is completed.
 * 16:16 STDH                   Stop TX High
 *                              Set to 1 by the CPU to stop the transmission
 *                              process from the high priority queue at the end
 *                              of the current frame. An interrupt is generated
 *                              when the stop command has been executed.
 *                                Writing 1 to STDH resets TXDH bit.
 *                                Writing 0 to this bit has no effect.
 * 17:17 STDL                   Stop TX Low
 *                              Set to 1 by the CPU to stop the transmission
 *                              process from the low priority queue at the end
 *                              of the current frame. An interrupt is generated
 *                              when the stop command has been executed.
 *                                Writing 1 to STDL resets TXDL bit.
 *                                Writing 0 to this bit has no effect.
 * 22:18 Reserved
 * 23:23 TXDH                   Start Tx High
 *                              Set to 1 by the CPU to cause the SDMA to fetch
 *                              the first descriptor and start a transmit
 *                              process from the high priority Tx queue.
 *                                Writing 1 to TXDH resets STDH bit.
 *                                Writing 0 to this bit has no effect.
 * 24:24 TXDL                   Start Tx Low
 *                              Set to 1 by the CPU to cause the SDMA to fetch
 *                              the first descriptor and start a transmit
 *                              process from the low priority Tx queue.
 *                                Writing 1 to TXDL resets STDL bit.
 *                                Writing 0 to this bit has no effect.
 * 30:25 Reserved
 * 31:31 AT                     Abort Transmit
 *                              Set to 1 by the CPU to abort a transmit DMA
 *                              operation.  When the AT bit is set, the SDMA
 *                              aborts its current operation and moves to IDLE.
 *                              No descriptor is closed.  Cleared upon entering
 *                              IDLE.  After setting AT bit, the CPU must poll
 *                              it in order to verify that the abort sequence
 *                              is completed.
 */
#define ETH_ESDCMR_ERD                  ETH__BIT(7)
#define ETH_ESDCMR_AR                   ETH__BIT(15)
#define ETH_ESDCMR_STDH                 ETH__BIT(16)
#define ETH_ESDCMR_STDL                 ETH__BIT(17)
#define ETH_ESDCMR_TXDH                 ETH__BIT(23)
#define ETH_ESDCMR_TXDL                 ETH__BIT(24)
#define ETH_ESDCMR_AT                   ETH__BIT(31)

/*
 * Table 607: Interrupt Cause Register (ICR)
 * 00:00 RxBuffer               Rx Buffer Return
 *                              Indicates an Rx buffer returned to CPU ownership
 *                              or that the port finished reception of a Rx
 *                              frame in either priority queues.
 *                              NOTE: In order to get a Rx Buffer return per
 *                                    priority queue, use bit 19:16. This bit is
 *                                    set upon closing any Rx descriptor which
 *                                    has its EI bit set. To limit the
 *                                    interrupts to frame (rather than buffer)
 *                                    boundaries, the user must set SDMA
 *                                    Configuration register's RIFB bit. When
 *                                    the RIFB bit is set, an interrupt
 *                                    generates only upon closing the first
 *                                    descriptor of a received packet, if this
 *                                    descriptor has it EI bit set.
 * 01:01 Reserved
 * 02:02 TxBufferHigh           Tx Buffer for High priority Queue
 *                              Indicates a Tx buffer returned to CPU ownership
 *                              or that the port finished transmission of a Tx
 *                              frame.
 *                              NOTE: This bit is set upon closing any Tx
 *                                    descriptor which has its EI bit set. To
 *                                    limit the interrupts to frame (rather than
 *                                    buffer) boundaries, the user must set EI
 *                                    only in the last descriptor.
 * 03:03 TxBufferLow            Tx Buffer for Low Priority Queue
 *                              Indicates a Tx buffer returned to CPU ownership
 *                              or that the port finished transmission of a Tx
 *                              frame.
 *                              NOTE: This bit is set upon closing any Tx
 *                                    descriptor which has its EI bit set. To
 *                                    limit the interrupts to frame (rather than
 *                                    buffer) boundaries, the user must set EI
 *                                    only in the last descriptor.
 * 05:04 Reserved
 * 06:06 TxEndHigh              Tx End for High Priority Queue
 *                              Indicates that the Tx DMA stopped processing the
 *                              high priority queue after stop command, or that
 *                              it reached the end of the high priority
 *                              descriptor chain.
 * 07:07 TxEndLow               Tx End for Low Priority Queue
 *                              Indicates that the Tx DMA stopped processing the
 *                              low priority queue after stop command, or that
 *                              it reached the end of the low priority
 *                              descriptor chain.
 * 08:08 RxError                Rx Resource Error
 *                              Indicates a Rx resource error event in one of
 *                              the priority queues.
 *                              NOTE: To get a Rx Resource Error Indication per
 *                                    priority queue, use bit 23:20.
 * 09:09 Reserved
 * 10:10 TxErrorHigh            Tx Resource Error for High Priority Queue
 *                              Indicates a Tx resource error event during
 *                              packet transmission from the high priority queue
 * 11:11 TxErrorLow             Tx Resource Error for Low Priority Queue
 *                              Indicates a Tx resource error event during
 *                              packet transmission from the low priority queue
 * 12:12 RxOVR                  Rx Overrun
 *                              Indicates an overrun event that occurred during
 *                              reception of a packet.
 * 13:13 TxUdr                  Tx Underrun
 *                              Indicates an underrun event that occurred during
 *                              transmission of packet from either queue.
 * 15:14 Reserved
 * 16:16 RxBuffer-Queue[0]      Rx Buffer Return in Priority Queue[0]
 *                              Indicates a Rx buffer returned to CPU ownership
 *                              or that the port completed reception of a Rx
 *                              frame in a receive priority queue[0]
 * 17:17 RxBuffer-Queue[1]      Rx Buffer Return in Priority Queue[1]
 *                              Indicates a Rx buffer returned to CPU ownership
 *                              or that the port completed reception of a Rx
 *                              frame in a receive priority queue[1].
 * 18:18 RxBuffer-Queue[2]      Rx Buffer Return in Priority Queue[2]
 *                              Indicates a Rx buffer returned to CPU ownership
 *                              or that the port completed reception of a Rx
 *                              frame in a receive priority queue[2].
 * 19:19 RxBuffer-Queue[3]      Rx Buffer Return in Priority Queue[3]
 *                              Indicates a Rx buffer returned to CPU ownership
 *                              or that the port completed reception of a Rx
 *                              frame in a receive priority queue[3].
 * 20:20 RxError-Queue[0]       Rx Resource Error in Priority Queue[0]
 *                              Indicates a Rx resource error event in receive
 *                              priority queue[0].
 * 21:21 RxError-Queue[1]       Rx Resource Error in Priority Queue[1]
 *                              Indicates a Rx resource error event in receive
 *                              priority queue[1].
 * 22:22 RxError-Queue[2]       Rx Resource Error in Priority Queue[2]
 *                              Indicates a Rx resource error event in receive
 *                              priority queue[2].
 * 23:23 RxError-Queue[3]       Rx Resource Error in Priority Queue[3]
 *                              Indicates a Rx resource error event in receive
 *                              priority queue[3].
 * 27:24 Reserved
 * 28:29 MIIPhySTC              MII PHY Status Change
 *                              Indicates a status change reported by the PHY
 *                              connected to this port.  Set when the MII
 *                              management interface block identifies a change
 *                              in PHY's register 1.
 * 29:29 SMIdone                SMI Command Done
 *                              Indicates that the SMI completed a MII
 *                              management command (either read or write) that
 *                              was initiated by the CPU writing to the SMI
 *                              register.
 * 30:30 Reserved
 * 31:31 EtherIntSum            Ethernet Interrupt Summary
 *                              This bit is a logical OR of the (unmasked) bits
 *                              [30:04] in the Interrupt Cause register.
 */

#define ETH_IR_RxBuffer         ETH__BIT(0)
#define ETH_IR_TxBufferHigh     ETH__BIT(2)
#define ETH_IR_TxBufferLow      ETH__BIT(3)
#define ETH_IR_TxEndHigh        ETH__BIT(6)
#define ETH_IR_TxEndLow         ETH__BIT(7)
#define ETH_IR_RxError          ETH__BIT(8)
#define ETH_IR_TxErrorHigh      ETH__BIT(10)
#define ETH_IR_TxErrorLow       ETH__BIT(11)
#define ETH_IR_RxOVR            ETH__BIT(12)
#define ETH_IR_TxUdr            ETH__BIT(13)
#define ETH_IR_RxBuffer_0       ETH__BIT(16)
#define ETH_IR_RxBuffer_1       ETH__BIT(17)
#define ETH_IR_RxBuffer_2       ETH__BIT(18)
#define ETH_IR_RxBuffer_3       ETH__BIT(19)
#define ETH_IR_RxBuffer_GET(v)  ETH__EXT(v, 16, 4)
#define ETH_IR_RxError_0        ETH__BIT(20)
#define ETH_IR_RxError_1        ETH__BIT(21)
#define ETH_IR_RxError_2        ETH__BIT(22)
#define ETH_IR_RxError_3        ETH__BIT(23)
#define ETH_IR_RxError_GET(v)   ETH__EXT(v, 20, 4)
#define ETH_IR_RxBits           (ETH_IR_RxBuffer_0|\
                                 ETH_IR_RxBuffer_1|\
                                 ETH_IR_RxBuffer_2|\
                                 ETH_IR_RxBuffer_3|\
                                 ETH_IR_RxError_0|\
                                 ETH_IR_RxError_1|\
                                 ETH_IR_RxError_2|\
                                 ETH_IR_RxError_3)
#define ETH_IR_MIIPhySTC        ETH__BIT(28)
#define ETH_IR_SMIdone          ETH__BIT(29)
#define ETH_IR_EtherIntSum      ETH__BIT(31)
#define ETH_IR_Summary          ETH__BIT(31)

/*
 * Table 608: Interrupt Mask Register (IMR)
 * 31:00 Various                Mask bits for the Interrupt Cause register.
 */

/*
 * Table 609: IP Differentiated Services CodePoint to Priority0 low (DSCP2P0L),
 * 31:00 Priority0_low          The LSB priority bits for DSCP[31:0] entries.
 */

/*
 * Table 610: IP Differentiated Services CodePoint to Priority0 high (DSCP2P0H)
 * 31:00 Priority0_high         The LSB priority bits for DSCP[63:32] entries.
 */

/*
 * Table 611: IP Differentiated Services CodePoint to Priority1 low (DSCP2P1L)
 * 31:00 Priority1_low          The MSB priority bits for DSCP[31:0] entries.
 */

/*
 * Table 612: IP Differentiated Services CodePoint to Priority1 high (DSCP2P1H)
 * 31:00 Priority1_high         The MSB priority bit for DSCP[63:32] entries.
 */

/*
 * Table 613: VLAN Priority Tag to Priority (VPT2P)
 * 07:00 Priority0              The LSB priority bits for VLAN Priority[7:0]
 *                              entries.
 * 15:08 Priority1              The MSB priority bits for VLAN Priority[7:0]
 *                              entries.
 * 31:16 Reserved
 */
#endif /* _DEV_GTETHREG_H_ */