src/sys/dev/pci/if_ngbereg.h

1088 lines
29 KiB
C

/* $OpenBSD: if_ngbereg.h,v 1.1 2023/03/31 08:19:41 kevlo Exp $ */
/*
* Copyright (c) 2015-2017 Beijing WangXun Technology Co., Ltd.
* Copyright (c) 2023 Kevin Lo <kevlo@openbsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#define NGBE_PCIREG PCI_MAPREG_START /* BAR 0 */
#define NGBE_MAX_VECTORS 8
#define NGBE_SP_MAX_TX_QUEUES 8
#define NGBE_SP_MAX_RX_QUEUES 8
#define NGBE_SP_RAR_ENTRIES 32
#define NGBE_SP_MC_TBL_SIZE 128
#define NGBE_SP_VFT_TBL_SIZE 128
#define NGBE_SP_RX_PB_SIZE 42
#define NGBE_PSR_VLAN_SWC_ENTRIES 32
#define NGBE_MAX_MTA 128
#define NGBE_MAX_VFTA_ENTRIES 128
#define NGBE_MAX_INTS_PER_SEC 8000
#define NGBE_MAX_JUMBO_FRAME_SIZE 9432
#define NGBE_TX_TIMEOUT 5
#define NGBE_LINK_UP_TIME 90
#define NGBE_MAX_FLASH_LOAD_POLL_TIME 10
/* Additional bittime to account for NGBE framing */
#define NGBE_ETH_FRAMING 20
/* Tx/Rx descriptor defines */
#define NGBE_DEFAULT_TXD 512
#define NGBE_DEFAULT_RXD 512
/* Flow control */
#define NGBE_DEFAULT_FCPAUSE 0xffff
/* Flow control defines */
#define NGBE_TAF_SYM_PAUSE 0x1
#define NGBE_TAF_ASM_PAUSE 0x2
/* Interrupt Registers */
#define NGBE_PX_MISC_IC 0x00100
#define NGBE_PX_MISC_IEN 0x00108
#define NGBE_PX_GPIE 0x00118
#define NGBE_PX_IC 0x00120
#define NGBE_PX_IMS 0x00140
#define NGBE_PX_IMC 0x00150
#define NGBE_PX_ISB_ADDR_L 0x00160
#define NGBE_PX_ISB_ADDR_H 0x00164
#define NGBE_PX_TRANSACTION_PENDING 0x00168
#define NGBE_PX_ITRSEL 0x00180
#define NGBE_PX_ITR(_i) (0x00200 + (_i) * 4)
#define NGBE_PX_MISC_IVAR 0x004fc
#define NGBE_PX_IVAR(_i) (0x00500 + (_i) * 4)
/* Receive DMA Registers */
#define NGBE_PX_RR_BAL(_i) (0x01000 + ((_i) * 0x40))
#define NGBE_PX_RR_BAH(_i) (0x01004 + ((_i) * 0x40))
#define NGBE_PX_RR_WP(_i) (0x01008 + ((_i) * 0x40))
#define NGBE_PX_RR_RP(_i) (0x0100c + ((_i) * 0x40))
#define NGBE_PX_RR_CFG(_i) (0x01010 + ((_i) * 0x40))
/* Statistic */
#define NGBE_PX_MPRC(_i) (0x01020 + ((_i) * 64))
/* Transmit DMA Registers */
#define NGBE_PX_TR_BAL(_i) (0x03000 + ((_i) * 0x40))
#define NGBE_PX_TR_BAH(_i) (0x03004 + ((_i) * 0x40))
#define NGBE_PX_TR_WP(_i) (0x03008 + ((_i) * 0x40))
#define NGBE_PX_TR_RP(_i) (0x0300c + ((_i) * 0x40))
#define NGBE_PX_TR_CFG(_i) (0x03010 + ((_i) * 0x40))
/* Chip Control Registers */
#define NGBE_MIS_PWR 0x10000
#define NGBE_MIS_RST 0x1000c
#define NGBE_MIS_PRB_CTL 0x10010
#define NGBE_MIS_ST 0x10028
#define NGBE_MIS_SWSM 0x1002c
#define NGBE_MIS_RST_ST 0x10030
/* FMGR Registers */
#define NGBE_SPI_CMD 0x10104
#define NGBE_SPI_DATA 0x10108
#define NGBE_SPI_STATUS 0x1010c
#define NGBE_SPI_ILDR_STATUS 0x10120
/* Checksum and EEPROM Registers */
#define NGBE_CALSUM_CAP_STATUS 0x10224
#define NGBE_EEPROM_VERSION_STORE_REG 0x1022c
/* Sensors for PVT(Process Voltage Temperature) */
#define NGBE_TS_EN 0x10304
#define NGBE_TS_ALARM_THRE 0x1030c
#define NGBE_TS_DALARM_THRE 0x10310
#define NGBE_TS_INT_EN 0x10314
#define NGBE_TS_ALARM_ST 0x10318
/* MAC Registers */
#define NGBE_MAC_TX_CFG 0x11000
#define NGBE_MAC_RX_CFG 0x11004
#define NGBE_MAC_PKT_FLT 0x11008
#define NGBE_MAC_WDG_TIMEOUT 0x1100c
#define NGBE_MAC_RX_FLOW_CTRL 0x11090
/* Media-dependent registers. */
#define NGBE_MDIO_CLAUSE_SELECT 0x11220
/* Statistic */
#define NGBE_MMC_CONTROL 0x11800
#define NGBE_TX_FRAME_CNT_GOOD_BAD_LOW 0x1181c
#define NGBE_TX_BC_FRAMES_GOOD_LOW 0x11824
#define NGBE_TX_MC_FRAMES_GOOD_LOW 0x1182c
#define NGBE_RX_FRAME_CNT_GOOD_BAD_LOW 0x11900
#define NGBE_RX_BC_FRAMES_GOOD_LOW 0x11918
#define NGBE_RX_CRC_ERROR_FRAMES_LOW 0x11928
#define NGBE_RX_UNDERSIZE_FRAMES_GOOD 0x11938
#define NGBE_RX_OVERSIZE_FRAMES_GOOD 0x1193c
#define NGBE_RX_LEN_ERROR_FRAMES_LOW 0x11978
#define NGBE_MAC_LXOFFRXC 0x11988
#define NGBE_MAC_PXOFFRXC 0x119dc
/* Interrupt Registers */
#define NGBE_BME_CTL 0x12020
/* Statistic */
#define NGBE_RDM_DRP_PKT 0x12500
#define NGBE_PX_GPRC 0x12504
#define NGBE_PX_GORC_MSB 0x1250c
/* Internal phy reg_offset [0,31] */
#define NGBE_PHY_CONFIG(offset) (0x14000 + ((offset) * 4))
/* Port cfg Registers */
#define NGBE_CFG_PORT_CTL 0x14400
#define NGBE_CFG_PORT_ST 0x14404
#define NGBE_CFG_LAN_SPEED 0x14440
/* GPIO Registers */
#define NGBE_GPIO_DDR 0x14804
#define NGBE_GPIO_INTEN 0x14830
#define NGBE_GPIO_INTTYPE_LEVEL 0x14838
#define NGBE_GPIO_POLARITY 0x1483c
#define NGBE_GPIO_INTSTATUS 0x14840
#define NGBE_GPIO_EOI 0x1484c
/* PSR Control Registers */
#define NGBE_PSR_CTL 0x15000
#define NGBE_PSR_MAX_SZ 0x15020
#define NGBE_PSR_VLAN_CTL 0x15088
/* mcasst/ucast overflow tbl */
#define NGBE_PSR_MC_TBL(_i) (0x15200 + ((_i) * 4))
#define NGBE_PSR_UC_TBL(_i) (0x15400 + ((_i) * 4))
/* Management Registers */
#define NGBE_PSR_MNG_FLEX_SEL 0x1582c
#define NGBE_PSR_MNG_FLEX_DW_L(_i) (0x15a00 + ((_i) * 16))
#define NGBE_PSR_MNG_FLEX_DW_H(_i) (0x15a04 + ((_i) * 16))
#define NGBE_PSR_MNG_FLEX_MSK(_i) (0x15a08 + ((_i) * 16))
/* Wake Up Registers */
#define NGBE_PSR_LAN_FLEX_SEL 0x15b8c
#define NGBE_PSR_LAN_FLEX_DW_L(_i) (0x15c00 + ((_i) * 16))
#define NGBE_PSR_LAN_FLEX_DW_H(_i) (0x15c04 + ((_i) * 16))
#define NGBE_PSR_LAN_FLEX_MSK(_i) (0x15c08 + ((_i) * 16))
/* VLAN tbl */
#define NGBE_PSR_VLAN_TBL(_i) (0x16000 + ((_i) * 4))
/* MAC switcher */
#define NGBE_PSR_MAC_SWC_AD_L 0x16200
#define NGBE_PSR_MAC_SWC_AD_H 0x16204
#define NGBE_PSR_MAC_SWC_VM 0x16208
#define NGBE_PSR_MAC_SWC_IDX 0x16210
/* VLAN switch */
#define NGBE_PSR_VLAN_SWC 0x16220
#define NGBE_PSR_VLAN_SWC_VM_L 0x16224
#define NGBE_PSR_VLAN_SWC_IDX 0x16230
/* RSEC Registers */
#define NGBE_RSEC_CTL 0x17000
#define NGBE_RSEC_ST 0x17004
/* Transmit Global Control Registers */
#define NGBE_TDM_CTL 0x18000
#define NGBE_TDM_PB_THRE 0x18020
/* Statistic */
#define NGBE_PX_GPTC 0x18308
#define NGBE_PX_GOTC_MSB 0x18310
/* Receive packet buffer */
#define NGBE_RDB_PB_CTL 0x19000
#define NGBE_RDB_PB_SZ 0x19020
#define NGBE_RDB_RFCV 0x19200
/* Statistic */
#define NGBE_RDB_PFCMACDAL 0x19210
#define NGBE_RDB_PFCMACDAH 0x19214
#define NGBE_RDB_LXONTXC 0x1921c
#define NGBE_RDB_LXOFFTXC 0x19218
/* Flow Control Registers */
#define NGBE_RDB_RFCL 0x19220
#define NGBE_RDB_RFCH 0x19260
#define NGBE_RDB_RFCRT 0x192a0
#define NGBE_RDB_RFCC 0x192a4
/* Ring Assignment */
#define NGBE_RDB_PL_CFG(_i) (0x19300 + ((_i) * 4))
#define NGBE_RDB_RSSTBL(_i) (0x19400 + ((_i) * 4))
#define NGBE_RDB_RSSRK(_i) (0x19480 + ((_i) * 4))
#define NGBE_RDB_RA_CTL 0x194f4
/* TDB */
#define NGBE_TDB_PB_SZ 0x1cc00
/* Security Control Registers */
#define NGBE_TSEC_CTL 0x1d000
#define NGBE_TSEC_BUF_AE 0x1d00c
/* MNG */
#define NGBE_MNG_SWFW_SYNC 0x1e008
#define NGBE_MNG_MBOX 0x1e100
#define NGBE_MNG_MBOX_CTL 0x1e044
/* Bits in NGBE_PX_MISC_IC register */
#define NGBE_PX_MISC_IC_PHY 0x00040000
#define NGBE_PX_MISC_IC_GPIO 0x04000000
/* Bits in NGBE_PX_MISC_IEN register */
#define NGBE_PX_MISC_IEN_ETH_LKDN 0x00000100
#define NGBE_PX_MISC_IEN_DEV_RST 0x00000400
#define NGBE_PX_MISC_IEN_STALL 0x00001000
#define NGBE_PX_MISC_IEN_ETH_EVENT 0x00020000
#define NGBE_PX_MISC_IEN_ETH_LK 0x00040000
#define NGBE_PX_MISC_IEN_ETH_AN 0x00080000
#define NGBE_PX_MISC_IEN_INT_ERR 0x00100000
#define NGBE_PX_MISC_IEN_VF_MBOX 0x00800000
#define NGBE_PX_MISC_IEN_GPIO 0x04000000
#define NGBE_PX_MISC_IEN_PCIE_REQ_ERR 0x08000000
#define NGBE_PX_MISC_IEN_OVER_HEAT 0x10000000
#define NGBE_PX_MISC_IEN_MNG_HOST_MBOX 0x40000000
#define NGBE_PX_MISC_IEN_TIMER 0x80000000
#define NGBE_PX_MISC_IEN_MASK \
(NGBE_PX_MISC_IEN_ETH_LKDN | NGBE_PX_MISC_IEN_DEV_RST | \
NGBE_PX_MISC_IEN_STALL | NGBE_PX_MISC_IEN_ETH_EVENT | \
NGBE_PX_MISC_IEN_ETH_LK | NGBE_PX_MISC_IEN_ETH_AN | \
NGBE_PX_MISC_IEN_INT_ERR | NGBE_PX_MISC_IEN_VF_MBOX | \
NGBE_PX_MISC_IEN_GPIO | NGBE_PX_MISC_IEN_PCIE_REQ_ERR | \
NGBE_PX_MISC_IEN_MNG_HOST_MBOX | NGBE_PX_MISC_IEN_TIMER)
/* Bits in NGBE_PX_GPIE register */
#define NGBE_PX_GPIE_MODEL 0x00000001
/* Bits in NGBE_PX_ITR register */
#define NGBE_MAX_EITR 0x00007ffc
#define NGBE_PX_ITR_CNT_WDIS 0x80000000
/* Bits in NGBE_PX_IVAR register */
#define NGBE_PX_IVAR_ALLOC_VAL 0x80
/* Bits in NGBE_PX_RR_CFG register */
#define NGBE_PX_RR_CFG_RR_EN 0x00000001
#define NGBE_PX_RR_CFG_SPLIT_MODE 0x04000000
#define NGBE_PX_RR_CFG_DROP_EN 0x40000000
#define NGBE_PX_RR_CFG_VLAN 0x80000000
#define NGBE_PX_RR_CFG_RR_BUF_SZ 0x00000f00
#define NGBE_PX_RR_CFG_RR_HDR_SZ 0x0000f000
#define NGBE_PX_RR_CFG_RR_SIZE_SHIFT 1
#define NGBE_PX_RR_CFG_BSIZEPKT_SHIFT 2
#define NGBE_PX_RR_CFG_RR_THER_SHIFT 16
/* Bits in NGBE_PX_TR_CFG register */
#define NGBE_PX_TR_CFG_ENABLE (1)
#define NGBE_PX_TR_CFG_SWFLSH 0x04000000
#define NGBE_PX_TR_CFG_TR_SIZE_SHIFT 1
#define NGBE_PX_TR_CFG_WTHRESH_SHIFT 16
/* Bits in NGBE_MIS_RST register */
#define NGBE_MIS_RST_SW_RST 0x00000001
#define NGBE_MIS_RST_LAN0_RST 0x00000002
#define NGBE_MIS_RST_LAN1_RST 0x00000004
#define NGBE_MIS_RST_LAN2_RST 0x00000008
#define NGBE_MIS_RST_LAN3_RST 0x00000010
/* Bits in NGBE_MIS_PRB_CTL register */
#define NGBE_MIS_PRB_CTL_LAN3_UP 0x1
#define NGBE_MIS_PRB_CTL_LAN2_UP 0x2
#define NGBE_MIS_PRB_CTL_LAN1_UP 0x4
#define NGBE_MIS_PRB_CTL_LAN0_UP 0x8
/* Bits in NGBE_MIS_ST register */
#define NGBE_MIS_ST_MNG_INIT_DN 0x00000001
#define NGBE_MIS_ST_MNG_VETO 0x00000100
#define NGBE_MIS_ST_LAN0_ECC 0x00010000
#define NGBE_MIS_ST_LAN1_ECC 0x00020000
#define NGBE_MIS_ST_GPHY_IN_RST(_r) (0x00000200 << (_r))
/* Bits in NGBE_MIS_SWSM register */
#define NGBE_MIS_SWSM_SMBI 1
/* Bits in NGBE_MIS_RST_ST register */
#define NGBE_MIS_RST_ST_RST_INIT 0x0000ff00
#define NGBE_MIS_RST_ST_RST_INI_SHIFT 8
#define NGBE_MIS_RST_ST_DEV_RST_ST_MASK 0x00180000
/* Bits in NGBE_SPI_STATUS register */
#define NGBE_SPI_STATUS_FLASH_BYPASS 0x80000000
/* Bits in NGBE_SPI_ILDR_STATUS register */
#define NGBE_SPI_ILDR_STATUS_PERST 0x00000001
#define NGBE_SPI_ILDR_STATUS_PWRRST 0x00000002
#define NGBE_SPI_ILDR_STATUS_SW_RESET 0x00000800
/* Bits in NGBE_TS_EN register */
#define NGBE_TS_EN_ENA 0x00000001
/* Bits in NGBE_TS_INT_EN register */
#define NGBE_TS_INT_EN_ALARM_INT_EN 0x00000001
#define NGBE_TS_INT_EN_DALARM_INT_EN 0x00000002
/* Bits in NGBE_TS_ALARM_ST register */
#define NGBE_TS_ALARM_ST_DALARM 0x00000002
#define NGBE_TS_ALARM_ST_ALARM 0x00000001
/* Bits in NGBE_MAC_TX_CFG register */
#define NGBE_MAC_TX_CFG_TE 0x00000001
#define NGBE_MAC_TX_CFG_SPEED_MASK 0x60000000
#define NGBE_MAC_TX_CFG_SPEED_1G 0x60000000
/* Bits in NGBE_MAC_RX_CFG register */
#define NGBE_MAC_RX_CFG_RE 0x00000001
#define NGBE_MAC_RX_CFG_JE 0x00000100
/* Bits in NGBE_MAC_PKT_FLT register */
#define NGBE_MAC_PKT_FLT_PR 0x00000001
#define NGBE_MAC_PKT_FLT_RA 0x80000000
/* Bits in NGBE_MAC_RX_FLOW_CTRL register */
#define NGBE_MAC_RX_FLOW_CTRL_RFE 0x00000001
/* Bits in NGBE_MMC_CONTROL register */
#define NGBE_MMC_CONTROL_RSTONRD 0x4
#define NGBE_MMC_CONTROL_UP 0x700
/* Bits in NGBE_CFG_PORT_CTL register */
#define NGBE_CFG_PORT_CTL_DRV_LOAD 0x00000008
#define NGBE_CFG_PORT_CTL_PFRSTD 0x00004000
/* Bits in NGBE_CFG_PORT_ST register */
#define NGBE_CFG_PORT_ST_LAN_ID(_r) ((0x00000300 & (_r)) >> 8)
/* Bits in NGBE_PSR_CTL register */
#define NGBE_PSR_CTL_MO 0x00000060
#define NGBE_PSR_CTL_MFE 0x00000080
#define NGBE_PSR_CTL_MPE 0x00000100
#define NGBE_PSR_CTL_UPE 0x00000200
#define NGBE_PSR_CTL_BAM 0x00000400
#define NGBE_PSR_CTL_PCSD 0x00002000
#define NGBE_PSR_CTL_SW_EN 0x00040000
#define NGBE_PSR_CTL_MO_SHIFT 5
/* Bits in NGBE_PSR_VLAN_CTL register */
#define NGBE_PSR_VLAN_CTL_CFIEN 0x20000000
#define NGBE_PSR_VLAN_CTL_VFE 0x40000000
/* Bits in NGBE_PSR_MAC_SWC_AD_H register */
#define NGBE_PSR_MAC_SWC_AD_H_AV 0x80000000
#define NGBE_PSR_MAC_SWC_AD_H_AD(v) (((v) & 0xffff))
#define NGBE_PSR_MAC_SWC_AD_H_ADTYPE(v) (((v) & 0x1) << 30)
/* Bits in NGBE_RSEC_CTL register */
#define NGBE_RSEC_CTL_RX_DIS 0x00000002
#define NGBE_RSEC_CTL_CRC_STRIP 0x00000004
/* Bits in NGBE_RSEC_ST register */
#define NGBE_RSEC_ST_RSEC_RDY 0x00000001
/* Bits in NGBE_TDM_CTL register */
#define NGBE_TDM_CTL_TE 0x1
/* Bits in NGBE_TDM_PB_THRE register */
#define NGBE_TXPKT_SIZE_MAX 0xa
/* Bits in NGBE_RDB_PB_CTL register */
#define NGBE_RDB_PB_CTL_PBEN 0x80000000
#define NGBE_RDB_PB_SZ_SHIFT 10
/* Bits in NGBE_RDB_RFCC register */
#define NGBE_RDB_RFCC_RFCE_802_3X 0x00000008
/* Bits in RFCL register */
#define NGBE_RDB_RFCL_XONE 0x80000000
/* Bits in RFCH register */
#define NGBE_RDB_RFCH_XOFFE 0x80000000
/* Bits in NGBE_RDB_PL_CFG register */
#define NGBE_RDB_PL_CFG_L4HDR 0x2
#define NGBE_RDB_PL_CFG_L3HDR 0x4
#define NGBE_RDB_PL_CFG_L2HDR 0x8
#define NGBE_RDB_PL_CFG_TUN_TUNHDR 0x10
#define NGBE_RDB_PL_CFG_TUN_OUTER_L2HDR 0x20
/* Bits in NGBE_RDB_RA_CTL register */
#define NGBE_RDB_RA_CTL_RSS_EN 0x00000004
#define NGBE_RDB_RA_CTL_RSS_IPV4_TCP 0x00010000
#define NGBE_RDB_RA_CTL_RSS_IPV4 0x00020000
#define NGBE_RDB_RA_CTL_RSS_IPV6 0x00100000
#define NGBE_RDB_RA_CTL_RSS_IPV6_TCP 0x00200000
/* Bits in NGBE_TDB_PB register */
#define NGBE_TDB_PB_SZ_MAX 0x00005000
/* NGBE_MNG_SWFW_SYNC definitions */
#define NGBE_MNG_SWFW_SYNC_SW_PHY 0x0001
#define NGBE_MNG_SWFW_SYNC_SW_MB 0x0004
/* Bits in NGBE_MNG_MBOX_CTL register */
#define NGBE_MNG_MBOX_CTL_SWRDY 0x1
#define NGBE_MNG_MBOX_CTL_FWRDY 0x4
#define NGBE_CHECKSUM_CAP_ST_PASS 0x80658383
#define NGBE_CHECKSUM_CAP_ST_FAIL 0x70657376
#define NGBE_CALSUM_COMMAND 0xe9
#define RGMII_FPGA 0x0080
#define OEM_MASK 0x00ff
/* PHY register definitions */
#define NGBE_MDIO_AUTO_NEG_STATUS 0x1a
#define NGBE_MDIO_AUTO_NEG_LSC 0x1d
/* Internal PHY control */
#define NGBE_INTERNAL_PHY_PAGE_OFFSET 0xa43
#define NGBE_INTERNAL_PHY_PAGE_SELECT_OFFSET 31
#define NGBE_INTERNAL_PHY_ID 0x000732
#define NGBE_INTPHY_INT_ANC 0x0008
#define NGBE_INTPHY_INT_LSC 0x0010
/* PHY mdi standard config */
#define NGBE_MDI_PHY_ID1_OFFSET 2
#define NGBE_MDI_PHY_ID2_OFFSET 3
#define NGBE_MDI_PHY_ID_MASK 0xfffffc00
#define NGBE_MDI_PHY_SPEED_SELECT1 0x0040
#define NGBE_MDI_PHY_DUPLEX 0x0100
#define NGBE_MDI_PHY_RESTART_AN 0x0200
#define NGBE_MDI_PHY_ANE 0x1000
#define NGBE_MDI_PHY_SPEED_SELECT0 0x2000
#define NGBE_MDI_PHY_RESET 0x8000
#define NGBE_PHY_RST_WAIT_PERIOD 50
#define NGBE_SR_AN_MMD_ADV_REG1_PAUSE_SYM 0x400
#define NGBE_SR_AN_MMD_ADV_REG1_PAUSE_ASM 0x800
#define SPI_CMD_READ_DWORD 1
#define SPI_CLK_DIV 3
#define SPI_CLK_DIV_OFFSET 25
#define SPI_CLK_CMD_OFFSET 28
#define SPI_TIME_OUT_VALUE 10000
/* PCI bus info */
#define NGBE_PCI_LINK_STATUS 0xb2
#define NGBE_PCI_LINK_WIDTH 0x3f0
#define NGBE_PCI_LINK_WIDTH_1 0x10
#define NGBE_PCI_LINK_WIDTH_2 0x20
#define NGBE_PCI_LINK_WIDTH_4 0x40
#define NGBE_PCI_LINK_WIDTH_8 0x80
#define NGBE_PCI_LINK_SPEED 0xf
#define NGBE_PCI_LINK_SPEED_2500 0x1
#define NGBE_PCI_LINK_SPEED_5000 0x2
#define NGBE_PCI_LINK_SPEED_8000 0x3
/* Number of 100 microseconds we wait for PCI Express master disable */
#define NGBE_PCI_MASTER_DISABLE_TIMEOUT 800
/* Check whether address is multicast. This is little-endian specific check. */
#define NGBE_IS_MULTICAST(Address) \
(int)(((uint8_t *)(Address))[0] & ((uint8_t)0x01))
/* Check whether an address is broadcast. */
#define NGBE_IS_BROADCAST(Address) \
((((uint8_t *)(Address))[0] == ((uint8_t)0xff)) && \
(((uint8_t *)(Address))[1] == ((uint8_t)0xff)))
/* Link speed */
#define NGBE_LINK_SPEED_UNKNOWN 0
#define NGBE_LINK_SPEED_100_FULL 1
#define NGBE_LINK_SPEED_1GB_FULL 2
#define NGBE_LINK_SPEED_10_FULL 8
#define NGBE_LINK_SPEED_AUTONEG \
(NGBE_LINK_SPEED_100_FULL | NGBE_LINK_SPEED_1GB_FULL | \
NGBE_LINK_SPEED_10_FULL)
#define NGBE_HI_MAX_BLOCK_BYTE_LENGTH 256
#define NGBE_HI_COMMAND_TIMEOUT 5000
/* CEM support */
#define FW_CEM_CMD_RESERVED 0x0
#define FW_CEM_RESP_STATUS_SUCCESS 0x1
#define FW_CEM_HDR_LEN 0x4
#define FW_CEM_CMD_DRIVER_INFO 0xdd
#define FW_CEM_CMD_DRIVER_INFO_LEN 0x5
#define FW_EEPROM_CHECK_STATUS 0xe9
#define FW_PHY_LED_CONF 0xf1
#define FW_DEFAULT_CHECKSUM 0xff
#define FW_CEM_MAX_RETRIES 3
#define NGBE_MAX_SCATTER 32
#define NGBE_TSO_SIZE 32767
#define NGBE_MAX_RX_DESC_POLL 10
/* Packet buffer allocation strategies */
#define PBA_STRATEGY_EQUAL 0
#define PBA_STRATEGY_WEIGHTED 1
/* BitTimes (BT) conversion */
#define NGBE_BT2KB(BT) ((BT + (8 * 1024 - 1)) / (8 * 1024))
#define NGBE_B2BT(BT) (BT * 8)
/* Calculate Delay to respond to PFC */
#define NGBE_PFC_D 672
/* Calculate Cable Delay */
#define NGBE_CABLE_DC 5556
/* Calculate Interface Delay */
#define NGBE_PHY_D 12800
#define NGBE_MAC_D 4096
#define NGBE_XAUI_D (2 * 1024)
#define NGBE_ID (NGBE_MAC_D + NGBE_XAUI_D + NGBE_PHY_D)
/* Calculate Delay incurred from higher layer */
#define NGBE_HD 6144
/* Calculate PCI Bus delay for low thresholds */
#define NGBE_PCI_DELAY 10000
/* Calculate delay value in bit times */
#define NGBE_DV(_max_frame_link, _max_frame_tc) \
((36 * (NGBE_B2BT(_max_frame_link) + NGBE_PFC_D + \
(2 * NGBE_CABLE_DC) + (2 * NGBE_ID) + NGBE_HD) / 25 + 1) + \
2 * NGBE_B2BT(_max_frame_tc))
/* Calculate low threshold delay values */
#define NGBE_LOW_DV_X540(_max_frame_tc) \
(2 * NGBE_B2BT(_max_frame_tc) + (36 * NGBE_PCI_DELAY / 25) + 1)
#define NGBE_LOW_DV(_max_frame_tc) \
(2 * NGBE_LOW_DV_X540(_max_frame_tc))
/* Compatibility glue. */
#define msec_delay(x) DELAY(1000 * (x))
#define roundup2(size, unit) (((size) + (unit) - 1) & ~((unit) - 1))
#define le32_to_cpup(x) (le32toh(*(const uint32_t *)(x)))
#define le32_to_cpus(x) \
do { *((uint32_t *)(x)) = le32_to_cpup((x)); } while (0)
enum ngbe_media_type {
ngbe_media_type_unknown = 0,
ngbe_media_type_fiber,
ngbe_media_type_copper,
ngbe_media_type_backplane,
ngbe_media_type_virtual
};
/* Flow Control Settings */
enum ngbe_fc_mode {
ngbe_fc_none = 0,
ngbe_fc_rx_pause,
ngbe_fc_tx_pause,
ngbe_fc_full,
ngbe_fc_default
};
enum ngbe_eeprom_type {
ngbe_eeprom_uninitialized = 0,
ngbe_eeprom_spi,
ngbe_flash,
ngbe_eeprom_none /* No NVM support */
};
enum ngbe_phy_type {
ngbe_phy_unknown = 0,
ngbe_phy_none,
ngbe_phy_internal,
};
enum ngbe_reset_type {
NGBE_LAN_RESET = 0,
NGBE_SW_RESET,
NGBE_GLOBAL_RESET
};
enum ngbe_isb_idx {
NGBE_ISB_HEADER,
NGBE_ISB_MISC,
NGBE_ISB_VEC0,
NGBE_ISB_VEC1,
NGBE_ISB_MAX
};
/* PCI bus types */
enum ngbe_bus_type {
ngbe_bus_type_unknown = 0,
ngbe_bus_type_pci,
ngbe_bus_type_pcix,
ngbe_bus_type_pci_express,
ngbe_bus_type_internal,
ngbe_bus_type_reserved
};
/* PCI bus speeds */
enum ngbe_bus_speed {
ngbe_bus_speed_unknown = 0,
ngbe_bus_speed_33 = 33,
ngbe_bus_speed_66 = 66,
ngbe_bus_speed_100 = 100,
ngbe_bus_speed_120 = 120,
ngbe_bus_speed_133 = 133,
ngbe_bus_speed_2500 = 2500,
ngbe_bus_speed_5000 = 5000,
ngbe_bus_speed_8000 = 8000,
ngbe_bus_speed_reserved
};
/* PCI bus widths */
enum ngbe_bus_width {
ngbe_bus_width_unknown = 0,
ngbe_bus_width_pcie_x1 = 1,
ngbe_bus_width_pcie_x2 = 2,
ngbe_bus_width_pcie_x4 = 4,
ngbe_bus_width_pcie_x8 = 8,
ngbe_bus_width_32 = 32,
ngbe_bus_width_64 = 64,
ngbe_bus_width_reserved
};
/* Host interface command structures */
struct ngbe_hic_hdr {
uint8_t cmd;
uint8_t buf_len;
union {
uint8_t cmd_resv;
uint8_t ret_status;
} cmd_or_resp;
uint8_t checksum;
};
struct ngbe_hic_hdr2_req {
uint8_t cmd;
uint8_t buf_lenh;
uint8_t buf_lenl;
uint8_t checksum;
};
struct ngbe_hic_hdr2_rsp {
uint8_t cmd;
uint8_t buf_lenl;
uint8_t buf_lenh_status;
uint8_t checksum;
};
union ngbe_hic_hdr2 {
struct ngbe_hic_hdr2_req req;
struct ngbe_hic_hdr2_rsp rsp;
};
struct ngbe_hic_drv_info {
struct ngbe_hic_hdr hdr;
uint8_t port_num;
uint8_t ver_sub;
uint8_t ver_build;
uint8_t ver_min;
uint8_t ver_maj;
uint8_t pad;
uint16_t pad2;
};
struct ngbe_hic_read_shadow_ram {
union ngbe_hic_hdr2 hdr;
uint32_t address;
uint16_t length;
uint16_t pad2;
uint16_t data;
uint16_t pad3;
};
struct ngbe_osdep {
bus_dma_tag_t os_dmat;
bus_space_tag_t os_memt;
bus_space_handle_t os_memh;
bus_size_t os_memsize;
bus_addr_t os_membase;
void *os_sc;
struct pci_attach_args os_pa;
};
/* Forward declaration. */
struct ngbe_hw;
struct ngbe_softc;
/* Iterator type for walking multicast address lists */
typedef uint8_t * (*ngbe_mc_addr_itr) (struct ngbe_hw *, uint8_t **, \
uint32_t *);
struct ngbe_eeprom_operations {
void (*init_params)(struct ngbe_hw *);
int (*eeprom_chksum_cap_st)(struct ngbe_softc *, uint16_t,
uint32_t *);
int (*phy_led_oem_chk)(struct ngbe_softc *, uint32_t *);
};
struct ngbe_mac_operations {
int (*init_hw)(struct ngbe_softc *);
int (*reset_hw)(struct ngbe_softc *);
int (*start_hw)(struct ngbe_softc *);
void (*clear_hw_cntrs)(struct ngbe_hw *);
enum ngbe_media_type (*get_media_type)(struct ngbe_hw *);
void (*get_mac_addr)(struct ngbe_hw *, uint8_t *);
int (*stop_adapter)(struct ngbe_softc *);
void (*get_bus_info)(struct ngbe_softc *);
void (*set_lan_id)(struct ngbe_hw *);
void (*enable_rx_dma)(struct ngbe_hw *, uint32_t);
void (*disable_sec_rx_path)(struct ngbe_hw *);
void (*enable_sec_rx_path)(struct ngbe_hw *);
int (*acquire_swfw_sync)(struct ngbe_softc *,
uint32_t);
void (*release_swfw_sync)(struct ngbe_softc *,
uint32_t);
/* Link */
int (*setup_link)(struct ngbe_softc *, uint32_t,
int);
int (*check_link)(struct ngbe_hw *, uint32_t *,
int *, int);
void (*get_link_capabilities)(struct ngbe_hw *,
uint32_t *, int *);
/* Packet Buffer manipulation */
void (*setup_rxpba)(struct ngbe_hw *, int, uint32_t,
int);
/* RAR, Multicast, VLAN */
int (*set_rar)(struct ngbe_softc *, uint32_t,
uint8_t *, uint64_t, uint32_t);
void (*init_rx_addrs)(struct ngbe_softc *);
void (*update_mc_addr_list)(struct ngbe_hw *,
uint8_t *, uint32_t, ngbe_mc_addr_itr, int);
void (*clear_vfta)(struct ngbe_hw *);
void (*init_uta_tables)(struct ngbe_hw *);
/* Flow Control */
int (*fc_enable)(struct ngbe_softc *);
int (*setup_fc)(struct ngbe_softc *);
/* Manageability interface */
int (*set_fw_drv_ver)(struct ngbe_softc *, uint8_t,
uint8_t, uint8_t, uint8_t);
void (*init_thermal_sensor_thresh)(struct ngbe_hw *);
void (*disable_rx)(struct ngbe_hw *);
void (*enable_rx)(struct ngbe_hw *);
};
struct ngbe_phy_operations {
int (*identify)(struct ngbe_softc *);
int (*init)(struct ngbe_softc *);
int (*reset)(struct ngbe_softc *);
int (*read_reg)(struct ngbe_hw *, uint32_t, uint32_t,
uint16_t *);
int (*write_reg)(struct ngbe_hw *, uint32_t, uint32_t,
uint16_t);
int (*setup_link)(struct ngbe_softc *, uint32_t, int);
void (*phy_led_ctrl)(struct ngbe_softc *);
int (*check_overtemp)(struct ngbe_hw *);
void (*check_event)(struct ngbe_softc *);
void (*get_adv_pause)(struct ngbe_hw *, uint8_t *);
void (*get_lp_adv_pause)(struct ngbe_hw *, uint8_t *);
int (*set_adv_pause)(struct ngbe_hw *, uint16_t);
int (*setup_once)(struct ngbe_softc *);
};
struct ngbe_addr_filter_info {
uint32_t num_mc_addrs;
uint32_t rar_used_count;
uint32_t mta_in_use;
uint32_t overflow_promisc;
int user_set_promisc;
};
/* Bus parameters */
struct ngbe_bus_info {
enum ngbe_bus_speed speed;
enum ngbe_bus_width width;
enum ngbe_bus_type type;
uint16_t lan_id;
};
struct ngbe_eeprom_info {
struct ngbe_eeprom_operations ops;
enum ngbe_eeprom_type type;
uint16_t sw_region_offset;
};
struct ngbe_mac_info {
struct ngbe_mac_operations ops;
uint8_t addr[ETHER_ADDR_LEN];
uint8_t perm_addr[ETHER_ADDR_LEN];
uint32_t mta_shadow[NGBE_MAX_MTA];
int mc_filter_type;
uint32_t mcft_size;
uint32_t vft_shadow[NGBE_MAX_VFTA_ENTRIES];
uint32_t vft_size;
uint32_t num_rar_entries;
uint32_t rx_pb_size;
uint32_t max_tx_queues;
uint32_t max_rx_queues;
int autotry_restart;
int set_lben;
int autoneg;
};
/* Flow control parameters */
struct ngbe_fc_info {
uint32_t high_water;
uint32_t low_water;
uint16_t pause_time;
int strict_ieee;
int disable_fc_autoneg;
int fc_was_autonegged;
enum ngbe_fc_mode current_mode;
enum ngbe_fc_mode requested_mode;
};
struct ngbe_phy_info {
struct ngbe_phy_operations ops;
enum ngbe_phy_type type;
uint32_t addr;
uint32_t id;
uint32_t phy_semaphore_mask;
enum ngbe_media_type media_type;
uint32_t autoneg_advertised;
int reset_if_overtemp;
uint32_t force_speed;
};
struct ngbe_hw {
void *back;
struct ngbe_mac_info mac;
struct ngbe_addr_filter_info addr_ctrl;
struct ngbe_fc_info fc;
struct ngbe_phy_info phy;
struct ngbe_eeprom_info eeprom;
struct ngbe_bus_info bus;
uint32_t subsystem_device_id;
int adapter_stopped;
enum ngbe_reset_type reset_type;
int force_full_reset;
};
/* Transmit Descriptor */
union ngbe_tx_desc {
struct {
uint64_t buffer_addr;
uint32_t cmd_type_len;
uint32_t olinfo_status;
} read;
struct {
uint64_t rsvd;
uint32_t nxtseq_seed;
uint32_t status;
} wb;
};
#define NGBE_TXD_DTYP_DATA 0x00000000
#define NGBE_TXD_DTYP_CTXT 0x00100000
#define NGBE_TXD_STAT_DD 0x00000001
#define NGBE_TXD_L4CS 0x00000200
#define NGBE_TXD_IIPCS 0x00000400
#define NGBE_TXD_EOP 0x01000000
#define NGBE_TXD_IFCS 0x02000000
#define NGBE_TXD_RS 0x08000000
#define NGBE_TXD_VLE 0x40000000
#define NGBE_TXD_MACLEN_SHIFT 9
#define NGBE_TXD_PAYLEN_SHIFT 13
#define NGBE_TXD_VLAN_SHIFT 16
#define NGBE_PTYPE_PKT_IPV6 0x08
#define NGBE_PTYPE_PKT_IP 0x20
#define NGBE_PTYPE_TYP_IP 0x02
#define NGBE_PTYPE_TYP_UDP 0x03
#define NGBE_PTYPE_TYP_TCP 0x04
/* Receive Descriptor */
union ngbe_rx_desc {
struct {
uint64_t pkt_addr;
uint64_t hdr_addr;
} read;
struct {
struct {
union {
uint32_t data;
struct {
uint16_t pkt_info;
uint16_t hdr_info;
} hs_rss;
} lo_dword;
union {
uint32_t rss;
struct {
uint16_t ip_id;
uint16_t csum;
} csum_ip;
} hi_dword;
} lower;
struct {
uint32_t status_error;
uint16_t length;
uint16_t vlan;
} upper;
} wb;
};
#define NGBE_RXD_STAT_DD 0x00000001
#define NGBE_RXD_STAT_EOP 0x00000002
#define NGBE_RXD_STAT_VP 0x00000020
#define NGBE_RXD_STAT_L4CS 0x00000080
#define NGBE_RXD_STAT_IPCS 0x00000100
#define NGBE_RXD_ERR_RXE 0x20000000
#define NGBE_RXD_ERR_TCPE 0x40000000
#define NGBE_RXD_ERR_IPE 0x80000000
#define NGBE_RXD_RSSTYPE_MASK 0x0000000f
/* RSS hash results */
#define NGBE_RXD_RSSTYPE_NONE 0x00000000
/* Context descriptor */
struct ngbe_tx_context_desc {
uint32_t vlan_macip_lens;
uint32_t seqnum_seed;
uint32_t type_tucmd_mlhl;
uint32_t mss_l4len_idx;
};
struct ngbe_tx_buf {
uint32_t eop_index;
struct mbuf *m_head;
bus_dmamap_t map;
};
struct ngbe_rx_buf {
struct mbuf *buf;
struct mbuf *fmp;
bus_dmamap_t map;
};
struct ngbe_dma_alloc {
caddr_t dma_vaddr;
bus_dma_tag_t dma_tag;
bus_dmamap_t dma_map;
bus_dma_segment_t dma_seg;
bus_size_t dma_size;
int dma_nseg;
};
struct tx_ring {
struct ngbe_softc *sc;
struct ifqueue *ifq;
uint32_t me;
uint32_t watchdog_timer;
union ngbe_tx_desc *tx_base;
struct ngbe_tx_buf *tx_buffers;
struct ngbe_dma_alloc txdma;
uint32_t next_avail_desc;
uint32_t next_to_clean;
bus_dma_tag_t txtag;
};
struct rx_ring {
struct ngbe_softc *sc;
struct ifiqueue *ifiq;
uint32_t me;
union ngbe_rx_desc *rx_base;
struct ngbe_rx_buf *rx_buffers;
struct ngbe_dma_alloc rxdma;
uint32_t last_desc_filled;
uint32_t next_to_check;
struct timeout rx_refill;
struct if_rxring rx_ring;
};
struct ngbe_queue {
struct ngbe_softc *sc;
uint32_t msix;
uint32_t eims;
char name[16];
pci_intr_handle_t ih;
void *tag;
struct tx_ring *txr;
struct rx_ring *rxr;
};
struct ngbe_softc {
struct device sc_dev;
struct arpcom sc_ac;
struct ifmedia sc_media;
struct intrmap *sc_intrmap;
struct ngbe_osdep osdep;
struct ngbe_hw hw;
void *tag;
uint32_t led_conf;
uint32_t gphy_efuse[2];
uint32_t link_speed;
uint32_t linkvec;
int link_up;
int num_tx_desc;
int num_rx_desc;
struct ngbe_dma_alloc isbdma;
uint32_t *isb_base;
unsigned int sc_nqueues;
struct ngbe_queue *queues;
struct tx_ring *tx_rings;
struct rx_ring *rx_rings;
/* Multicast array memory */
uint8_t *mta;
};
#define DEVNAME(_sc) ((_sc)->sc_dev.dv_xname)
#define NGBE_FAILED_READ_REG 0xffffffff
/* Register READ/WRITE macros */
#define NGBE_WRITE_FLUSH(a) \
NGBE_READ_REG(a, NGBE_MIS_PWR)
#define NGBE_READ_REG(a, reg) \
bus_space_read_4(((struct ngbe_osdep *)(a)->back)->os_memt, \
((struct ngbe_osdep *)(a)->back)->os_memh, reg)
#define NGBE_WRITE_REG(a, reg, value) \
bus_space_write_4(((struct ngbe_osdep *)(a)->back)->os_memt, \
((struct ngbe_osdep *)(a)->back)->os_memh, reg, value)
#define NGBE_READ_REG_ARRAY(a, reg, offset) \
bus_space_read_4(((struct ngbe_osdep *)(a)->back)->os_memt, \
((struct ngbe_osdep *)(a)->back)->os_memh, (reg + ((offset) << 2)))
#define NGBE_WRITE_REG_ARRAY(a, reg, offset, value) \
bus_space_write_4(((struct ngbe_osdep *)(a)->back)->os_memt, \
((struct ngbe_osdep *)(a)->back)->os_memh, \
(reg + ((offset) << 2)), value)