xref: /openbsd-src/sys/dev/pci/if_alcreg.h (revision 4b1a56afb1a28c97103da3911d326d1216798a6e)
1*4b1a56afSjsg /*	$OpenBSD: if_alcreg.h,v 1.8 2022/01/09 05:42:46 jsg Exp $	*/
21c0ec257Skevlo /*-
31c0ec257Skevlo  * Copyright (c) 2009, Pyun YongHyeon <yongari@FreeBSD.org>
41c0ec257Skevlo  * All rights reserved.
51c0ec257Skevlo  *
61c0ec257Skevlo  * Redistribution and use in source and binary forms, with or without
71c0ec257Skevlo  * modification, are permitted provided that the following conditions
81c0ec257Skevlo  * are met:
91c0ec257Skevlo  * 1. Redistributions of source code must retain the above copyright
101c0ec257Skevlo  *    notice unmodified, this list of conditions, and the following
111c0ec257Skevlo  *    disclaimer.
121c0ec257Skevlo  * 2. Redistributions in binary form must reproduce the above copyright
131c0ec257Skevlo  *    notice, this list of conditions and the following disclaimer in the
141c0ec257Skevlo  *    documentation and/or other materials provided with the distribution.
151c0ec257Skevlo  *
161c0ec257Skevlo  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
171c0ec257Skevlo  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
181c0ec257Skevlo  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
191c0ec257Skevlo  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
201c0ec257Skevlo  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2121f3d36cSkevlo  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
221c0ec257Skevlo  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
231c0ec257Skevlo  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
241c0ec257Skevlo  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
251c0ec257Skevlo  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2621f3d36cSkevlo  * SUCH DAMAGE.
271c0ec257Skevlo  *
281c0ec257Skevlo  * $FreeBSD: src/sys/dev/alc/if_alcreg.h,v 1.1 2009/06/10 02:07:58 yongari Exp $
291c0ec257Skevlo  */
301c0ec257Skevlo 
311c0ec257Skevlo #ifndef	_IF_ALCREG_H
321c0ec257Skevlo #define	_IF_ALCREG_H
331c0ec257Skevlo 
341c0ec257Skevlo #define	ALC_PCIR_BAR			0x10
351c0ec257Skevlo 
3614ef3578Ssthen #define	ATHEROS_AR8152_B_V10		0xC0
3714ef3578Ssthen #define	ATHEROS_AR8152_B_V11		0xC1
3814ef3578Ssthen 
3903ae04aaSkevlo /*
4003ae04aaSkevlo  * Atheros AR816x/AR817x revisions
4103ae04aaSkevlo  */
4203ae04aaSkevlo #define	AR816X_REV_A0			0
4303ae04aaSkevlo #define	AR816X_REV_A1			1
4403ae04aaSkevlo #define	AR816X_REV_B0			2
4503ae04aaSkevlo #define	AR816X_REV_C0			3
4603ae04aaSkevlo 
4703ae04aaSkevlo #define	AR816X_REV_SHIFT		3
4803ae04aaSkevlo #define	AR816X_REV(x)			((x) >> AR816X_REV_SHIFT)
4903ae04aaSkevlo 
501c0ec257Skevlo /* 0x0000 - 0x02FF : PCIe configuration space */
511c0ec257Skevlo 
521c0ec257Skevlo #define	ALC_PEX_UNC_ERR_SEV		0x10C
531c0ec257Skevlo #define	PEX_UNC_ERR_SEV_TRN		0x00000001
541c0ec257Skevlo #define	PEX_UNC_ERR_SEV_DLP		0x00000010
551c0ec257Skevlo #define	PEX_UNC_ERR_SEV_PSN_TLP		0x00001000
561c0ec257Skevlo #define	PEX_UNC_ERR_SEV_FCP		0x00002000
571c0ec257Skevlo #define	PEX_UNC_ERR_SEV_CPL_TO		0x00004000
581c0ec257Skevlo #define	PEX_UNC_ERR_SEV_CA		0x00008000
591c0ec257Skevlo #define	PEX_UNC_ERR_SEV_UC		0x00010000
601c0ec257Skevlo #define	PEX_UNC_ERR_SEV_ROV		0x00020000
611c0ec257Skevlo #define	PEX_UNC_ERR_SEV_MLFP		0x00040000
621c0ec257Skevlo #define	PEX_UNC_ERR_SEV_ECRC		0x00080000
631c0ec257Skevlo #define	PEX_UNC_ERR_SEV_UR		0x00100000
641c0ec257Skevlo 
6503ae04aaSkevlo #define	ALC_EEPROM_LD			0x204	/* AR816x */
6603ae04aaSkevlo #define	EEPROM_LD_START			0x00000001
6703ae04aaSkevlo #define	EEPROM_LD_IDLE			0x00000010
6803ae04aaSkevlo #define	EEPROM_LD_DONE			0x00000000
6903ae04aaSkevlo #define	EEPROM_LD_PROGRESS		0x00000020
7003ae04aaSkevlo #define	EEPROM_LD_EXIST			0x00000100
7103ae04aaSkevlo #define	EEPROM_LD_EEPROM_EXIST		0x00000200
7203ae04aaSkevlo #define	EEPROM_LD_FLASH_EXIST		0x00000400
7303ae04aaSkevlo #define	EEPROM_LD_FLASH_END_ADDR_MASK	0x03FF0000
7403ae04aaSkevlo #define	EEPROM_LD_FLASH_END_ADDR_SHIFT	16
7503ae04aaSkevlo 
761c0ec257Skevlo #define	ALC_TWSI_CFG			0x218
771c0ec257Skevlo #define	TWSI_CFG_SW_LD_START		0x00000800
781c0ec257Skevlo #define	TWSI_CFG_HW_LD_START		0x00001000
791c0ec257Skevlo #define	TWSI_CFG_LD_EXIST		0x00400000
801c0ec257Skevlo 
8103ae04aaSkevlo #define	ALC_SLD				0x218	/* AR816x */
8203ae04aaSkevlo #define	SLD_START			0x00000800
8303ae04aaSkevlo #define	SLD_PROGRESS			0x00001000
8403ae04aaSkevlo #define	SLD_IDLE			0x00002000
8503ae04aaSkevlo #define	SLD_SLVADDR_MASK		0x007F0000
8603ae04aaSkevlo #define	SLD_EXIST			0x00800000
8703ae04aaSkevlo #define	SLD_FREQ_MASK			0x03000000
8803ae04aaSkevlo #define	SLD_FREQ_100K			0x00000000
8903ae04aaSkevlo #define	SLD_FREQ_200K			0x01000000
9003ae04aaSkevlo #define	SLD_FREQ_300K			0x02000000
9103ae04aaSkevlo #define	SLD_FREQ_400K			0x03000000
9203ae04aaSkevlo 
9303ae04aaSkevlo #define	PCIEM_LINK_CAP_ASPM		0x00000c00
9403ae04aaSkevlo #define	PCIEM_LINK_CTL_RCB		0x0008
9503ae04aaSkevlo #define	PCIEM_LINK_CTL_ASPMC_DIS	0x0000
9603ae04aaSkevlo #define	PCIEM_LINK_CTL_ASPMC_L0S	0x0001
9703ae04aaSkevlo #define	PCIEM_LINK_CTL_ASPMC_L1		0x0002
9803ae04aaSkevlo #define	PCIEM_LINK_CTL_ASPMC		0x0003
9903ae04aaSkevlo 
1001c0ec257Skevlo #define	ALC_PCIE_PHYMISC		0x1000
1011c0ec257Skevlo #define	PCIE_PHYMISC_FORCE_RCV_DET	0x00000004
1021c0ec257Skevlo 
10314ef3578Ssthen #define	ALC_PCIE_PHYMISC2		0x1004
10414ef3578Ssthen #define	PCIE_PHYMISC2_SERDES_CDR_MASK	0x00030000
10514ef3578Ssthen #define	PCIE_PHYMISC2_SERDES_TH_MASK	0x000C0000
10614ef3578Ssthen #define	PCIE_PHYMISC2_SERDES_CDR_SHIFT	16
10714ef3578Ssthen #define	PCIE_PHYMISC2_SERDES_TH_SHIFT	18
10814ef3578Ssthen 
10903ae04aaSkevlo #define	ALC_PDLL_TRNS1			0x1104
11003ae04aaSkevlo #define	PDLL_TRNS1_D3PLLOFF_ENB		0x00000800
11103ae04aaSkevlo 
1121c0ec257Skevlo #define	ALC_TWSI_DEBUG			0x1108
1131c0ec257Skevlo #define	TWSI_DEBUG_DEV_EXIST		0x20000000
1141c0ec257Skevlo 
1151c0ec257Skevlo #define	ALC_EEPROM_CFG			0x12C0
1161c0ec257Skevlo #define	EEPROM_CFG_DATA_HI_MASK		0x0000FFFF
1171c0ec257Skevlo #define	EEPROM_CFG_ADDR_MASK		0x03FF0000
1181c0ec257Skevlo #define	EEPROM_CFG_ACK			0x40000000
1191c0ec257Skevlo #define	EEPROM_CFG_RW			0x80000000
1201c0ec257Skevlo #define	EEPROM_CFG_DATA_HI_SHIFT	0
1211c0ec257Skevlo #define	EEPROM_CFG_ADDR_SHIFT		16
1221c0ec257Skevlo 
1231c0ec257Skevlo #define	ALC_EEPROM_DATA_LO		0x12C4
1241c0ec257Skevlo 
1251c0ec257Skevlo #define	ALC_OPT_CFG			0x12F0
1261c0ec257Skevlo #define	OPT_CFG_CLK_ENB			0x00000002
1271c0ec257Skevlo 
1281c0ec257Skevlo #define	ALC_PM_CFG			0x12F8
1291c0ec257Skevlo #define	PM_CFG_SERDES_ENB		0x00000001
1301c0ec257Skevlo #define	PM_CFG_RBER_ENB			0x00000002
1311c0ec257Skevlo #define	PM_CFG_CLK_REQ_ENB		0x00000004
1321c0ec257Skevlo #define	PM_CFG_ASPM_L1_ENB		0x00000008
1331c0ec257Skevlo #define	PM_CFG_SERDES_L1_ENB		0x00000010
1341c0ec257Skevlo #define	PM_CFG_SERDES_PLL_L1_ENB	0x00000020
1351c0ec257Skevlo #define	PM_CFG_SERDES_PD_EX_L1		0x00000040
1361c0ec257Skevlo #define	PM_CFG_SERDES_BUDS_RX_L1_ENB	0x00000080
1371c0ec257Skevlo #define	PM_CFG_L0S_ENTRY_TIMER_MASK	0x00000F00
13803ae04aaSkevlo #define	PM_CFG_RX_L1_AFTER_L0S		0x00000800
1391c0ec257Skevlo #define	PM_CFG_ASPM_L0S_ENB		0x00001000
1401c0ec257Skevlo #define	PM_CFG_CLK_SWH_L1		0x00002000
1411c0ec257Skevlo #define	PM_CFG_CLK_PWM_VER1_1		0x00004000
1421c0ec257Skevlo #define	PM_CFG_PCIE_RECV		0x00008000
1431c0ec257Skevlo #define	PM_CFG_L1_ENTRY_TIMER_MASK	0x000F0000
14403ae04aaSkevlo #define	PM_CFG_L1_ENTRY_TIMER_816X_MASK	0x00070000
14503ae04aaSkevlo #define	PM_CFG_TX_L1_AFTER_L0S		0x00080000
1461c0ec257Skevlo #define	PM_CFG_PM_REQ_TIMER_MASK	0x00F00000
14714ef3578Ssthen #define	PM_CFG_LCKDET_TIMER_MASK	0x0F000000
14814ef3578Ssthen #define	PM_CFG_EN_BUFS_RX_L0S		0x10000000
14914ef3578Ssthen #define	PM_CFG_SA_DLY_ENB		0x20000000
1501c0ec257Skevlo #define	PM_CFG_MAC_ASPM_CHK		0x40000000
1511c0ec257Skevlo #define	PM_CFG_HOTRST			0x80000000
1521c0ec257Skevlo #define	PM_CFG_L0S_ENTRY_TIMER_SHIFT	8
1531c0ec257Skevlo #define	PM_CFG_L1_ENTRY_TIMER_SHIFT	16
1541c0ec257Skevlo #define	PM_CFG_PM_REQ_TIMER_SHIFT	20
1551c0ec257Skevlo #define	PM_CFG_LCKDET_TIMER_SHIFT	24
1561c0ec257Skevlo 
15714ef3578Ssthen #define	PM_CFG_L0S_ENTRY_TIMER_DEFAULT	6
15814ef3578Ssthen #define	PM_CFG_L1_ENTRY_TIMER_DEFAULT	1
15903ae04aaSkevlo #define	PM_CFG_L1_ENTRY_TIMER_816X_DEFAULT	4
16014ef3578Ssthen #define	PM_CFG_LCKDET_TIMER_DEFAULT	12
16114ef3578Ssthen #define	PM_CFG_PM_REQ_TIMER_DEFAULT	12
16203ae04aaSkevlo #define	PM_CFG_PM_REQ_TIMER_816X_DEFAULT	15
16314ef3578Ssthen 
16414ef3578Ssthen #define	ALC_LTSSM_ID_CFG		0x12FC
16514ef3578Ssthen #define	LTSSM_ID_WRO_ENB		0x00001000
16614ef3578Ssthen 
1671c0ec257Skevlo #define	ALC_MASTER_CFG			0x1400
1681c0ec257Skevlo #define	MASTER_RESET			0x00000001
16914ef3578Ssthen #define	MASTER_TEST_MODE_MASK		0x0000000C
1701c0ec257Skevlo #define	MASTER_BERT_START		0x00000010
17114ef3578Ssthen #define	MASTER_OOB_DIS_OFF		0x00000040
17214ef3578Ssthen #define	MASTER_SA_TIMER_ENB		0x00000080
1731c0ec257Skevlo #define	MASTER_MTIMER_ENB		0x00000100
1741c0ec257Skevlo #define	MASTER_MANUAL_INTR_ENB		0x00000200
1751c0ec257Skevlo #define	MASTER_IM_TX_TIMER_ENB		0x00000400
1761c0ec257Skevlo #define	MASTER_IM_RX_TIMER_ENB		0x00000800
1771c0ec257Skevlo #define	MASTER_CLK_SEL_DIS		0x00001000
1781c0ec257Skevlo #define	MASTER_CLK_SWH_MODE		0x00002000
1791c0ec257Skevlo #define	MASTER_INTR_RD_CLR		0x00004000
1801c0ec257Skevlo #define	MASTER_CHIP_REV_MASK		0x00FF0000
1811c0ec257Skevlo #define	MASTER_CHIP_ID_MASK		0x7F000000
1821c0ec257Skevlo #define	MASTER_OTP_SEL			0x80000000
1831c0ec257Skevlo #define	MASTER_TEST_MODE_SHIFT		2
1841c0ec257Skevlo #define	MASTER_CHIP_REV_SHIFT		16
1851c0ec257Skevlo #define	MASTER_CHIP_ID_SHIFT		24
1861c0ec257Skevlo 
18714ef3578Ssthen /* Number of ticks per usec for AR813x/AR815x. */
1881c0ec257Skevlo #define	ALC_TICK_USECS			2
1891c0ec257Skevlo #define	ALC_USECS(x)			((x) / ALC_TICK_USECS)
1901c0ec257Skevlo 
1911c0ec257Skevlo #define	ALC_MANUAL_TIMER		0x1404
1921c0ec257Skevlo 
1931c0ec257Skevlo #define	ALC_IM_TIMER			0x1408
1941c0ec257Skevlo #define	IM_TIMER_TX_MASK		0x0000FFFF
1951c0ec257Skevlo #define	IM_TIMER_RX_MASK		0xFFFF0000
1961c0ec257Skevlo #define	IM_TIMER_TX_SHIFT		0
1971c0ec257Skevlo #define	IM_TIMER_RX_SHIFT		16
1981c0ec257Skevlo #define	ALC_IM_TIMER_MIN		0
1991c0ec257Skevlo #define	ALC_IM_TIMER_MAX		130000	/* 130ms */
2001c0ec257Skevlo /*
2011c0ec257Skevlo  * 100us will ensure alc(4) wouldn't generate more than 10000 Rx
2021c0ec257Skevlo  * interrupts in a second.
2031c0ec257Skevlo  */
2041c0ec257Skevlo #define	ALC_IM_RX_TIMER_DEFAULT		100	/* 100us */
2051c0ec257Skevlo /*
2061c0ec257Skevlo  * alc(4) does not rely on Tx completion interrupts, so set it
2071c0ec257Skevlo  * somewhat large value to reduce Tx completion interrupts.
2081c0ec257Skevlo  */
20914ef3578Ssthen #define	ALC_IM_TX_TIMER_DEFAULT		1000	/* 1ms */
2101c0ec257Skevlo 
21103ae04aaSkevlo #define	ALC_GPHY_CFG			0x140C	/* 16 bits, 32 bits on AR816x */
21203ae04aaSkevlo 
2131c0ec257Skevlo #define	GPHY_CFG_EXT_RESET		0x0001
2141c0ec257Skevlo #define	GPHY_CFG_RTL_MODE		0x0002
2151c0ec257Skevlo #define	GPHY_CFG_LED_MODE		0x0004
2161c0ec257Skevlo #define	GPHY_CFG_ANEG_NOW		0x0008
2171c0ec257Skevlo #define	GPHY_CFG_RECV_ANEG		0x0010
2181c0ec257Skevlo #define	GPHY_CFG_GATE_25M_ENB		0x0020
2191c0ec257Skevlo #define	GPHY_CFG_LPW_EXIT		0x0040
2201c0ec257Skevlo #define	GPHY_CFG_PHY_IDDQ		0x0080
2211c0ec257Skevlo #define	GPHY_CFG_PHY_IDDQ_DIS		0x0100
2221c0ec257Skevlo #define	GPHY_CFG_PCLK_SEL_DIS		0x0200
2231c0ec257Skevlo #define	GPHY_CFG_HIB_EN			0x0400
2241c0ec257Skevlo #define	GPHY_CFG_HIB_PULSE		0x0800
2251c0ec257Skevlo #define	GPHY_CFG_SEL_ANA_RESET		0x1000
2261c0ec257Skevlo #define	GPHY_CFG_PHY_PLL_ON		0x2000
2271c0ec257Skevlo #define	GPHY_CFG_PWDOWN_HW		0x4000
2281c0ec257Skevlo #define	GPHY_CFG_PHY_PLL_BYPASS		0x8000
22903ae04aaSkevlo #define	GPHY_CFG_100AB_ENB		0x00020000
2301c0ec257Skevlo 
2311c0ec257Skevlo #define	ALC_IDLE_STATUS			0x1410
2321c0ec257Skevlo #define	IDLE_STATUS_RXMAC		0x00000001
2331c0ec257Skevlo #define	IDLE_STATUS_TXMAC		0x00000002
2341c0ec257Skevlo #define	IDLE_STATUS_RXQ			0x00000004
2351c0ec257Skevlo #define	IDLE_STATUS_TXQ			0x00000008
2361c0ec257Skevlo #define	IDLE_STATUS_DMARD		0x00000010
2371c0ec257Skevlo #define	IDLE_STATUS_DMAWR		0x00000020
2381c0ec257Skevlo #define	IDLE_STATUS_SMB			0x00000040
2391c0ec257Skevlo #define	IDLE_STATUS_CMB			0x00000080
2401c0ec257Skevlo 
2411c0ec257Skevlo #define	ALC_MDIO			0x1414
2421c0ec257Skevlo #define	MDIO_DATA_MASK			0x0000FFFF
2431c0ec257Skevlo #define	MDIO_REG_ADDR_MASK		0x001F0000
2441c0ec257Skevlo #define	MDIO_OP_READ			0x00200000
2451c0ec257Skevlo #define	MDIO_OP_WRITE			0x00000000
2461c0ec257Skevlo #define	MDIO_SUP_PREAMBLE		0x00400000
2471c0ec257Skevlo #define	MDIO_OP_EXECUTE			0x00800000
2481c0ec257Skevlo #define	MDIO_CLK_25_4			0x00000000
2491c0ec257Skevlo #define	MDIO_CLK_25_6			0x02000000
2501c0ec257Skevlo #define	MDIO_CLK_25_8			0x03000000
2511c0ec257Skevlo #define	MDIO_CLK_25_10			0x04000000
2521c0ec257Skevlo #define	MDIO_CLK_25_14			0x05000000
2531c0ec257Skevlo #define	MDIO_CLK_25_20			0x06000000
25403ae04aaSkevlo #define	MDIO_CLK_25_128			0x07000000
2551c0ec257Skevlo #define	MDIO_OP_BUSY			0x08000000
2561c0ec257Skevlo #define	MDIO_AP_ENB			0x10000000
25703ae04aaSkevlo #define	MDIO_MODE_EXT			0x40000000
2581c0ec257Skevlo #define	MDIO_DATA_SHIFT			0
2591c0ec257Skevlo #define	MDIO_REG_ADDR_SHIFT		16
2601c0ec257Skevlo 
2611c0ec257Skevlo #define	MDIO_REG_ADDR(x)	\
2621c0ec257Skevlo 	(((x) << MDIO_REG_ADDR_SHIFT) & MDIO_REG_ADDR_MASK)
2631c0ec257Skevlo /* Default PHY address. */
2641c0ec257Skevlo #define	ALC_PHY_ADDR			0
2651c0ec257Skevlo 
2661c0ec257Skevlo #define	ALC_PHY_STATUS			0x1418
2671c0ec257Skevlo #define	PHY_STATUS_RECV_ENB		0x00000001
2681c0ec257Skevlo #define	PHY_STATUS_GENERAL_MASK		0x0000FFFF
2691c0ec257Skevlo #define	PHY_STATUS_OE_PWSP_MASK		0x07FF0000
2701c0ec257Skevlo #define	PHY_STATUS_LPW_STATE		0x80000000
2711c0ec257Skevlo #define	PHY_STATIS_OE_PWSP_SHIFT	16
2721c0ec257Skevlo 
2731c0ec257Skevlo /* Packet memory BIST. */
2741c0ec257Skevlo #define	ALC_BIST0			0x141C
2751c0ec257Skevlo #define	BIST0_ENB			0x00000001
2761c0ec257Skevlo #define	BIST0_SRAM_FAIL			0x00000002
2771c0ec257Skevlo #define	BIST0_FUSE_FLAG			0x00000004
2781c0ec257Skevlo 
2791c0ec257Skevlo /* PCIe retry buffer BIST. */
2801c0ec257Skevlo #define	ALC_BIST1			0x1420
2811c0ec257Skevlo #define	BIST1_ENB			0x00000001
2821c0ec257Skevlo #define	BIST1_SRAM_FAIL			0x00000002
2831c0ec257Skevlo #define	BIST1_FUSE_FLAG			0x00000004
2841c0ec257Skevlo 
2851c0ec257Skevlo #define	ALC_SERDES_LOCK			0x1424
2861c0ec257Skevlo #define	SERDES_LOCK_DET			0x00000001
2871c0ec257Skevlo #define	SERDES_LOCK_DET_ENB		0x00000002
28814ef3578Ssthen #define	SERDES_MAC_CLK_SLOWDOWN		0x00020000
28914ef3578Ssthen #define	SERDES_PHY_CLK_SLOWDOWN		0x00040000
2901c0ec257Skevlo 
29103ae04aaSkevlo #define	ALC_LPI_CTL			0x1440
29203ae04aaSkevlo #define	LPI_CTL_ENB			0x00000001
29303ae04aaSkevlo 
29403ae04aaSkevlo #define	ALC_EXT_MDIO			0x1448
29503ae04aaSkevlo #define	EXT_MDIO_REG_MASK		0x0000FFFF
29603ae04aaSkevlo #define	EXT_MDIO_DEVADDR_MASK		0x001F0000
29703ae04aaSkevlo #define	EXT_MDIO_REG_SHIFT		0
29803ae04aaSkevlo #define	EXT_MDIO_DEVADDR_SHIFT		16
29903ae04aaSkevlo 
30003ae04aaSkevlo #define	EXT_MDIO_REG(x)		\
30103ae04aaSkevlo 	(((x) << EXT_MDIO_REG_SHIFT) & EXT_MDIO_REG_MASK)
30203ae04aaSkevlo #define	EXT_MDIO_DEVADDR(x)	\
30303ae04aaSkevlo 	(((x) << EXT_MDIO_DEVADDR_SHIFT) & EXT_MDIO_DEVADDR_MASK)
30403ae04aaSkevlo 
30503ae04aaSkevlo #define	ALC_IDLE_DECISN_TIMER		0x1474
30603ae04aaSkevlo #define	IDLE_DECISN_TIMER_DEFAULT_1MS	0x400
30703ae04aaSkevlo 
3081c0ec257Skevlo #define	ALC_MAC_CFG			0x1480
3091c0ec257Skevlo #define	MAC_CFG_TX_ENB			0x00000001
3101c0ec257Skevlo #define	MAC_CFG_RX_ENB			0x00000002
3111c0ec257Skevlo #define	MAC_CFG_TX_FC			0x00000004
3121c0ec257Skevlo #define	MAC_CFG_RX_FC			0x00000008
3131c0ec257Skevlo #define	MAC_CFG_LOOP			0x00000010
3141c0ec257Skevlo #define	MAC_CFG_FULL_DUPLEX		0x00000020
3151c0ec257Skevlo #define	MAC_CFG_TX_CRC_ENB		0x00000040
3161c0ec257Skevlo #define	MAC_CFG_TX_AUTO_PAD		0x00000080
3171c0ec257Skevlo #define	MAC_CFG_TX_LENCHK		0x00000100
3181c0ec257Skevlo #define	MAC_CFG_RX_JUMBO_ENB		0x00000200
3191c0ec257Skevlo #define	MAC_CFG_PREAMBLE_MASK		0x00003C00
3201c0ec257Skevlo #define	MAC_CFG_VLAN_TAG_STRIP		0x00004000
3211c0ec257Skevlo #define	MAC_CFG_PROMISC			0x00008000
3221c0ec257Skevlo #define	MAC_CFG_TX_PAUSE		0x00010000
3231c0ec257Skevlo #define	MAC_CFG_SCNT			0x00020000
3241c0ec257Skevlo #define	MAC_CFG_SYNC_RST_TX		0x00040000
3251c0ec257Skevlo #define	MAC_CFG_SIM_RST_TX		0x00080000
3261c0ec257Skevlo #define	MAC_CFG_SPEED_MASK		0x00300000
3271c0ec257Skevlo #define	MAC_CFG_SPEED_10_100		0x00100000
3281c0ec257Skevlo #define	MAC_CFG_SPEED_1000		0x00200000
3291c0ec257Skevlo #define	MAC_CFG_DBG_TX_BACKOFF		0x00400000
3301c0ec257Skevlo #define	MAC_CFG_TX_JUMBO_ENB		0x00800000
3311c0ec257Skevlo #define	MAC_CFG_RXCSUM_ENB		0x01000000
3321c0ec257Skevlo #define	MAC_CFG_ALLMULTI		0x02000000
3331c0ec257Skevlo #define	MAC_CFG_BCAST			0x04000000
3341c0ec257Skevlo #define	MAC_CFG_DBG			0x08000000
3351c0ec257Skevlo #define	MAC_CFG_SINGLE_PAUSE_ENB	0x10000000
33614ef3578Ssthen #define	MAC_CFG_HASH_ALG_CRC32		0x20000000
33714ef3578Ssthen #define	MAC_CFG_SPEED_MODE_SW		0x40000000
33803ae04aaSkevlo #define	MAC_CFG_FAST_PAUSE		0x80000000
3391c0ec257Skevlo #define	MAC_CFG_PREAMBLE_SHIFT		10
3401c0ec257Skevlo #define	MAC_CFG_PREAMBLE_DEFAULT	7
3411c0ec257Skevlo 
3421c0ec257Skevlo #define	ALC_IPG_IFG_CFG			0x1484
3431c0ec257Skevlo #define	IPG_IFG_IPGT_MASK		0x0000007F
3441c0ec257Skevlo #define	IPG_IFG_MIFG_MASK		0x0000FF00
3451c0ec257Skevlo #define	IPG_IFG_IPG1_MASK		0x007F0000
3461c0ec257Skevlo #define	IPG_IFG_IPG2_MASK		0x7F000000
3471c0ec257Skevlo #define	IPG_IFG_IPGT_SHIFT		0
3481c0ec257Skevlo #define	IPG_IFG_IPGT_DEFAULT		0x60
3491c0ec257Skevlo #define	IPG_IFG_MIFG_SHIFT		8
3501c0ec257Skevlo #define	IPG_IFG_MIFG_DEFAULT		0x50
3511c0ec257Skevlo #define	IPG_IFG_IPG1_SHIFT		16
3521c0ec257Skevlo #define	IPG_IFG_IPG1_DEFAULT		0x40
3531c0ec257Skevlo #define	IPG_IFG_IPG2_SHIFT		24
3541c0ec257Skevlo #define	IPG_IFG_IPG2_DEFAULT		0x60
3551c0ec257Skevlo 
3561c0ec257Skevlo /* Station address. */
3571c0ec257Skevlo #define	ALC_PAR0			0x1488
3581c0ec257Skevlo #define	ALC_PAR1			0x148C
3591c0ec257Skevlo 
3601c0ec257Skevlo /* 64bit multicast hash register. */
3611c0ec257Skevlo #define	ALC_MAR0			0x1490
3621c0ec257Skevlo #define	ALC_MAR1			0x1494
3631c0ec257Skevlo 
3641c0ec257Skevlo /* half-duplex parameter configuration. */
3651c0ec257Skevlo #define	ALC_HDPX_CFG			0x1498
3661c0ec257Skevlo #define	HDPX_CFG_LCOL_MASK		0x000003FF
3671c0ec257Skevlo #define	HDPX_CFG_RETRY_MASK		0x0000F000
3681c0ec257Skevlo #define	HDPX_CFG_EXC_DEF_EN		0x00010000
3691c0ec257Skevlo #define	HDPX_CFG_NO_BACK_C		0x00020000
3701c0ec257Skevlo #define	HDPX_CFG_NO_BACK_P		0x00040000
3711c0ec257Skevlo #define	HDPX_CFG_ABEBE			0x00080000
3721c0ec257Skevlo #define	HDPX_CFG_ABEBT_MASK		0x00F00000
3731c0ec257Skevlo #define	HDPX_CFG_JAMIPG_MASK		0x0F000000
3741c0ec257Skevlo #define	HDPX_CFG_LCOL_SHIFT		0
3751c0ec257Skevlo #define	HDPX_CFG_LCOL_DEFAULT		0x37
3761c0ec257Skevlo #define	HDPX_CFG_RETRY_SHIFT		12
3771c0ec257Skevlo #define	HDPX_CFG_RETRY_DEFAULT		0x0F
3781c0ec257Skevlo #define	HDPX_CFG_ABEBT_SHIFT		20
3791c0ec257Skevlo #define	HDPX_CFG_ABEBT_DEFAULT		0x0A
3801c0ec257Skevlo #define	HDPX_CFG_JAMIPG_SHIFT		24
3811c0ec257Skevlo #define	HDPX_CFG_JAMIPG_DEFAULT		0x07
3821c0ec257Skevlo 
3831c0ec257Skevlo #define	ALC_FRAME_SIZE			0x149C
3841c0ec257Skevlo 
3851c0ec257Skevlo #define	ALC_WOL_CFG			0x14A0
3861c0ec257Skevlo #define	WOL_CFG_PATTERN			0x00000001
3871c0ec257Skevlo #define	WOL_CFG_PATTERN_ENB		0x00000002
3881c0ec257Skevlo #define	WOL_CFG_MAGIC			0x00000004
3891c0ec257Skevlo #define	WOL_CFG_MAGIC_ENB		0x00000008
3901c0ec257Skevlo #define	WOL_CFG_LINK_CHG		0x00000010
3911c0ec257Skevlo #define	WOL_CFG_LINK_CHG_ENB		0x00000020
3921c0ec257Skevlo #define	WOL_CFG_PATTERN_DET		0x00000100
3931c0ec257Skevlo #define	WOL_CFG_MAGIC_DET		0x00000200
3941c0ec257Skevlo #define	WOL_CFG_LINK_CHG_DET		0x00000400
3951c0ec257Skevlo #define	WOL_CFG_CLK_SWITCH_ENB		0x00008000
3961c0ec257Skevlo #define	WOL_CFG_PATTERN0		0x00010000
3971c0ec257Skevlo #define	WOL_CFG_PATTERN1		0x00020000
3981c0ec257Skevlo #define	WOL_CFG_PATTERN2		0x00040000
3991c0ec257Skevlo #define	WOL_CFG_PATTERN3		0x00080000
4001c0ec257Skevlo #define	WOL_CFG_PATTERN4		0x00100000
4011c0ec257Skevlo #define	WOL_CFG_PATTERN5		0x00200000
4021c0ec257Skevlo #define	WOL_CFG_PATTERN6		0x00400000
4031c0ec257Skevlo 
4041c0ec257Skevlo /* WOL pattern length. */
4051c0ec257Skevlo #define	ALC_PATTERN_CFG0		0x14A4
4061c0ec257Skevlo #define	PATTERN_CFG_0_LEN_MASK		0x0000007F
4071c0ec257Skevlo #define	PATTERN_CFG_1_LEN_MASK		0x00007F00
4081c0ec257Skevlo #define	PATTERN_CFG_2_LEN_MASK		0x007F0000
4091c0ec257Skevlo #define	PATTERN_CFG_3_LEN_MASK		0x7F000000
4101c0ec257Skevlo 
4111c0ec257Skevlo #define	ALC_PATTERN_CFG1		0x14A8
4121c0ec257Skevlo #define	PATTERN_CFG_4_LEN_MASK		0x0000007F
4131c0ec257Skevlo #define	PATTERN_CFG_5_LEN_MASK		0x00007F00
4141c0ec257Skevlo #define	PATTERN_CFG_6_LEN_MASK		0x007F0000
4151c0ec257Skevlo 
4161c0ec257Skevlo /* RSS */
4171c0ec257Skevlo #define	ALC_RSS_KEY0			0x14B0
4181c0ec257Skevlo 
4191c0ec257Skevlo #define	ALC_RSS_KEY1			0x14B4
4201c0ec257Skevlo 
4211c0ec257Skevlo #define	ALC_RSS_KEY2			0x14B8
4221c0ec257Skevlo 
4231c0ec257Skevlo #define	ALC_RSS_KEY3			0x14BC
4241c0ec257Skevlo 
4251c0ec257Skevlo #define	ALC_RSS_KEY4			0x14C0
4261c0ec257Skevlo 
4271c0ec257Skevlo #define	ALC_RSS_KEY5			0x14C4
4281c0ec257Skevlo 
4291c0ec257Skevlo #define	ALC_RSS_KEY6			0x14C8
4301c0ec257Skevlo 
4311c0ec257Skevlo #define	ALC_RSS_KEY7			0x14CC
4321c0ec257Skevlo 
4331c0ec257Skevlo #define	ALC_RSS_KEY8			0x14D0
4341c0ec257Skevlo 
4351c0ec257Skevlo #define	ALC_RSS_KEY9			0x14D4
4361c0ec257Skevlo 
4371c0ec257Skevlo #define	ALC_RSS_IDT_TABLE0		0x14E0
4381c0ec257Skevlo 
43903ae04aaSkevlo #define	ALC_TD_PRI2_HEAD_ADDR_LO	0x14E0	/* AR816x */
44003ae04aaSkevlo 
4411c0ec257Skevlo #define	ALC_RSS_IDT_TABLE1		0x14E4
4421c0ec257Skevlo 
44303ae04aaSkevlo #define	ALC_TD_PRI3_HEAD_ADDR_LO	0x14E4	/* AR816x */
44403ae04aaSkevlo 
4451c0ec257Skevlo #define	ALC_RSS_IDT_TABLE2		0x14E8
4461c0ec257Skevlo 
4471c0ec257Skevlo #define	ALC_RSS_IDT_TABLE3		0x14EC
4481c0ec257Skevlo 
4491c0ec257Skevlo #define	ALC_RSS_IDT_TABLE4		0x14F0
4501c0ec257Skevlo 
4511c0ec257Skevlo #define	ALC_RSS_IDT_TABLE5		0x14F4
4521c0ec257Skevlo 
4531c0ec257Skevlo #define	ALC_RSS_IDT_TABLE6		0x14F8
4541c0ec257Skevlo 
4551c0ec257Skevlo #define	ALC_RSS_IDT_TABLE7		0x14FC
4561c0ec257Skevlo 
4571c0ec257Skevlo #define	ALC_SRAM_RD0_ADDR		0x1500
4581c0ec257Skevlo 
4591c0ec257Skevlo #define	ALC_SRAM_RD1_ADDR		0x1504
4601c0ec257Skevlo 
4611c0ec257Skevlo #define	ALC_SRAM_RD2_ADDR		0x1508
4621c0ec257Skevlo 
4631c0ec257Skevlo #define	ALC_SRAM_RD3_ADDR		0x150C
4641c0ec257Skevlo 
4651c0ec257Skevlo #define	RD_HEAD_ADDR_MASK		0x000003FF
4661c0ec257Skevlo #define	RD_TAIL_ADDR_MASK		0x03FF0000
4671c0ec257Skevlo #define	RD_HEAD_ADDR_SHIFT		0
4681c0ec257Skevlo #define	RD_TAIL_ADDR_SHIFT		16
4691c0ec257Skevlo 
4701c0ec257Skevlo #define	ALC_RD_NIC_LEN0			0x1510	/* 8 bytes unit */
4711c0ec257Skevlo #define	RD_NIC_LEN_MASK			0x000003FF
4721c0ec257Skevlo 
4731c0ec257Skevlo #define	ALC_RD_NIC_LEN1			0x1514
4741c0ec257Skevlo 
4751c0ec257Skevlo #define	ALC_SRAM_TD_ADDR		0x1518
4761c0ec257Skevlo #define	TD_HEAD_ADDR_MASK		0x000003FF
4771c0ec257Skevlo #define	TD_TAIL_ADDR_MASK		0x03FF0000
4781c0ec257Skevlo #define	TD_HEAD_ADDR_SHIFT		0
4791c0ec257Skevlo #define	TD_TAIL_ADDR_SHIFT		16
4801c0ec257Skevlo 
4811c0ec257Skevlo #define	ALC_SRAM_TD_LEN			0x151C	/* 8 bytes unit */
4821c0ec257Skevlo #define	SRAM_TD_LEN_MASK		0x000003FF
4831c0ec257Skevlo 
4841c0ec257Skevlo #define	ALC_SRAM_RX_FIFO_ADDR		0x1520
4851c0ec257Skevlo 
4861c0ec257Skevlo #define	ALC_SRAM_RX_FIFO_LEN		0x1524
48703ae04aaSkevlo #define	SRAM_RX_FIFO_LEN_MASK		0x00000FFF
48803ae04aaSkevlo #define	SRAM_RX_FIFO_LEN_SHIFT		0
4891c0ec257Skevlo 
4901c0ec257Skevlo #define	ALC_SRAM_TX_FIFO_ADDR		0x1528
4911c0ec257Skevlo 
4921c0ec257Skevlo #define	ALC_SRAM_TX_FIFO_LEN		0x152C
4931c0ec257Skevlo 
4941c0ec257Skevlo #define	ALC_SRAM_TCPH_ADDR		0x1530
4951c0ec257Skevlo #define	SRAM_TCPH_ADDR_MASK		0x00000FFF
4961c0ec257Skevlo #define	SRAM_PATH_ADDR_MASK		0x0FFF0000
4971c0ec257Skevlo #define	SRAM_TCPH_ADDR_SHIFT		0
4981c0ec257Skevlo #define	SRAM_PKTH_ADDR_SHIFT		16
4991c0ec257Skevlo 
5001c0ec257Skevlo #define	ALC_DMA_BLOCK			0x1534
5011c0ec257Skevlo #define	DMA_BLOCK_LOAD			0x00000001
5021c0ec257Skevlo 
5031c0ec257Skevlo #define	ALC_RX_BASE_ADDR_HI		0x1540
5041c0ec257Skevlo 
5051c0ec257Skevlo #define	ALC_TX_BASE_ADDR_HI		0x1544
5061c0ec257Skevlo 
5071c0ec257Skevlo #define	ALC_SMB_BASE_ADDR_HI		0x1548
5081c0ec257Skevlo 
5091c0ec257Skevlo #define	ALC_SMB_BASE_ADDR_LO		0x154C
5101c0ec257Skevlo 
5111c0ec257Skevlo #define	ALC_RD0_HEAD_ADDR_LO		0x1550
5121c0ec257Skevlo 
5131c0ec257Skevlo #define	ALC_RD1_HEAD_ADDR_LO		0x1554
5141c0ec257Skevlo 
5151c0ec257Skevlo #define	ALC_RD2_HEAD_ADDR_LO		0x1558
5161c0ec257Skevlo 
5171c0ec257Skevlo #define	ALC_RD3_HEAD_ADDR_LO		0x155C
5181c0ec257Skevlo 
5191c0ec257Skevlo #define	ALC_RD_RING_CNT			0x1560
5201c0ec257Skevlo #define	RD_RING_CNT_MASK		0x00000FFF
5211c0ec257Skevlo #define	RD_RING_CNT_SHIFT		0
5221c0ec257Skevlo 
5231c0ec257Skevlo #define	ALC_RX_BUF_SIZE			0x1564
5241c0ec257Skevlo #define	RX_BUF_SIZE_MASK		0x0000FFFF
5251c0ec257Skevlo /*
5261c0ec257Skevlo  * If larger buffer size than 1536 is specified the controller
5271c0ec257Skevlo  * will be locked up. This is hardware limitation.
5281c0ec257Skevlo  */
5291c0ec257Skevlo #define	RX_BUF_SIZE_MAX			1536
5301c0ec257Skevlo 
5311c0ec257Skevlo #define	ALC_RRD0_HEAD_ADDR_LO		0x1568
5321c0ec257Skevlo 
5331c0ec257Skevlo #define	ALC_RRD1_HEAD_ADDR_LO		0x156C
5341c0ec257Skevlo 
5351c0ec257Skevlo #define	ALC_RRD2_HEAD_ADDR_LO		0x1570
5361c0ec257Skevlo 
5371c0ec257Skevlo #define	ALC_RRD3_HEAD_ADDR_LO		0x1574
5381c0ec257Skevlo 
5391c0ec257Skevlo #define	ALC_RRD_RING_CNT		0x1578
5401c0ec257Skevlo #define	RRD_RING_CNT_MASK		0x00000FFF
5411c0ec257Skevlo #define	RRD_RING_CNT_SHIFT		0
5421c0ec257Skevlo 
5431c0ec257Skevlo #define	ALC_TDH_HEAD_ADDR_LO		0x157C
5441c0ec257Skevlo 
54503ae04aaSkevlo #define	ALC_TD_PRI1_HEAD_ADDR_LO	0x157C	/* AR816x */
54603ae04aaSkevlo 
5471c0ec257Skevlo #define	ALC_TDL_HEAD_ADDR_LO		0x1580
5481c0ec257Skevlo 
54903ae04aaSkevlo #define	ALC_TD_PRI0_HEAD_ADDR_LO	0x1580	/* AR816x */
55003ae04aaSkevlo 
5511c0ec257Skevlo #define	ALC_TD_RING_CNT			0x1584
5521c0ec257Skevlo #define	TD_RING_CNT_MASK		0x0000FFFF
5531c0ec257Skevlo #define	TD_RING_CNT_SHIFT		0
5541c0ec257Skevlo 
5551c0ec257Skevlo #define	ALC_CMB_BASE_ADDR_LO		0x1588
5561c0ec257Skevlo 
5571c0ec257Skevlo #define	ALC_TXQ_CFG			0x1590
5581c0ec257Skevlo #define	TXQ_CFG_TD_BURST_MASK		0x0000000F
5591c0ec257Skevlo #define	TXQ_CFG_IP_OPTION_ENB		0x00000010
5601c0ec257Skevlo #define	TXQ_CFG_ENB			0x00000020
5611c0ec257Skevlo #define	TXQ_CFG_ENHANCED_MODE		0x00000040
5621c0ec257Skevlo #define	TXQ_CFG_8023_ENB		0x00000080
5631c0ec257Skevlo #define	TXQ_CFG_TX_FIFO_BURST_MASK	0xFFFF0000
5641c0ec257Skevlo #define	TXQ_CFG_TD_BURST_SHIFT		0
5651c0ec257Skevlo #define	TXQ_CFG_TD_BURST_DEFAULT	5
5661c0ec257Skevlo #define	TXQ_CFG_TX_FIFO_BURST_SHIFT	16
5671c0ec257Skevlo 
5681c0ec257Skevlo #define	ALC_TSO_OFFLOAD_THRESH		0x1594	/* 8 bytes unit */
5691c0ec257Skevlo #define	TSO_OFFLOAD_THRESH_MASK		0x000007FF
57003ae04aaSkevlo #define	TSO_OFFLOAD_ERRLGPKT_DROP_ENB	0x00000800
5711c0ec257Skevlo #define	TSO_OFFLOAD_THRESH_SHIFT	0
5721c0ec257Skevlo #define	TSO_OFFLOAD_THRESH_UNIT		8
5731c0ec257Skevlo #define	TSO_OFFLOAD_THRESH_UNIT_SHIFT	3
5741c0ec257Skevlo 
5751c0ec257Skevlo #define	ALC_TXF_WATER_MARK		0x1598	/* 8 bytes unit */
5761c0ec257Skevlo #define	TXF_WATER_MARK_HI_MASK		0x00000FFF
5771c0ec257Skevlo #define	TXF_WATER_MARK_LO_MASK		0x0FFF0000
5781c0ec257Skevlo #define	TXF_WATER_MARK_BURST_ENB	0x80000000
5791c0ec257Skevlo #define	TXF_WATER_MARK_LO_SHIFT		0
5801c0ec257Skevlo #define	TXF_WATER_MARK_HI_SHIFT		16
5811c0ec257Skevlo 
5821c0ec257Skevlo #define	ALC_THROUGHPUT_MON		0x159C
5831c0ec257Skevlo #define	THROUGHPUT_MON_RATE_MASK	0x00000003
5841c0ec257Skevlo #define	THROUGHPUT_MON_ENB		0x00000080
5851c0ec257Skevlo #define	THROUGHPUT_MON_RATE_SHIFT	0
5861c0ec257Skevlo 
5871c0ec257Skevlo #define	ALC_RXQ_CFG			0x15A0
5881c0ec257Skevlo #define	RXQ_CFG_ASPM_THROUGHPUT_LIMIT_MASK	0x00000003
5891c0ec257Skevlo #define	RXQ_CFG_ASPM_THROUGHPUT_LIMIT_NONE	0x00000000
5901c0ec257Skevlo #define	RXQ_CFG_ASPM_THROUGHPUT_LIMIT_1M	0x00000001
5911c0ec257Skevlo #define	RXQ_CFG_ASPM_THROUGHPUT_LIMIT_10M	0x00000002
5921c0ec257Skevlo #define	RXQ_CFG_ASPM_THROUGHPUT_LIMIT_100M	0x00000003
5931c0ec257Skevlo #define	RXQ_CFG_QUEUE1_ENB		0x00000010
5941c0ec257Skevlo #define	RXQ_CFG_QUEUE2_ENB		0x00000020
5951c0ec257Skevlo #define	RXQ_CFG_QUEUE3_ENB		0x00000040
5961c0ec257Skevlo #define	RXQ_CFG_IPV6_CSUM_ENB		0x00000080
5971c0ec257Skevlo #define	RXQ_CFG_RSS_HASH_TBL_LEN_MASK	0x0000FF00
5981c0ec257Skevlo #define	RXQ_CFG_RSS_HASH_IPV4		0x00010000
5991c0ec257Skevlo #define	RXQ_CFG_RSS_HASH_IPV4_TCP	0x00020000
6001c0ec257Skevlo #define	RXQ_CFG_RSS_HASH_IPV6		0x00040000
6011c0ec257Skevlo #define	RXQ_CFG_RSS_HASH_IPV6_TCP	0x00080000
6021c0ec257Skevlo #define	RXQ_CFG_RD_BURST_MASK		0x03F00000
6031c0ec257Skevlo #define	RXQ_CFG_RSS_MODE_DIS		0x00000000
6041c0ec257Skevlo #define	RXQ_CFG_RSS_MODE_SQSINT		0x04000000
6051c0ec257Skevlo #define	RXQ_CFG_RSS_MODE_MQUESINT	0x08000000
6061c0ec257Skevlo #define	RXQ_CFG_RSS_MODE_MQUEMINT	0x0C000000
6071c0ec257Skevlo #define	RXQ_CFG_NIP_QUEUE_SEL_TBL	0x10000000
6081c0ec257Skevlo #define	RXQ_CFG_RSS_HASH_ENB		0x20000000
6091c0ec257Skevlo #define	RXQ_CFG_CUT_THROUGH_ENB		0x40000000
6101c0ec257Skevlo #define	RXQ_CFG_QUEUE0_ENB		0x80000000
6111c0ec257Skevlo #define	RXQ_CFG_RSS_HASH_TBL_LEN_SHIFT	8
6121c0ec257Skevlo #define	RXQ_CFG_RD_BURST_DEFAULT	8
6131c0ec257Skevlo #define	RXQ_CFG_RD_BURST_SHIFT		20
6141c0ec257Skevlo #define	RXQ_CFG_ENB					\
6151c0ec257Skevlo 	(RXQ_CFG_QUEUE0_ENB | RXQ_CFG_QUEUE1_ENB |	\
6161c0ec257Skevlo 	 RXQ_CFG_QUEUE2_ENB | RXQ_CFG_QUEUE3_ENB)
6171c0ec257Skevlo 
61803ae04aaSkevlo /* AR816x specific bits */
61903ae04aaSkevlo #define	RXQ_CFG_816X_RSS_HASH_IPV4	0x00000004
62003ae04aaSkevlo #define	RXQ_CFG_816X_RSS_HASH_IPV4_TCP	0x00000008
62103ae04aaSkevlo #define	RXQ_CFG_816X_RSS_HASH_IPV6	0x00000010
62203ae04aaSkevlo #define	RXQ_CFG_816X_RSS_HASH_IPV6_TCP	0x00000020
62303ae04aaSkevlo #define	RXQ_CFG_816X_RSS_HASH_MASK	0x0000003C
62403ae04aaSkevlo #define	RXQ_CFG_816X_IPV6_PARSE_ENB	0x00000080
62503ae04aaSkevlo #define	RXQ_CFG_816X_IDT_TBL_SIZE_MASK	0x0001FF00
62603ae04aaSkevlo #define	RXQ_CFG_816X_IDT_TBL_SIZE_SHIFT	8
62703ae04aaSkevlo #define	RXQ_CFG_816X_IDT_TBL_SIZE_DEFAULT	0x100
62803ae04aaSkevlo 
6291c0ec257Skevlo #define	ALC_RX_RD_FREE_THRESH		0x15A4	/* 8 bytes unit. */
6301c0ec257Skevlo #define	RX_RD_FREE_THRESH_HI_MASK	0x0000003F
6311c0ec257Skevlo #define	RX_RD_FREE_THRESH_LO_MASK	0x00000FC0
6321c0ec257Skevlo #define	RX_RD_FREE_THRESH_HI_SHIFT	0
6331c0ec257Skevlo #define	RX_RD_FREE_THRESH_LO_SHIFT	6
6341c0ec257Skevlo #define	RX_RD_FREE_THRESH_HI_DEFAULT	16
6351c0ec257Skevlo #define	RX_RD_FREE_THRESH_LO_DEFAULT	8
6361c0ec257Skevlo 
6371c0ec257Skevlo #define	ALC_RX_FIFO_PAUSE_THRESH	0x15A8
6381c0ec257Skevlo #define	RX_FIFO_PAUSE_THRESH_LO_MASK	0x00000FFF
6391c0ec257Skevlo #define	RX_FIFO_PAUSE_THRESH_HI_MASK	0x0FFF0000
6401c0ec257Skevlo #define	RX_FIFO_PAUSE_THRESH_LO_SHIFT	0
6411c0ec257Skevlo #define	RX_FIFO_PAUSE_THRESH_HI_SHIFT	16
6421c0ec257Skevlo 
64303ae04aaSkevlo /*
64403ae04aaSkevlo  * Size = tx-packet(1522)  IPG(12) + SOF(8) + 64(Pause) + IPG(12) + SOF(8) +
64503ae04aaSkevlo  * rx-packet(1522) + delay-of-link(64) = 3212.
64603ae04aaSkevlo  */
64703ae04aaSkevlo #define	RX_FIFO_PAUSE_816X_RSVD		3212
64803ae04aaSkevlo 
6491c0ec257Skevlo #define	ALC_RD_DMA_CFG			0x15AC
6501c0ec257Skevlo #define	RD_DMA_CFG_THRESH_MASK		0x00000FFF	/* 8 bytes unit */
6511c0ec257Skevlo #define	RD_DMA_CFG_TIMER_MASK		0xFFFF0000
6521c0ec257Skevlo #define	RD_DMA_CFG_THRESH_SHIFT		0
6531c0ec257Skevlo #define	RD_DMA_CFG_TIMER_SHIFT		16
6541c0ec257Skevlo #define	RD_DMA_CFG_THRESH_DEFAULT	0x100
6551c0ec257Skevlo #define	RD_DMA_CFG_TIMER_DEFAULT	0
6561c0ec257Skevlo #define	RD_DMA_CFG_TICK_USECS		8
6571c0ec257Skevlo #define	ALC_RD_DMA_CFG_USECS(x)		((x) / RD_DMA_CFG_TICK_USECS)
6581c0ec257Skevlo 
6591c0ec257Skevlo #define	ALC_RSS_HASH_VALUE		0x15B0
6601c0ec257Skevlo 
6611c0ec257Skevlo #define	ALC_RSS_HASH_FLAG		0x15B4
6621c0ec257Skevlo 
6631c0ec257Skevlo #define	ALC_RSS_CPU			0x15B8
6641c0ec257Skevlo 
6651c0ec257Skevlo #define	ALC_DMA_CFG			0x15C0
6661c0ec257Skevlo #define	DMA_CFG_IN_ORDER		0x00000001
6671c0ec257Skevlo #define	DMA_CFG_ENH_ORDER		0x00000002
6681c0ec257Skevlo #define	DMA_CFG_OUT_ORDER		0x00000004
6691c0ec257Skevlo #define	DMA_CFG_RCB_64			0x00000000
6701c0ec257Skevlo #define	DMA_CFG_RCB_128			0x00000008
6711c0ec257Skevlo #define	DMA_CFG_RD_BURST_128		0x00000000
6721c0ec257Skevlo #define	DMA_CFG_RD_BURST_256		0x00000010
6731c0ec257Skevlo #define	DMA_CFG_RD_BURST_512		0x00000020
6741c0ec257Skevlo #define	DMA_CFG_RD_BURST_1024		0x00000030
6751c0ec257Skevlo #define	DMA_CFG_RD_BURST_2048		0x00000040
6761c0ec257Skevlo #define	DMA_CFG_RD_BURST_4096		0x00000050
6771c0ec257Skevlo #define	DMA_CFG_WR_BURST_128		0x00000000
6781c0ec257Skevlo #define	DMA_CFG_WR_BURST_256		0x00000080
6791c0ec257Skevlo #define	DMA_CFG_WR_BURST_512		0x00000100
6801c0ec257Skevlo #define	DMA_CFG_WR_BURST_1024		0x00000180
6811c0ec257Skevlo #define	DMA_CFG_WR_BURST_2048		0x00000200
6821c0ec257Skevlo #define	DMA_CFG_WR_BURST_4096		0x00000280
6831c0ec257Skevlo #define	DMA_CFG_RD_REQ_PRI		0x00000400
6841c0ec257Skevlo #define	DMA_CFG_RD_DELAY_CNT_MASK	0x0000F800
6851c0ec257Skevlo #define	DMA_CFG_WR_DELAY_CNT_MASK	0x000F0000
6861c0ec257Skevlo #define	DMA_CFG_CMB_ENB			0x00100000
6871c0ec257Skevlo #define	DMA_CFG_SMB_ENB			0x00200000
6881c0ec257Skevlo #define	DMA_CFG_CMB_NOW			0x00400000
6891c0ec257Skevlo #define	DMA_CFG_SMB_DIS			0x01000000
69003ae04aaSkevlo #define	DMA_CFG_RD_CHNL_SEL_MASK	0x0C000000
69103ae04aaSkevlo #define	DMA_CFG_RD_CHNL_SEL_1		0x00000000
69203ae04aaSkevlo #define	DMA_CFG_RD_CHNL_SEL_2		0x04000000
69303ae04aaSkevlo #define	DMA_CFG_RD_CHNL_SEL_3		0x08000000
69403ae04aaSkevlo #define	DMA_CFG_RD_CHNL_SEL_4		0x0C000000
69503ae04aaSkevlo #define	DMA_CFG_WSRAM_RDCTL		0x10000000
69603ae04aaSkevlo #define	DMA_CFG_RD_PEND_CLR		0x20000000
69703ae04aaSkevlo #define	DMA_CFG_WR_PEND_CLR		0x40000000
6981c0ec257Skevlo #define	DMA_CFG_SMB_NOW			0x80000000
6991c0ec257Skevlo #define	DMA_CFG_RD_BURST_MASK		0x07
7001c0ec257Skevlo #define	DMA_CFG_RD_BURST_SHIFT		4
7011c0ec257Skevlo #define	DMA_CFG_WR_BURST_MASK		0x07
7021c0ec257Skevlo #define	DMA_CFG_WR_BURST_SHIFT		7
7031c0ec257Skevlo #define	DMA_CFG_RD_DELAY_CNT_SHIFT	11
7041c0ec257Skevlo #define	DMA_CFG_WR_DELAY_CNT_SHIFT	16
7051c0ec257Skevlo #define	DMA_CFG_RD_DELAY_CNT_DEFAULT	15
7061c0ec257Skevlo #define	DMA_CFG_WR_DELAY_CNT_DEFAULT	4
7071c0ec257Skevlo 
7081c0ec257Skevlo #define	ALC_SMB_STAT_TIMER		0x15C4
7091c0ec257Skevlo #define	SMB_STAT_TIMER_MASK		0x00FFFFFF
7101c0ec257Skevlo #define	SMB_STAT_TIMER_SHIFT		0
7111c0ec257Skevlo 
7121c0ec257Skevlo #define	ALC_CMB_TD_THRESH		0x15C8
7131c0ec257Skevlo #define	CMB_TD_THRESH_MASK		0x0000FFFF
7141c0ec257Skevlo #define	CMB_TD_THRESH_SHIFT		0
7151c0ec257Skevlo 
7161c0ec257Skevlo #define	ALC_CMB_TX_TIMER		0x15CC
7171c0ec257Skevlo #define	CMB_TX_TIMER_MASK		0x0000FFFF
7181c0ec257Skevlo #define	CMB_TX_TIMER_SHIFT		0
7191c0ec257Skevlo 
72003ae04aaSkevlo #define	ALC_MSI_MAP_TBL1		0x15D0
72103ae04aaSkevlo 
72203ae04aaSkevlo #define	ALC_MSI_ID_MAP			0x15D4
72303ae04aaSkevlo 
72403ae04aaSkevlo #define	ALC_MSI_MAP_TBL2		0x15D8
72503ae04aaSkevlo 
7261c0ec257Skevlo #define	ALC_MBOX_RD0_PROD_IDX		0x15E0
7271c0ec257Skevlo 
7281c0ec257Skevlo #define	ALC_MBOX_RD1_PROD_IDX		0x15E4
7291c0ec257Skevlo 
7301c0ec257Skevlo #define	ALC_MBOX_RD2_PROD_IDX		0x15E8
7311c0ec257Skevlo 
7321c0ec257Skevlo #define	ALC_MBOX_RD3_PROD_IDX		0x15EC
7331c0ec257Skevlo 
7341c0ec257Skevlo #define	ALC_MBOX_RD_PROD_MASK		0x0000FFFF
7351c0ec257Skevlo #define	MBOX_RD_PROD_SHIFT		0
7361c0ec257Skevlo 
7371c0ec257Skevlo #define	ALC_MBOX_TD_PROD_IDX		0x15F0
7381c0ec257Skevlo #define	MBOX_TD_PROD_HI_IDX_MASK	0x0000FFFF
7391c0ec257Skevlo #define	MBOX_TD_PROD_LO_IDX_MASK	0xFFFF0000
7401c0ec257Skevlo #define	MBOX_TD_PROD_HI_IDX_SHIFT	0
7411c0ec257Skevlo #define	MBOX_TD_PROD_LO_IDX_SHIFT	16
7421c0ec257Skevlo 
74303ae04aaSkevlo #define	ALC_MBOX_TD_PRI1_PROD_IDX	0x15F0	/* 16 bits AR816x */
74403ae04aaSkevlo #define	ALC_MBOX_TD_PRI0_PROD_IDX	0x15F2	/* 16 bits AR816x */
7451c0ec257Skevlo #define	ALC_MBOX_TD_CONS_IDX		0x15F4
7461c0ec257Skevlo #define	MBOX_TD_CONS_HI_IDX_MASK	0x0000FFFF
7471c0ec257Skevlo #define	MBOX_TD_CONS_LO_IDX_MASK	0xFFFF0000
7481c0ec257Skevlo #define	MBOX_TD_CONS_HI_IDX_SHIFT	0
7491c0ec257Skevlo #define	MBOX_TD_CONS_LO_IDX_SHIFT	16
7501c0ec257Skevlo 
75103ae04aaSkevlo #define	ALC_MBOX_TD_PRI1_CONS_IDX	0x15F4	/* 16 bits AR816x */
75203ae04aaSkevlo #define	ALC_MBOX_TD_PRI0_CONS_IDX	0x15F6	/* 16 bits AR816x */
75303ae04aaSkevlo 
7541c0ec257Skevlo #define	ALC_MBOX_RD01_CONS_IDX		0x15F8
7551c0ec257Skevlo #define	MBOX_RD0_CONS_IDX_MASK		0x0000FFFF
7561c0ec257Skevlo #define	MBOX_RD1_CONS_IDX_MASK		0xFFFF0000
7571c0ec257Skevlo #define	MBOX_RD0_CONS_IDX_SHIFT		0
7581c0ec257Skevlo #define	MBOX_RD1_CONS_IDX_SHIFT		16
7591c0ec257Skevlo 
7601c0ec257Skevlo #define	ALC_MBOX_RD23_CONS_IDX		0x15FC
7611c0ec257Skevlo #define	MBOX_RD2_CONS_IDX_MASK		0x0000FFFF
7621c0ec257Skevlo #define	MBOX_RD3_CONS_IDX_MASK		0xFFFF0000
7631c0ec257Skevlo #define	MBOX_RD2_CONS_IDX_SHIFT		0
7641c0ec257Skevlo #define	MBOX_RD3_CONS_IDX_SHIFT		16
7651c0ec257Skevlo 
7661c0ec257Skevlo #define	ALC_INTR_STATUS			0x1600
7671c0ec257Skevlo #define	INTR_SMB			0x00000001
7681c0ec257Skevlo #define	INTR_TIMER			0x00000002
7691c0ec257Skevlo #define	INTR_MANUAL_TIMER		0x00000004
7701c0ec257Skevlo #define	INTR_RX_FIFO_OFLOW		0x00000008
7711c0ec257Skevlo #define	INTR_RD0_UNDERRUN		0x00000010
7721c0ec257Skevlo #define	INTR_RD1_UNDERRUN		0x00000020
7731c0ec257Skevlo #define	INTR_RD2_UNDERRUN		0x00000040
7741c0ec257Skevlo #define	INTR_RD3_UNDERRUN		0x00000080
7751c0ec257Skevlo #define	INTR_TX_FIFO_UNDERRUN		0x00000100
7761c0ec257Skevlo #define	INTR_DMA_RD_TO_RST		0x00000200
7771c0ec257Skevlo #define	INTR_DMA_WR_TO_RST		0x00000400
7781c0ec257Skevlo #define	INTR_TX_CREDIT			0x00000800
7791c0ec257Skevlo #define	INTR_GPHY			0x00001000
7801c0ec257Skevlo #define	INTR_GPHY_LOW_PW		0x00002000
7811c0ec257Skevlo #define	INTR_TXQ_TO_RST			0x00004000
78203ae04aaSkevlo #define	INTR_TX_PKT0			0x00008000
7831c0ec257Skevlo #define	INTR_RX_PKT0			0x00010000
7841c0ec257Skevlo #define	INTR_RX_PKT1			0x00020000
7851c0ec257Skevlo #define	INTR_RX_PKT2			0x00040000
7861c0ec257Skevlo #define	INTR_RX_PKT3			0x00080000
7871c0ec257Skevlo #define	INTR_MAC_RX			0x00100000
7881c0ec257Skevlo #define	INTR_MAC_TX			0x00200000
7891c0ec257Skevlo #define	INTR_UNDERRUN			0x00400000
7901c0ec257Skevlo #define	INTR_FRAME_ERROR		0x00800000
7911c0ec257Skevlo #define	INTR_FRAME_OK			0x01000000
7921c0ec257Skevlo #define	INTR_CSUM_ERROR			0x02000000
7931c0ec257Skevlo #define	INTR_PHY_LINK_DOWN		0x04000000
7941c0ec257Skevlo #define	INTR_DIS_INT			0x80000000
7951c0ec257Skevlo 
79603ae04aaSkevlo /* INTR status for AR816x/AR817x  4 TX queues, 8 RX queues */
79703ae04aaSkevlo #define	INTR_TX_PKT1			0x00000020
79803ae04aaSkevlo #define	INTR_TX_PKT2			0x00000040
79903ae04aaSkevlo #define	INTR_TX_PKT3			0x00000080
80003ae04aaSkevlo #define	INTR_RX_PKT4			0x08000000
80103ae04aaSkevlo #define	INTR_RX_PKT5			0x10000000
80203ae04aaSkevlo #define	INTR_RX_PKT6			0x20000000
80303ae04aaSkevlo #define	INTR_RX_PKT7			0x40000000
80403ae04aaSkevlo 
8051c0ec257Skevlo /* Interrupt Mask Register */
8061c0ec257Skevlo #define	ALC_INTR_MASK			0x1604
8071c0ec257Skevlo 
80803ae04aaSkevlo #define	INTR_TX_PKT			INTR_TX_PKT0
8091c0ec257Skevlo #define	INTR_RX_PKT			INTR_RX_PKT0
8101c0ec257Skevlo #define	INTR_RD_UNDERRUN		INTR_RD0_UNDERRUN
81164495c1aStedu 
8121c0ec257Skevlo #define	ALC_INTRS					\
8131c0ec257Skevlo 	(INTR_DMA_RD_TO_RST | INTR_DMA_WR_TO_RST |	\
8141c0ec257Skevlo 	INTR_TXQ_TO_RST	| INTR_RX_PKT | INTR_TX_PKT |	\
8151c0ec257Skevlo 	INTR_RX_FIFO_OFLOW | INTR_RD_UNDERRUN |		\
8161c0ec257Skevlo 	INTR_TX_FIFO_UNDERRUN)
8171c0ec257Skevlo #define	ALC_INTR_RETRIG_TIMER		0x1608
8181c0ec257Skevlo #define	INTR_RETRIG_TIMER_MASK		0x0000FFFF
8191c0ec257Skevlo #define	INTR_RETRIG_TIMER_SHIFT		0
8201c0ec257Skevlo 
8211c0ec257Skevlo #define	ALC_HDS_CFG			0x160C
8221c0ec257Skevlo #define	HDS_CFG_ENB			0x00000001
8231c0ec257Skevlo #define	HDS_CFG_BACKFILLSIZE_MASK	0x000FFF00
8241c0ec257Skevlo #define	HDS_CFG_MAX_HDRSIZE_MASK	0xFFF00000
8251c0ec257Skevlo #define	HDS_CFG_BACKFILLSIZE_SHIFT	8
8261c0ec257Skevlo #define	HDS_CFG_MAX_HDRSIZE_SHIFT	20
8271c0ec257Skevlo 
82803ae04aaSkevlo #define	ALC_MBOX_TD_PRI3_PROD_IDX	0x1618	/* 16 bits AR816x */
82903ae04aaSkevlo #define	ALC_MBOX_TD_PRI2_PROD_IDX	0x161A	/* 16 bits AR816x */
83003ae04aaSkevlo #define	ALC_MBOX_TD_PRI3_CONS_IDX	0x161C	/* 16 bits AR816x */
83103ae04aaSkevlo #define	ALC_MBOX_TD_PRI2_CONS_IDX	0x161E	/* 16 bits AR816x */
83203ae04aaSkevlo 
83314ef3578Ssthen /* AR813x/AR815x registers for MAC statistics */
8341c0ec257Skevlo #define	ALC_RX_MIB_BASE			0x1700
8351c0ec257Skevlo 
8361c0ec257Skevlo #define	ALC_TX_MIB_BASE			0x1760
8371c0ec257Skevlo 
83803ae04aaSkevlo #define	ALC_DRV				0x1804	/* AR816x */
83903ae04aaSkevlo #define	DRV_ASPM_SPD10LMT_1M		0x00000000
84003ae04aaSkevlo #define	DRV_ASPM_SPD10LMT_10M		0x00000001
84103ae04aaSkevlo #define	DRV_ASPM_SPD10LMT_100M		0x00000002
84203ae04aaSkevlo #define	DRV_ASPM_SPD10LMT_NO		0x00000003
84303ae04aaSkevlo #define	DRV_ASPM_SPD10LMT_MASK		0x00000003
84403ae04aaSkevlo #define	DRV_ASPM_SPD100LMT_1M		0x00000000
84503ae04aaSkevlo #define	DRV_ASPM_SPD100LMT_10M		0x00000004
84603ae04aaSkevlo #define	DRV_ASPM_SPD100LMT_100M		0x00000008
84703ae04aaSkevlo #define	DRV_ASPM_SPD100LMT_NO		0x0000000C
84803ae04aaSkevlo #define	DRV_ASPM_SPD100LMT_MASK		0x0000000C
84903ae04aaSkevlo #define	DRV_ASPM_SPD1000LMT_100M	0x00000000
85003ae04aaSkevlo #define	DRV_ASPM_SPD1000LMT_NO		0x00000010
85103ae04aaSkevlo #define	DRV_ASPM_SPD1000LMT_1M		0x00000020
85203ae04aaSkevlo #define	DRV_ASPM_SPD1000LMT_10M		0x00000030
85303ae04aaSkevlo #define	DRV_ASPM_SPD1000LMT_MASK	0x00000000
85403ae04aaSkevlo #define	DRV_WOLCAP_BIOS_EN		0x00000100
85503ae04aaSkevlo #define	DRV_WOLMAGIC_EN			0x00000200
85603ae04aaSkevlo #define	DRV_WOLLINKUP_EN		0x00000400
85703ae04aaSkevlo #define	DRV_WOLPATTERN_EN		0x00000800
85803ae04aaSkevlo #define	DRV_AZ_EN			0x00001000
85903ae04aaSkevlo #define	DRV_WOLS5_BIOS_EN		0x00010000
86003ae04aaSkevlo #define	DRV_WOLS5_EN			0x00020000
86103ae04aaSkevlo #define	DRV_DISABLE			0x00040000
86203ae04aaSkevlo #define	DRV_PHY_MASK			0x1FE00000
86303ae04aaSkevlo #define	DRV_PHY_EEE			0x00200000
86403ae04aaSkevlo #define	DRV_PHY_APAUSE			0x00400000
86503ae04aaSkevlo #define	DRV_PHY_PAUSE			0x00800000
86603ae04aaSkevlo #define	DRV_PHY_DUPLEX			0x01000000
86703ae04aaSkevlo #define	DRV_PHY_10			0x02000000
86803ae04aaSkevlo #define	DRV_PHY_100			0x04000000
86903ae04aaSkevlo #define	DRV_PHY_1000			0x08000000
87003ae04aaSkevlo #define	DRV_PHY_AUTO			0x10000000
87103ae04aaSkevlo #define	DRV_PHY_SHIFT			21
87203ae04aaSkevlo 
87314ef3578Ssthen #define	ALC_CLK_GATING_CFG		0x1814
87414ef3578Ssthen #define	CLK_GATING_DMAW_ENB		0x0001
87514ef3578Ssthen #define	CLK_GATING_DMAR_ENB		0x0002
87614ef3578Ssthen #define	CLK_GATING_TXQ_ENB		0x0004
87714ef3578Ssthen #define	CLK_GATING_RXQ_ENB		0x0008
87814ef3578Ssthen #define	CLK_GATING_TXMAC_ENB		0x0010
87914ef3578Ssthen #define	CLK_GATING_RXMAC_ENB		0x0020
88014ef3578Ssthen 
8811c0ec257Skevlo #define	ALC_DEBUG_DATA0			0x1900
8821c0ec257Skevlo 
8831c0ec257Skevlo #define	ALC_DEBUG_DATA1			0x1904
8841c0ec257Skevlo 
88503ae04aaSkevlo #define	ALC_MSI_RETRANS_TIMER		0x1920
88603ae04aaSkevlo #define	MSI_RETRANS_TIMER_MASK		0x0000FFFF
88703ae04aaSkevlo #define	MSI_RETRANS_MASK_SEL_STD	0x00000000
88803ae04aaSkevlo #define	MSI_RETRANS_MASK_SEL_LINE	0x00010000
88903ae04aaSkevlo #define	MSI_RETRANS_TIMER_SHIFT		0
89003ae04aaSkevlo 
89103ae04aaSkevlo #define	ALC_WRR				0x1938
89203ae04aaSkevlo #define	WRR_PRI0_MASK			0x0000001F
89303ae04aaSkevlo #define	WRR_PRI1_MASK			0x00001F00
89403ae04aaSkevlo #define	WRR_PRI2_MASK			0x001F0000
89503ae04aaSkevlo #define	WRR_PRI3_MASK			0x1F000000
89603ae04aaSkevlo #define	WRR_PRI_RESTRICT_MASK		0x60000000
89703ae04aaSkevlo #define	WRR_PRI_RESTRICT_ALL		0x00000000
89803ae04aaSkevlo #define	WRR_PRI_RESTRICT_HI		0x20000000
89903ae04aaSkevlo #define	WRR_PRI_RESTRICT_HI2		0x40000000
90003ae04aaSkevlo #define	WRR_PRI_RESTRICT_NONE		0x60000000
90103ae04aaSkevlo #define	WRR_PRI0_SHIFT			0
90203ae04aaSkevlo #define	WRR_PRI1_SHIFT			8
90303ae04aaSkevlo #define	WRR_PRI2_SHIFT			16
90403ae04aaSkevlo #define	WRR_PRI3_SHIFT			24
90503ae04aaSkevlo #define	WRR_PRI_DEFAULT			4
90603ae04aaSkevlo #define	WRR_PRI_RESTRICT_SHIFT		29
90703ae04aaSkevlo 
90803ae04aaSkevlo #define	ALC_HQTD_CFG			0x193C
90903ae04aaSkevlo #define	HQTD_CFG_Q1_BURST_MASK		0x0000000F
91003ae04aaSkevlo #define	HQTD_CFG_Q2_BURST_MASK		0x000000F0
91103ae04aaSkevlo #define	HQTD_CFG_Q3_BURST_MASK		0x00000F00
91203ae04aaSkevlo #define	HQTD_CFG_BURST_ENB		0x80000000
91303ae04aaSkevlo #define	HQTD_CFG_Q1_BURST_SHIFT		0
91403ae04aaSkevlo #define	HQTD_CFG_Q2_BURST_SHIFT		4
91503ae04aaSkevlo #define	HQTD_CFG_Q3_BURST_SHIFT		8
91603ae04aaSkevlo 
91703ae04aaSkevlo #define	ALC_MISC			0x19C0
91803ae04aaSkevlo #define	MISC_INTNLOSC_OPEN		0x00000008
91903ae04aaSkevlo #define	MISC_ISO_ENB			0x00001000
92003ae04aaSkevlo #define	MISC_PSW_OCP_MASK		0x00E00000
92103ae04aaSkevlo #define	MISC_PSW_OCP_SHIFT		21
92203ae04aaSkevlo #define	MISC_PSW_OCP_DEFAULT		7
92303ae04aaSkevlo 
92403ae04aaSkevlo #define	ALC_MISC2			0x19C8
92503ae04aaSkevlo #define	MISC2_CALB_START		0x00000001
92603ae04aaSkevlo 
92703ae04aaSkevlo #define	ALC_MISC3			0x19CC
92803ae04aaSkevlo #define	MISC3_25M_NOTO_INTNL		0x00000001
92903ae04aaSkevlo #define	MISC3_25M_BY_SW			0x00000002
93003ae04aaSkevlo 
9311c0ec257Skevlo #define	ALC_MII_DBG_ADDR		0x1D
9321c0ec257Skevlo #define	ALC_MII_DBG_DATA		0x1E
9331c0ec257Skevlo 
9341c0ec257Skevlo #define	MII_ANA_CFG0			0x00
9351c0ec257Skevlo #define	ANA_RESTART_CAL			0x0001
9361c0ec257Skevlo #define	ANA_MANUL_SWICH_ON_MASK		0x001E
9371c0ec257Skevlo #define	ANA_MAN_ENABLE			0x0020
9381c0ec257Skevlo #define	ANA_SEL_HSP			0x0040
9391c0ec257Skevlo #define	ANA_EN_HB			0x0080
9401c0ec257Skevlo #define	ANA_EN_HBIAS			0x0100
9411c0ec257Skevlo #define	ANA_OEN_125M			0x0200
9421c0ec257Skevlo #define	ANA_EN_LCKDT			0x0400
9431c0ec257Skevlo #define	ANA_LCKDT_PHY			0x0800
9441c0ec257Skevlo #define	ANA_AFE_MODE			0x1000
9451c0ec257Skevlo #define	ANA_VCO_SLOW			0x2000
9461c0ec257Skevlo #define	ANA_VCO_FAST			0x4000
9471c0ec257Skevlo #define	ANA_SEL_CLK125M_DSP		0x8000
9481c0ec257Skevlo #define	ANA_MANUL_SWICH_ON_SHIFT	1
9491c0ec257Skevlo 
95003ae04aaSkevlo #define	MII_DBG_ANACTL			0x00
95103ae04aaSkevlo #define	DBG_ANACTL_DEFAULT		0x02EF
95203ae04aaSkevlo 
9531c0ec257Skevlo #define	MII_ANA_CFG4			0x04
9541c0ec257Skevlo #define	ANA_IECHO_ADJ_MASK		0x0F
9551c0ec257Skevlo #define	ANA_IECHO_ADJ_3_MASK		0x000F
9561c0ec257Skevlo #define	ANA_IECHO_ADJ_2_MASK		0x00F0
9571c0ec257Skevlo #define	ANA_IECHO_ADJ_1_MASK		0x0F00
9581c0ec257Skevlo #define	ANA_IECHO_ADJ_0_MASK		0xF000
9591c0ec257Skevlo #define	ANA_IECHO_ADJ_3_SHIFT		0
9601c0ec257Skevlo #define	ANA_IECHO_ADJ_2_SHIFT		4
9611c0ec257Skevlo #define	ANA_IECHO_ADJ_1_SHIFT		8
9621c0ec257Skevlo #define	ANA_IECHO_ADJ_0_SHIFT		12
9631c0ec257Skevlo 
96403ae04aaSkevlo #define	MII_DBG_SYSMODCTL		0x04
96503ae04aaSkevlo #define	DBG_SYSMODCTL_DEFAULT		0xBB8B
96603ae04aaSkevlo 
9671c0ec257Skevlo #define	MII_ANA_CFG5			0x05
9681c0ec257Skevlo #define	ANA_SERDES_CDR_BW_MASK		0x0003
9691c0ec257Skevlo #define	ANA_MS_PAD_DBG			0x0004
9701c0ec257Skevlo #define	ANA_SPEEDUP_DBG			0x0008
9711c0ec257Skevlo #define	ANA_SERDES_TH_LOS_MASK		0x0030
9721c0ec257Skevlo #define	ANA_SERDES_EN_DEEM		0x0040
9731c0ec257Skevlo #define	ANA_SERDES_TXELECIDLE		0x0080
9741c0ec257Skevlo #define	ANA_SERDES_BEACON		0x0100
9751c0ec257Skevlo #define	ANA_SERDES_HALFTXDR		0x0200
9761c0ec257Skevlo #define	ANA_SERDES_SEL_HSP		0x0400
9771c0ec257Skevlo #define	ANA_SERDES_EN_PLL		0x0800
9781c0ec257Skevlo #define	ANA_SERDES_EN			0x1000
9791c0ec257Skevlo #define	ANA_SERDES_EN_LCKDT		0x2000
9801c0ec257Skevlo #define	ANA_SERDES_CDR_BW_SHIFT		0
9811c0ec257Skevlo #define	ANA_SERDES_TH_LOS_SHIFT		4
9821c0ec257Skevlo 
98303ae04aaSkevlo #define	MII_DBG_SRDSYSMOD		0x05
98403ae04aaSkevlo #define	DBG_SRDSYSMOD_DEFAULT		0x2C46
98503ae04aaSkevlo 
9861c0ec257Skevlo #define	MII_ANA_CFG11			0x0B
9871c0ec257Skevlo #define	ANA_PS_HIB_EN			0x8000
9881c0ec257Skevlo 
98903ae04aaSkevlo #define	MII_DBG_HIBNEG			0x0B
99003ae04aaSkevlo #define	DBG_HIBNEG_HIB_PULSE		0x1000
99103ae04aaSkevlo #define	DBG_HIBNEG_PSHIB_EN		0x8000
99203ae04aaSkevlo #define	DBG_HIBNEG_DEFAULT		0xBC40
99303ae04aaSkevlo 
9941c0ec257Skevlo #define	MII_ANA_CFG18			0x12
9951c0ec257Skevlo #define	ANA_TEST_MODE_10BT_01MASK	0x0003
9961c0ec257Skevlo #define	ANA_LOOP_SEL_10BT		0x0004
9971c0ec257Skevlo #define	ANA_RGMII_MODE_SW		0x0008
9981c0ec257Skevlo #define	ANA_EN_LONGECABLE		0x0010
9991c0ec257Skevlo #define	ANA_TEST_MODE_10BT_2		0x0020
10001c0ec257Skevlo #define	ANA_EN_10BT_IDLE		0x0400
10011c0ec257Skevlo #define	ANA_EN_MASK_TB			0x0800
10021c0ec257Skevlo #define	ANA_TRIGGER_SEL_TIMER_MASK	0x3000
10031c0ec257Skevlo #define	ANA_INTERVAL_SEL_TIMER_MASK	0xC000
10041c0ec257Skevlo #define	ANA_TEST_MODE_10BT_01SHIFT	0
10051c0ec257Skevlo #define	ANA_TRIGGER_SEL_TIMER_SHIFT	12
10061c0ec257Skevlo #define	ANA_INTERVAL_SEL_TIMER_SHIFT	14
10071c0ec257Skevlo 
100803ae04aaSkevlo #define	MII_DBG_TST10BTCFG		0x12
100903ae04aaSkevlo #define	DBG_TST10BTCFG_DEFAULT		0x4C04
101003ae04aaSkevlo 
101103ae04aaSkevlo #define	MII_DBG_AZ_ANADECT		0x15
101203ae04aaSkevlo #define	DBG_AZ_ANADECT_DEFAULT		0x3220
101303ae04aaSkevlo #define	DBG_AZ_ANADECT_LONG		0x3210
101403ae04aaSkevlo 
101503ae04aaSkevlo #define	MII_DBG_MSE16DB			0x18
101603ae04aaSkevlo #define	DBG_MSE16DB_UP			0x05EA
101703ae04aaSkevlo #define	DBG_MSE16DB_DOWN		0x02EA
101803ae04aaSkevlo 
101903ae04aaSkevlo #define	MII_DBG_MSE20DB			0x1C
102003ae04aaSkevlo #define	DBG_MSE20DB_TH_MASK		0x01FC
102103ae04aaSkevlo #define	DBG_MSE20DB_TH_DEFAULT		0x2E
102203ae04aaSkevlo #define	DBG_MSE20DB_TH_HI		0x54
102303ae04aaSkevlo #define	DBG_MSE20DB_TH_SHIFT		2
102403ae04aaSkevlo 
102503ae04aaSkevlo #define	MII_DBG_AGC			0x23
102603ae04aaSkevlo #define	DBG_AGC_2_VGA_MASK		0x3F00
102703ae04aaSkevlo #define	DBG_AGC_2_VGA_SHIFT		8
102803ae04aaSkevlo #define	DBG_AGC_LONG1G_LIMT		40
102903ae04aaSkevlo #define	DBG_AGC_LONG100M_LIMT		44
103003ae04aaSkevlo 
10311c0ec257Skevlo #define	MII_ANA_CFG41			0x29
10321c0ec257Skevlo #define	ANA_TOP_PS_EN			0x8000
10331c0ec257Skevlo 
103403ae04aaSkevlo #define	MII_DBG_LEGCYPS			0x29
103503ae04aaSkevlo #define	DBG_LEGCYPS_ENB			0x8000
103603ae04aaSkevlo #define	DBG_LEGCYPS_DEFAULT		0x129D
103703ae04aaSkevlo 
10381c0ec257Skevlo #define	MII_ANA_CFG54			0x36
10391c0ec257Skevlo #define	ANA_LONG_CABLE_TH_100_MASK	0x003F
10401c0ec257Skevlo #define	ANA_DESERVED			0x0040
10411c0ec257Skevlo #define	ANA_EN_LIT_CH			0x0080
10421c0ec257Skevlo #define	ANA_SHORT_CABLE_TH_100_MASK	0x3F00
10431c0ec257Skevlo #define	ANA_BP_BAD_LINK_ACCUM		0x4000
10441c0ec257Skevlo #define	ANA_BP_SMALL_BW			0x8000
10451c0ec257Skevlo #define	ANA_LONG_CABLE_TH_100_SHIFT	0
10461c0ec257Skevlo #define	ANA_SHORT_CABLE_TH_100_SHIFT	8
10471c0ec257Skevlo 
104803ae04aaSkevlo #define	MII_DBG_TST100BTCFG		0x36
104903ae04aaSkevlo #define	DBG_TST100BTCFG_DEFAULT		0xE12C
105003ae04aaSkevlo 
105103ae04aaSkevlo #define	MII_DBG_GREENCFG		0x3B
105203ae04aaSkevlo #define	DBG_GREENCFG_DEFAULT		0x7078
105303ae04aaSkevlo 
105403ae04aaSkevlo #define	MII_DBG_GREENCFG2		0x3D
105503ae04aaSkevlo #define	DBG_GREENCFG2_GATE_DFSE_EN	0x0080
105603ae04aaSkevlo #define	DBG_GREENCFG2_BP_GREEN		0x8000
105703ae04aaSkevlo 
105803ae04aaSkevlo /* Device addr 3 */
105903ae04aaSkevlo #define	MII_EXT_PCS			3
106003ae04aaSkevlo 
106103ae04aaSkevlo #define	MII_EXT_CLDCTL3			0x8003
106203ae04aaSkevlo #define	EXT_CLDCTL3_BP_CABLE1TH_DET_GT	0x8000
106303ae04aaSkevlo 
106403ae04aaSkevlo #define	MII_EXT_CLDCTL5			0x8005
106503ae04aaSkevlo #define	EXT_CLDCTL5_BP_VD_HLFBIAS	0x4000
106603ae04aaSkevlo 
106703ae04aaSkevlo #define	MII_EXT_CLDCTL6			0x8006
106803ae04aaSkevlo #define	EXT_CLDCTL6_CAB_LEN_MASK	0x00FF
106903ae04aaSkevlo #define	EXT_CLDCTL6_CAB_LEN_SHIFT	0
107003ae04aaSkevlo #define	EXT_CLDCTL6_CAB_LEN_SHORT1G	116
107103ae04aaSkevlo #define	EXT_CLDCTL6_CAB_LEN_SHORT100M	152
107203ae04aaSkevlo 
107303ae04aaSkevlo #define	MII_EXT_VDRVBIAS		0x8062
107403ae04aaSkevlo #define	EXT_VDRVBIAS_DEFAULT		3
107503ae04aaSkevlo 
107603ae04aaSkevlo /* Device addr 7 */
107703ae04aaSkevlo #define	MII_EXT_ANEG			7
107803ae04aaSkevlo 
107903ae04aaSkevlo #define	MII_EXT_ANEG_LOCAL_EEEADV	0x3C
108003ae04aaSkevlo #define	ANEG_LOCA_EEEADV_100BT		0x0002
108103ae04aaSkevlo #define	ANEG_LOCA_EEEADV_1000BT		0x0004
108203ae04aaSkevlo 
108303ae04aaSkevlo #define	MII_EXT_ANEG_AFE		0x801A
108403ae04aaSkevlo #define	ANEG_AFEE_10BT_100M_TH		0x0040
108503ae04aaSkevlo 
108603ae04aaSkevlo #define	MII_EXT_ANEG_S3DIG10		0x8023
108703ae04aaSkevlo #define	ANEG_S3DIG10_SL			0x0001
108803ae04aaSkevlo #define	ANEG_S3DIG10_DEFAULT		0
108903ae04aaSkevlo 
109003ae04aaSkevlo #define	MII_EXT_ANEG_NLP78		0x8027
109103ae04aaSkevlo #define	ANEG_NLP78_120M_DEFAULT		0x8A05
109203ae04aaSkevlo 
10931c0ec257Skevlo /* Statistics counters collected by the MAC. */
10941c0ec257Skevlo struct smb {
10951c0ec257Skevlo 	/* Rx stats. */
10961c0ec257Skevlo 	uint32_t rx_frames;
10971c0ec257Skevlo 	uint32_t rx_bcast_frames;
10981c0ec257Skevlo 	uint32_t rx_mcast_frames;
10991c0ec257Skevlo 	uint32_t rx_pause_frames;
11001c0ec257Skevlo 	uint32_t rx_control_frames;
11011c0ec257Skevlo 	uint32_t rx_crcerrs;
11021c0ec257Skevlo 	uint32_t rx_lenerrs;
11031c0ec257Skevlo 	uint32_t rx_bytes;
11041c0ec257Skevlo 	uint32_t rx_runts;
11051c0ec257Skevlo 	uint32_t rx_fragments;
11061c0ec257Skevlo 	uint32_t rx_pkts_64;
11071c0ec257Skevlo 	uint32_t rx_pkts_65_127;
11081c0ec257Skevlo 	uint32_t rx_pkts_128_255;
11091c0ec257Skevlo 	uint32_t rx_pkts_256_511;
11101c0ec257Skevlo 	uint32_t rx_pkts_512_1023;
11111c0ec257Skevlo 	uint32_t rx_pkts_1024_1518;
11121c0ec257Skevlo 	uint32_t rx_pkts_1519_max;
11131c0ec257Skevlo 	uint32_t rx_pkts_truncated;
11141c0ec257Skevlo 	uint32_t rx_fifo_oflows;
11151c0ec257Skevlo 	uint32_t rx_rrs_errs;
11161c0ec257Skevlo 	uint32_t rx_alignerrs;
11171c0ec257Skevlo 	uint32_t rx_bcast_bytes;
11181c0ec257Skevlo 	uint32_t rx_mcast_bytes;
11191c0ec257Skevlo 	uint32_t rx_pkts_filtered;
11201c0ec257Skevlo 	/* Tx stats. */
11211c0ec257Skevlo 	uint32_t tx_frames;
11221c0ec257Skevlo 	uint32_t tx_bcast_frames;
11231c0ec257Skevlo 	uint32_t tx_mcast_frames;
11241c0ec257Skevlo 	uint32_t tx_pause_frames;
11251c0ec257Skevlo 	uint32_t tx_excess_defer;
11261c0ec257Skevlo 	uint32_t tx_control_frames;
11271c0ec257Skevlo 	uint32_t tx_deferred;
11281c0ec257Skevlo 	uint32_t tx_bytes;
11291c0ec257Skevlo 	uint32_t tx_pkts_64;
11301c0ec257Skevlo 	uint32_t tx_pkts_65_127;
11311c0ec257Skevlo 	uint32_t tx_pkts_128_255;
11321c0ec257Skevlo 	uint32_t tx_pkts_256_511;
11331c0ec257Skevlo 	uint32_t tx_pkts_512_1023;
11341c0ec257Skevlo 	uint32_t tx_pkts_1024_1518;
11351c0ec257Skevlo 	uint32_t tx_pkts_1519_max;
11361c0ec257Skevlo 	uint32_t tx_single_colls;
11371c0ec257Skevlo 	uint32_t tx_multi_colls;
11381c0ec257Skevlo 	uint32_t tx_late_colls;
11391c0ec257Skevlo 	uint32_t tx_excess_colls;
11401c0ec257Skevlo 	uint32_t tx_underrun;
11411c0ec257Skevlo 	uint32_t tx_desc_underrun;
11421c0ec257Skevlo 	uint32_t tx_lenerrs;
11431c0ec257Skevlo 	uint32_t tx_pkts_truncated;
11441c0ec257Skevlo 	uint32_t tx_bcast_bytes;
11451c0ec257Skevlo 	uint32_t tx_mcast_bytes;
11461c0ec257Skevlo 	uint32_t updated;
11471c0ec257Skevlo };
11481c0ec257Skevlo 
1149*4b1a56afSjsg /* CMB (Coalescing Message Block) */
11501c0ec257Skevlo struct cmb {
11511c0ec257Skevlo 	uint32_t cons;
11521c0ec257Skevlo };
11531c0ec257Skevlo 
11541c0ec257Skevlo /* Rx free descriptor */
11551c0ec257Skevlo struct rx_desc {
11561c0ec257Skevlo 	uint64_t addr;
11571c0ec257Skevlo };
11581c0ec257Skevlo 
11591c0ec257Skevlo /* Rx return descriptor */
11601c0ec257Skevlo struct rx_rdesc {
11611c0ec257Skevlo 	uint32_t rdinfo;
11621c0ec257Skevlo #define	RRD_CSUM_MASK			0x0000FFFF
11631c0ec257Skevlo #define	RRD_RD_CNT_MASK			0x000F0000
11641c0ec257Skevlo #define	RRD_RD_IDX_MASK			0xFFF00000
11651c0ec257Skevlo #define	RRD_CSUM_SHIFT			0
11661c0ec257Skevlo #define	RRD_RD_CNT_SHIFT		16
11671c0ec257Skevlo #define	RRD_RD_IDX_SHIFT		20
11681c0ec257Skevlo #define	RRD_CSUM(x)			\
11691c0ec257Skevlo 	(((x) & RRD_CSUM_MASK) >> RRD_CSUM_SHIFT)
11701c0ec257Skevlo #define	RRD_RD_CNT(x)			\
11711c0ec257Skevlo 	(((x) & RRD_RD_CNT_MASK) >> RRD_RD_CNT_SHIFT)
11721c0ec257Skevlo #define	RRD_RD_IDX(x)			\
11731c0ec257Skevlo 	(((x) & RRD_RD_IDX_MASK) >> RRD_RD_IDX_SHIFT)
11741c0ec257Skevlo 	uint32_t rss;
11751c0ec257Skevlo 	uint32_t vtag;
11761c0ec257Skevlo #define	RRD_VLAN_MASK			0x0000FFFF
11771c0ec257Skevlo #define	RRD_HEAD_LEN_MASK		0x00FF0000
11781c0ec257Skevlo #define	RRD_HDS_MASK			0x03000000
11791c0ec257Skevlo #define	RRD_HDS_NONE			0x00000000
11801c0ec257Skevlo #define	RRD_HDS_HEAD			0x01000000
11811c0ec257Skevlo #define	RRD_HDS_DATA			0x02000000
11821c0ec257Skevlo #define	RRD_CPU_MASK			0x0C000000
11831c0ec257Skevlo #define	RRD_HASH_FLAG_MASK		0xF0000000
11841c0ec257Skevlo #define	RRD_VLAN_SHIFT			0
11851c0ec257Skevlo #define	RRD_HEAD_LEN_SHIFT		16
11861c0ec257Skevlo #define	RRD_HDS_SHIFT			24
11871c0ec257Skevlo #define	RRD_CPU_SHIFT			26
11881c0ec257Skevlo #define	RRD_HASH_FLAG_SHIFT		28
11891c0ec257Skevlo #define	RRD_VLAN(x)			\
11901c0ec257Skevlo 	(((x) & RRD_VLAN_MASK) >> RRD_VLAN_SHIFT)
11911c0ec257Skevlo #define	RRD_HEAD_LEN(x)			\
11921c0ec257Skevlo 	(((x) & RRD_HEAD_LEN_MASK) >> RRD_HEAD_LEN_SHIFT)
11931c0ec257Skevlo #define	RRD_CPU(x)			\
11941c0ec257Skevlo 	(((x) & RRD_CPU_MASK) >> RRD_CPU_SHIFT)
11951c0ec257Skevlo 	uint32_t status;
11961c0ec257Skevlo #define	RRD_LEN_MASK			0x00003FFF
11971c0ec257Skevlo #define	RRD_LEN_SHIFT			0
11981c0ec257Skevlo #define	RRD_TCP_UDPCSUM_NOK		0x00004000
11991c0ec257Skevlo #define	RRD_IPCSUM_NOK			0x00008000
12001c0ec257Skevlo #define	RRD_VLAN_TAG			0x00010000
12011c0ec257Skevlo #define	RRD_PROTO_MASK			0x000E0000
12021c0ec257Skevlo #define	RRD_PROTO_IPV4			0x00020000
12031c0ec257Skevlo #define	RRD_PROTO_IPV6			0x000C0000
12041c0ec257Skevlo #define	RRD_ERR_SUM			0x00100000
12051c0ec257Skevlo #define	RRD_ERR_CRC			0x00200000
12061c0ec257Skevlo #define	RRD_ERR_ALIGN			0x00400000
12071c0ec257Skevlo #define	RRD_ERR_TRUNC			0x00800000
12081c0ec257Skevlo #define	RRD_ERR_RUNT			0x01000000
12091c0ec257Skevlo #define	RRD_ERR_ICMP			0x02000000
12101c0ec257Skevlo #define	RRD_BCAST			0x04000000
12111c0ec257Skevlo #define	RRD_MCAST			0x08000000
12121c0ec257Skevlo #define	RRD_SNAP_LLC			0x10000000
12131c0ec257Skevlo #define	RRD_ETHER			0x00000000
12141c0ec257Skevlo #define	RRD_FIFO_FULL			0x20000000
12151c0ec257Skevlo #define	RRD_ERR_LENGTH			0x40000000
12161c0ec257Skevlo #define	RRD_VALID			0x80000000
12171c0ec257Skevlo #define	RRD_BYTES(x)			\
12181c0ec257Skevlo 	(((x) & RRD_LEN_MASK) >> RRD_LEN_SHIFT)
12191c0ec257Skevlo #define	RRD_IPV4(x)			\
12201c0ec257Skevlo 	(((x) & RRD_PROTO_MASK) == RRD_PROTO_IPV4)
12211c0ec257Skevlo };
12221c0ec257Skevlo 
12231c0ec257Skevlo /* Tx descriptor */
12241c0ec257Skevlo struct tx_desc {
12251c0ec257Skevlo 	uint32_t len;
12261c0ec257Skevlo #define	TD_BUFLEN_MASK			0x00003FFF
12271c0ec257Skevlo #define	TD_VLAN_MASK			0xFFFF0000
12281c0ec257Skevlo #define	TD_BUFLEN_SHIFT			0
12291c0ec257Skevlo #define	TX_BYTES(x)			\
12301c0ec257Skevlo 	(((x) << TD_BUFLEN_SHIFT) & TD_BUFLEN_MASK)
12311c0ec257Skevlo #define	TD_VLAN_SHIFT			16
12321c0ec257Skevlo 	uint32_t flags;
12331c0ec257Skevlo #define	TD_L4HDR_OFFSET_MASK		0x000000FF	/* byte unit */
12341c0ec257Skevlo #define	TD_TCPHDR_OFFSET_MASK		0x000000FF	/* byte unit */
12351c0ec257Skevlo #define	TD_PLOAD_OFFSET_MASK		0x000000FF	/* 2 bytes unit */
12361c0ec257Skevlo #define	TD_CUSTOM_CSUM			0x00000100
12371c0ec257Skevlo #define	TD_IPCSUM			0x00000200
12381c0ec257Skevlo #define	TD_TCPCSUM			0x00000400
12391c0ec257Skevlo #define	TD_UDPCSUM			0x00000800
12401c0ec257Skevlo #define	TD_TSO				0x00001000
12411c0ec257Skevlo #define	TD_TSO_DESCV1			0x00000000
12421c0ec257Skevlo #define	TD_TSO_DESCV2			0x00002000
12431c0ec257Skevlo #define	TD_CON_VLAN_TAG			0x00004000
12441c0ec257Skevlo #define	TD_INS_VLAN_TAG			0x00008000
12451c0ec257Skevlo #define	TD_IPV4_DESCV2			0x00010000
12461c0ec257Skevlo #define	TD_LLC_SNAP			0x00020000
12471c0ec257Skevlo #define	TD_ETHERNET			0x00000000
12481c0ec257Skevlo #define	TD_CUSTOM_CSUM_OFFSET_MASK	0x03FC0000	/* 2 bytes unit */
12491c0ec257Skevlo #define	TD_CUSTOM_CSUM_EVEN_PAD		0x40000000
12501c0ec257Skevlo #define	TD_MSS_MASK			0x7FFC0000
12511c0ec257Skevlo #define	TD_EOP				0x80000000
12521c0ec257Skevlo #define	TD_L4HDR_OFFSET_SHIFT		0
12531c0ec257Skevlo #define	TD_TCPHDR_OFFSET_SHIFT		0
12541c0ec257Skevlo #define	TD_PLOAD_OFFSET_SHIFT		0
12551c0ec257Skevlo #define	TD_CUSTOM_CSUM_OFFSET_SHIFT	18
12561c0ec257Skevlo #define	TD_MSS_SHIFT			18
12571c0ec257Skevlo 	uint64_t addr;
12581c0ec257Skevlo };
12591c0ec257Skevlo 
12601c0ec257Skevlo #define	ALC_TX_RING_CNT		256
12611c0ec257Skevlo #define	ALC_TX_RING_ALIGN	sizeof(struct tx_desc)
12621c0ec257Skevlo #define	ALC_RX_RING_CNT		256
12631c0ec257Skevlo #define	ALC_RX_RING_ALIGN	sizeof(struct rx_desc)
12641c0ec257Skevlo #define	ALC_RX_BUF_ALIGN	4
12651c0ec257Skevlo #define	ALC_RR_RING_CNT		ALC_RX_RING_CNT
12661c0ec257Skevlo #define	ALC_RR_RING_ALIGN	sizeof(struct rx_rdesc)
12671c0ec257Skevlo #define	ALC_CMB_ALIGN		8
12681c0ec257Skevlo #define	ALC_SMB_ALIGN		8
12691c0ec257Skevlo 
12701c0ec257Skevlo #define	ALC_TSO_MAXSEGSIZE	4096
12711c0ec257Skevlo #define	ALC_TSO_MAXSIZE		(65535 + sizeof(struct ether_vlan_header))
12721c0ec257Skevlo #define	ALC_MAXTXSEGS		32
12731c0ec257Skevlo 
12741c0ec257Skevlo #define	ALC_ADDR_LO(x)		((uint64_t) (x) & 0xFFFFFFFF)
12751c0ec257Skevlo #define	ALC_ADDR_HI(x)		((uint64_t) (x) >> 32)
12761c0ec257Skevlo 
12771c0ec257Skevlo #define	ALC_DESC_INC(x, y)	((x) = ((x) + 1) % (y))
12781c0ec257Skevlo 
12791c0ec257Skevlo /* Water mark to kick reclaiming Tx buffers. */
12801c0ec257Skevlo #define	ALC_TX_DESC_HIWAT	((ALC_TX_RING_CNT * 6) / 10)
128103ae04aaSkevlo /*
128203ae04aaSkevlo  * AR816x controllers support up to 16 messages but this driver
128303ae04aaSkevlo  * uses single message.
128403ae04aaSkevlo  */
12851c0ec257Skevlo #define	ALC_MSI_MESSAGES	1
12861c0ec257Skevlo #define	ALC_MSIX_MESSAGES	1
12871c0ec257Skevlo 
12881c0ec257Skevlo #define	ALC_TX_RING_SZ		\
12891c0ec257Skevlo 	(sizeof(struct tx_desc) * ALC_TX_RING_CNT)
12901c0ec257Skevlo #define	ALC_RX_RING_SZ		\
12911c0ec257Skevlo 	(sizeof(struct rx_desc) * ALC_RX_RING_CNT)
12921c0ec257Skevlo #define	ALC_RR_RING_SZ		\
12931c0ec257Skevlo 	(sizeof(struct rx_rdesc) * ALC_RR_RING_CNT)
12941c0ec257Skevlo #define	ALC_CMB_SZ		(sizeof(struct cmb))
12951c0ec257Skevlo #define	ALC_SMB_SZ		(sizeof(struct smb))
12961c0ec257Skevlo 
12971c0ec257Skevlo #define	ALC_PROC_MIN		16
12981c0ec257Skevlo #define	ALC_PROC_MAX		(ALC_RX_RING_CNT - 1)
12991c0ec257Skevlo #define	ALC_PROC_DEFAULT	(ALC_RX_RING_CNT / 4)
13001c0ec257Skevlo 
13011c0ec257Skevlo /*
13027c754066Skevlo  * The number of bits reserved for MSS in AR813x/AR815x controllers
13031c0ec257Skevlo  * are 13 bits. This limits the maximum interface MTU size in TSO
13041c0ec257Skevlo  * case(8191 + sizeof(struct ip) + sizeof(struct tcphdr)) as upper
13051c0ec257Skevlo  * stack should not generate TCP segments with MSS greater than the
13061c0ec257Skevlo  * limit. Also Atheros says that maximum MTU for TSO is 6KB.
13071c0ec257Skevlo  */
13081c0ec257Skevlo #define	ALC_TSO_MTU		(6 * 1024)
13091c0ec257Skevlo 
13101c0ec257Skevlo struct alc_rxdesc {
13111c0ec257Skevlo 	struct mbuf		*rx_m;
13121c0ec257Skevlo 	bus_dmamap_t		rx_dmamap;
13131c0ec257Skevlo 	struct rx_desc		*rx_desc;
13141c0ec257Skevlo };
13151c0ec257Skevlo 
13161c0ec257Skevlo struct alc_txdesc {
13171c0ec257Skevlo 	struct mbuf		*tx_m;
13181c0ec257Skevlo 	bus_dmamap_t		tx_dmamap;
13191c0ec257Skevlo };
13201c0ec257Skevlo 
13211c0ec257Skevlo struct alc_ring_data {
13221c0ec257Skevlo 	struct tx_desc		*alc_tx_ring;
13231c0ec257Skevlo 	bus_dma_segment_t	alc_tx_ring_seg;
13241c0ec257Skevlo 	bus_addr_t		alc_tx_ring_paddr;
13251c0ec257Skevlo 	struct rx_desc		*alc_rx_ring;
13261c0ec257Skevlo 	bus_dma_segment_t	alc_rx_ring_seg;
13271c0ec257Skevlo 	bus_addr_t		alc_rx_ring_paddr;
13281c0ec257Skevlo 	struct rx_rdesc		*alc_rr_ring;
13291c0ec257Skevlo 	bus_dma_segment_t	alc_rr_ring_seg;
13301c0ec257Skevlo 	bus_addr_t		alc_rr_ring_paddr;
13311c0ec257Skevlo 	struct cmb		*alc_cmb;
13321c0ec257Skevlo 	bus_dma_segment_t	alc_cmb_seg;
13331c0ec257Skevlo 	bus_addr_t		alc_cmb_paddr;
13341c0ec257Skevlo 	struct smb		*alc_smb;
13351c0ec257Skevlo 	bus_dma_segment_t	alc_smb_seg;
13361c0ec257Skevlo 	bus_addr_t		alc_smb_paddr;
13371c0ec257Skevlo };
13381c0ec257Skevlo 
13391c0ec257Skevlo struct alc_chain_data {
13401c0ec257Skevlo 	struct alc_txdesc	alc_txdesc[ALC_TX_RING_CNT];
13411c0ec257Skevlo 	struct alc_rxdesc	alc_rxdesc[ALC_RX_RING_CNT];
13421c0ec257Skevlo 	bus_dmamap_t		alc_tx_ring_map;
13431c0ec257Skevlo 	bus_dma_segment_t	alc_tx_ring_seg;
13441c0ec257Skevlo 	bus_dmamap_t		alc_rx_ring_map;
13451c0ec257Skevlo 	bus_dma_segment_t	alc_rx_ring_seg;
13461c0ec257Skevlo 	bus_dmamap_t		alc_rr_ring_map;
13471c0ec257Skevlo 	bus_dma_segment_t	alc_rr_ring_seg;
13481c0ec257Skevlo 	bus_dmamap_t		alc_rx_sparemap;
13491c0ec257Skevlo 	bus_dmamap_t		alc_cmb_map;
13501c0ec257Skevlo 	bus_dma_segment_t	alc_cmb_seg;
13511c0ec257Skevlo 	bus_dmamap_t		alc_smb_map;
13521c0ec257Skevlo 	bus_dma_segment_t	alc_smb_seg;
13531c0ec257Skevlo 
13541c0ec257Skevlo 	int			alc_tx_prod;
13551c0ec257Skevlo 	int			alc_tx_cons;
13561c0ec257Skevlo 	int			alc_tx_cnt;
13571c0ec257Skevlo 	int			alc_rx_cons;
13581c0ec257Skevlo 	int			alc_rr_cons;
13591c0ec257Skevlo 	int			alc_rxlen;
13601c0ec257Skevlo 
13611c0ec257Skevlo 	struct mbuf		*alc_rxhead;
13621c0ec257Skevlo 	struct mbuf		*alc_rxtail;
13631c0ec257Skevlo 	struct mbuf		*alc_rxprev_tail;
13641c0ec257Skevlo };
13651c0ec257Skevlo 
13661c0ec257Skevlo struct alc_hw_stats {
13671c0ec257Skevlo 	/* Rx stats. */
13681c0ec257Skevlo 	uint32_t rx_frames;
13691c0ec257Skevlo 	uint32_t rx_bcast_frames;
13701c0ec257Skevlo 	uint32_t rx_mcast_frames;
13711c0ec257Skevlo 	uint32_t rx_pause_frames;
13721c0ec257Skevlo 	uint32_t rx_control_frames;
13731c0ec257Skevlo 	uint32_t rx_crcerrs;
13741c0ec257Skevlo 	uint32_t rx_lenerrs;
13751c0ec257Skevlo 	uint64_t rx_bytes;
13761c0ec257Skevlo 	uint32_t rx_runts;
13771c0ec257Skevlo 	uint32_t rx_fragments;
13781c0ec257Skevlo 	uint32_t rx_pkts_64;
13791c0ec257Skevlo 	uint32_t rx_pkts_65_127;
13801c0ec257Skevlo 	uint32_t rx_pkts_128_255;
13811c0ec257Skevlo 	uint32_t rx_pkts_256_511;
13821c0ec257Skevlo 	uint32_t rx_pkts_512_1023;
13831c0ec257Skevlo 	uint32_t rx_pkts_1024_1518;
13841c0ec257Skevlo 	uint32_t rx_pkts_1519_max;
13851c0ec257Skevlo 	uint32_t rx_pkts_truncated;
13861c0ec257Skevlo 	uint32_t rx_fifo_oflows;
13871c0ec257Skevlo 	uint32_t rx_rrs_errs;
13881c0ec257Skevlo 	uint32_t rx_alignerrs;
13891c0ec257Skevlo 	uint64_t rx_bcast_bytes;
13901c0ec257Skevlo 	uint64_t rx_mcast_bytes;
13911c0ec257Skevlo 	uint32_t rx_pkts_filtered;
13921c0ec257Skevlo 	/* Tx stats. */
13931c0ec257Skevlo 	uint32_t tx_frames;
13941c0ec257Skevlo 	uint32_t tx_bcast_frames;
13951c0ec257Skevlo 	uint32_t tx_mcast_frames;
13961c0ec257Skevlo 	uint32_t tx_pause_frames;
13971c0ec257Skevlo 	uint32_t tx_excess_defer;
13981c0ec257Skevlo 	uint32_t tx_control_frames;
13991c0ec257Skevlo 	uint32_t tx_deferred;
14001c0ec257Skevlo 	uint64_t tx_bytes;
14011c0ec257Skevlo 	uint32_t tx_pkts_64;
14021c0ec257Skevlo 	uint32_t tx_pkts_65_127;
14031c0ec257Skevlo 	uint32_t tx_pkts_128_255;
14041c0ec257Skevlo 	uint32_t tx_pkts_256_511;
14051c0ec257Skevlo 	uint32_t tx_pkts_512_1023;
14061c0ec257Skevlo 	uint32_t tx_pkts_1024_1518;
14071c0ec257Skevlo 	uint32_t tx_pkts_1519_max;
14081c0ec257Skevlo 	uint32_t tx_single_colls;
14091c0ec257Skevlo 	uint32_t tx_multi_colls;
14101c0ec257Skevlo 	uint32_t tx_late_colls;
14111c0ec257Skevlo 	uint32_t tx_excess_colls;
14121c0ec257Skevlo 	uint32_t tx_underrun;
14131c0ec257Skevlo 	uint32_t tx_desc_underrun;
14141c0ec257Skevlo 	uint32_t tx_lenerrs;
14151c0ec257Skevlo 	uint32_t tx_pkts_truncated;
14161c0ec257Skevlo 	uint64_t tx_bcast_bytes;
14171c0ec257Skevlo 	uint64_t tx_mcast_bytes;
14181c0ec257Skevlo };
14191c0ec257Skevlo 
14201c0ec257Skevlo /*
14211c0ec257Skevlo  * Software state per device.
14221c0ec257Skevlo  */
14231c0ec257Skevlo struct alc_softc {
14241c0ec257Skevlo 	struct device		sc_dev;
14251c0ec257Skevlo 	struct arpcom		sc_arpcom;
14261c0ec257Skevlo 
14271c0ec257Skevlo 	bus_space_tag_t		sc_mem_bt;
14281c0ec257Skevlo 	bus_space_handle_t	sc_mem_bh;
14291c0ec257Skevlo 	bus_size_t		sc_mem_size;
14301c0ec257Skevlo 	bus_dma_tag_t		sc_dmat;
14311c0ec257Skevlo 	pci_chipset_tag_t	sc_pct;
14321c0ec257Skevlo 	pcitag_t		sc_pcitag;
143314ef3578Ssthen 	pci_vendor_id_t		sc_product;
14341c0ec257Skevlo 
14351c0ec257Skevlo 	void			*sc_irq_handle;
14361c0ec257Skevlo 
14371c0ec257Skevlo 	struct mii_data		sc_miibus;
14381c0ec257Skevlo 	int			alc_rev;
14391c0ec257Skevlo 	int			alc_chip_rev;
14401c0ec257Skevlo 	int			alc_phyaddr;
14411c0ec257Skevlo 	uint8_t			alc_eaddr[ETHER_ADDR_LEN];
144214ef3578Ssthen 	uint32_t		alc_max_framelen;
14431c0ec257Skevlo 	uint32_t		alc_dma_rd_burst;
14441c0ec257Skevlo 	uint32_t		alc_dma_wr_burst;
14451c0ec257Skevlo 	uint32_t		alc_rcb;
144614ef3578Ssthen 	int			alc_expcap;
14471c0ec257Skevlo 	int			alc_flags;
14481c0ec257Skevlo #define	ALC_FLAG_PCIE		0x0001
14491c0ec257Skevlo #define	ALC_FLAG_PCIX		0x0002
145014ef3578Ssthen #define	ALC_FLAG_PM		0x0010
14511c0ec257Skevlo #define	ALC_FLAG_FASTETHER	0x0020
14521c0ec257Skevlo #define	ALC_FLAG_JUMBO		0x0040
14531c0ec257Skevlo #define	ALC_FLAG_CMB_BUG	0x0100
14541c0ec257Skevlo #define	ALC_FLAG_SMB_BUG	0x0200
145514ef3578Ssthen #define	ALC_FLAG_L0S		0x0400
145614ef3578Ssthen #define	ALC_FLAG_L1S		0x0800
145714ef3578Ssthen #define	ALC_FLAG_APS		0x1000
145803ae04aaSkevlo #define	ALC_FLAG_AR816X_FAMILY	0x2000
145903ae04aaSkevlo #define	ALC_FLAG_LINK_WAR	0x4000
14601c0ec257Skevlo #define	ALC_FLAG_LINK		0x8000
146103ae04aaSkevlo #define ALC_FLAG_E2X00		0x10000
14621c0ec257Skevlo 
14631c0ec257Skevlo 	struct timeout		alc_tick_ch;
14641c0ec257Skevlo 	struct alc_hw_stats	alc_stats;
14651c0ec257Skevlo 	struct alc_chain_data	alc_cdata;
14661c0ec257Skevlo 	struct alc_ring_data	alc_rdata;
14671c0ec257Skevlo 	int			alc_int_rx_mod;
14681c0ec257Skevlo 	int			alc_int_tx_mod;
14691c0ec257Skevlo 	int			alc_buf_size;
14701c0ec257Skevlo };
14711c0ec257Skevlo 
14721c0ec257Skevlo /* Register access macros. */
14731c0ec257Skevlo #define	CSR_WRITE_4(_sc, reg, val)	\
14741c0ec257Skevlo 	bus_space_write_4((sc)->sc_mem_bt, (sc)->sc_mem_bh, (reg), (val))
14751c0ec257Skevlo #define	CSR_WRITE_2(_sc, reg, val)	\
14761c0ec257Skevlo 	bus_space_write_2((sc)->sc_mem_bt, (sc)->sc_mem_bh, (reg), (val))
14771c0ec257Skevlo #define	CSR_WRITE_1(_sc, reg, val)	\
14781c0ec257Skevlo 	bus_space_write_1((sc)->sc_mem_bt, (sc)->sc_mem_bh, (reg), (val))
14791c0ec257Skevlo #define	CSR_READ_2(_sc, reg)		\
14801c0ec257Skevlo 	bus_space_read_2((sc)->sc_mem_bt, (sc)->sc_mem_bh, (reg))
14811c0ec257Skevlo #define	CSR_READ_4(_sc, reg)		\
14821c0ec257Skevlo 	bus_space_read_4((sc)->sc_mem_bt, (sc)->sc_mem_bh, (reg))
14831c0ec257Skevlo 
14841c0ec257Skevlo #define	ALC_RXCHAIN_RESET(_sc)						\
14851c0ec257Skevlo do {									\
14861c0ec257Skevlo 	(_sc)->alc_cdata.alc_rxhead = NULL;				\
14871c0ec257Skevlo 	(_sc)->alc_cdata.alc_rxtail = NULL;				\
14881c0ec257Skevlo 	(_sc)->alc_cdata.alc_rxprev_tail = NULL;			\
14891c0ec257Skevlo 	(_sc)->alc_cdata.alc_rxlen = 0;					\
14901c0ec257Skevlo } while (0)
14911c0ec257Skevlo 
14921c0ec257Skevlo #define	ALC_TX_TIMEOUT		5
14931c0ec257Skevlo #define	ALC_RESET_TIMEOUT	100
14941c0ec257Skevlo #define	ALC_TIMEOUT		1000
14951c0ec257Skevlo #define	ALC_PHY_TIMEOUT		1000
14961c0ec257Skevlo 
149703ae04aaSkevlo #define	MASTER_WAKEN_25M	0x00000020
149803ae04aaSkevlo #define	ALC_FLAG_MSI		0x0004
149903ae04aaSkevlo #define	ALC_FLAG_MSIX		0x0008
150003ae04aaSkevlo 
15011c0ec257Skevlo #endif	/* _IF_ALCREG_H */
1502