if_rtvar.h revision 296373
190285Sobrien/*-
290285Sobrien * Copyright (c) 2010-2011 Aleksandr Rybalko <ray@ddteam.net>
390285Sobrien * Copyright (c) 2009-2010 Alexander Egorenkov <egorenar@gmail.com>
418334Speter * Copyright (c) 2009 Damien Bergamini <damien.bergamini@free.fr>
518334Speter *
618334Speter * Redistribution and use in source and binary forms, with or without
718334Speter * modification, are permitted provided that the following conditions
818334Speter * are met:
918334Speter * 1. Redistributions of source code must retain the above copyright
1018334Speter *    notice unmodified, this list of conditions, and the following
1118334Speter *    disclaimer.
1218334Speter * 2. Redistributions in binary form must reproduce the above copyright
1318334Speter *    notice, this list of conditions and the following disclaimer in the
1418334Speter *    documentation and/or other materials provided with the distribution.
1518334Speter *
1618334Speter * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1718334Speter * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1818334Speter * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1918334Speter * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
2090285Sobrien * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2118334Speter * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2218334Speter * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2318334Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2418334Speter * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2518334Speter * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2618334Speter * SUCH DAMAGE.
2718334Speter *
2818334Speter * $FreeBSD: releng/10.3/sys/dev/rt/if_rtvar.h 223927 2011-07-11 08:23:59Z ray $
2918334Speter */
3018334Speter
3118334Speter#ifndef _IF_RTVAR_H_
3218334Speter#define	_IF_RTVAR_H_
3390285Sobrien
3490285Sobrien#include <sys/param.h>
3590285Sobrien#include <sys/sysctl.h>
3618334Speter#include <sys/sockio.h>
3790285Sobrien#include <sys/mbuf.h>
3852295Sobrien#include <sys/kernel.h>
3952295Sobrien#include <sys/socket.h>
4018334Speter#include <sys/systm.h>
4118334Speter#include <sys/malloc.h>
4218334Speter#include <sys/taskqueue.h>
4318334Speter#include <sys/module.h>
4418334Speter#include <sys/bus.h>
4518334Speter#include <sys/endian.h>
4618334Speter
4718334Speter#include <machine/bus.h>
4818334Speter#include <machine/resource.h>
4990285Sobrien#include <sys/rman.h>
5018334Speter
5190285Sobrien#include <net/bpf.h>
5218334Speter#include <net/if.h>
5318334Speter#include <net/if_arp.h>
5418334Speter#include <net/ethernet.h>
5550654Sobrien#include <net/if_dl.h>
5650654Sobrien#include <net/if_media.h>
5750654Sobrien#include <net/if_types.h>
5890285Sobrien
5990285Sobrien#include "opt_if_rt.h"
6090285Sobrien
6190285Sobrien#define	RT_SOFTC_LOCK(sc)		mtx_lock(&(sc)->lock)
6290285Sobrien#define	RT_SOFTC_UNLOCK(sc)		mtx_unlock(&(sc)->lock)
6390285Sobrien#define	RT_SOFTC_ASSERT_LOCKED(sc)	mtx_assert(&(sc)->lock, MA_OWNED)
6490285Sobrien
6590285Sobrien#define	RT_SOFTC_TX_RING_LOCK(ring)		mtx_lock(&(ring)->lock)
6690285Sobrien#define	RT_SOFTC_TX_RING_UNLOCK(ring)		mtx_unlock(&(ring)->lock)
6790285Sobrien#define	RT_SOFTC_TX_RING_ASSERT_LOCKED(ring)	\
6890285Sobrien		    mtx_assert(&(ring)->lock, MA_OWNED)
6990285Sobrien
7090285Sobrien#define	RT_SOFTC_TX_RING_COUNT		4
7190285Sobrien
7290285Sobrien#ifndef IF_RT_RING_DATA_COUNT
7390285Sobrien#define	IF_RT_RING_DATA_COUNT	128
7490285Sobrien#endif
7590285Sobrien
7690285Sobrien#define	RT_SOFTC_RX_RING_DATA_COUNT	IF_RT_RING_DATA_COUNT
7790285Sobrien
7890285Sobrien#define	RT_SOFTC_MAX_SCATTER		10
7990285Sobrien
8090285Sobrien#define	RT_SOFTC_TX_RING_DATA_COUNT	(IF_RT_RING_DATA_COUNT/4)
8190285Sobrien#define	RT_SOFTC_TX_RING_DESC_COUNT				\
8290285Sobrien	(RT_SOFTC_TX_RING_DATA_COUNT * RT_SOFTC_MAX_SCATTER)
8390285Sobrien
8490285Sobrien#define	RT_TXDESC_SDL1_BURST		(1 << 15)
8590285Sobrien#define	RT_TXDESC_SDL1_LASTSEG		(1 << 14)
8690285Sobrien#define	RT_TXDESC_SDL0_DDONE		(1 << 15)
8790285Sobrien#define	RT_TXDESC_SDL0_LASTSEG		(1 << 14)
8890285Sobrienstruct rt_txdesc
8990285Sobrien{
9090285Sobrien	uint32_t sdp0;
9190285Sobrien	uint16_t sdl1;
9290285Sobrien	uint16_t sdl0;
9390285Sobrien	uint32_t sdp1;
9490285Sobrien	uint8_t vid;
9590285Sobrien#define	TXDSCR_INS_VLAN_TAG	0x80
9650654Sobrien#define	TXDSCR_VLAN_PRIO_MASK	0x70
9750654Sobrien#define	TXDSCR_VLAN_IDX_MASK	0x0f
9890285Sobrien	uint8_t	pppoe;
9950654Sobrien#define	TXDSCR_USR_DEF_FLD	0x80
10018334Speter#define	TXDSCR_INS_PPPOE_HDR	0x10
10118334Speter#define	TXDSCR_PPPOE_SID_MASK	0x0f
10218334Speter	uint8_t qn;
10318334Speter#define	TXDSCR_QUEUE_MASK	0x07
10418334Speter	uint8_t	dst;
10518334Speter#define	TXDSCR_IP_CSUM_GEN	0x80
10618334Speter#define	TXDSCR_UDP_CSUM_GEN	0x40
10790285Sobrien#define	TXDSCR_TCP_CSUM_GEN	0x20
10818334Speter#define	TXDSCR_DST_PORT_MASK	0x07
10918334Speter#define	TXDSCR_DST_PORT_CPU	0x00
11018334Speter#define	TXDSCR_DST_PORT_GDMA1	0x01
11118334Speter#define	TXDSCR_DST_PORT_GDMA2	0x02
11218334Speter#define	TXDSCR_DST_PORT_PPE	0x06
11390285Sobrien#define	TXDSCR_DST_PORT_DISC	0x07
11490285Sobrien} __packed;
11590285Sobrien
11690285Sobrien#define	RT_RXDESC_SDL0_DDONE		(1 << 15)
11790285Sobrienstruct rt_rxdesc
11890285Sobrien{
11990285Sobrien	uint32_t sdp0;
12090285Sobrien	uint16_t sdl1;
12190285Sobrien	uint16_t sdl0;
12290285Sobrien	uint32_t sdp1;
12390285Sobrien	uint16_t foe;
12490285Sobrien#define	RXDSXR_FOE_ENTRY_VALID		0x40
12590285Sobrien#define	RXDSXR_FOE_ENTRY_MASK		0x3f
12690285Sobrien	uint8_t ai;
12790285Sobrien#define	RXDSXR_AI_COU_REASON		0xff
12890285Sobrien#define	RXDSXR_AI_PARSER_RSLT_MASK	0xff
12990285Sobrien	uint8_t src;
13090285Sobrien#define	RXDSXR_SRC_IPFVLD		0x80
13190285Sobrien#define	RXDSXR_SRC_L4FVLD		0x40
13290285Sobrien#define	RXDSXR_SRC_IP_CSUM_FAIL	0x20
13390285Sobrien#define	RXDSXR_SRC_L4_CSUM_FAIL	0x10
13490285Sobrien#define	RXDSXR_SRC_AIS			0x08
13590285Sobrien#define	RXDSXR_SRC_PORT_MASK		0x07
13690285Sobrien} __packed;
13790285Sobrien
13890285Sobrienstruct rt_softc_rx_data
13990285Sobrien{
14090285Sobrien	bus_dmamap_t dma_map;
14118334Speter	struct mbuf *m;
14218334Speter};
14318334Speter
14418334Speterstruct rt_softc_rx_ring
14518334Speter{
14618334Speter	bus_dma_tag_t desc_dma_tag;
14718334Speter	bus_dmamap_t desc_dma_map;
14818334Speter	bus_addr_t desc_phys_addr;
14918334Speter	struct rt_rxdesc *desc;
15018334Speter	bus_dma_tag_t data_dma_tag;
15118334Speter	bus_dmamap_t spare_dma_map;
15218334Speter	struct rt_softc_rx_data data[RT_SOFTC_RX_RING_DATA_COUNT];
15318334Speter	int cur;
15418334Speter};
15590285Sobrien
15690285Sobrienstruct rt_softc_tx_data
15790285Sobrien{
15890285Sobrien	bus_dmamap_t dma_map;
15990285Sobrien	struct mbuf *m;
16090285Sobrien};
16190285Sobrien
16218334Speterstruct rt_softc_tx_ring
16318334Speter{
16418334Speter	struct mtx lock;
16518334Speter	bus_dma_tag_t desc_dma_tag;
16618334Speter	bus_dmamap_t desc_dma_map;
16718334Speter	bus_addr_t desc_phys_addr;
16818334Speter	struct rt_txdesc *desc;
16918334Speter	int desc_queued;
17018334Speter	int desc_cur;
17118334Speter	int desc_next;
17218334Speter	bus_dma_tag_t seg0_dma_tag;
17390285Sobrien	bus_dmamap_t seg0_dma_map;
17418334Speter	bus_addr_t seg0_phys_addr;
17518334Speter	uint8_t *seg0;
17690285Sobrien	bus_dma_tag_t data_dma_tag;
17790285Sobrien	struct rt_softc_tx_data data[RT_SOFTC_TX_RING_DATA_COUNT];
17890285Sobrien	int data_queued;
17990285Sobrien	int data_cur;
18090285Sobrien	int data_next;
18118334Speter	int qid;
18218334Speter};
18318334Speter
18418334Speterstruct rt_softc
18550654Sobrien{
18690285Sobrien	device_t 	 dev;
18790285Sobrien	struct mtx 	 lock;
18850654Sobrien	uint32_t 	 flags;
18918334Speter
19090285Sobrien	int		 mem_rid;
19118334Speter	struct resource	*mem;
19218334Speter	int		 irq_rid;
19390285Sobrien	struct resource *irq;
19418334Speter	void		*irqh;
19590285Sobrien
19690285Sobrien	bus_space_tag_t	 bst;
19790285Sobrien	bus_space_handle_t bsh;
19890285Sobrien
19990285Sobrien	struct ifnet	*ifp;
20090285Sobrien	int 		 if_flags;
20190285Sobrien	struct ifmedia	 rt_ifmedia;
20290285Sobrien
20390285Sobrien	uint32_t	 mac_rev;
20490285Sobrien	uint8_t		 mac_addr[ETHER_ADDR_LEN];
20518334Speter	device_t	 rt_miibus;
20650654Sobrien
20750654Sobrien	uint32_t	 intr_enable_mask;
20850654Sobrien	uint32_t	 intr_disable_mask;
20950654Sobrien	uint32_t	 intr_pending_mask;
21052295Sobrien
21190285Sobrien	struct task	 rx_done_task;
21290285Sobrien	int		 rx_process_limit;
21352295Sobrien	struct task	 tx_done_task;
21452295Sobrien	struct task	 periodic_task;
21552295Sobrien	struct callout	 periodic_ch;
21652295Sobrien	unsigned long	 periodic_round;
21790285Sobrien	struct taskqueue *taskqueue;
21890285Sobrien
21990285Sobrien	struct rt_softc_rx_ring rx_ring;
22090285Sobrien	struct rt_softc_tx_ring tx_ring[RT_SOFTC_TX_RING_COUNT];
22190285Sobrien	int		 tx_ring_mgtqid;
22290285Sobrien
22390285Sobrien	struct callout	 tx_watchdog_ch;
22490285Sobrien	int		 tx_timer;
22590285Sobrien
22690285Sobrien	/* statistic counters */
22790285Sobrien	unsigned long	 interrupts;
22890285Sobrien	unsigned long	 tx_coherent_interrupts;
22996294Sobrien	unsigned long	 rx_coherent_interrupts;
23090285Sobrien	unsigned long	 rx_interrupts;
23152295Sobrien	unsigned long	 rx_delay_interrupts;
23252295Sobrien	unsigned long	 tx_interrupts[RT_SOFTC_TX_RING_COUNT];
23352295Sobrien	unsigned long	 tx_delay_interrupts;
23452295Sobrien	unsigned long	 tx_data_queue_full[RT_SOFTC_TX_RING_COUNT];
23552295Sobrien	unsigned long	 tx_watchdog_timeouts;
23652295Sobrien	unsigned long	 tx_defrag_packets;
23790285Sobrien	unsigned long	 no_tx_desc_avail;
23890285Sobrien	unsigned long	 rx_mbuf_alloc_errors;
23990285Sobrien	unsigned long	 rx_mbuf_dmamap_errors;
24052295Sobrien	unsigned long	 tx_queue_not_empty[2];
24190285Sobrien
24252295Sobrien	unsigned long	 rx_bytes;
24390285Sobrien	unsigned long	 rx_packets;
24490285Sobrien	unsigned long	 rx_crc_err;
24590285Sobrien	unsigned long	 rx_phy_err;
24690285Sobrien	unsigned long	 rx_dup_packets;
24790285Sobrien	unsigned long	 rx_fifo_overflows;
24890285Sobrien	unsigned long	 rx_short_err;
24990285Sobrien	unsigned long	 rx_long_err;
25090285Sobrien	unsigned long	 tx_bytes;
25190285Sobrien	unsigned long	 tx_packets;
25290285Sobrien	unsigned long	 tx_skip;
25390285Sobrien	unsigned long	 tx_collision;
25490285Sobrien
25590285Sobrien	int		 phy_addr;
25690285Sobrien
25790285Sobrien#ifdef IF_RT_DEBUG
25890285Sobrien	int		 debug;
25990285Sobrien#endif
26090285Sobrien};
26190285Sobrien
26290285Sobrien#ifdef IF_RT_DEBUG
26390285Sobrienenum
26490285Sobrien{
26590285Sobrien	RT_DEBUG_RX = 0x00000001,
26690285Sobrien	RT_DEBUG_TX = 0x00000002,
26790285Sobrien	RT_DEBUG_INTR = 0x00000004,
26890285Sobrien	RT_DEBUG_STATE = 0x00000008,
26990285Sobrien	RT_DEBUG_STATS = 0x00000010,
27052295Sobrien	RT_DEBUG_PERIODIC = 0x00000020,
27150654Sobrien	RT_DEBUG_WATCHDOG = 0x00000040,
27218334Speter	RT_DEBUG_ANY = 0xffffffff
27390285Sobrien};
27490285Sobrien
27518334Speter#define	RT_DPRINTF(sc, m, fmt, ...)		\
27690285Sobrien	do { if ((sc)->debug & (m)) 		\
27790285Sobrien	    device_printf(sc->dev, fmt, __VA_ARGS__); } while (0)
27890285Sobrien#else
27990285Sobrien#define	RT_DPRINTF(sc, m, fmt, ...)
28090285Sobrien#endif /* #ifdef IF_RT_DEBUG */
28190285Sobrien
28290285Sobrien#endif /* #ifndef _IF_RTVAR_H_ */
28390285Sobrien