initial commit
[freebsd-arm:freebsd-arm.git] / arm / econa / 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
105         bus_dma_tag_t   sc_parent_tag;  /* parent bus DMA tag */
106
107         device_t dev;                   /* Myself */
108         device_t miibus;                /* My child miibus */
109         void *intrhand;                 /* Interrupt handle */
110         void *intrhand_qf;              /* queue full */
111         void *intrhand_tx;              /* tx complete */
112         void *intrhand_status;          /* error status */
113
114         struct resource *irq_res_tx;    /* transmit */
115         struct resource *irq_res_rec;   /* receive */
116         struct resource *irq_res_qf;    /* queue full */
117         struct resource *irq_res_status; /* status */
118
119         struct resource *mem_res;       /* Memory resource */
120
121         struct callout tick_ch;         /* Tick callout */
122
123         struct taskqueue *sc_tq;
124         struct task     sc_intr_task;
125         struct task     sc_tx_task;
126         struct task     sc_link_task;
127
128         bus_dmamap_t    dmamap_ring_tx;
129         bus_dmamap_t    dmamap_ring_rx;
130         bus_dmamap_t    rx_sparemap;
131
132         /*dma tag for ring*/
133         bus_dma_tag_t   dmatag_ring_tx;
134         bus_dma_tag_t   dmatag_ring_rx;
135
136         /*dma tag for data*/
137         bus_dma_tag_t   dmatag_data_tx;
138         bus_dma_tag_t   dmatag_data_rx;
139
140         /*the ring*/
141         struct eth_tx_desc      *desc_tx;
142         struct eth_rx_desc      *desc_rx;
143
144         /*ring physical address*/
145         bus_addr_t      ring_paddr_tx;
146         bus_addr_t      ring_paddr_rx;
147
148         /*index of last received descriptor*/
149         int             rx_cons;
150         struct rx_desc_info rx_desc[ECE_MAX_RX_BUFFERS];
151
152         /* tx producer index */
153         uint32_t tx_prod;
154         /* tx consumer index */
155         uint32_t tx_cons;
156         int     tx_cnt;
157
158         struct tx_desc_info tx_desc[ECE_MAX_TX_BUFFERS];
159
160         int ece_watchdog_timer;
161
162 #define ECE_FLAG_LINK           0x0001
163
164         int flags;
165         int if_flags;
166         int arl_count;
167 };
168
169
170 struct arl_table_entry_t {
171         uint32_t cmd_complete: 1;
172         uint32_t table_end: 1;
173         uint32_t search_match: 1;
174         uint32_t filter:1; /*if set, packet will be dropped */
175         uint32_t vlan_mac:1; /*indicates that this is the gateway mac address*/
176         uint32_t vlan_gid:3; /*vlan id*/
177         uint32_t age_field:3;
178         uint32_t port_map:3;
179          /*48 bit mac address*/
180         uint8_t mac_addr[6];
181         uint8_t pad[2];
182 };
183
184 struct mac_list{
185         char mac_addr[6];
186         struct mac_list *next;
187 };
188
189 #define ECE_TIMEOUT             1000
190 #define ARL_MAX_ENTRIES 1024
191
192 #endif