if_vtevar.h revision 1.4.18.1 1 1.4.18.1 martin /* $NetBSD: if_vtevar.h,v 1.4.18.1 2020/04/08 14:08:09 martin 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.4.18.1 martin #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.4.18.1 martin #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.4.18.1 martin #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.4.18.1 martin #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