176fbb0b9SSepherosa Ziehau /*- 276fbb0b9SSepherosa Ziehau * Copyright (c) 2008, Pyun YongHyeon <yongari@FreeBSD.org> 376fbb0b9SSepherosa Ziehau * All rights reserved. 476fbb0b9SSepherosa Ziehau * 576fbb0b9SSepherosa Ziehau * Redistribution and use in source and binary forms, with or without 676fbb0b9SSepherosa Ziehau * modification, are permitted provided that the following conditions 776fbb0b9SSepherosa Ziehau * are met: 876fbb0b9SSepherosa Ziehau * 1. Redistributions of source code must retain the above copyright 976fbb0b9SSepherosa Ziehau * notice unmodified, this list of conditions, and the following 1076fbb0b9SSepherosa Ziehau * disclaimer. 1176fbb0b9SSepherosa Ziehau * 2. Redistributions in binary form must reproduce the above copyright 1276fbb0b9SSepherosa Ziehau * notice, this list of conditions and the following disclaimer in the 1376fbb0b9SSepherosa Ziehau * documentation and/or other materials provided with the distribution. 1476fbb0b9SSepherosa Ziehau * 1576fbb0b9SSepherosa Ziehau * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1676fbb0b9SSepherosa Ziehau * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1776fbb0b9SSepherosa Ziehau * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1876fbb0b9SSepherosa Ziehau * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1976fbb0b9SSepherosa Ziehau * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2076fbb0b9SSepherosa Ziehau * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2176fbb0b9SSepherosa Ziehau * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2276fbb0b9SSepherosa Ziehau * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2376fbb0b9SSepherosa Ziehau * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2476fbb0b9SSepherosa Ziehau * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2576fbb0b9SSepherosa Ziehau * SUCH DAMAGE. 2676fbb0b9SSepherosa Ziehau * 2776fbb0b9SSepherosa Ziehau * $FreeBSD: src/sys/dev/jme/if_jmevar.h,v 1.1 2008/05/27 01:42:01 yongari Exp $ 28b249905bSSepherosa Ziehau * $DragonFly: src/sys/dev/netif/jme/if_jmevar.h,v 1.8 2008/11/26 11:55:18 sephe Exp $ 2976fbb0b9SSepherosa Ziehau */ 3076fbb0b9SSepherosa Ziehau 3176fbb0b9SSepherosa Ziehau #ifndef _IF_JMEVAR_H 3276fbb0b9SSepherosa Ziehau #define _IF_JMEVAR_H 3376fbb0b9SSepherosa Ziehau 3476fbb0b9SSepherosa Ziehau #include <sys/queue.h> 3576fbb0b9SSepherosa Ziehau #include <sys/callout.h> 3676fbb0b9SSepherosa Ziehau #include <sys/taskqueue.h> 3776fbb0b9SSepherosa Ziehau 3876fbb0b9SSepherosa Ziehau /* 397405bec3SSepherosa Ziehau * JMC250 supports upto JME_NDESC_MAX descriptors and the number of 4083b03786SSepherosa Ziehau * descriptors should be multiple of JME_NDESC_ALIGN. 4176fbb0b9SSepherosa Ziehau */ 4269325526SSepherosa Ziehau #define JME_TX_DESC_CNT_DEF 384 4369325526SSepherosa Ziehau #define JME_RX_DESC_CNT_DEF 256 4469325526SSepherosa Ziehau 4583b03786SSepherosa Ziehau #define JME_NDESC_ALIGN 16 4669325526SSepherosa Ziehau #define JME_NDESC_MAX 1024 4783b03786SSepherosa Ziehau 48760c056cSSepherosa Ziehau #define JME_NRXRING_1 1 49760c056cSSepherosa Ziehau #define JME_NRXRING_2 2 50760c056cSSepherosa Ziehau #define JME_NRXRING_4 4 51760c056cSSepherosa Ziehau 52760c056cSSepherosa Ziehau #define JME_NRXRING_DEF JME_NRXRING_1 53760c056cSSepherosa Ziehau #define JME_NRXRING_MIN JME_NRXRING_1 54760c056cSSepherosa Ziehau #define JME_NRXRING_MAX JME_NRXRING_4 554447c752SSepherosa Ziehau 5676fbb0b9SSepherosa Ziehau /* 5776fbb0b9SSepherosa Ziehau * Tx/Rx descriptor queue base should be 16bytes aligned and 5876fbb0b9SSepherosa Ziehau * should not cross 4G bytes boundary on the 64bits address 5976fbb0b9SSepherosa Ziehau * mode. 6076fbb0b9SSepherosa Ziehau */ 6176fbb0b9SSepherosa Ziehau #define JME_TX_RING_ALIGN 16 6276fbb0b9SSepherosa Ziehau #define JME_RX_RING_ALIGN 16 639d424ceeSSepherosa Ziehau #define JME_MAXSEGSIZE 4096 6476fbb0b9SSepherosa Ziehau #define JME_TSO_MAXSIZE (65535 + sizeof(struct ether_vlan_header)) 6576fbb0b9SSepherosa Ziehau #define JME_MAXTXSEGS 32 6676fbb0b9SSepherosa Ziehau #define JME_RX_BUF_ALIGN sizeof(uint64_t) 6776fbb0b9SSepherosa Ziehau #define JME_SSB_ALIGN 16 6876fbb0b9SSepherosa Ziehau 69a7547dadSSepherosa Ziehau #if (BUS_SPACE_MAXADDR != BUS_SPACE_MAXADDR_32BIT) 70a7547dadSSepherosa Ziehau #define JME_RING_BOUNDARY 0x100000000ULL 71a7547dadSSepherosa Ziehau #else 72a7547dadSSepherosa Ziehau #define JME_RING_BOUNDARY 0 73a7547dadSSepherosa Ziehau #endif 74a7547dadSSepherosa Ziehau 7576fbb0b9SSepherosa Ziehau #define JME_ADDR_LO(x) ((uint64_t) (x) & 0xFFFFFFFF) 7676fbb0b9SSepherosa Ziehau #define JME_ADDR_HI(x) ((uint64_t) (x) >> 32) 7776fbb0b9SSepherosa Ziehau 7876fbb0b9SSepherosa Ziehau #define JME_MSI_MESSAGES 8 7976fbb0b9SSepherosa Ziehau #define JME_MSIX_MESSAGES 8 8076fbb0b9SSepherosa Ziehau 8176fbb0b9SSepherosa Ziehau /* Water mark to kick reclaiming Tx buffers. */ 8283b03786SSepherosa Ziehau #define JME_TX_DESC_HIWAT(sc) \ 8369325526SSepherosa Ziehau ((sc)->jme_tx_desc_cnt - (((sc)->jme_tx_desc_cnt * 3) / 10)) 8476fbb0b9SSepherosa Ziehau 8576fbb0b9SSepherosa Ziehau /* 8676fbb0b9SSepherosa Ziehau * JMC250 can send 9K jumbo frame on Tx path and can receive 8776fbb0b9SSepherosa Ziehau * 65535 bytes. 8876fbb0b9SSepherosa Ziehau */ 8976fbb0b9SSepherosa Ziehau #define JME_JUMBO_FRAMELEN 9216 9076fbb0b9SSepherosa Ziehau #define JME_JUMBO_MTU \ 9176fbb0b9SSepherosa Ziehau (JME_JUMBO_FRAMELEN - sizeof(struct ether_vlan_header) - \ 9276fbb0b9SSepherosa Ziehau ETHER_HDR_LEN - ETHER_CRC_LEN) 9376fbb0b9SSepherosa Ziehau #define JME_MAX_MTU \ 9476fbb0b9SSepherosa Ziehau (ETHER_MAX_LEN + sizeof(struct ether_vlan_header) - \ 9576fbb0b9SSepherosa Ziehau ETHER_HDR_LEN - ETHER_CRC_LEN) 9676fbb0b9SSepherosa Ziehau /* 9776fbb0b9SSepherosa Ziehau * JMC250 can't handle Tx checksum offload/TSO if frame length 9876fbb0b9SSepherosa Ziehau * is larger than its FIFO size(2K). It's also good idea to not 9976fbb0b9SSepherosa Ziehau * use jumbo frame if hardware is running at half-duplex media. 10076fbb0b9SSepherosa Ziehau * Because the jumbo frame may not fit into the Tx FIFO, 10176fbb0b9SSepherosa Ziehau * collisions make hardware fetch frame from host memory with 10276fbb0b9SSepherosa Ziehau * DMA again which in turn slows down Tx performance 10376fbb0b9SSepherosa Ziehau * significantly. 10476fbb0b9SSepherosa Ziehau */ 10576fbb0b9SSepherosa Ziehau #define JME_TX_FIFO_SIZE 2000 10676fbb0b9SSepherosa Ziehau /* 10776fbb0b9SSepherosa Ziehau * JMC250 has just 4K Rx FIFO. To support jumbo frame that is 10876fbb0b9SSepherosa Ziehau * larger than 4K bytes in length, Rx FIFO threshold should be 10976fbb0b9SSepherosa Ziehau * adjusted to minimize Rx FIFO overrun. 11076fbb0b9SSepherosa Ziehau */ 11176fbb0b9SSepherosa Ziehau #define JME_RX_FIFO_SIZE 4000 11276fbb0b9SSepherosa Ziehau 11376fbb0b9SSepherosa Ziehau #define JME_DESC_INC(x, y) ((x) = ((x) + 1) % (y)) 11476fbb0b9SSepherosa Ziehau 11576fbb0b9SSepherosa Ziehau struct jme_txdesc { 11676fbb0b9SSepherosa Ziehau struct mbuf *tx_m; 11776fbb0b9SSepherosa Ziehau bus_dmamap_t tx_dmamap; 11876fbb0b9SSepherosa Ziehau int tx_ndesc; 11976fbb0b9SSepherosa Ziehau struct jme_desc *tx_desc; 12076fbb0b9SSepherosa Ziehau }; 12176fbb0b9SSepherosa Ziehau 12276fbb0b9SSepherosa Ziehau struct jme_rxdesc { 12376fbb0b9SSepherosa Ziehau struct mbuf *rx_m; 12476fbb0b9SSepherosa Ziehau bus_dmamap_t rx_dmamap; 12576fbb0b9SSepherosa Ziehau struct jme_desc *rx_desc; 12676fbb0b9SSepherosa Ziehau }; 12776fbb0b9SSepherosa Ziehau 1284447c752SSepherosa Ziehau /* 1294447c752SSepherosa Ziehau * RX ring/descs 1304447c752SSepherosa Ziehau */ 1314447c752SSepherosa Ziehau struct jme_rxdata { 1324447c752SSepherosa Ziehau bus_dma_tag_t jme_rx_tag; /* RX mbuf tag */ 1334447c752SSepherosa Ziehau bus_dmamap_t jme_rx_sparemap; 1344447c752SSepherosa Ziehau struct jme_rxdesc *jme_rxdesc; 1354447c752SSepherosa Ziehau 1364447c752SSepherosa Ziehau struct jme_desc *jme_rx_ring; 1374447c752SSepherosa Ziehau bus_addr_t jme_rx_ring_paddr; 1384447c752SSepherosa Ziehau bus_dma_tag_t jme_rx_ring_tag; 1394447c752SSepherosa Ziehau bus_dmamap_t jme_rx_ring_map; 1404447c752SSepherosa Ziehau 1414447c752SSepherosa Ziehau int jme_rx_cons; 1424447c752SSepherosa Ziehau 1434447c752SSepherosa Ziehau int jme_rxlen; 1444447c752SSepherosa Ziehau struct mbuf *jme_rxhead; 1454447c752SSepherosa Ziehau struct mbuf *jme_rxtail; 1464447c752SSepherosa Ziehau }; 1474447c752SSepherosa Ziehau 14876fbb0b9SSepherosa Ziehau struct jme_chain_data { 149560616bfSSepherosa Ziehau /* 150560616bfSSepherosa Ziehau * Top level tags 151560616bfSSepherosa Ziehau */ 152560616bfSSepherosa Ziehau bus_dma_tag_t jme_ring_tag; /* parent ring tag */ 153560616bfSSepherosa Ziehau bus_dma_tag_t jme_buffer_tag; /* parent mbuf/ssb tag */ 154560616bfSSepherosa Ziehau 155560616bfSSepherosa Ziehau /* 156560616bfSSepherosa Ziehau * Shadow status block 157560616bfSSepherosa Ziehau */ 158560616bfSSepherosa Ziehau struct jme_ssb *jme_ssb_block; 159560616bfSSepherosa Ziehau bus_addr_t jme_ssb_block_paddr; 16076fbb0b9SSepherosa Ziehau bus_dma_tag_t jme_ssb_tag; 16176fbb0b9SSepherosa Ziehau bus_dmamap_t jme_ssb_map; 162560616bfSSepherosa Ziehau 163560616bfSSepherosa Ziehau /* 164560616bfSSepherosa Ziehau * TX ring/descs 165560616bfSSepherosa Ziehau */ 166560616bfSSepherosa Ziehau bus_dma_tag_t jme_tx_tag; /* TX mbuf tag */ 16783b03786SSepherosa Ziehau struct jme_txdesc *jme_txdesc; 168560616bfSSepherosa Ziehau 169560616bfSSepherosa Ziehau struct jme_desc *jme_tx_ring; 170560616bfSSepherosa Ziehau bus_addr_t jme_tx_ring_paddr; 17176fbb0b9SSepherosa Ziehau bus_dma_tag_t jme_tx_ring_tag; 17276fbb0b9SSepherosa Ziehau bus_dmamap_t jme_tx_ring_map; 17376fbb0b9SSepherosa Ziehau 17476fbb0b9SSepherosa Ziehau int jme_tx_prod; 17576fbb0b9SSepherosa Ziehau int jme_tx_cons; 17676fbb0b9SSepherosa Ziehau int jme_tx_cnt; 17776fbb0b9SSepherosa Ziehau 1784447c752SSepherosa Ziehau struct jme_rxdata jme_rx_data[JME_NRXRING_MAX]; 17976fbb0b9SSepherosa Ziehau }; 18076fbb0b9SSepherosa Ziehau 18183b03786SSepherosa Ziehau #define JME_TX_RING_SIZE(sc) \ 18269325526SSepherosa Ziehau (sizeof(struct jme_desc) * (sc)->jme_tx_desc_cnt) 18383b03786SSepherosa Ziehau #define JME_RX_RING_SIZE(sc) \ 18469325526SSepherosa Ziehau (sizeof(struct jme_desc) * (sc)->jme_rx_desc_cnt) 18576fbb0b9SSepherosa Ziehau #define JME_SSB_SIZE sizeof(struct jme_ssb) 18676fbb0b9SSepherosa Ziehau 18776fbb0b9SSepherosa Ziehau /* 18876fbb0b9SSepherosa Ziehau * Software state per device. 18976fbb0b9SSepherosa Ziehau */ 19076fbb0b9SSepherosa Ziehau struct jme_softc { 19176fbb0b9SSepherosa Ziehau struct arpcom arpcom; 19276fbb0b9SSepherosa Ziehau device_t jme_dev; 19376fbb0b9SSepherosa Ziehau 19476fbb0b9SSepherosa Ziehau int jme_mem_rid; 19576fbb0b9SSepherosa Ziehau struct resource *jme_mem_res; 19676fbb0b9SSepherosa Ziehau bus_space_tag_t jme_mem_bt; 19776fbb0b9SSepherosa Ziehau bus_space_handle_t jme_mem_bh; 19876fbb0b9SSepherosa Ziehau 199*3eba890aSSepherosa Ziehau int jme_irq_type; 20076fbb0b9SSepherosa Ziehau int jme_irq_rid; 20176fbb0b9SSepherosa Ziehau struct resource *jme_irq_res; 20276fbb0b9SSepherosa Ziehau void *jme_irq_handle; 20376fbb0b9SSepherosa Ziehau 20476fbb0b9SSepherosa Ziehau device_t jme_miibus; 20576fbb0b9SSepherosa Ziehau int jme_phyaddr; 206b249905bSSepherosa Ziehau bus_addr_t jme_lowaddr; 20776fbb0b9SSepherosa Ziehau 208b249905bSSepherosa Ziehau uint32_t jme_clksrc; 209b249905bSSepherosa Ziehau uint32_t jme_clksrc_1000; 21076fbb0b9SSepherosa Ziehau uint32_t jme_tx_dma_size; 21176fbb0b9SSepherosa Ziehau uint32_t jme_rx_dma_size; 212ec7e787bSSepherosa Ziehau 213ec7e787bSSepherosa Ziehau uint32_t jme_caps; 214ec7e787bSSepherosa Ziehau #define JME_CAP_FPGA 0x0001 215ec7e787bSSepherosa Ziehau #define JME_CAP_PCIE 0x0002 216ec7e787bSSepherosa Ziehau #define JME_CAP_PMCAP 0x0004 217ec7e787bSSepherosa Ziehau #define JME_CAP_FASTETH 0x0008 2183a5f3f36SSepherosa Ziehau #define JME_CAP_JUMBO 0x0010 219ad22907fSSepherosa Ziehau 220ad22907fSSepherosa Ziehau uint32_t jme_workaround; 221ad22907fSSepherosa Ziehau #define JME_WA_EXTFIFO 0x0001 2223b3da110SSepherosa Ziehau #define JME_WA_HDX 0x0002 223ec7e787bSSepherosa Ziehau 224ec7e787bSSepherosa Ziehau uint32_t jme_flags; 225ec7e787bSSepherosa Ziehau #define JME_FLAG_MSI 0x0001 226ec7e787bSSepherosa Ziehau #define JME_FLAG_MSIX 0x0002 227ec7e787bSSepherosa Ziehau #define JME_FLAG_DETACH 0x0004 228ec7e787bSSepherosa Ziehau #define JME_FLAG_LINK 0x0008 22976fbb0b9SSepherosa Ziehau 23076fbb0b9SSepherosa Ziehau struct callout jme_tick_ch; 23176fbb0b9SSepherosa Ziehau struct jme_chain_data jme_cdata; 23276fbb0b9SSepherosa Ziehau int jme_if_flags; 23376fbb0b9SSepherosa Ziehau uint32_t jme_txcsr; 23476fbb0b9SSepherosa Ziehau uint32_t jme_rxcsr; 23576fbb0b9SSepherosa Ziehau 23676fbb0b9SSepherosa Ziehau int jme_txd_spare; 23776fbb0b9SSepherosa Ziehau 23876fbb0b9SSepherosa Ziehau struct sysctl_ctx_list jme_sysctl_ctx; 23976fbb0b9SSepherosa Ziehau struct sysctl_oid *jme_sysctl_tree; 24076fbb0b9SSepherosa Ziehau 24176fbb0b9SSepherosa Ziehau /* 24276fbb0b9SSepherosa Ziehau * Sysctl variables 24376fbb0b9SSepherosa Ziehau */ 24476fbb0b9SSepherosa Ziehau int jme_tx_coal_to; 24576fbb0b9SSepherosa Ziehau int jme_tx_coal_pkt; 24676fbb0b9SSepherosa Ziehau int jme_rx_coal_to; 24776fbb0b9SSepherosa Ziehau int jme_rx_coal_pkt; 24869325526SSepherosa Ziehau int jme_rx_desc_cnt; 24969325526SSepherosa Ziehau int jme_tx_desc_cnt; 2504447c752SSepherosa Ziehau int jme_rx_ring_cnt; 251760c056cSSepherosa Ziehau int jme_rx_ring_inuse; 252760c056cSSepherosa Ziehau int jme_rss_debug; 253760c056cSSepherosa Ziehau u_int jme_rx_ring_pkt[JME_NRXRING_MAX]; 25476fbb0b9SSepherosa Ziehau }; 25576fbb0b9SSepherosa Ziehau 25676fbb0b9SSepherosa Ziehau /* Register access macros. */ 25776fbb0b9SSepherosa Ziehau #define CSR_WRITE_4(_sc, reg, val) \ 25876fbb0b9SSepherosa Ziehau bus_space_write_4((_sc)->jme_mem_bt, (_sc)->jme_mem_bh, (reg), (val)) 25976fbb0b9SSepherosa Ziehau #define CSR_READ_4(_sc, reg) \ 26076fbb0b9SSepherosa Ziehau bus_space_read_4((_sc)->jme_mem_bt, (_sc)->jme_mem_bh, (reg)) 26176fbb0b9SSepherosa Ziehau 26276fbb0b9SSepherosa Ziehau #define JME_MAXERR 5 26376fbb0b9SSepherosa Ziehau 2644447c752SSepherosa Ziehau #define JME_RXCHAIN_RESET(sc, ring) \ 26576fbb0b9SSepherosa Ziehau do { \ 2664447c752SSepherosa Ziehau (sc)->jme_cdata.jme_rx_data[(ring)].jme_rxhead = NULL; \ 2674447c752SSepherosa Ziehau (sc)->jme_cdata.jme_rx_data[(ring)].jme_rxtail = NULL; \ 2684447c752SSepherosa Ziehau (sc)->jme_cdata.jme_rx_data[(ring)].jme_rxlen = 0; \ 26976fbb0b9SSepherosa Ziehau } while (0) 27076fbb0b9SSepherosa Ziehau 27176fbb0b9SSepherosa Ziehau #define JME_TX_TIMEOUT 5 27276fbb0b9SSepherosa Ziehau #define JME_TIMEOUT 1000 27376fbb0b9SSepherosa Ziehau #define JME_PHY_TIMEOUT 1000 27476fbb0b9SSepherosa Ziehau #define JME_EEPROM_TIMEOUT 1000 27576fbb0b9SSepherosa Ziehau 27676fbb0b9SSepherosa Ziehau #define JME_TXD_RSVD 1 27776fbb0b9SSepherosa Ziehau 27876fbb0b9SSepherosa Ziehau #endif 279