1088 lines
29 KiB
C
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)
|