xref: /dflybsd-src/sys/dev/netif/jme/if_jmevar.h (revision 9d424ceeec0b347d4bf882274fa169c8e4cef6bd)
176fbb0b9SSepherosa Ziehau /*-
276fbb0b9SSepherosa Ziehau  * Copyright (c) 2008, Pyun YongHyeon <yongari@FreeBSD.org>
376fbb0b9SSepherosa Ziehau  * All rights reserved.
476fbb0b9SSepherosa Ziehau  *
576fbb0b9SSepherosa Ziehau  * Redistribution and use in source and binary forms, with or without
676fbb0b9SSepherosa Ziehau  * modification, are permitted provided that the following conditions
776fbb0b9SSepherosa Ziehau  * are met:
876fbb0b9SSepherosa Ziehau  * 1. Redistributions of source code must retain the above copyright
976fbb0b9SSepherosa Ziehau  *    notice unmodified, this list of conditions, and the following
1076fbb0b9SSepherosa Ziehau  *    disclaimer.
1176fbb0b9SSepherosa Ziehau  * 2. Redistributions in binary form must reproduce the above copyright
1276fbb0b9SSepherosa Ziehau  *    notice, this list of conditions and the following disclaimer in the
1376fbb0b9SSepherosa Ziehau  *    documentation and/or other materials provided with the distribution.
1476fbb0b9SSepherosa Ziehau  *
1576fbb0b9SSepherosa Ziehau  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1676fbb0b9SSepherosa Ziehau  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1776fbb0b9SSepherosa Ziehau  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1876fbb0b9SSepherosa Ziehau  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1976fbb0b9SSepherosa Ziehau  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2076fbb0b9SSepherosa Ziehau  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2176fbb0b9SSepherosa Ziehau  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2276fbb0b9SSepherosa Ziehau  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2376fbb0b9SSepherosa Ziehau  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2476fbb0b9SSepherosa Ziehau  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2576fbb0b9SSepherosa Ziehau  * SUCH DAMAGE.
2676fbb0b9SSepherosa Ziehau  *
2776fbb0b9SSepherosa Ziehau  * $FreeBSD: src/sys/dev/jme/if_jmevar.h,v 1.1 2008/05/27 01:42:01 yongari Exp $
28b249905bSSepherosa Ziehau  * $DragonFly: src/sys/dev/netif/jme/if_jmevar.h,v 1.8 2008/11/26 11:55:18 sephe Exp $
2976fbb0b9SSepherosa Ziehau  */
3076fbb0b9SSepherosa Ziehau 
3176fbb0b9SSepherosa Ziehau #ifndef	_IF_JMEVAR_H
3276fbb0b9SSepherosa Ziehau #define	_IF_JMEVAR_H
3376fbb0b9SSepherosa Ziehau 
3476fbb0b9SSepherosa Ziehau #include <sys/queue.h>
3576fbb0b9SSepherosa Ziehau #include <sys/callout.h>
3676fbb0b9SSepherosa Ziehau #include <sys/taskqueue.h>
3776fbb0b9SSepherosa Ziehau 
3876fbb0b9SSepherosa Ziehau /*
397405bec3SSepherosa Ziehau  * JMC250 supports upto JME_NDESC_MAX descriptors and the number of
4083b03786SSepherosa Ziehau  * descriptors should be multiple of JME_NDESC_ALIGN.
4176fbb0b9SSepherosa Ziehau  */
4269325526SSepherosa Ziehau #define	JME_TX_DESC_CNT_DEF	384
4369325526SSepherosa Ziehau #define	JME_RX_DESC_CNT_DEF	256
4469325526SSepherosa Ziehau 
4583b03786SSepherosa Ziehau #define JME_NDESC_ALIGN		16
4669325526SSepherosa Ziehau #define JME_NDESC_MAX		1024
4783b03786SSepherosa Ziehau 
48760c056cSSepherosa Ziehau #define JME_NRXRING_1		1
49760c056cSSepherosa Ziehau #define JME_NRXRING_2		2
50760c056cSSepherosa Ziehau #define JME_NRXRING_4		4
51760c056cSSepherosa Ziehau 
52760c056cSSepherosa Ziehau #define JME_NRXRING_DEF		JME_NRXRING_1
53760c056cSSepherosa Ziehau #define JME_NRXRING_MIN		JME_NRXRING_1
54760c056cSSepherosa Ziehau #define JME_NRXRING_MAX		JME_NRXRING_4
554447c752SSepherosa Ziehau 
5676fbb0b9SSepherosa Ziehau /*
5776fbb0b9SSepherosa Ziehau  * Tx/Rx descriptor queue base should be 16bytes aligned and
5876fbb0b9SSepherosa Ziehau  * should not cross 4G bytes boundary on the 64bits address
5976fbb0b9SSepherosa Ziehau  * mode.
6076fbb0b9SSepherosa Ziehau  */
6176fbb0b9SSepherosa Ziehau #define	JME_TX_RING_ALIGN	16
6276fbb0b9SSepherosa Ziehau #define	JME_RX_RING_ALIGN	16
63*9d424ceeSSepherosa Ziehau #define	JME_MAXSEGSIZE		4096
6476fbb0b9SSepherosa Ziehau #define	JME_TSO_MAXSIZE		(65535 + sizeof(struct ether_vlan_header))
6576fbb0b9SSepherosa Ziehau #define	JME_MAXTXSEGS		32
6676fbb0b9SSepherosa Ziehau #define	JME_RX_BUF_ALIGN	sizeof(uint64_t)
6776fbb0b9SSepherosa Ziehau #define	JME_SSB_ALIGN		16
6876fbb0b9SSepherosa Ziehau 
69a7547dadSSepherosa Ziehau #if (BUS_SPACE_MAXADDR != BUS_SPACE_MAXADDR_32BIT)
70a7547dadSSepherosa Ziehau #define JME_RING_BOUNDARY	0x100000000ULL
71a7547dadSSepherosa Ziehau #else
72a7547dadSSepherosa Ziehau #define JME_RING_BOUNDARY	0
73a7547dadSSepherosa Ziehau #endif
74a7547dadSSepherosa Ziehau 
7576fbb0b9SSepherosa Ziehau #define	JME_ADDR_LO(x)		((uint64_t) (x) & 0xFFFFFFFF)
7676fbb0b9SSepherosa Ziehau #define	JME_ADDR_HI(x)		((uint64_t) (x) >> 32)
7776fbb0b9SSepherosa Ziehau 
7876fbb0b9SSepherosa Ziehau #define	JME_MSI_MESSAGES	8
7976fbb0b9SSepherosa Ziehau #define	JME_MSIX_MESSAGES	8
8076fbb0b9SSepherosa Ziehau 
8176fbb0b9SSepherosa Ziehau /* Water mark to kick reclaiming Tx buffers. */
8283b03786SSepherosa Ziehau #define	JME_TX_DESC_HIWAT(sc)	\
8369325526SSepherosa Ziehau 	((sc)->jme_tx_desc_cnt - (((sc)->jme_tx_desc_cnt * 3) / 10))
8476fbb0b9SSepherosa Ziehau 
8576fbb0b9SSepherosa Ziehau /*
8676fbb0b9SSepherosa Ziehau  * JMC250 can send 9K jumbo frame on Tx path and can receive
8776fbb0b9SSepherosa Ziehau  * 65535 bytes.
8876fbb0b9SSepherosa Ziehau  */
8976fbb0b9SSepherosa Ziehau #define JME_JUMBO_FRAMELEN	9216
9076fbb0b9SSepherosa Ziehau #define JME_JUMBO_MTU							\
9176fbb0b9SSepherosa Ziehau 	(JME_JUMBO_FRAMELEN - sizeof(struct ether_vlan_header) -	\
9276fbb0b9SSepherosa Ziehau 	 ETHER_HDR_LEN - ETHER_CRC_LEN)
9376fbb0b9SSepherosa Ziehau #define	JME_MAX_MTU							\
9476fbb0b9SSepherosa Ziehau 	(ETHER_MAX_LEN + sizeof(struct ether_vlan_header) -		\
9576fbb0b9SSepherosa Ziehau 	 ETHER_HDR_LEN - ETHER_CRC_LEN)
9676fbb0b9SSepherosa Ziehau /*
9776fbb0b9SSepherosa Ziehau  * JMC250 can't handle Tx checksum offload/TSO if frame length
9876fbb0b9SSepherosa Ziehau  * is larger than its FIFO size(2K). It's also good idea to not
9976fbb0b9SSepherosa Ziehau  * use jumbo frame if hardware is running at half-duplex media.
10076fbb0b9SSepherosa Ziehau  * Because the jumbo frame may not fit into the Tx FIFO,
10176fbb0b9SSepherosa Ziehau  * collisions make hardware fetch frame from host memory with
10276fbb0b9SSepherosa Ziehau  * DMA again which in turn slows down Tx performance
10376fbb0b9SSepherosa Ziehau  * significantly.
10476fbb0b9SSepherosa Ziehau  */
10576fbb0b9SSepherosa Ziehau #define	JME_TX_FIFO_SIZE	2000
10676fbb0b9SSepherosa Ziehau /*
10776fbb0b9SSepherosa Ziehau  * JMC250 has just 4K Rx FIFO. To support jumbo frame that is
10876fbb0b9SSepherosa Ziehau  * larger than 4K bytes in length, Rx FIFO threshold should be
10976fbb0b9SSepherosa Ziehau  * adjusted to minimize Rx FIFO overrun.
11076fbb0b9SSepherosa Ziehau  */
11176fbb0b9SSepherosa Ziehau #define	JME_RX_FIFO_SIZE	4000
11276fbb0b9SSepherosa Ziehau 
11376fbb0b9SSepherosa Ziehau #define	JME_DESC_INC(x, y)	((x) = ((x) + 1) % (y))
11476fbb0b9SSepherosa Ziehau 
11576fbb0b9SSepherosa Ziehau struct jme_txdesc {
11676fbb0b9SSepherosa Ziehau 	struct mbuf		*tx_m;
11776fbb0b9SSepherosa Ziehau 	bus_dmamap_t		tx_dmamap;
11876fbb0b9SSepherosa Ziehau 	int			tx_ndesc;
11976fbb0b9SSepherosa Ziehau 	struct jme_desc		*tx_desc;
12076fbb0b9SSepherosa Ziehau };
12176fbb0b9SSepherosa Ziehau 
12276fbb0b9SSepherosa Ziehau struct jme_rxdesc {
12376fbb0b9SSepherosa Ziehau 	struct mbuf 		*rx_m;
12476fbb0b9SSepherosa Ziehau 	bus_dmamap_t		rx_dmamap;
12576fbb0b9SSepherosa Ziehau 	struct jme_desc		*rx_desc;
12676fbb0b9SSepherosa Ziehau };
12776fbb0b9SSepherosa Ziehau 
1284447c752SSepherosa Ziehau /*
1294447c752SSepherosa Ziehau  * RX ring/descs
1304447c752SSepherosa Ziehau  */
1314447c752SSepherosa Ziehau struct jme_rxdata {
1324447c752SSepherosa Ziehau 	bus_dma_tag_t		jme_rx_tag;	/* RX mbuf tag */
1334447c752SSepherosa Ziehau 	bus_dmamap_t		jme_rx_sparemap;
1344447c752SSepherosa Ziehau 	struct jme_rxdesc	*jme_rxdesc;
1354447c752SSepherosa Ziehau 
1364447c752SSepherosa Ziehau 	struct jme_desc		*jme_rx_ring;
1374447c752SSepherosa Ziehau 	bus_addr_t		jme_rx_ring_paddr;
1384447c752SSepherosa Ziehau 	bus_dma_tag_t		jme_rx_ring_tag;
1394447c752SSepherosa Ziehau 	bus_dmamap_t		jme_rx_ring_map;
1404447c752SSepherosa Ziehau 
1414447c752SSepherosa Ziehau 	int			jme_rx_cons;
1424447c752SSepherosa Ziehau 
1434447c752SSepherosa Ziehau 	int			jme_rxlen;
1444447c752SSepherosa Ziehau 	struct mbuf		*jme_rxhead;
1454447c752SSepherosa Ziehau 	struct mbuf		*jme_rxtail;
1464447c752SSepherosa Ziehau };
1474447c752SSepherosa Ziehau 
14876fbb0b9SSepherosa Ziehau struct jme_chain_data {
149560616bfSSepherosa Ziehau 	/*
150560616bfSSepherosa Ziehau 	 * Top level tags
151560616bfSSepherosa Ziehau 	 */
152560616bfSSepherosa Ziehau 	bus_dma_tag_t		jme_ring_tag;	/* parent ring tag */
153560616bfSSepherosa Ziehau 	bus_dma_tag_t		jme_buffer_tag;	/* parent mbuf/ssb tag */
154560616bfSSepherosa Ziehau 
155560616bfSSepherosa Ziehau 	/*
156560616bfSSepherosa Ziehau 	 * Shadow status block
157560616bfSSepherosa Ziehau 	 */
158560616bfSSepherosa Ziehau 	struct jme_ssb		*jme_ssb_block;
159560616bfSSepherosa Ziehau 	bus_addr_t		jme_ssb_block_paddr;
16076fbb0b9SSepherosa Ziehau 	bus_dma_tag_t		jme_ssb_tag;
16176fbb0b9SSepherosa Ziehau 	bus_dmamap_t		jme_ssb_map;
162560616bfSSepherosa Ziehau 
163560616bfSSepherosa Ziehau 	/*
164560616bfSSepherosa Ziehau 	 * TX ring/descs
165560616bfSSepherosa Ziehau 	 */
166560616bfSSepherosa Ziehau 	bus_dma_tag_t		jme_tx_tag;	/* TX mbuf tag */
16783b03786SSepherosa Ziehau 	struct jme_txdesc	*jme_txdesc;
168560616bfSSepherosa Ziehau 
169560616bfSSepherosa Ziehau 	struct jme_desc		*jme_tx_ring;
170560616bfSSepherosa Ziehau 	bus_addr_t		jme_tx_ring_paddr;
17176fbb0b9SSepherosa Ziehau 	bus_dma_tag_t		jme_tx_ring_tag;
17276fbb0b9SSepherosa Ziehau 	bus_dmamap_t		jme_tx_ring_map;
17376fbb0b9SSepherosa Ziehau 
17476fbb0b9SSepherosa Ziehau 	int			jme_tx_prod;
17576fbb0b9SSepherosa Ziehau 	int			jme_tx_cons;
17676fbb0b9SSepherosa Ziehau 	int			jme_tx_cnt;
17776fbb0b9SSepherosa Ziehau 
1784447c752SSepherosa Ziehau 	struct jme_rxdata	jme_rx_data[JME_NRXRING_MAX];
17976fbb0b9SSepherosa Ziehau };
18076fbb0b9SSepherosa Ziehau 
18183b03786SSepherosa Ziehau #define JME_TX_RING_SIZE(sc)	\
18269325526SSepherosa Ziehau     (sizeof(struct jme_desc) * (sc)->jme_tx_desc_cnt)
18383b03786SSepherosa Ziehau #define JME_RX_RING_SIZE(sc)	\
18469325526SSepherosa Ziehau     (sizeof(struct jme_desc) * (sc)->jme_rx_desc_cnt)
18576fbb0b9SSepherosa Ziehau #define	JME_SSB_SIZE		sizeof(struct jme_ssb)
18676fbb0b9SSepherosa Ziehau 
18776fbb0b9SSepherosa Ziehau struct jme_dmamap_ctx {
18876fbb0b9SSepherosa Ziehau 	int			nsegs;
18976fbb0b9SSepherosa Ziehau 	bus_dma_segment_t	*segs;
19076fbb0b9SSepherosa Ziehau };
19176fbb0b9SSepherosa Ziehau 
19276fbb0b9SSepherosa Ziehau /*
19376fbb0b9SSepherosa Ziehau  * Software state per device.
19476fbb0b9SSepherosa Ziehau  */
19576fbb0b9SSepherosa Ziehau struct jme_softc {
19676fbb0b9SSepherosa Ziehau 	struct arpcom		arpcom;
19776fbb0b9SSepherosa Ziehau 	device_t		jme_dev;
19876fbb0b9SSepherosa Ziehau 
19976fbb0b9SSepherosa Ziehau 	int			jme_mem_rid;
20076fbb0b9SSepherosa Ziehau 	struct resource		*jme_mem_res;
20176fbb0b9SSepherosa Ziehau 	bus_space_tag_t		jme_mem_bt;
20276fbb0b9SSepherosa Ziehau 	bus_space_handle_t	jme_mem_bh;
20376fbb0b9SSepherosa Ziehau 
20476fbb0b9SSepherosa Ziehau 	int			jme_irq_rid;
20576fbb0b9SSepherosa Ziehau 	struct resource		*jme_irq_res;
20676fbb0b9SSepherosa Ziehau 	void			*jme_irq_handle;
20776fbb0b9SSepherosa Ziehau 
20876fbb0b9SSepherosa Ziehau 	device_t		jme_miibus;
20976fbb0b9SSepherosa Ziehau 	int			jme_phyaddr;
210b249905bSSepherosa Ziehau 	bus_addr_t		jme_lowaddr;
21176fbb0b9SSepherosa Ziehau 
212b249905bSSepherosa Ziehau 	uint32_t		jme_clksrc;
213b249905bSSepherosa Ziehau 	uint32_t		jme_clksrc_1000;
21476fbb0b9SSepherosa Ziehau 	uint32_t		jme_tx_dma_size;
21576fbb0b9SSepherosa Ziehau 	uint32_t		jme_rx_dma_size;
216ec7e787bSSepherosa Ziehau 
217ec7e787bSSepherosa Ziehau 	uint32_t		jme_caps;
218ec7e787bSSepherosa Ziehau #define	JME_CAP_FPGA		0x0001
219ec7e787bSSepherosa Ziehau #define	JME_CAP_PCIE		0x0002
220ec7e787bSSepherosa Ziehau #define	JME_CAP_PMCAP		0x0004
221ec7e787bSSepherosa Ziehau #define	JME_CAP_FASTETH		0x0008
2223a5f3f36SSepherosa Ziehau #define	JME_CAP_JUMBO		0x0010
2234447c752SSepherosa Ziehau #define JME_CAP_RSS		0x0020
224ad22907fSSepherosa Ziehau 
225ad22907fSSepherosa Ziehau 	uint32_t		jme_workaround;
226ad22907fSSepherosa Ziehau #define JME_WA_EXTFIFO		0x0001
2273b3da110SSepherosa Ziehau #define JME_WA_HDX		0x0002
228ec7e787bSSepherosa Ziehau 
229ec7e787bSSepherosa Ziehau 	uint32_t		jme_flags;
230ec7e787bSSepherosa Ziehau #define	JME_FLAG_MSI		0x0001
231ec7e787bSSepherosa Ziehau #define	JME_FLAG_MSIX		0x0002
232ec7e787bSSepherosa Ziehau #define	JME_FLAG_DETACH		0x0004
233ec7e787bSSepherosa Ziehau #define	JME_FLAG_LINK		0x0008
2344447c752SSepherosa Ziehau #define JME_FLAG_RSS		0x0010
23576fbb0b9SSepherosa Ziehau 
23676fbb0b9SSepherosa Ziehau 	struct callout		jme_tick_ch;
23776fbb0b9SSepherosa Ziehau 	struct jme_chain_data	jme_cdata;
23876fbb0b9SSepherosa Ziehau 	int			jme_if_flags;
23976fbb0b9SSepherosa Ziehau 	uint32_t		jme_txcsr;
24076fbb0b9SSepherosa Ziehau 	uint32_t		jme_rxcsr;
24176fbb0b9SSepherosa Ziehau 
24276fbb0b9SSepherosa Ziehau 	int			jme_txd_spare;
24376fbb0b9SSepherosa Ziehau 
24476fbb0b9SSepherosa Ziehau 	struct sysctl_ctx_list	jme_sysctl_ctx;
24576fbb0b9SSepherosa Ziehau 	struct sysctl_oid	*jme_sysctl_tree;
24676fbb0b9SSepherosa Ziehau 
24776fbb0b9SSepherosa Ziehau 	/*
24876fbb0b9SSepherosa Ziehau 	 * Sysctl variables
24976fbb0b9SSepherosa Ziehau 	 */
25076fbb0b9SSepherosa Ziehau 	int			jme_tx_coal_to;
25176fbb0b9SSepherosa Ziehau 	int			jme_tx_coal_pkt;
25276fbb0b9SSepherosa Ziehau 	int			jme_rx_coal_to;
25376fbb0b9SSepherosa Ziehau 	int			jme_rx_coal_pkt;
25469325526SSepherosa Ziehau 	int			jme_rx_desc_cnt;
25569325526SSepherosa Ziehau 	int			jme_tx_desc_cnt;
2564447c752SSepherosa Ziehau 	int			jme_rx_ring_cnt;
257760c056cSSepherosa Ziehau 	int			jme_rx_ring_inuse;
258760c056cSSepherosa Ziehau 	int			jme_rss_debug;
259760c056cSSepherosa Ziehau 	u_int			jme_rx_ring_pkt[JME_NRXRING_MAX];
26076fbb0b9SSepherosa Ziehau };
26176fbb0b9SSepherosa Ziehau 
26276fbb0b9SSepherosa Ziehau /* Register access macros. */
26376fbb0b9SSepherosa Ziehau #define CSR_WRITE_4(_sc, reg, val)	\
26476fbb0b9SSepherosa Ziehau 	bus_space_write_4((_sc)->jme_mem_bt, (_sc)->jme_mem_bh, (reg), (val))
26576fbb0b9SSepherosa Ziehau #define CSR_READ_4(_sc, reg)		\
26676fbb0b9SSepherosa Ziehau 	bus_space_read_4((_sc)->jme_mem_bt, (_sc)->jme_mem_bh, (reg))
26776fbb0b9SSepherosa Ziehau 
26876fbb0b9SSepherosa Ziehau #define	JME_MAXERR	5
26976fbb0b9SSepherosa Ziehau 
2704447c752SSepherosa Ziehau #define	JME_RXCHAIN_RESET(sc, ring)				\
27176fbb0b9SSepherosa Ziehau do {								\
2724447c752SSepherosa Ziehau 	(sc)->jme_cdata.jme_rx_data[(ring)].jme_rxhead = NULL;	\
2734447c752SSepherosa Ziehau 	(sc)->jme_cdata.jme_rx_data[(ring)].jme_rxtail = NULL;	\
2744447c752SSepherosa Ziehau 	(sc)->jme_cdata.jme_rx_data[(ring)].jme_rxlen = 0;	\
27576fbb0b9SSepherosa Ziehau } while (0)
27676fbb0b9SSepherosa Ziehau 
27776fbb0b9SSepherosa Ziehau #define	JME_TX_TIMEOUT		5
27876fbb0b9SSepherosa Ziehau #define JME_TIMEOUT		1000
27976fbb0b9SSepherosa Ziehau #define JME_PHY_TIMEOUT		1000
28076fbb0b9SSepherosa Ziehau #define JME_EEPROM_TIMEOUT	1000
28176fbb0b9SSepherosa Ziehau 
28276fbb0b9SSepherosa Ziehau #define JME_TXD_RSVD		1
28376fbb0b9SSepherosa Ziehau 
28476fbb0b9SSepherosa Ziehau #endif
285