1216829Syongari/*- 2216829Syongari * Copyright (c) 2010, Pyun YongHyeon <yongari@FreeBSD.org> 3216829Syongari * All rights reserved. 4216829Syongari * 5216829Syongari * Redistribution and use in source and binary forms, with or without 6216829Syongari * modification, are permitted provided that the following conditions 7216829Syongari * are met: 8216829Syongari * 1. Redistributions of source code must retain the above copyright 9216829Syongari * notice unmodified, this list of conditions, and the following 10216829Syongari * disclaimer. 11216829Syongari * 2. Redistributions in binary form must reproduce the above copyright 12216829Syongari * notice, this list of conditions and the following disclaimer in the 13216829Syongari * documentation and/or other materials provided with the distribution. 14216829Syongari * 15216829Syongari * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16216829Syongari * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17216829Syongari * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18216829Syongari * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19216829Syongari * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20216829Syongari * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21216829Syongari * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22216829Syongari * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23216829Syongari * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24216829Syongari * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25216829Syongari * SUCH DAMAGE. 26216829Syongari * 27216829Syongari * $FreeBSD: releng/10.2/sys/dev/vte/if_vtevar.h 219938 2011-03-23 22:06:09Z yongari $ 28216829Syongari */ 29216829Syongari 30216829Syongari#ifndef _IF_VTEVAR_H 31216829Syongari#define _IF_VTEVAR_H 32216829Syongari 33216829Syongari#define VTE_TX_RING_CNT 64 34216829Syongari#define VTE_TX_RING_ALIGN 16 35216829Syongari/* 36216829Syongari * The TX/RX descriptor format has no limitation for number of 37216829Syongari * descriptors in TX/RX ring. However, the maximum number of 38216829Syongari * descriptors that could be set as RX descriptor ring residue 39216829Syongari * counter is 255. This effectively limits number of RX 40216829Syongari * descriptors available to be less than or equal to 255. 41216829Syongari */ 42216829Syongari#define VTE_RX_RING_CNT 128 43216829Syongari#define VTE_RX_RING_ALIGN 16 44216829Syongari#define VTE_RX_BUF_ALIGN 4 45216829Syongari 46216829Syongari#define VTE_DESC_INC(x, y) ((x) = ((x) + 1) % (y)) 47216829Syongari 48216829Syongari#define VTE_TX_RING_SZ \ 49216829Syongari (sizeof(struct vte_tx_desc) * VTE_TX_RING_CNT) 50216829Syongari#define VTE_RX_RING_SZ \ 51216829Syongari (sizeof(struct vte_rx_desc) * VTE_RX_RING_CNT) 52216829Syongari 53216829Syongari#define VTE_RX_BUF_SIZE_MAX (MCLBYTES - sizeof(uint32_t)) 54216829Syongari 55216829Syongari#define VTE_MIN_FRAMELEN (ETHER_MIN_LEN - ETHER_CRC_LEN) 56216829Syongari 57216829Syongaristruct vte_rxdesc { 58216829Syongari struct mbuf *rx_m; 59216829Syongari bus_dmamap_t rx_dmamap; 60216829Syongari struct vte_rx_desc *rx_desc; 61216829Syongari}; 62216829Syongari 63216829Syongaristruct vte_txdesc { 64216829Syongari struct mbuf *tx_m; 65216829Syongari bus_dmamap_t tx_dmamap; 66216829Syongari struct vte_tx_desc *tx_desc; 67216829Syongari int tx_flags; 68216829Syongari#define VTE_TXMBUF 0x0001 69216829Syongari}; 70216829Syongari 71216829Syongaristruct vte_chain_data { 72216829Syongari bus_dma_tag_t vte_parent_tag; 73216829Syongari bus_dma_tag_t vte_buffer_tag; 74216829Syongari bus_dma_tag_t vte_tx_tag; 75216829Syongari struct vte_txdesc vte_txdesc[VTE_TX_RING_CNT]; 76216829Syongari struct mbuf *vte_txmbufs[VTE_TX_RING_CNT]; 77216829Syongari bus_dma_tag_t vte_rx_tag; 78216829Syongari struct vte_rxdesc vte_rxdesc[VTE_RX_RING_CNT]; 79216829Syongari bus_dma_tag_t vte_tx_ring_tag; 80216829Syongari bus_dmamap_t vte_tx_ring_map; 81216829Syongari bus_dma_tag_t vte_rx_ring_tag; 82216829Syongari bus_dmamap_t vte_rx_ring_map; 83216829Syongari bus_dmamap_t vte_rx_sparemap; 84216829Syongari struct vte_tx_desc *vte_tx_ring; 85216829Syongari bus_addr_t vte_tx_ring_paddr; 86216829Syongari struct vte_rx_desc *vte_rx_ring; 87216829Syongari bus_addr_t vte_rx_ring_paddr; 88216829Syongari 89216829Syongari int vte_tx_prod; 90216829Syongari int vte_tx_cons; 91216829Syongari int vte_tx_cnt; 92216829Syongari int vte_rx_cons; 93216829Syongari}; 94216829Syongari 95216829Syongaristruct vte_hw_stats { 96216829Syongari /* RX stats. */ 97216829Syongari uint32_t rx_frames; 98216829Syongari uint32_t rx_bcast_frames; 99216829Syongari uint32_t rx_mcast_frames; 100216829Syongari uint32_t rx_runts; 101216829Syongari uint32_t rx_crcerrs; 102216829Syongari uint32_t rx_long_frames; 103216829Syongari uint32_t rx_fifo_full; 104216829Syongari uint32_t rx_desc_unavail; 105216829Syongari uint32_t rx_pause_frames; 106216829Syongari 107216829Syongari /* TX stats. */ 108216829Syongari uint32_t tx_frames; 109216829Syongari uint32_t tx_underruns; 110216829Syongari uint32_t tx_late_colls; 111216829Syongari uint32_t tx_pause_frames; 112216829Syongari}; 113216829Syongari 114216829Syongaristruct vte_ident { 115216829Syongari uint16_t vendorid; 116216829Syongari uint16_t deviceid; 117216829Syongari const char *name; 118216829Syongari}; 119216829Syongari 120216829Syongari/* 121216829Syongari * Software state per device. 122216829Syongari */ 123216829Syongaristruct vte_softc { 124216829Syongari struct ifnet *vte_ifp; 125216829Syongari device_t vte_dev; 126216829Syongari device_t vte_miibus; 127216829Syongari struct resource *vte_res; 128216829Syongari int vte_res_id; 129216829Syongari int vte_res_type; 130216829Syongari struct resource *vte_irq; 131216829Syongari void *vte_intrhand; 132216829Syongari const struct vte_ident *vte_ident; 133216829Syongari uint8_t vte_eaddr[ETHER_ADDR_LEN]; 134216829Syongari int vte_flags; 135216829Syongari#define VTE_FLAG_LINK 0x8000 136216829Syongari 137216829Syongari struct callout vte_tick_ch; 138216829Syongari struct vte_hw_stats vte_stats; 139216829Syongari struct vte_chain_data vte_cdata; 140216829Syongari int vte_if_flags; 141216829Syongari int vte_watchdog_timer; 142216829Syongari int vte_int_rx_mod; 143216829Syongari int vte_int_tx_mod; 144216829Syongari 145216829Syongari struct mtx vte_mtx; 146216829Syongari}; 147216829Syongari 148216829Syongari/* Register access macros. */ 149216829Syongari#define CSR_WRITE_2(_sc, reg, val) \ 150216829Syongari bus_write_2((_sc)->vte_res, (reg), (val)) 151216829Syongari#define CSR_READ_2(_sc, reg) \ 152216829Syongari bus_read_2((_sc)->vte_res, (reg)) 153216829Syongari 154216829Syongari#define VTE_LOCK(_sc) mtx_lock(&(_sc)->vte_mtx) 155216829Syongari#define VTE_UNLOCK(_sc) mtx_unlock(&(_sc)->vte_mtx) 156216829Syongari#define VTE_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->vte_mtx, MA_OWNED) 157216829Syongari 158216829Syongari#define VTE_TX_TIMEOUT 5 159216829Syongari#define VTE_RESET_TIMEOUT 100 160216829Syongari#define VTE_TIMEOUT 1000 161216829Syongari#define VTE_PHY_TIMEOUT 1000 162216829Syongari 163216829Syongari#endif /* _IF_VTEVAR_H */ 164