1
2
3
4
5
6
7
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
17
18#define ADDR_TO_P2(addr) ((((uintptr_t)(addr) & ~0xe0000000) | 0xa0000000))
19
20
21#if defined(CONFIG_SH_32BIT)
22#define ADDR_TO_PHY(addr) ((((uintptr_t)(addr) & ~0xe0000000) | 0x40000000))
23#else
24#define ADDR_TO_PHY(addr) ((uintptr_t)(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) ((uintptr_t)(addr))
32#define ADDR_TO_P2(addr) (addr)
33#endif
34
35
36#ifndef CONFIG_SH_ETHER_ALIGNE_SIZE
37#define CONFIG_SH_ETHER_ALIGNE_SIZE 16
38#endif
39
40
41#define MAX_PORT_NUM 2
42
43
44
45#define MAX_BUF_SIZE (48 * 32)
46
47
48
49
50#define NUM_TX_DESC 8
51
52
53
54#define TX_DESC_PADDING (CONFIG_SH_ETHER_ALIGNE_SIZE - 12)
55
56
57struct tx_desc_s {
58 volatile u32 td0;
59 u32 td1;
60 u32 td2;
61 u8 padding[TX_DESC_PADDING];
62};
63
64
65#define NUM_RX_DESC 8
66
67
68
69#define RX_DESC_PADDING (CONFIG_SH_ETHER_ALIGNE_SIZE - 12)
70
71#define RX_BUF_ALIGNE_SIZE (CONFIG_SH_ETHER_ALIGNE_SIZE > 32 ? 64 : 32)
72
73
74struct rx_desc_s {
75 volatile u32 rd0;
76 volatile u32 rd1;
77 u32 rd2;
78 u8 padding[TX_DESC_PADDING];
79};
80
81struct 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
97struct sh_eth_dev {
98 int port;
99 struct sh_eth_info port_info[MAX_PORT_NUM];
100};
101
102
103enum {
104
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
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,
168 MAFCR,
169 RTRATE,
170 CSMR,
171 RMII_MII,
172
173
174 SH_ETH_MAX_REGISTER_OFFSET,
175};
176
177static 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
231static const u16 sh_eth_offset_rz[SH_ETH_MAX_REGISTER_OFFSET] = {
232 [EDSR] = 0x0000,
233 [EDMR] = 0x0400,
234 [EDTRR] = 0x0408,
235 [EDRRR] = 0x0410,
236 [EESR] = 0x0428,
237 [EESIPR] = 0x0430,
238 [TDLAR] = 0x0010,
239 [TDFAR] = 0x0014,
240 [TDFXR] = 0x0018,
241 [TDFFR] = 0x001c,
242 [RDLAR] = 0x0030,
243 [RDFAR] = 0x0034,
244 [RDFXR] = 0x0038,
245 [RDFFR] = 0x003c,
246 [TRSCER] = 0x0438,
247 [RMFCR] = 0x0440,
248 [TFTR] = 0x0448,
249 [FDR] = 0x0450,
250 [RMCR] = 0x0458,
251 [RPADIR] = 0x0460,
252 [FCFTR] = 0x0468,
253 [CSMR] = 0x04E4,
254
255 [ECMR] = 0x0500,
256 [ECSR] = 0x0510,
257 [ECSIPR] = 0x0518,
258 [PIR] = 0x0520,
259 [PSR] = 0x0528,
260 [PIPR] = 0x052c,
261 [RFLR] = 0x0508,
262 [APR] = 0x0554,
263 [MPR] = 0x0558,
264 [PFTCR] = 0x055c,
265 [PFRCR] = 0x0560,
266 [TPAUSER] = 0x0564,
267 [GECMR] = 0x05b0,
268 [BCULR] = 0x05b4,
269 [MAHR] = 0x05c0,
270 [MALR] = 0x05c8,
271 [TROCR] = 0x0700,
272 [CDCR] = 0x0708,
273 [LCCR] = 0x0710,
274 [CEFCR] = 0x0740,
275 [FRECR] = 0x0748,
276 [TSFRCR] = 0x0750,
277 [TLFRCR] = 0x0758,
278 [RFCR] = 0x0760,
279 [CERCR] = 0x0768,
280 [CEECR] = 0x0770,
281 [MAFCR] = 0x0778,
282 [RMII_MII] = 0x0790,
283};
284
285static const u16 sh_eth_offset_fast_sh4[SH_ETH_MAX_REGISTER_OFFSET] = {
286 [ECMR] = 0x0100,
287 [RFLR] = 0x0108,
288 [ECSR] = 0x0110,
289 [ECSIPR] = 0x0118,
290 [PIR] = 0x0120,
291 [PSR] = 0x0128,
292 [RDMLR] = 0x0140,
293 [IPGR] = 0x0150,
294 [APR] = 0x0154,
295 [MPR] = 0x0158,
296 [TPAUSER] = 0x0164,
297 [RFCF] = 0x0160,
298 [TPAUSECR] = 0x0168,
299 [BCFRR] = 0x016c,
300 [MAHR] = 0x01c0,
301 [MALR] = 0x01c8,
302 [TROCR] = 0x01d0,
303 [CDCR] = 0x01d4,
304 [LCCR] = 0x01d8,
305 [CNDCR] = 0x01dc,
306 [CEFCR] = 0x01e4,
307 [FRECR] = 0x01e8,
308 [TSFRCR] = 0x01ec,
309 [TLFRCR] = 0x01f0,
310 [RFCR] = 0x01f4,
311 [MAFCR] = 0x01f8,
312 [RTRATE] = 0x01fc,
313
314 [EDMR] = 0x0000,
315 [EDTRR] = 0x0008,
316 [EDRRR] = 0x0010,
317 [TDLAR] = 0x0018,
318 [RDLAR] = 0x0020,
319 [EESR] = 0x0028,
320 [EESIPR] = 0x0030,
321 [TRSCER] = 0x0038,
322 [RMFCR] = 0x0040,
323 [TFTR] = 0x0048,
324 [FDR] = 0x0050,
325 [RMCR] = 0x0058,
326 [TFUCR] = 0x0064,
327 [RFOCR] = 0x0068,
328 [RMIIMR] = 0x006C,
329 [FCFTR] = 0x0070,
330 [RPADIR] = 0x0078,
331 [TRIMD] = 0x007c,
332 [RBWAR] = 0x00c8,
333 [RDFAR] = 0x00cc,
334 [TBRAR] = 0x00d4,
335 [TDFAR] = 0x00d8,
336};
337
338
339#if defined(CONFIG_CPU_SH7763) || defined(CONFIG_CPU_SH7734)
340#define SH_ETH_TYPE_GETHER
341#define BASE_IO_ADDR 0xfee00000
342#elif defined(CONFIG_CPU_SH7757) || \
343 defined(CONFIG_CPU_SH7752) || \
344 defined(CONFIG_CPU_SH7753)
345#if defined(CONFIG_SH_ETHER_USE_GETHER)
346#define SH_ETH_TYPE_GETHER
347#define BASE_IO_ADDR 0xfee00000
348#else
349#define SH_ETH_TYPE_ETHER
350#define BASE_IO_ADDR 0xfef00000
351#endif
352#elif defined(CONFIG_R8A7740)
353#define SH_ETH_TYPE_GETHER
354#define BASE_IO_ADDR 0xE9A00000
355#elif defined(CONFIG_RCAR_GEN2)
356#define SH_ETH_TYPE_ETHER
357#define BASE_IO_ADDR 0xEE700200
358#elif defined(CONFIG_R7S72100)
359#define SH_ETH_TYPE_RZ
360#define BASE_IO_ADDR 0xE8203000
361#elif defined(CONFIG_R8A77980)
362#define SH_ETH_TYPE_GETHER
363#define BASE_IO_ADDR 0xE7400000
364#endif
365
366
367
368
369
370#if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
371
372enum EDSR_BIT {
373 EDSR_ENT = 0x01, EDSR_ENR = 0x02,
374};
375#define EDSR_ENALL (EDSR_ENT|EDSR_ENR)
376#endif
377
378
379enum DMAC_M_BIT {
380 EDMR_NBST = 0x80,
381 EDMR_DL1 = 0x20, EDMR_DL0 = 0x10,
382#if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
383 EDMR_SRST = 0x03,
384 EMDR_DESC_R = 0x30,
385 EDMR_EL = 0x40,
386#elif defined(SH_ETH_TYPE_ETHER)
387 EDMR_SRST = 0x01,
388 EMDR_DESC_R = 0x30,
389 EDMR_EL = 0x40,
390#else
391 EDMR_SRST = 0x01,
392#endif
393};
394
395#if CONFIG_SH_ETHER_ALIGNE_SIZE == 64
396# define EMDR_DESC EDMR_DL1
397#elif CONFIG_SH_ETHER_ALIGNE_SIZE == 32
398# define EMDR_DESC EDMR_DL0
399#elif CONFIG_SH_ETHER_ALIGNE_SIZE == 16
400# define EMDR_DESC 0
401#endif
402
403
404#define RFLR_RFL_MIN 0x05EE
405
406
407enum DMAC_T_BIT {
408#if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
409 EDTRR_TRNS = 0x03,
410#else
411 EDTRR_TRNS = 0x01,
412#endif
413};
414
415
416enum GECMR_BIT {
417#if defined(CONFIG_CPU_SH7757) || \
418 defined(CONFIG_CPU_SH7752) || \
419 defined(CONFIG_CPU_SH7753)
420 GECMR_1000B = 0x20, GECMR_100B = 0x01, GECMR_10B = 0x00,
421#else
422 GECMR_1000B = 0x01, GECMR_100B = 0x04, GECMR_10B = 0x00,
423#endif
424};
425
426
427enum EDRRR_R_BIT {
428 EDRRR_R = 0x01,
429};
430
431
432enum TPAUSER_BIT {
433 TPAUSER_TPAUSE = 0x0000ffff,
434 TPAUSER_UNLIMITED = 0,
435};
436
437
438enum BCFR_BIT {
439 BCFR_RPAUSE = 0x0000ffff,
440 BCFR_UNLIMITED = 0,
441};
442
443
444enum PIR_BIT {
445 PIR_MDI = 0x08, PIR_MDO = 0x04, PIR_MMD = 0x02, PIR_MDC = 0x01,
446};
447
448
449enum PHY_STATUS_BIT { PHY_ST_LINK = 0x01, };
450
451
452enum EESR_BIT {
453#if defined(SH_ETH_TYPE_ETHER)
454 EESR_TWB = 0x40000000,
455#else
456 EESR_TWB = 0xC0000000,
457 EESR_TC1 = 0x20000000,
458 EESR_TUC = 0x10000000,
459 EESR_ROC = 0x80000000,
460#endif
461 EESR_TABT = 0x04000000,
462 EESR_RABT = 0x02000000, EESR_RFRMER = 0x01000000,
463#if defined(SH_ETH_TYPE_ETHER)
464 EESR_ADE = 0x00800000,
465#endif
466 EESR_ECI = 0x00400000,
467 EESR_FTC = 0x00200000, EESR_TDE = 0x00100000,
468 EESR_TFE = 0x00080000, EESR_FRC = 0x00040000,
469 EESR_RDE = 0x00020000, EESR_RFE = 0x00010000,
470#if defined(SH_ETH_TYPE_ETHER)
471 EESR_CND = 0x00000800,
472#endif
473 EESR_DLC = 0x00000400,
474 EESR_CD = 0x00000200, EESR_RTO = 0x00000100,
475 EESR_RMAF = 0x00000080, EESR_CEEF = 0x00000040,
476 EESR_CELF = 0x00000020, EESR_RRF = 0x00000010,
477 EESR_RTLF = 0x00000008, EESR_RTSF = 0x00000004,
478 EESR_PRE = 0x00000002, EESR_CERF = 0x00000001,
479};
480
481
482#if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
483# define TX_CHECK (EESR_TC1 | EESR_FTC)
484# define EESR_ERR_CHECK (EESR_TWB | EESR_TABT | EESR_RABT | EESR_RDE \
485 | EESR_RFRMER | EESR_TFE | EESR_TDE | EESR_ECI)
486# define TX_ERROR_CEHCK (EESR_TWB | EESR_TABT | EESR_TDE | EESR_TFE)
487
488#else
489# define TX_CHECK (EESR_FTC | EESR_CND | EESR_DLC | EESR_CD | EESR_RTO)
490# define EESR_ERR_CHECK (EESR_TWB | EESR_TABT | EESR_RABT | EESR_RDE \
491 | EESR_RFRMER | EESR_ADE | EESR_TFE | EESR_TDE | EESR_ECI)
492# define TX_ERROR_CEHCK (EESR_TWB | EESR_TABT | EESR_ADE | EESR_TDE | EESR_TFE)
493#endif
494
495
496enum DMAC_IM_BIT {
497 DMAC_M_TWB = 0x40000000, DMAC_M_TABT = 0x04000000,
498 DMAC_M_RABT = 0x02000000,
499 DMAC_M_RFRMER = 0x01000000, DMAC_M_ADF = 0x00800000,
500 DMAC_M_ECI = 0x00400000, DMAC_M_FTC = 0x00200000,
501 DMAC_M_TDE = 0x00100000, DMAC_M_TFE = 0x00080000,
502 DMAC_M_FRC = 0x00040000, DMAC_M_RDE = 0x00020000,
503 DMAC_M_RFE = 0x00010000, DMAC_M_TINT4 = 0x00000800,
504 DMAC_M_TINT3 = 0x00000400, DMAC_M_TINT2 = 0x00000200,
505 DMAC_M_TINT1 = 0x00000100, DMAC_M_RINT8 = 0x00000080,
506 DMAC_M_RINT5 = 0x00000010, DMAC_M_RINT4 = 0x00000008,
507 DMAC_M_RINT3 = 0x00000004, DMAC_M_RINT2 = 0x00000002,
508 DMAC_M_RINT1 = 0x00000001,
509};
510
511
512enum RD_STS_BIT {
513 RD_RACT = 0x80000000, RD_RDLE = 0x40000000,
514 RD_RFP1 = 0x20000000, RD_RFP0 = 0x10000000,
515 RD_RFE = 0x08000000, RD_RFS10 = 0x00000200,
516 RD_RFS9 = 0x00000100, RD_RFS8 = 0x00000080,
517 RD_RFS7 = 0x00000040, RD_RFS6 = 0x00000020,
518 RD_RFS5 = 0x00000010, RD_RFS4 = 0x00000008,
519 RD_RFS3 = 0x00000004, RD_RFS2 = 0x00000002,
520 RD_RFS1 = 0x00000001,
521};
522#define RDF1ST RD_RFP1
523#define RDFEND RD_RFP0
524#define RD_RFP (RD_RFP1|RD_RFP0)
525
526
527enum RDFFR_BIT {
528 RDFFR_RDLF = 0x01,
529};
530
531
532enum FCFTR_BIT {
533 FCFTR_RFF2 = 0x00040000, FCFTR_RFF1 = 0x00020000,
534 FCFTR_RFF0 = 0x00010000, FCFTR_RFD2 = 0x00000004,
535 FCFTR_RFD1 = 0x00000002, FCFTR_RFD0 = 0x00000001,
536};
537#define FIFO_F_D_RFF (FCFTR_RFF2|FCFTR_RFF1|FCFTR_RFF0)
538#define FIFO_F_D_RFD (FCFTR_RFD2|FCFTR_RFD1|FCFTR_RFD0)
539
540
541enum TD_STS_BIT {
542#if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_ETHER) || \
543 defined(SH_ETH_TYPE_RZ)
544 TD_TACT = 0x80000000,
545#else
546 TD_TACT = 0x7fffffff,
547#endif
548 TD_TDLE = 0x40000000, TD_TFP1 = 0x20000000,
549 TD_TFP0 = 0x10000000,
550};
551#define TDF1ST TD_TFP1
552#define TDFEND TD_TFP0
553#define TD_TFP (TD_TFP1|TD_TFP0)
554
555
556enum RECV_RST_BIT { RMCR_RST = 0x01, };
557
558enum FELIC_MODE_BIT {
559#if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
560 ECMR_TRCCM = 0x04000000, ECMR_RCSC = 0x00800000,
561 ECMR_DPAD = 0x00200000, ECMR_RZPF = 0x00100000,
562#endif
563 ECMR_ZPF = 0x00080000, ECMR_PFR = 0x00040000, ECMR_RXF = 0x00020000,
564 ECMR_TXF = 0x00010000, ECMR_MCT = 0x00002000, ECMR_PRCEF = 0x00001000,
565 ECMR_PMDE = 0x00000200, ECMR_RE = 0x00000040, ECMR_TE = 0x00000020,
566 ECMR_ILB = 0x00000008, ECMR_ELB = 0x00000004, ECMR_DM = 0x00000002,
567 ECMR_PRM = 0x00000001,
568#ifdef CONFIG_CPU_SH7724
569 ECMR_RTM = 0x00000010,
570#elif defined(CONFIG_RCAR_GEN2) || defined (CONFIG_R8A77980)
571 ECMR_RTM = 0x00000004,
572#endif
573
574};
575
576#if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
577#define ECMR_CHG_DM (ECMR_TRCCM | ECMR_RZPF | ECMR_ZPF | ECMR_PFR | \
578 ECMR_RXF | ECMR_TXF | ECMR_MCT)
579#elif defined(SH_ETH_TYPE_ETHER)
580#define ECMR_CHG_DM (ECMR_ZPF | ECMR_PFR | ECMR_RXF | ECMR_TXF)
581#else
582#define ECMR_CHG_DM (ECMR_ZPF | ECMR_PFR | ECMR_RXF | ECMR_TXF | ECMR_MCT)
583#endif
584
585
586enum ECSR_STATUS_BIT {
587#if defined(SH_ETH_TYPE_ETHER)
588 ECSR_BRCRX = 0x20, ECSR_PSRTO = 0x10,
589#endif
590 ECSR_LCHNG = 0x04,
591 ECSR_MPD = 0x02, ECSR_ICD = 0x01,
592};
593
594#if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
595# define ECSR_INIT (ECSR_ICD | ECSIPR_MPDIP)
596#else
597# define ECSR_INIT (ECSR_BRCRX | ECSR_PSRTO | \
598 ECSR_LCHNG | ECSR_ICD | ECSIPR_MPDIP)
599#endif
600
601
602enum ECSIPR_STATUS_MASK_BIT {
603#if defined(SH_ETH_TYPE_ETHER)
604 ECSIPR_BRCRXIP = 0x20,
605 ECSIPR_PSRTOIP = 0x10,
606#elif defined(SH_ETY_TYPE_GETHER)
607 ECSIPR_PSRTOIP = 0x10,
608 ECSIPR_PHYIP = 0x08,
609#endif
610 ECSIPR_LCHNGIP = 0x04,
611 ECSIPR_MPDIP = 0x02,
612 ECSIPR_ICDIP = 0x01,
613};
614
615#if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
616# define ECSIPR_INIT (ECSIPR_LCHNGIP | ECSIPR_ICDIP | ECSIPR_MPDIP)
617#else
618# define ECSIPR_INIT (ECSIPR_BRCRXIP | ECSIPR_PSRTOIP | ECSIPR_LCHNGIP | \
619 ECSIPR_ICDIP | ECSIPR_MPDIP)
620#endif
621
622
623enum APR_BIT {
624 APR_AP = 0x00000004,
625};
626
627
628enum MPR_BIT {
629 MPR_MP = 0x00000006,
630};
631
632
633enum DESC_I_BIT {
634 DESC_I_TINT4 = 0x0800, DESC_I_TINT3 = 0x0400, DESC_I_TINT2 = 0x0200,
635 DESC_I_TINT1 = 0x0100, DESC_I_RINT8 = 0x0080, DESC_I_RINT5 = 0x0010,
636 DESC_I_RINT4 = 0x0008, DESC_I_RINT3 = 0x0004, DESC_I_RINT2 = 0x0002,
637 DESC_I_RINT1 = 0x0001,
638};
639
640
641enum RPADIR_BIT {
642 RPADIR_PADS1 = 0x20000, RPADIR_PADS0 = 0x10000,
643 RPADIR_PADR = 0x0003f,
644};
645
646#if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
647# define RPADIR_INIT (0x00)
648#else
649# define RPADIR_INIT (RPADIR_PADS1)
650#endif
651
652
653enum FIFO_SIZE_BIT {
654 FIFO_SIZE_T = 0x00000700, FIFO_SIZE_R = 0x00000007,
655};
656
657static inline unsigned long sh_eth_reg_addr(struct sh_eth_info *port,
658 int enum_index)
659{
660#if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
661 const u16 *reg_offset = sh_eth_offset_gigabit;
662#elif defined(SH_ETH_TYPE_ETHER)
663 const u16 *reg_offset = sh_eth_offset_fast_sh4;
664#elif defined(SH_ETH_TYPE_RZ)
665 const u16 *reg_offset = sh_eth_offset_rz;
666#else
667#error
668#endif
669 return (unsigned long)port->iobase + reg_offset[enum_index];
670}
671
672static inline void sh_eth_write(struct sh_eth_info *port, unsigned long data,
673 int enum_index)
674{
675 outl(data, sh_eth_reg_addr(port, enum_index));
676}
677
678static inline unsigned long sh_eth_read(struct sh_eth_info *port,
679 int enum_index)
680{
681 return inl(sh_eth_reg_addr(port, enum_index));
682}
683