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