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 /* 39*7405bec3SSepherosa 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 4876fbb0b9SSepherosa Ziehau /* 4976fbb0b9SSepherosa Ziehau * Tx/Rx descriptor queue base should be 16bytes aligned and 5076fbb0b9SSepherosa Ziehau * should not cross 4G bytes boundary on the 64bits address 5176fbb0b9SSepherosa Ziehau * mode. 5276fbb0b9SSepherosa Ziehau */ 5376fbb0b9SSepherosa Ziehau #define JME_TX_RING_ALIGN 16 5476fbb0b9SSepherosa Ziehau #define JME_RX_RING_ALIGN 16 5576fbb0b9SSepherosa Ziehau #define JME_TSO_MAXSEGSIZE 4096 5676fbb0b9SSepherosa Ziehau #define JME_TSO_MAXSIZE (65535 + sizeof(struct ether_vlan_header)) 5776fbb0b9SSepherosa Ziehau #define JME_MAXTXSEGS 32 5876fbb0b9SSepherosa Ziehau #define JME_RX_BUF_ALIGN sizeof(uint64_t) 5976fbb0b9SSepherosa Ziehau #define JME_SSB_ALIGN 16 6076fbb0b9SSepherosa Ziehau 6176fbb0b9SSepherosa Ziehau #define JME_ADDR_LO(x) ((uint64_t) (x) & 0xFFFFFFFF) 6276fbb0b9SSepherosa Ziehau #define JME_ADDR_HI(x) ((uint64_t) (x) >> 32) 6376fbb0b9SSepherosa Ziehau 6476fbb0b9SSepherosa Ziehau #define JME_MSI_MESSAGES 8 6576fbb0b9SSepherosa Ziehau #define JME_MSIX_MESSAGES 8 6676fbb0b9SSepherosa Ziehau 6776fbb0b9SSepherosa Ziehau /* Water mark to kick reclaiming Tx buffers. */ 6883b03786SSepherosa Ziehau #define JME_TX_DESC_HIWAT(sc) \ 6969325526SSepherosa Ziehau ((sc)->jme_tx_desc_cnt - (((sc)->jme_tx_desc_cnt * 3) / 10)) 7076fbb0b9SSepherosa Ziehau 7176fbb0b9SSepherosa Ziehau /* 7276fbb0b9SSepherosa Ziehau * JMC250 can send 9K jumbo frame on Tx path and can receive 7376fbb0b9SSepherosa Ziehau * 65535 bytes. 7476fbb0b9SSepherosa Ziehau */ 7576fbb0b9SSepherosa Ziehau #define JME_JUMBO_FRAMELEN 9216 7676fbb0b9SSepherosa Ziehau #define JME_JUMBO_MTU \ 7776fbb0b9SSepherosa Ziehau (JME_JUMBO_FRAMELEN - sizeof(struct ether_vlan_header) - \ 7876fbb0b9SSepherosa Ziehau ETHER_HDR_LEN - ETHER_CRC_LEN) 7976fbb0b9SSepherosa Ziehau #define JME_MAX_MTU \ 8076fbb0b9SSepherosa Ziehau (ETHER_MAX_LEN + sizeof(struct ether_vlan_header) - \ 8176fbb0b9SSepherosa Ziehau ETHER_HDR_LEN - ETHER_CRC_LEN) 8276fbb0b9SSepherosa Ziehau /* 8376fbb0b9SSepherosa Ziehau * JMC250 can't handle Tx checksum offload/TSO if frame length 8476fbb0b9SSepherosa Ziehau * is larger than its FIFO size(2K). It's also good idea to not 8576fbb0b9SSepherosa Ziehau * use jumbo frame if hardware is running at half-duplex media. 8676fbb0b9SSepherosa Ziehau * Because the jumbo frame may not fit into the Tx FIFO, 8776fbb0b9SSepherosa Ziehau * collisions make hardware fetch frame from host memory with 8876fbb0b9SSepherosa Ziehau * DMA again which in turn slows down Tx performance 8976fbb0b9SSepherosa Ziehau * significantly. 9076fbb0b9SSepherosa Ziehau */ 9176fbb0b9SSepherosa Ziehau #define JME_TX_FIFO_SIZE 2000 9276fbb0b9SSepherosa Ziehau /* 9376fbb0b9SSepherosa Ziehau * JMC250 has just 4K Rx FIFO. To support jumbo frame that is 9476fbb0b9SSepherosa Ziehau * larger than 4K bytes in length, Rx FIFO threshold should be 9576fbb0b9SSepherosa Ziehau * adjusted to minimize Rx FIFO overrun. 9676fbb0b9SSepherosa Ziehau */ 9776fbb0b9SSepherosa Ziehau #define JME_RX_FIFO_SIZE 4000 9876fbb0b9SSepherosa Ziehau 9976fbb0b9SSepherosa Ziehau #define JME_DESC_INC(x, y) ((x) = ((x) + 1) % (y)) 10076fbb0b9SSepherosa Ziehau 10176fbb0b9SSepherosa Ziehau struct jme_txdesc { 10276fbb0b9SSepherosa Ziehau struct mbuf *tx_m; 10376fbb0b9SSepherosa Ziehau bus_dmamap_t tx_dmamap; 10476fbb0b9SSepherosa Ziehau int tx_ndesc; 10576fbb0b9SSepherosa Ziehau struct jme_desc *tx_desc; 10676fbb0b9SSepherosa Ziehau }; 10776fbb0b9SSepherosa Ziehau 10876fbb0b9SSepherosa Ziehau struct jme_rxdesc { 10976fbb0b9SSepherosa Ziehau struct mbuf *rx_m; 11076fbb0b9SSepherosa Ziehau bus_dmamap_t rx_dmamap; 11176fbb0b9SSepherosa Ziehau struct jme_desc *rx_desc; 11276fbb0b9SSepherosa Ziehau }; 11376fbb0b9SSepherosa Ziehau 11476fbb0b9SSepherosa Ziehau struct jme_chain_data { 115560616bfSSepherosa Ziehau /* 116560616bfSSepherosa Ziehau * Top level tags 117560616bfSSepherosa Ziehau */ 118560616bfSSepherosa Ziehau bus_dma_tag_t jme_ring_tag; /* parent ring tag */ 119560616bfSSepherosa Ziehau bus_dma_tag_t jme_buffer_tag; /* parent mbuf/ssb tag */ 120560616bfSSepherosa Ziehau 121560616bfSSepherosa Ziehau /* 122560616bfSSepherosa Ziehau * Shadow status block 123560616bfSSepherosa Ziehau */ 124560616bfSSepherosa Ziehau struct jme_ssb *jme_ssb_block; 125560616bfSSepherosa Ziehau bus_addr_t jme_ssb_block_paddr; 12676fbb0b9SSepherosa Ziehau bus_dma_tag_t jme_ssb_tag; 12776fbb0b9SSepherosa Ziehau bus_dmamap_t jme_ssb_map; 128560616bfSSepherosa Ziehau 129560616bfSSepherosa Ziehau /* 130560616bfSSepherosa Ziehau * TX ring/descs 131560616bfSSepherosa Ziehau */ 132560616bfSSepherosa Ziehau bus_dma_tag_t jme_tx_tag; /* TX mbuf tag */ 13383b03786SSepherosa Ziehau struct jme_txdesc *jme_txdesc; 134560616bfSSepherosa Ziehau 135560616bfSSepherosa Ziehau struct jme_desc *jme_tx_ring; 136560616bfSSepherosa Ziehau bus_addr_t jme_tx_ring_paddr; 13776fbb0b9SSepherosa Ziehau bus_dma_tag_t jme_tx_ring_tag; 13876fbb0b9SSepherosa Ziehau bus_dmamap_t jme_tx_ring_map; 13976fbb0b9SSepherosa Ziehau 14076fbb0b9SSepherosa Ziehau int jme_tx_prod; 14176fbb0b9SSepherosa Ziehau int jme_tx_cons; 14276fbb0b9SSepherosa Ziehau int jme_tx_cnt; 14376fbb0b9SSepherosa Ziehau 144560616bfSSepherosa Ziehau /* 145560616bfSSepherosa Ziehau * RX ring/descs 146560616bfSSepherosa Ziehau */ 147560616bfSSepherosa Ziehau bus_dma_tag_t jme_rx_tag; /* RX mbuf tag */ 148560616bfSSepherosa Ziehau bus_dmamap_t jme_rx_sparemap; 149560616bfSSepherosa Ziehau struct jme_rxdesc *jme_rxdesc; 150560616bfSSepherosa Ziehau 151560616bfSSepherosa Ziehau struct jme_desc *jme_rx_ring; 152560616bfSSepherosa Ziehau bus_addr_t jme_rx_ring_paddr; 153560616bfSSepherosa Ziehau bus_dma_tag_t jme_rx_ring_tag; 154560616bfSSepherosa Ziehau bus_dmamap_t jme_rx_ring_map; 155560616bfSSepherosa Ziehau 15676fbb0b9SSepherosa Ziehau int jme_rx_cons; 157560616bfSSepherosa Ziehau 15876fbb0b9SSepherosa Ziehau int jme_rxlen; 15976fbb0b9SSepherosa Ziehau struct mbuf *jme_rxhead; 16076fbb0b9SSepherosa Ziehau struct mbuf *jme_rxtail; 16176fbb0b9SSepherosa Ziehau }; 16276fbb0b9SSepherosa Ziehau 16383b03786SSepherosa Ziehau #define JME_TX_RING_SIZE(sc) \ 16469325526SSepherosa Ziehau (sizeof(struct jme_desc) * (sc)->jme_tx_desc_cnt) 16583b03786SSepherosa Ziehau #define JME_RX_RING_SIZE(sc) \ 16669325526SSepherosa Ziehau (sizeof(struct jme_desc) * (sc)->jme_rx_desc_cnt) 16776fbb0b9SSepherosa Ziehau #define JME_SSB_SIZE sizeof(struct jme_ssb) 16876fbb0b9SSepherosa Ziehau 16976fbb0b9SSepherosa Ziehau struct jme_dmamap_ctx { 17076fbb0b9SSepherosa Ziehau int nsegs; 17176fbb0b9SSepherosa Ziehau bus_dma_segment_t *segs; 17276fbb0b9SSepherosa Ziehau }; 17376fbb0b9SSepherosa Ziehau 17476fbb0b9SSepherosa Ziehau /* 17576fbb0b9SSepherosa Ziehau * Software state per device. 17676fbb0b9SSepherosa Ziehau */ 17776fbb0b9SSepherosa Ziehau struct jme_softc { 17876fbb0b9SSepherosa Ziehau struct arpcom arpcom; 17976fbb0b9SSepherosa Ziehau device_t jme_dev; 18076fbb0b9SSepherosa Ziehau 18176fbb0b9SSepherosa Ziehau int jme_mem_rid; 18276fbb0b9SSepherosa Ziehau struct resource *jme_mem_res; 18376fbb0b9SSepherosa Ziehau bus_space_tag_t jme_mem_bt; 18476fbb0b9SSepherosa Ziehau bus_space_handle_t jme_mem_bh; 18576fbb0b9SSepherosa Ziehau 18676fbb0b9SSepherosa Ziehau int jme_irq_rid; 18776fbb0b9SSepherosa Ziehau struct resource *jme_irq_res; 18876fbb0b9SSepherosa Ziehau void *jme_irq_handle; 18976fbb0b9SSepherosa Ziehau 19076fbb0b9SSepherosa Ziehau device_t jme_miibus; 19176fbb0b9SSepherosa Ziehau int jme_phyaddr; 192b249905bSSepherosa Ziehau bus_addr_t jme_lowaddr; 19376fbb0b9SSepherosa Ziehau 194b249905bSSepherosa Ziehau uint32_t jme_clksrc; 195b249905bSSepherosa Ziehau uint32_t jme_clksrc_1000; 19676fbb0b9SSepherosa Ziehau uint32_t jme_tx_dma_size; 19776fbb0b9SSepherosa Ziehau uint32_t jme_rx_dma_size; 198ec7e787bSSepherosa Ziehau 199ec7e787bSSepherosa Ziehau uint32_t jme_caps; 200ec7e787bSSepherosa Ziehau #define JME_CAP_FPGA 0x0001 201ec7e787bSSepherosa Ziehau #define JME_CAP_PCIE 0x0002 202ec7e787bSSepherosa Ziehau #define JME_CAP_PMCAP 0x0004 203ec7e787bSSepherosa Ziehau #define JME_CAP_FASTETH 0x0008 2043a5f3f36SSepherosa Ziehau #define JME_CAP_JUMBO 0x0010 205ad22907fSSepherosa Ziehau 206ad22907fSSepherosa Ziehau uint32_t jme_workaround; 207ad22907fSSepherosa Ziehau #define JME_WA_EXTFIFO 0x0001 2083b3da110SSepherosa Ziehau #define JME_WA_HDX 0x0002 209ec7e787bSSepherosa Ziehau 210ec7e787bSSepherosa Ziehau uint32_t jme_flags; 211ec7e787bSSepherosa Ziehau #define JME_FLAG_MSI 0x0001 212ec7e787bSSepherosa Ziehau #define JME_FLAG_MSIX 0x0002 213ec7e787bSSepherosa Ziehau #define JME_FLAG_DETACH 0x0004 214ec7e787bSSepherosa Ziehau #define JME_FLAG_LINK 0x0008 21576fbb0b9SSepherosa Ziehau 21676fbb0b9SSepherosa Ziehau struct callout jme_tick_ch; 21776fbb0b9SSepherosa Ziehau struct jme_chain_data jme_cdata; 21876fbb0b9SSepherosa Ziehau int jme_if_flags; 21976fbb0b9SSepherosa Ziehau uint32_t jme_txcsr; 22076fbb0b9SSepherosa Ziehau uint32_t jme_rxcsr; 22176fbb0b9SSepherosa Ziehau 22276fbb0b9SSepherosa Ziehau int jme_txd_spare; 22376fbb0b9SSepherosa Ziehau 22476fbb0b9SSepherosa Ziehau struct sysctl_ctx_list jme_sysctl_ctx; 22576fbb0b9SSepherosa Ziehau struct sysctl_oid *jme_sysctl_tree; 22676fbb0b9SSepherosa Ziehau 22776fbb0b9SSepherosa Ziehau /* 22876fbb0b9SSepherosa Ziehau * Sysctl variables 22976fbb0b9SSepherosa Ziehau */ 23076fbb0b9SSepherosa Ziehau int jme_tx_coal_to; 23176fbb0b9SSepherosa Ziehau int jme_tx_coal_pkt; 23276fbb0b9SSepherosa Ziehau int jme_rx_coal_to; 23376fbb0b9SSepherosa Ziehau int jme_rx_coal_pkt; 23469325526SSepherosa Ziehau int jme_rx_desc_cnt; 23569325526SSepherosa Ziehau int jme_tx_desc_cnt; 23676fbb0b9SSepherosa Ziehau }; 23776fbb0b9SSepherosa Ziehau 23876fbb0b9SSepherosa Ziehau /* Register access macros. */ 23976fbb0b9SSepherosa Ziehau #define CSR_WRITE_4(_sc, reg, val) \ 24076fbb0b9SSepherosa Ziehau bus_space_write_4((_sc)->jme_mem_bt, (_sc)->jme_mem_bh, (reg), (val)) 24176fbb0b9SSepherosa Ziehau #define CSR_READ_4(_sc, reg) \ 24276fbb0b9SSepherosa Ziehau bus_space_read_4((_sc)->jme_mem_bt, (_sc)->jme_mem_bh, (reg)) 24376fbb0b9SSepherosa Ziehau 24476fbb0b9SSepherosa Ziehau #define JME_MAXERR 5 24576fbb0b9SSepherosa Ziehau 24676fbb0b9SSepherosa Ziehau #define JME_RXCHAIN_RESET(_sc) \ 24776fbb0b9SSepherosa Ziehau do { \ 24876fbb0b9SSepherosa Ziehau (_sc)->jme_cdata.jme_rxhead = NULL; \ 24976fbb0b9SSepherosa Ziehau (_sc)->jme_cdata.jme_rxtail = NULL; \ 25076fbb0b9SSepherosa Ziehau (_sc)->jme_cdata.jme_rxlen = 0; \ 25176fbb0b9SSepherosa Ziehau } while (0) 25276fbb0b9SSepherosa Ziehau 25376fbb0b9SSepherosa Ziehau #define JME_TX_TIMEOUT 5 25476fbb0b9SSepherosa Ziehau #define JME_TIMEOUT 1000 25576fbb0b9SSepherosa Ziehau #define JME_PHY_TIMEOUT 1000 25676fbb0b9SSepherosa Ziehau #define JME_EEPROM_TIMEOUT 1000 25776fbb0b9SSepherosa Ziehau 25876fbb0b9SSepherosa Ziehau #define JME_TXD_RSVD 1 25976fbb0b9SSepherosa Ziehau 26076fbb0b9SSepherosa Ziehau #endif 261