1*9fc192bfSkevlo /* $OpenBSD: if_agereg.h,v 1.3 2009/07/28 13:53:56 kevlo Exp $ */ 283be87f9Skevlo 383be87f9Skevlo /*- 483be87f9Skevlo * Copyright (c) 2008, Pyun YongHyeon <yongari@FreeBSD.org> 583be87f9Skevlo * All rights reserved. 683be87f9Skevlo * 783be87f9Skevlo * Redistribution and use in source and binary forms, with or without 883be87f9Skevlo * modification, are permitted provided that the following conditions 983be87f9Skevlo * are met: 1083be87f9Skevlo * 1. Redistributions of source code must retain the above copyright 1183be87f9Skevlo * notice unmodified, this list of conditions, and the following 1283be87f9Skevlo * disclaimer. 1383be87f9Skevlo * 2. Redistributions in binary form must reproduce the above copyright 1483be87f9Skevlo * notice, this list of conditions and the following disclaimer in the 1583be87f9Skevlo * documentation and/or other materials provided with the distribution. 1683be87f9Skevlo * 1783be87f9Skevlo * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1883be87f9Skevlo * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1983be87f9Skevlo * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2083be87f9Skevlo * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2183be87f9Skevlo * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2283be87f9Skevlo * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2383be87f9Skevlo * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2483be87f9Skevlo * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2583be87f9Skevlo * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2683be87f9Skevlo * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2783be87f9Skevlo * SUCH DAMAGE. 2883be87f9Skevlo * 2983be87f9Skevlo * $FreeBSD: src/sys/dev/age/if_agereg.h,v 1.1 2008/05/19 01:39:59 yongari Exp $ 3083be87f9Skevlo */ 3183be87f9Skevlo 3283be87f9Skevlo #ifndef _IF_AGEREG_H 3383be87f9Skevlo #define _IF_AGEREG_H 3483be87f9Skevlo 3583be87f9Skevlo #define AGE_PCIR_BAR 0x10 3683be87f9Skevlo 3783be87f9Skevlo /* 3883be87f9Skevlo * Attansic Technology Corp. PCI vendor ID 3983be87f9Skevlo */ 4083be87f9Skevlo #define VENDORID_ATTANSIC 0x1969 4183be87f9Skevlo 4283be87f9Skevlo /* 4383be87f9Skevlo * Attansic L1 device ID 4483be87f9Skevlo */ 4583be87f9Skevlo #define DEVICEID_ATTANSIC_L1 0x1048 4683be87f9Skevlo 4783be87f9Skevlo #define AGE_VPD_REG_CONF_START 0x0100 4883be87f9Skevlo #define AGE_VPD_REG_CONF_END 0x01FF 4983be87f9Skevlo #define AGE_VPD_REG_CONF_SIG 0x5A 5083be87f9Skevlo 5183be87f9Skevlo #define AGE_SPI_CTRL 0x200 5283be87f9Skevlo #define SPI_STAT_NOT_READY 0x00000001 5383be87f9Skevlo #define SPI_STAT_WR_ENB 0x00000002 5483be87f9Skevlo #define SPI_STAT_WRP_ENB 0x00000080 5583be87f9Skevlo #define SPI_INST_MASK 0x000000FF 5683be87f9Skevlo #define SPI_START 0x00000100 5783be87f9Skevlo #define SPI_INST_START 0x00000800 5883be87f9Skevlo #define SPI_VPD_ENB 0x00002000 5983be87f9Skevlo #define SPI_LOADER_START 0x00008000 6083be87f9Skevlo #define SPI_CS_HI_MASK 0x00030000 6183be87f9Skevlo #define SPI_CS_HOLD_MASK 0x000C0000 6283be87f9Skevlo #define SPI_CLK_LO_MASK 0x00300000 6383be87f9Skevlo #define SPI_CLK_HI_MASK 0x00C00000 6483be87f9Skevlo #define SPI_CS_SETUP_MASK 0x03000000 6583be87f9Skevlo #define SPI_EPROM_PG_MASK 0x0C000000 6683be87f9Skevlo #define SPI_INST_SHIFT 8 6783be87f9Skevlo #define SPI_CS_HI_SHIFT 16 6883be87f9Skevlo #define SPI_CS_HOLD_SHIFT 18 6983be87f9Skevlo #define SPI_CLK_LO_SHIFT 20 7083be87f9Skevlo #define SPI_CLK_HI_SHIFT 22 7183be87f9Skevlo #define SPI_CS_SETUP_SHIFT 24 7283be87f9Skevlo #define SPI_EPROM_PG_SHIFT 26 7383be87f9Skevlo #define SPI_WAIT_READY 0x10000000 7483be87f9Skevlo 7583be87f9Skevlo #define AGE_SPI_ADDR 0x204 /* 16bits */ 7683be87f9Skevlo 7783be87f9Skevlo #define AGE_SPI_DATA 0x208 7883be87f9Skevlo 7983be87f9Skevlo #define AGE_SPI_CONFIG 0x20C 8083be87f9Skevlo 8183be87f9Skevlo #define AGE_SPI_OP_PROGRAM 0x210 /* 8bits */ 8283be87f9Skevlo 8383be87f9Skevlo #define AGE_SPI_OP_SC_ERASE 0x211 /* 8bits */ 8483be87f9Skevlo 8583be87f9Skevlo #define AGE_SPI_OP_CHIP_ERASE 0x212 /* 8bits */ 8683be87f9Skevlo 8783be87f9Skevlo #define AGE_SPI_OP_RDID 0x213 /* 8bits */ 8883be87f9Skevlo 8983be87f9Skevlo #define AGE_SPI_OP_WREN 0x214 /* 8bits */ 9083be87f9Skevlo 9183be87f9Skevlo #define AGE_SPI_OP_RDSR 0x215 /* 8bits */ 9283be87f9Skevlo 9383be87f9Skevlo #define AGE_SPI_OP_WRSR 0x216 /* 8bits */ 9483be87f9Skevlo 9583be87f9Skevlo #define AGE_SPI_OP_READ 0x217 /* 8bits */ 9683be87f9Skevlo 9783be87f9Skevlo #define AGE_TWSI_CTRL 0x218 98*9fc192bfSkevlo #define TWSI_CTRL_SW_LD_START 0x00000800 99*9fc192bfSkevlo #define TWSI_CTRL_HW_LD_START 0x00001000 100*9fc192bfSkevlo #define TWSI_CTRL_LD_EXIST 0x00400000 10183be87f9Skevlo 10283be87f9Skevlo #define AGE_DEV_MISC_CTRL 0x21C 10383be87f9Skevlo 10483be87f9Skevlo #define AGE_MASTER_CFG 0x1400 10583be87f9Skevlo #define MASTER_RESET 0x00000001 10683be87f9Skevlo #define MASTER_MTIMER_ENB 0x00000002 10783be87f9Skevlo #define MASTER_ITIMER_ENB 0x00000004 10883be87f9Skevlo #define MASTER_MANUAL_INT_ENB 0x00000008 10983be87f9Skevlo #define MASTER_CHIP_REV_MASK 0x00FF0000 11083be87f9Skevlo #define MASTER_CHIP_ID_MASK 0xFF000000 11183be87f9Skevlo #define MASTER_CHIP_REV_SHIFT 16 11283be87f9Skevlo #define MASTER_CHIP_ID_SHIFT 24 11383be87f9Skevlo 11483be87f9Skevlo /* Number of ticks per usec for L1. */ 11583be87f9Skevlo #define AGE_TICK_USECS 2 11683be87f9Skevlo #define AGE_USECS(x) ((x) / AGE_TICK_USECS) 11783be87f9Skevlo 11883be87f9Skevlo #define AGE_MANUAL_TIMER 0x1404 11983be87f9Skevlo 12083be87f9Skevlo #define AGE_IM_TIMER 0x1408 /* 16bits */ 12183be87f9Skevlo #define AGE_IM_TIMER_MIN 0 12283be87f9Skevlo #define AGE_IM_TIMER_MAX 130000 /* 130ms */ 12383be87f9Skevlo #define AGE_IM_TIMER_DEFAULT 100 12483be87f9Skevlo 12583be87f9Skevlo #define AGE_GPHY_CTRL 0x140C /* 16bits */ 12683be87f9Skevlo #define GPHY_CTRL_RST 0x0000 12783be87f9Skevlo #define GPHY_CTRL_CLR 0x0001 12883be87f9Skevlo 12983be87f9Skevlo #define AGE_INTR_CLR_TIMER 0x140E /* 16bits */ 13083be87f9Skevlo 13183be87f9Skevlo #define AGE_IDLE_STATUS 0x1410 13283be87f9Skevlo #define IDLE_STATUS_RXMAC 0x00000001 13383be87f9Skevlo #define IDLE_STATUS_TXMAC 0x00000002 13483be87f9Skevlo #define IDLE_STATUS_RXQ 0x00000004 13583be87f9Skevlo #define IDLE_STATUS_TXQ 0x00000008 13683be87f9Skevlo #define IDLE_STATUS_DMARD 0x00000010 13783be87f9Skevlo #define IDLE_STATUS_DMAWR 0x00000020 13883be87f9Skevlo #define IDLE_STATUS_SMB 0x00000040 13983be87f9Skevlo #define IDLE_STATUS_CMB 0x00000080 14083be87f9Skevlo 14183be87f9Skevlo #define AGE_MDIO 0x1414 14283be87f9Skevlo #define MDIO_DATA_MASK 0x0000FFFF 14383be87f9Skevlo #define MDIO_REG_ADDR_MASK 0x001F0000 14483be87f9Skevlo #define MDIO_OP_READ 0x00200000 14583be87f9Skevlo #define MDIO_OP_WRITE 0x00000000 14683be87f9Skevlo #define MDIO_SUP_PREAMBLE 0x00400000 14783be87f9Skevlo #define MDIO_OP_EXECUTE 0x00800000 14883be87f9Skevlo #define MDIO_CLK_25_4 0x00000000 14983be87f9Skevlo #define MDIO_CLK_25_6 0x02000000 15083be87f9Skevlo #define MDIO_CLK_25_8 0x03000000 15183be87f9Skevlo #define MDIO_CLK_25_10 0x04000000 15283be87f9Skevlo #define MDIO_CLK_25_14 0x05000000 15383be87f9Skevlo #define MDIO_CLK_25_20 0x06000000 15483be87f9Skevlo #define MDIO_CLK_25_28 0x07000000 15583be87f9Skevlo #define MDIO_OP_BUSY 0x08000000 15683be87f9Skevlo #define MDIO_DATA_SHIFT 0 15783be87f9Skevlo #define MDIO_REG_ADDR_SHIFT 16 15883be87f9Skevlo 15983be87f9Skevlo #define MDIO_REG_ADDR(x) \ 16083be87f9Skevlo (((x) << MDIO_REG_ADDR_SHIFT) & MDIO_REG_ADDR_MASK) 16183be87f9Skevlo /* Default PHY address. */ 16283be87f9Skevlo #define AGE_PHY_ADDR 0 16383be87f9Skevlo 16483be87f9Skevlo #define AGE_PHY_STATUS 0x1418 16583be87f9Skevlo 16683be87f9Skevlo #define AGE_BIST0 0x141C 16783be87f9Skevlo #define BIST0_ENB 0x00000001 16883be87f9Skevlo #define BIST0_SRAM_FAIL 0x00000002 16983be87f9Skevlo #define BIST0_FUSE_FLAG 0x00000004 17083be87f9Skevlo 17183be87f9Skevlo #define AGE_BIST1 0x1420 17283be87f9Skevlo #define BIST1_ENB 0x00000001 17383be87f9Skevlo #define BIST1_SRAM_FAIL 0x00000002 17483be87f9Skevlo #define BIST1_FUSE_FLAG 0x00000004 17583be87f9Skevlo 17683be87f9Skevlo #define AGE_MAC_CFG 0x1480 17783be87f9Skevlo #define MAC_CFG_TX_ENB 0x00000001 17883be87f9Skevlo #define MAC_CFG_RX_ENB 0x00000002 17983be87f9Skevlo #define MAC_CFG_TX_FC 0x00000004 18083be87f9Skevlo #define MAC_CFG_RX_FC 0x00000008 18183be87f9Skevlo #define MAC_CFG_LOOP 0x00000010 18283be87f9Skevlo #define MAC_CFG_FULL_DUPLEX 0x00000020 18383be87f9Skevlo #define MAC_CFG_TX_CRC_ENB 0x00000040 18483be87f9Skevlo #define MAC_CFG_TX_AUTO_PAD 0x00000080 18583be87f9Skevlo #define MAC_CFG_TX_LENCHK 0x00000100 18683be87f9Skevlo #define MAC_CFG_RX_JUMBO_ENB 0x00000200 18783be87f9Skevlo #define MAC_CFG_PREAMBLE_MASK 0x00003C00 18883be87f9Skevlo #define MAC_CFG_VLAN_TAG_STRIP 0x00004000 18983be87f9Skevlo #define MAC_CFG_PROMISC 0x00008000 19083be87f9Skevlo #define MAC_CFG_TX_PAUSE 0x00010000 19183be87f9Skevlo #define MAC_CFG_SCNT 0x00020000 19283be87f9Skevlo #define MAC_CFG_SYNC_RST_TX 0x00040000 19383be87f9Skevlo #define MAC_CFG_SPEED_MASK 0x00300000 19483be87f9Skevlo #define MAC_CFG_SPEED_10_100 0x00100000 19583be87f9Skevlo #define MAC_CFG_SPEED_1000 0x00200000 19683be87f9Skevlo #define MAC_CFG_DBG_TX_BACKOFF 0x00400000 19783be87f9Skevlo #define MAC_CFG_TX_JUMBO_ENB 0x00800000 19883be87f9Skevlo #define MAC_CFG_RXCSUM_ENB 0x01000000 19983be87f9Skevlo #define MAC_CFG_ALLMULTI 0x02000000 20083be87f9Skevlo #define MAC_CFG_BCAST 0x04000000 20183be87f9Skevlo #define MAC_CFG_DBG 0x08000000 20283be87f9Skevlo #define MAC_CFG_PREAMBLE_SHIFT 10 20383be87f9Skevlo #define MAC_CFG_PREAMBLE_DEFAULT 7 20483be87f9Skevlo 20583be87f9Skevlo #define AGE_IPG_IFG_CFG 0x1484 20683be87f9Skevlo #define IPG_IFG_IPGT_MASK 0x0000007F 20783be87f9Skevlo #define IPG_IFG_MIFG_MASK 0x0000FF00 20883be87f9Skevlo #define IPG_IFG_IPG1_MASK 0x007F0000 20983be87f9Skevlo #define IPG_IFG_IPG2_MASK 0x7F000000 21083be87f9Skevlo #define IPG_IFG_IPGT_SHIFT 0 21183be87f9Skevlo #define IPG_IFG_IPGT_DEFAULT 0x60 21283be87f9Skevlo #define IPG_IFG_MIFG_SHIFT 8 21383be87f9Skevlo #define IPG_IFG_MIFG_DEFAULT 0x50 21483be87f9Skevlo #define IPG_IFG_IPG1_SHIFT 16 21583be87f9Skevlo #define IPG_IFG_IPG1_DEFAULT 0x40 21683be87f9Skevlo #define IPG_IFG_IPG2_SHIFT 24 21783be87f9Skevlo #define IPG_IFG_IPG2_DEFAULT 0x60 21883be87f9Skevlo 21983be87f9Skevlo /* station address */ 22083be87f9Skevlo #define AGE_PAR0 0x1488 22183be87f9Skevlo #define AGE_PAR1 0x148C 22283be87f9Skevlo 22383be87f9Skevlo /* 64bit multicast hash register. */ 22483be87f9Skevlo #define AGE_MAR0 0x1490 22583be87f9Skevlo #define AGE_MAR1 0x1494 22683be87f9Skevlo 22783be87f9Skevlo /* half-duplex parameter configuration. */ 22883be87f9Skevlo #define AGE_HDPX_CFG 0x1498 22983be87f9Skevlo #define HDPX_CFG_LCOL_MASK 0x000003FF 23083be87f9Skevlo #define HDPX_CFG_RETRY_MASK 0x0000F000 23183be87f9Skevlo #define HDPX_CFG_EXC_DEF_EN 0x00010000 23283be87f9Skevlo #define HDPX_CFG_NO_BACK_C 0x00020000 23383be87f9Skevlo #define HDPX_CFG_NO_BACK_P 0x00040000 23483be87f9Skevlo #define HDPX_CFG_ABEBE 0x00080000 23583be87f9Skevlo #define HDPX_CFG_ABEBT_MASK 0x00F00000 23683be87f9Skevlo #define HDPX_CFG_JAMIPG_MASK 0x0F000000 23783be87f9Skevlo #define HDPX_CFG_LCOL_SHIFT 0 23883be87f9Skevlo #define HDPX_CFG_LCOL_DEFAULT 0x37 23983be87f9Skevlo #define HDPX_CFG_RETRY_SHIFT 12 24083be87f9Skevlo #define HDPX_CFG_RETRY_DEFAULT 0x0F 24183be87f9Skevlo #define HDPX_CFG_ABEBT_SHIFT 20 24283be87f9Skevlo #define HDPX_CFG_ABEBT_DEFAULT 0x0A 24383be87f9Skevlo #define HDPX_CFG_JAMIPG_SHIFT 24 24483be87f9Skevlo #define HDPX_CFG_JAMIPG_DEFAULT 0x07 24583be87f9Skevlo 24683be87f9Skevlo #define AGE_FRAME_SIZE 0x149C 24783be87f9Skevlo 24883be87f9Skevlo #define AGE_WOL_CFG 0x14A0 24983be87f9Skevlo #define WOL_CFG_PATTERN 0x00000001 25083be87f9Skevlo #define WOL_CFG_PATTERN_ENB 0x00000002 25183be87f9Skevlo #define WOL_CFG_MAGIC 0x00000004 25283be87f9Skevlo #define WOL_CFG_MAGIC_ENB 0x00000008 25383be87f9Skevlo #define WOL_CFG_LINK_CHG 0x00000010 25483be87f9Skevlo #define WOL_CFG_LINK_CHG_ENB 0x00000020 25583be87f9Skevlo #define WOL_CFG_PATTERN_DET 0x00000100 25683be87f9Skevlo #define WOL_CFG_MAGIC_DET 0x00000200 25783be87f9Skevlo #define WOL_CFG_LINK_CHG_DET 0x00000400 25883be87f9Skevlo #define WOL_CFG_CLK_SWITCH_ENB 0x00008000 25983be87f9Skevlo #define WOL_CFG_PATTERN0 0x00010000 26083be87f9Skevlo #define WOL_CFG_PATTERN1 0x00020000 26183be87f9Skevlo #define WOL_CFG_PATTERN2 0x00040000 26283be87f9Skevlo #define WOL_CFG_PATTERN3 0x00080000 26383be87f9Skevlo #define WOL_CFG_PATTERN4 0x00100000 26483be87f9Skevlo #define WOL_CFG_PATTERN5 0x00200000 26583be87f9Skevlo #define WOL_CFG_PATTERN6 0x00400000 26683be87f9Skevlo 26783be87f9Skevlo /* WOL pattern length. */ 26883be87f9Skevlo #define AGE_PATTERN_CFG0 0x14A4 26983be87f9Skevlo #define PATTERN_CFG_0_LEN_MASK 0x0000007F 27083be87f9Skevlo #define PATTERN_CFG_1_LEN_MASK 0x00007F00 27183be87f9Skevlo #define PATTERN_CFG_2_LEN_MASK 0x007F0000 27283be87f9Skevlo #define PATTERN_CFG_3_LEN_MASK 0x7F000000 27383be87f9Skevlo 27483be87f9Skevlo #define AGE_PATTERN_CFG1 0x14A8 27583be87f9Skevlo #define PATTERN_CFG_4_LEN_MASK 0x0000007F 27683be87f9Skevlo #define PATTERN_CFG_5_LEN_MASK 0x00007F00 27783be87f9Skevlo #define PATTERN_CFG_6_LEN_MASK 0x007F0000 27883be87f9Skevlo 27983be87f9Skevlo #define AGE_SRAM_RD_ADDR 0x1500 28083be87f9Skevlo 28183be87f9Skevlo #define AGE_SRAM_RD_LEN 0x1504 28283be87f9Skevlo 28383be87f9Skevlo #define AGE_SRAM_RRD_ADDR 0x1508 28483be87f9Skevlo 28583be87f9Skevlo #define AGE_SRAM_RRD_LEN 0x150C 28683be87f9Skevlo 28783be87f9Skevlo #define AGE_SRAM_TPD_ADDR 0x1510 28883be87f9Skevlo 28983be87f9Skevlo #define AGE_SRAM_TPD_LEN 0x1514 29083be87f9Skevlo 29183be87f9Skevlo #define AGE_SRAM_TRD_ADDR 0x1518 29283be87f9Skevlo 29383be87f9Skevlo #define AGE_SRAM_TRD_LEN 0x151C 29483be87f9Skevlo 29583be87f9Skevlo #define AGE_SRAM_RX_FIFO_ADDR 0x1520 29683be87f9Skevlo 29783be87f9Skevlo #define AGE_SRAM_RX_FIFO_LEN 0x1524 29883be87f9Skevlo 29983be87f9Skevlo #define AGE_SRAM_TX_FIFO_ADDR 0x1528 30083be87f9Skevlo 30183be87f9Skevlo #define AGE_SRAM_TX_FIFO_LEN 0x152C 30283be87f9Skevlo 30383be87f9Skevlo #define AGE_SRAM_TCPH_ADDR 0x1530 30483be87f9Skevlo #define SRAM_TCPH_ADDR_MASK 0x00000FFF 30583be87f9Skevlo #define SRAM_PATH_ADDR_MASK 0x0FFF0000 30683be87f9Skevlo #define SRAM_TCPH_ADDR_SHIFT 0 30783be87f9Skevlo #define SRAM_PATH_ADDR_SHIFT 16 30883be87f9Skevlo 30983be87f9Skevlo #define AGE_DMA_BLOCK 0x1534 31083be87f9Skevlo #define DMA_BLOCK_LOAD 0x00000001 31183be87f9Skevlo 31283be87f9Skevlo /* 31383be87f9Skevlo * All descriptors and CMB/SMB share the same high address. 31483be87f9Skevlo */ 31583be87f9Skevlo #define AGE_DESC_ADDR_HI 0x1540 31683be87f9Skevlo 31783be87f9Skevlo #define AGE_DESC_RD_ADDR_LO 0x1544 31883be87f9Skevlo 31983be87f9Skevlo #define AGE_DESC_RRD_ADDR_LO 0x1548 32083be87f9Skevlo 32183be87f9Skevlo #define AGE_DESC_TPD_ADDR_LO 0x154C 32283be87f9Skevlo 32383be87f9Skevlo #define AGE_DESC_CMB_ADDR_LO 0x1550 32483be87f9Skevlo 32583be87f9Skevlo #define AGE_DESC_SMB_ADDR_LO 0x1554 32683be87f9Skevlo 32783be87f9Skevlo #define AGE_DESC_RRD_RD_CNT 0x1558 32883be87f9Skevlo #define DESC_RD_CNT_MASK 0x000007FF 32983be87f9Skevlo #define DESC_RRD_CNT_MASK 0x07FF0000 33083be87f9Skevlo #define DESC_RD_CNT_SHIFT 0 33183be87f9Skevlo #define DESC_RRD_CNT_SHIFT 16 33283be87f9Skevlo 33383be87f9Skevlo #define AGE_DESC_TPD_CNT 0x155C 33483be87f9Skevlo #define DESC_TPD_CNT_MASK 0x00003FF 33583be87f9Skevlo #define DESC_TPD_CNT_SHIFT 0 33683be87f9Skevlo 33783be87f9Skevlo #define AGE_TXQ_CFG 0x1580 33883be87f9Skevlo #define TXQ_CFG_TPD_BURST_MASK 0x0000001F 33983be87f9Skevlo #define TXQ_CFG_ENB 0x00000020 34083be87f9Skevlo #define TXQ_CFG_ENHANCED_MODE 0x00000040 34183be87f9Skevlo #define TXQ_CFG_TPD_FETCH_THRESH_MASK 0x00003F00 34283be87f9Skevlo #define TXQ_CFG_TX_FIFO_BURST_MASK 0xFFFF0000 34383be87f9Skevlo #define TXQ_CFG_TPD_BURST_SHIFT 0 34483be87f9Skevlo #define TXQ_CFG_TPD_BURST_DEFAULT 4 34583be87f9Skevlo #define TXQ_CFG_TPD_FETCH_THRESH_SHIFT 8 34683be87f9Skevlo #define TXQ_CFG_TPD_FETCH_DEFAULT 16 34783be87f9Skevlo #define TXQ_CFG_TX_FIFO_BURST_SHIFT 16 34883be87f9Skevlo #define TXQ_CFG_TX_FIFO_BURST_DEFAULT 256 34983be87f9Skevlo 35083be87f9Skevlo #define AGE_TX_JUMBO_TPD_TH_IPG 0x1584 35183be87f9Skevlo #define TX_JUMBO_TPD_TH_MASK 0x000007FF 35283be87f9Skevlo #define TX_JUMBO_TPD_IPG_MASK 0x001F0000 35383be87f9Skevlo #define TX_JUMBO_TPD_TH_SHIFT 0 35483be87f9Skevlo #define TX_JUMBO_TPD_IPG_SHIFT 16 35583be87f9Skevlo #define TX_JUMBO_TPD_IPG_DEFAULT 1 35683be87f9Skevlo 35783be87f9Skevlo #define AGE_RXQ_CFG 0x15A0 35883be87f9Skevlo #define RXQ_CFG_RD_BURST_MASK 0x000000FF 35983be87f9Skevlo #define RXQ_CFG_RRD_BURST_THRESH_MASK 0x0000FF00 36083be87f9Skevlo #define RXQ_CFG_RD_PREF_MIN_IPG_MASK 0x001F0000 36183be87f9Skevlo #define RXQ_CFG_CUT_THROUGH_ENB 0x40000000 36283be87f9Skevlo #define RXQ_CFG_ENB 0x80000000 36383be87f9Skevlo #define RXQ_CFG_RD_BURST_SHIFT 0 36483be87f9Skevlo #define RXQ_CFG_RD_BURST_DEFAULT 8 36583be87f9Skevlo #define RXQ_CFG_RRD_BURST_THRESH_SHIFT 8 36683be87f9Skevlo #define RXQ_CFG_RRD_BURST_THRESH_DEFAULT 8 36783be87f9Skevlo #define RXQ_CFG_RD_PREF_MIN_IPG_SHIFT 16 36883be87f9Skevlo #define RXQ_CFG_RD_PREF_MIN_IPG_DEFAULT 1 36983be87f9Skevlo 37083be87f9Skevlo #define AGE_RXQ_JUMBO_CFG 0x15A4 37183be87f9Skevlo #define RXQ_JUMBO_CFG_SZ_THRESH_MASK 0x000007FF 37283be87f9Skevlo #define RXQ_JUMBO_CFG_LKAH_MASK 0x00007800 37383be87f9Skevlo #define RXQ_JUMBO_CFG_RRD_TIMER_MASK 0xFFFF0000 37483be87f9Skevlo #define RXQ_JUMBO_CFG_SZ_THRESH_SHIFT 0 37583be87f9Skevlo #define RXQ_JUMBO_CFG_LKAH_SHIFT 11 37683be87f9Skevlo #define RXQ_JUMBO_CFG_LKAH_DEFAULT 0x01 37783be87f9Skevlo #define RXQ_JUMBO_CFG_RRD_TIMER_SHIFT 16 37883be87f9Skevlo 37983be87f9Skevlo #define AGE_RXQ_FIFO_PAUSE_THRESH 0x15A8 38083be87f9Skevlo #define RXQ_FIFO_PAUSE_THRESH_LO_MASK 0x00000FFF 38183be87f9Skevlo #define RXQ_FIFO_PAUSE_THRESH_HI_MASK 0x0FFF000 38283be87f9Skevlo #define RXQ_FIFO_PAUSE_THRESH_LO_SHIFT 0 38383be87f9Skevlo #define RXQ_FIFO_PAUSE_THRESH_HI_SHIFT 16 38483be87f9Skevlo 38583be87f9Skevlo #define AGE_RXQ_RRD_PAUSE_THRESH 0x15AC 38683be87f9Skevlo #define RXQ_RRD_PAUSE_THRESH_HI_MASK 0x00000FFF 38783be87f9Skevlo #define RXQ_RRD_PAUSE_THRESH_LO_MASK 0x0FFF0000 38883be87f9Skevlo #define RXQ_RRD_PAUSE_THRESH_HI_SHIFT 0 38983be87f9Skevlo #define RXQ_RRD_PAUSE_THRESH_LO_SHIFT 16 39083be87f9Skevlo 39183be87f9Skevlo #define AGE_DMA_CFG 0x15C0 39283be87f9Skevlo #define DMA_CFG_IN_ORDER 0x00000001 39383be87f9Skevlo #define DMA_CFG_ENH_ORDER 0x00000002 39483be87f9Skevlo #define DMA_CFG_OUT_ORDER 0x00000004 39583be87f9Skevlo #define DMA_CFG_RCB_64 0x00000000 39683be87f9Skevlo #define DMA_CFG_RCB_128 0x00000008 39783be87f9Skevlo #define DMA_CFG_RD_BURST_128 0x00000000 39883be87f9Skevlo #define DMA_CFG_RD_BURST_256 0x00000010 39983be87f9Skevlo #define DMA_CFG_RD_BURST_512 0x00000020 40083be87f9Skevlo #define DMA_CFG_RD_BURST_1024 0x00000030 40183be87f9Skevlo #define DMA_CFG_RD_BURST_2048 0x00000040 40283be87f9Skevlo #define DMA_CFG_RD_BURST_4096 0x00000050 40383be87f9Skevlo #define DMA_CFG_WR_BURST_128 0x00000000 40483be87f9Skevlo #define DMA_CFG_WR_BURST_256 0x00000080 40583be87f9Skevlo #define DMA_CFG_WR_BURST_512 0x00000100 40683be87f9Skevlo #define DMA_CFG_WR_BURST_1024 0x00000180 40783be87f9Skevlo #define DMA_CFG_WR_BURST_2048 0x00000200 40883be87f9Skevlo #define DMA_CFG_WR_BURST_4096 0x00000280 40983be87f9Skevlo #define DMA_CFG_RD_ENB 0x00000400 41083be87f9Skevlo #define DMA_CFG_WR_ENB 0x00000800 41183be87f9Skevlo #define DMA_CFG_RD_BURST_MASK 0x07 41283be87f9Skevlo #define DMA_CFG_RD_BURST_SHIFT 4 41383be87f9Skevlo #define DMA_CFG_WR_BURST_MASK 0x07 41483be87f9Skevlo #define DMA_CFG_WR_BURST_SHIFT 7 41583be87f9Skevlo 41683be87f9Skevlo #define AGE_CSMB_CTRL 0x15D0 41783be87f9Skevlo #define CSMB_CTRL_CMB_KICK 0x00000001 41883be87f9Skevlo #define CSMB_CTRL_SMB_KICK 0x00000002 41983be87f9Skevlo #define CSMB_CTRL_CMB_ENB 0x00000004 42083be87f9Skevlo #define CSMB_CTRL_SMB_ENB 0x00000008 42183be87f9Skevlo 42283be87f9Skevlo /* CMB DMA Write Threshold Register */ 42383be87f9Skevlo #define AGE_CMB_WR_THRESH 0x15D4 42483be87f9Skevlo #define CMB_WR_THRESH_RRD_MASK 0x000007FF 42583be87f9Skevlo #define CMB_WR_THRESH_TPD_MASK 0x07FF0000 42683be87f9Skevlo #define CMB_WR_THRESH_RRD_SHIFT 0 42783be87f9Skevlo #define CMB_WR_THRESH_RRD_DEFAULT 4 42883be87f9Skevlo #define CMB_WR_THRESH_TPD_SHIFT 16 42983be87f9Skevlo #define CMB_WR_THRESH_TPD_DEFAULT 4 43083be87f9Skevlo 43183be87f9Skevlo /* RX/TX count-down timer to trigger CMB-write. */ 43283be87f9Skevlo #define AGE_CMB_WR_TIMER 0x15D8 43383be87f9Skevlo #define CMB_WR_TIMER_RX_MASK 0x0000FFFF 43483be87f9Skevlo #define CMB_WR_TIMER_TX_MASK 0xFFFF0000 43583be87f9Skevlo #define CMB_WR_TIMER_RX_SHIFT 0 43683be87f9Skevlo #define CMB_WR_TIMER_TX_SHIFT 16 43783be87f9Skevlo 43883be87f9Skevlo /* Number of packet received since last CMB write */ 43983be87f9Skevlo #define AGE_CMB_RX_PKT_CNT 0x15DC 44083be87f9Skevlo 44183be87f9Skevlo /* Number of packet transmitted since last CMB write */ 44283be87f9Skevlo #define AGE_CMB_TX_PKT_CNT 0x15E0 44383be87f9Skevlo 44483be87f9Skevlo /* SMB auto DMA timer register */ 44583be87f9Skevlo #define AGE_SMB_TIMER 0x15E4 44683be87f9Skevlo 44783be87f9Skevlo #define AGE_MBOX 0x15F0 44883be87f9Skevlo #define MBOX_RD_PROD_IDX_MASK 0x000007FF 44983be87f9Skevlo #define MBOX_RRD_CONS_IDX_MASK 0x003FF800 45083be87f9Skevlo #define MBOX_TD_PROD_IDX_MASK 0xFFC00000 45183be87f9Skevlo #define MBOX_RD_PROD_IDX_SHIFT 0 45283be87f9Skevlo #define MBOX_RRD_CONS_IDX_SHIFT 11 45383be87f9Skevlo #define MBOX_TD_PROD_IDX_SHIFT 22 45483be87f9Skevlo 45583be87f9Skevlo #define AGE_INTR_STATUS 0x1600 45683be87f9Skevlo #define INTR_SMB 0x00000001 45783be87f9Skevlo #define INTR_MOD_TIMER 0x00000002 45883be87f9Skevlo #define INTR_MANUAL_TIMER 0x00000004 45983be87f9Skevlo #define INTR_RX_FIFO_OFLOW 0x00000008 46083be87f9Skevlo #define INTR_RD_UNDERRUN 0x00000010 46183be87f9Skevlo #define INTR_RRD_OFLOW 0x00000020 46283be87f9Skevlo #define INTR_TX_FIFO_UNDERRUN 0x00000040 46383be87f9Skevlo #define INTR_LINK_CHG 0x00000080 46483be87f9Skevlo #define INTR_HOST_RD_UNDERRUN 0x00000100 46583be87f9Skevlo #define INTR_HOST_RRD_OFLOW 0x00000200 46683be87f9Skevlo #define INTR_DMA_RD_TO_RST 0x00000400 46783be87f9Skevlo #define INTR_DMA_WR_TO_RST 0x00000800 46883be87f9Skevlo #define INTR_GPHY 0x00001000 46983be87f9Skevlo #define INTR_RX_PKT 0x00010000 47083be87f9Skevlo #define INTR_TX_PKT 0x00020000 47183be87f9Skevlo #define INTR_TX_DMA 0x00040000 47283be87f9Skevlo #define INTR_RX_DMA 0x00080000 47383be87f9Skevlo #define INTR_CMB_RX 0x00100000 47483be87f9Skevlo #define INTR_CMB_TX 0x00200000 47583be87f9Skevlo #define INTR_MAC_RX 0x00400000 47683be87f9Skevlo #define INTR_MAC_TX 0x00800000 47783be87f9Skevlo #define INTR_UNDERRUN 0x01000000 47883be87f9Skevlo #define INTR_FRAME_ERROR 0x02000000 47983be87f9Skevlo #define INTR_FRAME_OK 0x04000000 48083be87f9Skevlo #define INTR_CSUM_ERROR 0x08000000 48183be87f9Skevlo #define INTR_PHY_LINK_DOWN 0x10000000 48283be87f9Skevlo #define INTR_DIS_SMB 0x20000000 48383be87f9Skevlo #define INTR_DIS_DMA 0x40000000 48483be87f9Skevlo #define INTR_DIS_INT 0x80000000 48583be87f9Skevlo 48683be87f9Skevlo /* Interrupt Mask Register */ 48783be87f9Skevlo #define AGE_INTR_MASK 0x1604 48883be87f9Skevlo 48983be87f9Skevlo #define AGE_INTRS \ 49083be87f9Skevlo (INTR_SMB | INTR_DMA_RD_TO_RST | INTR_DMA_WR_TO_RST | \ 49183be87f9Skevlo INTR_CMB_TX | INTR_CMB_RX) 49283be87f9Skevlo 49383be87f9Skevlo /* Statistics counters collected by the MAC. */ 49483be87f9Skevlo struct smb { 49583be87f9Skevlo /* Rx stats. */ 49683be87f9Skevlo uint32_t rx_frames; 49783be87f9Skevlo uint32_t rx_bcast_frames; 49883be87f9Skevlo uint32_t rx_mcast_frames; 49983be87f9Skevlo uint32_t rx_pause_frames; 50083be87f9Skevlo uint32_t rx_control_frames; 50183be87f9Skevlo uint32_t rx_crcerrs; 50283be87f9Skevlo uint32_t rx_lenerrs; 50383be87f9Skevlo uint32_t rx_bytes; 50483be87f9Skevlo uint32_t rx_runts; 50583be87f9Skevlo uint32_t rx_fragments; 50683be87f9Skevlo uint32_t rx_pkts_64; 50783be87f9Skevlo uint32_t rx_pkts_65_127; 50883be87f9Skevlo uint32_t rx_pkts_128_255; 50983be87f9Skevlo uint32_t rx_pkts_256_511; 51083be87f9Skevlo uint32_t rx_pkts_512_1023; 51183be87f9Skevlo uint32_t rx_pkts_1024_1518; 51283be87f9Skevlo uint32_t rx_pkts_1519_max; 51383be87f9Skevlo uint32_t rx_pkts_truncated; 51483be87f9Skevlo uint32_t rx_fifo_oflows; 51583be87f9Skevlo uint32_t rx_desc_oflows; 51683be87f9Skevlo uint32_t rx_alignerrs; 51783be87f9Skevlo uint32_t rx_bcast_bytes; 51883be87f9Skevlo uint32_t rx_mcast_bytes; 51983be87f9Skevlo uint32_t rx_pkts_filtered; 52083be87f9Skevlo /* Tx stats. */ 52183be87f9Skevlo uint32_t tx_frames; 52283be87f9Skevlo uint32_t tx_bcast_frames; 52383be87f9Skevlo uint32_t tx_mcast_frames; 52483be87f9Skevlo uint32_t tx_pause_frames; 52583be87f9Skevlo uint32_t tx_excess_defer; 52683be87f9Skevlo uint32_t tx_control_frames; 52783be87f9Skevlo uint32_t tx_deferred; 52883be87f9Skevlo uint32_t tx_bytes; 52983be87f9Skevlo uint32_t tx_pkts_64; 53083be87f9Skevlo uint32_t tx_pkts_65_127; 53183be87f9Skevlo uint32_t tx_pkts_128_255; 53283be87f9Skevlo uint32_t tx_pkts_256_511; 53383be87f9Skevlo uint32_t tx_pkts_512_1023; 53483be87f9Skevlo uint32_t tx_pkts_1024_1518; 53583be87f9Skevlo uint32_t tx_pkts_1519_max; 53683be87f9Skevlo uint32_t tx_single_colls; 53783be87f9Skevlo uint32_t tx_multi_colls; 53883be87f9Skevlo uint32_t tx_late_colls; 53983be87f9Skevlo uint32_t tx_excess_colls; 54083be87f9Skevlo uint32_t tx_underrun; 54183be87f9Skevlo uint32_t tx_desc_underrun; 54283be87f9Skevlo uint32_t tx_lenerrs; 54383be87f9Skevlo uint32_t tx_pkts_truncated; 54483be87f9Skevlo uint32_t tx_bcast_bytes; 54583be87f9Skevlo uint32_t tx_mcast_bytes; 54683be87f9Skevlo uint32_t updated; 54783be87f9Skevlo } __packed; 54883be87f9Skevlo 54983be87f9Skevlo /* Coalescing message block */ 55083be87f9Skevlo struct cmb { 55183be87f9Skevlo uint32_t intr_status; 55283be87f9Skevlo uint32_t rprod_cons; 55383be87f9Skevlo #define RRD_PROD_MASK 0x0000FFFF 55483be87f9Skevlo #define RD_CONS_MASK 0xFFFF0000 55583be87f9Skevlo #define RRD_PROD_SHIFT 0 55683be87f9Skevlo #define RD_CONS_SHIFT 16 55783be87f9Skevlo uint32_t tpd_cons; 55883be87f9Skevlo #define CMB_UPDATED 0x00000001 55983be87f9Skevlo #define TPD_CONS_MASK 0xFFFF0000 56083be87f9Skevlo #define TPD_CONS_SHIFT 16 56183be87f9Skevlo } __packed; 56283be87f9Skevlo 56383be87f9Skevlo /* Rx return descriptor */ 56483be87f9Skevlo struct rx_rdesc { 56583be87f9Skevlo uint32_t index; 56683be87f9Skevlo #define AGE_RRD_NSEGS_MASK 0x000000FF 56783be87f9Skevlo #define AGE_RRD_CONS_MASK 0xFFFF0000 56883be87f9Skevlo #define AGE_RRD_NSEGS_SHIFT 0 56983be87f9Skevlo #define AGE_RRD_CONS_SHIFT 16 57083be87f9Skevlo uint32_t len; 57183be87f9Skevlo #define AGE_RRD_CSUM_MASK 0x0000FFFF 57283be87f9Skevlo #define AGE_RRD_LEN_MASK 0xFFFF0000 57383be87f9Skevlo #define AGE_RRD_CSUM_SHIFT 0 57483be87f9Skevlo #define AGE_RRD_LEN_SHIFT 16 57583be87f9Skevlo uint32_t flags; 57683be87f9Skevlo #define AGE_RRD_ETHERNET 0x00000080 57783be87f9Skevlo #define AGE_RRD_VLAN 0x00000100 57883be87f9Skevlo #define AGE_RRD_ERROR 0x00000200 57983be87f9Skevlo #define AGE_RRD_IPV4 0x00000400 58083be87f9Skevlo #define AGE_RRD_UDP 0x00000800 58183be87f9Skevlo #define AGE_RRD_TCP 0x00001000 58283be87f9Skevlo #define AGE_RRD_BCAST 0x00002000 58383be87f9Skevlo #define AGE_RRD_MCAST 0x00004000 58483be87f9Skevlo #define AGE_RRD_PAUSE 0x00008000 58583be87f9Skevlo #define AGE_RRD_CRC 0x00010000 58683be87f9Skevlo #define AGE_RRD_CODE 0x00020000 58783be87f9Skevlo #define AGE_RRD_DRIBBLE 0x00040000 58883be87f9Skevlo #define AGE_RRD_RUNT 0x00080000 58983be87f9Skevlo #define AGE_RRD_OFLOW 0x00100000 59083be87f9Skevlo #define AGE_RRD_TRUNC 0x00200000 59183be87f9Skevlo #define AGE_RRD_IPCSUM_NOK 0x00400000 59283be87f9Skevlo #define AGE_RRD_TCP_UDPCSUM_NOK 0x00800000 59383be87f9Skevlo #define AGE_RRD_LENGTH_NOK 0x01000000 59483be87f9Skevlo #define AGE_RRD_DES_ADDR_FILTERED 0x02000000 59583be87f9Skevlo uint32_t vtags; 59683be87f9Skevlo #define AGE_RRD_VLAN_MASK 0xFFFF0000 59783be87f9Skevlo #define AGE_RRD_VLAN_SHIFT 16 59883be87f9Skevlo } __packed; 59983be87f9Skevlo 60083be87f9Skevlo #define AGE_RX_NSEGS(x) \ 60183be87f9Skevlo (((x) & AGE_RRD_NSEGS_MASK) >> AGE_RRD_NSEGS_SHIFT) 60283be87f9Skevlo #define AGE_RX_CONS(x) \ 60383be87f9Skevlo (((x) & AGE_RRD_CONS_MASK) >> AGE_RRD_CONS_SHIFT) 60483be87f9Skevlo #define AGE_RX_CSUM(x) \ 60583be87f9Skevlo (((x) & AGE_RRD_CSUM_MASK) >> AGE_RRD_CSUM_SHIFT) 60683be87f9Skevlo #define AGE_RX_BYTES(x) \ 60783be87f9Skevlo (((x) & AGE_RRD_LEN_MASK) >> AGE_RRD_LEN_SHIFT) 60883be87f9Skevlo #define AGE_RX_VLAN(x) \ 60983be87f9Skevlo (((x) & AGE_RRD_VLAN_MASK) >> AGE_RRD_VLAN_SHIFT) 61083be87f9Skevlo #define AGE_RX_VLAN_TAG(x) \ 61183be87f9Skevlo (((x) >> 4) | (((x) & 7) << 13) | (((x) & 8) << 9)) 61283be87f9Skevlo 61383be87f9Skevlo /* Rx descriptor. */ 61483be87f9Skevlo struct rx_desc { 61583be87f9Skevlo uint64_t addr; 61683be87f9Skevlo uint32_t len; 61783be87f9Skevlo #define AGE_RD_LEN_MASK 0x0000FFFF 61883be87f9Skevlo #define AGE_CONS_UPD_REQ_MASK 0xFFFF0000 61983be87f9Skevlo #define AGE_RD_LEN_SHIFT 0 62083be87f9Skevlo #define AGE_CONS_UPD_REQ_SHIFT 16 62183be87f9Skevlo } __packed; 62283be87f9Skevlo 62383be87f9Skevlo /* Tx descriptor. */ 62483be87f9Skevlo struct tx_desc { 62583be87f9Skevlo uint64_t addr; 62683be87f9Skevlo uint32_t len; 62783be87f9Skevlo #define AGE_TD_VLAN_MASK 0xFFFF0000 62883be87f9Skevlo #define AGE_TD_PKT_INT 0x00008000 62983be87f9Skevlo #define AGE_TD_DMA_INT 0x00004000 63083be87f9Skevlo #define AGE_TD_BUFLEN_MASK 0x00003FFF 63183be87f9Skevlo #define AGE_TD_VLAN_SHIFT 16 63283be87f9Skevlo #define AGE_TX_VLAN_TAG(x) \ 63383be87f9Skevlo (((x) << 4) | ((x) >> 13) | (((x) >> 9) & 8)) 63483be87f9Skevlo #define AGE_TD_BUFLEN_SHIFT 0 63583be87f9Skevlo #define AGE_TX_BYTES(x) \ 63683be87f9Skevlo (((x) << AGE_TD_BUFLEN_SHIFT) & AGE_TD_BUFLEN_MASK) 63783be87f9Skevlo uint32_t flags; 63883be87f9Skevlo #define AGE_TD_TSO_MSS 0xFFF80000 63983be87f9Skevlo #define AGE_TD_TSO_HDR 0x00040000 64083be87f9Skevlo #define AGE_TD_TSO_TCPHDR_LEN 0x0003C000 64183be87f9Skevlo #define AGE_TD_IPHDR_LEN 0x00003C00 64283be87f9Skevlo #define AGE_TD_LLC_SNAP 0x00000200 64383be87f9Skevlo #define AGE_TD_VLAN_TAGGED 0x00000100 64483be87f9Skevlo #define AGE_TD_UDPCSUM 0x00000080 64583be87f9Skevlo #define AGE_TD_TCPCSUM 0x00000040 64683be87f9Skevlo #define AGE_TD_IPCSUM 0x00000020 64783be87f9Skevlo #define AGE_TD_TSO_IPV4 0x00000010 64883be87f9Skevlo #define AGE_TD_TSO_IPV6 0x00000012 64983be87f9Skevlo #define AGE_TD_CSUM 0x00000008 65083be87f9Skevlo #define AGE_TD_INSERT_VLAN_TAG 0x00000004 65183be87f9Skevlo #define AGE_TD_COALESCE 0x00000002 65283be87f9Skevlo #define AGE_TD_EOP 0x00000001 65383be87f9Skevlo 65483be87f9Skevlo #define AGE_TD_CSUM_PLOADOFFSET 0x00FF0000 65583be87f9Skevlo #define AGE_TD_CSUM_XSUMOFFSET 0xFF000000 65683be87f9Skevlo #define AGE_TD_CSUM_XSUMOFFSET_SHIFT 24 65783be87f9Skevlo #define AGE_TD_CSUM_PLOADOFFSET_SHIFT 16 65883be87f9Skevlo #define AGE_TD_TSO_MSS_SHIFT 19 65983be87f9Skevlo #define AGE_TD_TSO_TCPHDR_LEN_SHIFT 14 66083be87f9Skevlo #define AGE_TD_IPHDR_LEN_SHIFT 10 66183be87f9Skevlo } __packed; 66283be87f9Skevlo 66383be87f9Skevlo #define AGE_TX_RING_CNT 256 66483be87f9Skevlo #define AGE_RX_RING_CNT 256 66583be87f9Skevlo #define AGE_RR_RING_CNT (AGE_TX_RING_CNT + AGE_RX_RING_CNT) 66683be87f9Skevlo /* The following ring alignments are just guessing. */ 66783be87f9Skevlo #define AGE_TX_RING_ALIGN 16 66883be87f9Skevlo #define AGE_RX_RING_ALIGN 16 66983be87f9Skevlo #define AGE_RR_RING_ALIGN 16 67083be87f9Skevlo #define AGE_CMB_ALIGN 16 67183be87f9Skevlo #define AGE_SMB_ALIGN 16 67283be87f9Skevlo 67383be87f9Skevlo #define AGE_TSO_MAXSEGSIZE 4096 67483be87f9Skevlo #define AGE_TSO_MAXSIZE (65535 + sizeof(struct ether_vlan_header)) 67583be87f9Skevlo #define AGE_MAXTXSEGS 32 67683be87f9Skevlo 67783be87f9Skevlo #define AGE_ADDR_LO(x) ((uint64_t) (x) & 0xFFFFFFFF) 67883be87f9Skevlo #define AGE_ADDR_HI(x) ((uint64_t) (x) >> 32) 67983be87f9Skevlo 68083be87f9Skevlo #define AGE_MSI_MESSAGES 1 68183be87f9Skevlo #define AGE_MSIX_MESSAGES 1 68283be87f9Skevlo 68383be87f9Skevlo #define AGE_JUMBO_FRAMELEN 10240 68483be87f9Skevlo #define AGE_JUMBO_MTU \ 68583be87f9Skevlo (AGE_JUMBO_FRAMELEN - EVL_ENCAPLEN - \ 68683be87f9Skevlo ETHER_HDR_LEN - ETHER_CRC_LEN) 68783be87f9Skevlo 68883be87f9Skevlo #define AGE_DESC_INC(x, y) ((x) = ((x) + 1) % (y)) 68983be87f9Skevlo 69083be87f9Skevlo #define AGE_PROC_MIN 30 69183be87f9Skevlo #define AGE_PROC_MAX (AGE_RX_RING_CNT - 1) 69283be87f9Skevlo #define AGE_PROC_DEFAULT (AGE_RX_RING_CNT / 2) 69383be87f9Skevlo 69483be87f9Skevlo struct age_txdesc { 69583be87f9Skevlo struct mbuf *tx_m; 69683be87f9Skevlo bus_dmamap_t tx_dmamap; 69783be87f9Skevlo struct tx_desc *tx_desc; 69883be87f9Skevlo }; 69983be87f9Skevlo 70083be87f9Skevlo struct age_rxdesc { 70183be87f9Skevlo struct mbuf *rx_m; 70283be87f9Skevlo bus_dmamap_t rx_dmamap; 70383be87f9Skevlo struct rx_desc *rx_desc; 70483be87f9Skevlo }; 70583be87f9Skevlo 70683be87f9Skevlo struct age_chain_data{ 70783be87f9Skevlo struct age_txdesc age_txdesc[AGE_TX_RING_CNT]; 70883be87f9Skevlo struct age_rxdesc age_rxdesc[AGE_RX_RING_CNT]; 70983be87f9Skevlo bus_dmamap_t age_tx_ring_map; 71083be87f9Skevlo bus_dma_segment_t age_tx_ring_seg; 71183be87f9Skevlo bus_dmamap_t age_rx_ring_map; 71283be87f9Skevlo bus_dma_segment_t age_rx_ring_seg; 71383be87f9Skevlo bus_dmamap_t age_rx_sparemap; 71483be87f9Skevlo bus_dmamap_t age_rr_ring_map; 71583be87f9Skevlo bus_dma_segment_t age_rr_ring_seg; 71683be87f9Skevlo bus_dmamap_t age_cmb_block_map; 71783be87f9Skevlo bus_dma_segment_t age_cmb_block_seg; 71883be87f9Skevlo bus_dmamap_t age_smb_block_map; 71983be87f9Skevlo bus_dma_segment_t age_smb_block_seg; 72083be87f9Skevlo 72183be87f9Skevlo int age_tx_prod; 72283be87f9Skevlo int age_tx_cons; 72383be87f9Skevlo int age_tx_cnt; 72483be87f9Skevlo int age_rx_cons; 72583be87f9Skevlo int age_rr_cons; 72683be87f9Skevlo int age_rxlen; 72783be87f9Skevlo 72883be87f9Skevlo struct mbuf *age_rxhead; 72983be87f9Skevlo struct mbuf *age_rxtail; 73083be87f9Skevlo struct mbuf *age_rxprev_tail; 73183be87f9Skevlo }; 73283be87f9Skevlo 73383be87f9Skevlo struct age_ring_data { 73483be87f9Skevlo struct tx_desc *age_tx_ring; 73583be87f9Skevlo bus_dma_segment_t age_tx_ring_seg; 73683be87f9Skevlo bus_addr_t age_tx_ring_paddr; 73783be87f9Skevlo struct rx_desc *age_rx_ring; 73883be87f9Skevlo bus_dma_segment_t age_rx_ring_seg; 73983be87f9Skevlo bus_addr_t age_rx_ring_paddr; 74083be87f9Skevlo struct rx_rdesc *age_rr_ring; 74183be87f9Skevlo bus_dma_segment_t age_rr_ring_seg; 74283be87f9Skevlo bus_addr_t age_rr_ring_paddr; 74383be87f9Skevlo struct cmb *age_cmb_block; 74483be87f9Skevlo bus_dma_segment_t age_cmb_block_seg; 74583be87f9Skevlo bus_addr_t age_cmb_block_paddr; 74683be87f9Skevlo struct smb *age_smb_block; 74783be87f9Skevlo bus_dma_segment_t age_smb_block_seg; 74883be87f9Skevlo bus_addr_t age_smb_block_paddr; 74983be87f9Skevlo }; 75083be87f9Skevlo 75183be87f9Skevlo #define AGE_TX_RING_SZ \ 75283be87f9Skevlo (sizeof(struct tx_desc) * AGE_TX_RING_CNT) 75383be87f9Skevlo #define AGE_RX_RING_SZ \ 75483be87f9Skevlo (sizeof(struct rx_desc) * AGE_RX_RING_CNT) 75583be87f9Skevlo #define AGE_RR_RING_SZ \ 75683be87f9Skevlo (sizeof(struct rx_rdesc) * AGE_RR_RING_CNT) 75783be87f9Skevlo #define AGE_CMB_BLOCK_SZ sizeof(struct cmb) 75883be87f9Skevlo #define AGE_SMB_BLOCK_SZ sizeof(struct smb) 75983be87f9Skevlo 76083be87f9Skevlo struct age_stats { 76183be87f9Skevlo /* Rx stats. */ 76283be87f9Skevlo uint64_t rx_frames; 76383be87f9Skevlo uint64_t rx_bcast_frames; 76483be87f9Skevlo uint64_t rx_mcast_frames; 76583be87f9Skevlo uint32_t rx_pause_frames; 76683be87f9Skevlo uint32_t rx_control_frames; 76783be87f9Skevlo uint32_t rx_crcerrs; 76883be87f9Skevlo uint32_t rx_lenerrs; 76983be87f9Skevlo uint64_t rx_bytes; 77083be87f9Skevlo uint32_t rx_runts; 77183be87f9Skevlo uint64_t rx_fragments; 77283be87f9Skevlo uint64_t rx_pkts_64; 77383be87f9Skevlo uint64_t rx_pkts_65_127; 77483be87f9Skevlo uint64_t rx_pkts_128_255; 77583be87f9Skevlo uint64_t rx_pkts_256_511; 77683be87f9Skevlo uint64_t rx_pkts_512_1023; 77783be87f9Skevlo uint64_t rx_pkts_1024_1518; 77883be87f9Skevlo uint64_t rx_pkts_1519_max; 77983be87f9Skevlo uint64_t rx_pkts_truncated; 78083be87f9Skevlo uint32_t rx_fifo_oflows; 78183be87f9Skevlo uint32_t rx_desc_oflows; 78283be87f9Skevlo uint32_t rx_alignerrs; 78383be87f9Skevlo uint64_t rx_bcast_bytes; 78483be87f9Skevlo uint64_t rx_mcast_bytes; 78583be87f9Skevlo uint64_t rx_pkts_filtered; 78683be87f9Skevlo /* Tx stats. */ 78783be87f9Skevlo uint64_t tx_frames; 78883be87f9Skevlo uint64_t tx_bcast_frames; 78983be87f9Skevlo uint64_t tx_mcast_frames; 79083be87f9Skevlo uint32_t tx_pause_frames; 79183be87f9Skevlo uint32_t tx_excess_defer; 79283be87f9Skevlo uint32_t tx_control_frames; 79383be87f9Skevlo uint32_t tx_deferred; 79483be87f9Skevlo uint64_t tx_bytes; 79583be87f9Skevlo uint64_t tx_pkts_64; 79683be87f9Skevlo uint64_t tx_pkts_65_127; 79783be87f9Skevlo uint64_t tx_pkts_128_255; 79883be87f9Skevlo uint64_t tx_pkts_256_511; 79983be87f9Skevlo uint64_t tx_pkts_512_1023; 80083be87f9Skevlo uint64_t tx_pkts_1024_1518; 80183be87f9Skevlo uint64_t tx_pkts_1519_max; 80283be87f9Skevlo uint32_t tx_single_colls; 80383be87f9Skevlo uint32_t tx_multi_colls; 80483be87f9Skevlo uint32_t tx_late_colls; 80583be87f9Skevlo uint32_t tx_excess_colls; 80683be87f9Skevlo uint32_t tx_underrun; 80783be87f9Skevlo uint32_t tx_desc_underrun; 80883be87f9Skevlo uint32_t tx_lenerrs; 80983be87f9Skevlo uint32_t tx_pkts_truncated; 81083be87f9Skevlo uint64_t tx_bcast_bytes; 81183be87f9Skevlo uint64_t tx_mcast_bytes; 81283be87f9Skevlo }; 81383be87f9Skevlo 81483be87f9Skevlo /* 81583be87f9Skevlo * Software state per device. 81683be87f9Skevlo */ 81783be87f9Skevlo struct age_softc { 81883be87f9Skevlo struct device sc_dev; 81983be87f9Skevlo struct arpcom sc_arpcom; 82083be87f9Skevlo 82183be87f9Skevlo bus_space_tag_t sc_mem_bt; 82283be87f9Skevlo bus_space_handle_t sc_mem_bh; 82383be87f9Skevlo bus_size_t sc_mem_size; 82483be87f9Skevlo bus_dma_tag_t sc_dmat; 82583be87f9Skevlo pci_chipset_tag_t sc_pct; 82683be87f9Skevlo pcitag_t sc_pcitag; 82783be87f9Skevlo 82883be87f9Skevlo void *sc_irq_handle; 82983be87f9Skevlo 83083be87f9Skevlo struct mii_data sc_miibus; 83183be87f9Skevlo int age_rev; 83283be87f9Skevlo int age_chip_rev; 83383be87f9Skevlo int age_phyaddr; 83483be87f9Skevlo 835e991b767Skevlo uint8_t age_eaddr[ETHER_ADDR_LEN]; 83683be87f9Skevlo uint32_t age_dma_rd_burst; 83783be87f9Skevlo uint32_t age_dma_wr_burst; 83883be87f9Skevlo 83983be87f9Skevlo uint32_t age_flags; 84083be87f9Skevlo #define AGE_FLAG_PCIE 0x0001 84183be87f9Skevlo #define AGE_FLAG_PCIX 0x0002 84283be87f9Skevlo #define AGE_FLAG_MSI 0x0004 84383be87f9Skevlo #define AGE_FLAG_MSIX 0x0008 84483be87f9Skevlo #define AGE_FLAG_PMCAP 0x0010 84583be87f9Skevlo #define AGE_FLAG_DETACH 0x4000 84683be87f9Skevlo #define AGE_FLAG_LINK 0x8000 84783be87f9Skevlo 84883be87f9Skevlo struct timeout age_tick_ch; 84983be87f9Skevlo struct age_stats age_stat; 85083be87f9Skevlo struct age_chain_data age_cdata; 85183be87f9Skevlo struct age_ring_data age_rdata; 85283be87f9Skevlo int age_process_limit; 85383be87f9Skevlo int age_int_mod; 85483be87f9Skevlo int age_max_frame_size; 85583be87f9Skevlo int age_morework; 85683be87f9Skevlo int age_rr_prod; 85783be87f9Skevlo int age_tpd_cons; 85883be87f9Skevlo 85983be87f9Skevlo int age_txd_spare; 86083be87f9Skevlo }; 86183be87f9Skevlo 86283be87f9Skevlo /* Register access macros. */ 86383be87f9Skevlo #define CSR_WRITE_4(sc, reg, val) \ 86483be87f9Skevlo bus_space_write_4((sc)->sc_mem_bt, (sc)->sc_mem_bh, (reg), (val)) 86583be87f9Skevlo #define CSR_WRITE_2(sc, reg, val) \ 86683be87f9Skevlo bus_space_write_2((sc)->sc_mem_bt, (sc)->sc_mem_bh, (reg), (val)) 86783be87f9Skevlo #define CSR_READ_2(sc, reg) \ 86883be87f9Skevlo bus_space_read_2((sc)->sc_mem_bt, (sc)->sc_mem_bh, (reg)) 86983be87f9Skevlo #define CSR_READ_4(sc, reg) \ 87083be87f9Skevlo bus_space_read_4((sc)->sc_mem_bt, (sc)->sc_mem_bh, (reg)) 87183be87f9Skevlo 87283be87f9Skevlo 87383be87f9Skevlo #define AGE_COMMIT_MBOX(_sc) \ 87483be87f9Skevlo do { \ 87583be87f9Skevlo CSR_WRITE_4(_sc, AGE_MBOX, \ 87683be87f9Skevlo (((_sc)->age_cdata.age_rx_cons << MBOX_RD_PROD_IDX_SHIFT) & \ 87783be87f9Skevlo MBOX_RD_PROD_IDX_MASK) | \ 87883be87f9Skevlo (((_sc)->age_cdata.age_rr_cons << \ 87983be87f9Skevlo MBOX_RRD_CONS_IDX_SHIFT) & MBOX_RRD_CONS_IDX_MASK) | \ 88083be87f9Skevlo (((_sc)->age_cdata.age_tx_prod << MBOX_TD_PROD_IDX_SHIFT) & \ 88183be87f9Skevlo MBOX_TD_PROD_IDX_MASK)); \ 88283be87f9Skevlo } while (0) 88383be87f9Skevlo 88483be87f9Skevlo #define AGE_RXCHAIN_RESET(_sc) \ 88583be87f9Skevlo do { \ 88683be87f9Skevlo (_sc)->age_cdata.age_rxhead = NULL; \ 88783be87f9Skevlo (_sc)->age_cdata.age_rxtail = NULL; \ 88883be87f9Skevlo (_sc)->age_cdata.age_rxprev_tail = NULL; \ 88983be87f9Skevlo (_sc)->age_cdata.age_rxlen = 0; \ 89083be87f9Skevlo } while (0) 89183be87f9Skevlo 89283be87f9Skevlo #define AGE_TX_TIMEOUT 5 89383be87f9Skevlo #define AGE_RESET_TIMEOUT 100 89483be87f9Skevlo #define AGE_TIMEOUT 1000 89583be87f9Skevlo #define AGE_PHY_TIMEOUT 1000 89683be87f9Skevlo 89783be87f9Skevlo #endif /* _IF_AGEREG_H */ 898