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