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