initial commit
[freebsd-arm:freebsd-arm.git] / arm / econa / ece / if_ecevar.h
1 /*-
2  * Copyright (c) 2009 Yohanes Nugroho <yohanes@gmail.com>
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  */
26
27 #ifndef _IFECEVAR_H
28 #define _IFECEVAR_H
29
30 #define ECE_MAX_TX_BUFFERS      64
31 #define ECE_MAX_RX_BUFFERS      64
32 /*
33  * XXX
34  * This number of fragment looks more than enough. Just use 8 to save
35  * number of descriptors. If more than 8 is required you can collapse
36  * the mbuf chain. Your ecnap routine should be rewritten.
37  */
38 #define MAX_FRAGMENT            8
39
40 #define ECE_DESC_INC(x, y)      ((x) = ((x) + 1) % (y))
41
42 struct eth_tx_desc {
43         uint32_t                addr;
44         uint32_t                length;
45 #define TD_LEN_MASK             0x0000FFFF
46 #define TD_TCPCSUM              0x00010000
47 #define TD_UDPCSUM              0x00020000
48 #define TD_IPCSUM               0x00040000
49 #define TD_FORCE_PORTMAP_MASK   0x00380000
50 #define TD_FORCE_PORTMAP_DEFAULT        0x00080000
51 #define TD_FORCE_ROUTE          0x00400000
52 #define TD_FORCE_PRIORITY_MASK  0x03800000
53 #define TD_FORCE_PRIORITY       0x04000000
54 #define TD_INTR_ME              0x08000000
55 #define TD_EOP                  0x10000000
56 #define TD_SOP                  0x20000000
57 #define TD_EOR                  0x40000000
58 #define TD_OWN                  0x80000000
59         uint32_t                vid;
60 #define TD_VID_INDEX_MASK       0x00000007
61 #define TD_VID_TAG_INS          0x00000008
62 #define TD_SECTION_INDEX_MASK   0x00000070
63 #define TD_SECTION_INS          0x00000080
64         uint32_t                reserved;
65 };
66
67 struct eth_rx_desc {
68         uint32_t                addr;
69         uint32_t                length;
70 #define RD_TCPUDP_CSUM_NOK      0x00010000
71 #define RD_IP_CSUM_NOK          0x00020000
72 #define RD_PROTO_MASK           0x000C0000
73 #define RD_PROTO_IP             0x00000000
74 #define RD_PROTO_UDP            0x00040000
75 #define RD_PROTO_TCP            0x00080000
76 #define RD_PROTO_UNKNOWN        0x000C0000
77 #define RD_HNAT_MASK            0x03F00000
78 #define RD_SOURCE_PORT_MASK     0x0C000000
79 #define RD_EOP                  0x10000000
80 #define RD_SOP                  0x20000000
81 #define RD_EOR                  0x40000000
82 #define RD_OWN                  0x80000000
83         uint32_t                reserved1;
84         uint32_t                reserved2;
85 };
86
87 #define ECE_RX_BYTES(x)         ((x) & 0xFFFF)
88
89 struct rx_desc_info {
90         struct mbuf *buff;
91         bus_dmamap_t dmamap;
92 };
93
94 struct tx_desc_info {
95         struct mbuf *buff;
96         bus_dmamap_t dmamap;
97 };
98
99
100 struct ece_softc
101 {
102         struct ifnet *ifp;              /* ifnet pointer */
103         struct mtx sc_mtx;              /* global mutex */
104         struct mtx sc_mtx_tx;           /* tx mutex */
105         struct mtx sc_mtx_rx;           /* rx mutex */
106         struct mtx sc_mtx_cleanup;      /* rx mutex */
107
108         bus_dma_tag_t   sc_parent_tag;  /* parent bus DMA tag */
109
110         device_t dev;                   /* Myself */
111         device_t miibus;                /* My child miibus */
112         void *intrhand;                 /* Interrupt handle */
113         void *intrhand_qf;              /* queue full */
114         void *intrhand_tx;              /* tx complete */
115         void *intrhand_status;          /* error status */
116
117         struct resource *irq_res_tx;    /* transmit */
118         struct resource *irq_res_rec;   /* receive */
119         struct resource *irq_res_qf;    /* queue full */
120         struct resource *irq_res_status; /* status */
121
122         struct resource *mem_res;       /* Memory resource */
123
124         struct callout tick_ch;         /* Tick callout */
125
126         struct taskqueue *sc_tq;
127         struct task     sc_intr_task;
128         struct task     sc_tx_task;
129
130         bus_dmamap_t    dmamap_ring_tx;
131         bus_dmamap_t    dmamap_ring_rx;
132         bus_dmamap_t    rx_sparemap;
133
134         /*dma tag for ring*/
135         bus_dma_tag_t   dmatag_ring_tx;
136         bus_dma_tag_t   dmatag_ring_rx;
137
138         /*dma tag for data*/
139         bus_dma_tag_t   dmatag_data_tx;
140         bus_dma_tag_t   dmatag_data_rx;
141
142         /*the ring*/
143         struct eth_tx_desc      *desc_tx;
144         struct eth_rx_desc      *desc_rx;
145
146         /*ring physical address*/
147         bus_addr_t      ring_paddr_tx;
148         bus_addr_t      ring_paddr_rx;
149
150         /*index of last received descriptor*/
151         int             rx_cons;
152         struct rx_desc_info rx_desc[ECE_MAX_RX_BUFFERS];
153
154         /* tx producer index */
155         uint32_t tx_prod;
156         /* tx consumer index */
157         uint32_t tx_cons;
158         int     tx_cnt;
159
160         struct tx_desc_info tx_desc[ECE_MAX_TX_BUFFERS];
161
162         int ece_watchdog_timer;
163
164 #define ECE_FLAG_LINK           0x0001
165
166         int flags;
167         int if_flags;
168 };
169
170
171 struct arl_table_entry_t {
172         uint32_t cmd_complete: 1;
173         uint32_t table_end: 1;
174         uint32_t search_match: 1;
175         uint32_t filter:1; /*if set, packet will be dropped */
176         uint32_t vlan_mac:1; /*indicates that this is the gateway mac address*/
177         uint32_t vlan_gid:3; /*vlan id*/
178         uint32_t age_field:3;
179         uint32_t port_map:3;
180          /*48 bit mac address*/
181         uint8_t mac_addr[6];
182         uint8_t pad[2];
183 };
184
185 struct mac_list{
186         char mac_addr[6];
187         struct mac_list *next;
188 };
189
190 #define ECE_TIMEOUT             1000
191
192 #endif