xref: /dflybsd-src/sys/dev/netif/jme/if_jmevar.h (revision 7405bec33dcfe494285bf3437313f62a5888ea70)
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 /*
39*7405bec3SSepherosa 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 
4876fbb0b9SSepherosa Ziehau /*
4976fbb0b9SSepherosa Ziehau  * Tx/Rx descriptor queue base should be 16bytes aligned and
5076fbb0b9SSepherosa Ziehau  * should not cross 4G bytes boundary on the 64bits address
5176fbb0b9SSepherosa Ziehau  * mode.
5276fbb0b9SSepherosa Ziehau  */
5376fbb0b9SSepherosa Ziehau #define	JME_TX_RING_ALIGN	16
5476fbb0b9SSepherosa Ziehau #define	JME_RX_RING_ALIGN	16
5576fbb0b9SSepherosa Ziehau #define	JME_TSO_MAXSEGSIZE	4096
5676fbb0b9SSepherosa Ziehau #define	JME_TSO_MAXSIZE		(65535 + sizeof(struct ether_vlan_header))
5776fbb0b9SSepherosa Ziehau #define	JME_MAXTXSEGS		32
5876fbb0b9SSepherosa Ziehau #define	JME_RX_BUF_ALIGN	sizeof(uint64_t)
5976fbb0b9SSepherosa Ziehau #define	JME_SSB_ALIGN		16
6076fbb0b9SSepherosa Ziehau 
6176fbb0b9SSepherosa Ziehau #define	JME_ADDR_LO(x)		((uint64_t) (x) & 0xFFFFFFFF)
6276fbb0b9SSepherosa Ziehau #define	JME_ADDR_HI(x)		((uint64_t) (x) >> 32)
6376fbb0b9SSepherosa Ziehau 
6476fbb0b9SSepherosa Ziehau #define	JME_MSI_MESSAGES	8
6576fbb0b9SSepherosa Ziehau #define	JME_MSIX_MESSAGES	8
6676fbb0b9SSepherosa Ziehau 
6776fbb0b9SSepherosa Ziehau /* Water mark to kick reclaiming Tx buffers. */
6883b03786SSepherosa Ziehau #define	JME_TX_DESC_HIWAT(sc)	\
6969325526SSepherosa Ziehau 	((sc)->jme_tx_desc_cnt - (((sc)->jme_tx_desc_cnt * 3) / 10))
7076fbb0b9SSepherosa Ziehau 
7176fbb0b9SSepherosa Ziehau /*
7276fbb0b9SSepherosa Ziehau  * JMC250 can send 9K jumbo frame on Tx path and can receive
7376fbb0b9SSepherosa Ziehau  * 65535 bytes.
7476fbb0b9SSepherosa Ziehau  */
7576fbb0b9SSepherosa Ziehau #define JME_JUMBO_FRAMELEN	9216
7676fbb0b9SSepherosa Ziehau #define JME_JUMBO_MTU							\
7776fbb0b9SSepherosa Ziehau 	(JME_JUMBO_FRAMELEN - sizeof(struct ether_vlan_header) -	\
7876fbb0b9SSepherosa Ziehau 	 ETHER_HDR_LEN - ETHER_CRC_LEN)
7976fbb0b9SSepherosa Ziehau #define	JME_MAX_MTU							\
8076fbb0b9SSepherosa Ziehau 	(ETHER_MAX_LEN + sizeof(struct ether_vlan_header) -		\
8176fbb0b9SSepherosa Ziehau 	 ETHER_HDR_LEN - ETHER_CRC_LEN)
8276fbb0b9SSepherosa Ziehau /*
8376fbb0b9SSepherosa Ziehau  * JMC250 can't handle Tx checksum offload/TSO if frame length
8476fbb0b9SSepherosa Ziehau  * is larger than its FIFO size(2K). It's also good idea to not
8576fbb0b9SSepherosa Ziehau  * use jumbo frame if hardware is running at half-duplex media.
8676fbb0b9SSepherosa Ziehau  * Because the jumbo frame may not fit into the Tx FIFO,
8776fbb0b9SSepherosa Ziehau  * collisions make hardware fetch frame from host memory with
8876fbb0b9SSepherosa Ziehau  * DMA again which in turn slows down Tx performance
8976fbb0b9SSepherosa Ziehau  * significantly.
9076fbb0b9SSepherosa Ziehau  */
9176fbb0b9SSepherosa Ziehau #define	JME_TX_FIFO_SIZE	2000
9276fbb0b9SSepherosa Ziehau /*
9376fbb0b9SSepherosa Ziehau  * JMC250 has just 4K Rx FIFO. To support jumbo frame that is
9476fbb0b9SSepherosa Ziehau  * larger than 4K bytes in length, Rx FIFO threshold should be
9576fbb0b9SSepherosa Ziehau  * adjusted to minimize Rx FIFO overrun.
9676fbb0b9SSepherosa Ziehau  */
9776fbb0b9SSepherosa Ziehau #define	JME_RX_FIFO_SIZE	4000
9876fbb0b9SSepherosa Ziehau 
9976fbb0b9SSepherosa Ziehau #define	JME_DESC_INC(x, y)	((x) = ((x) + 1) % (y))
10076fbb0b9SSepherosa Ziehau 
10176fbb0b9SSepherosa Ziehau struct jme_txdesc {
10276fbb0b9SSepherosa Ziehau 	struct mbuf		*tx_m;
10376fbb0b9SSepherosa Ziehau 	bus_dmamap_t		tx_dmamap;
10476fbb0b9SSepherosa Ziehau 	int			tx_ndesc;
10576fbb0b9SSepherosa Ziehau 	struct jme_desc		*tx_desc;
10676fbb0b9SSepherosa Ziehau };
10776fbb0b9SSepherosa Ziehau 
10876fbb0b9SSepherosa Ziehau struct jme_rxdesc {
10976fbb0b9SSepherosa Ziehau 	struct mbuf 		*rx_m;
11076fbb0b9SSepherosa Ziehau 	bus_dmamap_t		rx_dmamap;
11176fbb0b9SSepherosa Ziehau 	struct jme_desc		*rx_desc;
11276fbb0b9SSepherosa Ziehau };
11376fbb0b9SSepherosa Ziehau 
11476fbb0b9SSepherosa Ziehau struct jme_chain_data {
115560616bfSSepherosa Ziehau 	/*
116560616bfSSepherosa Ziehau 	 * Top level tags
117560616bfSSepherosa Ziehau 	 */
118560616bfSSepherosa Ziehau 	bus_dma_tag_t		jme_ring_tag;	/* parent ring tag */
119560616bfSSepherosa Ziehau 	bus_dma_tag_t		jme_buffer_tag;	/* parent mbuf/ssb tag */
120560616bfSSepherosa Ziehau 
121560616bfSSepherosa Ziehau 	/*
122560616bfSSepherosa Ziehau 	 * Shadow status block
123560616bfSSepherosa Ziehau 	 */
124560616bfSSepherosa Ziehau 	struct jme_ssb		*jme_ssb_block;
125560616bfSSepherosa Ziehau 	bus_addr_t		jme_ssb_block_paddr;
12676fbb0b9SSepherosa Ziehau 	bus_dma_tag_t		jme_ssb_tag;
12776fbb0b9SSepherosa Ziehau 	bus_dmamap_t		jme_ssb_map;
128560616bfSSepherosa Ziehau 
129560616bfSSepherosa Ziehau 	/*
130560616bfSSepherosa Ziehau 	 * TX ring/descs
131560616bfSSepherosa Ziehau 	 */
132560616bfSSepherosa Ziehau 	bus_dma_tag_t		jme_tx_tag;	/* TX mbuf tag */
13383b03786SSepherosa Ziehau 	struct jme_txdesc	*jme_txdesc;
134560616bfSSepherosa Ziehau 
135560616bfSSepherosa Ziehau 	struct jme_desc		*jme_tx_ring;
136560616bfSSepherosa Ziehau 	bus_addr_t		jme_tx_ring_paddr;
13776fbb0b9SSepherosa Ziehau 	bus_dma_tag_t		jme_tx_ring_tag;
13876fbb0b9SSepherosa Ziehau 	bus_dmamap_t		jme_tx_ring_map;
13976fbb0b9SSepherosa Ziehau 
14076fbb0b9SSepherosa Ziehau 	int			jme_tx_prod;
14176fbb0b9SSepherosa Ziehau 	int			jme_tx_cons;
14276fbb0b9SSepherosa Ziehau 	int			jme_tx_cnt;
14376fbb0b9SSepherosa Ziehau 
144560616bfSSepherosa Ziehau 	/*
145560616bfSSepherosa Ziehau 	 * RX ring/descs
146560616bfSSepherosa Ziehau 	 */
147560616bfSSepherosa Ziehau 	bus_dma_tag_t		jme_rx_tag;	/* RX mbuf tag */
148560616bfSSepherosa Ziehau 	bus_dmamap_t		jme_rx_sparemap;
149560616bfSSepherosa Ziehau 	struct jme_rxdesc	*jme_rxdesc;
150560616bfSSepherosa Ziehau 
151560616bfSSepherosa Ziehau 	struct jme_desc		*jme_rx_ring;
152560616bfSSepherosa Ziehau 	bus_addr_t		jme_rx_ring_paddr;
153560616bfSSepherosa Ziehau 	bus_dma_tag_t		jme_rx_ring_tag;
154560616bfSSepherosa Ziehau 	bus_dmamap_t		jme_rx_ring_map;
155560616bfSSepherosa Ziehau 
15676fbb0b9SSepherosa Ziehau 	int			jme_rx_cons;
157560616bfSSepherosa Ziehau 
15876fbb0b9SSepherosa Ziehau 	int			jme_rxlen;
15976fbb0b9SSepherosa Ziehau 	struct mbuf		*jme_rxhead;
16076fbb0b9SSepherosa Ziehau 	struct mbuf		*jme_rxtail;
16176fbb0b9SSepherosa Ziehau };
16276fbb0b9SSepherosa Ziehau 
16383b03786SSepherosa Ziehau #define JME_TX_RING_SIZE(sc)	\
16469325526SSepherosa Ziehau     (sizeof(struct jme_desc) * (sc)->jme_tx_desc_cnt)
16583b03786SSepherosa Ziehau #define JME_RX_RING_SIZE(sc)	\
16669325526SSepherosa Ziehau     (sizeof(struct jme_desc) * (sc)->jme_rx_desc_cnt)
16776fbb0b9SSepherosa Ziehau #define	JME_SSB_SIZE		sizeof(struct jme_ssb)
16876fbb0b9SSepherosa Ziehau 
16976fbb0b9SSepherosa Ziehau struct jme_dmamap_ctx {
17076fbb0b9SSepherosa Ziehau 	int			nsegs;
17176fbb0b9SSepherosa Ziehau 	bus_dma_segment_t	*segs;
17276fbb0b9SSepherosa Ziehau };
17376fbb0b9SSepherosa Ziehau 
17476fbb0b9SSepherosa Ziehau /*
17576fbb0b9SSepherosa Ziehau  * Software state per device.
17676fbb0b9SSepherosa Ziehau  */
17776fbb0b9SSepherosa Ziehau struct jme_softc {
17876fbb0b9SSepherosa Ziehau 	struct arpcom		arpcom;
17976fbb0b9SSepherosa Ziehau 	device_t		jme_dev;
18076fbb0b9SSepherosa Ziehau 
18176fbb0b9SSepherosa Ziehau 	int			jme_mem_rid;
18276fbb0b9SSepherosa Ziehau 	struct resource		*jme_mem_res;
18376fbb0b9SSepherosa Ziehau 	bus_space_tag_t		jme_mem_bt;
18476fbb0b9SSepherosa Ziehau 	bus_space_handle_t	jme_mem_bh;
18576fbb0b9SSepherosa Ziehau 
18676fbb0b9SSepherosa Ziehau 	int			jme_irq_rid;
18776fbb0b9SSepherosa Ziehau 	struct resource		*jme_irq_res;
18876fbb0b9SSepherosa Ziehau 	void			*jme_irq_handle;
18976fbb0b9SSepherosa Ziehau 
19076fbb0b9SSepherosa Ziehau 	device_t		jme_miibus;
19176fbb0b9SSepherosa Ziehau 	int			jme_phyaddr;
192b249905bSSepherosa Ziehau 	bus_addr_t		jme_lowaddr;
19376fbb0b9SSepherosa Ziehau 
194b249905bSSepherosa Ziehau 	uint32_t		jme_clksrc;
195b249905bSSepherosa Ziehau 	uint32_t		jme_clksrc_1000;
19676fbb0b9SSepherosa Ziehau 	uint32_t		jme_tx_dma_size;
19776fbb0b9SSepherosa Ziehau 	uint32_t		jme_rx_dma_size;
198ec7e787bSSepherosa Ziehau 
199ec7e787bSSepherosa Ziehau 	uint32_t		jme_caps;
200ec7e787bSSepherosa Ziehau #define	JME_CAP_FPGA		0x0001
201ec7e787bSSepherosa Ziehau #define	JME_CAP_PCIE		0x0002
202ec7e787bSSepherosa Ziehau #define	JME_CAP_PMCAP		0x0004
203ec7e787bSSepherosa Ziehau #define	JME_CAP_FASTETH		0x0008
2043a5f3f36SSepherosa Ziehau #define	JME_CAP_JUMBO		0x0010
205ad22907fSSepherosa Ziehau 
206ad22907fSSepherosa Ziehau 	uint32_t		jme_workaround;
207ad22907fSSepherosa Ziehau #define JME_WA_EXTFIFO		0x0001
2083b3da110SSepherosa Ziehau #define JME_WA_HDX		0x0002
209ec7e787bSSepherosa Ziehau 
210ec7e787bSSepherosa Ziehau 	uint32_t		jme_flags;
211ec7e787bSSepherosa Ziehau #define	JME_FLAG_MSI		0x0001
212ec7e787bSSepherosa Ziehau #define	JME_FLAG_MSIX		0x0002
213ec7e787bSSepherosa Ziehau #define	JME_FLAG_DETACH		0x0004
214ec7e787bSSepherosa Ziehau #define	JME_FLAG_LINK		0x0008
21576fbb0b9SSepherosa Ziehau 
21676fbb0b9SSepherosa Ziehau 	struct callout		jme_tick_ch;
21776fbb0b9SSepherosa Ziehau 	struct jme_chain_data	jme_cdata;
21876fbb0b9SSepherosa Ziehau 	int			jme_if_flags;
21976fbb0b9SSepherosa Ziehau 	uint32_t		jme_txcsr;
22076fbb0b9SSepherosa Ziehau 	uint32_t		jme_rxcsr;
22176fbb0b9SSepherosa Ziehau 
22276fbb0b9SSepherosa Ziehau 	int			jme_txd_spare;
22376fbb0b9SSepherosa Ziehau 
22476fbb0b9SSepherosa Ziehau 	struct sysctl_ctx_list	jme_sysctl_ctx;
22576fbb0b9SSepherosa Ziehau 	struct sysctl_oid	*jme_sysctl_tree;
22676fbb0b9SSepherosa Ziehau 
22776fbb0b9SSepherosa Ziehau 	/*
22876fbb0b9SSepherosa Ziehau 	 * Sysctl variables
22976fbb0b9SSepherosa Ziehau 	 */
23076fbb0b9SSepherosa Ziehau 	int			jme_tx_coal_to;
23176fbb0b9SSepherosa Ziehau 	int			jme_tx_coal_pkt;
23276fbb0b9SSepherosa Ziehau 	int			jme_rx_coal_to;
23376fbb0b9SSepherosa Ziehau 	int			jme_rx_coal_pkt;
23469325526SSepherosa Ziehau 	int			jme_rx_desc_cnt;
23569325526SSepherosa Ziehau 	int			jme_tx_desc_cnt;
23676fbb0b9SSepherosa Ziehau };
23776fbb0b9SSepherosa Ziehau 
23876fbb0b9SSepherosa Ziehau /* Register access macros. */
23976fbb0b9SSepherosa Ziehau #define CSR_WRITE_4(_sc, reg, val)	\
24076fbb0b9SSepherosa Ziehau 	bus_space_write_4((_sc)->jme_mem_bt, (_sc)->jme_mem_bh, (reg), (val))
24176fbb0b9SSepherosa Ziehau #define CSR_READ_4(_sc, reg)		\
24276fbb0b9SSepherosa Ziehau 	bus_space_read_4((_sc)->jme_mem_bt, (_sc)->jme_mem_bh, (reg))
24376fbb0b9SSepherosa Ziehau 
24476fbb0b9SSepherosa Ziehau #define	JME_MAXERR	5
24576fbb0b9SSepherosa Ziehau 
24676fbb0b9SSepherosa Ziehau #define	JME_RXCHAIN_RESET(_sc)						\
24776fbb0b9SSepherosa Ziehau do {									\
24876fbb0b9SSepherosa Ziehau 	(_sc)->jme_cdata.jme_rxhead = NULL;				\
24976fbb0b9SSepherosa Ziehau 	(_sc)->jme_cdata.jme_rxtail = NULL;				\
25076fbb0b9SSepherosa Ziehau 	(_sc)->jme_cdata.jme_rxlen = 0;					\
25176fbb0b9SSepherosa Ziehau } while (0)
25276fbb0b9SSepherosa Ziehau 
25376fbb0b9SSepherosa Ziehau #define	JME_TX_TIMEOUT		5
25476fbb0b9SSepherosa Ziehau #define JME_TIMEOUT		1000
25576fbb0b9SSepherosa Ziehau #define JME_PHY_TIMEOUT		1000
25676fbb0b9SSepherosa Ziehau #define JME_EEPROM_TIMEOUT	1000
25776fbb0b9SSepherosa Ziehau 
25876fbb0b9SSepherosa Ziehau #define JME_TXD_RSVD		1
25976fbb0b9SSepherosa Ziehau 
26076fbb0b9SSepherosa Ziehau #endif
261