xref: /openbsd-src/sys/dev/pci/if_ngbereg.h (revision 54fbbda3b5f8c42357b8601b12a514e2d25a2771)
1*54fbbda3Sjsg /*	$OpenBSD: if_ngbereg.h,v 1.2 2024/09/01 03:08:59 jsg Exp $	*/
25cd48f1eSkevlo 
35cd48f1eSkevlo /*
45cd48f1eSkevlo  * Copyright (c) 2015-2017 Beijing WangXun Technology Co., Ltd.
55cd48f1eSkevlo  * Copyright (c) 2023 Kevin Lo <kevlo@openbsd.org>
65cd48f1eSkevlo  *
75cd48f1eSkevlo  * Permission to use, copy, modify, and distribute this software for any
85cd48f1eSkevlo  * purpose with or without fee is hereby granted, provided that the above
95cd48f1eSkevlo  * copyright notice and this permission notice appear in all copies.
105cd48f1eSkevlo  *
115cd48f1eSkevlo  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
125cd48f1eSkevlo  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
135cd48f1eSkevlo  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
145cd48f1eSkevlo  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
155cd48f1eSkevlo  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
165cd48f1eSkevlo  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
175cd48f1eSkevlo  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
185cd48f1eSkevlo  */
195cd48f1eSkevlo 
205cd48f1eSkevlo #define NGBE_PCIREG		PCI_MAPREG_START	/* BAR 0 */
215cd48f1eSkevlo #define	NGBE_MAX_VECTORS	8
225cd48f1eSkevlo #define NGBE_SP_MAX_TX_QUEUES	8
235cd48f1eSkevlo #define NGBE_SP_MAX_RX_QUEUES	8
245cd48f1eSkevlo #define NGBE_SP_RAR_ENTRIES	32
255cd48f1eSkevlo #define NGBE_SP_MC_TBL_SIZE	128
265cd48f1eSkevlo #define NGBE_SP_VFT_TBL_SIZE	128
275cd48f1eSkevlo #define NGBE_SP_RX_PB_SIZE	42
285cd48f1eSkevlo 
295cd48f1eSkevlo #define NGBE_PSR_VLAN_SWC_ENTRIES	32
305cd48f1eSkevlo #define NGBE_MAX_MTA			128
315cd48f1eSkevlo #define NGBE_MAX_VFTA_ENTRIES		128
325cd48f1eSkevlo #define NGBE_MAX_INTS_PER_SEC		8000
335cd48f1eSkevlo #define NGBE_MAX_JUMBO_FRAME_SIZE	9432
345cd48f1eSkevlo 
355cd48f1eSkevlo #define NGBE_TX_TIMEOUT			5
365cd48f1eSkevlo #define NGBE_LINK_UP_TIME		90
375cd48f1eSkevlo #define NGBE_MAX_FLASH_LOAD_POLL_TIME	10
385cd48f1eSkevlo 
395cd48f1eSkevlo /* Additional bittime to account for NGBE framing */
405cd48f1eSkevlo #define NGBE_ETH_FRAMING	20
415cd48f1eSkevlo 
425cd48f1eSkevlo /* Tx/Rx descriptor defines */
435cd48f1eSkevlo #define NGBE_DEFAULT_TXD	512
445cd48f1eSkevlo #define NGBE_DEFAULT_RXD	512
455cd48f1eSkevlo 
465cd48f1eSkevlo /* Flow control */
475cd48f1eSkevlo #define NGBE_DEFAULT_FCPAUSE	0xffff
485cd48f1eSkevlo 
495cd48f1eSkevlo /* Flow control defines */
505cd48f1eSkevlo #define NGBE_TAF_SYM_PAUSE	0x1
515cd48f1eSkevlo #define NGBE_TAF_ASM_PAUSE	0x2
525cd48f1eSkevlo 
535cd48f1eSkevlo /* Interrupt Registers */
545cd48f1eSkevlo #define NGBE_PX_MISC_IC			0x00100
555cd48f1eSkevlo #define NGBE_PX_MISC_IEN		0x00108
565cd48f1eSkevlo #define NGBE_PX_GPIE			0x00118
575cd48f1eSkevlo #define NGBE_PX_IC			0x00120
585cd48f1eSkevlo #define NGBE_PX_IMS			0x00140
595cd48f1eSkevlo #define NGBE_PX_IMC			0x00150
605cd48f1eSkevlo #define NGBE_PX_ISB_ADDR_L		0x00160
615cd48f1eSkevlo #define NGBE_PX_ISB_ADDR_H		0x00164
625cd48f1eSkevlo #define NGBE_PX_TRANSACTION_PENDING	0x00168
635cd48f1eSkevlo #define NGBE_PX_ITRSEL			0x00180
645cd48f1eSkevlo #define NGBE_PX_ITR(_i)			(0x00200 + (_i) * 4)
655cd48f1eSkevlo #define NGBE_PX_MISC_IVAR		0x004fc
665cd48f1eSkevlo #define NGBE_PX_IVAR(_i)		(0x00500 + (_i) * 4)
675cd48f1eSkevlo 
685cd48f1eSkevlo /* Receive DMA Registers */
695cd48f1eSkevlo #define NGBE_PX_RR_BAL(_i)		(0x01000 + ((_i) * 0x40))
705cd48f1eSkevlo #define NGBE_PX_RR_BAH(_i)		(0x01004 + ((_i) * 0x40))
715cd48f1eSkevlo #define NGBE_PX_RR_WP(_i)		(0x01008 + ((_i) * 0x40))
725cd48f1eSkevlo #define NGBE_PX_RR_RP(_i)		(0x0100c + ((_i) * 0x40))
735cd48f1eSkevlo #define NGBE_PX_RR_CFG(_i)		(0x01010 + ((_i) * 0x40))
745cd48f1eSkevlo 
755cd48f1eSkevlo /* Statistic */
765cd48f1eSkevlo #define NGBE_PX_MPRC(_i)		(0x01020 + ((_i) * 64))
775cd48f1eSkevlo 
785cd48f1eSkevlo /* Transmit DMA Registers */
795cd48f1eSkevlo #define NGBE_PX_TR_BAL(_i)		(0x03000 + ((_i) * 0x40))
805cd48f1eSkevlo #define NGBE_PX_TR_BAH(_i)		(0x03004 + ((_i) * 0x40))
815cd48f1eSkevlo #define NGBE_PX_TR_WP(_i)		(0x03008 + ((_i) * 0x40))
825cd48f1eSkevlo #define NGBE_PX_TR_RP(_i)		(0x0300c + ((_i) * 0x40))
835cd48f1eSkevlo #define NGBE_PX_TR_CFG(_i)		(0x03010 + ((_i) * 0x40))
845cd48f1eSkevlo 
855cd48f1eSkevlo /* Chip Control Registers */
865cd48f1eSkevlo #define NGBE_MIS_PWR			0x10000
875cd48f1eSkevlo #define NGBE_MIS_RST			0x1000c
885cd48f1eSkevlo #define NGBE_MIS_PRB_CTL		0x10010
895cd48f1eSkevlo #define NGBE_MIS_ST			0x10028
905cd48f1eSkevlo #define NGBE_MIS_SWSM			0x1002c
915cd48f1eSkevlo #define NGBE_MIS_RST_ST			0x10030
925cd48f1eSkevlo 
935cd48f1eSkevlo /* FMGR Registers */
945cd48f1eSkevlo #define NGBE_SPI_CMD			0x10104
955cd48f1eSkevlo #define NGBE_SPI_DATA			0x10108
965cd48f1eSkevlo #define NGBE_SPI_STATUS			0x1010c
975cd48f1eSkevlo #define NGBE_SPI_ILDR_STATUS		0x10120
985cd48f1eSkevlo 
995cd48f1eSkevlo /* Checksum and EEPROM Registers */
1005cd48f1eSkevlo #define NGBE_CALSUM_CAP_STATUS		0x10224
1015cd48f1eSkevlo #define NGBE_EEPROM_VERSION_STORE_REG	0x1022c
1025cd48f1eSkevlo 
1035cd48f1eSkevlo /* Sensors for PVT(Process Voltage Temperature) */
1045cd48f1eSkevlo #define NGBE_TS_EN			0x10304
1055cd48f1eSkevlo #define NGBE_TS_ALARM_THRE		0x1030c
1065cd48f1eSkevlo #define NGBE_TS_DALARM_THRE		0x10310
1075cd48f1eSkevlo #define NGBE_TS_INT_EN			0x10314
1085cd48f1eSkevlo #define NGBE_TS_ALARM_ST		0x10318
1095cd48f1eSkevlo 
1105cd48f1eSkevlo /* MAC Registers */
1115cd48f1eSkevlo #define NGBE_MAC_TX_CFG			0x11000
1125cd48f1eSkevlo #define NGBE_MAC_RX_CFG			0x11004
1135cd48f1eSkevlo #define NGBE_MAC_PKT_FLT		0x11008
1145cd48f1eSkevlo #define NGBE_MAC_WDG_TIMEOUT		0x1100c
1155cd48f1eSkevlo #define NGBE_MAC_RX_FLOW_CTRL		0x11090
1165cd48f1eSkevlo 
1175cd48f1eSkevlo /* Media-dependent registers. */
1185cd48f1eSkevlo #define NGBE_MDIO_CLAUSE_SELECT		0x11220
1195cd48f1eSkevlo 
1205cd48f1eSkevlo /* Statistic */
1215cd48f1eSkevlo #define NGBE_MMC_CONTROL		0x11800
1225cd48f1eSkevlo #define NGBE_TX_FRAME_CNT_GOOD_BAD_LOW	0x1181c
1235cd48f1eSkevlo #define NGBE_TX_BC_FRAMES_GOOD_LOW	0x11824
1245cd48f1eSkevlo #define NGBE_TX_MC_FRAMES_GOOD_LOW	0x1182c
1255cd48f1eSkevlo #define NGBE_RX_FRAME_CNT_GOOD_BAD_LOW	0x11900
1265cd48f1eSkevlo #define NGBE_RX_BC_FRAMES_GOOD_LOW	0x11918
1275cd48f1eSkevlo #define NGBE_RX_CRC_ERROR_FRAMES_LOW	0x11928
1285cd48f1eSkevlo #define NGBE_RX_UNDERSIZE_FRAMES_GOOD	0x11938
1295cd48f1eSkevlo #define NGBE_RX_OVERSIZE_FRAMES_GOOD	0x1193c
1305cd48f1eSkevlo #define NGBE_RX_LEN_ERROR_FRAMES_LOW	0x11978
1315cd48f1eSkevlo #define NGBE_MAC_LXOFFRXC		0x11988
1325cd48f1eSkevlo #define NGBE_MAC_PXOFFRXC		0x119dc
1335cd48f1eSkevlo 
1345cd48f1eSkevlo /* Interrupt Registers */
1355cd48f1eSkevlo #define NGBE_BME_CTL			0x12020
1365cd48f1eSkevlo 
1375cd48f1eSkevlo /* Statistic */
1385cd48f1eSkevlo #define NGBE_RDM_DRP_PKT		0x12500
1395cd48f1eSkevlo #define NGBE_PX_GPRC			0x12504
1405cd48f1eSkevlo #define NGBE_PX_GORC_MSB		0x1250c
1415cd48f1eSkevlo 
1425cd48f1eSkevlo /* Internal phy reg_offset [0,31] */
1435cd48f1eSkevlo #define NGBE_PHY_CONFIG(offset)		(0x14000 + ((offset) * 4))
1445cd48f1eSkevlo 
1455cd48f1eSkevlo /* Port cfg Registers */
1465cd48f1eSkevlo #define NGBE_CFG_PORT_CTL		0x14400
1475cd48f1eSkevlo #define NGBE_CFG_PORT_ST		0x14404
1485cd48f1eSkevlo #define NGBE_CFG_LAN_SPEED		0x14440
1495cd48f1eSkevlo 
1505cd48f1eSkevlo /* GPIO Registers */
1515cd48f1eSkevlo #define NGBE_GPIO_DDR			0x14804
1525cd48f1eSkevlo #define NGBE_GPIO_INTEN			0x14830
1535cd48f1eSkevlo #define NGBE_GPIO_INTTYPE_LEVEL		0x14838
1545cd48f1eSkevlo #define NGBE_GPIO_POLARITY		0x1483c
1555cd48f1eSkevlo #define NGBE_GPIO_INTSTATUS		0x14840
1565cd48f1eSkevlo #define NGBE_GPIO_EOI			0x1484c
1575cd48f1eSkevlo 
1585cd48f1eSkevlo /* PSR Control Registers */
1595cd48f1eSkevlo #define NGBE_PSR_CTL			0x15000
1605cd48f1eSkevlo #define NGBE_PSR_MAX_SZ			0x15020
1615cd48f1eSkevlo #define NGBE_PSR_VLAN_CTL		0x15088
1625cd48f1eSkevlo 
163*54fbbda3Sjsg /* mcast/ucast overflow tbl */
1645cd48f1eSkevlo #define NGBE_PSR_MC_TBL(_i)		(0x15200 + ((_i) * 4))
1655cd48f1eSkevlo #define NGBE_PSR_UC_TBL(_i)		(0x15400 + ((_i) * 4))
1665cd48f1eSkevlo 
1675cd48f1eSkevlo /* Management Registers */
1685cd48f1eSkevlo #define NGBE_PSR_MNG_FLEX_SEL		0x1582c
1695cd48f1eSkevlo #define NGBE_PSR_MNG_FLEX_DW_L(_i)	(0x15a00 + ((_i) * 16))
1705cd48f1eSkevlo #define NGBE_PSR_MNG_FLEX_DW_H(_i)	(0x15a04 + ((_i) * 16))
1715cd48f1eSkevlo #define NGBE_PSR_MNG_FLEX_MSK(_i)	(0x15a08 + ((_i) * 16))
1725cd48f1eSkevlo 
1735cd48f1eSkevlo /* Wake Up Registers */
1745cd48f1eSkevlo #define NGBE_PSR_LAN_FLEX_SEL		0x15b8c
1755cd48f1eSkevlo #define NGBE_PSR_LAN_FLEX_DW_L(_i)	(0x15c00 + ((_i) * 16))
1765cd48f1eSkevlo #define NGBE_PSR_LAN_FLEX_DW_H(_i)	(0x15c04 + ((_i) * 16))
1775cd48f1eSkevlo #define NGBE_PSR_LAN_FLEX_MSK(_i)	(0x15c08 + ((_i) * 16))
1785cd48f1eSkevlo 
1795cd48f1eSkevlo /* VLAN tbl */
1805cd48f1eSkevlo #define NGBE_PSR_VLAN_TBL(_i)		(0x16000 + ((_i) * 4))
1815cd48f1eSkevlo 
1825cd48f1eSkevlo /* MAC switcher */
1835cd48f1eSkevlo #define NGBE_PSR_MAC_SWC_AD_L		0x16200
1845cd48f1eSkevlo #define NGBE_PSR_MAC_SWC_AD_H		0x16204
1855cd48f1eSkevlo #define NGBE_PSR_MAC_SWC_VM		0x16208
1865cd48f1eSkevlo #define NGBE_PSR_MAC_SWC_IDX		0x16210
1875cd48f1eSkevlo 
1885cd48f1eSkevlo /* VLAN switch */
1895cd48f1eSkevlo #define NGBE_PSR_VLAN_SWC		0x16220
1905cd48f1eSkevlo #define NGBE_PSR_VLAN_SWC_VM_L		0x16224
1915cd48f1eSkevlo #define NGBE_PSR_VLAN_SWC_IDX		0x16230
1925cd48f1eSkevlo 
1935cd48f1eSkevlo /* RSEC Registers */
1945cd48f1eSkevlo #define NGBE_RSEC_CTL			0x17000
1955cd48f1eSkevlo #define NGBE_RSEC_ST			0x17004
1965cd48f1eSkevlo 
1975cd48f1eSkevlo /* Transmit Global Control Registers */
1985cd48f1eSkevlo #define NGBE_TDM_CTL			0x18000
1995cd48f1eSkevlo #define NGBE_TDM_PB_THRE		0x18020
2005cd48f1eSkevlo 
2015cd48f1eSkevlo /* Statistic */
2025cd48f1eSkevlo #define NGBE_PX_GPTC			0x18308
2035cd48f1eSkevlo #define NGBE_PX_GOTC_MSB		0x18310
2045cd48f1eSkevlo 
2055cd48f1eSkevlo /* Receive packet buffer */
2065cd48f1eSkevlo #define NGBE_RDB_PB_CTL			0x19000
2075cd48f1eSkevlo #define NGBE_RDB_PB_SZ			0x19020
2085cd48f1eSkevlo #define NGBE_RDB_RFCV			0x19200
2095cd48f1eSkevlo 
2105cd48f1eSkevlo /* Statistic */
2115cd48f1eSkevlo #define NGBE_RDB_PFCMACDAL		0x19210
2125cd48f1eSkevlo #define NGBE_RDB_PFCMACDAH		0x19214
2135cd48f1eSkevlo #define NGBE_RDB_LXONTXC		0x1921c
2145cd48f1eSkevlo #define NGBE_RDB_LXOFFTXC		0x19218
2155cd48f1eSkevlo 
2165cd48f1eSkevlo /* Flow Control Registers */
2175cd48f1eSkevlo #define NGBE_RDB_RFCL			0x19220
2185cd48f1eSkevlo #define NGBE_RDB_RFCH			0x19260
2195cd48f1eSkevlo #define NGBE_RDB_RFCRT			0x192a0
2205cd48f1eSkevlo #define NGBE_RDB_RFCC			0x192a4
2215cd48f1eSkevlo 
2225cd48f1eSkevlo /* Ring Assignment */
2235cd48f1eSkevlo #define NGBE_RDB_PL_CFG(_i)		(0x19300 + ((_i) * 4))
2245cd48f1eSkevlo #define NGBE_RDB_RSSTBL(_i)		(0x19400 + ((_i) * 4))
2255cd48f1eSkevlo #define NGBE_RDB_RSSRK(_i)		(0x19480 + ((_i) * 4))
2265cd48f1eSkevlo #define NGBE_RDB_RA_CTL			0x194f4
2275cd48f1eSkevlo 
2285cd48f1eSkevlo /* TDB */
2295cd48f1eSkevlo #define NGBE_TDB_PB_SZ			0x1cc00
2305cd48f1eSkevlo 
2315cd48f1eSkevlo /* Security Control Registers */
2325cd48f1eSkevlo #define NGBE_TSEC_CTL			0x1d000
2335cd48f1eSkevlo #define NGBE_TSEC_BUF_AE		0x1d00c
2345cd48f1eSkevlo 
2355cd48f1eSkevlo /* MNG */
2365cd48f1eSkevlo #define NGBE_MNG_SWFW_SYNC		0x1e008
2375cd48f1eSkevlo #define NGBE_MNG_MBOX			0x1e100
2385cd48f1eSkevlo #define NGBE_MNG_MBOX_CTL		0x1e044
2395cd48f1eSkevlo 
2405cd48f1eSkevlo /* Bits in NGBE_PX_MISC_IC register */
2415cd48f1eSkevlo #define NGBE_PX_MISC_IC_PHY		0x00040000
2425cd48f1eSkevlo #define NGBE_PX_MISC_IC_GPIO		0x04000000
2435cd48f1eSkevlo 
2445cd48f1eSkevlo /* Bits in NGBE_PX_MISC_IEN register */
2455cd48f1eSkevlo #define NGBE_PX_MISC_IEN_ETH_LKDN	0x00000100
2465cd48f1eSkevlo #define NGBE_PX_MISC_IEN_DEV_RST	0x00000400
2475cd48f1eSkevlo #define NGBE_PX_MISC_IEN_STALL		0x00001000
2485cd48f1eSkevlo #define NGBE_PX_MISC_IEN_ETH_EVENT	0x00020000
2495cd48f1eSkevlo #define NGBE_PX_MISC_IEN_ETH_LK		0x00040000
2505cd48f1eSkevlo #define NGBE_PX_MISC_IEN_ETH_AN		0x00080000
2515cd48f1eSkevlo #define NGBE_PX_MISC_IEN_INT_ERR	0x00100000
2525cd48f1eSkevlo #define NGBE_PX_MISC_IEN_VF_MBOX	0x00800000
2535cd48f1eSkevlo #define NGBE_PX_MISC_IEN_GPIO		0x04000000
2545cd48f1eSkevlo #define NGBE_PX_MISC_IEN_PCIE_REQ_ERR	0x08000000
2555cd48f1eSkevlo #define NGBE_PX_MISC_IEN_OVER_HEAT	0x10000000
2565cd48f1eSkevlo #define NGBE_PX_MISC_IEN_MNG_HOST_MBOX	0x40000000
2575cd48f1eSkevlo #define NGBE_PX_MISC_IEN_TIMER		0x80000000
2585cd48f1eSkevlo 
2595cd48f1eSkevlo #define NGBE_PX_MISC_IEN_MASK						\
2605cd48f1eSkevlo 	(NGBE_PX_MISC_IEN_ETH_LKDN | NGBE_PX_MISC_IEN_DEV_RST |		\
2615cd48f1eSkevlo 	NGBE_PX_MISC_IEN_STALL | NGBE_PX_MISC_IEN_ETH_EVENT |		\
2625cd48f1eSkevlo 	NGBE_PX_MISC_IEN_ETH_LK | NGBE_PX_MISC_IEN_ETH_AN |		\
2635cd48f1eSkevlo 	NGBE_PX_MISC_IEN_INT_ERR | NGBE_PX_MISC_IEN_VF_MBOX |		\
2645cd48f1eSkevlo 	NGBE_PX_MISC_IEN_GPIO | NGBE_PX_MISC_IEN_PCIE_REQ_ERR |		\
2655cd48f1eSkevlo 	NGBE_PX_MISC_IEN_MNG_HOST_MBOX | NGBE_PX_MISC_IEN_TIMER)
2665cd48f1eSkevlo 
2675cd48f1eSkevlo /* Bits in NGBE_PX_GPIE register */
2685cd48f1eSkevlo #define NGBE_PX_GPIE_MODEL	0x00000001
2695cd48f1eSkevlo 
2705cd48f1eSkevlo /* Bits in NGBE_PX_ITR register */
2715cd48f1eSkevlo #define NGBE_MAX_EITR		0x00007ffc
2725cd48f1eSkevlo #define NGBE_PX_ITR_CNT_WDIS	0x80000000
2735cd48f1eSkevlo 
2745cd48f1eSkevlo /* Bits in NGBE_PX_IVAR register */
2755cd48f1eSkevlo #define NGBE_PX_IVAR_ALLOC_VAL	0x80
2765cd48f1eSkevlo 
2775cd48f1eSkevlo /* Bits in NGBE_PX_RR_CFG register */
2785cd48f1eSkevlo #define NGBE_PX_RR_CFG_RR_EN		0x00000001
2795cd48f1eSkevlo #define NGBE_PX_RR_CFG_SPLIT_MODE	0x04000000
2805cd48f1eSkevlo #define NGBE_PX_RR_CFG_DROP_EN		0x40000000
2815cd48f1eSkevlo #define NGBE_PX_RR_CFG_VLAN		0x80000000
2825cd48f1eSkevlo 
2835cd48f1eSkevlo #define NGBE_PX_RR_CFG_RR_BUF_SZ	0x00000f00
2845cd48f1eSkevlo #define NGBE_PX_RR_CFG_RR_HDR_SZ	0x0000f000
2855cd48f1eSkevlo #define NGBE_PX_RR_CFG_RR_SIZE_SHIFT	1
2865cd48f1eSkevlo #define NGBE_PX_RR_CFG_BSIZEPKT_SHIFT	2
2875cd48f1eSkevlo #define NGBE_PX_RR_CFG_RR_THER_SHIFT	16
2885cd48f1eSkevlo 
2895cd48f1eSkevlo /* Bits in NGBE_PX_TR_CFG register */
2905cd48f1eSkevlo #define NGBE_PX_TR_CFG_ENABLE		(1)
2915cd48f1eSkevlo #define NGBE_PX_TR_CFG_SWFLSH		0x04000000
2925cd48f1eSkevlo 
2935cd48f1eSkevlo #define NGBE_PX_TR_CFG_TR_SIZE_SHIFT	1
2945cd48f1eSkevlo #define NGBE_PX_TR_CFG_WTHRESH_SHIFT	16
2955cd48f1eSkevlo 
2965cd48f1eSkevlo /* Bits in NGBE_MIS_RST register */
2975cd48f1eSkevlo #define NGBE_MIS_RST_SW_RST	0x00000001
2985cd48f1eSkevlo #define NGBE_MIS_RST_LAN0_RST	0x00000002
2995cd48f1eSkevlo #define NGBE_MIS_RST_LAN1_RST	0x00000004
3005cd48f1eSkevlo #define NGBE_MIS_RST_LAN2_RST	0x00000008
3015cd48f1eSkevlo #define NGBE_MIS_RST_LAN3_RST	0x00000010
3025cd48f1eSkevlo 
3035cd48f1eSkevlo /* Bits in NGBE_MIS_PRB_CTL register */
3045cd48f1eSkevlo #define NGBE_MIS_PRB_CTL_LAN3_UP	0x1
3055cd48f1eSkevlo #define NGBE_MIS_PRB_CTL_LAN2_UP	0x2
3065cd48f1eSkevlo #define NGBE_MIS_PRB_CTL_LAN1_UP	0x4
3075cd48f1eSkevlo #define NGBE_MIS_PRB_CTL_LAN0_UP	0x8
3085cd48f1eSkevlo 
3095cd48f1eSkevlo /* Bits in NGBE_MIS_ST register */
3105cd48f1eSkevlo #define NGBE_MIS_ST_MNG_INIT_DN		0x00000001
3115cd48f1eSkevlo #define NGBE_MIS_ST_MNG_VETO		0x00000100
3125cd48f1eSkevlo #define NGBE_MIS_ST_LAN0_ECC		0x00010000
3135cd48f1eSkevlo #define NGBE_MIS_ST_LAN1_ECC		0x00020000
3145cd48f1eSkevlo #define NGBE_MIS_ST_GPHY_IN_RST(_r)	(0x00000200 << (_r))
3155cd48f1eSkevlo 
3165cd48f1eSkevlo /* Bits in NGBE_MIS_SWSM register */
3175cd48f1eSkevlo #define NGBE_MIS_SWSM_SMBI	1
3185cd48f1eSkevlo 
3195cd48f1eSkevlo /* Bits in NGBE_MIS_RST_ST register */
3205cd48f1eSkevlo #define NGBE_MIS_RST_ST_RST_INIT	0x0000ff00
3215cd48f1eSkevlo 
3225cd48f1eSkevlo #define NGBE_MIS_RST_ST_RST_INI_SHIFT	8
3235cd48f1eSkevlo #define NGBE_MIS_RST_ST_DEV_RST_ST_MASK	0x00180000
3245cd48f1eSkevlo 
3255cd48f1eSkevlo /* Bits in NGBE_SPI_STATUS register */
3265cd48f1eSkevlo #define NGBE_SPI_STATUS_FLASH_BYPASS	0x80000000
3275cd48f1eSkevlo 
3285cd48f1eSkevlo /* Bits in NGBE_SPI_ILDR_STATUS register */
3295cd48f1eSkevlo #define NGBE_SPI_ILDR_STATUS_PERST	0x00000001
3305cd48f1eSkevlo #define NGBE_SPI_ILDR_STATUS_PWRRST	0x00000002
3315cd48f1eSkevlo #define NGBE_SPI_ILDR_STATUS_SW_RESET	0x00000800
3325cd48f1eSkevlo 
3335cd48f1eSkevlo /* Bits in NGBE_TS_EN register */
3345cd48f1eSkevlo #define NGBE_TS_EN_ENA	0x00000001
3355cd48f1eSkevlo 
3365cd48f1eSkevlo /* Bits in NGBE_TS_INT_EN register */
3375cd48f1eSkevlo #define NGBE_TS_INT_EN_ALARM_INT_EN	0x00000001
3385cd48f1eSkevlo #define NGBE_TS_INT_EN_DALARM_INT_EN	0x00000002
3395cd48f1eSkevlo 
3405cd48f1eSkevlo /* Bits in NGBE_TS_ALARM_ST register */
3415cd48f1eSkevlo #define NGBE_TS_ALARM_ST_DALARM	0x00000002
3425cd48f1eSkevlo #define NGBE_TS_ALARM_ST_ALARM	0x00000001
3435cd48f1eSkevlo 
3445cd48f1eSkevlo /* Bits in NGBE_MAC_TX_CFG register */
3455cd48f1eSkevlo #define NGBE_MAC_TX_CFG_TE		0x00000001
3465cd48f1eSkevlo #define NGBE_MAC_TX_CFG_SPEED_MASK	0x60000000
3475cd48f1eSkevlo #define NGBE_MAC_TX_CFG_SPEED_1G	0x60000000
3485cd48f1eSkevlo 
3495cd48f1eSkevlo /* Bits in NGBE_MAC_RX_CFG register */
3505cd48f1eSkevlo #define NGBE_MAC_RX_CFG_RE	0x00000001
3515cd48f1eSkevlo #define NGBE_MAC_RX_CFG_JE	0x00000100
3525cd48f1eSkevlo 
3535cd48f1eSkevlo /* Bits in NGBE_MAC_PKT_FLT register */
3545cd48f1eSkevlo #define NGBE_MAC_PKT_FLT_PR	0x00000001
3555cd48f1eSkevlo #define NGBE_MAC_PKT_FLT_RA	0x80000000
3565cd48f1eSkevlo 
3575cd48f1eSkevlo /* Bits in NGBE_MAC_RX_FLOW_CTRL register */
3585cd48f1eSkevlo #define NGBE_MAC_RX_FLOW_CTRL_RFE	0x00000001
3595cd48f1eSkevlo 
3605cd48f1eSkevlo /* Bits in NGBE_MMC_CONTROL register */
3615cd48f1eSkevlo #define NGBE_MMC_CONTROL_RSTONRD	0x4
3625cd48f1eSkevlo #define NGBE_MMC_CONTROL_UP		0x700
3635cd48f1eSkevlo 
3645cd48f1eSkevlo /* Bits in NGBE_CFG_PORT_CTL register */
3655cd48f1eSkevlo #define NGBE_CFG_PORT_CTL_DRV_LOAD	0x00000008
3665cd48f1eSkevlo #define NGBE_CFG_PORT_CTL_PFRSTD	0x00004000
3675cd48f1eSkevlo 
3685cd48f1eSkevlo /* Bits in NGBE_CFG_PORT_ST register */
3695cd48f1eSkevlo #define NGBE_CFG_PORT_ST_LAN_ID(_r)	((0x00000300 & (_r)) >> 8)
3705cd48f1eSkevlo 
3715cd48f1eSkevlo /* Bits in NGBE_PSR_CTL register */
3725cd48f1eSkevlo #define NGBE_PSR_CTL_MO		0x00000060
3735cd48f1eSkevlo #define NGBE_PSR_CTL_MFE	0x00000080
3745cd48f1eSkevlo #define NGBE_PSR_CTL_MPE	0x00000100
3755cd48f1eSkevlo #define NGBE_PSR_CTL_UPE	0x00000200
3765cd48f1eSkevlo #define NGBE_PSR_CTL_BAM	0x00000400
3775cd48f1eSkevlo #define NGBE_PSR_CTL_PCSD	0x00002000
3785cd48f1eSkevlo #define NGBE_PSR_CTL_SW_EN	0x00040000
3795cd48f1eSkevlo 
3805cd48f1eSkevlo #define NGBE_PSR_CTL_MO_SHIFT	5
3815cd48f1eSkevlo 
3825cd48f1eSkevlo /* Bits in NGBE_PSR_VLAN_CTL register */
3835cd48f1eSkevlo #define NGBE_PSR_VLAN_CTL_CFIEN	0x20000000
3845cd48f1eSkevlo #define NGBE_PSR_VLAN_CTL_VFE	0x40000000
3855cd48f1eSkevlo 
3865cd48f1eSkevlo /* Bits in NGBE_PSR_MAC_SWC_AD_H register */
3875cd48f1eSkevlo #define NGBE_PSR_MAC_SWC_AD_H_AV	0x80000000
3885cd48f1eSkevlo 
3895cd48f1eSkevlo #define NGBE_PSR_MAC_SWC_AD_H_AD(v)	(((v) & 0xffff))
3905cd48f1eSkevlo #define NGBE_PSR_MAC_SWC_AD_H_ADTYPE(v)	(((v) & 0x1) << 30)
3915cd48f1eSkevlo 
3925cd48f1eSkevlo /* Bits in NGBE_RSEC_CTL register */
3935cd48f1eSkevlo #define NGBE_RSEC_CTL_RX_DIS	0x00000002
3945cd48f1eSkevlo #define NGBE_RSEC_CTL_CRC_STRIP	0x00000004
3955cd48f1eSkevlo 
3965cd48f1eSkevlo /* Bits in NGBE_RSEC_ST register */
3975cd48f1eSkevlo #define NGBE_RSEC_ST_RSEC_RDY	0x00000001
3985cd48f1eSkevlo 
3995cd48f1eSkevlo /* Bits in NGBE_TDM_CTL register */
4005cd48f1eSkevlo #define NGBE_TDM_CTL_TE	0x1
4015cd48f1eSkevlo 
4025cd48f1eSkevlo /* Bits in NGBE_TDM_PB_THRE register */
4035cd48f1eSkevlo #define NGBE_TXPKT_SIZE_MAX	0xa
4045cd48f1eSkevlo 
4055cd48f1eSkevlo /* Bits in NGBE_RDB_PB_CTL register */
4065cd48f1eSkevlo #define NGBE_RDB_PB_CTL_PBEN	0x80000000
4075cd48f1eSkevlo 
4085cd48f1eSkevlo #define NGBE_RDB_PB_SZ_SHIFT	10
4095cd48f1eSkevlo 
4105cd48f1eSkevlo /* Bits in NGBE_RDB_RFCC register */
4115cd48f1eSkevlo #define NGBE_RDB_RFCC_RFCE_802_3X	0x00000008
4125cd48f1eSkevlo 
4135cd48f1eSkevlo /* Bits in RFCL register */
4145cd48f1eSkevlo #define NGBE_RDB_RFCL_XONE	0x80000000
4155cd48f1eSkevlo 
4165cd48f1eSkevlo /* Bits in RFCH register */
4175cd48f1eSkevlo #define NGBE_RDB_RFCH_XOFFE	0x80000000
4185cd48f1eSkevlo 
4195cd48f1eSkevlo /* Bits in NGBE_RDB_PL_CFG register */
4205cd48f1eSkevlo #define NGBE_RDB_PL_CFG_L4HDR		0x2
4215cd48f1eSkevlo #define NGBE_RDB_PL_CFG_L3HDR		0x4
4225cd48f1eSkevlo #define NGBE_RDB_PL_CFG_L2HDR		0x8
4235cd48f1eSkevlo #define NGBE_RDB_PL_CFG_TUN_TUNHDR	0x10
4245cd48f1eSkevlo #define NGBE_RDB_PL_CFG_TUN_OUTER_L2HDR	0x20
4255cd48f1eSkevlo 
4265cd48f1eSkevlo /* Bits in NGBE_RDB_RA_CTL register */
4275cd48f1eSkevlo #define NGBE_RDB_RA_CTL_RSS_EN		0x00000004
4285cd48f1eSkevlo #define NGBE_RDB_RA_CTL_RSS_IPV4_TCP	0x00010000
4295cd48f1eSkevlo #define NGBE_RDB_RA_CTL_RSS_IPV4	0x00020000
4305cd48f1eSkevlo #define NGBE_RDB_RA_CTL_RSS_IPV6	0x00100000
4315cd48f1eSkevlo #define NGBE_RDB_RA_CTL_RSS_IPV6_TCP	0x00200000
4325cd48f1eSkevlo 
4335cd48f1eSkevlo /* Bits in NGBE_TDB_PB register */
4345cd48f1eSkevlo #define NGBE_TDB_PB_SZ_MAX	0x00005000
4355cd48f1eSkevlo 
4365cd48f1eSkevlo /* NGBE_MNG_SWFW_SYNC definitions */
4375cd48f1eSkevlo #define NGBE_MNG_SWFW_SYNC_SW_PHY	0x0001
4385cd48f1eSkevlo #define NGBE_MNG_SWFW_SYNC_SW_MB	0x0004
4395cd48f1eSkevlo 
4405cd48f1eSkevlo /* Bits in NGBE_MNG_MBOX_CTL register */
4415cd48f1eSkevlo #define NGBE_MNG_MBOX_CTL_SWRDY	0x1
4425cd48f1eSkevlo #define NGBE_MNG_MBOX_CTL_FWRDY	0x4
4435cd48f1eSkevlo 
4445cd48f1eSkevlo #define NGBE_CHECKSUM_CAP_ST_PASS	0x80658383
4455cd48f1eSkevlo #define NGBE_CHECKSUM_CAP_ST_FAIL	0x70657376
4465cd48f1eSkevlo 
4475cd48f1eSkevlo #define NGBE_CALSUM_COMMAND	0xe9
4485cd48f1eSkevlo 
4495cd48f1eSkevlo #define RGMII_FPGA	0x0080
4505cd48f1eSkevlo #define OEM_MASK	0x00ff
4515cd48f1eSkevlo 
4525cd48f1eSkevlo /* PHY register definitions */
4535cd48f1eSkevlo #define NGBE_MDIO_AUTO_NEG_STATUS	0x1a
4545cd48f1eSkevlo #define NGBE_MDIO_AUTO_NEG_LSC		0x1d
4555cd48f1eSkevlo 
4565cd48f1eSkevlo /* Internal PHY control */
4575cd48f1eSkevlo #define NGBE_INTERNAL_PHY_PAGE_OFFSET		0xa43
4585cd48f1eSkevlo #define NGBE_INTERNAL_PHY_PAGE_SELECT_OFFSET	31
4595cd48f1eSkevlo #define NGBE_INTERNAL_PHY_ID			0x000732
4605cd48f1eSkevlo 
4615cd48f1eSkevlo #define NGBE_INTPHY_INT_ANC	0x0008
4625cd48f1eSkevlo #define NGBE_INTPHY_INT_LSC	0x0010
4635cd48f1eSkevlo 
4645cd48f1eSkevlo /* PHY mdi standard config */
4655cd48f1eSkevlo #define NGBE_MDI_PHY_ID1_OFFSET		2
4665cd48f1eSkevlo #define NGBE_MDI_PHY_ID2_OFFSET		3
4675cd48f1eSkevlo #define NGBE_MDI_PHY_ID_MASK		0xfffffc00
4685cd48f1eSkevlo #define NGBE_MDI_PHY_SPEED_SELECT1	0x0040
4695cd48f1eSkevlo #define NGBE_MDI_PHY_DUPLEX		0x0100
4705cd48f1eSkevlo #define NGBE_MDI_PHY_RESTART_AN		0x0200
4715cd48f1eSkevlo #define NGBE_MDI_PHY_ANE		0x1000
4725cd48f1eSkevlo #define NGBE_MDI_PHY_SPEED_SELECT0	0x2000
4735cd48f1eSkevlo #define NGBE_MDI_PHY_RESET		0x8000
4745cd48f1eSkevlo 
4755cd48f1eSkevlo #define NGBE_PHY_RST_WAIT_PERIOD	50
4765cd48f1eSkevlo 
4775cd48f1eSkevlo #define NGBE_SR_AN_MMD_ADV_REG1_PAUSE_SYM	0x400
4785cd48f1eSkevlo #define NGBE_SR_AN_MMD_ADV_REG1_PAUSE_ASM	0x800
4795cd48f1eSkevlo 
4805cd48f1eSkevlo #define SPI_CMD_READ_DWORD	1
4815cd48f1eSkevlo #define SPI_CLK_DIV		3
4825cd48f1eSkevlo #define SPI_CLK_DIV_OFFSET	25
4835cd48f1eSkevlo #define SPI_CLK_CMD_OFFSET	28
4845cd48f1eSkevlo #define SPI_TIME_OUT_VALUE	10000
4855cd48f1eSkevlo 
4865cd48f1eSkevlo /* PCI bus info */
4875cd48f1eSkevlo #define NGBE_PCI_LINK_STATUS	0xb2
4885cd48f1eSkevlo 
4895cd48f1eSkevlo #define NGBE_PCI_LINK_WIDTH	0x3f0
4905cd48f1eSkevlo #define NGBE_PCI_LINK_WIDTH_1	0x10
4915cd48f1eSkevlo #define NGBE_PCI_LINK_WIDTH_2	0x20
4925cd48f1eSkevlo #define NGBE_PCI_LINK_WIDTH_4	0x40
4935cd48f1eSkevlo #define NGBE_PCI_LINK_WIDTH_8	0x80
4945cd48f1eSkevlo 
4955cd48f1eSkevlo #define NGBE_PCI_LINK_SPEED		0xf
4965cd48f1eSkevlo #define NGBE_PCI_LINK_SPEED_2500	0x1
4975cd48f1eSkevlo #define NGBE_PCI_LINK_SPEED_5000	0x2
4985cd48f1eSkevlo #define NGBE_PCI_LINK_SPEED_8000	0x3
4995cd48f1eSkevlo 
5005cd48f1eSkevlo /* Number of 100 microseconds we wait for PCI Express master disable */
5015cd48f1eSkevlo #define NGBE_PCI_MASTER_DISABLE_TIMEOUT	800
5025cd48f1eSkevlo 
5035cd48f1eSkevlo /* Check whether address is multicast. This is little-endian specific check. */
5045cd48f1eSkevlo #define NGBE_IS_MULTICAST(Address)					\
5055cd48f1eSkevlo 	(int)(((uint8_t *)(Address))[0] & ((uint8_t)0x01))
5065cd48f1eSkevlo 
5075cd48f1eSkevlo /* Check whether an address is broadcast. */
5085cd48f1eSkevlo #define NGBE_IS_BROADCAST(Address)					\
5095cd48f1eSkevlo 	((((uint8_t *)(Address))[0] == ((uint8_t)0xff)) &&		\
5105cd48f1eSkevlo 	(((uint8_t *)(Address))[1] == ((uint8_t)0xff)))
5115cd48f1eSkevlo 
5125cd48f1eSkevlo /* Link speed */
5135cd48f1eSkevlo #define NGBE_LINK_SPEED_UNKNOWN		0
5145cd48f1eSkevlo #define NGBE_LINK_SPEED_100_FULL	1
5155cd48f1eSkevlo #define NGBE_LINK_SPEED_1GB_FULL	2
5165cd48f1eSkevlo #define NGBE_LINK_SPEED_10_FULL		8
5175cd48f1eSkevlo #define NGBE_LINK_SPEED_AUTONEG						\
5185cd48f1eSkevlo 	(NGBE_LINK_SPEED_100_FULL | NGBE_LINK_SPEED_1GB_FULL |		\
5195cd48f1eSkevlo 	NGBE_LINK_SPEED_10_FULL)
5205cd48f1eSkevlo 
5215cd48f1eSkevlo 
5225cd48f1eSkevlo #define NGBE_HI_MAX_BLOCK_BYTE_LENGTH	256
5235cd48f1eSkevlo #define NGBE_HI_COMMAND_TIMEOUT	5000
5245cd48f1eSkevlo 
5255cd48f1eSkevlo /* CEM support */
5265cd48f1eSkevlo #define FW_CEM_CMD_RESERVED		0x0
5275cd48f1eSkevlo #define FW_CEM_RESP_STATUS_SUCCESS	0x1
5285cd48f1eSkevlo #define FW_CEM_HDR_LEN			0x4
5295cd48f1eSkevlo 
5305cd48f1eSkevlo #define FW_CEM_CMD_DRIVER_INFO		0xdd
5315cd48f1eSkevlo #define FW_CEM_CMD_DRIVER_INFO_LEN	0x5
5325cd48f1eSkevlo 
5335cd48f1eSkevlo #define FW_EEPROM_CHECK_STATUS		0xe9
5345cd48f1eSkevlo #define FW_PHY_LED_CONF			0xf1
5355cd48f1eSkevlo #define FW_DEFAULT_CHECKSUM		0xff
5365cd48f1eSkevlo 
5375cd48f1eSkevlo #define FW_CEM_MAX_RETRIES	3
5385cd48f1eSkevlo 
5395cd48f1eSkevlo #define NGBE_MAX_SCATTER	32
5405cd48f1eSkevlo #define NGBE_TSO_SIZE		32767
5415cd48f1eSkevlo #define NGBE_MAX_RX_DESC_POLL	10
5425cd48f1eSkevlo 
5435cd48f1eSkevlo /* Packet buffer allocation strategies */
5445cd48f1eSkevlo #define PBA_STRATEGY_EQUAL	0
5455cd48f1eSkevlo #define PBA_STRATEGY_WEIGHTED	1
5465cd48f1eSkevlo 
5475cd48f1eSkevlo /* BitTimes (BT) conversion */
5485cd48f1eSkevlo #define NGBE_BT2KB(BT)	((BT + (8 * 1024 - 1)) / (8 * 1024))
5495cd48f1eSkevlo #define NGBE_B2BT(BT)	(BT * 8)
5505cd48f1eSkevlo 
5515cd48f1eSkevlo /* Calculate Delay to respond to PFC */
5525cd48f1eSkevlo #define NGBE_PFC_D	672
5535cd48f1eSkevlo 
5545cd48f1eSkevlo /* Calculate Cable Delay */
5555cd48f1eSkevlo #define NGBE_CABLE_DC	5556
5565cd48f1eSkevlo 
5575cd48f1eSkevlo /* Calculate Interface Delay */
5585cd48f1eSkevlo #define NGBE_PHY_D	12800
5595cd48f1eSkevlo #define NGBE_MAC_D	4096
5605cd48f1eSkevlo #define NGBE_XAUI_D	(2 * 1024)
5615cd48f1eSkevlo 
5625cd48f1eSkevlo #define NGBE_ID		(NGBE_MAC_D + NGBE_XAUI_D + NGBE_PHY_D)
5635cd48f1eSkevlo 
5645cd48f1eSkevlo /* Calculate Delay incurred from higher layer */
5655cd48f1eSkevlo #define NGBE_HD	6144
5665cd48f1eSkevlo 
5675cd48f1eSkevlo /* Calculate PCI Bus delay for low thresholds */
5685cd48f1eSkevlo #define NGBE_PCI_DELAY	10000
5695cd48f1eSkevlo 
5705cd48f1eSkevlo /* Calculate delay value in bit times */
5715cd48f1eSkevlo #define NGBE_DV(_max_frame_link, _max_frame_tc)				\
5725cd48f1eSkevlo 	((36 * (NGBE_B2BT(_max_frame_link) + NGBE_PFC_D + 		\
5735cd48f1eSkevlo 	(2 * NGBE_CABLE_DC) + (2 * NGBE_ID) + NGBE_HD) / 25 + 1) +	\
5745cd48f1eSkevlo 	2 * NGBE_B2BT(_max_frame_tc))
5755cd48f1eSkevlo 
5765cd48f1eSkevlo /* Calculate low threshold delay values */
5775cd48f1eSkevlo #define NGBE_LOW_DV_X540(_max_frame_tc)					\
5785cd48f1eSkevlo 	(2 * NGBE_B2BT(_max_frame_tc) + (36 * NGBE_PCI_DELAY / 25) + 1)
5795cd48f1eSkevlo 
5805cd48f1eSkevlo #define NGBE_LOW_DV(_max_frame_tc)					\
5815cd48f1eSkevlo 	(2 * NGBE_LOW_DV_X540(_max_frame_tc))
5825cd48f1eSkevlo 
5835cd48f1eSkevlo /* Compatibility glue. */
5845cd48f1eSkevlo #define msec_delay(x)		DELAY(1000 * (x))
5855cd48f1eSkevlo #define roundup2(size, unit)	(((size) + (unit) - 1) & ~((unit) - 1))
5865cd48f1eSkevlo #define le32_to_cpup(x)		(le32toh(*(const uint32_t *)(x)))
5875cd48f1eSkevlo #define le32_to_cpus(x)							\
5885cd48f1eSkevlo 	do { *((uint32_t *)(x)) = le32_to_cpup((x)); } while (0)
5895cd48f1eSkevlo 
5905cd48f1eSkevlo enum ngbe_media_type {
5915cd48f1eSkevlo 	ngbe_media_type_unknown = 0,
5925cd48f1eSkevlo 	ngbe_media_type_fiber,
5935cd48f1eSkevlo 	ngbe_media_type_copper,
5945cd48f1eSkevlo 	ngbe_media_type_backplane,
5955cd48f1eSkevlo 	ngbe_media_type_virtual
5965cd48f1eSkevlo };
5975cd48f1eSkevlo 
5985cd48f1eSkevlo /* Flow Control Settings */
5995cd48f1eSkevlo enum ngbe_fc_mode {
6005cd48f1eSkevlo 	ngbe_fc_none = 0,
6015cd48f1eSkevlo 	ngbe_fc_rx_pause,
6025cd48f1eSkevlo 	ngbe_fc_tx_pause,
6035cd48f1eSkevlo 	ngbe_fc_full,
6045cd48f1eSkevlo 	ngbe_fc_default
6055cd48f1eSkevlo };
6065cd48f1eSkevlo 
6075cd48f1eSkevlo enum ngbe_eeprom_type {
6085cd48f1eSkevlo 	ngbe_eeprom_uninitialized = 0,
6095cd48f1eSkevlo 	ngbe_eeprom_spi,
6105cd48f1eSkevlo 	ngbe_flash,
6115cd48f1eSkevlo 	ngbe_eeprom_none	/* No NVM support */
6125cd48f1eSkevlo };
6135cd48f1eSkevlo 
6145cd48f1eSkevlo enum ngbe_phy_type {
6155cd48f1eSkevlo 	ngbe_phy_unknown = 0,
6165cd48f1eSkevlo 	ngbe_phy_none,
6175cd48f1eSkevlo 	ngbe_phy_internal,
6185cd48f1eSkevlo };
6195cd48f1eSkevlo 
6205cd48f1eSkevlo enum ngbe_reset_type {
6215cd48f1eSkevlo 	NGBE_LAN_RESET = 0,
6225cd48f1eSkevlo 	NGBE_SW_RESET,
6235cd48f1eSkevlo 	NGBE_GLOBAL_RESET
6245cd48f1eSkevlo };
6255cd48f1eSkevlo 
6265cd48f1eSkevlo enum ngbe_isb_idx {
6275cd48f1eSkevlo 	NGBE_ISB_HEADER,
6285cd48f1eSkevlo 	NGBE_ISB_MISC,
6295cd48f1eSkevlo 	NGBE_ISB_VEC0,
6305cd48f1eSkevlo 	NGBE_ISB_VEC1,
6315cd48f1eSkevlo 	NGBE_ISB_MAX
6325cd48f1eSkevlo };
6335cd48f1eSkevlo 
6345cd48f1eSkevlo /* PCI bus types */
6355cd48f1eSkevlo enum ngbe_bus_type {
6365cd48f1eSkevlo 	ngbe_bus_type_unknown	= 0,
6375cd48f1eSkevlo 	ngbe_bus_type_pci,
6385cd48f1eSkevlo 	ngbe_bus_type_pcix,
6395cd48f1eSkevlo 	ngbe_bus_type_pci_express,
6405cd48f1eSkevlo 	ngbe_bus_type_internal,
6415cd48f1eSkevlo 	ngbe_bus_type_reserved
6425cd48f1eSkevlo };
6435cd48f1eSkevlo 
6445cd48f1eSkevlo /* PCI bus speeds */
6455cd48f1eSkevlo enum ngbe_bus_speed {
6465cd48f1eSkevlo 	ngbe_bus_speed_unknown	= 0,
6475cd48f1eSkevlo 	ngbe_bus_speed_33	= 33,
6485cd48f1eSkevlo 	ngbe_bus_speed_66	= 66,
6495cd48f1eSkevlo 	ngbe_bus_speed_100	= 100,
6505cd48f1eSkevlo 	ngbe_bus_speed_120	= 120,
6515cd48f1eSkevlo 	ngbe_bus_speed_133	= 133,
6525cd48f1eSkevlo 	ngbe_bus_speed_2500	= 2500,
6535cd48f1eSkevlo 	ngbe_bus_speed_5000	= 5000,
6545cd48f1eSkevlo 	ngbe_bus_speed_8000	= 8000,
6555cd48f1eSkevlo 	ngbe_bus_speed_reserved
6565cd48f1eSkevlo };
6575cd48f1eSkevlo 
6585cd48f1eSkevlo /* PCI bus widths */
6595cd48f1eSkevlo enum ngbe_bus_width {
6605cd48f1eSkevlo 	ngbe_bus_width_unknown	= 0,
6615cd48f1eSkevlo 	ngbe_bus_width_pcie_x1	= 1,
6625cd48f1eSkevlo 	ngbe_bus_width_pcie_x2	= 2,
6635cd48f1eSkevlo 	ngbe_bus_width_pcie_x4	= 4,
6645cd48f1eSkevlo 	ngbe_bus_width_pcie_x8	= 8,
6655cd48f1eSkevlo 	ngbe_bus_width_32	= 32,
6665cd48f1eSkevlo 	ngbe_bus_width_64	= 64,
6675cd48f1eSkevlo 	ngbe_bus_width_reserved
6685cd48f1eSkevlo };
6695cd48f1eSkevlo 
6705cd48f1eSkevlo /* Host interface command structures */
6715cd48f1eSkevlo struct ngbe_hic_hdr {
6725cd48f1eSkevlo 	uint8_t	cmd;
6735cd48f1eSkevlo 	uint8_t	buf_len;
6745cd48f1eSkevlo 	union {
6755cd48f1eSkevlo 		uint8_t	cmd_resv;
6765cd48f1eSkevlo 		uint8_t	ret_status;
6775cd48f1eSkevlo 	} cmd_or_resp;
6785cd48f1eSkevlo 	uint8_t	checksum;
6795cd48f1eSkevlo };
6805cd48f1eSkevlo 
6815cd48f1eSkevlo struct ngbe_hic_hdr2_req {
6825cd48f1eSkevlo 	uint8_t	cmd;
6835cd48f1eSkevlo 	uint8_t	buf_lenh;
6845cd48f1eSkevlo 	uint8_t	buf_lenl;
6855cd48f1eSkevlo 	uint8_t	checksum;
6865cd48f1eSkevlo };
6875cd48f1eSkevlo 
6885cd48f1eSkevlo struct ngbe_hic_hdr2_rsp {
6895cd48f1eSkevlo 	uint8_t	cmd;
6905cd48f1eSkevlo 	uint8_t	buf_lenl;
6915cd48f1eSkevlo 	uint8_t	buf_lenh_status;
6925cd48f1eSkevlo 	uint8_t	checksum;
6935cd48f1eSkevlo };
6945cd48f1eSkevlo 
6955cd48f1eSkevlo union ngbe_hic_hdr2 {
6965cd48f1eSkevlo 	struct ngbe_hic_hdr2_req	req;
6975cd48f1eSkevlo 	struct ngbe_hic_hdr2_rsp	rsp;
6985cd48f1eSkevlo };
6995cd48f1eSkevlo 
7005cd48f1eSkevlo struct ngbe_hic_drv_info {
7015cd48f1eSkevlo 	struct ngbe_hic_hdr	hdr;
7025cd48f1eSkevlo 	uint8_t			port_num;
7035cd48f1eSkevlo 	uint8_t			ver_sub;
7045cd48f1eSkevlo 	uint8_t			ver_build;
7055cd48f1eSkevlo 	uint8_t			ver_min;
7065cd48f1eSkevlo 	uint8_t			ver_maj;
7075cd48f1eSkevlo 	uint8_t			pad;
7085cd48f1eSkevlo 	uint16_t		pad2;
7095cd48f1eSkevlo };
7105cd48f1eSkevlo 
7115cd48f1eSkevlo struct ngbe_hic_read_shadow_ram {
7125cd48f1eSkevlo 	union ngbe_hic_hdr2	hdr;
7135cd48f1eSkevlo 	uint32_t		address;
7145cd48f1eSkevlo 	uint16_t		length;
7155cd48f1eSkevlo 	uint16_t		pad2;
7165cd48f1eSkevlo 	uint16_t		data;
7175cd48f1eSkevlo 	uint16_t		pad3;
7185cd48f1eSkevlo };
7195cd48f1eSkevlo 
7205cd48f1eSkevlo struct ngbe_osdep {
7215cd48f1eSkevlo 	bus_dma_tag_t		os_dmat;
7225cd48f1eSkevlo 	bus_space_tag_t		os_memt;
7235cd48f1eSkevlo 	bus_space_handle_t	os_memh;
7245cd48f1eSkevlo 
7255cd48f1eSkevlo 	bus_size_t		os_memsize;
7265cd48f1eSkevlo 	bus_addr_t		os_membase;
7275cd48f1eSkevlo 
7285cd48f1eSkevlo 	void			*os_sc;
7295cd48f1eSkevlo 	struct pci_attach_args	os_pa;
7305cd48f1eSkevlo };
7315cd48f1eSkevlo 
7325cd48f1eSkevlo /* Forward declaration. */
7335cd48f1eSkevlo struct ngbe_hw;
7345cd48f1eSkevlo struct ngbe_softc;
7355cd48f1eSkevlo 
7365cd48f1eSkevlo /* Iterator type for walking multicast address lists */
7375cd48f1eSkevlo typedef uint8_t * (*ngbe_mc_addr_itr) (struct ngbe_hw *, uint8_t **, \
7385cd48f1eSkevlo 	uint32_t *);
7395cd48f1eSkevlo 
7405cd48f1eSkevlo struct ngbe_eeprom_operations {
7415cd48f1eSkevlo 	void	(*init_params)(struct ngbe_hw *);
7425cd48f1eSkevlo 	int	(*eeprom_chksum_cap_st)(struct ngbe_softc *, uint16_t,
7435cd48f1eSkevlo 		    uint32_t *);
7445cd48f1eSkevlo 	int	(*phy_led_oem_chk)(struct ngbe_softc *, uint32_t *);
7455cd48f1eSkevlo };
7465cd48f1eSkevlo 
7475cd48f1eSkevlo struct ngbe_mac_operations {
7485cd48f1eSkevlo 	int			(*init_hw)(struct ngbe_softc *);
7495cd48f1eSkevlo 	int			(*reset_hw)(struct ngbe_softc *);
7505cd48f1eSkevlo 	int			(*start_hw)(struct ngbe_softc *);
7515cd48f1eSkevlo 	void			(*clear_hw_cntrs)(struct ngbe_hw *);
7525cd48f1eSkevlo 	enum ngbe_media_type	(*get_media_type)(struct ngbe_hw *);
7535cd48f1eSkevlo 	void			(*get_mac_addr)(struct ngbe_hw *, uint8_t *);
7545cd48f1eSkevlo 	int			(*stop_adapter)(struct ngbe_softc *);
7555cd48f1eSkevlo 	void			(*get_bus_info)(struct ngbe_softc *);
7565cd48f1eSkevlo 	void			(*set_lan_id)(struct ngbe_hw *);
7575cd48f1eSkevlo 	void			(*enable_rx_dma)(struct ngbe_hw *, uint32_t);
7585cd48f1eSkevlo 	void			(*disable_sec_rx_path)(struct ngbe_hw *);
7595cd48f1eSkevlo 	void			(*enable_sec_rx_path)(struct ngbe_hw *);
7605cd48f1eSkevlo 	int			(*acquire_swfw_sync)(struct ngbe_softc *,
7615cd48f1eSkevlo 				    uint32_t);
7625cd48f1eSkevlo 	void			(*release_swfw_sync)(struct ngbe_softc *,
7635cd48f1eSkevlo 				    uint32_t);
7645cd48f1eSkevlo 
7655cd48f1eSkevlo 	/* Link */
7665cd48f1eSkevlo 	int			(*setup_link)(struct ngbe_softc *, uint32_t,
7675cd48f1eSkevlo 				    int);
7685cd48f1eSkevlo 	int			(*check_link)(struct ngbe_hw *, uint32_t *,
7695cd48f1eSkevlo 				    int *, int);
7705cd48f1eSkevlo 	void			(*get_link_capabilities)(struct ngbe_hw *,
7715cd48f1eSkevlo 				    uint32_t *, int *);
7725cd48f1eSkevlo 
7735cd48f1eSkevlo 	/* Packet Buffer manipulation */
7745cd48f1eSkevlo 	void			(*setup_rxpba)(struct ngbe_hw *, int, uint32_t,
7755cd48f1eSkevlo 				    int);
7765cd48f1eSkevlo 
7775cd48f1eSkevlo 	/* RAR, Multicast, VLAN */
7785cd48f1eSkevlo 	int			(*set_rar)(struct ngbe_softc *, uint32_t,
7795cd48f1eSkevlo 				    uint8_t *, uint64_t, uint32_t);
7805cd48f1eSkevlo 	void			(*init_rx_addrs)(struct ngbe_softc *);
7815cd48f1eSkevlo 	void			(*update_mc_addr_list)(struct ngbe_hw *,
7825cd48f1eSkevlo 				    uint8_t *, uint32_t, ngbe_mc_addr_itr, int);
7835cd48f1eSkevlo 
7845cd48f1eSkevlo 	void			(*clear_vfta)(struct ngbe_hw *);
7855cd48f1eSkevlo 	void			(*init_uta_tables)(struct ngbe_hw *);
7865cd48f1eSkevlo 
7875cd48f1eSkevlo 	/* Flow Control */
7885cd48f1eSkevlo 	int			(*fc_enable)(struct ngbe_softc *);
7895cd48f1eSkevlo 	int			(*setup_fc)(struct ngbe_softc *);
7905cd48f1eSkevlo 
7915cd48f1eSkevlo 	/* Manageability interface */
7925cd48f1eSkevlo 	int			(*set_fw_drv_ver)(struct ngbe_softc *, uint8_t,
7935cd48f1eSkevlo 				    uint8_t, uint8_t, uint8_t);
7945cd48f1eSkevlo 	void			(*init_thermal_sensor_thresh)(struct ngbe_hw *);
7955cd48f1eSkevlo 	void			(*disable_rx)(struct ngbe_hw *);
7965cd48f1eSkevlo 	void			(*enable_rx)(struct ngbe_hw *);
7975cd48f1eSkevlo };
7985cd48f1eSkevlo 
7995cd48f1eSkevlo struct ngbe_phy_operations {
8005cd48f1eSkevlo 	int		(*identify)(struct ngbe_softc *);
8015cd48f1eSkevlo 	int		(*init)(struct ngbe_softc *);
8025cd48f1eSkevlo 	int		(*reset)(struct ngbe_softc *);
8035cd48f1eSkevlo 	int		(*read_reg)(struct ngbe_hw *, uint32_t, uint32_t,
8045cd48f1eSkevlo 			    uint16_t *);
8055cd48f1eSkevlo 	int		(*write_reg)(struct ngbe_hw *, uint32_t, uint32_t,
8065cd48f1eSkevlo 			    uint16_t);
8075cd48f1eSkevlo 	int		(*setup_link)(struct ngbe_softc *, uint32_t, int);
8085cd48f1eSkevlo 	void		(*phy_led_ctrl)(struct ngbe_softc *);
8095cd48f1eSkevlo 	int		(*check_overtemp)(struct ngbe_hw *);
8105cd48f1eSkevlo 	void		(*check_event)(struct ngbe_softc *);
8115cd48f1eSkevlo 	void		(*get_adv_pause)(struct ngbe_hw *, uint8_t *);
8125cd48f1eSkevlo 	void		(*get_lp_adv_pause)(struct ngbe_hw *, uint8_t *);
8135cd48f1eSkevlo 	int		(*set_adv_pause)(struct ngbe_hw *, uint16_t);
8145cd48f1eSkevlo 	int		(*setup_once)(struct ngbe_softc *);
8155cd48f1eSkevlo };
8165cd48f1eSkevlo 
8175cd48f1eSkevlo struct ngbe_addr_filter_info {
8185cd48f1eSkevlo 	uint32_t	num_mc_addrs;
8195cd48f1eSkevlo 	uint32_t	rar_used_count;
8205cd48f1eSkevlo 	uint32_t	mta_in_use;
8215cd48f1eSkevlo 	uint32_t	overflow_promisc;
8225cd48f1eSkevlo 	int		user_set_promisc;
8235cd48f1eSkevlo };
8245cd48f1eSkevlo 
8255cd48f1eSkevlo /* Bus parameters */
8265cd48f1eSkevlo struct ngbe_bus_info {
8275cd48f1eSkevlo 	enum ngbe_bus_speed	speed;
8285cd48f1eSkevlo 	enum ngbe_bus_width	width;
8295cd48f1eSkevlo 	enum ngbe_bus_type	type;
8305cd48f1eSkevlo 	uint16_t		lan_id;
8315cd48f1eSkevlo };
8325cd48f1eSkevlo 
8335cd48f1eSkevlo struct ngbe_eeprom_info {
8345cd48f1eSkevlo 	struct ngbe_eeprom_operations	ops;
8355cd48f1eSkevlo 	enum ngbe_eeprom_type		type;
8365cd48f1eSkevlo 	uint16_t			sw_region_offset;
8375cd48f1eSkevlo };
8385cd48f1eSkevlo 
8395cd48f1eSkevlo struct ngbe_mac_info {
8405cd48f1eSkevlo 	struct ngbe_mac_operations	ops;
8415cd48f1eSkevlo 	uint8_t				addr[ETHER_ADDR_LEN];
8425cd48f1eSkevlo 	uint8_t				perm_addr[ETHER_ADDR_LEN];
8435cd48f1eSkevlo 	uint32_t			mta_shadow[NGBE_MAX_MTA];
8445cd48f1eSkevlo 	int				mc_filter_type;
8455cd48f1eSkevlo 	uint32_t			mcft_size;
8465cd48f1eSkevlo 	uint32_t			vft_shadow[NGBE_MAX_VFTA_ENTRIES];
8475cd48f1eSkevlo 	uint32_t			vft_size;
8485cd48f1eSkevlo 	uint32_t			num_rar_entries;
8495cd48f1eSkevlo 	uint32_t			rx_pb_size;
8505cd48f1eSkevlo 	uint32_t			max_tx_queues;
8515cd48f1eSkevlo 	uint32_t			max_rx_queues;
8525cd48f1eSkevlo 	int				autotry_restart;
8535cd48f1eSkevlo 	int				set_lben;
8545cd48f1eSkevlo 	int				autoneg;
8555cd48f1eSkevlo };
8565cd48f1eSkevlo 
8575cd48f1eSkevlo /* Flow control parameters */
8585cd48f1eSkevlo struct ngbe_fc_info {
8595cd48f1eSkevlo 	uint32_t		high_water;
8605cd48f1eSkevlo 	uint32_t		low_water;
8615cd48f1eSkevlo 	uint16_t		pause_time;
8625cd48f1eSkevlo 	int			strict_ieee;
8635cd48f1eSkevlo 	int			disable_fc_autoneg;
8645cd48f1eSkevlo 	int			fc_was_autonegged;
8655cd48f1eSkevlo 	enum ngbe_fc_mode	current_mode;
8665cd48f1eSkevlo 	enum ngbe_fc_mode	requested_mode;
8675cd48f1eSkevlo };
8685cd48f1eSkevlo 
8695cd48f1eSkevlo struct ngbe_phy_info {
8705cd48f1eSkevlo 	struct ngbe_phy_operations	ops;
8715cd48f1eSkevlo 	enum ngbe_phy_type		type;
8725cd48f1eSkevlo 	uint32_t			addr;
8735cd48f1eSkevlo 	uint32_t			id;
8745cd48f1eSkevlo 	uint32_t			phy_semaphore_mask;
8755cd48f1eSkevlo 	enum ngbe_media_type		media_type;
8765cd48f1eSkevlo 	uint32_t			autoneg_advertised;
8775cd48f1eSkevlo 	int				reset_if_overtemp;
8785cd48f1eSkevlo 	uint32_t			force_speed;
8795cd48f1eSkevlo };
8805cd48f1eSkevlo 
8815cd48f1eSkevlo struct ngbe_hw {
8825cd48f1eSkevlo 	void				*back;
8835cd48f1eSkevlo 	struct ngbe_mac_info		mac;
8845cd48f1eSkevlo 	struct ngbe_addr_filter_info	addr_ctrl;
8855cd48f1eSkevlo 	struct ngbe_fc_info		fc;
8865cd48f1eSkevlo 	struct ngbe_phy_info		phy;
8875cd48f1eSkevlo 	struct ngbe_eeprom_info		eeprom;
8885cd48f1eSkevlo 	struct ngbe_bus_info		bus;
8895cd48f1eSkevlo 	uint32_t			subsystem_device_id;
8905cd48f1eSkevlo 	int				adapter_stopped;
8915cd48f1eSkevlo 	enum ngbe_reset_type		reset_type;
8925cd48f1eSkevlo 	int				force_full_reset;
8935cd48f1eSkevlo };
8945cd48f1eSkevlo 
8955cd48f1eSkevlo /* Transmit Descriptor */
8965cd48f1eSkevlo union ngbe_tx_desc {
8975cd48f1eSkevlo 	struct {
8985cd48f1eSkevlo 		uint64_t	buffer_addr;
8995cd48f1eSkevlo 		uint32_t	cmd_type_len;
9005cd48f1eSkevlo 		uint32_t	olinfo_status;
9015cd48f1eSkevlo 	} read;
9025cd48f1eSkevlo 	struct {
9035cd48f1eSkevlo 		uint64_t	rsvd;
9045cd48f1eSkevlo 		uint32_t	nxtseq_seed;
9055cd48f1eSkevlo 		uint32_t	status;
9065cd48f1eSkevlo 	} wb;
9075cd48f1eSkevlo };
9085cd48f1eSkevlo #define NGBE_TXD_DTYP_DATA	0x00000000
9095cd48f1eSkevlo #define NGBE_TXD_DTYP_CTXT	0x00100000
9105cd48f1eSkevlo #define NGBE_TXD_STAT_DD	0x00000001
9115cd48f1eSkevlo #define NGBE_TXD_L4CS		0x00000200
9125cd48f1eSkevlo #define NGBE_TXD_IIPCS		0x00000400
9135cd48f1eSkevlo #define NGBE_TXD_EOP		0x01000000
9145cd48f1eSkevlo #define NGBE_TXD_IFCS		0x02000000
9155cd48f1eSkevlo #define NGBE_TXD_RS		0x08000000
9165cd48f1eSkevlo #define NGBE_TXD_VLE		0x40000000
9175cd48f1eSkevlo #define NGBE_TXD_MACLEN_SHIFT	9
9185cd48f1eSkevlo #define NGBE_TXD_PAYLEN_SHIFT	13
9195cd48f1eSkevlo #define NGBE_TXD_VLAN_SHIFT	16
9205cd48f1eSkevlo 
9215cd48f1eSkevlo #define NGBE_PTYPE_PKT_IPV6	0x08
9225cd48f1eSkevlo #define NGBE_PTYPE_PKT_IP	0x20
9235cd48f1eSkevlo #define NGBE_PTYPE_TYP_IP	0x02
9245cd48f1eSkevlo #define NGBE_PTYPE_TYP_UDP	0x03
9255cd48f1eSkevlo #define NGBE_PTYPE_TYP_TCP	0x04
9265cd48f1eSkevlo 
9275cd48f1eSkevlo /* Receive Descriptor */
9285cd48f1eSkevlo union ngbe_rx_desc {
9295cd48f1eSkevlo 	struct {
9305cd48f1eSkevlo 		uint64_t	pkt_addr;
9315cd48f1eSkevlo 		uint64_t	hdr_addr;
9325cd48f1eSkevlo 	} read;
9335cd48f1eSkevlo 	struct {
9345cd48f1eSkevlo 		struct {
9355cd48f1eSkevlo 			union {
9365cd48f1eSkevlo 				uint32_t	data;
9375cd48f1eSkevlo 				struct {
9385cd48f1eSkevlo 					uint16_t	pkt_info;
9395cd48f1eSkevlo 					uint16_t	hdr_info;
9405cd48f1eSkevlo 				} hs_rss;
9415cd48f1eSkevlo 			} lo_dword;
9425cd48f1eSkevlo 			union {
9435cd48f1eSkevlo 				uint32_t	rss;
9445cd48f1eSkevlo 				struct {
9455cd48f1eSkevlo 					uint16_t	ip_id;
9465cd48f1eSkevlo 					uint16_t	csum;
9475cd48f1eSkevlo 				} csum_ip;
9485cd48f1eSkevlo 			} hi_dword;
9495cd48f1eSkevlo 		} lower;
9505cd48f1eSkevlo 		struct {
9515cd48f1eSkevlo 			uint32_t	status_error;
9525cd48f1eSkevlo 			uint16_t	length;
9535cd48f1eSkevlo 			uint16_t	vlan;
9545cd48f1eSkevlo 		} upper;
9555cd48f1eSkevlo 	} wb;
9565cd48f1eSkevlo };
9575cd48f1eSkevlo #define NGBE_RXD_STAT_DD	0x00000001
9585cd48f1eSkevlo #define NGBE_RXD_STAT_EOP	0x00000002
9595cd48f1eSkevlo #define NGBE_RXD_STAT_VP	0x00000020
9605cd48f1eSkevlo #define NGBE_RXD_STAT_L4CS	0x00000080
9615cd48f1eSkevlo #define NGBE_RXD_STAT_IPCS	0x00000100
9625cd48f1eSkevlo #define NGBE_RXD_ERR_RXE	0x20000000
9635cd48f1eSkevlo #define NGBE_RXD_ERR_TCPE	0x40000000
9645cd48f1eSkevlo #define NGBE_RXD_ERR_IPE	0x80000000
9655cd48f1eSkevlo #define NGBE_RXD_RSSTYPE_MASK	0x0000000f
9665cd48f1eSkevlo 
9675cd48f1eSkevlo /* RSS hash results */
9685cd48f1eSkevlo #define NGBE_RXD_RSSTYPE_NONE	0x00000000
9695cd48f1eSkevlo 
9705cd48f1eSkevlo /* Context descriptor */
9715cd48f1eSkevlo struct ngbe_tx_context_desc {
9725cd48f1eSkevlo 	uint32_t	vlan_macip_lens;
9735cd48f1eSkevlo 	uint32_t	seqnum_seed;
9745cd48f1eSkevlo 	uint32_t	type_tucmd_mlhl;
9755cd48f1eSkevlo 	uint32_t	mss_l4len_idx;
9765cd48f1eSkevlo };
9775cd48f1eSkevlo 
9785cd48f1eSkevlo struct ngbe_tx_buf {
9795cd48f1eSkevlo 	uint32_t	eop_index;
9805cd48f1eSkevlo 	struct mbuf	*m_head;
9815cd48f1eSkevlo 	bus_dmamap_t	map;
9825cd48f1eSkevlo };
9835cd48f1eSkevlo 
9845cd48f1eSkevlo struct ngbe_rx_buf {
9855cd48f1eSkevlo 	struct mbuf	*buf;
9865cd48f1eSkevlo 	struct mbuf	*fmp;
9875cd48f1eSkevlo 	bus_dmamap_t	map;
9885cd48f1eSkevlo };
9895cd48f1eSkevlo 
9905cd48f1eSkevlo struct ngbe_dma_alloc {
9915cd48f1eSkevlo 	caddr_t			dma_vaddr;
9925cd48f1eSkevlo 	bus_dma_tag_t		dma_tag;
9935cd48f1eSkevlo 	bus_dmamap_t		dma_map;
9945cd48f1eSkevlo 	bus_dma_segment_t	dma_seg;
9955cd48f1eSkevlo 	bus_size_t		dma_size;
9965cd48f1eSkevlo 	int			dma_nseg;
9975cd48f1eSkevlo };
9985cd48f1eSkevlo 
9995cd48f1eSkevlo struct tx_ring {
10005cd48f1eSkevlo 	struct ngbe_softc	*sc;
10015cd48f1eSkevlo 	struct ifqueue		*ifq;
10025cd48f1eSkevlo 	uint32_t		me;
10035cd48f1eSkevlo 	uint32_t		watchdog_timer;
10045cd48f1eSkevlo 	union ngbe_tx_desc	*tx_base;
10055cd48f1eSkevlo 	struct ngbe_tx_buf	*tx_buffers;
10065cd48f1eSkevlo 	struct ngbe_dma_alloc	txdma;
10075cd48f1eSkevlo 	uint32_t		next_avail_desc;
10085cd48f1eSkevlo 	uint32_t		next_to_clean;
10095cd48f1eSkevlo 	bus_dma_tag_t		txtag;
10105cd48f1eSkevlo };
10115cd48f1eSkevlo 
10125cd48f1eSkevlo struct rx_ring {
10135cd48f1eSkevlo 	struct ngbe_softc	*sc;
10145cd48f1eSkevlo 	struct ifiqueue		*ifiq;
10155cd48f1eSkevlo 	uint32_t		me;
10165cd48f1eSkevlo 	union ngbe_rx_desc	*rx_base;
10175cd48f1eSkevlo 	struct ngbe_rx_buf	*rx_buffers;
10185cd48f1eSkevlo 	struct ngbe_dma_alloc	rxdma;
10195cd48f1eSkevlo 	uint32_t		last_desc_filled;
10205cd48f1eSkevlo 	uint32_t		next_to_check;
10215cd48f1eSkevlo 	struct timeout		rx_refill;
10225cd48f1eSkevlo 	struct if_rxring	rx_ring;
10235cd48f1eSkevlo };
10245cd48f1eSkevlo 
10255cd48f1eSkevlo struct ngbe_queue {
10265cd48f1eSkevlo 	struct ngbe_softc	*sc;
10275cd48f1eSkevlo 	uint32_t		msix;
10285cd48f1eSkevlo 	uint32_t		eims;
10295cd48f1eSkevlo 	char			name[16];
10305cd48f1eSkevlo 	pci_intr_handle_t	ih;
10315cd48f1eSkevlo 	void			*tag;
10325cd48f1eSkevlo 	struct tx_ring		*txr;
10335cd48f1eSkevlo 	struct rx_ring		*rxr;
10345cd48f1eSkevlo };
10355cd48f1eSkevlo 
10365cd48f1eSkevlo struct ngbe_softc {
10375cd48f1eSkevlo 	struct device		sc_dev;
10385cd48f1eSkevlo 	struct arpcom		sc_ac;
10395cd48f1eSkevlo 	struct ifmedia		sc_media;
10405cd48f1eSkevlo 	struct intrmap		*sc_intrmap;
10415cd48f1eSkevlo 
10425cd48f1eSkevlo 	struct ngbe_osdep	osdep;
10435cd48f1eSkevlo 	struct ngbe_hw		hw;
10445cd48f1eSkevlo 
10455cd48f1eSkevlo 	void			*tag;
10465cd48f1eSkevlo 
10475cd48f1eSkevlo 	uint32_t		led_conf;
10485cd48f1eSkevlo 	uint32_t		gphy_efuse[2];
10495cd48f1eSkevlo 	uint32_t		link_speed;
10505cd48f1eSkevlo 	uint32_t		linkvec;
10515cd48f1eSkevlo 	int			link_up;
10525cd48f1eSkevlo 
10535cd48f1eSkevlo 	int			num_tx_desc;
10545cd48f1eSkevlo 	int			num_rx_desc;
10555cd48f1eSkevlo 
10565cd48f1eSkevlo 	struct ngbe_dma_alloc	isbdma;
10575cd48f1eSkevlo 	uint32_t		*isb_base;
10585cd48f1eSkevlo 
10595cd48f1eSkevlo 	unsigned int		sc_nqueues;
10605cd48f1eSkevlo 	struct ngbe_queue	*queues;
10615cd48f1eSkevlo 
10625cd48f1eSkevlo 	struct tx_ring          *tx_rings;
10635cd48f1eSkevlo 	struct rx_ring          *rx_rings;
10645cd48f1eSkevlo 
10655cd48f1eSkevlo 	/* Multicast array memory */
10665cd48f1eSkevlo 	uint8_t			*mta;
10675cd48f1eSkevlo };
10685cd48f1eSkevlo 
10695cd48f1eSkevlo #define DEVNAME(_sc)	((_sc)->sc_dev.dv_xname)
10705cd48f1eSkevlo 
10715cd48f1eSkevlo #define NGBE_FAILED_READ_REG	0xffffffff
10725cd48f1eSkevlo 
10735cd48f1eSkevlo /* Register READ/WRITE macros */
10745cd48f1eSkevlo #define	NGBE_WRITE_FLUSH(a)						\
10755cd48f1eSkevlo 	NGBE_READ_REG(a, NGBE_MIS_PWR)
10765cd48f1eSkevlo #define NGBE_READ_REG(a, reg)						\
10775cd48f1eSkevlo 	bus_space_read_4(((struct ngbe_osdep *)(a)->back)->os_memt,	\
10785cd48f1eSkevlo 	((struct ngbe_osdep *)(a)->back)->os_memh, reg)
10795cd48f1eSkevlo #define NGBE_WRITE_REG(a, reg, value)					\
10805cd48f1eSkevlo 	bus_space_write_4(((struct ngbe_osdep *)(a)->back)->os_memt,	\
10815cd48f1eSkevlo 	((struct ngbe_osdep *)(a)->back)->os_memh, reg, value)
10825cd48f1eSkevlo #define NGBE_READ_REG_ARRAY(a, reg, offset)				\
10835cd48f1eSkevlo 	bus_space_read_4(((struct ngbe_osdep *)(a)->back)->os_memt,	\
10845cd48f1eSkevlo 	((struct ngbe_osdep *)(a)->back)->os_memh, (reg + ((offset) << 2)))
10855cd48f1eSkevlo #define NGBE_WRITE_REG_ARRAY(a, reg, offset, value)			\
10865cd48f1eSkevlo 	bus_space_write_4(((struct ngbe_osdep *)(a)->back)->os_memt,	\
10875cd48f1eSkevlo 	((struct ngbe_osdep *)(a)->back)->os_memh, 			\
10885cd48f1eSkevlo 	(reg + ((offset) << 2)), value)
1089