1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | /* Renesas Ethernet AVB device driver |
3 | * |
4 | * Copyright (C) 2014-2015 Renesas Electronics Corporation |
5 | * Copyright (C) 2015 Renesas Solutions Corp. |
6 | * Copyright (C) 2015-2016 Cogent Embedded, Inc. <source@cogentembedded.com> |
7 | * |
8 | * Based on the SuperH Ethernet driver |
9 | */ |
10 | |
11 | #ifndef __RAVB_H__ |
12 | #define __RAVB_H__ |
13 | |
14 | #include <linux/interrupt.h> |
15 | #include <linux/io.h> |
16 | #include <linux/kernel.h> |
17 | #include <linux/mdio-bitbang.h> |
18 | #include <linux/netdevice.h> |
19 | #include <linux/phy.h> |
20 | #include <linux/platform_device.h> |
21 | #include <linux/ptp_clock_kernel.h> |
22 | |
23 | #define BE_TX_RING_SIZE 64 /* TX ring size for Best Effort */ |
24 | #define BE_RX_RING_SIZE 1024 /* RX ring size for Best Effort */ |
25 | #define NC_TX_RING_SIZE 64 /* TX ring size for Network Control */ |
26 | #define NC_RX_RING_SIZE 64 /* RX ring size for Network Control */ |
27 | #define BE_TX_RING_MIN 64 |
28 | #define BE_RX_RING_MIN 64 |
29 | #define BE_TX_RING_MAX 1024 |
30 | #define BE_RX_RING_MAX 2048 |
31 | |
32 | #define PKT_BUF_SZ 1538 |
33 | |
34 | /* Driver's parameters */ |
35 | #define RAVB_ALIGN 128 |
36 | |
37 | /* Hardware time stamp */ |
38 | #define RAVB_TXTSTAMP_VALID 0x00000001 /* TX timestamp valid */ |
39 | #define RAVB_TXTSTAMP_ENABLED 0x00000010 /* Enable TX timestamping */ |
40 | |
41 | #define RAVB_RXTSTAMP_VALID 0x00000001 /* RX timestamp valid */ |
42 | #define RAVB_RXTSTAMP_TYPE 0x00000006 /* RX type mask */ |
43 | #define RAVB_RXTSTAMP_TYPE_V2_L2_EVENT 0x00000002 |
44 | #define RAVB_RXTSTAMP_TYPE_ALL 0x00000006 |
45 | #define RAVB_RXTSTAMP_ENABLED 0x00000010 /* Enable RX timestamping */ |
46 | |
47 | enum ravb_reg { |
48 | /* AVB-DMAC registers */ |
49 | CCC = 0x0000, |
50 | DBAT = 0x0004, |
51 | DLR = 0x0008, |
52 | CSR = 0x000C, |
53 | CDAR0 = 0x0010, |
54 | CDAR1 = 0x0014, |
55 | CDAR2 = 0x0018, |
56 | CDAR3 = 0x001C, |
57 | CDAR4 = 0x0020, |
58 | CDAR5 = 0x0024, |
59 | CDAR6 = 0x0028, |
60 | CDAR7 = 0x002C, |
61 | CDAR8 = 0x0030, |
62 | CDAR9 = 0x0034, |
63 | CDAR10 = 0x0038, |
64 | CDAR11 = 0x003C, |
65 | CDAR12 = 0x0040, |
66 | CDAR13 = 0x0044, |
67 | CDAR14 = 0x0048, |
68 | CDAR15 = 0x004C, |
69 | CDAR16 = 0x0050, |
70 | CDAR17 = 0x0054, |
71 | CDAR18 = 0x0058, |
72 | CDAR19 = 0x005C, |
73 | CDAR20 = 0x0060, |
74 | CDAR21 = 0x0064, |
75 | ESR = 0x0088, |
76 | APSR = 0x008C, /* R-Car Gen3 only */ |
77 | RCR = 0x0090, |
78 | RQC0 = 0x0094, |
79 | RQC1 = 0x0098, |
80 | RQC2 = 0x009C, |
81 | RQC3 = 0x00A0, |
82 | RQC4 = 0x00A4, |
83 | RPC = 0x00B0, |
84 | RTC = 0x00B4, /* R-Car Gen3 and RZ/G2L only */ |
85 | UFCW = 0x00BC, |
86 | UFCS = 0x00C0, |
87 | UFCV0 = 0x00C4, |
88 | UFCV1 = 0x00C8, |
89 | UFCV2 = 0x00CC, |
90 | UFCV3 = 0x00D0, |
91 | UFCV4 = 0x00D4, |
92 | UFCD0 = 0x00E0, |
93 | UFCD1 = 0x00E4, |
94 | UFCD2 = 0x00E8, |
95 | UFCD3 = 0x00EC, |
96 | UFCD4 = 0x00F0, |
97 | SFO = 0x00FC, |
98 | SFP0 = 0x0100, |
99 | SFP1 = 0x0104, |
100 | SFP2 = 0x0108, |
101 | SFP3 = 0x010C, |
102 | SFP4 = 0x0110, |
103 | SFP5 = 0x0114, |
104 | SFP6 = 0x0118, |
105 | SFP7 = 0x011C, |
106 | SFP8 = 0x0120, |
107 | SFP9 = 0x0124, |
108 | SFP10 = 0x0128, |
109 | SFP11 = 0x012C, |
110 | SFP12 = 0x0130, |
111 | SFP13 = 0x0134, |
112 | SFP14 = 0x0138, |
113 | SFP15 = 0x013C, |
114 | SFP16 = 0x0140, |
115 | SFP17 = 0x0144, |
116 | SFP18 = 0x0148, |
117 | SFP19 = 0x014C, |
118 | SFP20 = 0x0150, |
119 | SFP21 = 0x0154, |
120 | SFP22 = 0x0158, |
121 | SFP23 = 0x015C, |
122 | SFP24 = 0x0160, |
123 | SFP25 = 0x0164, |
124 | SFP26 = 0x0168, |
125 | SFP27 = 0x016C, |
126 | SFP28 = 0x0170, |
127 | SFP29 = 0x0174, |
128 | SFP30 = 0x0178, |
129 | SFP31 = 0x017C, |
130 | SFM0 = 0x01C0, |
131 | SFM1 = 0x01C4, |
132 | TGC = 0x0300, |
133 | TCCR = 0x0304, |
134 | TSR = 0x0308, |
135 | TFA0 = 0x0310, |
136 | TFA1 = 0x0314, |
137 | TFA2 = 0x0318, |
138 | CIVR0 = 0x0320, |
139 | CIVR1 = 0x0324, |
140 | CDVR0 = 0x0328, |
141 | CDVR1 = 0x032C, |
142 | CUL0 = 0x0330, |
143 | CUL1 = 0x0334, |
144 | CLL0 = 0x0338, |
145 | CLL1 = 0x033C, |
146 | DIC = 0x0350, |
147 | DIS = 0x0354, |
148 | EIC = 0x0358, |
149 | EIS = 0x035C, |
150 | RIC0 = 0x0360, |
151 | RIS0 = 0x0364, |
152 | RIC1 = 0x0368, |
153 | RIS1 = 0x036C, |
154 | RIC2 = 0x0370, |
155 | RIS2 = 0x0374, |
156 | TIC = 0x0378, |
157 | TIS = 0x037C, |
158 | ISS = 0x0380, |
159 | CIE = 0x0384, /* R-Car Gen3 only */ |
160 | GCCR = 0x0390, |
161 | GMTT = 0x0394, |
162 | GPTC = 0x0398, |
163 | GTI = 0x039C, |
164 | GTO0 = 0x03A0, |
165 | GTO1 = 0x03A4, |
166 | GTO2 = 0x03A8, |
167 | GIC = 0x03AC, |
168 | GIS = 0x03B0, |
169 | GCPT = 0x03B4, /* Documented for R-Car Gen3 only */ |
170 | GCT0 = 0x03B8, |
171 | GCT1 = 0x03BC, |
172 | GCT2 = 0x03C0, |
173 | GIE = 0x03CC, /* R-Car Gen3 only */ |
174 | GID = 0x03D0, /* R-Car Gen3 only */ |
175 | DIL = 0x0440, /* R-Car Gen3 only */ |
176 | RIE0 = 0x0460, /* R-Car Gen3 only */ |
177 | RID0 = 0x0464, /* R-Car Gen3 only */ |
178 | RIE2 = 0x0470, /* R-Car Gen3 only */ |
179 | RID2 = 0x0474, /* R-Car Gen3 only */ |
180 | TIE = 0x0478, /* R-Car Gen3 only */ |
181 | TID = 0x047c, /* R-Car Gen3 only */ |
182 | |
183 | /* E-MAC registers */ |
184 | ECMR = 0x0500, |
185 | RFLR = 0x0508, |
186 | ECSR = 0x0510, |
187 | ECSIPR = 0x0518, |
188 | PIR = 0x0520, |
189 | PSR = 0x0528, |
190 | PIPR = 0x052c, |
191 | CXR31 = 0x0530, /* RZ/G2L only */ |
192 | CXR35 = 0x0540, /* RZ/G2L only */ |
193 | MPR = 0x0558, |
194 | PFTCR = 0x055c, |
195 | PFRCR = 0x0560, |
196 | GECMR = 0x05b0, |
197 | MAHR = 0x05c0, |
198 | MALR = 0x05c8, |
199 | TROCR = 0x0700, /* R-Car Gen3 and RZ/G2L only */ |
200 | CXR41 = 0x0708, /* RZ/G2L only */ |
201 | CXR42 = 0x0710, /* RZ/G2L only */ |
202 | CEFCR = 0x0740, |
203 | FRECR = 0x0748, |
204 | TSFRCR = 0x0750, |
205 | TLFRCR = 0x0758, |
206 | RFCR = 0x0760, |
207 | MAFCR = 0x0778, |
208 | CSR0 = 0x0800, /* RZ/G2L only */ |
209 | }; |
210 | |
211 | |
212 | /* Register bits of the Ethernet AVB */ |
213 | /* CCC */ |
214 | enum CCC_BIT { |
215 | CCC_OPC = 0x00000003, |
216 | CCC_OPC_RESET = 0x00000000, |
217 | CCC_OPC_CONFIG = 0x00000001, |
218 | CCC_OPC_OPERATION = 0x00000002, |
219 | CCC_GAC = 0x00000080, |
220 | CCC_DTSR = 0x00000100, |
221 | CCC_CSEL = 0x00030000, |
222 | CCC_CSEL_HPB = 0x00010000, |
223 | CCC_CSEL_ETH_TX = 0x00020000, |
224 | CCC_CSEL_GMII_REF = 0x00030000, |
225 | CCC_LBME = 0x01000000, |
226 | }; |
227 | |
228 | /* CSR */ |
229 | enum CSR_BIT { |
230 | CSR_OPS = 0x0000000F, |
231 | CSR_OPS_RESET = 0x00000001, |
232 | CSR_OPS_CONFIG = 0x00000002, |
233 | CSR_OPS_OPERATION = 0x00000004, |
234 | CSR_OPS_STANDBY = 0x00000008, /* Documented for R-Car Gen3 only */ |
235 | CSR_DTS = 0x00000100, |
236 | CSR_TPO0 = 0x00010000, |
237 | CSR_TPO1 = 0x00020000, |
238 | CSR_TPO2 = 0x00040000, |
239 | CSR_TPO3 = 0x00080000, |
240 | CSR_RPO = 0x00100000, |
241 | }; |
242 | |
243 | /* ESR */ |
244 | enum ESR_BIT { |
245 | ESR_EQN = 0x0000001F, |
246 | ESR_ET = 0x00000F00, |
247 | ESR_EIL = 0x00001000, |
248 | }; |
249 | |
250 | /* APSR (R-Car Gen3 only) */ |
251 | enum APSR_BIT { |
252 | APSR_MEMS = 0x00000002, /* Undocumented */ |
253 | APSR_CMSW = 0x00000010, |
254 | APSR_RDM = 0x00002000, |
255 | APSR_TDM = 0x00004000, |
256 | }; |
257 | |
258 | /* RCR */ |
259 | enum RCR_BIT { |
260 | RCR_EFFS = 0x00000001, |
261 | RCR_ENCF = 0x00000002, |
262 | RCR_ESF = 0x0000000C, |
263 | RCR_ETS0 = 0x00000010, |
264 | RCR_ETS2 = 0x00000020, |
265 | RCR_RFCL = 0x1FFF0000, |
266 | }; |
267 | |
268 | /* RQC0/1/2/3/4 */ |
269 | enum RQC_BIT { |
270 | RQC_RSM0 = 0x00000003, |
271 | RQC_UFCC0 = 0x00000030, |
272 | RQC_RSM1 = 0x00000300, |
273 | RQC_UFCC1 = 0x00003000, |
274 | RQC_RSM2 = 0x00030000, |
275 | RQC_UFCC2 = 0x00300000, |
276 | RQC_RSM3 = 0x03000000, |
277 | RQC_UFCC3 = 0x30000000, |
278 | }; |
279 | |
280 | /* RPC */ |
281 | enum RPC_BIT { |
282 | RPC_PCNT = 0x00000700, |
283 | RPC_DCNT = 0x00FF0000, |
284 | }; |
285 | |
286 | /* UFCW */ |
287 | enum UFCW_BIT { |
288 | UFCW_WL0 = 0x0000003F, |
289 | UFCW_WL1 = 0x00003F00, |
290 | UFCW_WL2 = 0x003F0000, |
291 | UFCW_WL3 = 0x3F000000, |
292 | }; |
293 | |
294 | /* UFCS */ |
295 | enum UFCS_BIT { |
296 | UFCS_SL0 = 0x0000003F, |
297 | UFCS_SL1 = 0x00003F00, |
298 | UFCS_SL2 = 0x003F0000, |
299 | UFCS_SL3 = 0x3F000000, |
300 | }; |
301 | |
302 | /* UFCV0/1/2/3/4 */ |
303 | enum UFCV_BIT { |
304 | UFCV_CV0 = 0x0000003F, |
305 | UFCV_CV1 = 0x00003F00, |
306 | UFCV_CV2 = 0x003F0000, |
307 | UFCV_CV3 = 0x3F000000, |
308 | }; |
309 | |
310 | /* UFCD0/1/2/3/4 */ |
311 | enum UFCD_BIT { |
312 | UFCD_DV0 = 0x0000003F, |
313 | UFCD_DV1 = 0x00003F00, |
314 | UFCD_DV2 = 0x003F0000, |
315 | UFCD_DV3 = 0x3F000000, |
316 | }; |
317 | |
318 | /* SFO */ |
319 | enum SFO_BIT { |
320 | SFO_FBP = 0x0000003F, |
321 | }; |
322 | |
323 | /* RTC */ |
324 | enum RTC_BIT { |
325 | RTC_MFL0 = 0x00000FFF, |
326 | RTC_MFL1 = 0x0FFF0000, |
327 | }; |
328 | |
329 | /* TGC */ |
330 | enum TGC_BIT { |
331 | TGC_TSM0 = 0x00000001, |
332 | TGC_TSM1 = 0x00000002, |
333 | TGC_TSM2 = 0x00000004, |
334 | TGC_TSM3 = 0x00000008, |
335 | TGC_TQP = 0x00000030, |
336 | TGC_TQP_NONAVB = 0x00000000, |
337 | TGC_TQP_AVBMODE1 = 0x00000010, |
338 | TGC_TQP_AVBMODE2 = 0x00000030, |
339 | TGC_TBD0 = 0x00000300, |
340 | TGC_TBD1 = 0x00003000, |
341 | TGC_TBD2 = 0x00030000, |
342 | TGC_TBD3 = 0x00300000, |
343 | }; |
344 | |
345 | /* TCCR */ |
346 | enum TCCR_BIT { |
347 | TCCR_TSRQ0 = 0x00000001, |
348 | TCCR_TSRQ1 = 0x00000002, |
349 | TCCR_TSRQ2 = 0x00000004, |
350 | TCCR_TSRQ3 = 0x00000008, |
351 | TCCR_TFEN = 0x00000100, |
352 | TCCR_TFR = 0x00000200, |
353 | }; |
354 | |
355 | /* TSR */ |
356 | enum TSR_BIT { |
357 | TSR_CCS0 = 0x00000003, |
358 | TSR_CCS1 = 0x0000000C, |
359 | TSR_TFFL = 0x00000700, |
360 | }; |
361 | |
362 | /* TFA2 */ |
363 | enum TFA2_BIT { |
364 | TFA2_TSV = 0x0000FFFF, |
365 | TFA2_TST = 0x03FF0000, |
366 | }; |
367 | |
368 | /* DIC */ |
369 | enum DIC_BIT { |
370 | DIC_DPE1 = 0x00000002, |
371 | DIC_DPE2 = 0x00000004, |
372 | DIC_DPE3 = 0x00000008, |
373 | DIC_DPE4 = 0x00000010, |
374 | DIC_DPE5 = 0x00000020, |
375 | DIC_DPE6 = 0x00000040, |
376 | DIC_DPE7 = 0x00000080, |
377 | DIC_DPE8 = 0x00000100, |
378 | DIC_DPE9 = 0x00000200, |
379 | DIC_DPE10 = 0x00000400, |
380 | DIC_DPE11 = 0x00000800, |
381 | DIC_DPE12 = 0x00001000, |
382 | DIC_DPE13 = 0x00002000, |
383 | DIC_DPE14 = 0x00004000, |
384 | DIC_DPE15 = 0x00008000, |
385 | }; |
386 | |
387 | /* DIS */ |
388 | enum DIS_BIT { |
389 | DIS_DPF1 = 0x00000002, |
390 | DIS_DPF2 = 0x00000004, |
391 | DIS_DPF3 = 0x00000008, |
392 | DIS_DPF4 = 0x00000010, |
393 | DIS_DPF5 = 0x00000020, |
394 | DIS_DPF6 = 0x00000040, |
395 | DIS_DPF7 = 0x00000080, |
396 | DIS_DPF8 = 0x00000100, |
397 | DIS_DPF9 = 0x00000200, |
398 | DIS_DPF10 = 0x00000400, |
399 | DIS_DPF11 = 0x00000800, |
400 | DIS_DPF12 = 0x00001000, |
401 | DIS_DPF13 = 0x00002000, |
402 | DIS_DPF14 = 0x00004000, |
403 | DIS_DPF15 = 0x00008000, |
404 | }; |
405 | |
406 | /* EIC */ |
407 | enum EIC_BIT { |
408 | EIC_MREE = 0x00000001, |
409 | EIC_MTEE = 0x00000002, |
410 | EIC_QEE = 0x00000004, |
411 | EIC_SEE = 0x00000008, |
412 | EIC_CLLE0 = 0x00000010, |
413 | EIC_CLLE1 = 0x00000020, |
414 | EIC_CULE0 = 0x00000040, |
415 | EIC_CULE1 = 0x00000080, |
416 | EIC_TFFE = 0x00000100, |
417 | }; |
418 | |
419 | /* EIS */ |
420 | enum EIS_BIT { |
421 | EIS_MREF = 0x00000001, |
422 | EIS_MTEF = 0x00000002, |
423 | EIS_QEF = 0x00000004, |
424 | EIS_SEF = 0x00000008, |
425 | EIS_CLLF0 = 0x00000010, |
426 | EIS_CLLF1 = 0x00000020, |
427 | EIS_CULF0 = 0x00000040, |
428 | EIS_CULF1 = 0x00000080, |
429 | EIS_TFFF = 0x00000100, |
430 | EIS_QFS = 0x00010000, |
431 | EIS_RESERVED = (GENMASK(31, 17) | GENMASK(15, 11)), |
432 | }; |
433 | |
434 | /* RIC0 */ |
435 | enum RIC0_BIT { |
436 | RIC0_FRE0 = 0x00000001, |
437 | RIC0_FRE1 = 0x00000002, |
438 | RIC0_FRE2 = 0x00000004, |
439 | RIC0_FRE3 = 0x00000008, |
440 | RIC0_FRE4 = 0x00000010, |
441 | RIC0_FRE5 = 0x00000020, |
442 | RIC0_FRE6 = 0x00000040, |
443 | RIC0_FRE7 = 0x00000080, |
444 | RIC0_FRE8 = 0x00000100, |
445 | RIC0_FRE9 = 0x00000200, |
446 | RIC0_FRE10 = 0x00000400, |
447 | RIC0_FRE11 = 0x00000800, |
448 | RIC0_FRE12 = 0x00001000, |
449 | RIC0_FRE13 = 0x00002000, |
450 | RIC0_FRE14 = 0x00004000, |
451 | RIC0_FRE15 = 0x00008000, |
452 | RIC0_FRE16 = 0x00010000, |
453 | RIC0_FRE17 = 0x00020000, |
454 | }; |
455 | |
456 | /* RIC0 */ |
457 | enum RIS0_BIT { |
458 | RIS0_FRF0 = 0x00000001, |
459 | RIS0_FRF1 = 0x00000002, |
460 | RIS0_FRF2 = 0x00000004, |
461 | RIS0_FRF3 = 0x00000008, |
462 | RIS0_FRF4 = 0x00000010, |
463 | RIS0_FRF5 = 0x00000020, |
464 | RIS0_FRF6 = 0x00000040, |
465 | RIS0_FRF7 = 0x00000080, |
466 | RIS0_FRF8 = 0x00000100, |
467 | RIS0_FRF9 = 0x00000200, |
468 | RIS0_FRF10 = 0x00000400, |
469 | RIS0_FRF11 = 0x00000800, |
470 | RIS0_FRF12 = 0x00001000, |
471 | RIS0_FRF13 = 0x00002000, |
472 | RIS0_FRF14 = 0x00004000, |
473 | RIS0_FRF15 = 0x00008000, |
474 | RIS0_FRF16 = 0x00010000, |
475 | RIS0_FRF17 = 0x00020000, |
476 | RIS0_RESERVED = GENMASK(31, 18), |
477 | }; |
478 | |
479 | /* RIC1 */ |
480 | enum RIC1_BIT { |
481 | RIC1_RFWE = 0x80000000, |
482 | }; |
483 | |
484 | /* RIS1 */ |
485 | enum RIS1_BIT { |
486 | RIS1_RFWF = 0x80000000, |
487 | }; |
488 | |
489 | /* RIC2 */ |
490 | enum RIC2_BIT { |
491 | RIC2_QFE0 = 0x00000001, |
492 | RIC2_QFE1 = 0x00000002, |
493 | RIC2_QFE2 = 0x00000004, |
494 | RIC2_QFE3 = 0x00000008, |
495 | RIC2_QFE4 = 0x00000010, |
496 | RIC2_QFE5 = 0x00000020, |
497 | RIC2_QFE6 = 0x00000040, |
498 | RIC2_QFE7 = 0x00000080, |
499 | RIC2_QFE8 = 0x00000100, |
500 | RIC2_QFE9 = 0x00000200, |
501 | RIC2_QFE10 = 0x00000400, |
502 | RIC2_QFE11 = 0x00000800, |
503 | RIC2_QFE12 = 0x00001000, |
504 | RIC2_QFE13 = 0x00002000, |
505 | RIC2_QFE14 = 0x00004000, |
506 | RIC2_QFE15 = 0x00008000, |
507 | RIC2_QFE16 = 0x00010000, |
508 | RIC2_QFE17 = 0x00020000, |
509 | RIC2_RFFE = 0x80000000, |
510 | }; |
511 | |
512 | /* RIS2 */ |
513 | enum RIS2_BIT { |
514 | RIS2_QFF0 = 0x00000001, |
515 | RIS2_QFF1 = 0x00000002, |
516 | RIS2_QFF2 = 0x00000004, |
517 | RIS2_QFF3 = 0x00000008, |
518 | RIS2_QFF4 = 0x00000010, |
519 | RIS2_QFF5 = 0x00000020, |
520 | RIS2_QFF6 = 0x00000040, |
521 | RIS2_QFF7 = 0x00000080, |
522 | RIS2_QFF8 = 0x00000100, |
523 | RIS2_QFF9 = 0x00000200, |
524 | RIS2_QFF10 = 0x00000400, |
525 | RIS2_QFF11 = 0x00000800, |
526 | RIS2_QFF12 = 0x00001000, |
527 | RIS2_QFF13 = 0x00002000, |
528 | RIS2_QFF14 = 0x00004000, |
529 | RIS2_QFF15 = 0x00008000, |
530 | RIS2_QFF16 = 0x00010000, |
531 | RIS2_QFF17 = 0x00020000, |
532 | RIS2_RFFF = 0x80000000, |
533 | RIS2_RESERVED = GENMASK(30, 18), |
534 | }; |
535 | |
536 | /* TIC */ |
537 | enum TIC_BIT { |
538 | TIC_FTE0 = 0x00000001, /* Documented for R-Car Gen3 only */ |
539 | TIC_FTE1 = 0x00000002, /* Documented for R-Car Gen3 only */ |
540 | TIC_TFUE = 0x00000100, |
541 | TIC_TFWE = 0x00000200, |
542 | }; |
543 | |
544 | /* TIS */ |
545 | enum TIS_BIT { |
546 | TIS_FTF0 = 0x00000001, /* Documented for R-Car Gen3 only */ |
547 | TIS_FTF1 = 0x00000002, /* Documented for R-Car Gen3 only */ |
548 | TIS_TFUF = 0x00000100, |
549 | TIS_TFWF = 0x00000200, |
550 | TIS_RESERVED = (GENMASK(31, 20) | GENMASK(15, 12) | GENMASK(7, 4)) |
551 | }; |
552 | |
553 | /* ISS */ |
554 | enum ISS_BIT { |
555 | ISS_FRS = 0x00000001, /* Documented for R-Car Gen3 only */ |
556 | ISS_FTS = 0x00000004, /* Documented for R-Car Gen3 only */ |
557 | ISS_ES = 0x00000040, |
558 | ISS_MS = 0x00000080, |
559 | ISS_TFUS = 0x00000100, |
560 | ISS_TFWS = 0x00000200, |
561 | ISS_RFWS = 0x00001000, |
562 | ISS_CGIS = 0x00002000, |
563 | ISS_DPS1 = 0x00020000, |
564 | ISS_DPS2 = 0x00040000, |
565 | ISS_DPS3 = 0x00080000, |
566 | ISS_DPS4 = 0x00100000, |
567 | ISS_DPS5 = 0x00200000, |
568 | ISS_DPS6 = 0x00400000, |
569 | ISS_DPS7 = 0x00800000, |
570 | ISS_DPS8 = 0x01000000, |
571 | ISS_DPS9 = 0x02000000, |
572 | ISS_DPS10 = 0x04000000, |
573 | ISS_DPS11 = 0x08000000, |
574 | ISS_DPS12 = 0x10000000, |
575 | ISS_DPS13 = 0x20000000, |
576 | ISS_DPS14 = 0x40000000, |
577 | ISS_DPS15 = 0x80000000, |
578 | }; |
579 | |
580 | /* CIE (R-Car Gen3 only) */ |
581 | enum CIE_BIT { |
582 | CIE_CRIE = 0x00000001, |
583 | CIE_CTIE = 0x00000100, |
584 | CIE_RQFM = 0x00010000, |
585 | CIE_CL0M = 0x00020000, |
586 | CIE_RFWL = 0x00040000, |
587 | CIE_RFFL = 0x00080000, |
588 | }; |
589 | |
590 | /* GCCR */ |
591 | enum GCCR_BIT { |
592 | GCCR_TCR = 0x00000003, |
593 | GCCR_TCR_NOREQ = 0x00000000, /* No request */ |
594 | GCCR_TCR_RESET = 0x00000001, /* gPTP/AVTP presentation timer reset */ |
595 | GCCR_TCR_CAPTURE = 0x00000003, /* Capture value set in GCCR.TCSS */ |
596 | GCCR_LTO = 0x00000004, |
597 | GCCR_LTI = 0x00000008, |
598 | GCCR_LPTC = 0x00000010, |
599 | GCCR_LMTT = 0x00000020, |
600 | GCCR_TCSS = 0x00000300, |
601 | GCCR_TCSS_GPTP = 0x00000000, /* gPTP timer value */ |
602 | GCCR_TCSS_ADJGPTP = 0x00000100, /* Adjusted gPTP timer value */ |
603 | GCCR_TCSS_AVTP = 0x00000200, /* AVTP presentation time value */ |
604 | }; |
605 | |
606 | /* GTI */ |
607 | enum GTI_BIT { |
608 | GTI_TIV = 0x0FFFFFFF, |
609 | }; |
610 | |
611 | #define GTI_TIV_MAX GTI_TIV |
612 | #define GTI_TIV_MIN 0x20 |
613 | |
614 | /* GIC */ |
615 | enum GIC_BIT { |
616 | GIC_PTCE = 0x00000001, /* Documented for R-Car Gen3 only */ |
617 | GIC_PTME = 0x00000004, |
618 | }; |
619 | |
620 | /* GIS */ |
621 | enum GIS_BIT { |
622 | GIS_PTCF = 0x00000001, /* Documented for R-Car Gen3 only */ |
623 | GIS_PTMF = 0x00000004, |
624 | GIS_RESERVED = GENMASK(15, 10), |
625 | }; |
626 | |
627 | /* GIE (R-Car Gen3 only) */ |
628 | enum GIE_BIT { |
629 | GIE_PTCS = 0x00000001, |
630 | GIE_PTOS = 0x00000002, |
631 | GIE_PTMS0 = 0x00000004, |
632 | GIE_PTMS1 = 0x00000008, |
633 | GIE_PTMS2 = 0x00000010, |
634 | GIE_PTMS3 = 0x00000020, |
635 | GIE_PTMS4 = 0x00000040, |
636 | GIE_PTMS5 = 0x00000080, |
637 | GIE_PTMS6 = 0x00000100, |
638 | GIE_PTMS7 = 0x00000200, |
639 | GIE_ATCS0 = 0x00010000, |
640 | GIE_ATCS1 = 0x00020000, |
641 | GIE_ATCS2 = 0x00040000, |
642 | GIE_ATCS3 = 0x00080000, |
643 | GIE_ATCS4 = 0x00100000, |
644 | GIE_ATCS5 = 0x00200000, |
645 | GIE_ATCS6 = 0x00400000, |
646 | GIE_ATCS7 = 0x00800000, |
647 | GIE_ATCS8 = 0x01000000, |
648 | GIE_ATCS9 = 0x02000000, |
649 | GIE_ATCS10 = 0x04000000, |
650 | GIE_ATCS11 = 0x08000000, |
651 | GIE_ATCS12 = 0x10000000, |
652 | GIE_ATCS13 = 0x20000000, |
653 | GIE_ATCS14 = 0x40000000, |
654 | GIE_ATCS15 = 0x80000000, |
655 | }; |
656 | |
657 | /* GID (R-Car Gen3 only) */ |
658 | enum GID_BIT { |
659 | GID_PTCD = 0x00000001, |
660 | GID_PTOD = 0x00000002, |
661 | GID_PTMD0 = 0x00000004, |
662 | GID_PTMD1 = 0x00000008, |
663 | GID_PTMD2 = 0x00000010, |
664 | GID_PTMD3 = 0x00000020, |
665 | GID_PTMD4 = 0x00000040, |
666 | GID_PTMD5 = 0x00000080, |
667 | GID_PTMD6 = 0x00000100, |
668 | GID_PTMD7 = 0x00000200, |
669 | GID_ATCD0 = 0x00010000, |
670 | GID_ATCD1 = 0x00020000, |
671 | GID_ATCD2 = 0x00040000, |
672 | GID_ATCD3 = 0x00080000, |
673 | GID_ATCD4 = 0x00100000, |
674 | GID_ATCD5 = 0x00200000, |
675 | GID_ATCD6 = 0x00400000, |
676 | GID_ATCD7 = 0x00800000, |
677 | GID_ATCD8 = 0x01000000, |
678 | GID_ATCD9 = 0x02000000, |
679 | GID_ATCD10 = 0x04000000, |
680 | GID_ATCD11 = 0x08000000, |
681 | GID_ATCD12 = 0x10000000, |
682 | GID_ATCD13 = 0x20000000, |
683 | GID_ATCD14 = 0x40000000, |
684 | GID_ATCD15 = 0x80000000, |
685 | }; |
686 | |
687 | /* RIE0 (R-Car Gen3 only) */ |
688 | enum RIE0_BIT { |
689 | RIE0_FRS0 = 0x00000001, |
690 | RIE0_FRS1 = 0x00000002, |
691 | RIE0_FRS2 = 0x00000004, |
692 | RIE0_FRS3 = 0x00000008, |
693 | RIE0_FRS4 = 0x00000010, |
694 | RIE0_FRS5 = 0x00000020, |
695 | RIE0_FRS6 = 0x00000040, |
696 | RIE0_FRS7 = 0x00000080, |
697 | RIE0_FRS8 = 0x00000100, |
698 | RIE0_FRS9 = 0x00000200, |
699 | RIE0_FRS10 = 0x00000400, |
700 | RIE0_FRS11 = 0x00000800, |
701 | RIE0_FRS12 = 0x00001000, |
702 | RIE0_FRS13 = 0x00002000, |
703 | RIE0_FRS14 = 0x00004000, |
704 | RIE0_FRS15 = 0x00008000, |
705 | RIE0_FRS16 = 0x00010000, |
706 | RIE0_FRS17 = 0x00020000, |
707 | }; |
708 | |
709 | /* RID0 (R-Car Gen3 only) */ |
710 | enum RID0_BIT { |
711 | RID0_FRD0 = 0x00000001, |
712 | RID0_FRD1 = 0x00000002, |
713 | RID0_FRD2 = 0x00000004, |
714 | RID0_FRD3 = 0x00000008, |
715 | RID0_FRD4 = 0x00000010, |
716 | RID0_FRD5 = 0x00000020, |
717 | RID0_FRD6 = 0x00000040, |
718 | RID0_FRD7 = 0x00000080, |
719 | RID0_FRD8 = 0x00000100, |
720 | RID0_FRD9 = 0x00000200, |
721 | RID0_FRD10 = 0x00000400, |
722 | RID0_FRD11 = 0x00000800, |
723 | RID0_FRD12 = 0x00001000, |
724 | RID0_FRD13 = 0x00002000, |
725 | RID0_FRD14 = 0x00004000, |
726 | RID0_FRD15 = 0x00008000, |
727 | RID0_FRD16 = 0x00010000, |
728 | RID0_FRD17 = 0x00020000, |
729 | }; |
730 | |
731 | /* RIE2 (R-Car Gen3 only) */ |
732 | enum RIE2_BIT { |
733 | RIE2_QFS0 = 0x00000001, |
734 | RIE2_QFS1 = 0x00000002, |
735 | RIE2_QFS2 = 0x00000004, |
736 | RIE2_QFS3 = 0x00000008, |
737 | RIE2_QFS4 = 0x00000010, |
738 | RIE2_QFS5 = 0x00000020, |
739 | RIE2_QFS6 = 0x00000040, |
740 | RIE2_QFS7 = 0x00000080, |
741 | RIE2_QFS8 = 0x00000100, |
742 | RIE2_QFS9 = 0x00000200, |
743 | RIE2_QFS10 = 0x00000400, |
744 | RIE2_QFS11 = 0x00000800, |
745 | RIE2_QFS12 = 0x00001000, |
746 | RIE2_QFS13 = 0x00002000, |
747 | RIE2_QFS14 = 0x00004000, |
748 | RIE2_QFS15 = 0x00008000, |
749 | RIE2_QFS16 = 0x00010000, |
750 | RIE2_QFS17 = 0x00020000, |
751 | RIE2_RFFS = 0x80000000, |
752 | }; |
753 | |
754 | /* RID2 (R-Car Gen3 only) */ |
755 | enum RID2_BIT { |
756 | RID2_QFD0 = 0x00000001, |
757 | RID2_QFD1 = 0x00000002, |
758 | RID2_QFD2 = 0x00000004, |
759 | RID2_QFD3 = 0x00000008, |
760 | RID2_QFD4 = 0x00000010, |
761 | RID2_QFD5 = 0x00000020, |
762 | RID2_QFD6 = 0x00000040, |
763 | RID2_QFD7 = 0x00000080, |
764 | RID2_QFD8 = 0x00000100, |
765 | RID2_QFD9 = 0x00000200, |
766 | RID2_QFD10 = 0x00000400, |
767 | RID2_QFD11 = 0x00000800, |
768 | RID2_QFD12 = 0x00001000, |
769 | RID2_QFD13 = 0x00002000, |
770 | RID2_QFD14 = 0x00004000, |
771 | RID2_QFD15 = 0x00008000, |
772 | RID2_QFD16 = 0x00010000, |
773 | RID2_QFD17 = 0x00020000, |
774 | RID2_RFFD = 0x80000000, |
775 | }; |
776 | |
777 | /* TIE (R-Car Gen3 only) */ |
778 | enum TIE_BIT { |
779 | TIE_FTS0 = 0x00000001, |
780 | TIE_FTS1 = 0x00000002, |
781 | TIE_FTS2 = 0x00000004, |
782 | TIE_FTS3 = 0x00000008, |
783 | TIE_TFUS = 0x00000100, |
784 | TIE_TFWS = 0x00000200, |
785 | TIE_MFUS = 0x00000400, |
786 | TIE_MFWS = 0x00000800, |
787 | TIE_TDPS0 = 0x00010000, |
788 | TIE_TDPS1 = 0x00020000, |
789 | TIE_TDPS2 = 0x00040000, |
790 | TIE_TDPS3 = 0x00080000, |
791 | }; |
792 | |
793 | /* TID (R-Car Gen3 only) */ |
794 | enum TID_BIT { |
795 | TID_FTD0 = 0x00000001, |
796 | TID_FTD1 = 0x00000002, |
797 | TID_FTD2 = 0x00000004, |
798 | TID_FTD3 = 0x00000008, |
799 | TID_TFUD = 0x00000100, |
800 | TID_TFWD = 0x00000200, |
801 | TID_MFUD = 0x00000400, |
802 | TID_MFWD = 0x00000800, |
803 | TID_TDPD0 = 0x00010000, |
804 | TID_TDPD1 = 0x00020000, |
805 | TID_TDPD2 = 0x00040000, |
806 | TID_TDPD3 = 0x00080000, |
807 | }; |
808 | |
809 | /* ECMR */ |
810 | enum ECMR_BIT { |
811 | ECMR_PRM = 0x00000001, |
812 | ECMR_DM = 0x00000002, |
813 | ECMR_TE = 0x00000020, |
814 | ECMR_RE = 0x00000040, |
815 | ECMR_MPDE = 0x00000200, |
816 | ECMR_TXF = 0x00010000, /* Documented for R-Car Gen3 only */ |
817 | ECMR_RXF = 0x00020000, |
818 | ECMR_PFR = 0x00040000, |
819 | ECMR_ZPF = 0x00080000, /* Documented for R-Car Gen3 and RZ/G2L */ |
820 | ECMR_RZPF = 0x00100000, |
821 | ECMR_DPAD = 0x00200000, |
822 | ECMR_RCSC = 0x00800000, |
823 | ECMR_RCPT = 0x02000000, /* Documented for RZ/G2L only */ |
824 | ECMR_TRCCM = 0x04000000, |
825 | }; |
826 | |
827 | /* ECSR */ |
828 | enum ECSR_BIT { |
829 | ECSR_ICD = 0x00000001, |
830 | ECSR_MPD = 0x00000002, |
831 | ECSR_LCHNG = 0x00000004, |
832 | ECSR_PHYI = 0x00000008, |
833 | ECSR_PFRI = 0x00000010, /* Documented for R-Car Gen3 and RZ/G2L */ |
834 | }; |
835 | |
836 | /* ECSIPR */ |
837 | enum ECSIPR_BIT { |
838 | ECSIPR_ICDIP = 0x00000001, |
839 | ECSIPR_MPDIP = 0x00000002, |
840 | ECSIPR_LCHNGIP = 0x00000004, |
841 | }; |
842 | |
843 | /* PIR */ |
844 | enum PIR_BIT { |
845 | PIR_MDC = 0x00000001, |
846 | PIR_MMD = 0x00000002, |
847 | PIR_MDO = 0x00000004, |
848 | PIR_MDI = 0x00000008, |
849 | }; |
850 | |
851 | /* PSR */ |
852 | enum PSR_BIT { |
853 | PSR_LMON = 0x00000001, |
854 | }; |
855 | |
856 | /* PIPR */ |
857 | enum PIPR_BIT { |
858 | PIPR_PHYIP = 0x00000001, |
859 | }; |
860 | |
861 | /* MPR */ |
862 | enum MPR_BIT { |
863 | MPR_MP = 0x0000ffff, |
864 | }; |
865 | |
866 | /* GECMR */ |
867 | enum GECMR_BIT { |
868 | GECMR_SPEED = 0x00000001, |
869 | GECMR_SPEED_100 = 0x00000000, |
870 | GECMR_SPEED_1000 = 0x00000001, |
871 | GBETH_GECMR_SPEED = 0x00000030, |
872 | GBETH_GECMR_SPEED_10 = 0x00000000, |
873 | GBETH_GECMR_SPEED_100 = 0x00000010, |
874 | GBETH_GECMR_SPEED_1000 = 0x00000020, |
875 | }; |
876 | |
877 | /* The Ethernet AVB descriptor definitions. */ |
878 | struct ravb_desc { |
879 | __le16 ds; /* Descriptor size */ |
880 | u8 cc; /* Content control MSBs (reserved) */ |
881 | u8 die_dt; /* Descriptor interrupt enable and type */ |
882 | __le32 dptr; /* Descriptor pointer */ |
883 | }; |
884 | |
885 | #define DPTR_ALIGN 4 /* Required descriptor pointer alignment */ |
886 | |
887 | enum DIE_DT { |
888 | /* Frame data */ |
889 | DT_FMID = 0x40, |
890 | DT_FSTART = 0x50, |
891 | DT_FEND = 0x60, |
892 | DT_FSINGLE = 0x70, |
893 | /* Chain control */ |
894 | DT_LINK = 0x80, |
895 | DT_LINKFIX = 0x90, |
896 | DT_EOS = 0xa0, |
897 | /* HW/SW arbitration */ |
898 | DT_FEMPTY = 0xc0, |
899 | DT_FEMPTY_IS = 0xd0, |
900 | DT_FEMPTY_IC = 0xe0, |
901 | DT_FEMPTY_ND = 0xf0, |
902 | DT_LEMPTY = 0x20, |
903 | DT_EEMPTY = 0x30, |
904 | }; |
905 | |
906 | struct ravb_rx_desc { |
907 | __le16 ds_cc; /* Descriptor size and content control LSBs */ |
908 | u8 msc; /* MAC status code */ |
909 | u8 die_dt; /* Descriptor interrupt enable and type */ |
910 | __le32 dptr; /* Descpriptor pointer */ |
911 | }; |
912 | |
913 | struct ravb_ex_rx_desc { |
914 | __le16 ds_cc; /* Descriptor size and content control lower bits */ |
915 | u8 msc; /* MAC status code */ |
916 | u8 die_dt; /* Descriptor interrupt enable and type */ |
917 | __le32 dptr; /* Descpriptor pointer */ |
918 | __le32 ts_n; /* Timestampe nsec */ |
919 | __le32 ts_sl; /* Timestamp low */ |
920 | __le16 ts_sh; /* Timestamp high */ |
921 | __le16 res; /* Reserved bits */ |
922 | }; |
923 | |
924 | enum RX_DS_CC_BIT { |
925 | RX_DS = 0x0fff, /* Data size */ |
926 | RX_TR = 0x1000, /* Truncation indication */ |
927 | RX_EI = 0x2000, /* Error indication */ |
928 | RX_PS = 0xc000, /* Padding selection */ |
929 | }; |
930 | |
931 | /* E-MAC status code */ |
932 | enum MSC_BIT { |
933 | MSC_CRC = 0x01, /* Frame CRC error */ |
934 | MSC_RFE = 0x02, /* Frame reception error (flagged by PHY) */ |
935 | MSC_RTSF = 0x04, /* Frame length error (frame too short) */ |
936 | MSC_RTLF = 0x08, /* Frame length error (frame too long) */ |
937 | MSC_FRE = 0x10, /* Fraction error (not a multiple of 8 bits) */ |
938 | MSC_CRL = 0x20, /* Carrier lost */ |
939 | MSC_CEEF = 0x40, /* Carrier extension error */ |
940 | MSC_MC = 0x80, /* Multicast frame reception */ |
941 | }; |
942 | |
943 | struct ravb_tx_desc { |
944 | __le16 ds_tagl; /* Descriptor size and frame tag LSBs */ |
945 | u8 tagh_tsr; /* Frame tag MSBs and timestamp storage request bit */ |
946 | u8 die_dt; /* Descriptor interrupt enable and type */ |
947 | __le32 dptr; /* Descpriptor pointer */ |
948 | }; |
949 | |
950 | enum TX_DS_TAGL_BIT { |
951 | TX_DS = 0x0fff, /* Data size */ |
952 | TX_TAGL = 0xf000, /* Frame tag LSBs */ |
953 | }; |
954 | |
955 | enum TX_TAGH_TSR_BIT { |
956 | TX_TAGH = 0x3f, /* Frame tag MSBs */ |
957 | TX_TSR = 0x40, /* Timestamp storage request */ |
958 | }; |
959 | enum RAVB_QUEUE { |
960 | RAVB_BE = 0, /* Best Effort Queue */ |
961 | RAVB_NC, /* Network Control Queue */ |
962 | }; |
963 | |
964 | enum CXR31_BIT { |
965 | CXR31_SEL_LINK0 = 0x00000001, |
966 | CXR31_SEL_LINK1 = 0x00000008, |
967 | }; |
968 | |
969 | enum CXR35_BIT { |
970 | CXR35_SEL_XMII = 0x00000003, |
971 | CXR35_SEL_XMII_RGMII = 0x00000000, |
972 | CXR35_SEL_XMII_MII = 0x00000002, |
973 | CXR35_HALFCYC_CLKSW = 0xffff0000, |
974 | }; |
975 | |
976 | enum CSR0_BIT { |
977 | CSR0_TPE = 0x00000010, |
978 | CSR0_RPE = 0x00000020, |
979 | }; |
980 | |
981 | #define DBAT_ENTRY_NUM 22 |
982 | #define RX_QUEUE_OFFSET 4 |
983 | #define NUM_RX_QUEUE 2 |
984 | #define NUM_TX_QUEUE 2 |
985 | |
986 | #define RX_BUF_SZ (2048 - ETH_FCS_LEN + sizeof(__sum16)) |
987 | |
988 | #define GBETH_RX_BUFF_MAX 8192 |
989 | #define GBETH_RX_DESC_DATA_SIZE 4080 |
990 | |
991 | struct ravb_tstamp_skb { |
992 | struct list_head list; |
993 | struct sk_buff *skb; |
994 | u16 tag; |
995 | }; |
996 | |
997 | struct ravb_ptp_perout { |
998 | u32 target; |
999 | u32 period; |
1000 | }; |
1001 | |
1002 | #define N_EXT_TS 1 |
1003 | #define N_PER_OUT 1 |
1004 | |
1005 | struct ravb_ptp { |
1006 | struct ptp_clock *clock; |
1007 | struct ptp_clock_info info; |
1008 | u32 default_addend; |
1009 | u32 current_addend; |
1010 | int extts[N_EXT_TS]; |
1011 | struct ravb_ptp_perout perout[N_PER_OUT]; |
1012 | }; |
1013 | |
1014 | struct ravb_hw_info { |
1015 | void (*rx_ring_free)(struct net_device *ndev, int q); |
1016 | void (*rx_ring_format)(struct net_device *ndev, int q); |
1017 | void *(*alloc_rx_desc)(struct net_device *ndev, int q); |
1018 | bool (*receive)(struct net_device *ndev, int *quota, int q); |
1019 | void (*set_rate)(struct net_device *ndev); |
1020 | int (*set_feature)(struct net_device *ndev, netdev_features_t features); |
1021 | int (*dmac_init)(struct net_device *ndev); |
1022 | void (*emac_init)(struct net_device *ndev); |
1023 | const char (*gstrings_stats)[ETH_GSTRING_LEN]; |
1024 | size_t gstrings_size; |
1025 | netdev_features_t net_hw_features; |
1026 | netdev_features_t net_features; |
1027 | int stats_len; |
1028 | size_t max_rx_len; |
1029 | u32 tccr_mask; |
1030 | u32 rx_max_buf_size; |
1031 | unsigned aligned_tx: 1; |
1032 | |
1033 | /* hardware features */ |
1034 | unsigned internal_delay:1; /* AVB-DMAC has internal delays */ |
1035 | unsigned tx_counters:1; /* E-MAC has TX counters */ |
1036 | unsigned carrier_counters:1; /* E-MAC has carrier counters */ |
1037 | unsigned multi_irqs:1; /* AVB-DMAC and E-MAC has multiple irqs */ |
1038 | unsigned irq_en_dis:1; /* Has separate irq enable and disable regs */ |
1039 | unsigned err_mgmt_irqs:1; /* Line1 (Err) and Line2 (Mgmt) irqs are separate */ |
1040 | unsigned gptp:1; /* AVB-DMAC has gPTP support */ |
1041 | unsigned ccc_gac:1; /* AVB-DMAC has gPTP support active in config mode */ |
1042 | unsigned gptp_ref_clk:1; /* gPTP has separate reference clock */ |
1043 | unsigned nc_queues:1; /* AVB-DMAC has RX and TX NC queues */ |
1044 | unsigned magic_pkt:1; /* E-MAC supports magic packet detection */ |
1045 | unsigned half_duplex:1; /* E-MAC supports half duplex mode */ |
1046 | }; |
1047 | |
1048 | struct ravb_private { |
1049 | struct net_device *ndev; |
1050 | struct platform_device *pdev; |
1051 | void __iomem *addr; |
1052 | struct clk *clk; |
1053 | struct clk *refclk; |
1054 | struct clk *gptp_clk; |
1055 | struct mdiobb_ctrl mdiobb; |
1056 | u32 num_rx_ring[NUM_RX_QUEUE]; |
1057 | u32 num_tx_ring[NUM_TX_QUEUE]; |
1058 | u32 desc_bat_size; |
1059 | dma_addr_t desc_bat_dma; |
1060 | struct ravb_desc *desc_bat; |
1061 | dma_addr_t rx_desc_dma[NUM_RX_QUEUE]; |
1062 | dma_addr_t tx_desc_dma[NUM_TX_QUEUE]; |
1063 | struct ravb_rx_desc *gbeth_rx_ring; |
1064 | struct ravb_ex_rx_desc *rx_ring[NUM_RX_QUEUE]; |
1065 | struct ravb_tx_desc *tx_ring[NUM_TX_QUEUE]; |
1066 | void *tx_align[NUM_TX_QUEUE]; |
1067 | struct sk_buff *rx_1st_skb; |
1068 | struct sk_buff **rx_skb[NUM_RX_QUEUE]; |
1069 | struct sk_buff **tx_skb[NUM_TX_QUEUE]; |
1070 | u32 rx_over_errors; |
1071 | u32 rx_fifo_errors; |
1072 | struct net_device_stats stats[NUM_RX_QUEUE]; |
1073 | u32 tstamp_tx_ctrl; |
1074 | u32 tstamp_rx_ctrl; |
1075 | struct list_head ts_skb_list; |
1076 | u32 ts_skb_tag; |
1077 | struct ravb_ptp ptp; |
1078 | spinlock_t lock; /* Register access lock */ |
1079 | u32 cur_rx[NUM_RX_QUEUE]; /* Consumer ring indices */ |
1080 | u32 dirty_rx[NUM_RX_QUEUE]; /* Producer ring indices */ |
1081 | u32 cur_tx[NUM_TX_QUEUE]; |
1082 | u32 dirty_tx[NUM_TX_QUEUE]; |
1083 | struct napi_struct napi[NUM_RX_QUEUE]; |
1084 | struct work_struct work; |
1085 | /* MII transceiver section. */ |
1086 | struct mii_bus *mii_bus; /* MDIO bus control */ |
1087 | int link; |
1088 | phy_interface_t phy_interface; |
1089 | int msg_enable; |
1090 | int speed; |
1091 | int emac_irq; |
1092 | int erra_irq; |
1093 | int mgmta_irq; |
1094 | int rx_irqs[NUM_RX_QUEUE]; |
1095 | int tx_irqs[NUM_TX_QUEUE]; |
1096 | |
1097 | unsigned no_avb_link:1; |
1098 | unsigned avb_link_active_low:1; |
1099 | unsigned wol_enabled:1; |
1100 | unsigned rxcidm:1; /* RX Clock Internal Delay Mode */ |
1101 | unsigned txcidm:1; /* TX Clock Internal Delay Mode */ |
1102 | unsigned rgmii_override:1; /* Deprecated rgmii-*id behavior */ |
1103 | unsigned int num_tx_desc; /* TX descriptors per packet */ |
1104 | |
1105 | int duplex; |
1106 | |
1107 | const struct ravb_hw_info *info; |
1108 | struct reset_control *rstc; |
1109 | }; |
1110 | |
1111 | static inline u32 ravb_read(struct net_device *ndev, enum ravb_reg reg) |
1112 | { |
1113 | struct ravb_private *priv = netdev_priv(dev: ndev); |
1114 | |
1115 | return ioread32(priv->addr + reg); |
1116 | } |
1117 | |
1118 | static inline void ravb_write(struct net_device *ndev, u32 data, |
1119 | enum ravb_reg reg) |
1120 | { |
1121 | struct ravb_private *priv = netdev_priv(dev: ndev); |
1122 | |
1123 | iowrite32(data, priv->addr + reg); |
1124 | } |
1125 | |
1126 | void ravb_modify(struct net_device *ndev, enum ravb_reg reg, u32 clear, |
1127 | u32 set); |
1128 | int ravb_wait(struct net_device *ndev, enum ravb_reg reg, u32 mask, u32 value); |
1129 | |
1130 | void ravb_ptp_interrupt(struct net_device *ndev); |
1131 | void ravb_ptp_init(struct net_device *ndev, struct platform_device *pdev); |
1132 | void ravb_ptp_stop(struct net_device *ndev); |
1133 | |
1134 | #endif /* #ifndef __RAVB_H__ */ |
1135 | |