1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#ifndef _EMAC_HW_H_
24#define _EMAC_HW_H_
25
26
27#define EMAC_EMAC_WRAPPER_CSR1 0x000000
28#define EMAC_EMAC_WRAPPER_CSR2 0x000004
29#define EMAC_EMAC_WRAPPER_TX_TS_LO 0x000104
30#define EMAC_EMAC_WRAPPER_TX_TS_HI 0x000108
31#define EMAC_EMAC_WRAPPER_TX_TS_INX 0x00010c
32
33
34enum emac_dma_order {
35 emac_dma_ord_in = 1,
36 emac_dma_ord_enh = 2,
37 emac_dma_ord_out = 4
38};
39
40enum emac_dma_req_block {
41 emac_dma_req_128 = 0,
42 emac_dma_req_256 = 1,
43 emac_dma_req_512 = 2,
44 emac_dma_req_1024 = 3,
45 emac_dma_req_2048 = 4,
46 emac_dma_req_4096 = 5
47};
48
49
50#define BITS_GET(val, lo, hi) ((le32_to_cpu(val) & GENMASK((hi), (lo))) >> lo)
51#define BITS_SET(val, lo, hi, new_val) \
52 val = cpu_to_le32((le32_to_cpu(val) & (~GENMASK((hi), (lo)))) | \
53 (((new_val) << (lo)) & GENMASK((hi), (lo))))
54
55
56struct emac_rrd {
57 u32 word[6];
58
59
60#define RRD_NOR(rrd) BITS_GET((rrd)->word[0], 16, 19)
61
62#define RRD_SI(rrd) BITS_GET((rrd)->word[0], 20, 31)
63
64#define RRD_CVALN_TAG(rrd) BITS_GET((rrd)->word[2], 0, 15)
65
66#define RRD_PKT_SIZE(rrd) BITS_GET((rrd)->word[3], 0, 13)
67
68#define RRD_L4F(rrd) BITS_GET((rrd)->word[3], 14, 14)
69
70#define RRD_CVTAG(rrd) BITS_GET((rrd)->word[3], 16, 16)
71
72
73
74#define RRD_UPDT(rrd) BITS_GET((rrd)->word[3], 31, 31)
75#define RRD_UPDT_SET(rrd, val) BITS_SET((rrd)->word[3], 31, 31, val)
76
77#define RRD_TS_LOW(rrd) BITS_GET((rrd)->word[4], 0, 29)
78
79#define RRD_TS_HI(rrd) le32_to_cpu((rrd)->word[5])
80};
81
82
83struct emac_tpd {
84 u32 word[4];
85
86
87#define TPD_BUF_LEN_SET(tpd, val) BITS_SET((tpd)->word[0], 0, 15, val)
88
89#define TPD_CSX_SET(tpd, val) BITS_SET((tpd)->word[1], 8, 8, val)
90
91#define TPD_LSO(tpd) BITS_GET((tpd)->word[1], 12, 12)
92#define TPD_LSO_SET(tpd, val) BITS_SET((tpd)->word[1], 12, 12, val)
93
94
95
96
97#define TPD_LSOV_SET(tpd, val) BITS_SET((tpd)->word[1], 13, 13, val)
98
99
100
101#define TPD_IPV4_SET(tpd, val) BITS_SET((tpd)->word[1], 16, 16, val)
102
103
104
105#define TPD_TYP_SET(tpd, val) BITS_SET((tpd)->word[1], 17, 17, val)
106
107#define TPD_BUFFER_ADDR_L_SET(tpd, val) ((tpd)->word[2] = cpu_to_le32(val))
108
109
110
111#define TPD_CVLAN_TAG_SET(tpd, val) BITS_SET((tpd)->word[3], 0, 15, val)
112
113
114#define TPD_INSTC_SET(tpd, val) BITS_SET((tpd)->word[3], 17, 17, val)
115
116
117
118
119#define TPD_BUFFER_ADDR_H_SET(tpd, val) BITS_SET((tpd)->word[3], 18, 31, val)
120
121
122
123#define TPD_PAYLOAD_OFFSET_SET(tpd, val) BITS_SET((tpd)->word[1], 0, 7, val)
124
125
126
127#define TPD_CXSUM_OFFSET_SET(tpd, val) BITS_SET((tpd)->word[1], 18, 25, val)
128
129
130#define TPD_TCPHDR_OFFSET_SET(tpd, val) BITS_SET((tpd)->word[1], 0, 7, val)
131
132
133#define TPD_MSS_SET(tpd, val) BITS_SET((tpd)->word[1], 18, 30, val)
134
135#define TPD_PKT_LEN_SET(tpd, val) ((tpd)->word[2] = cpu_to_le32(val))
136};
137
138
139
140
141struct emac_ring_header {
142 void *v_addr;
143 dma_addr_t dma_addr;
144 size_t size;
145 size_t used;
146};
147
148
149
150
151struct emac_buffer {
152 struct sk_buff *skb;
153 u16 length;
154 dma_addr_t dma_addr;
155};
156
157
158struct emac_rfd_ring {
159 struct emac_buffer *rfbuff;
160 u32 *v_addr;
161 dma_addr_t dma_addr;
162 size_t size;
163 unsigned int count;
164 unsigned int produce_idx;
165 unsigned int process_idx;
166 unsigned int consume_idx;
167};
168
169
170struct emac_rrd_ring {
171 u32 *v_addr;
172 dma_addr_t dma_addr;
173 size_t size;
174 unsigned int count;
175 unsigned int produce_idx;
176 unsigned int consume_idx;
177};
178
179
180struct emac_rx_queue {
181 struct net_device *netdev;
182 struct emac_rrd_ring rrd;
183 struct emac_rfd_ring rfd;
184 struct napi_struct napi;
185 struct emac_irq *irq;
186
187 u32 intr;
188 u32 produce_mask;
189 u32 process_mask;
190 u32 consume_mask;
191
192 u16 produce_reg;
193 u16 process_reg;
194 u16 consume_reg;
195
196 u8 produce_shift;
197 u8 process_shft;
198 u8 consume_shift;
199};
200
201
202struct emac_tpd_ring {
203 struct emac_buffer *tpbuff;
204 u32 *v_addr;
205 dma_addr_t dma_addr;
206
207 size_t size;
208 unsigned int count;
209 unsigned int produce_idx;
210 unsigned int consume_idx;
211 unsigned int last_produce_idx;
212};
213
214
215struct emac_tx_queue {
216 struct emac_tpd_ring tpd;
217
218 u32 produce_mask;
219 u32 consume_mask;
220
221 u16 max_packets;
222 u16 produce_reg;
223 u16 consume_reg;
224
225 u8 produce_shift;
226 u8 consume_shift;
227};
228
229struct emac_adapter;
230
231int emac_mac_up(struct emac_adapter *adpt);
232void emac_mac_down(struct emac_adapter *adpt);
233void emac_mac_reset(struct emac_adapter *adpt);
234void emac_mac_stop(struct emac_adapter *adpt);
235void emac_mac_mode_config(struct emac_adapter *adpt);
236void emac_mac_rx_process(struct emac_adapter *adpt, struct emac_rx_queue *rx_q,
237 int *num_pkts, int max_pkts);
238int emac_mac_tx_buf_send(struct emac_adapter *adpt, struct emac_tx_queue *tx_q,
239 struct sk_buff *skb);
240void emac_mac_tx_process(struct emac_adapter *adpt, struct emac_tx_queue *tx_q);
241void emac_mac_rx_tx_ring_init_all(struct platform_device *pdev,
242 struct emac_adapter *adpt);
243int emac_mac_rx_tx_rings_alloc_all(struct emac_adapter *adpt);
244void emac_mac_rx_tx_rings_free_all(struct emac_adapter *adpt);
245void emac_mac_multicast_addr_clear(struct emac_adapter *adpt);
246void emac_mac_multicast_addr_set(struct emac_adapter *adpt, u8 *addr);
247
248#endif
249