xref: /dflybsd-src/sys/dev/netif/re/if_revar.h (revision 043ecbf0c4caab66f0476f5ef784598c1f7d49bd)
1 /*
2  * Copyright (c) 2004
3  *	Joerg Sonnenberger <joerg@bec.de>.  All rights reserved.
4  *
5  * Copyright (c) 1997, 1998-2003
6  *	Bill Paul <wpaul@ctr.columbia.edu>.  All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. All advertising materials mentioning features or use of this software
17  *    must display the following acknowledgement:
18  *	This product includes software developed by Bill Paul.
19  * 4. Neither the name of the author nor the names of any co-contributors
20  *    may be used to endorse or promote products derived from this software
21  *    without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26  * ARE DISCLAIMED.  IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD
27  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
31  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
33  * THE POSSIBILITY OF SUCH DAMAGE.
34  *
35  * $FreeBSD: src/sys/pci/if_rlreg.h,v 1.42 2004/05/24 19:39:23 jhb Exp $
36  * $DragonFly: src/sys/dev/netif/re/if_revar.h,v 1.7 2008/10/03 14:07:02 sephe Exp $
37  */
38 
39 struct re_chain_data {
40 	uint16_t		cur_rx;
41 	caddr_t			re_rx_buf;
42 	caddr_t			re_rx_buf_ptr;
43 	bus_dmamap_t		re_rx_dmamap;
44 
45 	struct mbuf		*re_tx_chain[RE_TX_LIST_CNT];
46 	bus_dmamap_t		re_tx_dmamap[RE_TX_LIST_CNT];
47 	uint8_t			last_tx;
48 	uint8_t			cur_tx;
49 };
50 
51 #define RE_INC(x)		(x = (x + 1) % RE_TX_LIST_CNT)
52 #define RE_CUR_TXADDR(x)	((x->re_cdata.cur_tx * 4) + RE_TXADDR0)
53 #define RE_CUR_TXSTAT(x)	((x->re_cdata.cur_tx * 4) + RE_TXSTAT0)
54 #define RE_CUR_TXMBUF(x)	(x->re_cdata.re_tx_chain[x->re_cdata.cur_tx])
55 #define RE_CUR_DMAMAP(x)	(x->re_cdata.re_tx_dmamap[x->re_cdata.cur_tx])
56 #define RE_LAST_TXADDR(x)	((x->re_cdata.last_tx * 4) + RE_TXADDR0)
57 #define RE_LAST_TXSTAT(x)	((x->re_cdata.last_tx * 4) + RE_TXSTAT0)
58 #define RE_LAST_TXMBUF(x)	(x->re_cdata.re_tx_chain[x->re_cdata.last_tx])
59 #define RE_LAST_DMAMAP(x)	(x->re_cdata.re_tx_dmamap[x->re_cdata.last_tx])
60 
61 struct re_type {
62 	uint16_t		re_vid;
63 	uint16_t		re_did;
64 	int			re_basetype;
65 	const char		*re_name;
66 };
67 
68 struct re_hwrev {
69 	uint32_t		re_rev;
70 	int			re_type;	/* RE_{8139CPLUS,8169} */
71 	uint32_t		re_flags;	/* see RE_F_ */
72 	int			re_swcsum_lim;
73 	const char		*re_desc;
74 };
75 
76 #define RE_8139CPLUS		3
77 #define RE_8169			4
78 
79 struct re_softc;
80 
81 #define RE_MAXSEGS		16
82 
83 struct re_dmaload_arg {
84 	int			re_nsegs;
85 	bus_dma_segment_t	*re_segs;
86 };
87 
88 struct re_list_data {
89 	struct mbuf		*re_tx_mbuf[RE_TX_DESC_CNT];
90 	struct mbuf		*re_rx_mbuf[RE_RX_DESC_CNT];
91 	bus_addr_t		re_rx_paddr[RE_RX_DESC_CNT];
92 	int			re_tx_prodidx;
93 	int			re_rx_prodidx;
94 	int			re_tx_considx;
95 	int			re_tx_free;
96 	bus_dmamap_t		re_tx_dmamap[RE_TX_DESC_CNT];
97 	bus_dmamap_t		re_rx_dmamap[RE_RX_DESC_CNT];
98 	bus_dmamap_t		re_rx_spare;
99 	bus_dma_tag_t		re_mtag;	/* mbuf mapping tag */
100 	bus_dma_tag_t		re_stag;	/* stats mapping tag */
101 	bus_dmamap_t		re_smap;	/* stats map */
102 	struct re_stats		*re_stats;
103 	bus_addr_t		re_stats_addr;
104 	bus_dma_tag_t		re_rx_list_tag;
105 	bus_dmamap_t		re_rx_list_map;
106 	struct re_desc		*re_rx_list;
107 	bus_addr_t		re_rx_list_addr;
108 	bus_dma_tag_t		re_tx_list_tag;
109 	bus_dmamap_t		re_tx_list_map;
110 	struct re_desc		*re_tx_list;
111 	bus_addr_t		re_tx_list_addr;
112 };
113 
114 struct re_softc {
115 	struct arpcom		arpcom;		/* interface info */
116 #ifdef RE_DIAG
117 	device_t		re_dev;
118 #endif
119 	bus_space_handle_t	re_bhandle;	/* bus space handle */
120 	bus_space_tag_t		re_btag;	/* bus space tag */
121 	struct resource		*re_res;
122 	struct resource		*re_irq;
123 	void			*re_intrhand;
124 	device_t		re_miibus;
125 	bus_dma_tag_t		re_parent_tag;
126 	bus_dma_tag_t		re_tag;
127 	uint8_t			re_type;
128 	int			re_eecmd_read;
129 	uint8_t			re_stats_no_timeout;
130 	int			re_txthresh;
131 	struct re_chain_data	re_cdata;
132 	struct re_list_data	re_ldata;
133 	struct callout		re_timer;
134 	struct mbuf		*re_head;
135 	struct mbuf		*re_tail;
136 	int			re_drop_rxfrag;
137 	uint32_t		re_flags;	/* see RE_F_ */
138 	uint32_t		re_rxlenmask;
139 	int			re_txstart;
140 	int			re_testmode;
141 	int			suspended;	/* 0 = normal  1 = suspended */
142 	int			re_link;
143 	int			re_eewidth;
144 	int			re_swcsum_lim;
145 #ifdef DEVICE_POLLING
146 	int			rxcycles;
147 #endif
148 
149 	struct sysctl_ctx_list	re_sysctl_ctx;
150 	struct sysctl_oid	*re_sysctl_tree;
151 	uint16_t		re_intrs;
152 	uint16_t		re_tx_ack;
153 
154 #ifndef BURN_BRIDGES
155 	uint32_t		saved_maps[5];	/* pci data */
156 	uint32_t		saved_biosaddr;
157 	uint8_t			saved_intline;
158 	uint8_t			saved_cachelnsz;
159 	uint8_t			saved_lattimer;
160 #endif
161 };
162 
163 #define RE_F_HASMPC		0x1
164 #define RE_F_PCIE		0x2
165 #define RE_F_JUMBO_SWCSUM	0x4
166 
167 #define RE_SWCSUM_LIM_8169	2038
168 #define RE_SWCSUM_LIM_8168B	2082
169 
170 #define RE_TX_MODERATION_IS_ENABLED(sc)			\
171 	((sc)->re_tx_ack == RE_ISR_TIMEOUT_EXPIRED)
172 
173 #define RE_DISABLE_TX_MODERATION(sc) do {		\
174 	(sc)->re_tx_ack = RE_ISR_TX_OK;			\
175 	(sc)->re_intrs = RE_INTRS | RE_ISR_TX_OK;	\
176 } while (0)
177 
178 #define RE_ENABLE_TX_MODERATION(sc) do {		\
179 	(sc)->re_tx_ack = RE_ISR_TIMEOUT_EXPIRED;	\
180 	(sc)->re_intrs = RE_INTRS;			\
181 } while (0)
182 
183 /*
184  * register space access macros
185  */
186 #define CSR_WRITE_STREAM_4(sc, reg, val)	\
187 	bus_space_write_stream_4(sc->re_btag, sc->re_bhandle, reg, val)
188 #define CSR_WRITE_4(sc, reg, val)	\
189 	bus_space_write_4(sc->re_btag, sc->re_bhandle, reg, val)
190 #define CSR_WRITE_2(sc, reg, val)	\
191 	bus_space_write_2(sc->re_btag, sc->re_bhandle, reg, val)
192 #define CSR_WRITE_1(sc, reg, val)	\
193 	bus_space_write_1(sc->re_btag, sc->re_bhandle, reg, val)
194 
195 #define CSR_READ_4(sc, reg)		\
196 	bus_space_read_4(sc->re_btag, sc->re_bhandle, reg)
197 #define CSR_READ_2(sc, reg)		\
198 	bus_space_read_2(sc->re_btag, sc->re_bhandle, reg)
199 #define CSR_READ_1(sc, reg)		\
200 	bus_space_read_1(sc->re_btag, sc->re_bhandle, reg)
201 
202 #define CSR_SETBIT_1(sc, reg, val)	\
203 	CSR_WRITE_1(sc, reg, CSR_READ_1(sc, reg) | (val))
204 #define CSR_CLRBIT_1(sc, reg, val)	\
205 	CSR_WRITE_1(sc, reg, CSR_READ_1(sc, reg) & ~(val))
206 
207 #define RE_TXDESC_SPARE		4
208