if_vtevar.h revision 1.2 1 1.2 tls /* $NetBSD: if_vtevar.h,v 1.2 2011/11/19 22:51:23 tls 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.1 bouyer #define VTE_TX_RING_CNT 64
36 1.1 bouyer #define VTE_TX_RING_ALIGN 16
37 1.1 bouyer /*
38 1.1 bouyer * The TX/RX descriptor format has no limitation for number of
39 1.1 bouyer * descriptors in TX/RX ring. However, the maximum number of
40 1.1 bouyer * descriptors that could be set as RX descriptor ring residue
41 1.1 bouyer * counter is 255. This effectively limits number of RX
42 1.1 bouyer * descriptors available to be less than or equal to 255.
43 1.1 bouyer */
44 1.1 bouyer #define VTE_RX_RING_CNT 128
45 1.1 bouyer #define VTE_RX_RING_ALIGN 16
46 1.1 bouyer #define VTE_RX_BUF_ALIGN 4
47 1.1 bouyer
48 1.1 bouyer #define VTE_DESC_INC(x, y) ((x) = ((x) + 1) % (y))
49 1.1 bouyer
50 1.1 bouyer #define VTE_TX_RING_SZ \
51 1.1 bouyer (sizeof(struct vte_tx_desc) * VTE_TX_RING_CNT)
52 1.1 bouyer #define VTE_RX_RING_SZ \
53 1.1 bouyer (sizeof(struct vte_rx_desc) * VTE_RX_RING_CNT)
54 1.1 bouyer
55 1.1 bouyer #define VTE_RX_BUF_SIZE_MAX (MCLBYTES - sizeof(uint32_t))
56 1.1 bouyer
57 1.1 bouyer #define VTE_MIN_FRAMELEN (ETHER_MIN_LEN - ETHER_CRC_LEN)
58 1.1 bouyer
59 1.1 bouyer struct vte_rxdesc {
60 1.1 bouyer struct mbuf *rx_m;
61 1.1 bouyer bus_dma_segment_t rx_seg;
62 1.1 bouyer bus_dmamap_t rx_dmamap;
63 1.1 bouyer struct vte_rx_desc *rx_desc;
64 1.1 bouyer };
65 1.1 bouyer
66 1.1 bouyer struct vte_txdesc {
67 1.1 bouyer struct mbuf *tx_m;
68 1.1 bouyer bus_dma_segment_t *tx_seg;
69 1.1 bouyer bus_dmamap_t tx_dmamap;
70 1.1 bouyer struct vte_tx_desc *tx_desc;
71 1.1 bouyer int tx_flags;
72 1.1 bouyer #define VTE_TXMBUF 0x0001
73 1.1 bouyer };
74 1.1 bouyer
75 1.1 bouyer struct vte_chain_data {
76 1.1 bouyer struct vte_txdesc vte_txdesc[VTE_TX_RING_CNT];
77 1.1 bouyer struct mbuf *vte_txmbufs[VTE_TX_RING_CNT];
78 1.1 bouyer struct vte_rxdesc vte_rxdesc[VTE_RX_RING_CNT];
79 1.1 bouyer bus_dmamap_t vte_tx_ring_map;
80 1.1 bouyer bus_dma_segment_t vte_tx_ring_seg[1];
81 1.1 bouyer bus_dmamap_t vte_rx_ring_map;
82 1.1 bouyer bus_dma_segment_t vte_rx_ring_seg[1];
83 1.1 bouyer bus_dmamap_t vte_rr_ring_map;
84 1.1 bouyer bus_dma_segment_t vte_rr_ring_seg[1];
85 1.1 bouyer bus_dmamap_t vte_rx_sparemap;
86 1.1 bouyer bus_dmamap_t vte_cmb_map;
87 1.1 bouyer bus_dmamap_t vte_smb_map;
88 1.1 bouyer struct vte_tx_desc *vte_tx_ring;
89 1.1 bouyer struct vte_rx_desc *vte_rx_ring;
90 1.1 bouyer
91 1.1 bouyer int vte_tx_prod;
92 1.1 bouyer int vte_tx_cons;
93 1.1 bouyer int vte_tx_cnt;
94 1.1 bouyer int vte_rx_cons;
95 1.1 bouyer };
96 1.1 bouyer
97 1.1 bouyer struct vte_hw_stats {
98 1.1 bouyer /* RX stats. */
99 1.1 bouyer uint32_t rx_frames;
100 1.1 bouyer uint32_t rx_bcast_frames;
101 1.1 bouyer uint32_t rx_mcast_frames;
102 1.1 bouyer uint32_t rx_runts;
103 1.1 bouyer uint32_t rx_crcerrs;
104 1.1 bouyer uint32_t rx_long_frames;
105 1.1 bouyer uint32_t rx_fifo_full;
106 1.1 bouyer uint32_t rx_desc_unavail;
107 1.1 bouyer uint32_t rx_pause_frames;
108 1.1 bouyer
109 1.1 bouyer /* TX stats. */
110 1.1 bouyer uint32_t tx_frames;
111 1.1 bouyer uint32_t tx_underruns;
112 1.1 bouyer uint32_t tx_late_colls;
113 1.1 bouyer uint32_t tx_pause_frames;
114 1.1 bouyer };
115 1.1 bouyer
116 1.1 bouyer /*
117 1.1 bouyer * Software state per device.
118 1.1 bouyer */
119 1.1 bouyer struct vte_softc {
120 1.1 bouyer device_t vte_dev;
121 1.1 bouyer bus_space_tag_t vte_bustag;
122 1.1 bouyer bus_space_handle_t vte_bushandle;
123 1.1 bouyer bus_dma_tag_t vte_dmatag;
124 1.1 bouyer void* vte_ih;
125 1.1 bouyer struct ethercom vte_ec;
126 1.1 bouyer mii_data_t vte_mii;
127 1.1 bouyer device_t vte_miibus;
128 1.1 bouyer uint8_t vte_eaddr[ETHER_ADDR_LEN];
129 1.1 bouyer int vte_flags;
130 1.1 bouyer #define VTE_FLAG_LINK 0x8000
131 1.1 bouyer
132 1.1 bouyer struct callout vte_tick_ch;
133 1.1 bouyer struct vte_hw_stats vte_stats;
134 1.1 bouyer struct vte_chain_data vte_cdata;
135 1.1 bouyer int vte_if_flags;
136 1.1 bouyer int vte_watchdog_timer;
137 1.1 bouyer struct sysctllog *vte_clog;
138 1.1 bouyer int vte_int_rx_mod;
139 1.1 bouyer int vte_int_tx_mod;
140 1.1 bouyer
141 1.1 bouyer #if NRND > 0
142 1.2 tls krndsource_t rnd_source;
143 1.1 bouyer #endif
144 1.1 bouyer };
145 1.1 bouyer
146 1.1 bouyer #define vte_if vte_ec.ec_if
147 1.1 bouyer #define vte_bpf vte_if.if_bpf
148 1.1 bouyer
149 1.1 bouyer /* Register access macros. */
150 1.1 bouyer #define CSR_WRITE_2(_sc, reg, val) \
151 1.1 bouyer bus_space_write_2((_sc)->vte_bustag, (_sc)->vte_bushandle, \
152 1.1 bouyer (reg), (val))
153 1.1 bouyer #define CSR_READ_2(_sc, reg) \
154 1.1 bouyer bus_space_read_2((_sc)->vte_bustag, (_sc)->vte_bushandle, (reg))
155 1.1 bouyer
156 1.1 bouyer #define VTE_TX_TIMEOUT 5
157 1.1 bouyer #define VTE_RESET_TIMEOUT 100
158 1.1 bouyer #define VTE_TIMEOUT 1000
159 1.1 bouyer #define VTE_PHY_TIMEOUT 1000
160 1.1 bouyer
161 1.1 bouyer #endif /* _IF_VTEVAR_H */
162