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