/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #ifndef _SYS_NGE_CHIP_H #define _SYS_NGE_CHIP_H #ifdef __cplusplus extern "C" { #endif #include "nge.h" #define VENDOR_ID_NVIDIA 0x10de #define DEVICE_ID_MCP04_37 0x37 #define DEVICE_ID_MCP04_38 0x38 #define DEVICE_ID_CK804_56 0x56 #define DEVICE_ID_CK804_57 0x57 #define DEVICE_ID_MCP51_269 0x269 #define DEVICE_ID_MCP51_268 0x268 #define DEVICE_ID_MCP55_373 0x373 #define DEVICE_ID_MCP55_372 0x372 #define DEVICE_ID_MCP61_3EE 0x3ee #define DEVICE_ID_MCP61_3EF 0x3ef #define DEVICE_ID_MCP77_760 0x760 #define DEVICE_ID_MCP79_AB0 0xab0 #define DEVICE_ID_NF3_E6 0xe6 #define DEVICE_ID_NF3_DF 0xdf /* Private PCI configuration register for bus config of ck804/mcp55 */ #define PCI_CONF_HT_INTERNAL 0x4c typedef union _nge_interbus_conf { uint32_t conf_val; struct { uint32_t unit_id:5; uint32_t resv5_23:19; uint32_t aux_val:3; uint32_t resv27:1; uint32_t msi_off:1; uint32_t msix_off:1; /* mcp55 only */ uint32_t resv30_31:2; } conf_bits; } nge_interbus_conf; /* Private PCI configuration register for MSI mask of mcp55 */ #define PCI_CONF_HT_MSI_MASK 0x60 typedef union _nge_msi_mask_conf { uint32_t msi_mask_conf_val; struct { uint32_t vec0_off:1; uint32_t vec1_off:1; uint32_t vec2_off:1; uint32_t vec3_off:1; uint32_t vec4_off:1; uint32_t vec5_off:1; uint32_t vec6_off:1; uint32_t vec7_off:1; uint32_t resv8_31:24; } msi_mask_bits; } nge_msi_mask_conf; /* Private PCI configuration register for MSI map capability of mcp55 */ #define PCI_CONF_HT_MSI_MAP_CAP 0x6c typedef union _nge_msi_map_cap_conf { uint32_t msi_map_cap_conf_val; struct { uint32_t cap_id:8; uint32_t next_ptr:8; uint32_t map_en:1; uint32_t map_fixed:1; uint32_t resv18_26:9; uint32_t cap_type:5; } map_cap_conf_bits; } nge_msi_map_cap_conf; /* * Master interrupt */ #define NGE_INTR_SRC 0x000 #define INTR_SRC_ALL 0x00007fff typedef union _nge_intr_src { uint32_t intr_val; struct { uint32_t reint:1; uint32_t rcint:1; uint32_t miss:1; uint32_t teint:1; uint32_t tcint:1; uint32_t stint:1; uint32_t mint:1; uint32_t rfint:1; uint32_t tfint:1; uint32_t feint:1; uint32_t resv10:1; uint32_t resv11:1; uint32_t resv12:1; uint32_t resv13:1; uint32_t phyint:1; uint32_t resv15_31:17; } int_bits; } nge_intr_src; /* * Master interrupt Mask */ #define NGE_INTR_MASK 0x004 #define NGE_INTR_ALL_EN 0x00007fff typedef union _nge_intr_mask { uint32_t mask_val; struct { uint32_t reint:1; uint32_t rcint:1; uint32_t miss:1; uint32_t teint:1; uint32_t tcint:1; uint32_t stint:1; uint32_t mint:1; uint32_t rfint:1; uint32_t tfint:1; uint32_t feint:1; uint32_t resv10:1; uint32_t resv11:1; uint32_t resv12:1; uint32_t resv13:1; uint32_t phyint:1; uint32_t resv15_31:17; } mask_bits; } nge_intr_mask; /* * Software timer control register */ #define NGE_SWTR_CNTL 0x008 typedef union _nge_swtr_cntl { uint8_t ctrl_val; struct { uint8_t stren:1; uint8_t sten:1; uint8_t resv2_7:6; } cntl_bits; } nge_swtr_cntl; /* * Software Timer Interval */ #define NGE_SWTR_ITC 0x00c /* Default timer interval, 97 would mean 1 ms */ #define SWTR_ITC 0x8 typedef union _nge_itc { uint32_t itc_val; struct { uint32_t sw_intv:16; uint32_t sw_cur_val:16; } itc_bits; } nge_itc; /* * Fatal error register */ #define NGE_REG010 0x010 typedef union _nge_reg010 { uint32_t reg010_val; struct { uint32_t resv0:1; uint32_t resv1:1; uint32_t resv2:1; uint32_t resv3:1; uint32_t resv4:1; uint32_t resv5:1; uint32_t resv6:1; uint32_t resv7:1; uint32_t resv8:1; uint32_t resv9:1; uint32_t resv10:1; uint32_t resv11_31:21; } reg010_bits; } nge_reg010; /* * MSI vector map register 0 */ #define NGE_MSI_MAP0 0x020 typedef union _nge_msi_map0_vec { uint32_t msi_map0_val; struct { uint32_t reint_vec:4; uint32_t rcint_vec:4; uint32_t miss_vec:4; uint32_t teint_vec:4; uint32_t tcint_vec:4; uint32_t stint_vec:4; uint32_t mint_vec:4; uint32_t rfint_vec:4; } vecs_bits; } nge_msi_map0_vec; /* * MSI vector map register 1 */ #define NGE_MSI_MAP1 0x024 typedef union _nge_msi_map1_vec { uint32_t msi_map1_val; struct { uint32_t tfint_vec:4; uint32_t feint_vec:4; uint32_t resv8_11:4; uint32_t resv12_15:4; uint32_t resv16_19:4; uint32_t resv20_23:4; uint32_t resv24_31:8; } vecs_bits; } nge_msi_map1_vec; /* * MSI vector map register 2 */ #define NGE_MSI_MAP2 0x028 /* * MSI vector map register 2 */ #define NGE_MSI_MAP3 0x02c /* * MSI mask register for mcp55 */ #define NGE_MSI_MASK 0x30 typedef union _nge_msi_mask { uint32_t msi_mask_val; struct { uint32_t vec0:1; uint32_t vec1:1; uint32_t vec2:1; uint32_t vec3:1; uint32_t vec4:1; uint32_t vec5:1; uint32_t vec6:1; uint32_t vec7:1; uint32_t resv8_31:24; }msi_msk_bits; }nge_msi_mask; /* * Software misc register for mcp51 */ #define NGE_SOFT_MISC 0x034 typedef union _nge_soft_misc { uint32_t misc_val; struct { uint32_t rx_clk_vx_rst:1; uint32_t tx_clk_vx_rst:1; uint32_t clk12m_vx_rst:1; uint32_t fpci_clk_vx_rst:1; uint32_t rx_clk_vc_rst:1; uint32_t tx_clk_vc_rst:1; uint32_t fs_clk_vc_rst:1; uint32_t rst_ex_m2pintf:1; uint32_t resv8_31:24; } misc_bits; } nge_soft_misc; /* * DMA configuration */ #define NGE_DMA_CFG 0x040 typedef union _nge_dma_cfg { uint32_t cfg_val; struct { uint32_t tx_start_pri:3; uint32_t tx_start_pri_flag:1; uint32_t tx_prd_rpri:3; uint32_t tx_prd_rpri_flag:1; uint32_t tx_prd_wpri:3; uint32_t tx_prd_wpri_flag:1; uint32_t rx_start_pri:3; uint32_t rx_start_pri_flag:1; uint32_t rx_prd_rpri:3; uint32_t rx_prd_rpri_flag:1; uint32_t rx_prd_wpri:3; uint32_t rx_prd_wpri_flag:1; uint32_t dma_max_pri:3; uint32_t dma_wrr_disable:1; uint32_t dma_pri_disable:1; } cfg_bits; } nge_dma_cfg; /* * Request DMA configuration */ #define NGE_DMA_RCFG 0x044 typedef union _nge_dma_rcfg { uint32_t dma_rcfg_val; struct { uint32_t tx_prd_coh_state:2; uint32_t tx_data_coh_state:2; uint32_t rx_prd_coh_state:2; uint32_t rx_data_coh_state:2; uint32_t max_roffset:5; uint32_t resv13_31:19; } rcfg_bis; } nge_dma_rcfg; /* * Hot DMA configuration */ #define NGE_DMA_HOT_CFG 0x048 typedef union _nge_dma_hcfg { uint32_t dma_hcfg_val; struct { uint32_t resv0_3:4; uint32_t noti_wstart_pri:3; uint32_t noti_wstart_pri_flag:1; uint32_t cmd_rstart_pri:3; uint32_t cmd_rstart_pri_flag:1; uint32_t cmd_wstart_pri:3; uint32_t cmd_wstart_pri_flag:1; uint32_t resv16_31:16; } hcfg_bits; } nge_dma_hcfg; /* * PMU control register 0 for mcp51 */ #define NGE_PMU_CNTL0 0x060 #define NGE_PMU_CORE_SPD10_BUSY 0x8 #define NGE_PMU_CORE_SPD10_IDLE 0xB #define NGE_PMU_CORE_SPD100_BUSY 0x4 #define NGE_PMU_CORE_SPD100_IDLE 0x7 #define NGE_PMU_CORE_SPD1000_BUSY 0x0 #define NGE_PMU_CORE_SPD1000_IDLE 0x3 typedef union _nge_pmu_cntl0 { uint32_t cntl0_val; struct { uint32_t core_spd10_fp:4; uint32_t core_spd10_idle:4; uint32_t core_spd100_fp:4; uint32_t core_spd100_idle:4; uint32_t core_spd1000_fp:4; uint32_t core_spd1000_idle:4; uint32_t core_sts_cur:8; } cntl0_bits; } nge_pmu_cntl0; /* * PMU control register 1 for mcp51 */ #define NGE_PMU_CNTL1 0x064 typedef union _nge_pmu_cntl1 { uint32_t cntl1_val; struct { uint32_t dev_fp:4; uint32_t dev_idle:4; uint32_t resv8_27:20; uint32_t dev_sts_cur:4; } cntl1_bits; } nge_pmu_cntl1; /* * PMU control register 2 for mcp51 */ #define NGE_PMU_CNTL2 0x068 typedef union _nge_pmu_cntl2 { uint32_t cntl2_val; struct { uint32_t core_override:4; uint32_t resv4_7:4; uint32_t dev_override:4; uint32_t resv12_15:4; uint32_t core_override_en:1; uint32_t dev_override_en:1; uint32_t core_enable:1; uint32_t dev_enable:1; uint32_t rx_wake_dis:1; uint32_t cidle_timer:1; uint32_t didle_timer:1; uint32_t resv23_31:9; } cntl2_bits; } nge_pmu_cntl2; /* * PMU core idle limit register for mcp51 */ #define NGE_PMU_CIDLE_LIMIT 0x06c #define NGE_PMU_CIDLE_LIMIT_DEF 0xffff /* * PMU device idle limit register for mcp51 */ #define NGE_PMU_DIDLE_LIMIT 0x070 #define NGE_PMU_DIDLE_LIMIT_DEF 0xffff /* * PMU core idle count value register for mcp51 */ #define NGE_PMU_CIDLE_COUNT 0x074 #define NGE_PMU_CIDEL_COUNT_DEF 0xffff /* * PMU device idle count value register for mcp51 */ #define NGE_PMU_DIDLE_COUNT 0x078 #define NGE_PMU_DIDEL_COUNT_DEF 0xffff /* * Transmit control */ #define NGE_TX_CNTL 0x080 typedef union _nge_tx_cntl { uint32_t cntl_val; struct { uint32_t paen:1; /* only for mcp55, otherwise reserve */ uint32_t resv1:1; uint32_t retry_en:1; uint32_t pad_en:1; uint32_t fappend_en:1; uint32_t two_def_en:1; uint32_t resv6_7:2; uint32_t max_retry:4; uint32_t burst_en:1; uint32_t resv13_15:3; uint32_t retry_emask:1; uint32_t exdef_mask:1; uint32_t def_mask:1; uint32_t lcar_mask:1; uint32_t tlcol_mask:1; uint32_t uflo_err_mask:1; uint32_t resv22_23:2; uint32_t jam_seq_en:1; uint32_t resv25_31:7; } cntl_bits; } nge_tx_cntl; /* * Transmit enable * Note: for ck804 or mcp51, this is 8-bit register; * for mcp55, it is a 32-bit register. */ #define NGE_TX_EN 0x084 #define NGE_SMU_FREE 0x0 #define NGE_SMU_GET 0xf typedef union _nge_tx_en { uint32_t val; struct { uint32_t tx_en:1; uint32_t resv1_7:7; uint32_t smu2mac:4; uint32_t mac2smu:4; uint32_t resv16_31:16; } bits; } nge_tx_en; /* * Transmit status */ #define NGE_TX_STA 0x088 typedef union _nge_tx_sta { uint32_t sta_val; struct { uint32_t tx_chan_sta:1; uint32_t resv1_15:15; uint32_t retry_err:1; uint32_t exdef:1; uint32_t def:1; uint32_t lcar:1; uint32_t tlcol:1; uint32_t uflo:1; uint32_t resv22_31:10; } sta_bits; } nge_tx_sta; /* * Receive control */ #define NGE_RX_CNTL0 0x08c typedef union _nge_rx_cntrl0 { uint32_t cntl_val; struct { uint32_t resv0:1; uint32_t padsen:1; uint32_t fcsren:1; uint32_t paen:1; uint32_t lben:1; uint32_t afen:1; uint32_t runten:1; uint32_t brdis:1; uint32_t rdfen:1; uint32_t slfb:1; uint32_t resv10_15:6; uint32_t runtm:1; uint32_t rlcolm:1; uint32_t maxerm:1; uint32_t lferm:1; uint32_t crcm:1; uint32_t ofolm:1; uint32_t framerm:1; uint32_t resv23_31:9; } cntl_bits; } nge_rx_cntrl0; /* * Maximum receive Frame size */ #define NGE_RX_CNTL1 0x090 typedef union _nge_rx_cntl1 { uint32_t cntl_val; struct { uint32_t length:14; uint32_t resv14_31:18; } cntl_bits; } nge_rx_cntl1; /* * Receive enable register * Note: for ck804 and mcp51, this is a 8-bit register; * for mcp55, it is a 32-bit register. */ #define NGE_RX_EN 0x094 typedef union _nge_rx_en { uint8_t val; struct { uint8_t rx_en:1; uint8_t resv1_7:7; } bits; } nge_rx_en; /* * Receive status register */ #define NGE_RX_STA 0x098 typedef union _nge_rx_sta { uint32_t sta_val; struct { uint32_t rx_chan_sta:1; uint32_t resv1_15:15; uint32_t runt_sta:1; uint32_t rlcol_sta:1; uint32_t mlen_err:1; uint32_t lf_err:1; uint32_t crc_err:1; uint32_t ofol_err:1; uint32_t fram_err:1; uint32_t resv23_31:9; } sta_bits; } nge_rx_sta; /* * Backoff Control */ #define NGE_BKOFF_CNTL 0x09c #define BKOFF_RSEED 0x8 #define BKOFF_SLIM_GMII 0x3ff #define BKOFF_SLIM_MII 0x7f typedef union _nge_bkoff_cntl { uint32_t cntl_val; struct { uint32_t rseed:8; uint32_t sltm:10; uint32_t resv18_30:13; uint32_t leg_bk_en:1; } bkoff_bits; } nge_bkoff_cntl; /* * Transmit defferral timing */ #define NGE_TX_DEF 0x0a0 #define TX_TIFG_MII 0x15 #define TX_IFG_RGMII_1000_FD 0x14 #define TX_IFG_RGMII_OTHER 0x16 #define TX_IFG2_MII 0x5 #define TX_IFG2_RGMII_10_100 0x7 #define TX_IFG2_RGMII_1000 0x5 #define TX_IFG2_DEFAULT 0X0 #define TX_IFG1_DEFAULT 0xf typedef union _nge_tx_def { uint32_t def_val; struct { uint32_t ifg1_def:8; uint32_t ifg2_def:8; uint32_t if_def:8; uint32_t resv24_31:8; } def_bits; } nge_tx_def; /* * Receive defferral timing */ #define NGE_RX_DEf 0x0a4 #define RX_DEF_DEFAULT 0x16 typedef union _nge_rx_def { uint8_t def_val; struct { uint8_t rifg; } def_bits; } nge_rx_def; /* * Low 32 bit unicast address */ #define NGE_UNI_ADDR0 0x0a8 typedef union _nge_uni_addr0 { uint32_t addr_val; struct { uint32_t addr; } addr_bits; } nge_uni_addr0; /* * High 32 bit unicast address */ #define NGE_UNI_ADDR1 0x0ac typedef union _nge_uni_addr1 { uint32_t addr_val; struct { uint32_t addr:16; uint32_t resv16_31:16; } addr_bits; } nge_uni_addr1; #define LOW_24BITS_MASK 0xffffffULL #define REVERSE_MAC_ELITE 0x211900ULL #define REVERSE_MAC_GIGABYTE 0xe61600ULL #define REVERSE_MAC_ASUS 0x601d00ULL /* * Low 32 bit multicast address */ #define NGE_MUL_ADDR0 0x0b0 typedef union _nge_mul_addr0 { uint32_t addr_val; struct { uint32_t addr; }addr_bits; } nge_mul_addr0; /* * High 32 bit multicast address */ #define NGE_MUL_ADDR1 0x0b4 typedef union _nge_mul_addr1 { uint32_t addr_val; struct { uint32_t addr:16; uint32_t resv16_31:16; }addr_bits; } nge_mul_addr1; /* * Low 32 bit multicast mask */ #define NGE_MUL_MASK 0x0b8 typedef union _nge_mul_mask0 { uint32_t mask_val; struct { uint32_t mask; } mask_bits; } nge_mul_mask0; /* * High 32 bit multicast mask */ #define NGE_MUL_MASK1 0x0bc typedef union _nge_mul_mask1 { uint32_t mask_val; struct { uint32_t mask:16; uint32_t resv16_31:16; } mask_bits; } nge_mul_mask1; /* * Mac-to Phy Interface */ #define NGE_MAC2PHY 0x0c0 #define low_speed 0x0 #define fast_speed 0x1 #define giga_speed 0x2 #define err_speed 0x4 #define MII_IN 0x0 #define RGMII_IN 0x1 #define ERR_IN1 0x3 #define ERR_IN2 0x4 typedef union _nge_mac2phy { uint32_t m2p_val; struct { uint32_t speed:2; uint32_t resv2_7:6; uint32_t hdup_en:1; uint32_t resv9:1; uint32_t phyintr:1; /* for mcp55 only */ uint32_t phyintrlvl:1; /* for mcp55 only */ uint32_t resv12_27:16; uint32_t in_type:2; uint32_t resv30_31:2; } m2p_bits; } nge_mac2phy; /* * Transmit Descriptor Ring address */ #define NGE_TX_DADR 0x100 typedef union _nge_tx_addr { uint32_t addr_val; struct { uint32_t resv0_2:3; uint32_t addr:29; } addr_bits; } nge_tx_addr; /* * Receive Descriptor Ring address */ #define NGE_RX_DADR 0x104 typedef union _nge_rx_addr { uint32_t addr_val; struct { uint32_t resv0_2:3; uint32_t addr:29; } addr_bits; } nge_rx_addr; /* * Rx/tx descriptor ring leng * Note: for mcp55, tdlen/rdlen are 14 bit. */ #define NGE_RXTX_DLEN 0x108 typedef union _nge_rxtx_dlen { uint32_t dlen_val; struct { uint32_t tdlen:14; uint32_t resv14_15:2; uint32_t rdlen:14; uint32_t resv30_31:2; } dlen_bits; } nge_rxtx_dlen; /* * Transmit polling register */ #define NGE_TX_POLL 0x10c #define TX_POLL_INTV_1G 10 #define TX_POLL_INTV_100M 100 #define TX_POLL_INTV_10M 1000 typedef union _nge_tx_poll { uint32_t poll_val; struct { uint32_t tpi:16; uint32_t tpen:1; uint32_t resv17_31:15; } poll_bits; } nge_tx_poll; /* * Receive polling register */ #define NGE_RX_POLL 0x110 #define RX_POLL_INTV_1G 10 #define RX_POLL_INTV_100M 100 #define RX_POLL_INTV_10M 1000 typedef union _nge_rx_poll { uint32_t poll_val; struct { uint32_t rpi:16; uint32_t rpen:1; uint32_t resv17_31:15; } poll_bits; } nge_rx_poll; /* * Transmit polling count */ #define NGE_TX_PCNT 0x114 typedef union _nge_tx_pcnt { uint32_t cnt_val; struct { uint32_t pcnt:32; } cnt_bits; } nge_tx_pcnt; /* * Receive polling count */ #define NGE_RX_PCNT 0x118 typedef union _nge_rx_pcnt { uint32_t cnt_val; struct { uint32_t pcnt:32; } cnt_bits; } nge_rx_pcnt; /* * Current tx's descriptor address */ #define NGE_TX_CUR_DADR 0x11c typedef union _nge_tx_cur_addr { uint32_t addr_val; struct { uint32_t resv0_2:3; uint32_t addr:29; } addr_bits; } nge_tx_cur_addr; /* * Current rx's descriptor address */ #define NGE_RX_CUR_DADR 0x120 typedef union _nge_rx_cur_addr { uint32_t addr_val; struct { uint32_t resv0_2:3; uint32_t addr:29; } addr_bits; } nge_rx_cur_addr; /* * Current tx's data buffer address */ #define NGE_TX_CUR_PRD0 0x124 typedef union _nge_tx_cur_prd0 { uint32_t prd0_val; struct { uint32_t prd0:32; } prd0_bits; } nge_tx_cur_prd0; /* * Current tx's data buffer status */ #define NGE_TX_CUR_PRD1 0x128 typedef union _nge_tx_cur_prd1 { uint32_t prd1_val; struct { uint32_t rebytes:16; uint32_t status:16; } prd1_bits; } nge_tx_cur_prd1; /* * Current rx's data buffer address */ #define NGE_RX_CUR_PRD0 0x12c typedef union _nge_rx_cur_prd0 { uint32_t prd0_val; struct { uint32_t prd0:32; }prd0_bits; } nge_rx_cur_prd0; /* * Current rx's data buffer status */ #define NGE_RX_CUR_PRD1 0x130 /* * Next tx's descriptor address */ #define NGE_TX_NXT_DADR 0x134 typedef union _nge_tx_nxt_dadr { uint32_t dadr_val; struct { uint32_t addr:32; }addr_bits; } nge_tx_nxt_dadr; /* * Next rx's descriptor address */ #define NGE_RX_NXT_DADR 0x138 typedef union _nge_rx_nxt_dadr { uint32_t dadr_val; struct { uint32_t addr:32; } addr_bits; } nge_rx_nxt_dadr; /* * Transmit fifo watermark */ #define NGE_TX_FIFO_WM 0x13c #define TX_FIFO_TBFW 0 #define TX_FIFO_NOB_WM_MII 1 #define TX_FIFO_NOB_WM_GMII 8 #define TX_FIFO_DATA_LWM 0x20 #define TX_FIFO_PRD_LWM 0x8 #define TX_FIFO_PRD_HWM 0x38 typedef union _nge_tx_fifo_wm { uint32_t wm_val; struct { uint32_t data_lwm:9; uint32_t resv8_11:3; uint32_t prd_lwm:6; uint32_t uprd_hwm:6; uint32_t nbfb_wm:4; uint32_t fb_wm:4; } wm_bits; } nge_tx_fifo_wm; /* * Receive fifo watermark */ #define NGE_RX_FIFO_WM 0x140 typedef union _nge_rx_fifo_wm { uint32_t wm_val; struct { uint32_t data_hwm:9; uint32_t resv9_11:3; uint32_t prd_lwm:4; uint32_t resv16_17:2; uint32_t prd_hwm:4; uint32_t resv22_31:10; } wm_bits; } nge_rx_fifo_wm; /* * Chip mode control */ #define NGE_MODE_CNTL 0x144 #define DESC_MCP1 0x0 #define DESC_OFFLOAD 0x1 #define DESC_HOT 0x2 #define DESC_RESV 0x3 #define MACHINE_BUSY 0x0 #define MACHINE_IDLE 0x1 typedef union _nge_mode_cntl { uint32_t mode_val; struct { uint32_t txdm:1; uint32_t rxdm:1; uint32_t dma_dis:1; uint32_t dma_status:1; uint32_t bm_reset:1; uint32_t resv5:1; uint32_t vlan_strip:1; /* mcp55 chip only */ uint32_t vlan_ins:1; /* mcp55 chip only */ uint32_t desc_type:2; uint32_t rx_sum_en:1; uint32_t tx_prd_cu_en:1; uint32_t w64_dis:1; uint32_t tx_rcom_en:1; uint32_t rx_filter_en:1; uint32_t resv15:1; uint32_t resv16:1; /* ck804 and mcp51 only */ uint32_t resv17:1; /* ck804 and mcp51 only */ uint32_t resv18:1; /* ck804 and mcp51 only */ uint32_t resv19_21:3; uint32_t tx_fetch_prd:1; /* mcp51/mcp55 only */ uint32_t rx_fetch_prd:1; /* mcp51/mcp55 only */ uint32_t resv24_29:6; uint32_t rx_status:1; uint32_t tx_status:1; } mode_bits; } nge_mode_cntl; #define NGE_TX_DADR_HI 0x148 #define NGE_RX_DADR_HI 0x14c /* * Mii interrupt register * Note: for mcp55, this is a 32-bit register. */ #define NGE_MINTR_SRC 0x180 typedef union _nge_mintr_src { uint8_t src_val; struct { uint8_t mrei:1; uint8_t mcc2:1; uint8_t mcc1:1; uint8_t mapi:1; uint8_t mpdi:1; uint8_t resv5_7:3; } src_bits; } nge_mintr_src; /* * Mii interrupt mask * Note: for mcp55, this is a 32-bit register. */ #define NGE_MINTR_MASK 0x184 typedef union _nge_mintr_mask { uint8_t mask_val; struct { uint8_t mrei:1; uint8_t mcc2:1; uint8_t mcc1:1; uint8_t mapi:1; uint8_t mpdi:1; uint8_t resv5_7:3; } mask_bits; } nge_mintr_mask; /* * Mii control and status */ #define NGE_MII_CS 0x188 #define MII_POLL_INTV 0x4 typedef union _nge_mii_cs { uint32_t cs_val; struct { uint32_t excap:1; uint32_t jab_dec:1; uint32_t lk_up:1; uint32_t ana_cap:1; uint32_t rfault:1; uint32_t auto_neg:1; uint32_t mfps:1; uint32_t resv7:1; uint32_t exst:1; uint32_t hdup_100m_t2:1; uint32_t fdup_100m_t2:1; uint32_t hdup_10m:1; uint32_t fdup_10m:1; uint32_t hdup_100m_x:1; uint32_t fdup_100m_x:1; uint32_t cap_100m_t4:1; uint32_t ap_intv:4; uint32_t ap_en:1; uint32_t resv21_23:3; uint32_t ap_paddr:5; uint32_t resv29_31:3; } cs_bits; } nge_mii_cs; /* * Mii Clock timer register */ #define NGE_MII_TM 0x18c typedef union _nge_mii_tm { uint16_t tm_val; struct { uint16_t timer_interv:8; uint16_t timer_en:1; uint16_t resv9_14:6; uint16_t timer_status:1; } tm_bits; } nge_mii_tm; /* * Mdio address */ #define NGE_MDIO_ADR 0x190 typedef union _nge_mdio_adr { uint16_t adr_val; struct { uint16_t phy_reg:5; uint16_t phy_adr:5; uint16_t mdio_rw:1; uint16_t resv11_14:4; uint16_t mdio_clc:1; } adr_bits; } nge_mdio_adr; /* * Mdio data */ #define NGE_MDIO_DATA 0x194 /* * Power Management and Control */ #define NGE_PM_CNTL 0x200 typedef union _nge_pm_cntl { uint32_t cntl_val; struct { /* * mp_en: Magic Packet Enable * pm_en: Pattern Match Enable * lc_en: Link Change Enable */ uint32_t mp_en_d0:1; uint32_t pm_en_d0:1; uint32_t lc_en_d0:1; uint32_t resv3:1; uint32_t mp_en_d1:1; uint32_t pm_en_d1:1; uint32_t lc_en_d1:1; uint32_t resv7:1; uint32_t mp_en_d2:1; uint32_t pm_en_d2:1; uint32_t lc_en_d2:1; uint32_t resv11:1; uint32_t mp_en_d3:1; uint32_t pm_en_d3:1; uint32_t lc_en_d3:1; uint32_t resv15:1; uint32_t pat_match_en:5; uint32_t resv21_23:3; uint32_t pat_match_stat:5; uint32_t magic_status:1; uint32_t netman_status:1; uint32_t resv31:1; } cntl_bits; } nge_pm_cntl; #define NGE_MPT_CRC0 0x204 #define NGE_PMC_MK00 0x208 #define NGE_PMC_MK01 0x20C #define NGE_PMC_MK02 0x210 #define NGE_PMC_MK03 0x214 #define NGE_MPT_CRC1 0x218 #define NGE_PMC_MK10 0x21c #define NGE_PMC_MK11 0x220 #define NGE_PMC_MK12 0x224 #define NGE_PMC_MK13 0x228 #define NGE_MPT_CRC2 0x22c #define NGE_PMC_MK20 0x230 #define NGE_PMC_MK21 0x234 #define NGE_PMC_MK22 0x238 #define NGE_PMC_MK23 0x23c #define NGE_MPT_CRC3 0x240 #define NGE_PMC_MK30 0x244 #define NGE_PMC_MK31 0x248 #define NGE_PMC_MK32 0x24c #define NGE_PMC_MK33 0x250 #define NGE_MPT_CRC4 0x254 #define NGE_PMC_MK40 0x258 #define NGE_PMC_MK41 0x25c #define NGE_PMC_MK42 0x260 #define NGE_PMC_MK43 0x264 #define NGE_PMC_ALIAS 0x268 #define NGE_PMCSR_ALIAS 0x26c /* * Seeprom control */ #define NGE_EP_CNTL 0x500 #define EEPROM_CLKDIV 249 #define EEPROM_WAITCLK 0x7 typedef union _nge_cp_cntl { uint32_t cntl_val; struct { uint32_t clkdiv:8; uint32_t rom_size:3; uint32_t resv11:1; uint32_t word_wid:1; uint32_t resv13_15:3; uint32_t wait_slots:4; uint32_t resv20_31:12; } cntl_bits; } nge_cp_cntl; /* * Seeprom cmd control */ #define NGE_EP_CMD 0x504 #define SEEPROM_CMD_READ 0x0 #define SEEPROM_CMD_WRITE_ENABLE 0x1 #define SEEPROM_CMD_ERASE 0x2 #define SEEPROM_CMD_WRITE 0x3 #define SEEPROM_CMD_ERALSE_ALL 0x4 #define SEEPROM_CMD_WRITE_ALL 0x5 #define SEEPROM_CMD_WRITE_DIS 0x6 #define SEEPROM_READY 0x1 typedef union _nge_ep_cmd { uint32_t cmd_val; struct { uint32_t addr:16; uint32_t cmd:3; uint32_t resv19_30:12; uint32_t sts:1; } cmd_bits; } nge_ep_cmd; /* * Seeprom data register */ #define NGE_EP_DATA 0x508 typedef union _nge_ep_data { uint32_t data_val; struct { uint32_t data:16; uint32_t resv16_31:16; } data_bits; } nge_ep_data; /* * Power management control 2nd register (since MCP51) */ #define NGE_PM_CNTL2 0x600 typedef union _nge_pm_cntl2 { uint32_t cntl_val; struct { uint32_t phy_coma_set:1; uint32_t phy_coma_status:1; uint32_t resv2_3:2; uint32_t resv4:1; uint32_t resv5_7:3; uint32_t resv8_11:4; uint32_t resv12_15:4; uint32_t pmt5_en:1; uint32_t pmt6_en:1; uint32_t pmt7_en:1; uint32_t resv19_23:5; uint32_t pmt5_status:1; uint32_t pmt6_status:1; uint32_t pmt7_status:1; uint32_t resv27_31:5; } cntl_bits; } nge_pm_cntl2; /* * ASF RAM 0x800-0xfff */ /* * Hardware-defined Statistics Block Offsets * * These are given in the manual as addresses in NIC memory, starting * from the NIC statistics area base address of 0x2000; */ #define KS_BASE 0x0280 #define KS_ADDR(x) (((x)-KS_BASE)/sizeof (uint32_t)) typedef enum { KS_ifHOutOctets = KS_ADDR(0x0280), KS_ifHOutZeroRetranCount, KS_ifHOutOneRetranCount, KS_ifHOutMoreRetranCount, KS_ifHOutColCount, KS_ifHOutFifoovCount, KS_ifHOutLOCCount, KS_ifHOutExDecCount, KS_ifHOutRetryCount, KS_ifHInFrameErrCount, KS_ifHInExtraOctErrCount, KS_ifHInLColErrCount, KS_ifHInRuntCount, KS_ifHInOversizeErrCount, KS_ifHInFovErrCount, KS_ifHInFCSErrCount, KS_ifHInAlignErrCount, KS_ifHInLenErrCount, KS_ifHInUniPktsCount, KS_ifHInBroadPksCount, KS_ifHInMulPksCount, KS_STATS_SIZE = KS_ADDR(0x2d0) } nge_stats_offset_t; /* * Hardware-defined Statistics Block * * Another view of the statistic block, as a array and a structure ... */ typedef union { uint64_t a[KS_STATS_SIZE]; struct { uint64_t OutOctets; uint64_t OutZeroRetranCount; uint64_t OutOneRetranCount; uint64_t OutMoreRetranCount; uint64_t OutColCount; uint64_t OutFifoovCount; uint64_t OutLOCCount; uint64_t OutExDecCount; uint64_t OutRetryCount; uint64_t InFrameErrCount; uint64_t InExtraOctErrCount; uint64_t InLColErrCount; uint64_t InRuntCount; uint64_t InOversizeErrCount; uint64_t InFovErrCount; uint64_t InFCSErrCount; uint64_t InAlignErrCount; uint64_t InLenErrCount; uint64_t InUniPktsCount; uint64_t InBroadPksCount; uint64_t InMulPksCount; } s; } nge_hw_statistics_t; /* * MII (PHY) registers, beyond those already defined in */ #define NGE_PHY_NUMBER 32 #define MII_LP_ASYM_PAUSE 0x0800 #define MII_LP_PAUSE 0x0400 #define MII_100BASE_T4 0x0200 #define MII_100BASET_FD 0x0100 #define MII_100BASET_HD 0x0080 #define MII_10BASET_FD 0x0040 #define MII_10BASET_HD 0x0020 #define MII_ID_MARVELL 0x5043 #define MII_ID_CICADA 0x03f1 #define MII_IDL_MASK 0xfc00 #define MII_AN_LPNXTPG 8 #define MII_IEEE_EXT_STATUS 15 /* * New bits in the MII_CONTROL register */ #define MII_CONTROL_1000MB 0x0040 /* * Bits in the MII_1000BASE_T_CONTROL register * * The MASTER_CFG bit enables manual configuration of Master/Slave mode * (otherwise, roles are automatically negotiated). When this bit is set, * the MASTER_SEL bit forces Master mode, otherwise Slave mode is forced. */ #define MII_1000BASE_T_CONTROL 9 #define MII_1000BT_CTL_MASTER_CFG 0x1000 /* enable role select */ #define MII_1000BT_CTL_MASTER_SEL 0x0800 /* role select bit */ #define MII_1000BT_CTL_ADV_FDX 0x0200 #define MII_1000BT_CTL_ADV_HDX 0x0100 /* * Bits in the MII_1000BASE_T_STATUS register */ #define MII_1000BASE_T_STATUS 10 #define MII_1000BT_STAT_MASTER_FAULT 0x8000 #define MII_1000BT_STAT_MASTER_MODE 0x4000 #define MII_1000BT_STAT_LCL_RCV_OK 0x2000 #define MII_1000BT_STAT_RMT_RCV_OK 0x1000 #define MII_1000BT_STAT_LP_FDX_CAP 0x0800 #define MII_1000BT_STAT_LP_HDX_CAP 0x0400 #define MII_CICADA_BYPASS_CONTROL MII_VENDOR(2) #define CICADA_125MHZ_CLOCK_ENABLE 0x0001 #define MII_CICADA_10BASET_CONTROL MII_VENDOR(6) #define MII_CICADA_DISABLE_ECHO_MODE 0x2000 #define MII_CICADA_EXT_CONTROL MII_VENDOR(7) #define MII_CICADA_MODE_SELECT_BITS 0xf000 #define MII_CICADA_MODE_SELECT_RGMII 0x1000 #define MII_CICADA_POWER_SUPPLY_BITS 0x0e00 #define MII_CICADA_POWER_SUPPLY_3_3V 0x0000 #define MII_CICADA_POWER_SUPPLY_2_5V 0x0200 #define MII_CICADA_AUXCTRL_STATUS MII_VENDOR(12) #define MII_CICADA_PIN_PRORITY_SETTING 0x0004 #define MII_CICADA_PIN_PRORITY_DEFAULT 0x0000 #define NGE_REG_SIZE 0xfff #define NGE_MII_SIZE 0x20 #define NGE_SEEROM_SIZE 0x800 /* * Legacy rx's bd which does not support * any hardware offload */ typedef struct _legacy_rx_bd { uint32_t host_buf_addr; union { uint32_t cntl_val; struct { uint32_t bcnt:16; uint32_t end:1; uint32_t miss:1; uint32_t extra:1; uint32_t inten:1; uint32_t bam:1; uint32_t mam:1; uint32_t pam:1; uint32_t runt:1; uint32_t lcol:1; uint32_t max:1; uint32_t lfer:1; uint32_t crc:1; uint32_t ofol:1; uint32_t fram:1; uint32_t err:1; uint32_t own:1; } cntl_bits; } cntl_status; } legacy_rx_bd, *plegacy_rx_bd; /* * Stand offload rx's bd which supports hareware checksum * for tcp/ip */ #define CK8G_NO_HSUM 0x0 #define CK8G_TCP_SUM_ERR 0x1 #define CK8G_UDP_SUM_ERR 0x2 #define CK8G_IP_HSUM_ERR 0x3 #define CK8G_IP_HSUM 0x4 #define CK8G_TCP_SUM 0x5 #define CK8G_UDP_SUM 0x6 #define CK8G_RESV 0x7 typedef struct _sum_rx_bd { uint32_t host_buf_addr; union { uint32_t cntl_val; struct { uint32_t bcnt:14; uint32_t resv14_29:16; uint32_t inten:1; uint32_t own:1; } control_bits; struct { uint32_t bcnt:14; uint32_t resv14:1; uint32_t bam:1; uint32_t mam:1; uint32_t pam:1; uint32_t runt:1; uint32_t lcol:1; uint32_t max:1; uint32_t lfer:1; uint32_t crc:1; uint32_t ofol:1; uint32_t fram:1; uint32_t extra:1; uint32_t l3_l4_sum:3; uint32_t rend:1; uint32_t err:1; uint32_t own:1; } status_bits; } cntl_status; } sum_rx_bd, *psum_rx_bd; /* * Hot offload rx's bd which support 64bit access and * full-tcp hardware offload */ typedef struct _hot_rx_bd { uint32_t host_buf_addr_hi; uint32_t host_buf_addr_lo; uint32_t sw_tag; union { uint32_t cntl_val; struct { uint32_t bcnt:14; uint32_t resv14_29:16; uint32_t inten:1; uint32_t own:1; } control_bits; struct { uint32_t bcnt:14; uint32_t ctmach_rd:1; uint32_t bam:1; uint32_t mam:1; uint32_t pam:1; uint32_t runt:1; uint32_t lcol:1; uint32_t max:1; uint32_t lfer:1; uint32_t crc:1; uint32_t ofol:1; uint32_t fram:1; uint32_t extra:1; uint32_t l3_l4_sum:3; uint32_t rend:1; uint32_t err:1; uint32_t own:1; } status_bits_legacy; } cntl_status; } hot_rx_bd, *phot_rx_bd; /* * Legacy tx's bd which does not support * any hardware offload */ typedef struct _legacy_tx_bd { uint32_t host_buf_addr; union { uint32_t cntl_val; struct { uint32_t bcnt:16; uint32_t end:1; uint32_t resv17_23:7; uint32_t inten:1; uint32_t resv25_30:6; uint32_t own:1; } control_bits; struct { uint32_t bcnt:16; uint32_t end:1; uint32_t rtry:1; uint32_t trc:4; uint32_t inten:1; uint32_t exdef:1; uint32_t def:1; uint32_t lcar:1; uint32_t lcol:1; uint32_t uflo:1; uint32_t err:1; uint32_t own:1; } status_bits; } cntl_status; } legacy_tx_bd, *plegacy_tx_bd; /* * Stand offload tx's bd which supports hareware checksum * for tcp/ip */ typedef struct _sum_tx_bd { uint32_t host_buf_addr; union { uint32_t cntl_val; struct { uint32_t bcnt:14; uint32_t resv14_25:12; uint32_t tcp_hsum:1; uint32_t ip_hsum:1; uint32_t segen:1; uint32_t end:1; uint32_t inten:1; uint32_t own:1; } control_sum_bits; struct { uint32_t bcnt:14; uint32_t mss:14; uint32_t segen:1; uint32_t end:1; uint32_t inten:1; uint32_t own:1; } control_tso_bits; struct { uint32_t bcnt:14; uint32_t resv14_17:4; uint32_t rtry:1; uint32_t trc:4; uint32_t inten:1; uint32_t exdef:1; uint32_t def:1; uint32_t lcar:1; uint32_t lcol:1; uint32_t uflo:1; uint32_t end:1; uint32_t err:1; uint32_t own:1; } status_bits; } control_status; } sum_tx_bd, *psum_tx_bd; /* * Hot offload tx's bd which support 64bit access and * full-tcp hardware offload */ typedef struct _hot_tx_bd { uint32_t host_buf_addr_hi; uint32_t host_buf_addr_lo; union { uint32_t parm_val; struct { uint32_t resv0_15:16; uint32_t resv16:1; uint32_t resv17:1; uint32_t resv18_31:14; } parm_bits; } hot_parms; union { uint32_t cntl_val; struct { uint32_t bcnt:14; uint32_t resv14_25:12; uint32_t tcp_hsum:1; uint32_t ip_hsum:1; uint32_t segen:1; uint32_t end:1; uint32_t inten:1; uint32_t own:1; } control_sum_bits; struct { uint32_t bcnt:14; uint32_t mss:14; uint32_t segen:1; uint32_t end:1; uint32_t inten:1; uint32_t own:1; } control_tso_bits; struct { uint32_t bcnt:14; uint32_t resv14_17:4; uint32_t rtry:1; uint32_t trc:4; uint32_t inten:1; uint32_t exdef:1; uint32_t def:1; uint32_t lcar:1; uint32_t lcol:1; uint32_t uflo:1; uint32_t end:1; uint32_t err:1; uint32_t own:1; } status_bits; } control_status; } hot_tx_bd, *phot_tx_bd; #ifdef __cplusplus } #endif #endif /* _SYS_NGE_CHIP_H */