blob: 37f5a43bcc6046ad984513c29ffbc0629112f79b [file] [log] [blame]
/*
* Copyright (c) 2012 - 2013, 2016 The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
* only version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#ifndef _IPQ_GMAC_H
#define _IPQ_GMAC_H
#include <common.h>
#include <net.h>
#include <configs/ipq806x.h>
#define CONFIG_MACRESET_TIMEOUT (3 * CONFIG_SYS_HZ)
#define CONFIG_MDIO_TIMEOUT (3 * CONFIG_SYS_HZ)
#define CONFIG_PHYRESET_TIMEOUT (3 * CONFIG_SYS_HZ)
#define CONFIG_AUTONEG_TIMEOUT (5 * CONFIG_SYS_HZ)
/* MAC configuration register definitions */
#define FRAMEBURSTENABLE (1 << 21)
#define MII_PORTSELECT (1 << 15)
#define FES_100 (1 << 14)
#define DISABLERXOWN (1 << 13)
#define FULLDPLXMODE (1 << 11)
#define RXENABLE (1 << 2)
#define TXENABLE (1 << 3)
#define DW_DMA_BASE_OFFSET (0x1000)
/* Poll demand definitions */
#define POLL_DATA (0x0)
/* Descriptior related definitions */
#define MAC_MAX_FRAME_SZ (1600)
/*
* txrx_status definitions
*/
/* tx status bits definitions */
#define DESC_TXSTS_OWNBYDMA (1 << 31)
#define DESC_TXSTS_TXINT (1 << 30)
#define DESC_TXSTS_TXLAST (1 << 29)
#define DESC_TXSTS_TXFIRST (1 << 28)
#define DESC_TXSTS_TXCRCDIS (1 << 27)
#define DESC_TXSTS_TXPADDIS (1 << 26)
#define DESC_TXSTS_TXCHECKINSCTRL (3 << 22)
#define DESC_TXSTS_TXRINGEND (1 << 21)
#define DESC_TXSTS_TXCHAIN (1 << 20)
#define DESC_TXSTS_MSK (0x1FFFF << 0)
/* rx status bits definitions */
#define DESC_RXSTS_OWNBYDMA (1 << 31)
#define DESC_RXSTS_DAFILTERFAIL (1 << 30)
#define DESC_RXSTS_FRMLENMSK (0x3FFF << 16)
#define DESC_RXSTS_FRMLENSHFT (16)
#define DESC_RXSTS_ERROR (1 << 15)
#define DESC_RXSTS_RXTRUNCATED (1 << 14)
#define DESC_RXSTS_SAFILTERFAIL (1 << 13)
#define DESC_RXSTS_RXIPC_GIANTFRAME (1 << 12)
#define DESC_RXSTS_RXDAMAGED (1 << 11)
#define DESC_RXSTS_RXVLANTAG (1 << 10)
#define DESC_RXSTS_RXFIRST (1 << 9)
#define DESC_RXSTS_RXLAST (1 << 8)
#define DESC_RXSTS_RXIPC_GIANT (1 << 7)
#define DESC_RXSTS_RXCOLLISION (1 << 6)
#define DESC_RXSTS_RXFRAMEETHER (1 << 5)
#define DESC_RXSTS_RXWATCHDOG (1 << 4)
#define DESC_RXSTS_RXMIIERROR (1 << 3)
#define DESC_RXSTS_RXDRIBBLING (1 << 2)
#define DESC_RXSTS_RXCRC (1 << 1)
/*
* dmamac_cntl definitions
*/
/* tx control bits definitions */
#if defined(CONFIG_DW_ALTDESCRIPTOR)
#define DESC_TXCTRL_SIZE1MASK (0x1FFF << 0)
#define DESC_TXCTRL_SIZE1SHFT (0)
#define DESC_TXCTRL_SIZE2MASK (0x1FFF << 16)
#define DESC_TXCTRL_SIZE2SHFT (16)
#else
#define DESC_TXCTRL_TXINT (1 << 31)
#define DESC_TXCTRL_TXLAST (1 << 30)
#define DESC_TXCTRL_TXFIRST (1 << 29)
#define DESC_TXCTRL_TXCHECKINSCTRL (3 << 27)
#define DESC_TXCTRL_TXCRCDIS (1 << 26)
#define DESC_TXCTRL_TXRINGEND (1 << 25)
#define DESC_TXCTRL_TXCHAIN (1 << 24)
#define DESC_TXCTRL_SIZE1MASK (0x7FF << 0)
#define DESC_TXCTRL_SIZE1SHFT (0)
#define DESC_TXCTRL_SIZE2MASK (0x7FF << 11)
#define DESC_TXCTRL_SIZE2SHFT (11)
#endif
/* rx control bits definitions */
#if defined(CONFIG_DW_ALTDESCRIPTOR)
#define DESC_RXCTRL_RXINTDIS (1 << 31)
#define DESC_RXCTRL_RXRINGEND (1 << 15)
#define DESC_RXCTRL_RXCHAIN (1 << 14)
#define DESC_RXCTRL_SIZE1MASK (0x1FFF << 0)
#define DESC_RXCTRL_SIZE1SHFT (0)
#define DESC_RXCTRL_SIZE2MASK (0x1FFF << 16)
#define DESC_RXCTRL_SIZE2SHFT (16)
#else
#define DESC_RXCTRL_RXINTDIS (1 << 31)
#define DESC_RXCTRL_RXRINGEND (1 << 25)
#define DESC_RXCTRL_RXCHAIN (1 << 24)
#define DESC_RXCTRL_SIZE1MASK (0x7FF << 0)
#define DESC_RXCTRL_SIZE1SHFT (0)
#define DESC_RXCTRL_SIZE2MASK (0x7FF << 11)
#define DESC_RXCTRL_SIZE2SHFT (11)
#endif
/* Speed specific definitions */
#define NETDEV_TX_BUSY (1)
/* Duplex mode specific definitions */
#define HALF_DUPLEX (1)
#define FULL_DUPLEX (2)
/* Bus mode register definitions */
#define FIXEDBURST (1 << 16)
#define PRIORXTX_41 (3 << 14)
#define PRIORXTX_31 (2 << 14)
#define PRIORXTX_21 (1 << 14)
#define PRIORXTX_11 (0 << 14)
#define BURST_1 (1 << 8)
#define BURST_2 (2 << 8)
#define BURST_4 (4 << 8)
#define BURST_8 (8 << 8)
#define BURST_16 (16 << 8)
#define BURST_32 (32 << 8)
#define RXHIGHPRIO (1 << 1)
#define DMAMAC_SRST (1 << 0)
#define DMA_ARB (1 << 1)
#define DESC_SKIP_LEN_0 (0 << 2)
#define DMA_INT_DISABLE (0 << 0)
/* Operation mode definitions */
#define STOREFORWARD (1 << 21)
#define FLUSHTXFIFO (1 << 20)
#define TXSTART (1 << 13)
#define TXSECONDFRAME (1 << 2)
#define RXSTART (1 << 1)
#define RX_THRESHOLD_128 (3 << 3)
#define OP_SECOND_FRAME (1 << 2)
/* GMAC config definitions */
#define MII_PORT_SELECT (1 << 15)
#define GMII_PORT_SELECT (0 << 15)
#define FRAME_BURST_ENABLE (1 << 21)
#define JUMBO_FRAME_ENABLE (1 << 20)
#define HALF_DUPLEX_ENABLE (0 << 11)
#define FULL_DUPLEX_ENABLE (1 << 11)
#define TX_ENABLE (1 << 3)
#define RX_ENABLE (1 << 2)
#define RX_IPC_OFFLOAD (1 << 10)
/* GMAC Fram filter definitions */
#define GMAC_FRAME_RX_ALL (1 << 31)
#define PROMISCUOUS_MODE_ON (1 << 0)
#define DISABLE_BCAST_FRAMES (1 << 5)
/* DMA Flow control definitions */
#define FULL_3KB (1 << 10)
#define HW_FLW_CNTL_ENABLE (1 << 8)
/* GMAC Flow control definitions */
#define RX_FLW_CNTL_ENABLE (1 << 2)
#define TX_FLW_CNTL_ENABLE (1 << 1)
/* Descriptor definitions */
#define TX_END_OF_RING (1 << 21)
#define RX_END_OF_RING (1 << 15)
#define NO_OF_TX_DESC 8
#define NO_OF_RX_DESC PKTBUFSRX
#define MAX_WAIT 1000
#define CACHE_LINE_SIZE (CONFIG_SYS_CACHELINE_SIZE)
#define VLAN_ETH_FRAME_LEN 1518
#define ETH_ZLEN 60
#define ETH_HLEN 12
#define ETH_FCS_LEN 4
#define VLAN_HLEN 4
#define NET_IP_ALIGN 2
#define ETHERNET_EXTRA (NET_IP_ALIGN + 2 * CACHE_LINE_SIZE)
#define ETH_MAX_FRAME_LEN (VLAN_ETH_FRAME_LEN + \
ETH_FCS_LEN + \
((4 - NET_IP_ALIGN) & 0x3))
/* QSGMII PHY bit definitions */
#define QSGMII_PHY_SRDS_PLL_ICP_600UA (6 << 28)
#define QSGMII_PHY_SRDS_PLL_AMP (2 << 24)
#define QSGMII_PHY_SRDS_RSV (16 << 16)
#define QSGMII_PHY_SRDS_EN_LCKDT (1 << 1)
#define QSGMII_PHY_SRDS_EN_PLL (1 << 2)
#define QSGMII_PHY_SRDS_PLL_LPFR (4 << 4)
#define QSGMII_PHY_QSGMII_TXDRV (12 << 28)
#define QSGMII_PHY_QSGMII_SLC (2 << 26)
#define QSGMII_PHY_QSGMII_RXPI_SLC (2 << 22)
#define QSGMII_PHY_QSGMII_RXEQ (1 << 20)
#define QSGMII_PHY_QSGMII_RXCOM (2 << 18)
#define QSGMII_PHY_QDGMII_PGAIN(x) (x << 12)
#define QSGMII_PHY_QSGMII_DEEMP (2 << 10)
#define QSGMII_PHY_QSGMII_TXPI_SLC (2 << 8)
#define QSGMII_PHY_QSGMII_EN_SGMII (1 << 7)
#define QSGMII_PHY_QSGMII_EN_TX (1 << 3)
#define QSGMII_PHY_QSGMII_EN_SD (1 << 2)
#define QSGMII_PHY_QSGMII_EN_RX (1 << 1)
#define QSGMII_PHY_QSGMII_EN_CDR (1 << 0)
#define QSGMII_PHY_CDR_EN (1 << 0)
#define QSGMII_PHY_RX_FRONT_EN (1 << 1)
#define QSGMII_PHY_RX_SIGNAL_DETECT_EN (1 << 2)
#define QSGMII_PHY_TX_DRIVER_EN (1 << 3)
#define QSGMII_PHY_QSGMII_EN (1 << 7)
#define QSGMII_PHY_DEEMPHASIS_LVL (2 << 10)
#define QSGMII_PHY_PHASE_LOOP_GAIN (2 << 12)
#define QSGMII_PHY_RX_DC_BIAS (2 << 18)
#define QSGMII_PHY_RX_INPUT_EQU (1 << 20)
#define QSGMII_PHY_CDR_PI_SLEW (2 << 22)
#define QSGMII_PHY_TX_SLEW (2 << 26)
#define QSGMII_PHY_TX_DRV_AMP (12 << 28)
/* NSS_RESET_SPARE bit definitions */
#define NSS_RESET_ALL 0x1FFFFFFF
#define SRDS_N_RESET_CLR (1 << 28)
#define CAL_PRBS_RST_N_RESET_CLR (1 << 26)
#define LCKDT_RST_N_RESET_CLR (1 << 27)
#define PCS_CH_SPEED_FORCE_OUTSIDE 8
#define PCS_CHn_SPEED_FORCE_OUTSIDE(n) (PCS_CH_SPEED_FORCE_OUTSIDE << \
(n * 4))
/* PCS channel bit definitions */
#define PCS_DEBUG_SELECT 0xF0000000
#define PCS_CH0_FORCE_SPEED 2
#define PCS_CHn_FORCE_SPEED(n) (PCS_CH0_FORCE_SPEED << (n * 4))
#define PCS_CH0_SPEED_MASK 0xC
#define PCS_CHn_SPEED_MASK(n) (PCS_CH0_SPEED_MASK << (n * 4))
#define PCS_CH_SPEED_10 0x0
#define PCS_CH_SPEED_100 0x4
#define PCS_CH_SPEED_1000 0x8
#define PCS_CHn_SPEED(ch, speed) (speed << (ch * 4))
#define PCS_CHn_ANEG_EN(ch) (1 << ((ch * 8) + 7))
#define PCS_CHn_ANEG_DISABLE(ch) (~PCS_CHn_ANEG_EN(ch))
#define PCS_SGMII_MAC 2
#define PCS_CH0_SD_SERDES (1 << 16)
#define PCS_CH1_SD_SERDES (1 << 17)
#define PCS_CH2_SD_SERDES (1 << 18)
#define PCS_CH3_SD_SERDES (1 << 19)
#define PHY_SPEED_DUPLEX_RESOLVED_MASK 1
#define PHY_SPEED_DUPLEX_RESOLVED_SHIFT 11
#define PHY_SPEED_MASK 3
#define PHY_SPEED_SHIFT 14
#define PHY_DUPLEX_SHIFT 13
#define PHY_DUPLEX_MASK 1
#define SPEED_1000M 2
#define SPEED_100M 1
#define SPEED_10M 0
/* PHY addr for 8033 Port */
#define GMAC_8033_PORT0 0x6
#define GMAC_8033_PORT1 0x7
#define NSS_ETH_CLK_DIV(clk_div, mac_unit) (clk_div << (mac_unit * 8))
#define NSS_ETH_CLK_DIV_SHIFT 16
#define NSS_ETH_CLK_DIV_MASK 0x7F
#define CLK_DIV_SGMII_100M (CLK_DIV_QSGMII_100M / 2)
#define CLK_DIV_SGMII_1000M (CLK_DIV_QSGMII_1000M / 2)
#define CLK_DIV_SGMII_10M (CLK_DIV_QSGMII_10M / 2)
#define CLK_DIV_QSGMII_100M 10
#define CLK_DIV_QSGMII_1000M 2
#define CLK_DIV_QSGMII_10M 100
#define CLK_DIV_SHIFT 8
#define MAC_CFG_DUPLEX_SHIFT 11
#define GMAC_UNIT0 0
#define GMAC_UNIT1 1
#define GMAC_UNIT2 2
#define GMAC_UNIT3 3
/* Bit definitions for PCS_QSGMII_CTL register */
#define PCS_QSGMII_SW_VER_1_7 0x2
#define PCS_QSGMII_CUTTHROUGH_RX 0x8
#define PCS_QSGMII_CUTTHROUGH_TX 0x4
#define PCS_QSGMII_SW_VER_1_7 0x2
#define PCS_QSGMII_ATHR_CSCO_AUTONEG 0x1
#define PCS_QSGMII_SHORT_LATENCY 0x20
#define PCS_QSGMII_SHORT_THRESH 0x10
#define PCS_QSGMII_DEPTH_THRESH(n) (n << 8)
#define PCS_CH0_SERDES_SN_DETECT 0x800
#define PCS_CHn_SERDES_SN_DETECT(n) (PCS_CH0_SERDES_SN_DETECT << n)
#define PCS_CH0_SERDES_SN_DETECT_2 0x10000
#define PCS_CHn_SERDES_SN_DETECT_2(n) (PCS_CH0_SERDES_SN_DETECT_2 << n)
#define PCS_QSGMII_MAC_LINK(stat, macn) (((stat) >> \
(macn * 8)) & 1)
#define PCS_QSGMII_MAC_SPEED(stat,macn) (((stat) >> \
((macn * 8) + 2)) & 3)
#define PCS_QSGMII_MAC_DUPLEX(stat,macn) (((stat) >> \
((macn * 8) + 1)) & 1)
#define NSS_ETH_GMAC_PHY_INTF_SEL (0 << 16)
#define NSS_ETH_GMAC_PHY_IFG_LIMIT (12 << 8)
#define NSS_ETH_GMAC_PHY_IFG 12
#define MACSEC_BYPASS_EXT_EN 0x7
#define phy_reg_read(base, addr, reg) \
ipq_mdio_read(addr, reg, NULL)
#define phy_reg_write(base, addr, reg, data) \
ipq_mdio_write(addr, reg, data)
#define MII_BUSY (1 << 0)
#define MII_WRITE (1 << 1)
#define MII_CLKRANGE_60_100M (0)
#define MII_CLKRANGE_100_150M (0x4)
#define MII_CLKRANGE_20_35M (0x8)
#define MII_CLKRANGE_35_60M (0xC)
#define MII_CLKRANGE_150_250M (0x10)
#define MII_CLKRANGE_250_300M (0x14)
#define MII_DATA_REG_ADDR (0x14)
#define MII_ADDR_REG_ADDR (0x10)
#define MII_MDIO_TIMEOUT (10000)
#define MIIADDRSHIFT (11)
#define MIIREGSHIFT (6)
#define MII_REGMSK (0x1F << 6)
#define MII_ADDRMSK (0x1F << 11)
#define MII_PHY_STAT_SHIFT (10)
#define AUTO_NEG_ENABLE (1 << 12)
#define FORCE_RATE_10 (0 << 13) | (1 << 15) | (1 << 8)
#define FORCE_RATE_100 (1 << 13) | (1 << 15) | (1 << 8)
#define BMCR_RESET 0x8000
typedef struct
{
volatile u32 status; /* Status */
volatile u32 length; /* Buffer 1 and Buffer 2 length */
volatile u32 buffer1; /* Network Buffer 1 pointer (Dma-able) */
volatile u32 data1; /* This holds virtual address of buffer1, not used by DMA */
/* Following is used only by driver */
volatile u32 extstatus; /* Extended status of a Rx Descriptor */
volatile u32 reserved1; /* Reserved word */
volatile u32 timestamplow; /* Lower 32 bits of the 64 bit timestamp value */
volatile u32 timestamphigh; /* Higher 32 bits of the 64 bit timestamp value */
} ipq_gmac_desc_t ;
struct ipq_forced_mode {
u32 speed;
u32 phy_addr;
u8 miiwrite_done;
u8 gmac_port;
u8 is_forced;
};
struct bitbang_nodes {
int mdio;
int mdc;
} __attribute__ ((aligned(8)));
struct ipq_eth_dev {
u8 *phy_address;
uint no_of_phys;
uint interface;
uint speed;
uint duplex;
uint phy_configured;
uint mac_unit;
uint mac_ps;
int link_printed;
u32 padding;
ipq_gmac_desc_t *desc_tx[NO_OF_TX_DESC];
ipq_gmac_desc_t *desc_rx[NO_OF_RX_DESC];
uint next_tx;
uint next_rx;
int txdesc_count;
int rxdesc_count;
struct eth_mac_regs *mac_regs_p;
struct eth_dma_regs *dma_regs_p;
struct eth_device *dev;
const char phy_name[MDIO_NAME_LEN];
struct ipq_forced_mode *forced_params;
ipq_gmac_board_cfg_t *gmac_board_cfg;
} __attribute__ ((aligned(8)));
struct eth_mac_regs {
u32 conf; /* 0x00 */
u32 framefilt; /* 0x04 */
u32 hashtablehigh; /* 0x08 */
u32 hashtablelow; /* 0x0c */
u32 miiaddr; /* 0x10 */
u32 miidata; /* 0x14 */
u32 flowcontrol; /* 0x18 */
u32 vlantag; /* 0x1c */
u32 version; /* 0x20 */
u8 reserved_1[20]; /* 0x24 -- 0x37 */
u32 intreg; /* 0x38 */
u32 intmask; /* 0x3c */
u32 macaddr0hi; /* 0x40 */
u32 macaddr0lo; /* 0x44 */
};
struct eth_dma_regs {
u32 busmode; /* 0x00 */
u32 txpolldemand; /* 0x04 */
u32 rxpolldemand; /* 0x08 */
u32 rxdesclistaddr; /* 0x0c */
u32 txdesclistaddr; /* 0x10 */
u32 status; /* 0x14 */
u32 opmode; /* 0x18 */
u32 intenable; /* 0x1c */
u8 reserved[40]; /* 0x20 -- 0x47 */
u32 currhosttxdesc; /* 0x48 */
u32 currhostrxdesc; /* 0x4c */
u32 currhosttxbuffaddr; /* 0x50 */
u32 currhostrxbuffaddr; /* 0x54 */
};
void athrs17_reg_init(ipq_gmac_board_cfg_t *);
void gmac_reset(void);
void gmacsec_reset(void);
enum DmaDescriptorStatus { /* status word of DMA descriptor */
DescOwnByDma = 0x80000000, /* (OWN)Descriptor is owned by DMA engine 31 RW */
DescDAFilterFail = 0x40000000, /* (AFM)Rx - DA Filter Fail for the rx frame 30 */
DescFrameLengthMask = 0x3FFF0000, /* (FL)Receive descriptor frame length 29:16 */
DescFrameLengthShift = 16,
DescError = 0x00008000, /* (ES)Error summary bit - OR of the follo. bits: 15 */
/* DE || OE || IPC || LC || RWT || RE || CE */
DescRxTruncated = 0x00004000, /* (DE)Rx - no more descriptors for receive frame 14 */
DescSAFilterFail = 0x00002000, /* (SAF)Rx - SA Filter Fail for the received frame 13 */
DescRxLengthError = 0x00001000, /* (LE)Rx - frm size not matching with len field 12 */
DescRxDamaged = 0x00000800, /* (OE)Rx - frm was damaged due to buffer overflow 11 */
DescRxVLANTag = 0x00000400, /* (VLAN)Rx - received frame is a VLAN frame 10 */
DescRxFirst = 0x00000200, /* (FS)Rx - first descriptor of the frame 9 */
DescRxLast = 0x00000100, /* (LS)Rx - last descriptor of the frame 8 */
DescRxLongFrame = 0x00000080, /* (Giant Frame)Rx - frame is longer than 1518/1522 7 */
DescRxCollision = 0x00000040, /* (LC)Rx - late collision occurred during reception 6 */
DescRxFrameEther = 0x00000020, /* (FT)Rx - Frame type - Ethernet, otherwise 802.3 5 */
DescRxWatchdog = 0x00000010, /* (RWT)Rx - watchdog timer expired during reception 4 */
DescRxMiiError = 0x00000008, /* (RE)Rx - error reported by MII interface 3 */
DescRxDribbling = 0x00000004, /* (DE)Rx - frame contains non int multiple of 8 bits 2 */
DescRxCrc = 0x00000002, /* (CE)Rx - CRC error 1 */
DescRxEXTsts = 0x00000001, /* Extended Status Available (RDES4) 0 */
DescTxIntEnable = 0x40000000, /* (IC)Tx - interrupt on completion 30 */
DescTxLast = 0x20000000, /* (LS)Tx - Last segment of the frame 29 */
DescTxFirst = 0x10000000, /* (FS)Tx - First segment of the frame 28 */
DescTxDisableCrc = 0x08000000, /* (DC)Tx - Add CRC disabled (first segment only) 27 */
DescTxDisablePadd = 0x04000000, /* (DP)disable padding, added by - reyaz 26 */
DescTxCisMask = 0x00c00000, /* Tx checksum offloading control mask 23:22 */
DescTxCisBypass = 0x00000000, /* Checksum bypass */
DescTxCisIpv4HdrCs = 0x00400000, /* IPv4 header checksum */
DescTxCisTcpOnlyCs = 0x00800000, /* TCP/UDP/ICMP checksum. Pseudo header checksum is assumed to be present*/
DescTxCisTcpPseudoCs = 0x00c00000, /* TCP/UDP/ICMP checksum fully in hardware including pseudo header */
TxDescEndOfRing = 0x00200000, /* (TER)End of descriptors ring 21 */
TxDescChain = 0x00100000, /* (TCH)Second buffer address is chain address 20 */
DescRxChkBit0 = 0x00000001, /* () Rx - Rx Payload Checksum Error 0 */
DescRxChkBit7 = 0x00000080, /* (IPC CS ERROR)Rx - Ipv4 header checksum error 7 */
DescRxChkBit5 = 0x00000020, /* (FT)Rx - Frame type - Ethernet, otherwise 802.3 5 */
DescRxTSavail = 0x00000080, /* Time stamp available 7 */
DescRxFrameType = 0x00000020, /* (FT)Rx - Frame type - Ethernet, otherwise 802.3 5 */
DescTxIpv4ChkError = 0x00010000, /* (IHE) Tx Ip header error 16 */
DescTxTimeout = 0x00004000, /* (JT)Tx - Transmit jabber timeout 14 */
DescTxFrameFlushed = 0x00002000, /* (FF)Tx - DMA/MTL flushed the frame due to SW flush 13 */
DescTxPayChkError = 0x00001000, /* (PCE) Tx Payload checksum Error 12 */
DescTxLostCarrier = 0x00000800, /* (LC)Tx - carrier lost during tramsmission 11 */
DescTxNoCarrier = 0x00000400, /* (NC)Tx - no carrier signal from the tranceiver 10 */
DescTxLateCollision = 0x00000200, /* (LC)Tx - transmission aborted due to collision 9 */
DescTxExcCollisions = 0x00000100, /* (EC)Tx - transmission aborted after 16 collisions 8 */
DescTxVLANFrame = 0x00000080, /* (VF)Tx - VLAN-type frame 7 */
DescTxCollMask = 0x00000078, /* (CC)Tx - Collision count 6:3 */
DescTxCollShift = 3,
DescTxExcDeferral = 0x00000004, /* (ED)Tx - excessive deferral 2 */
DescTxUnderflow = 0x00000002, /* (UF)Tx - late data arrival from the memory 1 */
DescTxDeferred = 0x00000001, /* (DB)Tx - frame transmision deferred 0 */
/*
* This explains the RDES1/TDES1 bits layout
* ------------------------------------------------------------------------
* RDES1/TDES1 | Control Bits | Byte Count Buffer 2 | Byte Count Buffer 1 |
* ------------------------------------------------------------------------
*/
/* DmaDescriptorLength length word of DMA descriptor */
RxDisIntCompl = 0x80000000, /* (Disable Rx int on completion) 31 */
RxDescEndOfRing = 0x00008000, /* (TER)End of descriptors ring 15 */
RxDescChain = 0x00004000, /* (TCH)Second buffer address is chain address 14 */
/* DescSize2Mask = 0x1FFF0000, */ /* (TBS2) Buffer 2 size 28:16 */
/* DescSize2Shift = 16, */
DescSize1Mask = 0x00001FFF, /* (TBS1) Buffer 1 size 12:0 */
DescSize1Shift = 0,
/*
* This explains the RDES4 Extended Status bits layout
* ----------------------------------------------------------------------
* RDES4 | Extended Status |
* ----------------------------------------------------------------------
*/
DescRxPtpAvail = 0x00004000, /* PTP snapshot available 14 */
DescRxPtpVer = 0x00002000, /* When set indicates IEEE1584 Version 2 (else Ver1) 13 */
DescRxPtpFrameType = 0x00001000, /* PTP frame type Indicates PTP sent over ethernet 12 */
DescRxPtpMessageType = 0x00000F00, /* Message Type 11:8 */
DescRxPtpNo = 0x00000000, /* 0000 => No PTP message received */
DescRxPtpSync = 0x00000100, /* 0001 => Sync (all clock types) received */
DescRxPtpFollowUp = 0x00000200, /* 0010 => Follow_Up (all clock types) received */
DescRxPtpDelayReq = 0x00000300, /* 0011 => Delay_Req (all clock types) received */
DescRxPtpDelayResp = 0x00000400, /* 0100 => Delay_Resp (all clock types) received */
DescRxPtpPdelayReq = 0x00000500, /* 0101 => Pdelay_Req (in P to P tras clk) or Announce in Ord and Bound clk */
DescRxPtpPdelayResp = 0x00000600, /* 0110 => Pdealy_Resp(in P to P trans clk) or Management in Ord and Bound clk */
DescRxPtpPdelayRespFP = 0x00000700, /* 0111 => Pdealy_Resp_Follow_Up (in P to P trans clk) or Signaling in Ord and Bound clk */
DescRxPtpIPV6 = 0x00000080, /* Received Packet is in IPV6 Packet 7 */
DescRxPtpIPV4 = 0x00000040, /* Received Packet is in IPV4 Packet 6 */
DescRxChkSumBypass = 0x00000020, /* When set indicates checksum offload engine 5
* is bypassed */
DescRxIpPayloadError = 0x00000010, /* When set indicates 16bit IP payload CS is in error 4 */
DescRxIpHeaderError = 0x00000008, /* When set indicates 16bit IPV4 header CS is in 3
* error or IP datagram version is not consistent
* with Ethernet type value */
DescRxIpPayloadType = 0x00000007, /* Indicate the type of payload encapsulated 2:0
* in IPdatagram processed by COE (Rx) */
DescRxIpPayloadUnknown = 0x00000000, /* Unknown or didnot process IP payload */
DescRxIpPayloadUDP = 0x00000001, /* UDP */
DescRxIpPayloadTCP = 0x00000002, /* TCP */
DescRxIpPayloadICMP = 0x00000003, /* ICMP */
};
/**********************************************************
* GMAC DMA registers
* For Pci based system address is BARx + GmaDmaBase
* For any other system translation is done accordingly
**********************************************************/
enum DmaRegisters
{
DmaBusMode = 0x0000, /* CSR0 - Bus Mode Register */
DmaTxPollDemand = 0x0004, /* CSR1 - Transmit Poll Demand Register */
DmaRxPollDemand = 0x0008, /* CSR2 - Receive Poll Demand Register */
DmaRxBaseAddr = 0x000C, /* CSR3 - Receive Descriptor list base address */
DmaTxBaseAddr = 0x0010, /* CSR4 - Transmit Descriptor list base address */
DmaStatus = 0x0014, /* CSR5 - Dma status Register */
DmaControl = 0x0018, /* CSR6 - Dma Operation Mode Register */
DmaInterrupt = 0x001C, /* CSR7 - Interrupt enable */
DmaMissedFr = 0x0020, /* CSR8 - Missed Frame & Buffer overflow Counter*/
DmaTxCurrDesc = 0x0048, /* - Current host Tx Desc Register */
DmaRxCurrDesc = 0x004C, /* - Current host Rx Desc Register */
DmaTxCurrAddr = 0x0050, /* CSR20- Current host transmit buffer address */
DmaRxCurrAddr = 0x0054, /* CSR21- Current host receive buffer address */
};
/**********************************************************
* DMA Engine registers Layout
**********************************************************/
/* DmaBusMode = 0x0000, CSR0 - Bus Mode */
enum DmaBusModeReg
{ /* Bit description Bits R/W Reset value */
DmaFixedBurstEnable = 0x00010000, /* (FB)Fixed Burst SINGLE, INCR4, INCR8 or INCR16 16 RW */
DmaFixedBurstDisable = 0x00000000, /* SINGLE, INCR 0 */
DmaTxPriority = 0x08000000,
DmaTxPriorityRatio11 = 0x00000000, /* (PR)TX:RX DMA priority ratio 1:1 15:14 RW 00 */
DmaTxPriorityRatio21 = 0x00004000, /* (PR)TX:RX DMA priority ratio 2:1 */
DmaTxPriorityRatio31 = 0x00008000, /* (PR)TX:RX DMA priority ratio 3:1 */
DmaTxPriorityRatio41 = 0x0000C000, /* (PR)TX:RX DMA priority ratio 4:1 */
DmaBurstLengthx8 = 0x01000000, /* When set mutiplies the PBL by 8 24 RW 0 */
DmaBurstLength256 = 0x01002000, /*(DmaBurstLengthx8 | DmaBurstLength32) = 256 [24] 13:8 */
DmaBurstLength128 = 0x01001000, /*(DmaBurstLengthx8 | DmaBurstLength16) = 128 [24] 13:8 */
DmaBurstLength64 = 0x01000800, /*(DmaBurstLengthx8 | DmaBurstLength8) = 64 [24] 13:8 */
DmaBurstLength32 = 0x00002000, /* (PBL) programmable Dma burst length = 32 13:8 RW */
DmaBurstLength16 = 0x00001000, /* Dma burst length = 16 */
DmaBurstLength8 = 0x00000800, /* Dma burst length = 8 */
DmaBurstLength4 = 0x00000400, /* Dma burst length = 4 */
DmaBurstLength2 = 0x00000200, /* Dma burst length = 2 */
DmaBurstLength1 = 0x00000100, /* Dma burst length = 1 */
DmaBurstLength0 = 0x00000000, /* Dma burst length = 0 00 */
DmaDescriptor8Words = 0x00000080, /* Enh Descriptor works 1 => 8 word descriptor 7 0 */
DmaDescriptor4Words = 0x00000000, /* Enh Descriptor works 0 => 4 word descriptor 7 0 */
DmaDescriptorSkip16 = 0x00000040, /* (DSL)Descriptor skip length (no.of dwords) 6:2 RW */
DmaDescriptorSkip8 = 0x00000020, /* between two unchained descriptors */
DmaDescriptorSkip4 = 0x00000010,
DmaDescriptorSkip2 = 0x00000008,
DmaDescriptorSkip1 = 0x00000004,
DmaDescriptorSkip0 = 0x00000000,
DmaArbitRr = 0x00000000, /* (DA) DMA RR arbitration 1 RW 0 */
DmaArbitPr = 0x00000002, /* Rx has priority over Tx */
DmaResetOn = 0x00000001, /* (SWR)Software Reset DMA engine 0 RW */
DmaResetOff = 0x00000000, /* 0 */
};
/* DmaStatus = 0x0014, CSR5 - Dma status Register */
enum DmaStatusReg
{
/* Bit 28 27 and 26 indicate whether the interrupt due to PMT GMACMMC or GMAC LINE Remaining bits are DMA interrupts */
GmacPmtIntr = 0x10000000, /* (GPI)Gmac subsystem interrupt 28 RO 0 */
GmacMmcIntr = 0x08000000, /* (GMI)Gmac MMC subsystem interrupt 27 RO 0 */
GmacLineIntfIntr = 0x04000000, /* Line interface interrupt 26 RO 0 */
DmaErrorBit2 = 0x02000000, /* (EB)Error bits 0-data buffer, 1-desc. access 25 RO 0 */
DmaErrorBit1 = 0x01000000, /* (EB)Error bits 0-write trnsf, 1-read transfr 24 RO 0 */
DmaErrorBit0 = 0x00800000, /* (EB)Error bits 0-Rx DMA, 1-Tx DMA 23 RO 0 */
DmaTxState = 0x00700000, /* (TS)Transmit process state 22:20 RO */
DmaTxStopped = 0x00000000, /* Stopped - Reset or Stop Tx Command issued 000 */
DmaTxFetching = 0x00100000, /* Running - fetching the Tx descriptor */
DmaTxWaiting = 0x00200000, /* Running - waiting for status */
DmaTxReading = 0x00300000, /* Running - reading the data from host memory */
DmaTxSuspended = 0x00600000, /* Suspended - Tx Descriptor unavailabe */
DmaTxClosing = 0x00700000, /* Running - closing Rx descriptor */
DmaRxState = 0x000E0000, /* (RS)Receive process state 19:17 RO */
DmaRxStopped = 0x00000000, /* Stopped - Reset or Stop Rx Command issued 000 */
DmaRxFetching = 0x00020000, /* Running - fetching the Rx descriptor */
DmaRxWaiting = 0x00060000, /* Running - waiting for packet */
DmaRxSuspended = 0x00080000, /* Suspended - Rx Descriptor unavailable */
DmaRxClosing = 0x000A0000, /* Running - closing descriptor */
DmaRxQueuing = 0x000E0000, /* Running - queuing the recieve frame into host memory */
DmaIntNormal = 0x00010000, /* (NIS)Normal interrupt summary 16 RW 0 */
DmaIntAbnormal = 0x00008000, /* (AIS)Abnormal interrupt summary 15 RW 0 */
DmaIntEarlyRx = 0x00004000, /* Early receive interrupt (Normal) RW 0 */
DmaIntBusError = 0x00002000, /* Fatal bus error (Abnormal) RW 0 */
DmaIntEarlyTx = 0x00000400, /* Early transmit interrupt (Abnormal) RW 0 */
DmaIntRxWdogTO = 0x00000200, /* Receive Watchdog Timeout (Abnormal) RW 0 */
DmaIntRxStopped = 0x00000100, /* Receive process stopped (Abnormal) RW 0 */
DmaIntRxNoBuffer = 0x00000080, /* Receive buffer unavailable (Abnormal) RW 0 */
DmaIntRxCompleted = 0x00000040, /* Completion of frame reception (Normal) RW 0 */
DmaIntTxUnderflow = 0x00000020, /* Transmit underflow (Abnormal) RW 0 */
DmaIntRcvOverflow = 0x00000010, /* Receive Buffer overflow interrupt RW 0 */
DmaIntTxJabberTO = 0x00000008, /* Transmit Jabber Timeout (Abnormal) RW 0 */
DmaIntTxNoBuffer = 0x00000004, /* Transmit buffer unavailable (Normal) RW 0 */
DmaIntTxStopped = 0x00000002, /* Transmit process stopped (Abnormal) RW 0 */
DmaIntTxCompleted = 0x00000001, /* Transmit completed (Normal) RW 0 */
};
/* DmaControl = 0x0018, CSR6 - Dma Operation Mode Register */
enum DmaControlReg
{
DmaDisableDropTcpCs = 0x04000000, /* (DT) Dis. drop. of tcp/ip CS error frames 26 RW 0 */
DmaStoreAndForward = 0x00200000, /* (SF)Store and forward 21 RW 0 */
DmaFlushTxFifo = 0x00100000, /* (FTF)Tx FIFO controller is reset to default 20 RW 0 */
DmaTxThreshCtrl = 0x0001C000, /* (TTC)Controls thre Threh of MTL tx Fifo 16:14 RW */
DmaTxThreshCtrl16 = 0x0001C000, /* (TTC)Controls thre Threh of MTL tx Fifo 16 16:14 RW */
DmaTxThreshCtrl24 = 0x00018000, /* (TTC)Controls thre Threh of MTL tx Fifo 24 16:14 RW */
DmaTxThreshCtrl32 = 0x00014000, /* (TTC)Controls thre Threh of MTL tx Fifo 32 16:14 RW */
DmaTxThreshCtrl40 = 0x00010000, /* (TTC)Controls thre Threh of MTL tx Fifo 40 16:14 RW */
DmaTxThreshCtrl256 = 0x0000c000, /* (TTC)Controls thre Threh of MTL tx Fifo 256 16:14 RW */
DmaTxThreshCtrl192 = 0x00008000, /* (TTC)Controls thre Threh of MTL tx Fifo 192 16:14 RW */
DmaTxThreshCtrl128 = 0x00004000, /* (TTC)Controls thre Threh of MTL tx Fifo 128 16:14 RW */
DmaTxThreshCtrl64 = 0x00000000, /* (TTC)Controls thre Threh of MTL tx Fifo 64 16:14 RW 000 */
DmaTxStart = 0x00002000, /* (ST)Start/Stop transmission 13 RW 0 */
DmaRxFlowCtrlDeact = 0x00401800, /* (RFD)Rx flow control deact. threhold [22] 12:11 RW */
DmaRxFlowCtrlDeact1K = 0x00000000, /* (RFD)Rx flow control deact. threhold (1kbytes) [22] 12:11 RW 00 */
DmaRxFlowCtrlDeact2K = 0x00000800, /* (RFD)Rx flow control deact. threhold (2kbytes) [22] 12:11 RW */
DmaRxFlowCtrlDeact3K = 0x00001000, /* (RFD)Rx flow control deact. threhold (3kbytes) [22] 12:11 RW */
DmaRxFlowCtrlDeact4K = 0x00001800, /* (RFD)Rx flow control deact. threhold (4kbytes) [22] 12:11 RW */
DmaRxFlowCtrlDeact5K = 0x00400000, /* (RFD)Rx flow control deact. threhold (4kbytes) [22] 12:11 RW */
DmaRxFlowCtrlDeact6K = 0x00400800, /* (RFD)Rx flow control deact. threhold (4kbytes) [22] 12:11 RW */
DmaRxFlowCtrlDeact7K = 0x00401000, /* (RFD)Rx flow control deact. threhold (4kbytes) [22] 12:11 RW */
DmaRxFlowCtrlAct = 0x00800600, /* (RFA)Rx flow control Act. threshold [23] 10:09 RW */
DmaRxFlowCtrlAct1K = 0x00000000, /* (RFA)Rx flow control Act. threshold (1kbytes) [23] 10:09 RW 00 */
DmaRxFlowCtrlAct2K = 0x00000200, /* (RFA)Rx flow control Act. threshold (2kbytes) [23] 10:09 RW */
DmaRxFlowCtrlAct3K = 0x00000400, /* (RFA)Rx flow control Act. threshold (3kbytes) [23] 10:09 RW */
DmaRxFlowCtrlAct4K = 0x00000600, /* (RFA)Rx flow control Act. threshold (4kbytes) [23] 10:09 RW */
DmaRxFlowCtrlAct5K = 0x00800000, /* (RFA)Rx flow control Act. threshold (5kbytes) [23] 10:09 RW */
DmaRxFlowCtrlAct6K = 0x00800200, /* (RFA)Rx flow control Act. threshold (6kbytes) [23] 10:09 RW */
DmaRxFlowCtrlAct7K = 0x00800400, /* (RFA)Rx flow control Act. threshold (7kbytes) [23] 10:09 RW */
DmaRxThreshCtrl = 0x00000018, /* (RTC)Controls thre Threh of MTL rx Fifo 4:3 RW */
DmaRxThreshCtrl64 = 0x00000000, /* (RTC)Controls thre Threh of MTL tx Fifo 64 4:3 RW */
DmaRxThreshCtrl32 = 0x00000008, /* (RTC)Controls thre Threh of MTL tx Fifo 32 4:3 RW */
DmaRxThreshCtrl96 = 0x00000010, /* (RTC)Controls thre Threh of MTL tx Fifo 96 4:3 RW */
DmaRxThreshCtrl128 = 0x00000018, /* (RTC)Controls thre Threh of MTL tx Fifo 128 4:3 RW */
DmaEnHwFlowCtrl = 0x00000100, /* (EFC)Enable HW flow control 8 RW */
DmaDisHwFlowCtrl = 0x00000000, /* Disable HW flow control 0 */
DmaFwdErrorFrames = 0x00000080, /* (FEF)Forward error frames 7 RW 0 */
DmaFwdUnderSzFrames = 0x00000040, /* (FUF)Forward undersize frames 6 RW 0 */
DmaTxSecondFrame = 0x00000004, /* (OSF)Operate on second frame 4 RW 0 */
DmaRxStart = 0x00000002, /* (SR)Start/Stop reception 1 RW 0 */
};
/* GmacFlowControl = 0x0018, Flow control Register Layout */
enum GmacFlowControlReg
{
GmacPauseTimeMask = 0xFFFF0000, /* (PT) PAUSE TIME field in the control frame 31:16 RW 0000 */
GmacPauseTimeShift = 16,
DmaDisableFlushRxFrames = 0x01000000,
GmacPauseLowThresh = 0x00000030,
GmacPauseLowThresh3 = 0x00000030, /* (PLT)thresh for pause tmr 256 slot time 5:4 RW */
GmacPauseLowThresh2 = 0x00000020, /* 144 slot time */
GmacPauseLowThresh1 = 0x00000010, /* 28 slot time */
GmacPauseLowThresh0 = 0x00000000, /* 4 slot time 000 */
GmacUnicastPauseFrame = 0x00000008,
GmacUnicastPauseFrameOn = 0x00000008, /* (UP)Detect pause frame with unicast addr. 3 RW */
GmacUnicastPauseFrameOff = 0x00000000, /* Detect only pause frame with multicast addr. 0 */
GmacRxFlowControl = 0x00000004,
GmacRxFlowControlEnable = 0x00000004, /* (RFE)Enable Rx flow control 2 RW */
GmacRxFlowControlDisable = 0x00000000, /* Disable Rx flow control 0 */
GmacTxFlowControl = 0x00000002,
GmacTxFlowControlEnable = 0x00000002, /* (TFE)Enable Tx flow control 1 RW */
GmacTxFlowControlDisable = 0x00000000, /* Disable flow control 0 */
GmacFlowControlBackPressure = 0x00000001,
GmacSendPauseFrame = 0x00000001, /* (FCB/PBA)send pause frm/Apply back pressure 0 RW 0 */
};
/*
* Below is "88E1011/88E1011S Integrated 10/100/1000 Gigabit Ethernet Transceiver"
* Register and their layouts. This Phy has been used in the Dot Aster GMAC Phy daughter.
* Since the Phy register map is standard, this map hardly changes to a different Ppy
*/
enum MiiRegisters
{
PHY_CONTROL_REG = 0x0000, /* Control Register */
PHY_STATUS_REG = 0x0001, /* Status Register */
PHY_ID_HI_REG = 0x0002, /* PHY Identifier High Register */
PHY_ID_LOW_REG = 0x0003, /* PHY Identifier High Register */
PHY_AN_ADV_REG = 0x0004, /* Auto-Negotiation Advertisement Register */
PHY_LNK_PART_ABl_REG = 0x0005, /* Link Partner Ability Register (Base Page) */
PHY_AN_EXP_REG = 0x0006, /* Auto-Negotiation Expansion Register */
PHY_AN_NXT_PAGE_TX_REG = 0x0007, /* Next Page Transmit Register */
PHY_LNK_PART_NXT_PAGE_REG = 0x0008, /* Link Partner Next Page Register */
PHY_1000BT_CTRL_REG = 0x0009, /* 1000BASE-T Control Register */
PHY_1000BT_STATUS_REG = 0x000a, /* 1000BASE-T Status Register */
PHY_SPECIFIC_CTRL_REG = 0x0010, /* Phy specific control register */
PHY_SPECIFIC_STATUS_REG = 0x0011, /* Phy specific status register */
PHY_INTERRUPT_ENABLE_REG = 0x0012, /* Phy interrupt enable register */
PHY_INTERRUPT_STATUS_REG = 0x0013, /* Phy interrupt status register */
PHY_EXT_PHY_SPC_CTRL = 0x0014, /* Extended Phy specific control */
PHY_RX_ERR_COUNTER = 0x0015, /* Receive Error Counter */
PHY_EXT_ADDR_CBL_DIAG = 0x0016, /* Extended address for cable diagnostic register */
PHY_LED_CONTROL = 0x0018, /* LED Control */
PHY_MAN_LED_OVERIDE = 0x0019, /* Manual LED override register */
PHY_EXT_PHY_SPC_CTRL2 = 0x001a, /* Extended Phy specific control 2 */
PHY_EXT_PHY_SPC_STATUS = 0x001b, /* Extended Phy specific status */
PHY_CBL_DIAG_REG = 0x001c, /* Cable diagnostic registers */
};
enum Mii_Phy_Status {
Mii_phy_status_speed_10 = 0x0000,
Mii_phy_status_speed_100 = 0x4000,
Mii_phy_status_speed_1000 = 0x8000,
Mii_phy_status_full_duplex = 0x2000,
Mii_phy_status_half_duplex = 0x0000,
Mii_phy_status_link_up = 0x0400,
};
#endif /* _IPQ_GMAC_H */