xref: /dflybsd-src/sys/dev/netif/et/if_etvar.h (revision 26595b188cbe468e3b07a13e2a5cfaa3de0d7843)
1d217d4d9SSepherosa Ziehau /*
2d217d4d9SSepherosa Ziehau  * Copyright (c) 2007 The DragonFly Project.  All rights reserved.
3d217d4d9SSepherosa Ziehau  *
4d217d4d9SSepherosa Ziehau  * This code is derived from software contributed to The DragonFly Project
5d217d4d9SSepherosa Ziehau  * by Sepherosa Ziehau <sepherosa@gmail.com>
6d217d4d9SSepherosa Ziehau  *
7d217d4d9SSepherosa Ziehau  * Redistribution and use in source and binary forms, with or without
8d217d4d9SSepherosa Ziehau  * modification, are permitted provided that the following conditions
9d217d4d9SSepherosa Ziehau  * are met:
10d217d4d9SSepherosa Ziehau  *
11d217d4d9SSepherosa Ziehau  * 1. Redistributions of source code must retain the above copyright
12d217d4d9SSepherosa Ziehau  *    notice, this list of conditions and the following disclaimer.
13d217d4d9SSepherosa Ziehau  * 2. Redistributions in binary form must reproduce the above copyright
14d217d4d9SSepherosa Ziehau  *    notice, this list of conditions and the following disclaimer in
15d217d4d9SSepherosa Ziehau  *    the documentation and/or other materials provided with the
16d217d4d9SSepherosa Ziehau  *    distribution.
17d217d4d9SSepherosa Ziehau  * 3. Neither the name of The DragonFly Project nor the names of its
18d217d4d9SSepherosa Ziehau  *    contributors may be used to endorse or promote products derived
19d217d4d9SSepherosa Ziehau  *    from this software without specific, prior written permission.
20d217d4d9SSepherosa Ziehau  *
21d217d4d9SSepherosa Ziehau  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22d217d4d9SSepherosa Ziehau  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23d217d4d9SSepherosa Ziehau  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24d217d4d9SSepherosa Ziehau  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
25d217d4d9SSepherosa Ziehau  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26d217d4d9SSepherosa Ziehau  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
27d217d4d9SSepherosa Ziehau  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28d217d4d9SSepherosa Ziehau  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29d217d4d9SSepherosa Ziehau  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30d217d4d9SSepherosa Ziehau  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
31d217d4d9SSepherosa Ziehau  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32d217d4d9SSepherosa Ziehau  * SUCH DAMAGE.
33d217d4d9SSepherosa Ziehau  */
34d217d4d9SSepherosa Ziehau 
35d217d4d9SSepherosa Ziehau #ifndef _IF_ETVAR_H
36d217d4d9SSepherosa Ziehau #define _IF_ETVAR_H
37d217d4d9SSepherosa Ziehau 
384c749635SSepherosa Ziehau #define ET_ALIGN		0x1000	/* XXX safest guess */
39d217d4d9SSepherosa Ziehau #define ET_NSEG_MAX		32	/* XXX no limit actually */
403effc1bfSSepherosa Ziehau #define ET_NSEG_SPARE		8
41d217d4d9SSepherosa Ziehau 
42d217d4d9SSepherosa Ziehau #define ET_TX_NDESC		512
43d217d4d9SSepherosa Ziehau #define ET_RX_NDESC		512
44d217d4d9SSepherosa Ziehau #define ET_RX_NRING		2
45d217d4d9SSepherosa Ziehau #define ET_RX_NSTAT		(ET_RX_NRING * ET_RX_NDESC)
46d217d4d9SSepherosa Ziehau 
47d217d4d9SSepherosa Ziehau #define ET_TX_RING_SIZE		(ET_TX_NDESC * sizeof(struct et_txdesc))
48d217d4d9SSepherosa Ziehau #define ET_RX_RING_SIZE		(ET_RX_NDESC * sizeof(struct et_rxdesc))
49d217d4d9SSepherosa Ziehau #define ET_RXSTAT_RING_SIZE	(ET_RX_NSTAT * sizeof(struct et_rxstat))
50d217d4d9SSepherosa Ziehau 
514c749635SSepherosa Ziehau #define ET_JUMBO_ALIGN		8
523effc1bfSSepherosa Ziehau #define ET_JUMBO_FRAMELEN	(ET_MEM_SIZE - ET_MEM_RXSIZE_MIN -	\
533effc1bfSSepherosa Ziehau 				 ET_MEM_TXSIZE_EX)
543effc1bfSSepherosa Ziehau #define ET_JUMBO_MTU		(ET_JUMBO_FRAMELEN - ETHER_HDR_LEN -	\
553effc1bfSSepherosa Ziehau 				 EVL_ENCAPLEN - ETHER_CRC_LEN)
563effc1bfSSepherosa Ziehau 
570fd7469eSSepherosa Ziehau #define ET_FRAMELEN(mtu)	(ETHER_HDR_LEN + EVL_ENCAPLEN + (mtu) +	\
580fd7469eSSepherosa Ziehau 				 ETHER_CRC_LEN)
590fd7469eSSepherosa Ziehau 
603effc1bfSSepherosa Ziehau #define ET_JSLOTS		(ET_RX_NDESC + 128)
614c749635SSepherosa Ziehau #define ET_JLEN			roundup2(ET_JUMBO_FRAMELEN, ET_JUMBO_ALIGN)
623effc1bfSSepherosa Ziehau #define ET_JUMBO_MEM_SIZE	(ET_JSLOTS * ET_JLEN)
633effc1bfSSepherosa Ziehau 
64d217d4d9SSepherosa Ziehau #define CSR_WRITE_4(sc, reg, val)	\
65d217d4d9SSepherosa Ziehau 	bus_space_write_4((sc)->sc_mem_bt, (sc)->sc_mem_bh, (reg), (val))
66d217d4d9SSepherosa Ziehau #define CSR_READ_4(sc, reg)		\
67d217d4d9SSepherosa Ziehau 	bus_space_read_4((sc)->sc_mem_bt, (sc)->sc_mem_bh, (reg))
68d217d4d9SSepherosa Ziehau 
69d217d4d9SSepherosa Ziehau #define ET_ADDR_HI(addr)	((uint64_t) (addr) >> 32)
70d217d4d9SSepherosa Ziehau #define ET_ADDR_LO(addr)	((uint64_t) (addr) & 0xffffffff)
71d217d4d9SSepherosa Ziehau 
72d217d4d9SSepherosa Ziehau struct et_txdesc {
73d217d4d9SSepherosa Ziehau 	uint32_t	td_addr_hi;
74d217d4d9SSepherosa Ziehau 	uint32_t	td_addr_lo;
75d217d4d9SSepherosa Ziehau 	uint32_t	td_ctrl1;	/* ET_TDCTRL1_ */
76d217d4d9SSepherosa Ziehau 	uint32_t	td_ctrl2;	/* ET_TDCTRL2_ */
77d217d4d9SSepherosa Ziehau } __packed;
78d217d4d9SSepherosa Ziehau 
79d217d4d9SSepherosa Ziehau #define ET_TDCTRL1_LEN		__BITS(15, 0)
80d217d4d9SSepherosa Ziehau 
81d217d4d9SSepherosa Ziehau #define ET_TDCTRL2_LAST_FRAG	__BIT(0)
82d217d4d9SSepherosa Ziehau #define ET_TDCTRL2_FIRST_FRAG	__BIT(1)
83d217d4d9SSepherosa Ziehau #define ET_TDCTRL2_INTR		__BIT(2)
84d217d4d9SSepherosa Ziehau 
85d217d4d9SSepherosa Ziehau struct et_rxdesc {
86d217d4d9SSepherosa Ziehau 	uint32_t	rd_addr_lo;
87d217d4d9SSepherosa Ziehau 	uint32_t	rd_addr_hi;
88d217d4d9SSepherosa Ziehau 	uint32_t	rd_ctrl;	/* ET_RDCTRL_ */
89d217d4d9SSepherosa Ziehau } __packed;
90d217d4d9SSepherosa Ziehau 
91d217d4d9SSepherosa Ziehau #define ET_RDCTRL_BUFIDX	__BITS(9, 0)
92d217d4d9SSepherosa Ziehau 
93d217d4d9SSepherosa Ziehau struct et_rxstat {
94d217d4d9SSepherosa Ziehau 	uint32_t	rxst_info1;
95d217d4d9SSepherosa Ziehau 	uint32_t	rxst_info2;	/* ET_RXST_INFO2_ */
96d217d4d9SSepherosa Ziehau } __packed;
97d217d4d9SSepherosa Ziehau 
98d217d4d9SSepherosa Ziehau #define ET_RXST_INFO2_LEN	__BITS(15, 0)
99d217d4d9SSepherosa Ziehau #define ET_RXST_INFO2_BUFIDX	__BITS(25, 16)
100d217d4d9SSepherosa Ziehau #define ET_RXST_INFO2_RINGIDX	__BITS(27, 26)
101d217d4d9SSepherosa Ziehau 
102d217d4d9SSepherosa Ziehau struct et_rxstatus {
103d217d4d9SSepherosa Ziehau 	uint32_t	rxs_ring;
104d217d4d9SSepherosa Ziehau 	uint32_t	rxs_stat_ring;	/* ET_RXS_STATRING_ */
105d217d4d9SSepherosa Ziehau } __packed;
106d217d4d9SSepherosa Ziehau 
107d217d4d9SSepherosa Ziehau #define ET_RXS_STATRING_INDEX	__BITS(27, 16)
108d217d4d9SSepherosa Ziehau #define ET_RXS_STATRING_WRAP	__BIT(28)
109d217d4d9SSepherosa Ziehau 
110d217d4d9SSepherosa Ziehau struct et_txbuf {
111d217d4d9SSepherosa Ziehau 	struct mbuf		*tb_mbuf;
112d217d4d9SSepherosa Ziehau 	bus_dmamap_t		tb_dmap;
113d217d4d9SSepherosa Ziehau };
114d217d4d9SSepherosa Ziehau 
115d217d4d9SSepherosa Ziehau struct et_rxbuf {
116d217d4d9SSepherosa Ziehau 	struct mbuf		*rb_mbuf;
117d217d4d9SSepherosa Ziehau 	bus_dmamap_t		rb_dmap;
118d217d4d9SSepherosa Ziehau 	bus_addr_t		rb_paddr;
119d217d4d9SSepherosa Ziehau };
120d217d4d9SSepherosa Ziehau 
121d217d4d9SSepherosa Ziehau struct et_txstatus_data {
122d217d4d9SSepherosa Ziehau 	uint32_t		*txsd_status;
123d217d4d9SSepherosa Ziehau 	bus_addr_t		txsd_paddr;
124d217d4d9SSepherosa Ziehau 	bus_dma_tag_t		txsd_dtag;
125d217d4d9SSepherosa Ziehau 	bus_dmamap_t		txsd_dmap;
126d217d4d9SSepherosa Ziehau };
127d217d4d9SSepherosa Ziehau 
128d217d4d9SSepherosa Ziehau struct et_rxstatus_data {
129d217d4d9SSepherosa Ziehau 	struct et_rxstatus	*rxsd_status;
130d217d4d9SSepherosa Ziehau 	bus_addr_t		rxsd_paddr;
131d217d4d9SSepherosa Ziehau 	bus_dma_tag_t		rxsd_dtag;
132d217d4d9SSepherosa Ziehau 	bus_dmamap_t		rxsd_dmap;
133d217d4d9SSepherosa Ziehau };
134d217d4d9SSepherosa Ziehau 
135d217d4d9SSepherosa Ziehau struct et_rxstat_ring {
136d217d4d9SSepherosa Ziehau 	struct et_rxstat	*rsr_stat;
137d217d4d9SSepherosa Ziehau 	bus_addr_t		rsr_paddr;
138d217d4d9SSepherosa Ziehau 	bus_dma_tag_t		rsr_dtag;
139d217d4d9SSepherosa Ziehau 	bus_dmamap_t		rsr_dmap;
140d217d4d9SSepherosa Ziehau 
141d217d4d9SSepherosa Ziehau 	int			rsr_index;
142d217d4d9SSepherosa Ziehau 	int			rsr_wrap;
143d217d4d9SSepherosa Ziehau };
144d217d4d9SSepherosa Ziehau 
145d217d4d9SSepherosa Ziehau struct et_txdesc_ring {
146d217d4d9SSepherosa Ziehau 	struct et_txdesc	*tr_desc;
147d217d4d9SSepherosa Ziehau 	bus_addr_t		tr_paddr;
148d217d4d9SSepherosa Ziehau 	bus_dma_tag_t		tr_dtag;
149d217d4d9SSepherosa Ziehau 	bus_dmamap_t		tr_dmap;
150d217d4d9SSepherosa Ziehau 
151d217d4d9SSepherosa Ziehau 	int			tr_ready_index;
152d217d4d9SSepherosa Ziehau 	int			tr_ready_wrap;
153d217d4d9SSepherosa Ziehau };
154d217d4d9SSepherosa Ziehau 
155d217d4d9SSepherosa Ziehau struct et_rxdesc_ring {
156d217d4d9SSepherosa Ziehau 	struct et_rxdesc	*rr_desc;
157d217d4d9SSepherosa Ziehau 	bus_addr_t		rr_paddr;
158d217d4d9SSepherosa Ziehau 	bus_dma_tag_t		rr_dtag;
159d217d4d9SSepherosa Ziehau 	bus_dmamap_t		rr_dmap;
160d217d4d9SSepherosa Ziehau 
161d217d4d9SSepherosa Ziehau 	uint32_t		rr_posreg;
162d217d4d9SSepherosa Ziehau 	int			rr_index;
163d217d4d9SSepherosa Ziehau 	int			rr_wrap;
164d217d4d9SSepherosa Ziehau };
165d217d4d9SSepherosa Ziehau 
166d217d4d9SSepherosa Ziehau struct et_txbuf_data {
167d217d4d9SSepherosa Ziehau 	struct et_txbuf		tbd_buf[ET_TX_NDESC];
168d217d4d9SSepherosa Ziehau 
169d217d4d9SSepherosa Ziehau 	int			tbd_start_index;
170d217d4d9SSepherosa Ziehau 	int			tbd_start_wrap;
171d217d4d9SSepherosa Ziehau 	int			tbd_used;
172d217d4d9SSepherosa Ziehau };
173d217d4d9SSepherosa Ziehau 
174d217d4d9SSepherosa Ziehau struct et_softc;
175d217d4d9SSepherosa Ziehau struct et_rxbuf_data;
176d217d4d9SSepherosa Ziehau typedef int	(*et_newbuf_t)(struct et_rxbuf_data *, int, int);
177d217d4d9SSepherosa Ziehau 
178d217d4d9SSepherosa Ziehau struct et_rxbuf_data {
179d217d4d9SSepherosa Ziehau 	struct et_rxbuf		rbd_buf[ET_RX_NDESC];
180d217d4d9SSepherosa Ziehau 
181d217d4d9SSepherosa Ziehau 	struct et_softc		*rbd_softc;
182d217d4d9SSepherosa Ziehau 	struct et_rxdesc_ring	*rbd_ring;
183d217d4d9SSepherosa Ziehau 
1843effc1bfSSepherosa Ziehau 	int			rbd_jumbo;
185d217d4d9SSepherosa Ziehau 	int			rbd_bufsize;
186d217d4d9SSepherosa Ziehau 	et_newbuf_t		rbd_newbuf;
187d217d4d9SSepherosa Ziehau };
188d217d4d9SSepherosa Ziehau 
1893effc1bfSSepherosa Ziehau struct et_jslot;
1903effc1bfSSepherosa Ziehau 
1913effc1bfSSepherosa Ziehau struct et_jumbo_data {
1923effc1bfSSepherosa Ziehau 	bus_dma_tag_t		jd_dtag;
1933effc1bfSSepherosa Ziehau 	bus_dmamap_t		jd_dmap;
1943effc1bfSSepherosa Ziehau 	void			*jd_buf;
1953effc1bfSSepherosa Ziehau 
1963effc1bfSSepherosa Ziehau 	struct lwkt_serialize	jd_serializer;
1973effc1bfSSepherosa Ziehau 	struct et_jslot		*jd_slots;
1983effc1bfSSepherosa Ziehau 	SLIST_HEAD(, et_jslot)	jd_free_slots;
1993effc1bfSSepherosa Ziehau };
2003effc1bfSSepherosa Ziehau 
2013effc1bfSSepherosa Ziehau struct et_jslot {
2023effc1bfSSepherosa Ziehau 	struct et_jumbo_data	*jslot_data;
2033effc1bfSSepherosa Ziehau 	void			*jslot_buf;
2043effc1bfSSepherosa Ziehau 	bus_addr_t		jslot_paddr;
2053effc1bfSSepherosa Ziehau 	int			jslot_inuse;
2063effc1bfSSepherosa Ziehau 	int			jslot_index;
2073effc1bfSSepherosa Ziehau 	SLIST_ENTRY(et_jslot)	jslot_link;
2083effc1bfSSepherosa Ziehau };
2093effc1bfSSepherosa Ziehau 
210d217d4d9SSepherosa Ziehau struct et_softc {
211d217d4d9SSepherosa Ziehau 	struct arpcom		arpcom;
212d217d4d9SSepherosa Ziehau 	int			sc_if_flags;
2133effc1bfSSepherosa Ziehau 	uint32_t		sc_flags;	/* ET_FLAG_ */
214d217d4d9SSepherosa Ziehau 
215d217d4d9SSepherosa Ziehau 	int			sc_mem_rid;
216d217d4d9SSepherosa Ziehau 	struct resource		*sc_mem_res;
217d217d4d9SSepherosa Ziehau 	bus_space_tag_t		sc_mem_bt;
218d217d4d9SSepherosa Ziehau 	bus_space_handle_t	sc_mem_bh;
219d217d4d9SSepherosa Ziehau 
220*7f28a608SSepherosa Ziehau 	int			sc_irq_type;
221d217d4d9SSepherosa Ziehau 	int			sc_irq_rid;
222d217d4d9SSepherosa Ziehau 	struct resource		*sc_irq_res;
223d217d4d9SSepherosa Ziehau 	void			*sc_irq_handle;
224d217d4d9SSepherosa Ziehau 
225d217d4d9SSepherosa Ziehau 	device_t		sc_miibus;
226d217d4d9SSepherosa Ziehau 	struct callout		sc_tick;
227d217d4d9SSepherosa Ziehau 
228d217d4d9SSepherosa Ziehau 	bus_dma_tag_t		sc_dtag;
229d217d4d9SSepherosa Ziehau 
230d217d4d9SSepherosa Ziehau 	struct et_rxdesc_ring	sc_rx_ring[ET_RX_NRING];
231d217d4d9SSepherosa Ziehau 	struct et_rxstat_ring	sc_rxstat_ring;
232d217d4d9SSepherosa Ziehau 	struct et_rxstatus_data	sc_rx_status;
233d217d4d9SSepherosa Ziehau 
234d217d4d9SSepherosa Ziehau 	struct et_txdesc_ring	sc_tx_ring;
235d217d4d9SSepherosa Ziehau 	struct et_txstatus_data	sc_tx_status;
236d217d4d9SSepherosa Ziehau 
2370fe5209eSSepherosa Ziehau 	bus_dma_tag_t		sc_rxbuf_dtag;
2380fe5209eSSepherosa Ziehau 	bus_dmamap_t		sc_rxbuf_tmp_dmap;
239d217d4d9SSepherosa Ziehau 	struct et_rxbuf_data	sc_rx_data[ET_RX_NRING];
2400fe5209eSSepherosa Ziehau 
2410fe5209eSSepherosa Ziehau 	bus_dma_tag_t		sc_txbuf_dtag;
242d217d4d9SSepherosa Ziehau 	struct et_txbuf_data	sc_tx_data;
243d217d4d9SSepherosa Ziehau 
2443effc1bfSSepherosa Ziehau 	struct et_jumbo_data	sc_jumbo_data;
2453effc1bfSSepherosa Ziehau 
246d217d4d9SSepherosa Ziehau 	uint32_t		sc_tx;
247d217d4d9SSepherosa Ziehau 	uint32_t		sc_tx_intr;
248d217d4d9SSepherosa Ziehau 
249d217d4d9SSepherosa Ziehau 	/*
250d217d4d9SSepherosa Ziehau 	 * Sysctl variables
251d217d4d9SSepherosa Ziehau 	 */
252d217d4d9SSepherosa Ziehau 	int			sc_rx_intr_npkts;
253d217d4d9SSepherosa Ziehau 	int			sc_rx_intr_delay;
254d217d4d9SSepherosa Ziehau 	int			sc_tx_intr_nsegs;
255d217d4d9SSepherosa Ziehau 	uint32_t		sc_timer;
256d217d4d9SSepherosa Ziehau };
257d217d4d9SSepherosa Ziehau 
2583effc1bfSSepherosa Ziehau #define ET_FLAG_TXRX_ENABLED	0x1
2593effc1bfSSepherosa Ziehau #define ET_FLAG_JUMBO		0x2
2603effc1bfSSepherosa Ziehau 
261d217d4d9SSepherosa Ziehau #endif	/* !_IF_ETVAR_H */
262