1 1.5 thorpej /* $NetBSD: if_vtevar.h,v 1.5 2020/02/01 05:14:28 thorpej Exp $ */ 2 1.1 bouyer 3 1.1 bouyer /*- 4 1.1 bouyer * Copyright (c) 2010, Pyun YongHyeon <yongari (at) FreeBSD.org> 5 1.1 bouyer * All rights reserved. 6 1.1 bouyer * 7 1.1 bouyer * Redistribution and use in source and binary forms, with or without 8 1.1 bouyer * modification, are permitted provided that the following conditions 9 1.1 bouyer * are met: 10 1.1 bouyer * 1. Redistributions of source code must retain the above copyright 11 1.1 bouyer * notice unmodified, this list of conditions, and the following 12 1.1 bouyer * disclaimer. 13 1.1 bouyer * 2. Redistributions in binary form must reproduce the above copyright 14 1.1 bouyer * notice, this list of conditions and the following disclaimer in the 15 1.1 bouyer * documentation and/or other materials provided with the distribution. 16 1.1 bouyer * 17 1.1 bouyer * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18 1.1 bouyer * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 1.1 bouyer * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 1.1 bouyer * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21 1.1 bouyer * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 1.1 bouyer * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 1.1 bouyer * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 1.1 bouyer * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 1.1 bouyer * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 1.1 bouyer * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 1.1 bouyer * SUCH DAMAGE. 28 1.1 bouyer * 29 1.1 bouyer * FreeBSD: src/sys/dev/vte/if_vtevar.h,v 1.1 2010/12/31 00:21:41 yongari Exp 30 1.1 bouyer */ 31 1.1 bouyer 32 1.1 bouyer #ifndef _IF_VTEVAR_H 33 1.1 bouyer #define _IF_VTEVAR_H 34 1.1 bouyer 35 1.4 riastrad #include <sys/rndsource.h> 36 1.4 riastrad 37 1.1 bouyer #define VTE_TX_RING_CNT 64 38 1.1 bouyer #define VTE_TX_RING_ALIGN 16 39 1.1 bouyer /* 40 1.1 bouyer * The TX/RX descriptor format has no limitation for number of 41 1.1 bouyer * descriptors in TX/RX ring. However, the maximum number of 42 1.1 bouyer * descriptors that could be set as RX descriptor ring residue 43 1.1 bouyer * counter is 255. This effectively limits number of RX 44 1.1 bouyer * descriptors available to be less than or equal to 255. 45 1.1 bouyer */ 46 1.1 bouyer #define VTE_RX_RING_CNT 128 47 1.1 bouyer #define VTE_RX_RING_ALIGN 16 48 1.1 bouyer #define VTE_RX_BUF_ALIGN 4 49 1.1 bouyer 50 1.1 bouyer #define VTE_DESC_INC(x, y) ((x) = ((x) + 1) % (y)) 51 1.1 bouyer 52 1.1 bouyer #define VTE_TX_RING_SZ \ 53 1.1 bouyer (sizeof(struct vte_tx_desc) * VTE_TX_RING_CNT) 54 1.1 bouyer #define VTE_RX_RING_SZ \ 55 1.1 bouyer (sizeof(struct vte_rx_desc) * VTE_RX_RING_CNT) 56 1.1 bouyer 57 1.1 bouyer #define VTE_RX_BUF_SIZE_MAX (MCLBYTES - sizeof(uint32_t)) 58 1.1 bouyer 59 1.1 bouyer #define VTE_MIN_FRAMELEN (ETHER_MIN_LEN - ETHER_CRC_LEN) 60 1.1 bouyer 61 1.1 bouyer struct vte_rxdesc { 62 1.1 bouyer struct mbuf *rx_m; 63 1.1 bouyer bus_dma_segment_t rx_seg; 64 1.1 bouyer bus_dmamap_t rx_dmamap; 65 1.1 bouyer struct vte_rx_desc *rx_desc; 66 1.1 bouyer }; 67 1.1 bouyer 68 1.1 bouyer struct vte_txdesc { 69 1.1 bouyer struct mbuf *tx_m; 70 1.1 bouyer bus_dma_segment_t *tx_seg; 71 1.1 bouyer bus_dmamap_t tx_dmamap; 72 1.1 bouyer struct vte_tx_desc *tx_desc; 73 1.1 bouyer int tx_flags; 74 1.1 bouyer #define VTE_TXMBUF 0x0001 75 1.1 bouyer }; 76 1.1 bouyer 77 1.1 bouyer struct vte_chain_data { 78 1.1 bouyer struct vte_txdesc vte_txdesc[VTE_TX_RING_CNT]; 79 1.1 bouyer struct mbuf *vte_txmbufs[VTE_TX_RING_CNT]; 80 1.1 bouyer struct vte_rxdesc vte_rxdesc[VTE_RX_RING_CNT]; 81 1.1 bouyer bus_dmamap_t vte_tx_ring_map; 82 1.1 bouyer bus_dma_segment_t vte_tx_ring_seg[1]; 83 1.1 bouyer bus_dmamap_t vte_rx_ring_map; 84 1.1 bouyer bus_dma_segment_t vte_rx_ring_seg[1]; 85 1.1 bouyer bus_dmamap_t vte_rr_ring_map; 86 1.1 bouyer bus_dma_segment_t vte_rr_ring_seg[1]; 87 1.1 bouyer bus_dmamap_t vte_rx_sparemap; 88 1.1 bouyer bus_dmamap_t vte_cmb_map; 89 1.1 bouyer bus_dmamap_t vte_smb_map; 90 1.1 bouyer struct vte_tx_desc *vte_tx_ring; 91 1.1 bouyer struct vte_rx_desc *vte_rx_ring; 92 1.1 bouyer 93 1.1 bouyer int vte_tx_prod; 94 1.1 bouyer int vte_tx_cons; 95 1.1 bouyer int vte_tx_cnt; 96 1.1 bouyer int vte_rx_cons; 97 1.1 bouyer }; 98 1.1 bouyer 99 1.1 bouyer struct vte_hw_stats { 100 1.1 bouyer /* RX stats. */ 101 1.1 bouyer uint32_t rx_frames; 102 1.1 bouyer uint32_t rx_bcast_frames; 103 1.1 bouyer uint32_t rx_mcast_frames; 104 1.5 thorpej #if 0 /* unused fields; if_stats used instead. */ 105 1.1 bouyer uint32_t rx_runts; 106 1.1 bouyer uint32_t rx_crcerrs; 107 1.1 bouyer uint32_t rx_long_frames; 108 1.1 bouyer uint32_t rx_fifo_full; 109 1.5 thorpej #endif 110 1.1 bouyer uint32_t rx_desc_unavail; 111 1.1 bouyer uint32_t rx_pause_frames; 112 1.1 bouyer 113 1.1 bouyer /* TX stats. */ 114 1.5 thorpej #if 0 /* unused fields; if_stats used instead. */ 115 1.1 bouyer uint32_t tx_frames; 116 1.1 bouyer uint32_t tx_underruns; 117 1.1 bouyer uint32_t tx_late_colls; 118 1.5 thorpej #endif 119 1.1 bouyer uint32_t tx_pause_frames; 120 1.1 bouyer }; 121 1.1 bouyer 122 1.1 bouyer /* 123 1.1 bouyer * Software state per device. 124 1.1 bouyer */ 125 1.1 bouyer struct vte_softc { 126 1.1 bouyer device_t vte_dev; 127 1.1 bouyer bus_space_tag_t vte_bustag; 128 1.1 bouyer bus_space_handle_t vte_bushandle; 129 1.1 bouyer bus_dma_tag_t vte_dmatag; 130 1.1 bouyer void* vte_ih; 131 1.1 bouyer struct ethercom vte_ec; 132 1.1 bouyer mii_data_t vte_mii; 133 1.1 bouyer device_t vte_miibus; 134 1.1 bouyer uint8_t vte_eaddr[ETHER_ADDR_LEN]; 135 1.1 bouyer int vte_flags; 136 1.1 bouyer #define VTE_FLAG_LINK 0x8000 137 1.1 bouyer 138 1.1 bouyer struct callout vte_tick_ch; 139 1.1 bouyer struct vte_hw_stats vte_stats; 140 1.1 bouyer struct vte_chain_data vte_cdata; 141 1.1 bouyer int vte_if_flags; 142 1.1 bouyer int vte_watchdog_timer; 143 1.1 bouyer struct sysctllog *vte_clog; 144 1.1 bouyer int vte_int_rx_mod; 145 1.1 bouyer int vte_int_tx_mod; 146 1.1 bouyer 147 1.2 tls krndsource_t rnd_source; 148 1.1 bouyer }; 149 1.1 bouyer 150 1.1 bouyer #define vte_if vte_ec.ec_if 151 1.1 bouyer #define vte_bpf vte_if.if_bpf 152 1.1 bouyer 153 1.1 bouyer /* Register access macros. */ 154 1.1 bouyer #define CSR_WRITE_2(_sc, reg, val) \ 155 1.1 bouyer bus_space_write_2((_sc)->vte_bustag, (_sc)->vte_bushandle, \ 156 1.1 bouyer (reg), (val)) 157 1.1 bouyer #define CSR_READ_2(_sc, reg) \ 158 1.1 bouyer bus_space_read_2((_sc)->vte_bustag, (_sc)->vte_bushandle, (reg)) 159 1.1 bouyer 160 1.1 bouyer #define VTE_TX_TIMEOUT 5 161 1.1 bouyer #define VTE_RESET_TIMEOUT 100 162 1.1 bouyer #define VTE_TIMEOUT 1000 163 1.1 bouyer #define VTE_PHY_TIMEOUT 1000 164 1.1 bouyer 165 1.1 bouyer #endif /* _IF_VTEVAR_H */ 166