1*4b1a56afSjsg /* $OpenBSD: if_alereg.h,v 1.4 2022/01/09 05:42:46 jsg Exp $ */ 2cca0b726Skevlo /*- 3cca0b726Skevlo * Copyright (c) 2008, Pyun YongHyeon <yongari@FreeBSD.org> 4cca0b726Skevlo * All rights reserved. 5cca0b726Skevlo * 6cca0b726Skevlo * Redistribution and use in source and binary forms, with or without 7cca0b726Skevlo * modification, are permitted provided that the following conditions 8cca0b726Skevlo * are met: 9cca0b726Skevlo * 1. Redistributions of source code must retain the above copyright 10cca0b726Skevlo * notice unmodified, this list of conditions, and the following 11cca0b726Skevlo * disclaimer. 12cca0b726Skevlo * 2. Redistributions in binary form must reproduce the above copyright 13cca0b726Skevlo * notice, this list of conditions and the following disclaimer in the 14cca0b726Skevlo * documentation and/or other materials provided with the distribution. 15cca0b726Skevlo * 16cca0b726Skevlo * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17cca0b726Skevlo * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18cca0b726Skevlo * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19cca0b726Skevlo * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20cca0b726Skevlo * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2121f3d36cSkevlo * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22cca0b726Skevlo * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23cca0b726Skevlo * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24cca0b726Skevlo * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25cca0b726Skevlo * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2621f3d36cSkevlo * SUCH DAMAGE. 27cca0b726Skevlo * 28cca0b726Skevlo * $FreeBSD: src/sys/dev/ale/if_alereg.h,v 1.1 2008/11/12 09:52:06 yongari Exp $ 29cca0b726Skevlo */ 30cca0b726Skevlo 31cca0b726Skevlo #ifndef _IF_ALEREG_H 32cca0b726Skevlo #define _IF_ALEREG_H 33cca0b726Skevlo 34cca0b726Skevlo #define ALE_PCIR_BAR 0x10 35cca0b726Skevlo 36cca0b726Skevlo #define ALE_SPI_CTRL 0x200 37cca0b726Skevlo #define SPI_VPD_ENB 0x00002000 38cca0b726Skevlo 39cca0b726Skevlo #define ALE_SPI_ADDR 0x204 /* 16bits */ 40cca0b726Skevlo 41cca0b726Skevlo #define ALE_SPI_DATA 0x208 42cca0b726Skevlo 43cca0b726Skevlo #define ALE_SPI_CONFIG 0x20C 44cca0b726Skevlo 45cca0b726Skevlo #define ALE_SPI_OP_PROGRAM 0x210 /* 8bits */ 46cca0b726Skevlo 47cca0b726Skevlo #define ALE_SPI_OP_SC_ERASE 0x211 /* 8bits */ 48cca0b726Skevlo 49cca0b726Skevlo #define ALE_SPI_OP_CHIP_ERASE 0x212 /* 8bits */ 50cca0b726Skevlo 51cca0b726Skevlo #define ALE_SPI_OP_RDID 0x213 /* 8bits */ 52cca0b726Skevlo 53cca0b726Skevlo #define ALE_SPI_OP_WREN 0x214 /* 8bits */ 54cca0b726Skevlo 55cca0b726Skevlo #define ALE_SPI_OP_RDSR 0x215 /* 8bits */ 56cca0b726Skevlo 57cca0b726Skevlo #define ALE_SPI_OP_WRSR 0x216 /* 8bits */ 58cca0b726Skevlo 59cca0b726Skevlo #define ALE_SPI_OP_READ 0x217 /* 8bits */ 60cca0b726Skevlo 61cca0b726Skevlo #define ALE_TWSI_CTRL 0x218 62cca0b726Skevlo #define TWSI_CTRL_SW_LD_START 0x00000800 63cca0b726Skevlo #define TWSI_CTRL_HW_LD_START 0x00001000 64cca0b726Skevlo #define TWSI_CTRL_LD_EXIST 0x00400000 65cca0b726Skevlo 66cca0b726Skevlo #define ALE_DEV_MISC_CTRL 0x21C 67cca0b726Skevlo 68cca0b726Skevlo #define ALE_PCIE_PHYMISC 0x1000 69cca0b726Skevlo #define PCIE_PHYMISC_FORCE_RCV_DET 0x00000004 70cca0b726Skevlo 71cca0b726Skevlo #define ALE_MASTER_CFG 0x1400 72cca0b726Skevlo #define MASTER_RESET 0x00000001 73cca0b726Skevlo #define MASTER_MTIMER_ENB 0x00000002 74cca0b726Skevlo #define MASTER_IM_TX_TIMER_ENB 0x00000004 75cca0b726Skevlo #define MASTER_MANUAL_INT_ENB 0x00000008 76cca0b726Skevlo #define MASTER_IM_RX_TIMER_ENB 0x00000020 77cca0b726Skevlo #define MASTER_INT_RDCLR 0x00000040 78cca0b726Skevlo #define MASTER_LED_MODE 0x00000200 79cca0b726Skevlo #define MASTER_CHIP_REV_MASK 0x00FF0000 80cca0b726Skevlo #define MASTER_CHIP_ID_MASK 0xFF000000 81cca0b726Skevlo #define MASTER_CHIP_REV_SHIFT 16 82cca0b726Skevlo #define MASTER_CHIP_ID_SHIFT 24 83cca0b726Skevlo 84cca0b726Skevlo /* Number of ticks per usec for AR81xx. */ 85cca0b726Skevlo #define ALE_TICK_USECS 2 86cca0b726Skevlo #define ALE_USECS(x) ((x) / ALE_TICK_USECS) 87cca0b726Skevlo 88cca0b726Skevlo #define ALE_MANUAL_TIMER 0x1404 89cca0b726Skevlo 90cca0b726Skevlo #define ALE_IM_TIMER 0x1408 91cca0b726Skevlo #define IM_TIMER_TX_MASK 0x0000FFFF 92cca0b726Skevlo #define IM_TIMER_RX_MASK 0xFFFF0000 93cca0b726Skevlo #define IM_TIMER_TX_SHIFT 0 94cca0b726Skevlo #define IM_TIMER_RX_SHIFT 16 95cca0b726Skevlo #define ALE_IM_TIMER_MIN 0 96cca0b726Skevlo #define ALE_IM_TIMER_MAX 130000 /* 130ms */ 97cca0b726Skevlo #define ALE_IM_RX_TIMER_DEFAULT 30 98cca0b726Skevlo #define ALE_IM_TX_TIMER_DEFAULT 1000 99cca0b726Skevlo 100cca0b726Skevlo #define ALE_GPHY_CTRL 0x140C /* 16bits */ 101cca0b726Skevlo #define GPHY_CTRL_EXT_RESET 0x0001 102cca0b726Skevlo #define GPHY_CTRL_PIPE_MOD 0x0002 103cca0b726Skevlo #define GPHY_CTRL_BERT_START 0x0010 104cca0b726Skevlo #define GPHY_CTRL_GALE_25M_ENB 0x0020 105cca0b726Skevlo #define GPHY_CTRL_LPW_EXIT 0x0040 106cca0b726Skevlo #define GPHY_CTRL_PHY_IDDQ 0x0080 107cca0b726Skevlo #define GPHY_CTRL_PHY_IDDQ_DIS 0x0100 108cca0b726Skevlo #define GPHY_CTRL_PCLK_SEL_DIS 0x0200 109cca0b726Skevlo #define GPHY_CTRL_HIB_EN 0x0400 110cca0b726Skevlo #define GPHY_CTRL_HIB_PULSE 0x0800 111cca0b726Skevlo #define GPHY_CTRL_SEL_ANA_RESET 0x1000 112cca0b726Skevlo #define GPHY_CTRL_PHY_PLL_ON 0x2000 113cca0b726Skevlo #define GPHY_CTRL_PWDOWN_HW 0x4000 114cca0b726Skevlo 115cca0b726Skevlo #define ALE_INTR_CLR_TIMER 0x140E /* 16bits */ 116cca0b726Skevlo 117cca0b726Skevlo #define ALE_IDLE_STATUS 0x1410 118cca0b726Skevlo #define IDLE_STATUS_RXMAC 0x00000001 119cca0b726Skevlo #define IDLE_STATUS_TXMAC 0x00000002 120cca0b726Skevlo #define IDLE_STATUS_RXQ 0x00000004 121cca0b726Skevlo #define IDLE_STATUS_TXQ 0x00000008 122cca0b726Skevlo #define IDLE_STATUS_DMARD 0x00000010 123cca0b726Skevlo #define IDLE_STATUS_DMAWR 0x00000020 124cca0b726Skevlo #define IDLE_STATUS_SMB 0x00000040 125cca0b726Skevlo #define IDLE_STATUS_CMB 0x00000080 126cca0b726Skevlo 127cca0b726Skevlo #define ALE_MDIO 0x1414 128cca0b726Skevlo #define MDIO_DATA_MASK 0x0000FFFF 129cca0b726Skevlo #define MDIO_REG_ADDR_MASK 0x001F0000 130cca0b726Skevlo #define MDIO_OP_READ 0x00200000 131cca0b726Skevlo #define MDIO_OP_WRITE 0x00000000 132cca0b726Skevlo #define MDIO_SUP_PREAMBLE 0x00400000 133cca0b726Skevlo #define MDIO_OP_EXECUTE 0x00800000 134cca0b726Skevlo #define MDIO_CLK_25_4 0x00000000 135cca0b726Skevlo #define MDIO_CLK_25_6 0x02000000 136cca0b726Skevlo #define MDIO_CLK_25_8 0x03000000 137cca0b726Skevlo #define MDIO_CLK_25_10 0x04000000 138cca0b726Skevlo #define MDIO_CLK_25_14 0x05000000 139cca0b726Skevlo #define MDIO_CLK_25_20 0x06000000 140cca0b726Skevlo #define MDIO_CLK_25_28 0x07000000 141cca0b726Skevlo #define MDIO_OP_BUSY 0x08000000 142cca0b726Skevlo #define MDIO_DATA_SHIFT 0 143cca0b726Skevlo #define MDIO_REG_ADDR_SHIFT 16 144cca0b726Skevlo 145cca0b726Skevlo #define MDIO_REG_ADDR(x) \ 146cca0b726Skevlo (((x) << MDIO_REG_ADDR_SHIFT) & MDIO_REG_ADDR_MASK) 147cca0b726Skevlo /* Default PHY address. */ 148cca0b726Skevlo #define ALE_PHY_ADDR 0 149cca0b726Skevlo 150cca0b726Skevlo #define ALE_PHY_STATUS 0x1418 151cca0b726Skevlo #define PHY_STATUS_100M 0x00020000 152cca0b726Skevlo 153cca0b726Skevlo /* Packet memory BIST. */ 154cca0b726Skevlo #define ALE_BIST0 0x141C 155cca0b726Skevlo #define BIST0_ENB 0x00000001 156cca0b726Skevlo #define BIST0_SRAM_FAIL 0x00000002 157cca0b726Skevlo #define BIST0_FUSE_FLAG 0x00000004 158cca0b726Skevlo 159cca0b726Skevlo /* PCIe retry buffer BIST. */ 160cca0b726Skevlo #define ALE_BIST1 0x1420 161cca0b726Skevlo #define BIST1_ENB 0x00000001 162cca0b726Skevlo #define BIST1_SRAM_FAIL 0x00000002 163cca0b726Skevlo #define BIST1_FUSE_FLAG 0x00000004 164cca0b726Skevlo 165cca0b726Skevlo #define ALE_SERDES_LOCK 0x1424 166cca0b726Skevlo #define SERDES_LOCK_DET 0x00000001 167cca0b726Skevlo #define SERDES_LOCK_DET_ENB 0x00000002 168cca0b726Skevlo 169cca0b726Skevlo #define ALE_MAC_CFG 0x1480 170cca0b726Skevlo #define MAC_CFG_TX_ENB 0x00000001 171cca0b726Skevlo #define MAC_CFG_RX_ENB 0x00000002 172cca0b726Skevlo #define MAC_CFG_TX_FC 0x00000004 173cca0b726Skevlo #define MAC_CFG_RX_FC 0x00000008 174cca0b726Skevlo #define MAC_CFG_LOOP 0x00000010 175cca0b726Skevlo #define MAC_CFG_FULL_DUPLEX 0x00000020 176cca0b726Skevlo #define MAC_CFG_TX_CRC_ENB 0x00000040 177cca0b726Skevlo #define MAC_CFG_TX_AUTO_PAD 0x00000080 178cca0b726Skevlo #define MAC_CFG_TX_LENCHK 0x00000100 179cca0b726Skevlo #define MAC_CFG_RX_JUMBO_ENB 0x00000200 180cca0b726Skevlo #define MAC_CFG_PREAMBLE_MASK 0x00003C00 181cca0b726Skevlo #define MAC_CFG_VLAN_TAG_STRIP 0x00004000 182cca0b726Skevlo #define MAC_CFG_PROMISC 0x00008000 183cca0b726Skevlo #define MAC_CFG_TX_PAUSE 0x00010000 184cca0b726Skevlo #define MAC_CFG_SCNT 0x00020000 185cca0b726Skevlo #define MAC_CFG_SYNC_RST_TX 0x00040000 186cca0b726Skevlo #define MAC_CFG_SPEED_MASK 0x00300000 187cca0b726Skevlo #define MAC_CFG_SPEED_10_100 0x00100000 188cca0b726Skevlo #define MAC_CFG_SPEED_1000 0x00200000 189cca0b726Skevlo #define MAC_CFG_DBG_TX_BACKOFF 0x00400000 190cca0b726Skevlo #define MAC_CFG_TX_JUMBO_ENB 0x00800000 191cca0b726Skevlo #define MAC_CFG_RXCSUM_ENB 0x01000000 192cca0b726Skevlo #define MAC_CFG_ALLMULTI 0x02000000 193cca0b726Skevlo #define MAC_CFG_BCAST 0x04000000 194cca0b726Skevlo #define MAC_CFG_DBG 0x08000000 195cca0b726Skevlo #define MAC_CFG_PREAMBLE_SHIFT 10 196cca0b726Skevlo #define MAC_CFG_PREAMBLE_DEFAULT 7 197cca0b726Skevlo 198cca0b726Skevlo #define ALE_IPG_IFG_CFG 0x1484 199cca0b726Skevlo #define IPG_IFG_IPGT_MASK 0x0000007F 200cca0b726Skevlo #define IPG_IFG_MIFG_MASK 0x0000FF00 201cca0b726Skevlo #define IPG_IFG_IPG1_MASK 0x007F0000 202cca0b726Skevlo #define IPG_IFG_IPG2_MASK 0x7F000000 203cca0b726Skevlo #define IPG_IFG_IPGT_SHIFT 0 204cca0b726Skevlo #define IPG_IFG_IPGT_DEFAULT 0x60 205cca0b726Skevlo #define IPG_IFG_MIFG_SHIFT 8 206cca0b726Skevlo #define IPG_IFG_MIFG_DEFAULT 0x50 207cca0b726Skevlo #define IPG_IFG_IPG1_SHIFT 16 208cca0b726Skevlo #define IPG_IFG_IPG1_DEFAULT 0x40 209cca0b726Skevlo #define IPG_IFG_IPG2_SHIFT 24 210cca0b726Skevlo #define IPG_IFG_IPG2_DEFAULT 0x60 211cca0b726Skevlo 212cca0b726Skevlo /* Station address. */ 213cca0b726Skevlo #define ALE_PAR0 0x1488 214cca0b726Skevlo #define ALE_PAR1 0x148C 215cca0b726Skevlo 216cca0b726Skevlo /* 64bit multicast hash register. */ 217cca0b726Skevlo #define ALE_MAR0 0x1490 218cca0b726Skevlo #define ALE_MAR1 0x1494 219cca0b726Skevlo 220cca0b726Skevlo /* half-duplex parameter configuration. */ 221cca0b726Skevlo #define ALE_HDPX_CFG 0x1498 222cca0b726Skevlo #define HDPX_CFG_LCOL_MASK 0x000003FF 223cca0b726Skevlo #define HDPX_CFG_RETRY_MASK 0x0000F000 224cca0b726Skevlo #define HDPX_CFG_EXC_DEF_EN 0x00010000 225cca0b726Skevlo #define HDPX_CFG_NO_BACK_C 0x00020000 226cca0b726Skevlo #define HDPX_CFG_NO_BACK_P 0x00040000 227cca0b726Skevlo #define HDPX_CFG_ABEBE 0x00080000 228cca0b726Skevlo #define HDPX_CFG_ABEBT_MASK 0x00F00000 229cca0b726Skevlo #define HDPX_CFG_JAMIPG_MASK 0x0F000000 230cca0b726Skevlo #define HDPX_CFG_LCOL_SHIFT 0 231cca0b726Skevlo #define HDPX_CFG_LCOL_DEFAULT 0x37 232cca0b726Skevlo #define HDPX_CFG_RETRY_SHIFT 12 233cca0b726Skevlo #define HDPX_CFG_RETRY_DEFAULT 0x0F 234cca0b726Skevlo #define HDPX_CFG_ABEBT_SHIFT 20 235cca0b726Skevlo #define HDPX_CFG_ABEBT_DEFAULT 0x0A 236cca0b726Skevlo #define HDPX_CFG_JAMIPG_SHIFT 24 237cca0b726Skevlo #define HDPX_CFG_JAMIPG_DEFAULT 0x07 238cca0b726Skevlo 239cca0b726Skevlo #define ALE_FRAME_SIZE 0x149C 240cca0b726Skevlo 241cca0b726Skevlo #define ALE_WOL_CFG 0x14A0 242cca0b726Skevlo #define WOL_CFG_PATTERN 0x00000001 243cca0b726Skevlo #define WOL_CFG_PATTERN_ENB 0x00000002 244cca0b726Skevlo #define WOL_CFG_MAGIC 0x00000004 245cca0b726Skevlo #define WOL_CFG_MAGIC_ENB 0x00000008 246cca0b726Skevlo #define WOL_CFG_LINK_CHG 0x00000010 247cca0b726Skevlo #define WOL_CFG_LINK_CHG_ENB 0x00000020 248cca0b726Skevlo #define WOL_CFG_PATTERN_DET 0x00000100 249cca0b726Skevlo #define WOL_CFG_MAGIC_DET 0x00000200 250cca0b726Skevlo #define WOL_CFG_LINK_CHG_DET 0x00000400 251cca0b726Skevlo #define WOL_CFG_CLK_SWITCH_ENB 0x00008000 252cca0b726Skevlo #define WOL_CFG_PATTERN0 0x00010000 253cca0b726Skevlo #define WOL_CFG_PATTERN1 0x00020000 254cca0b726Skevlo #define WOL_CFG_PATTERN2 0x00040000 255cca0b726Skevlo #define WOL_CFG_PATTERN3 0x00080000 256cca0b726Skevlo #define WOL_CFG_PATTERN4 0x00100000 257cca0b726Skevlo #define WOL_CFG_PATTERN5 0x00200000 258cca0b726Skevlo #define WOL_CFG_PATTERN6 0x00400000 259cca0b726Skevlo 260cca0b726Skevlo /* WOL pattern length. */ 261cca0b726Skevlo #define ALE_PATTERN_CFG0 0x14A4 262cca0b726Skevlo #define PATTERN_CFG_0_LEN_MASK 0x0000007F 263cca0b726Skevlo #define PATTERN_CFG_1_LEN_MASK 0x00007F00 264cca0b726Skevlo #define PATTERN_CFG_2_LEN_MASK 0x007F0000 265cca0b726Skevlo #define PATTERN_CFG_3_LEN_MASK 0x7F000000 266cca0b726Skevlo 267cca0b726Skevlo #define ALE_PATTERN_CFG1 0x14A8 268cca0b726Skevlo #define PATTERN_CFG_4_LEN_MASK 0x0000007F 269cca0b726Skevlo #define PATTERN_CFG_5_LEN_MASK 0x00007F00 270cca0b726Skevlo #define PATTERN_CFG_6_LEN_MASK 0x007F0000 271cca0b726Skevlo 272cca0b726Skevlo /* RSS */ 273cca0b726Skevlo #define ALE_RSS_KEY0 0x14B0 274cca0b726Skevlo 275cca0b726Skevlo #define ALE_RSS_KEY1 0x14B4 276cca0b726Skevlo 277cca0b726Skevlo #define ALE_RSS_KEY2 0x14B8 278cca0b726Skevlo 279cca0b726Skevlo #define ALE_RSS_KEY3 0x14BC 280cca0b726Skevlo 281cca0b726Skevlo #define ALE_RSS_KEY4 0x14C0 282cca0b726Skevlo 283cca0b726Skevlo #define ALE_RSS_KEY5 0x14C4 284cca0b726Skevlo 285cca0b726Skevlo #define ALE_RSS_KEY6 0x14C8 286cca0b726Skevlo 287cca0b726Skevlo #define ALE_RSS_KEY7 0x14CC 288cca0b726Skevlo 289cca0b726Skevlo #define ALE_RSS_KEY8 0x14D0 290cca0b726Skevlo 291cca0b726Skevlo #define ALE_RSS_KEY9 0x14D4 292cca0b726Skevlo 293cca0b726Skevlo #define ALE_RSS_IDT_TABLE4 0x14E0 294cca0b726Skevlo 295cca0b726Skevlo #define ALE_RSS_IDT_TABLE5 0x14E4 296cca0b726Skevlo 297cca0b726Skevlo #define ALE_RSS_IDT_TABLE6 0x14E8 298cca0b726Skevlo 299cca0b726Skevlo #define ALE_RSS_IDT_TABLE7 0x14EC 300cca0b726Skevlo 301cca0b726Skevlo #define ALE_SRAM_RD_ADDR 0x1500 302cca0b726Skevlo 303cca0b726Skevlo #define ALE_SRAM_RD_LEN 0x1504 304cca0b726Skevlo 305cca0b726Skevlo #define ALE_SRAM_RRD_ADDR 0x1508 306cca0b726Skevlo 307cca0b726Skevlo #define ALE_SRAM_RRD_LEN 0x150C 308cca0b726Skevlo 309cca0b726Skevlo #define ALE_SRAM_TPD_ADDR 0x1510 310cca0b726Skevlo 311cca0b726Skevlo #define ALE_SRAM_TPD_LEN 0x1514 312cca0b726Skevlo 313cca0b726Skevlo #define ALE_SRAM_TRD_ADDR 0x1518 314cca0b726Skevlo 315cca0b726Skevlo #define ALE_SRAM_TRD_LEN 0x151C 316cca0b726Skevlo 317cca0b726Skevlo #define ALE_SRAM_RX_FIFO_ADDR 0x1520 318cca0b726Skevlo 319cca0b726Skevlo #define ALE_SRAM_RX_FIFO_LEN 0x1524 320cca0b726Skevlo 321cca0b726Skevlo #define ALE_SRAM_TX_FIFO_ADDR 0x1528 322cca0b726Skevlo 323cca0b726Skevlo #define ALE_SRAM_TX_FIFO_LEN 0x152C 324cca0b726Skevlo 325cca0b726Skevlo #define ALE_SRAM_TCPH_ADDR 0x1530 326cca0b726Skevlo #define SRAM_TCPH_ADDR_MASK 0x00000FFF 327cca0b726Skevlo #define SRAM_PATH_ADDR_MASK 0x0FFF0000 328cca0b726Skevlo #define SRAM_TCPH_ADDR_SHIFT 0 329cca0b726Skevlo #define SRAM_PATH_ADDR_SHIFT 16 330cca0b726Skevlo 331cca0b726Skevlo #define ALE_DMA_BLOCK 0x1534 332cca0b726Skevlo #define DMA_BLOCK_LOAD 0x00000001 333cca0b726Skevlo 334cca0b726Skevlo #define ALE_RXF3_ADDR_HI 0x153C 335cca0b726Skevlo 336cca0b726Skevlo #define ALE_TPD_ADDR_HI 0x1540 337cca0b726Skevlo 338cca0b726Skevlo #define ALE_RXF0_PAGE0_ADDR_LO 0x1544 339cca0b726Skevlo 340cca0b726Skevlo #define ALE_RXF0_PAGE1_ADDR_LO 0x1548 341cca0b726Skevlo 342cca0b726Skevlo #define ALE_TPD_ADDR_LO 0x154C 343cca0b726Skevlo 344cca0b726Skevlo #define ALE_RXF1_ADDR_HI 0x1550 345cca0b726Skevlo 346cca0b726Skevlo #define ALE_RXF2_ADDR_HI 0x1554 347cca0b726Skevlo 348cca0b726Skevlo #define ALE_RXF_PAGE_SIZE 0x1558 349cca0b726Skevlo 350cca0b726Skevlo #define ALE_TPD_CNT 0x155C 351cca0b726Skevlo #define TPD_CNT_MASK 0x00003FF 352cca0b726Skevlo #define TPD_CNT_SHIFT 0 353cca0b726Skevlo 354cca0b726Skevlo #define ALE_RSS_IDT_TABLE0 0x1560 355cca0b726Skevlo 356cca0b726Skevlo #define ALE_RSS_IDT_TABLE1 0x1564 357cca0b726Skevlo 358cca0b726Skevlo #define ALE_RSS_IDT_TABLE2 0x1568 359cca0b726Skevlo 360cca0b726Skevlo #define ALE_RSS_IDT_TABLE3 0x156C 361cca0b726Skevlo 362cca0b726Skevlo #define ALE_RSS_HASH_VALUE 0x1570 363cca0b726Skevlo 364cca0b726Skevlo #define ALE_RSS_HASH_FLAG 0x1574 365cca0b726Skevlo 366cca0b726Skevlo #define ALE_RSS_CPU 0x157C 367cca0b726Skevlo 368cca0b726Skevlo #define ALE_TXQ_CFG 0x1580 369cca0b726Skevlo #define TXQ_CFG_TPD_BURST_MASK 0x0000000F 370cca0b726Skevlo #define TXQ_CFG_ENB 0x00000020 371cca0b726Skevlo #define TXQ_CFG_ENHANCED_MODE 0x00000040 372cca0b726Skevlo #define TXQ_CFG_TX_FIFO_BURST_MASK 0xFFFF0000 373cca0b726Skevlo #define TXQ_CFG_TPD_BURST_SHIFT 0 374cca0b726Skevlo #define TXQ_CFG_TPD_BURST_DEFAULT 4 375cca0b726Skevlo #define TXQ_CFG_TX_FIFO_BURST_SHIFT 16 376cca0b726Skevlo #define TXQ_CFG_TX_FIFO_BURST_DEFAULT 256 377cca0b726Skevlo 378cca0b726Skevlo #define ALE_TX_JUMBO_THRESH 0x1584 379cca0b726Skevlo #define TX_JUMBO_THRESH_MASK 0x000007FF 380cca0b726Skevlo #define TX_JUMBO_THRESH_SHIFT 0 381cca0b726Skevlo #define TX_JUMBO_THRESH_UNIT 8 382cca0b726Skevlo #define TX_JUMBO_THRESH_UNIT_SHIFT 3 383cca0b726Skevlo 384cca0b726Skevlo #define ALE_RXQ_CFG 0x15A0 385cca0b726Skevlo #define RXQ_CFG_ALIGN_32 0x00000000 386cca0b726Skevlo #define RXQ_CFG_ALIGN_64 0x00000001 387cca0b726Skevlo #define RXQ_CFG_ALIGN_128 0x00000002 388cca0b726Skevlo #define RXQ_CFG_ALIGN_256 0x00000003 389cca0b726Skevlo #define RXQ_CFG_QUEUE1_ENB 0x00000010 390cca0b726Skevlo #define RXQ_CFG_QUEUE2_ENB 0x00000020 391cca0b726Skevlo #define RXQ_CFG_QUEUE3_ENB 0x00000040 392cca0b726Skevlo #define RXQ_CFG_IPV6_CSUM_VERIFY 0x00000080 393cca0b726Skevlo #define RXQ_CFG_RSS_HASH_TBL_LEN_MASK 0x0000FF00 394cca0b726Skevlo #define RXQ_CFG_RSS_HASH_IPV4 0x00010000 395cca0b726Skevlo #define RXQ_CFG_RSS_HASH_IPV4_TCP 0x00020000 396cca0b726Skevlo #define RXQ_CFG_RSS_HASH_IPV6 0x00040000 397cca0b726Skevlo #define RXQ_CFG_RSS_HASH_IPV6_TCP 0x00080000 398cca0b726Skevlo #define RXQ_CFG_RSS_MODE_DIS 0x00000000 399cca0b726Skevlo #define RXQ_CFG_RSS_MODE_SQSINT 0x04000000 400cca0b726Skevlo #define RXQ_CFG_RSS_MODE_MQUESINT 0x08000000 401cca0b726Skevlo #define RXQ_CFG_RSS_MODE_MQUEMINT 0x0C000000 402cca0b726Skevlo #define RXQ_CFG_NIP_QUEUE_SEL_TBL 0x10000000 403cca0b726Skevlo #define RXQ_CFG_RSS_HASH_ENB 0x20000000 404cca0b726Skevlo #define RXQ_CFG_CUT_THROUGH_ENB 0x40000000 405cca0b726Skevlo #define RXQ_CFG_ENB 0x80000000 406cca0b726Skevlo #define RXQ_CFG_RSS_HASH_TBL_LEN_SHIFT 8 407cca0b726Skevlo 408cca0b726Skevlo #define ALE_RX_JUMBO_THRESH 0x15A4 /* 16bits */ 409cca0b726Skevlo #define RX_JUMBO_THRESH_MASK 0x07FF 410cca0b726Skevlo #define RX_JUMBO_LKAH_MASK 0x7800 411cca0b726Skevlo #define RX_JUMBO_THRESH_MASK_SHIFT 0 412cca0b726Skevlo #define RX_JUMBO_THRESH_UNIT 8 413cca0b726Skevlo #define RX_JUMBO_THRESH_UNIT_SHIFT 3 414cca0b726Skevlo #define RX_JUMBO_LKAH_SHIFT 11 415cca0b726Skevlo #define RX_JUMBO_LKAH_DEFAULT 1 416cca0b726Skevlo 417cca0b726Skevlo #define ALE_RX_FIFO_PAUSE_THRESH 0x15A8 418cca0b726Skevlo #define RX_FIFO_PAUSE_THRESH_LO_MASK 0x00000FFF 419cca0b726Skevlo #define RX_FIFO_PAUSE_THRESH_HI_MASK 0x0FFF0000 420cca0b726Skevlo #define RX_FIFO_PAUSE_THRESH_LO_SHIFT 0 421cca0b726Skevlo #define RX_FIFO_PAUSE_THRESH_HI_SHIFT 16 422cca0b726Skevlo 423cca0b726Skevlo #define ALE_CMB_RXF1 0x15B4 424cca0b726Skevlo 425cca0b726Skevlo #define ALE_CMB_RXF2 0x15B8 426cca0b726Skevlo 427cca0b726Skevlo #define ALE_CMB_RXF3 0x15BC 428cca0b726Skevlo 429cca0b726Skevlo #define ALE_DMA_CFG 0x15C0 430cca0b726Skevlo #define DMA_CFG_IN_ORDER 0x00000001 431cca0b726Skevlo #define DMA_CFG_ENH_ORDER 0x00000002 432cca0b726Skevlo #define DMA_CFG_OUT_ORDER 0x00000004 433cca0b726Skevlo #define DMA_CFG_RCB_64 0x00000000 434cca0b726Skevlo #define DMA_CFG_RCB_128 0x00000008 435cca0b726Skevlo #define DMA_CFG_RD_BURST_128 0x00000000 436cca0b726Skevlo #define DMA_CFG_RD_BURST_256 0x00000010 437cca0b726Skevlo #define DMA_CFG_RD_BURST_512 0x00000020 438cca0b726Skevlo #define DMA_CFG_RD_BURST_1024 0x00000030 439cca0b726Skevlo #define DMA_CFG_RD_BURST_2048 0x00000040 440cca0b726Skevlo #define DMA_CFG_RD_BURST_4096 0x00000050 441cca0b726Skevlo #define DMA_CFG_WR_BURST_128 0x00000000 442cca0b726Skevlo #define DMA_CFG_WR_BURST_256 0x00000080 443cca0b726Skevlo #define DMA_CFG_WR_BURST_512 0x00000100 444cca0b726Skevlo #define DMA_CFG_WR_BURST_1024 0x00000180 445cca0b726Skevlo #define DMA_CFG_WR_BURST_2048 0x00000200 446cca0b726Skevlo #define DMA_CFG_WR_BURST_4096 0x00000280 447cca0b726Skevlo #define DMA_CFG_RD_REQ_PRI 0x00000400 448cca0b726Skevlo #define DMA_CFG_RD_DELAY_CNT_MASK 0x0000F800 449cca0b726Skevlo #define DMA_CFG_WR_DELAY_CNT_MASK 0x000F0000 450cca0b726Skevlo #define DMA_CFG_TXCMB_ENB 0x00100000 451cca0b726Skevlo #define DMA_CFG_RXCMB_ENB 0x00200000 452cca0b726Skevlo #define DMA_CFG_RD_BURST_MASK 0x07 453cca0b726Skevlo #define DMA_CFG_RD_BURST_SHIFT 4 454cca0b726Skevlo #define DMA_CFG_WR_BURST_MASK 0x07 455cca0b726Skevlo #define DMA_CFG_WR_BURST_SHIFT 7 456cca0b726Skevlo #define DMA_CFG_RD_DELAY_CNT_SHIFT 11 457cca0b726Skevlo #define DMA_CFG_WR_DELAY_CNT_SHIFT 16 458cca0b726Skevlo #define DMA_CFG_RD_DELAY_CNT_DEFAULT 15 459cca0b726Skevlo #define DMA_CFG_WR_DELAY_CNT_DEFAULT 4 460cca0b726Skevlo 461cca0b726Skevlo #define ALE_SMB_STAT_TIMER 0x15C4 462cca0b726Skevlo 463cca0b726Skevlo #define ALE_INT_TRIG_THRESH 0x15C8 464cca0b726Skevlo #define INT_TRIG_TX_THRESH_MASK 0x0000FFFF 465cca0b726Skevlo #define INT_TRIG_RX_THRESH_MASK 0xFFFF0000 466cca0b726Skevlo #define INT_TRIG_TX_THRESH_SHIFT 0 467cca0b726Skevlo #define INT_TRIG_RX_THRESH_SHIFT 16 468cca0b726Skevlo 469cca0b726Skevlo #define ALE_INT_TRIG_TIMER 0x15CC 470cca0b726Skevlo #define INT_TRIG_TX_TIMER_MASK 0x0000FFFF 471cca0b726Skevlo #define INT_TRIG_RX_TIMER_MASK 0x0000FFFF 472cca0b726Skevlo #define INT_TRIG_TX_TIMER_SHIFT 0 473cca0b726Skevlo #define INT_TRIG_RX_TIMER_SHIFT 16 474cca0b726Skevlo 475cca0b726Skevlo #define ALE_RXF1_PAGE0_ADDR_LO 0x15D0 476cca0b726Skevlo 477cca0b726Skevlo #define ALE_RXF1_PAGE1_ADDR_LO 0x15D4 478cca0b726Skevlo 479cca0b726Skevlo #define ALE_RXF2_PAGE0_ADDR_LO 0x15D8 480cca0b726Skevlo 481cca0b726Skevlo #define ALE_RXF2_PAGE1_ADDR_LO 0x15DC 482cca0b726Skevlo 483cca0b726Skevlo #define ALE_RXF3_PAGE0_ADDR_LO 0x15E0 484cca0b726Skevlo 485cca0b726Skevlo #define ALE_RXF3_PAGE1_ADDR_LO 0x15E4 486cca0b726Skevlo 487cca0b726Skevlo #define ALE_MBOX_TPD_PROD_IDX 0x15F0 488cca0b726Skevlo 489cca0b726Skevlo #define ALE_RXF0_PAGE0 0x15F4 490cca0b726Skevlo 491cca0b726Skevlo #define ALE_RXF0_PAGE1 0x15F5 492cca0b726Skevlo 493cca0b726Skevlo #define ALE_RXF1_PAGE0 0x15F6 494cca0b726Skevlo 495cca0b726Skevlo #define ALE_RXF1_PAGE1 0x15F7 496cca0b726Skevlo 497cca0b726Skevlo #define ALE_RXF2_PAGE0 0x15F8 498cca0b726Skevlo 499cca0b726Skevlo #define ALE_RXF2_PAGE1 0x15F9 500cca0b726Skevlo 501cca0b726Skevlo #define ALE_RXF3_PAGE0 0x15FA 502cca0b726Skevlo 503cca0b726Skevlo #define ALE_RXF3_PAGE1 0x15FB 504cca0b726Skevlo 505cca0b726Skevlo #define RXF_VALID 0x01 506cca0b726Skevlo 507cca0b726Skevlo #define ALE_INTR_STATUS 0x1600 508cca0b726Skevlo #define INTR_SMB 0x00000001 509cca0b726Skevlo #define INTR_TIMER 0x00000002 510cca0b726Skevlo #define INTR_MANUAL_TIMER 0x00000004 511cca0b726Skevlo #define INTR_RX_FIFO_OFLOW 0x00000008 512cca0b726Skevlo #define INTR_RXF0_OFLOW 0x00000010 513cca0b726Skevlo #define INTR_RXF1_OFLOW 0x00000020 514cca0b726Skevlo #define INTR_RXF2_OFLOW 0x00000040 515cca0b726Skevlo #define INTR_RXF3_OFLOW 0x00000080 516cca0b726Skevlo #define INTR_TX_FIFO_UNDERRUN 0x00000100 517cca0b726Skevlo #define INTR_RX0_PAGE_FULL 0x00000200 518cca0b726Skevlo #define INTR_DMA_RD_TO_RST 0x00000400 519cca0b726Skevlo #define INTR_DMA_WR_TO_RST 0x00000800 520cca0b726Skevlo #define INTR_GPHY 0x00001000 521cca0b726Skevlo #define INTR_TX_CREDIT 0x00002000 522cca0b726Skevlo #define INTR_GPHY_LOW_PW 0x00004000 523cca0b726Skevlo #define INTR_RX_PKT 0x00010000 524cca0b726Skevlo #define INTR_TX_PKT 0x00020000 525cca0b726Skevlo #define INTR_TX_DMA 0x00040000 526cca0b726Skevlo #define INTR_RX_PKT1 0x00080000 527cca0b726Skevlo #define INTR_RX_PKT2 0x00100000 528cca0b726Skevlo #define INTR_RX_PKT3 0x00200000 529cca0b726Skevlo #define INTR_MAC_RX 0x00400000 530cca0b726Skevlo #define INTR_MAC_TX 0x00800000 531cca0b726Skevlo #define INTR_UNDERRUN 0x01000000 532cca0b726Skevlo #define INTR_FRAME_ERROR 0x02000000 533cca0b726Skevlo #define INTR_FRAME_OK 0x04000000 534cca0b726Skevlo #define INTR_CSUM_ERROR 0x08000000 535cca0b726Skevlo #define INTR_PHY_LINK_DOWN 0x10000000 536cca0b726Skevlo #define INTR_DIS_INT 0x80000000 537cca0b726Skevlo 538cca0b726Skevlo /* Interrupt Mask Register */ 539cca0b726Skevlo #define ALE_INTR_MASK 0x1604 540cca0b726Skevlo 541cca0b726Skevlo #define ALE_INTRS \ 542cca0b726Skevlo (INTR_DMA_RD_TO_RST | INTR_DMA_WR_TO_RST | \ 543cca0b726Skevlo INTR_RX_PKT | INTR_TX_PKT | INTR_RX_FIFO_OFLOW | \ 544cca0b726Skevlo INTR_TX_FIFO_UNDERRUN) 545cca0b726Skevlo 546cca0b726Skevlo /* 547cca0b726Skevlo * AR81xx requires register access to get MAC statistics 548cca0b726Skevlo * and the format of statistics seems to be the same of L1 . 549cca0b726Skevlo */ 550cca0b726Skevlo #define ALE_RX_MIB_BASE 0x1700 551cca0b726Skevlo 552cca0b726Skevlo #define ALE_TX_MIB_BASE 0x1760 553cca0b726Skevlo 554cca0b726Skevlo /* Statistics counters collected by the MAC. */ 555cca0b726Skevlo struct smb { 556cca0b726Skevlo /* Rx stats. */ 557cca0b726Skevlo uint32_t rx_frames; 558cca0b726Skevlo uint32_t rx_bcast_frames; 559cca0b726Skevlo uint32_t rx_mcast_frames; 560cca0b726Skevlo uint32_t rx_pause_frames; 561cca0b726Skevlo uint32_t rx_control_frames; 562cca0b726Skevlo uint32_t rx_crcerrs; 563cca0b726Skevlo uint32_t rx_lenerrs; 564cca0b726Skevlo uint32_t rx_bytes; 565cca0b726Skevlo uint32_t rx_runts; 566cca0b726Skevlo uint32_t rx_fragments; 567cca0b726Skevlo uint32_t rx_pkts_64; 568cca0b726Skevlo uint32_t rx_pkts_65_127; 569cca0b726Skevlo uint32_t rx_pkts_128_255; 570cca0b726Skevlo uint32_t rx_pkts_256_511; 571cca0b726Skevlo uint32_t rx_pkts_512_1023; 572cca0b726Skevlo uint32_t rx_pkts_1024_1518; 573cca0b726Skevlo uint32_t rx_pkts_1519_max; 574cca0b726Skevlo uint32_t rx_pkts_truncated; 575cca0b726Skevlo uint32_t rx_fifo_oflows; 576cca0b726Skevlo uint32_t rx_rrs_errs; 577cca0b726Skevlo uint32_t rx_alignerrs; 578cca0b726Skevlo uint32_t rx_bcast_bytes; 579cca0b726Skevlo uint32_t rx_mcast_bytes; 580cca0b726Skevlo uint32_t rx_pkts_filtered; 581cca0b726Skevlo /* Tx stats. */ 582cca0b726Skevlo uint32_t tx_frames; 583cca0b726Skevlo uint32_t tx_bcast_frames; 584cca0b726Skevlo uint32_t tx_mcast_frames; 585cca0b726Skevlo uint32_t tx_pause_frames; 586cca0b726Skevlo uint32_t tx_excess_defer; 587cca0b726Skevlo uint32_t tx_control_frames; 588cca0b726Skevlo uint32_t tx_deferred; 589cca0b726Skevlo uint32_t tx_bytes; 590cca0b726Skevlo uint32_t tx_pkts_64; 591cca0b726Skevlo uint32_t tx_pkts_65_127; 592cca0b726Skevlo uint32_t tx_pkts_128_255; 593cca0b726Skevlo uint32_t tx_pkts_256_511; 594cca0b726Skevlo uint32_t tx_pkts_512_1023; 595cca0b726Skevlo uint32_t tx_pkts_1024_1518; 596cca0b726Skevlo uint32_t tx_pkts_1519_max; 597cca0b726Skevlo uint32_t tx_single_colls; 598cca0b726Skevlo uint32_t tx_multi_colls; 599cca0b726Skevlo uint32_t tx_late_colls; 600cca0b726Skevlo uint32_t tx_excess_colls; 601cca0b726Skevlo uint32_t tx_underrun; 602cca0b726Skevlo uint32_t tx_desc_underrun; 603cca0b726Skevlo uint32_t tx_lenerrs; 604cca0b726Skevlo uint32_t tx_pkts_truncated; 605cca0b726Skevlo uint32_t tx_bcast_bytes; 606cca0b726Skevlo uint32_t tx_mcast_bytes; 607cca0b726Skevlo } __packed; 608cca0b726Skevlo 609cca0b726Skevlo #define ALE_HOST_RXF0_PAGEOFF 0x1800 610cca0b726Skevlo 611cca0b726Skevlo #define ALE_TPD_CONS_IDX 0x1804 612cca0b726Skevlo 613cca0b726Skevlo #define ALE_HOST_RXF1_PAGEOFF 0x1808 614cca0b726Skevlo 615cca0b726Skevlo #define ALE_HOST_RXF2_PAGEOFF 0x180C 616cca0b726Skevlo 617cca0b726Skevlo #define ALE_HOST_RXF3_PAGEOFF 0x1810 618cca0b726Skevlo 619cca0b726Skevlo #define ALE_RXF0_CMB0_ADDR_LO 0x1820 620cca0b726Skevlo 621cca0b726Skevlo #define ALE_RXF0_CMB1_ADDR_LO 0x1824 622cca0b726Skevlo 623cca0b726Skevlo #define ALE_RXF1_CMB0_ADDR_LO 0x1828 624cca0b726Skevlo 625cca0b726Skevlo #define ALE_RXF1_CMB1_ADDR_LO 0x182C 626cca0b726Skevlo 627cca0b726Skevlo #define ALE_RXF2_CMB0_ADDR_LO 0x1830 628cca0b726Skevlo 629cca0b726Skevlo #define ALE_RXF2_CMB1_ADDR_LO 0x1834 630cca0b726Skevlo 631cca0b726Skevlo #define ALE_RXF3_CMB0_ADDR_LO 0x1838 632cca0b726Skevlo 633cca0b726Skevlo #define ALE_RXF3_CMB1_ADDR_LO 0x183C 634cca0b726Skevlo 635cca0b726Skevlo #define ALE_TX_CMB_ADDR_LO 0x1840 636cca0b726Skevlo 637cca0b726Skevlo #define ALE_SMB_ADDR_LO 0x1844 638cca0b726Skevlo 639cca0b726Skevlo /* 640cca0b726Skevlo * RRS(receive return status) structure. 641cca0b726Skevlo * 642cca0b726Skevlo * Note: 643cca0b726Skevlo * Atheros AR81xx does not support descriptor based DMA on Rx 644cca0b726Skevlo * instead it just prepends a Rx status structure prior to a 645cca0b726Skevlo * received frame which also resides on the same Rx buffer. 646cca0b726Skevlo * This means driver should copy an entire frame from the 647cca0b726Skevlo * buffer to new mbuf chain which in turn greatly increases CPU 648cca0b726Skevlo * cycles and effectively nullify the advantage of DMA 649cca0b726Skevlo * operation of controller. So you should have fast CPU to cope 650cca0b726Skevlo * with the copy operation. Implementing flow-controls may help 651cca0b726Skevlo * a lot to minimize Rx FIFO overflows but it's not available 652cca0b726Skevlo * yet on FreeBSD and hardware doesn't seem to support 653cca0b726Skevlo * fine-grained Tx/Rx flow controls. 654cca0b726Skevlo */ 655cca0b726Skevlo struct rx_rs { 656cca0b726Skevlo uint32_t seqno; 657cca0b726Skevlo #define ALE_RD_SEQNO_MASK 0x0000FFFF 658cca0b726Skevlo #define ALE_RD_HASH_MASK 0xFFFF0000 659cca0b726Skevlo #define ALE_RD_SEQNO_SHIFT 0 660cca0b726Skevlo #define ALE_RD_HASH_SHIFT 16 661cca0b726Skevlo #define ALE_RX_SEQNO(x) \ 662cca0b726Skevlo (((x) & ALE_RD_SEQNO_MASK) >> ALE_RD_SEQNO_SHIFT) 663cca0b726Skevlo uint32_t length; 664cca0b726Skevlo #define ALE_RD_CSUM_MASK 0x0000FFFF 665cca0b726Skevlo #define ALE_RD_LEN_MASK 0x3FFF0000 666cca0b726Skevlo #define ALE_RD_CPU_MASK 0xC0000000 667cca0b726Skevlo #define ALE_RD_CSUM_SHIFT 0 668cca0b726Skevlo #define ALE_RD_LEN_SHIFT 16 669cca0b726Skevlo #define ALE_RD_CPU_SHIFT 30 670cca0b726Skevlo #define ALE_RX_CSUM(x) \ 671cca0b726Skevlo (((x) & ALE_RD_CSUM_MASK) >> ALE_RD_CSUM_SHIFT) 672cca0b726Skevlo #define ALE_RX_BYTES(x) \ 673cca0b726Skevlo (((x) & ALE_RD_LEN_MASK) >> ALE_RD_LEN_SHIFT) 674cca0b726Skevlo #define ALE_RX_CPU(x) \ 675cca0b726Skevlo (((x) & ALE_RD_CPU_MASK) >> ALE_RD_CPU_SHIFT) 676cca0b726Skevlo uint32_t flags; 677cca0b726Skevlo #define ALE_RD_RSS_IPV4 0x00000001 678cca0b726Skevlo #define ALE_RD_RSS_IPV4_TCP 0x00000002 679cca0b726Skevlo #define ALE_RD_RSS_IPV6 0x00000004 680cca0b726Skevlo #define ALE_RD_RSS_IPV6_TCP 0x00000008 681cca0b726Skevlo #define ALE_RD_IPV6 0x00000010 682cca0b726Skevlo #define ALE_RD_IPV4_FRAG 0x00000020 683cca0b726Skevlo #define ALE_RD_IPV4_DF 0x00000040 684cca0b726Skevlo #define ALE_RD_802_3 0x00000080 685cca0b726Skevlo #define ALE_RD_VLAN 0x00000100 686cca0b726Skevlo #define ALE_RD_ERROR 0x00000200 687cca0b726Skevlo #define ALE_RD_IPV4 0x00000400 688cca0b726Skevlo #define ALE_RD_UDP 0x00000800 689cca0b726Skevlo #define ALE_RD_TCP 0x00001000 690cca0b726Skevlo #define ALE_RD_BCAST 0x00002000 691cca0b726Skevlo #define ALE_RD_MCAST 0x00004000 692cca0b726Skevlo #define ALE_RD_PAUSE 0x00008000 693cca0b726Skevlo #define ALE_RD_CRC 0x00010000 694cca0b726Skevlo #define ALE_RD_CODE 0x00020000 695cca0b726Skevlo #define ALE_RD_DRIBBLE 0x00040000 696cca0b726Skevlo #define ALE_RD_RUNT 0x00080000 697cca0b726Skevlo #define ALE_RD_OFLOW 0x00100000 698cca0b726Skevlo #define ALE_RD_TRUNC 0x00200000 699cca0b726Skevlo #define ALE_RD_IPCSUM_NOK 0x00400000 700cca0b726Skevlo #define ALE_RD_TCP_UDPCSUM_NOK 0x00800000 701cca0b726Skevlo #define ALE_RD_LENGTH_NOK 0x01000000 702cca0b726Skevlo #define ALE_RD_DES_ADDR_FILTERED 0x02000000 703cca0b726Skevlo uint32_t vtags; 704cca0b726Skevlo #define ALE_RD_HASH_HI_MASK 0x0000FFFF 705cca0b726Skevlo #define ALE_RD_HASH_HI_SHIFT 0 706cca0b726Skevlo #define ALE_RD_VLAN_MASK 0xFFFF0000 707cca0b726Skevlo #define ALE_RD_VLAN_SHIFT 16 708cca0b726Skevlo #define ALE_RX_VLAN(x) \ 709cca0b726Skevlo (((x) & ALE_RD_VLAN_MASK) >> ALE_RD_VLAN_SHIFT) 710cca0b726Skevlo #define ALE_RX_VLAN_TAG(x) \ 711cca0b726Skevlo (((x) >> 4) | (((x) & 7) << 13) | (((x) & 8) << 9)) 712cca0b726Skevlo } __packed; 713cca0b726Skevlo 714cca0b726Skevlo /* Tx descriptor. */ 715cca0b726Skevlo struct tx_desc { 716cca0b726Skevlo uint64_t addr; 717cca0b726Skevlo uint32_t len; 718cca0b726Skevlo #define ALE_TD_VLAN_MASK 0xFFFF0000 719cca0b726Skevlo #define ALE_TD_PKT_INT 0x00008000 720cca0b726Skevlo #define ALE_TD_DMA_INT 0x00004000 721cca0b726Skevlo #define ALE_TD_BUFLEN_MASK 0x00003FFF 722cca0b726Skevlo #define ALE_TD_VLAN_SHIFT 16 723cca0b726Skevlo #define ALE_TX_VLAN_TAG(x) \ 724cca0b726Skevlo (((x) << 4) | ((x) >> 13) | (((x) >> 9) & 8)) 725cca0b726Skevlo #define ALE_TD_BUFLEN_SHIFT 0 726cca0b726Skevlo #define ALE_TX_BYTES(x) \ 727cca0b726Skevlo (((x) << ALE_TD_BUFLEN_SHIFT) & ALE_TD_BUFLEN_MASK) 728cca0b726Skevlo uint32_t flags; 729cca0b726Skevlo #define ALE_TD_MSS 0xFFF80000 730cca0b726Skevlo #define ALE_TD_TSO_HDR 0x00040000 731cca0b726Skevlo #define ALE_TD_TCPHDR_LEN 0x0003C000 732cca0b726Skevlo #define ALE_TD_IPHDR_LEN 0x00003C00 733cca0b726Skevlo #define ALE_TD_IPV6HDR_LEN2 0x00003C00 734cca0b726Skevlo #define ALE_TD_LLC_SNAP 0x00000200 735cca0b726Skevlo #define ALE_TD_VLAN_TAGGED 0x00000100 736cca0b726Skevlo #define ALE_TD_UDPCSUM 0x00000080 737cca0b726Skevlo #define ALE_TD_TCPCSUM 0x00000040 738cca0b726Skevlo #define ALE_TD_IPCSUM 0x00000020 739cca0b726Skevlo #define ALE_TD_IPV6HDR_LEN1 0x000000E0 740cca0b726Skevlo #define ALE_TD_TSO 0x00000010 741cca0b726Skevlo #define ALE_TD_CXSUM 0x00000008 742cca0b726Skevlo #define ALE_TD_INSERT_VLAN_TAG 0x00000004 743cca0b726Skevlo #define ALE_TD_IPV6 0x00000002 744cca0b726Skevlo #define ALE_TD_EOP 0x00000001 745cca0b726Skevlo 746cca0b726Skevlo #define ALE_TD_CSUM_PLOADOFFSET 0x00FF0000 747cca0b726Skevlo #define ALE_TD_CSUM_XSUMOFFSET 0xFF000000 748cca0b726Skevlo #define ALE_TD_CSUM_XSUMOFFSET_SHIFT 24 749cca0b726Skevlo #define ALE_TD_CSUM_PLOADOFFSET_SHIFT 16 750cca0b726Skevlo #define ALE_TD_MSS_SHIFT 19 751cca0b726Skevlo #define ALE_TD_TCPHDR_LEN_SHIFT 14 752cca0b726Skevlo #define ALE_TD_IPHDR_LEN_SHIFT 10 753cca0b726Skevlo } __packed; 754cca0b726Skevlo 755cca0b726Skevlo #define ALE_TX_RING_CNT 256 /* Should be multiple of 4. */ 756cca0b726Skevlo #define ALE_TX_RING_CNT_MIN 32 757cca0b726Skevlo #define ALE_TX_RING_CNT_MAX 1020 758cca0b726Skevlo #define ALE_TX_RING_ALIGN 8 759cca0b726Skevlo #define ALE_RX_PAGE_ALIGN 32 760cca0b726Skevlo #define ALE_RX_PAGES 2 761cca0b726Skevlo #define ALE_CMB_ALIGN 32 762cca0b726Skevlo 763cca0b726Skevlo #define ALE_TSO_MAXSEGSIZE 4096 764cca0b726Skevlo #define ALE_TSO_MAXSIZE (65535 + sizeof(struct ether_vlan_header)) 765cca0b726Skevlo #define ALE_MAXTXSEGS 32 766cca0b726Skevlo 767cca0b726Skevlo #define ALE_ADDR_LO(x) ((uint64_t) (x) & 0xFFFFFFFF) 768cca0b726Skevlo #define ALE_ADDR_HI(x) ((uint64_t) (x) >> 32) 769cca0b726Skevlo 770cca0b726Skevlo /* Water mark to kick reclaiming Tx buffers. */ 771cca0b726Skevlo #define ALE_TX_DESC_HIWAT (ALE_TX_RING_CNT - ((ALE_TX_RING_CNT * 4) / 10)) 772cca0b726Skevlo 773cca0b726Skevlo #define ALE_MSI_MESSAGES 1 774cca0b726Skevlo #define ALE_MSIX_MESSAGES 1 775cca0b726Skevlo 776cca0b726Skevlo /* 777cca0b726Skevlo * TODO : Should get real jumbo MTU size. 778cca0b726Skevlo * The hardware seems to have trouble in dealing with large 779*4b1a56afSjsg * frame length. If you encounter instability issue, use 780cca0b726Skevlo * lower MTU size. 781cca0b726Skevlo */ 782cca0b726Skevlo #define ALE_JUMBO_FRAMELEN 8132 783cca0b726Skevlo #define ALE_JUMBO_MTU \ 784cca0b726Skevlo (ALE_JUMBO_FRAMELEN - sizeof(struct ether_vlan_header) - ETHER_CRC_LEN) 785cca0b726Skevlo #define ALE_MAX_FRAMELEN (ETHER_MAX_LEN + EVL_ENCAPLEN) 786cca0b726Skevlo 787cca0b726Skevlo #define ALE_DESC_INC(x, y) ((x) = ((x) + 1) % (y)) 788cca0b726Skevlo 789cca0b726Skevlo struct ale_txdesc { 790cca0b726Skevlo struct mbuf *tx_m; 791cca0b726Skevlo bus_dmamap_t tx_dmamap; 792cca0b726Skevlo }; 793cca0b726Skevlo 794cca0b726Skevlo struct ale_rx_page { 795cca0b726Skevlo bus_dmamap_t page_map; 796cca0b726Skevlo bus_dma_segment_t page_seg; 797cca0b726Skevlo uint8_t *page_addr; 798cca0b726Skevlo bus_addr_t page_paddr; 799cca0b726Skevlo bus_dmamap_t cmb_map; 800cca0b726Skevlo bus_dma_segment_t cmb_seg; 801cca0b726Skevlo uint32_t *cmb_addr; 802cca0b726Skevlo bus_addr_t cmb_paddr; 803cca0b726Skevlo uint32_t cons; 804cca0b726Skevlo }; 805cca0b726Skevlo 806cca0b726Skevlo struct ale_chain_data{ 807cca0b726Skevlo struct ale_txdesc ale_txdesc[ALE_TX_RING_CNT]; 808cca0b726Skevlo bus_dmamap_t ale_tx_ring_map; 809cca0b726Skevlo bus_dma_segment_t ale_tx_ring_seg; 810cca0b726Skevlo bus_dmamap_t ale_rx_mblock_map[ALE_RX_PAGES]; 811cca0b726Skevlo bus_dma_segment_t ale_rx_mblock_seg[ALE_RX_PAGES]; 812cca0b726Skevlo struct tx_desc *ale_tx_ring; 813cca0b726Skevlo bus_addr_t ale_tx_ring_paddr; 814cca0b726Skevlo uint32_t *ale_tx_cmb; 815cca0b726Skevlo bus_addr_t ale_tx_cmb_paddr; 816cca0b726Skevlo bus_dmamap_t ale_tx_cmb_map; 817cca0b726Skevlo bus_dma_segment_t ale_tx_cmb_seg; 818cca0b726Skevlo 819cca0b726Skevlo uint32_t ale_tx_prod; 820cca0b726Skevlo uint32_t ale_tx_cons; 821cca0b726Skevlo int ale_tx_cnt; 822cca0b726Skevlo struct ale_rx_page ale_rx_page[ALE_RX_PAGES]; 823cca0b726Skevlo int ale_rx_curp; 824cca0b726Skevlo uint16_t ale_rx_seqno; 825cca0b726Skevlo }; 826cca0b726Skevlo 827cca0b726Skevlo #define ALE_TX_RING_SZ \ 828cca0b726Skevlo (sizeof(struct tx_desc) * ALE_TX_RING_CNT) 829cca0b726Skevlo #define ALE_RX_PAGE_SZ_MIN (8 * 1024) 830cca0b726Skevlo #define ALE_RX_PAGE_SZ_MAX (1024 * 1024) 831cca0b726Skevlo #define ALE_RX_FRAMES_PAGE 128 832cca0b726Skevlo #define ALE_RX_PAGE_SZ \ 833cca0b726Skevlo (roundup(ALE_MAX_FRAMELEN, ALE_RX_PAGE_ALIGN) * ALE_RX_FRAMES_PAGE) 834cca0b726Skevlo #define ALE_TX_CMB_SZ (sizeof(uint32_t)) 835cca0b726Skevlo #define ALE_RX_CMB_SZ (sizeof(uint32_t)) 836cca0b726Skevlo 837cca0b726Skevlo #define ALE_PROC_MIN (ALE_RX_FRAMES_PAGE / 4) 838cca0b726Skevlo #define ALE_PROC_MAX \ 839cca0b726Skevlo ((ALE_RX_PAGE_SZ * ALE_RX_PAGES) / ETHER_MAX_LEN) 840cca0b726Skevlo #define ALE_PROC_DEFAULT (ALE_PROC_MAX / 4) 841cca0b726Skevlo 842cca0b726Skevlo struct ale_hw_stats { 843cca0b726Skevlo /* Rx stats. */ 844cca0b726Skevlo uint32_t rx_frames; 845cca0b726Skevlo uint32_t rx_bcast_frames; 846cca0b726Skevlo uint32_t rx_mcast_frames; 847cca0b726Skevlo uint32_t rx_pause_frames; 848cca0b726Skevlo uint32_t rx_control_frames; 849cca0b726Skevlo uint32_t rx_crcerrs; 850cca0b726Skevlo uint32_t rx_lenerrs; 851cca0b726Skevlo uint64_t rx_bytes; 852cca0b726Skevlo uint32_t rx_runts; 853cca0b726Skevlo uint32_t rx_fragments; 854cca0b726Skevlo uint32_t rx_pkts_64; 855cca0b726Skevlo uint32_t rx_pkts_65_127; 856cca0b726Skevlo uint32_t rx_pkts_128_255; 857cca0b726Skevlo uint32_t rx_pkts_256_511; 858cca0b726Skevlo uint32_t rx_pkts_512_1023; 859cca0b726Skevlo uint32_t rx_pkts_1024_1518; 860cca0b726Skevlo uint32_t rx_pkts_1519_max; 861cca0b726Skevlo uint32_t rx_pkts_truncated; 862cca0b726Skevlo uint32_t rx_fifo_oflows; 863cca0b726Skevlo uint32_t rx_rrs_errs; 864cca0b726Skevlo uint32_t rx_alignerrs; 865cca0b726Skevlo uint64_t rx_bcast_bytes; 866cca0b726Skevlo uint64_t rx_mcast_bytes; 867cca0b726Skevlo uint32_t rx_pkts_filtered; 868cca0b726Skevlo /* Tx stats. */ 869cca0b726Skevlo uint32_t tx_frames; 870cca0b726Skevlo uint32_t tx_bcast_frames; 871cca0b726Skevlo uint32_t tx_mcast_frames; 872cca0b726Skevlo uint32_t tx_pause_frames; 873cca0b726Skevlo uint32_t tx_excess_defer; 874cca0b726Skevlo uint32_t tx_control_frames; 875cca0b726Skevlo uint32_t tx_deferred; 876cca0b726Skevlo uint64_t tx_bytes; 877cca0b726Skevlo uint32_t tx_pkts_64; 878cca0b726Skevlo uint32_t tx_pkts_65_127; 879cca0b726Skevlo uint32_t tx_pkts_128_255; 880cca0b726Skevlo uint32_t tx_pkts_256_511; 881cca0b726Skevlo uint32_t tx_pkts_512_1023; 882cca0b726Skevlo uint32_t tx_pkts_1024_1518; 883cca0b726Skevlo uint32_t tx_pkts_1519_max; 884cca0b726Skevlo uint32_t tx_single_colls; 885cca0b726Skevlo uint32_t tx_multi_colls; 886cca0b726Skevlo uint32_t tx_late_colls; 887cca0b726Skevlo uint32_t tx_excess_colls; 888cca0b726Skevlo uint32_t tx_underrun; 889cca0b726Skevlo uint32_t tx_desc_underrun; 890cca0b726Skevlo uint32_t tx_lenerrs; 891cca0b726Skevlo uint32_t tx_pkts_truncated; 892cca0b726Skevlo uint64_t tx_bcast_bytes; 893cca0b726Skevlo uint64_t tx_mcast_bytes; 894cca0b726Skevlo /* Misc. */ 895cca0b726Skevlo uint32_t reset_brk_seq; 896cca0b726Skevlo }; 897cca0b726Skevlo 898cca0b726Skevlo /* 899cca0b726Skevlo * Software state per device. 900cca0b726Skevlo */ 901cca0b726Skevlo struct ale_softc { 902cca0b726Skevlo struct device sc_dev; 903cca0b726Skevlo struct arpcom sc_arpcom; 904cca0b726Skevlo 905cca0b726Skevlo bus_space_tag_t sc_mem_bt; 906cca0b726Skevlo bus_space_handle_t sc_mem_bh; 907cca0b726Skevlo bus_size_t sc_mem_size; 908cca0b726Skevlo bus_dma_tag_t sc_dmat; 909cca0b726Skevlo pci_chipset_tag_t sc_pct; 910cca0b726Skevlo pcitag_t sc_pcitag; 911cca0b726Skevlo 912cca0b726Skevlo void *sc_irq_handle; 913cca0b726Skevlo 914cca0b726Skevlo struct mii_data sc_miibus; 915cca0b726Skevlo int ale_phyaddr; 916cca0b726Skevlo 917cca0b726Skevlo int ale_rev; 918cca0b726Skevlo int ale_chip_rev; 919cca0b726Skevlo uint8_t ale_eaddr[ETHER_ADDR_LEN]; 920cca0b726Skevlo uint32_t ale_dma_rd_burst; 921cca0b726Skevlo uint32_t ale_dma_wr_burst; 922cca0b726Skevlo int ale_flags; 923cca0b726Skevlo #define ALE_FLAG_PCIE 0x0001 924cca0b726Skevlo #define ALE_FLAG_PCIX 0x0002 925cca0b726Skevlo #define ALE_FLAG_MSI 0x0004 926cca0b726Skevlo #define ALE_FLAG_MSIX 0x0008 927cca0b726Skevlo #define ALE_FLAG_PMCAP 0x0010 928cca0b726Skevlo #define ALE_FLAG_FASTETHER 0x0020 929cca0b726Skevlo #define ALE_FLAG_JUMBO 0x0040 930cca0b726Skevlo #define ALE_FLAG_RXCSUM_BUG 0x0080 931cca0b726Skevlo #define ALE_FLAG_TXCSUM_BUG 0x0100 932cca0b726Skevlo #define ALE_FLAG_TXCMB_BUG 0x0200 933cca0b726Skevlo #define ALE_FLAG_DETACH 0x4000 934cca0b726Skevlo #define ALE_FLAG_LINK 0x8000 935cca0b726Skevlo 936cca0b726Skevlo struct timeout ale_tick_ch; 937cca0b726Skevlo struct ale_hw_stats ale_stats; 938cca0b726Skevlo struct ale_chain_data ale_cdata; 939cca0b726Skevlo int ale_int_rx_mod; 940cca0b726Skevlo int ale_int_tx_mod; 941cca0b726Skevlo int ale_max_frame_size; 942cca0b726Skevlo int ale_pagesize; 943cca0b726Skevlo 944cca0b726Skevlo }; 945cca0b726Skevlo 946cca0b726Skevlo /* Register access macros. */ 947cca0b726Skevlo #define CSR_WRITE_4(_sc, reg, val) \ 948cca0b726Skevlo bus_space_write_4((sc)->sc_mem_bt, (sc)->sc_mem_bh, (reg), (val)) 949cca0b726Skevlo #define CSR_WRITE_2(_sc, reg, val) \ 950cca0b726Skevlo bus_space_write_2((sc)->sc_mem_bt, (sc)->sc_mem_bh, (reg), (val)) 951cca0b726Skevlo #define CSR_WRITE_1(_sc, reg, val) \ 952cca0b726Skevlo bus_space_write_1((sc)->sc_mem_bt, (sc)->sc_mem_bh, (reg), (val)) 953cca0b726Skevlo #define CSR_READ_2(_sc, reg) \ 954cca0b726Skevlo bus_space_read_2((sc)->sc_mem_bt, (sc)->sc_mem_bh, (reg)) 955cca0b726Skevlo #define CSR_READ_4(_sc, reg) \ 956cca0b726Skevlo bus_space_read_4((sc)->sc_mem_bt, (sc)->sc_mem_bh, (reg)) 957cca0b726Skevlo 958cca0b726Skevlo #define ALE_TX_TIMEOUT 5 959cca0b726Skevlo #define ALE_RESET_TIMEOUT 100 960cca0b726Skevlo #define ALE_TIMEOUT 1000 961cca0b726Skevlo #define ALE_PHY_TIMEOUT 1000 962cca0b726Skevlo 963cca0b726Skevlo #endif /* _IF_ALEREG_H */ 964