]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - drivers/net/sh_eth.h
Merge remote-tracking branch 'u-boot-samsung/master'
[karo-tx-uboot.git] / drivers / net / sh_eth.h
1 /*
2  * sh_eth.h - Driver for Renesas SuperH ethernet controler.
3  *
4  * Copyright (C) 2008 - 2012 Renesas Solutions Corp.
5  * Copyright (c) 2008 - 2012 Nobuhiro Iwamatsu
6  * Copyright (c) 2007 Carlos Munoz <carlos@kenati.com>
7  *
8  * SPDX-License-Identifier:     GPL-2.0+
9  */
10
11 #include <netdev.h>
12 #include <asm/types.h>
13
14 #define SHETHER_NAME "sh_eth"
15
16 #if defined(CONFIG_SH)
17 /* Malloc returns addresses in the P1 area (cacheable). However we need to
18    use area P2 (non-cacheable) */
19 #define ADDR_TO_P2(addr)        ((((int)(addr) & ~0xe0000000) | 0xa0000000))
20
21 /* The ethernet controller needs to use physical addresses */
22 #if defined(CONFIG_SH_32BIT)
23 #define ADDR_TO_PHY(addr)       ((((int)(addr) & ~0xe0000000) | 0x40000000))
24 #else
25 #define ADDR_TO_PHY(addr)       ((int)(addr) & ~0xe0000000)
26 #endif
27 #elif defined(CONFIG_ARM)
28 #define inl             readl
29 #define outl    writel
30 #define ADDR_TO_PHY(addr)       ((int)(addr))
31 #define ADDR_TO_P2(addr)        (addr)
32 #endif /* defined(CONFIG_SH) */
33
34 /* base padding size is 16 */
35 #ifndef CONFIG_SH_ETHER_ALIGNE_SIZE
36 #define CONFIG_SH_ETHER_ALIGNE_SIZE 16
37 #endif
38
39 /* Number of supported ports */
40 #define MAX_PORT_NUM    2
41
42 /* Buffers must be big enough to hold the largest ethernet frame. Also, rx
43    buffers must be a multiple of 32 bytes */
44 #define MAX_BUF_SIZE    (48 * 32)
45
46 /* The number of tx descriptors must be large enough to point to 5 or more
47    frames. If each frame uses 2 descriptors, at least 10 descriptors are needed.
48    We use one descriptor per frame */
49 #define NUM_TX_DESC             8
50
51 /* The size of the tx descriptor is determined by how much padding is used.
52    4, 20, or 52 bytes of padding can be used */
53 #define TX_DESC_PADDING (CONFIG_SH_ETHER_ALIGNE_SIZE - 12)
54 /* same as CONFIG_SH_ETHER_ALIGNE_SIZE */
55 #define TX_DESC_SIZE    (12 + TX_DESC_PADDING)
56
57 /* Tx descriptor. We always use 3 bytes of padding */
58 struct tx_desc_s {
59         volatile u32 td0;
60         u32 td1;
61         u32 td2;                /* Buffer start */
62         u8 padding[TX_DESC_PADDING];    /* aligned cache line size */
63 };
64
65 /* There is no limitation in the number of rx descriptors */
66 #define NUM_RX_DESC     8
67
68 /* The size of the rx descriptor is determined by how much padding is used.
69    4, 20, or 52 bytes of padding can be used */
70 #define RX_DESC_PADDING (CONFIG_SH_ETHER_ALIGNE_SIZE - 12)
71 /* same as CONFIG_SH_ETHER_ALIGNE_SIZE */
72 #define RX_DESC_SIZE            (12 + RX_DESC_PADDING)
73 /* aligned cache line size */
74 #define RX_BUF_ALIGNE_SIZE      (CONFIG_SH_ETHER_ALIGNE_SIZE > 32 ? 64 : 32)
75
76 /* Rx descriptor. We always use 4 bytes of padding */
77 struct rx_desc_s {
78         volatile u32 rd0;
79         volatile u32 rd1;
80         u32 rd2;                /* Buffer start */
81         u8 padding[TX_DESC_PADDING];    /* aligned cache line size */
82 };
83
84 struct sh_eth_info {
85         struct tx_desc_s *tx_desc_malloc;
86         struct tx_desc_s *tx_desc_base;
87         struct tx_desc_s *tx_desc_cur;
88         struct rx_desc_s *rx_desc_malloc;
89         struct rx_desc_s *rx_desc_base;
90         struct rx_desc_s *rx_desc_cur;
91         u8 *rx_buf_malloc;
92         u8 *rx_buf_base;
93         u8 mac_addr[6];
94         u8 phy_addr;
95         struct eth_device *dev;
96         struct phy_device *phydev;
97 };
98
99 struct sh_eth_dev {
100         int port;
101         struct sh_eth_info port_info[MAX_PORT_NUM];
102 };
103
104 /* from linux/drivers/net/ethernet/renesas/sh_eth.h */
105 enum {
106         /* E-DMAC registers */
107         EDSR = 0,
108         EDMR,
109         EDTRR,
110         EDRRR,
111         EESR,
112         EESIPR,
113         TDLAR,
114         TDFAR,
115         TDFXR,
116         TDFFR,
117         RDLAR,
118         RDFAR,
119         RDFXR,
120         RDFFR,
121         TRSCER,
122         RMFCR,
123         TFTR,
124         FDR,
125         RMCR,
126         EDOCR,
127         TFUCR,
128         RFOCR,
129         FCFTR,
130         RPADIR,
131         TRIMD,
132         RBWAR,
133         TBRAR,
134
135         /* Ether registers */
136         ECMR,
137         ECSR,
138         ECSIPR,
139         PIR,
140         PSR,
141         RDMLR,
142         PIPR,
143         RFLR,
144         IPGR,
145         APR,
146         MPR,
147         PFTCR,
148         PFRCR,
149         RFCR,
150         RFCF,
151         TPAUSER,
152         TPAUSECR,
153         BCFR,
154         BCFRR,
155         GECMR,
156         BCULR,
157         MAHR,
158         MALR,
159         TROCR,
160         CDCR,
161         LCCR,
162         CNDCR,
163         CEFCR,
164         FRECR,
165         TSFRCR,
166         TLFRCR,
167         CERCR,
168         CEECR,
169         RMIIMR, /* R8A7790 */
170         MAFCR,
171         RTRATE,
172         CSMR,
173         RMII_MII,
174
175         /* This value must be written at last. */
176         SH_ETH_MAX_REGISTER_OFFSET,
177 };
178
179 static const u16 sh_eth_offset_gigabit[SH_ETH_MAX_REGISTER_OFFSET] = {
180         [EDSR]  = 0x0000,
181         [EDMR]  = 0x0400,
182         [EDTRR] = 0x0408,
183         [EDRRR] = 0x0410,
184         [EESR]  = 0x0428,
185         [EESIPR]        = 0x0430,
186         [TDLAR] = 0x0010,
187         [TDFAR] = 0x0014,
188         [TDFXR] = 0x0018,
189         [TDFFR] = 0x001c,
190         [RDLAR] = 0x0030,
191         [RDFAR] = 0x0034,
192         [RDFXR] = 0x0038,
193         [RDFFR] = 0x003c,
194         [TRSCER]        = 0x0438,
195         [RMFCR] = 0x0440,
196         [TFTR]  = 0x0448,
197         [FDR]   = 0x0450,
198         [RMCR]  = 0x0458,
199         [RPADIR]        = 0x0460,
200         [FCFTR] = 0x0468,
201         [CSMR] = 0x04E4,
202
203         [ECMR]  = 0x0500,
204         [ECSR]  = 0x0510,
205         [ECSIPR]        = 0x0518,
206         [PIR]   = 0x0520,
207         [PSR]   = 0x0528,
208         [PIPR]  = 0x052c,
209         [RFLR]  = 0x0508,
210         [APR]   = 0x0554,
211         [MPR]   = 0x0558,
212         [PFTCR] = 0x055c,
213         [PFRCR] = 0x0560,
214         [TPAUSER]       = 0x0564,
215         [GECMR] = 0x05b0,
216         [BCULR] = 0x05b4,
217         [MAHR]  = 0x05c0,
218         [MALR]  = 0x05c8,
219         [TROCR] = 0x0700,
220         [CDCR]  = 0x0708,
221         [LCCR]  = 0x0710,
222         [CEFCR] = 0x0740,
223         [FRECR] = 0x0748,
224         [TSFRCR]        = 0x0750,
225         [TLFRCR]        = 0x0758,
226         [RFCR]  = 0x0760,
227         [CERCR] = 0x0768,
228         [CEECR] = 0x0770,
229         [MAFCR] = 0x0778,
230         [RMII_MII] =  0x0790,
231 };
232
233 #if defined(SH_ETH_TYPE_RZ)
234 static const u16 sh_eth_offset_rz[SH_ETH_MAX_REGISTER_OFFSET] = {
235         [EDSR]  = 0x0000,
236         [EDMR]  = 0x0400,
237         [EDTRR] = 0x0408,
238         [EDRRR] = 0x0410,
239         [EESR]  = 0x0428,
240         [EESIPR]        = 0x0430,
241         [TDLAR] = 0x0010,
242         [TDFAR] = 0x0014,
243         [TDFXR] = 0x0018,
244         [TDFFR] = 0x001c,
245         [RDLAR] = 0x0030,
246         [RDFAR] = 0x0034,
247         [RDFXR] = 0x0038,
248         [RDFFR] = 0x003c,
249         [TRSCER]        = 0x0438,
250         [RMFCR] = 0x0440,
251         [TFTR]  = 0x0448,
252         [FDR]   = 0x0450,
253         [RMCR]  = 0x0458,
254         [RPADIR]        = 0x0460,
255         [FCFTR] = 0x0468,
256         [CSMR] = 0x04E4,
257
258         [ECMR]  = 0x0500,
259         [ECSR]  = 0x0510,
260         [ECSIPR]        = 0x0518,
261         [PSR]   = 0x0528,
262         [PIPR]  = 0x052c,
263         [RFLR]  = 0x0508,
264         [APR]   = 0x0554,
265         [MPR]   = 0x0558,
266         [PFTCR] = 0x055c,
267         [PFRCR] = 0x0560,
268         [TPAUSER]       = 0x0564,
269         [GECMR] = 0x05b0,
270         [BCULR] = 0x05b4,
271         [MAHR]  = 0x05c0,
272         [MALR]  = 0x05c8,
273         [TROCR] = 0x0700,
274         [CDCR]  = 0x0708,
275         [LCCR]  = 0x0710,
276         [CEFCR] = 0x0740,
277         [FRECR] = 0x0748,
278         [TSFRCR]        = 0x0750,
279         [TLFRCR]        = 0x0758,
280         [RFCR]  = 0x0760,
281         [CERCR] = 0x0768,
282         [CEECR] = 0x0770,
283         [MAFCR] = 0x0778,
284         [RMII_MII] =  0x0790,
285 };
286 #endif
287
288 static const u16 sh_eth_offset_fast_sh4[SH_ETH_MAX_REGISTER_OFFSET] = {
289         [ECMR]  = 0x0100,
290         [RFLR]  = 0x0108,
291         [ECSR]  = 0x0110,
292         [ECSIPR]        = 0x0118,
293         [PIR]   = 0x0120,
294         [PSR]   = 0x0128,
295         [RDMLR] = 0x0140,
296         [IPGR]  = 0x0150,
297         [APR]   = 0x0154,
298         [MPR]   = 0x0158,
299         [TPAUSER]       = 0x0164,
300         [RFCF]  = 0x0160,
301         [TPAUSECR]      = 0x0168,
302         [BCFRR] = 0x016c,
303         [MAHR]  = 0x01c0,
304         [MALR]  = 0x01c8,
305         [TROCR] = 0x01d0,
306         [CDCR]  = 0x01d4,
307         [LCCR]  = 0x01d8,
308         [CNDCR] = 0x01dc,
309         [CEFCR] = 0x01e4,
310         [FRECR] = 0x01e8,
311         [TSFRCR]        = 0x01ec,
312         [TLFRCR]        = 0x01f0,
313         [RFCR]  = 0x01f4,
314         [MAFCR] = 0x01f8,
315         [RTRATE]        = 0x01fc,
316
317         [EDMR]  = 0x0000,
318         [EDTRR] = 0x0008,
319         [EDRRR] = 0x0010,
320         [TDLAR] = 0x0018,
321         [RDLAR] = 0x0020,
322         [EESR]  = 0x0028,
323         [EESIPR]        = 0x0030,
324         [TRSCER]        = 0x0038,
325         [RMFCR] = 0x0040,
326         [TFTR]  = 0x0048,
327         [FDR]   = 0x0050,
328         [RMCR]  = 0x0058,
329         [TFUCR] = 0x0064,
330         [RFOCR] = 0x0068,
331         [RMIIMR] = 0x006C,
332         [FCFTR] = 0x0070,
333         [RPADIR]        = 0x0078,
334         [TRIMD] = 0x007c,
335         [RBWAR] = 0x00c8,
336         [RDFAR] = 0x00cc,
337         [TBRAR] = 0x00d4,
338         [TDFAR] = 0x00d8,
339 };
340
341 /* Register Address */
342 #if defined(CONFIG_CPU_SH7763) || defined(CONFIG_CPU_SH7734)
343 #define SH_ETH_TYPE_GETHER
344 #define BASE_IO_ADDR    0xfee00000
345 #elif defined(CONFIG_CPU_SH7757) || \
346         defined(CONFIG_CPU_SH7752) || \
347         defined(CONFIG_CPU_SH7753)
348 #if defined(CONFIG_SH_ETHER_USE_GETHER)
349 #define SH_ETH_TYPE_GETHER
350 #define BASE_IO_ADDR    0xfee00000
351 #else
352 #define SH_ETH_TYPE_ETHER
353 #define BASE_IO_ADDR    0xfef00000
354 #endif
355 #elif defined(CONFIG_CPU_SH7724)
356 #define SH_ETH_TYPE_ETHER
357 #define BASE_IO_ADDR    0xA4600000
358 #elif defined(CONFIG_R8A7740)
359 #define SH_ETH_TYPE_GETHER
360 #define BASE_IO_ADDR    0xE9A00000
361 #elif defined(CONFIG_R8A7790) || defined(CONFIG_R8A7791)
362 #define SH_ETH_TYPE_ETHER
363 #define BASE_IO_ADDR    0xEE700200
364 #elif defined(CONFIG_R7S72100)
365 #define SH_ETH_TYPE_RZ
366 #define BASE_IO_ADDR    0xE8203000
367 #endif
368
369 /*
370  * Register's bits
371  * Copy from Linux driver source code
372  */
373 #if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
374 /* EDSR */
375 enum EDSR_BIT {
376         EDSR_ENT = 0x01, EDSR_ENR = 0x02,
377 };
378 #define EDSR_ENALL (EDSR_ENT|EDSR_ENR)
379 #endif
380
381 /* EDMR */
382 enum DMAC_M_BIT {
383         EDMR_DL1 = 0x20, EDMR_DL0 = 0x10,
384 #if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
385         EDMR_SRST       = 0x03, /* Receive/Send reset */
386         EMDR_DESC_R     = 0x30, /* Descriptor reserve size */
387         EDMR_EL         = 0x40, /* Litte endian */
388 #elif defined(SH_ETH_TYPE_ETHER)
389         EDMR_SRST       = 0x01,
390         EMDR_DESC_R     = 0x30, /* Descriptor reserve size */
391         EDMR_EL         = 0x40, /* Litte endian */
392 #else
393         EDMR_SRST = 0x01,
394 #endif
395 };
396
397 #if CONFIG_SH_ETHER_ALIGNE_SIZE == 64
398 # define EMDR_DESC EDMR_DL1
399 #elif CONFIG_SH_ETHER_ALIGNE_SIZE == 32
400 # define EMDR_DESC EDMR_DL0
401 #elif CONFIG_SH_ETHER_ALIGNE_SIZE == 16 /* Default */
402 # define EMDR_DESC 0
403 #endif
404
405 /* RFLR */
406 #define RFLR_RFL_MIN    0x05EE  /* Recv Frame length 1518 byte */
407
408 /* EDTRR */
409 enum DMAC_T_BIT {
410 #if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
411         EDTRR_TRNS = 0x03,
412 #else
413         EDTRR_TRNS = 0x01,
414 #endif
415 };
416
417 /* GECMR */
418 enum GECMR_BIT {
419 #if defined(CONFIG_CPU_SH7757) || \
420         defined(CONFIG_CPU_SH7752) || \
421         defined(CONFIG_CPU_SH7753)
422         GECMR_1000B = 0x20, GECMR_100B = 0x01, GECMR_10B = 0x00,
423 #else
424         GECMR_1000B = 0x01, GECMR_100B = 0x04, GECMR_10B = 0x00,
425 #endif
426 };
427
428 /* EDRRR*/
429 enum EDRRR_R_BIT {
430         EDRRR_R = 0x01,
431 };
432
433 /* TPAUSER */
434 enum TPAUSER_BIT {
435         TPAUSER_TPAUSE = 0x0000ffff,
436         TPAUSER_UNLIMITED = 0,
437 };
438
439 /* BCFR */
440 enum BCFR_BIT {
441         BCFR_RPAUSE = 0x0000ffff,
442         BCFR_UNLIMITED = 0,
443 };
444
445 /* PIR */
446 enum PIR_BIT {
447         PIR_MDI = 0x08, PIR_MDO = 0x04, PIR_MMD = 0x02, PIR_MDC = 0x01,
448 };
449
450 /* PSR */
451 enum PHY_STATUS_BIT { PHY_ST_LINK = 0x01, };
452
453 /* EESR */
454 enum EESR_BIT {
455 #if defined(SH_ETH_TYPE_ETHER)
456         EESR_TWB  = 0x40000000,
457 #else
458         EESR_TWB  = 0xC0000000,
459         EESR_TC1  = 0x20000000,
460         EESR_TUC  = 0x10000000,
461         EESR_ROC  = 0x80000000,
462 #endif
463         EESR_TABT = 0x04000000,
464         EESR_RABT = 0x02000000, EESR_RFRMER = 0x01000000,
465 #if defined(SH_ETH_TYPE_ETHER)
466         EESR_ADE  = 0x00800000,
467 #endif
468         EESR_ECI  = 0x00400000,
469         EESR_FTC  = 0x00200000, EESR_TDE  = 0x00100000,
470         EESR_TFE  = 0x00080000, EESR_FRC  = 0x00040000,
471         EESR_RDE  = 0x00020000, EESR_RFE  = 0x00010000,
472 #if defined(SH_ETH_TYPE_ETHER)
473         EESR_CND  = 0x00000800,
474 #endif
475         EESR_DLC  = 0x00000400,
476         EESR_CD   = 0x00000200, EESR_RTO  = 0x00000100,
477         EESR_RMAF = 0x00000080, EESR_CEEF = 0x00000040,
478         EESR_CELF = 0x00000020, EESR_RRF  = 0x00000010,
479         EESR_RTLF = 0x00000008, EESR_RTSF = 0x00000004,
480         EESR_PRE  = 0x00000002, EESR_CERF = 0x00000001,
481 };
482
483
484 #if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
485 # define TX_CHECK (EESR_TC1 | EESR_FTC)
486 # define EESR_ERR_CHECK (EESR_TWB | EESR_TABT | EESR_RABT | EESR_RDE \
487                 | EESR_RFRMER | EESR_TFE | EESR_TDE | EESR_ECI)
488 # define TX_ERROR_CEHCK (EESR_TWB | EESR_TABT | EESR_TDE | EESR_TFE)
489
490 #else
491 # define TX_CHECK (EESR_FTC | EESR_CND | EESR_DLC | EESR_CD | EESR_RTO)
492 # define EESR_ERR_CHECK (EESR_TWB | EESR_TABT | EESR_RABT | EESR_RDE \
493                 | EESR_RFRMER | EESR_ADE | EESR_TFE | EESR_TDE | EESR_ECI)
494 # define TX_ERROR_CEHCK (EESR_TWB | EESR_TABT | EESR_ADE | EESR_TDE | EESR_TFE)
495 #endif
496
497 /* EESIPR */
498 enum DMAC_IM_BIT {
499         DMAC_M_TWB = 0x40000000, DMAC_M_TABT = 0x04000000,
500         DMAC_M_RABT = 0x02000000,
501         DMAC_M_RFRMER = 0x01000000, DMAC_M_ADF = 0x00800000,
502         DMAC_M_ECI = 0x00400000, DMAC_M_FTC = 0x00200000,
503         DMAC_M_TDE = 0x00100000, DMAC_M_TFE = 0x00080000,
504         DMAC_M_FRC = 0x00040000, DMAC_M_RDE = 0x00020000,
505         DMAC_M_RFE = 0x00010000, DMAC_M_TINT4 = 0x00000800,
506         DMAC_M_TINT3 = 0x00000400, DMAC_M_TINT2 = 0x00000200,
507         DMAC_M_TINT1 = 0x00000100, DMAC_M_RINT8 = 0x00000080,
508         DMAC_M_RINT5 = 0x00000010, DMAC_M_RINT4 = 0x00000008,
509         DMAC_M_RINT3 = 0x00000004, DMAC_M_RINT2 = 0x00000002,
510         DMAC_M_RINT1 = 0x00000001,
511 };
512
513 /* Receive descriptor bit */
514 enum RD_STS_BIT {
515         RD_RACT = 0x80000000, RD_RDLE = 0x40000000,
516         RD_RFP1 = 0x20000000, RD_RFP0 = 0x10000000,
517         RD_RFE = 0x08000000, RD_RFS10 = 0x00000200,
518         RD_RFS9 = 0x00000100, RD_RFS8 = 0x00000080,
519         RD_RFS7 = 0x00000040, RD_RFS6 = 0x00000020,
520         RD_RFS5 = 0x00000010, RD_RFS4 = 0x00000008,
521         RD_RFS3 = 0x00000004, RD_RFS2 = 0x00000002,
522         RD_RFS1 = 0x00000001,
523 };
524 #define RDF1ST  RD_RFP1
525 #define RDFEND  RD_RFP0
526 #define RD_RFP  (RD_RFP1|RD_RFP0)
527
528 /* RDFFR*/
529 enum RDFFR_BIT {
530         RDFFR_RDLF = 0x01,
531 };
532
533 /* FCFTR */
534 enum FCFTR_BIT {
535         FCFTR_RFF2 = 0x00040000, FCFTR_RFF1 = 0x00020000,
536         FCFTR_RFF0 = 0x00010000, FCFTR_RFD2 = 0x00000004,
537         FCFTR_RFD1 = 0x00000002, FCFTR_RFD0 = 0x00000001,
538 };
539 #define FIFO_F_D_RFF    (FCFTR_RFF2|FCFTR_RFF1|FCFTR_RFF0)
540 #define FIFO_F_D_RFD    (FCFTR_RFD2|FCFTR_RFD1|FCFTR_RFD0)
541
542 /* Transfer descriptor bit */
543 enum TD_STS_BIT {
544 #if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_ETHER) || \
545         defined(SH_ETH_TYPE_RZ)
546         TD_TACT = 0x80000000,
547 #else
548         TD_TACT = 0x7fffffff,
549 #endif
550         TD_TDLE = 0x40000000, TD_TFP1 = 0x20000000,
551         TD_TFP0 = 0x10000000,
552 };
553 #define TDF1ST  TD_TFP1
554 #define TDFEND  TD_TFP0
555 #define TD_TFP  (TD_TFP1|TD_TFP0)
556
557 /* RMCR */
558 enum RECV_RST_BIT { RMCR_RST = 0x01, };
559 /* ECMR */
560 enum FELIC_MODE_BIT {
561 #if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
562         ECMR_TRCCM = 0x04000000, ECMR_RCSC = 0x00800000,
563         ECMR_DPAD = 0x00200000, ECMR_RZPF = 0x00100000,
564 #endif
565         ECMR_ZPF = 0x00080000, ECMR_PFR = 0x00040000, ECMR_RXF = 0x00020000,
566         ECMR_TXF = 0x00010000, ECMR_MCT = 0x00002000, ECMR_PRCEF = 0x00001000,
567         ECMR_PMDE = 0x00000200, ECMR_RE = 0x00000040, ECMR_TE = 0x00000020,
568         ECMR_ILB = 0x00000008, ECMR_ELB = 0x00000004, ECMR_DM = 0x00000002,
569         ECMR_PRM = 0x00000001,
570 #ifdef CONFIG_CPU_SH7724
571         ECMR_RTM = 0x00000010,
572 #elif defined(CONFIG_R8A7790) || defined(CONFIG_R8A7791)
573         ECMR_RTM = 0x00000004,
574 #endif
575
576 };
577
578 #if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
579 #define ECMR_CHG_DM (ECMR_TRCCM | ECMR_RZPF | ECMR_ZPF | ECMR_PFR | \
580                         ECMR_RXF | ECMR_TXF | ECMR_MCT)
581 #elif defined(SH_ETH_TYPE_ETHER)
582 #define ECMR_CHG_DM (ECMR_ZPF | ECMR_PFR | ECMR_RXF | ECMR_TXF)
583 #else
584 #define ECMR_CHG_DM     (ECMR_ZPF | ECMR_PFR | ECMR_RXF | ECMR_TXF | ECMR_MCT)
585 #endif
586
587 /* ECSR */
588 enum ECSR_STATUS_BIT {
589 #if defined(SH_ETH_TYPE_ETHER)
590         ECSR_BRCRX = 0x20, ECSR_PSRTO = 0x10,
591 #endif
592         ECSR_LCHNG = 0x04,
593         ECSR_MPD = 0x02, ECSR_ICD = 0x01,
594 };
595
596 #if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
597 # define ECSR_INIT (ECSR_ICD | ECSIPR_MPDIP)
598 #else
599 # define ECSR_INIT (ECSR_BRCRX | ECSR_PSRTO | \
600                         ECSR_LCHNG | ECSR_ICD | ECSIPR_MPDIP)
601 #endif
602
603 /* ECSIPR */
604 enum ECSIPR_STATUS_MASK_BIT {
605 #if defined(SH_ETH_TYPE_ETHER)
606         ECSIPR_BRCRXIP = 0x20,
607         ECSIPR_PSRTOIP = 0x10,
608 #elif defined(SH_ETY_TYPE_GETHER)
609         ECSIPR_PSRTOIP = 0x10,
610         ECSIPR_PHYIP = 0x08,
611 #endif
612         ECSIPR_LCHNGIP = 0x04,
613         ECSIPR_MPDIP = 0x02,
614         ECSIPR_ICDIP = 0x01,
615 };
616
617 #if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
618 # define ECSIPR_INIT (ECSIPR_LCHNGIP | ECSIPR_ICDIP | ECSIPR_MPDIP)
619 #else
620 # define ECSIPR_INIT (ECSIPR_BRCRXIP | ECSIPR_PSRTOIP | ECSIPR_LCHNGIP | \
621                                 ECSIPR_ICDIP | ECSIPR_MPDIP)
622 #endif
623
624 /* APR */
625 enum APR_BIT {
626         APR_AP = 0x00000004,
627 };
628
629 /* MPR */
630 enum MPR_BIT {
631         MPR_MP = 0x00000006,
632 };
633
634 /* TRSCER */
635 enum DESC_I_BIT {
636         DESC_I_TINT4 = 0x0800, DESC_I_TINT3 = 0x0400, DESC_I_TINT2 = 0x0200,
637         DESC_I_TINT1 = 0x0100, DESC_I_RINT8 = 0x0080, DESC_I_RINT5 = 0x0010,
638         DESC_I_RINT4 = 0x0008, DESC_I_RINT3 = 0x0004, DESC_I_RINT2 = 0x0002,
639         DESC_I_RINT1 = 0x0001,
640 };
641
642 /* RPADIR */
643 enum RPADIR_BIT {
644         RPADIR_PADS1 = 0x20000, RPADIR_PADS0 = 0x10000,
645         RPADIR_PADR = 0x0003f,
646 };
647
648 #if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
649 # define RPADIR_INIT (0x00)
650 #else
651 # define RPADIR_INIT (RPADIR_PADS1)
652 #endif
653
654 /* FDR */
655 enum FIFO_SIZE_BIT {
656         FIFO_SIZE_T = 0x00000700, FIFO_SIZE_R = 0x00000007,
657 };
658
659 static inline unsigned long sh_eth_reg_addr(struct sh_eth_dev *eth,
660                                             int enum_index)
661 {
662 #if defined(SH_ETH_TYPE_GETHER)
663         const u16 *reg_offset = sh_eth_offset_gigabit;
664 #elif defined(SH_ETH_TYPE_ETHER)
665         const u16 *reg_offset = sh_eth_offset_fast_sh4;
666 #elif defined(SH_ETH_TYPE_RZ)
667         const u16 *reg_offset = sh_eth_offset_rz;
668 #else
669 #error
670 #endif
671         return BASE_IO_ADDR + reg_offset[enum_index] + 0x800 * eth->port;
672 }
673
674 static inline void sh_eth_write(struct sh_eth_dev *eth, unsigned long data,
675                                 int enum_index)
676 {
677         outl(data, sh_eth_reg_addr(eth, enum_index));
678 }
679
680 static inline unsigned long sh_eth_read(struct sh_eth_dev *eth,
681                                         int enum_index)
682 {
683         return inl(sh_eth_reg_addr(eth, enum_index));
684 }