1201468Srpaulo/*-
2201468Srpaulo * Copyright (c) 2009 Yohanes Nugroho <yohanes@gmail.com>
3201468Srpaulo * All rights reserved.
4201468Srpaulo *
5201468Srpaulo * Redistribution and use in source and binary forms, with or without
6201468Srpaulo * modification, are permitted provided that the following conditions
7201468Srpaulo * are met:
8201468Srpaulo * 1. Redistributions of source code must retain the above copyright
9201468Srpaulo *    notice, this list of conditions and the following disclaimer.
10201468Srpaulo * 2. Redistributions in binary form must reproduce the above copyright
11201468Srpaulo *    notice, this list of conditions and the following disclaimer in the
12201468Srpaulo *    documentation and/or other materials provided with the distribution.
13201468Srpaulo *
14201468Srpaulo * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15201468Srpaulo * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16201468Srpaulo * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17201468Srpaulo * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
18201468Srpaulo * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19201468Srpaulo * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20201468Srpaulo * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21201468Srpaulo * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22201468Srpaulo * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23201468Srpaulo * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24201468Srpaulo * SUCH DAMAGE.
25201468Srpaulo *
26201468Srpaulo * $FreeBSD: releng/10.3/sys/arm/cavium/cns11xx/if_ecevar.h 201468 2010-01-04 03:35:45Z rpaulo $
27201468Srpaulo */
28201468Srpaulo
29201468Srpaulo#ifndef	_IFECEVAR_H
30201468Srpaulo#define	_IFECEVAR_H
31201468Srpaulo
32201468Srpaulo#define	ECE_MAX_TX_BUFFERS	128
33201468Srpaulo#define	ECE_MAX_RX_BUFFERS	128
34201468Srpaulo#define	MAX_FRAGMENT		32
35201468Srpaulo
36201468Srpaulotypedef struct {
37201468Srpaulo	/* 1st 32Bits */
38201468Srpaulo	uint32_t		data_ptr;
39201468Srpaulo	/* 2nd	32Bits*/
40201468Srpaulo	uint32_t		length:16;
41201468Srpaulo
42201468Srpaulo	uint32_t		tco:1; /*tcp checksum offload*/
43201468Srpaulo	uint32_t		uco:1; /*udp checksum offload*/
44201468Srpaulo	uint32_t		ico:1; /*ip checksum offload*/
45201468Srpaulo	/* force_route_port_map*/
46201468Srpaulo	uint32_t		pmap:3;
47201468Srpaulo	/* force_route */
48201468Srpaulo	uint32_t		fr:1;
49201468Srpaulo	/* force_priority_value */
50201468Srpaulo	uint32_t		pri:3;
51201468Srpaulo	/* force_priority */
52201468Srpaulo	uint32_t		fp:1;
53201468Srpaulo	/*interrupt_bit*/
54201468Srpaulo	uint32_t		interrupt:1;
55201468Srpaulo	/*last_seg*/
56201468Srpaulo	uint32_t		ls:1;
57201468Srpaulo	/*first_seg*/
58201468Srpaulo	uint32_t		fs:1;
59201468Srpaulo	/* end_bit */
60201468Srpaulo	uint32_t		eor:1;
61201468Srpaulo	/* c_bit */
62201468Srpaulo	uint32_t		cown:1;
63201468Srpaulo	/* 3rd 32Bits*/
64201468Srpaulo	/*vid_index*/
65201468Srpaulo	uint32_t		vid:3;
66201468Srpaulo	/*insert_vid_tag*/
67201468Srpaulo	uint32_t		insv:1;
68201468Srpaulo	/*pppoe_section_index*/
69201468Srpaulo	uint32_t		sid:3;
70201468Srpaulo	/*insert_pppoe_section*/
71201468Srpaulo	uint32_t		inss:1;
72201468Srpaulo	uint32_t		unused:24;
73201468Srpaulo	/* 4th 32Bits*/
74201468Srpaulo	uint32_t		unused2;
75201468Srpaulo
76201468Srpaulo} eth_tx_desc_t;
77201468Srpaulo
78201468Srpaulotypedef struct{
79201468Srpaulo	uint32_t		data_ptr;
80201468Srpaulo	uint32_t		length:16;
81201468Srpaulo	uint32_t		l4f:1;
82201468Srpaulo	uint32_t		ipf:1;
83201468Srpaulo	uint32_t		prot:2;
84201468Srpaulo	uint32_t		hr:6;
85201468Srpaulo	uint32_t		sp:2;
86201468Srpaulo	uint32_t		ls:1;
87201468Srpaulo	uint32_t		fs:1;
88201468Srpaulo	uint32_t		eor:1;
89201468Srpaulo	uint32_t		cown:1;
90201468Srpaulo	uint32_t		unused;
91201468Srpaulo	uint32_t		unused2;
92201468Srpaulo} eth_rx_desc_t;
93201468Srpaulo
94201468Srpaulo
95201468Srpaulostruct rx_desc_info {
96201468Srpaulo	struct mbuf*buff;
97201468Srpaulo	bus_dmamap_t dmamap;
98201468Srpaulo	eth_rx_desc_t *desc;
99201468Srpaulo};
100201468Srpaulo
101201468Srpaulostruct tx_desc_info {
102201468Srpaulo	struct mbuf*buff;
103201468Srpaulo	bus_dmamap_t dmamap;
104201468Srpaulo	eth_tx_desc_t *desc;
105201468Srpaulo};
106201468Srpaulo
107201468Srpaulo
108201468Srpaulostruct ece_softc
109201468Srpaulo{
110201468Srpaulo	struct ifnet *ifp;		/* ifnet pointer */
111201468Srpaulo	struct mtx sc_mtx;		/* global mutex */
112201468Srpaulo	struct mtx sc_mtx_tx;		/* tx mutex */
113201468Srpaulo	struct mtx sc_mtx_rx;		/* rx mutex */
114201468Srpaulo	struct mtx sc_mtx_cleanup;	/* rx mutex */
115201468Srpaulo
116201468Srpaulo	bus_dma_tag_t	sc_parent_tag;	/* parent bus DMA tag */
117201468Srpaulo
118201468Srpaulo	device_t dev;			/* Myself */
119201468Srpaulo	device_t miibus;		/* My child miibus */
120201468Srpaulo	void *intrhand;			/* Interrupt handle */
121201468Srpaulo	void *intrhand_qf;		/* queue full */
122201468Srpaulo	void *intrhand_tx;		/* tx complete */
123201468Srpaulo	void *intrhand_status;		/* error status */
124201468Srpaulo
125201468Srpaulo	struct resource *irq_res_tx;	/* transmit */
126201468Srpaulo	struct resource *irq_res_rec;	/* receive */
127201468Srpaulo	struct resource *irq_res_qf;	/* queue full */
128201468Srpaulo	struct resource *irq_res_status; /* status */
129201468Srpaulo
130201468Srpaulo	struct resource	*mem_res;	/* Memory resource */
131201468Srpaulo
132201468Srpaulo	struct callout tick_ch;		/* Tick callout */
133201468Srpaulo
134201468Srpaulo	struct taskqueue *sc_tq;
135201468Srpaulo	struct task	sc_intr_task;
136201468Srpaulo	struct task	sc_cleanup_task;
137201468Srpaulo	struct task	sc_tx_task;
138201468Srpaulo
139201468Srpaulo	bus_dmamap_t	dmamap_ring_tx;
140201468Srpaulo	bus_dmamap_t	dmamap_ring_rx;
141201468Srpaulo	bus_dmamap_t	rx_sparemap;
142201468Srpaulo
143201468Srpaulo	/*dma tag for ring*/
144201468Srpaulo	bus_dma_tag_t	dmatag_ring_tx;
145201468Srpaulo	bus_dma_tag_t	dmatag_ring_rx;
146201468Srpaulo
147201468Srpaulo	/*dma tag for data*/
148201468Srpaulo	bus_dma_tag_t	dmatag_data_tx;
149201468Srpaulo	bus_dma_tag_t	dmatag_data_rx;
150201468Srpaulo
151201468Srpaulo	/*the ring*/
152201468Srpaulo	eth_tx_desc_t*	desc_tx;
153201468Srpaulo	eth_rx_desc_t*	desc_rx;
154201468Srpaulo
155201468Srpaulo	/*ring physical address*/
156201468Srpaulo	bus_addr_t	ring_paddr_tx;
157201468Srpaulo	bus_addr_t	ring_paddr_rx;
158201468Srpaulo
159201468Srpaulo	/*index of last received descriptor*/
160201468Srpaulo	uint32_t last_rx;
161201468Srpaulo	struct rx_desc_info rx_desc[ECE_MAX_RX_BUFFERS];
162201468Srpaulo
163201468Srpaulo	/* tx producer index */
164201468Srpaulo	uint32_t tx_prod;
165201468Srpaulo	/* tx consumer index */
166201468Srpaulo	uint32_t tx_cons;
167201468Srpaulo	/* tx ring index*/
168201468Srpaulo	uint32_t desc_curr_tx;
169201468Srpaulo
170201468Srpaulo	struct tx_desc_info tx_desc[ECE_MAX_TX_BUFFERS];
171201468Srpaulo};
172201468Srpaulo
173201468Srpaulo
174201468Srpaulostruct arl_table_entry_t {
175201468Srpaulo	uint32_t cmd_complete: 1;
176201468Srpaulo	uint32_t table_end: 1;
177201468Srpaulo	uint32_t search_match: 1;
178201468Srpaulo	uint32_t filter:1; /*if set, packet will be dropped */
179201468Srpaulo	uint32_t vlan_mac:1; /*indicates that this is the gateway mac address*/
180201468Srpaulo	uint32_t vlan_gid:3; /*vlan id*/
181201468Srpaulo	uint32_t age_field:3;
182201468Srpaulo	uint32_t port_map:3;
183201468Srpaulo	 /*48 bit mac address*/
184201468Srpaulo	uint8_t mac_addr[6];
185201468Srpaulo	uint8_t pad[2];
186201468Srpaulo};
187201468Srpaulo
188201468Srpaulostruct mac_list{
189201468Srpaulo	char mac_addr[6];
190201468Srpaulo	struct mac_list *next;
191201468Srpaulo};
192201468Srpaulo
193201468Srpaulo#endif
194