blob: 2345c343689f8c33255adb64a0f25715de1f218d [file] [log] [blame]
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +09001/*
Robert P. J. Day1cc0a9f2016-05-04 04:47:31 -04002 * sh_eth.h - Driver for Renesas SuperH ethernet controller.
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +09003 *
Nobuhiro Iwamatsudcd5a592012-08-02 22:08:40 +00004 * Copyright (C) 2008 - 2012 Renesas Solutions Corp.
5 * Copyright (c) 2008 - 2012 Nobuhiro Iwamatsu
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +09006 * Copyright (c) 2007 Carlos Munoz <carlos@kenati.com>
7 *
Wolfgang Denk1a459662013-07-08 09:37:19 +02008 * SPDX-License-Identifier: GPL-2.0+
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +09009 */
10
Nobuhiro Iwamatsubd3980c2008-11-21 12:04:18 +090011#include <netdev.h>
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +090012#include <asm/types.h>
13
14#define SHETHER_NAME "sh_eth"
15
Nobuhiro Iwamatsudcd5a592012-08-02 22:08:40 +000016#if defined(CONFIG_SH)
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +090017/* 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 */
Yoshihiro Shimoda903de462011-01-18 17:53:45 +090022#if defined(CONFIG_SH_32BIT)
23#define ADDR_TO_PHY(addr) ((((int)(addr) & ~0xe0000000) | 0x40000000))
24#else
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +090025#define ADDR_TO_PHY(addr) ((int)(addr) & ~0xe0000000)
Yoshihiro Shimoda903de462011-01-18 17:53:45 +090026#endif
Nobuhiro Iwamatsudcd5a592012-08-02 22:08:40 +000027#elif defined(CONFIG_ARM)
Chris Brandt5ad565b2017-11-03 08:30:11 -050028#ifndef inl
29#define inl readl
Nobuhiro Iwamatsudcd5a592012-08-02 22:08:40 +000030#define outl writel
Chris Brandt5ad565b2017-11-03 08:30:11 -050031#endif
Nobuhiro Iwamatsudcd5a592012-08-02 22:08:40 +000032#define ADDR_TO_PHY(addr) ((int)(addr))
33#define ADDR_TO_P2(addr) (addr)
34#endif /* defined(CONFIG_SH) */
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +090035
Nobuhiro Iwamatsuf8b75072013-08-22 13:22:02 +090036/* base padding size is 16 */
37#ifndef CONFIG_SH_ETHER_ALIGNE_SIZE
38#define CONFIG_SH_ETHER_ALIGNE_SIZE 16
39#endif
40
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +090041/* Number of supported ports */
42#define MAX_PORT_NUM 2
43
44/* Buffers must be big enough to hold the largest ethernet frame. Also, rx
45 buffers must be a multiple of 32 bytes */
46#define MAX_BUF_SIZE (48 * 32)
47
48/* The number of tx descriptors must be large enough to point to 5 or more
49 frames. If each frame uses 2 descriptors, at least 10 descriptors are needed.
50 We use one descriptor per frame */
51#define NUM_TX_DESC 8
52
53/* The size of the tx descriptor is determined by how much padding is used.
54 4, 20, or 52 bytes of padding can be used */
Nobuhiro Iwamatsuf8b75072013-08-22 13:22:02 +090055#define TX_DESC_PADDING (CONFIG_SH_ETHER_ALIGNE_SIZE - 12)
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +090056
Nobuhiro Iwamatsubd3980c2008-11-21 12:04:18 +090057/* Tx descriptor. We always use 3 bytes of padding */
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +090058struct tx_desc_s {
59 volatile u32 td0;
60 u32 td1;
61 u32 td2; /* Buffer start */
Nobuhiro Iwamatsuf8b75072013-08-22 13:22:02 +090062 u8 padding[TX_DESC_PADDING]; /* aligned cache line size */
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +090063};
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 */
Nobuhiro Iwamatsuf8b75072013-08-22 13:22:02 +090070#define RX_DESC_PADDING (CONFIG_SH_ETHER_ALIGNE_SIZE - 12)
Nobuhiro Iwamatsuf8b75072013-08-22 13:22:02 +090071/* aligned cache line size */
72#define RX_BUF_ALIGNE_SIZE (CONFIG_SH_ETHER_ALIGNE_SIZE > 32 ? 64 : 32)
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +090073
74/* Rx descriptor. We always use 4 bytes of padding */
75struct rx_desc_s {
76 volatile u32 rd0;
77 volatile u32 rd1;
78 u32 rd2; /* Buffer start */
Nobuhiro Iwamatsuf8b75072013-08-22 13:22:02 +090079 u8 padding[TX_DESC_PADDING]; /* aligned cache line size */
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +090080};
81
Nobuhiro Iwamatsubd3980c2008-11-21 12:04:18 +090082struct sh_eth_info {
Nobuhiro Iwamatsu000889c2014-11-04 09:15:47 +090083 struct tx_desc_s *tx_desc_alloc;
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +090084 struct tx_desc_s *tx_desc_base;
85 struct tx_desc_s *tx_desc_cur;
Nobuhiro Iwamatsu000889c2014-11-04 09:15:47 +090086 struct rx_desc_s *rx_desc_alloc;
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +090087 struct rx_desc_s *rx_desc_base;
88 struct rx_desc_s *rx_desc_cur;
Nobuhiro Iwamatsu000889c2014-11-04 09:15:47 +090089 u8 *rx_buf_alloc;
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +090090 u8 *rx_buf_base;
91 u8 mac_addr[6];
92 u8 phy_addr;
Nobuhiro Iwamatsubd3980c2008-11-21 12:04:18 +090093 struct eth_device *dev;
Yoshihiro Shimodabd1024b2011-10-11 18:10:14 +090094 struct phy_device *phydev;
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +090095};
96
Nobuhiro Iwamatsubd3980c2008-11-21 12:04:18 +090097struct sh_eth_dev {
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +090098 int port;
Nobuhiro Iwamatsubd3980c2008-11-21 12:04:18 +090099 struct sh_eth_info port_info[MAX_PORT_NUM];
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +0900100};
101
Yoshihiro Shimoda49afb8c2012-06-26 16:38:09 +0000102/* from linux/drivers/net/ethernet/renesas/sh_eth.h */
103enum {
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,
Nobuhiro Iwamatsu87076782013-08-22 13:22:04 +0900167 RMIIMR, /* R8A7790 */
Yoshihiro Shimoda49afb8c2012-06-26 16:38:09 +0000168 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
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
Nobuhiro Iwamatsu62cbddc2014-01-23 07:52:18 +0900231#if defined(SH_ETH_TYPE_RZ)
232static const u16 sh_eth_offset_rz[SH_ETH_MAX_REGISTER_OFFSET] = {
233 [EDSR] = 0x0000,
234 [EDMR] = 0x0400,
235 [EDTRR] = 0x0408,
236 [EDRRR] = 0x0410,
237 [EESR] = 0x0428,
238 [EESIPR] = 0x0430,
239 [TDLAR] = 0x0010,
240 [TDFAR] = 0x0014,
241 [TDFXR] = 0x0018,
242 [TDFFR] = 0x001c,
243 [RDLAR] = 0x0030,
244 [RDFAR] = 0x0034,
245 [RDFXR] = 0x0038,
246 [RDFFR] = 0x003c,
247 [TRSCER] = 0x0438,
248 [RMFCR] = 0x0440,
249 [TFTR] = 0x0448,
250 [FDR] = 0x0450,
251 [RMCR] = 0x0458,
252 [RPADIR] = 0x0460,
253 [FCFTR] = 0x0468,
254 [CSMR] = 0x04E4,
255
256 [ECMR] = 0x0500,
257 [ECSR] = 0x0510,
258 [ECSIPR] = 0x0518,
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#endif
285
Yoshihiro Shimoda49afb8c2012-06-26 16:38:09 +0000286static const u16 sh_eth_offset_fast_sh4[SH_ETH_MAX_REGISTER_OFFSET] = {
287 [ECMR] = 0x0100,
288 [RFLR] = 0x0108,
289 [ECSR] = 0x0110,
290 [ECSIPR] = 0x0118,
291 [PIR] = 0x0120,
292 [PSR] = 0x0128,
293 [RDMLR] = 0x0140,
294 [IPGR] = 0x0150,
295 [APR] = 0x0154,
296 [MPR] = 0x0158,
297 [TPAUSER] = 0x0164,
298 [RFCF] = 0x0160,
299 [TPAUSECR] = 0x0168,
300 [BCFRR] = 0x016c,
301 [MAHR] = 0x01c0,
302 [MALR] = 0x01c8,
303 [TROCR] = 0x01d0,
304 [CDCR] = 0x01d4,
305 [LCCR] = 0x01d8,
306 [CNDCR] = 0x01dc,
307 [CEFCR] = 0x01e4,
308 [FRECR] = 0x01e8,
309 [TSFRCR] = 0x01ec,
310 [TLFRCR] = 0x01f0,
311 [RFCR] = 0x01f4,
312 [MAFCR] = 0x01f8,
313 [RTRATE] = 0x01fc,
314
315 [EDMR] = 0x0000,
316 [EDTRR] = 0x0008,
317 [EDRRR] = 0x0010,
318 [TDLAR] = 0x0018,
319 [RDLAR] = 0x0020,
320 [EESR] = 0x0028,
321 [EESIPR] = 0x0030,
322 [TRSCER] = 0x0038,
323 [RMFCR] = 0x0040,
324 [TFTR] = 0x0048,
325 [FDR] = 0x0050,
326 [RMCR] = 0x0058,
327 [TFUCR] = 0x0064,
328 [RFOCR] = 0x0068,
Nobuhiro Iwamatsu87076782013-08-22 13:22:04 +0900329 [RMIIMR] = 0x006C,
Yoshihiro Shimoda49afb8c2012-06-26 16:38:09 +0000330 [FCFTR] = 0x0070,
331 [RPADIR] = 0x0078,
332 [TRIMD] = 0x007c,
333 [RBWAR] = 0x00c8,
334 [RDFAR] = 0x00cc,
335 [TBRAR] = 0x00d4,
336 [TDFAR] = 0x00d8,
337};
338
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +0900339/* Register Address */
Yoshihiro Shimoda49afb8c2012-06-26 16:38:09 +0000340#if defined(CONFIG_CPU_SH7763) || defined(CONFIG_CPU_SH7734)
Yoshihiro Shimoda26235092012-06-26 16:38:06 +0000341#define SH_ETH_TYPE_GETHER
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +0900342#define BASE_IO_ADDR 0xfee00000
Yoshihiro Shimoda3067f812013-12-18 16:04:04 +0900343#elif defined(CONFIG_CPU_SH7757) || \
344 defined(CONFIG_CPU_SH7752) || \
345 defined(CONFIG_CPU_SH7753)
Yoshihiro Shimoda631fea82012-06-26 16:38:11 +0000346#if defined(CONFIG_SH_ETHER_USE_GETHER)
347#define SH_ETH_TYPE_GETHER
348#define BASE_IO_ADDR 0xfee00000
349#else
Yoshihiro Shimoda26235092012-06-26 16:38:06 +0000350#define SH_ETH_TYPE_ETHER
Yoshihiro Shimoda903de462011-01-18 17:53:45 +0900351#define BASE_IO_ADDR 0xfef00000
Yoshihiro Shimoda631fea82012-06-26 16:38:11 +0000352#endif
Nobuhiro Iwamatsu3bb4cc32011-11-14 16:56:59 +0900353#elif defined(CONFIG_CPU_SH7724)
Yoshihiro Shimoda26235092012-06-26 16:38:06 +0000354#define SH_ETH_TYPE_ETHER
Nobuhiro Iwamatsu3bb4cc32011-11-14 16:56:59 +0900355#define BASE_IO_ADDR 0xA4600000
Nobuhiro Iwamatsudcd5a592012-08-02 22:08:40 +0000356#elif defined(CONFIG_R8A7740)
357#define SH_ETH_TYPE_GETHER
358#define BASE_IO_ADDR 0xE9A00000
Nobuhiro Iwamatsu17243742014-06-24 17:01:08 +0900359#elif defined(CONFIG_R8A7790) || defined(CONFIG_R8A7791) || \
Nobuhiro Iwamatsua341b7e2014-11-04 09:13:40 +0900360 defined(CONFIG_R8A7793) || defined(CONFIG_R8A7794)
Nobuhiro Iwamatsu87076782013-08-22 13:22:04 +0900361#define SH_ETH_TYPE_ETHER
362#define BASE_IO_ADDR 0xEE700200
Nobuhiro Iwamatsu62cbddc2014-01-23 07:52:18 +0900363#elif defined(CONFIG_R7S72100)
364#define SH_ETH_TYPE_RZ
365#define BASE_IO_ADDR 0xE8203000
Yoshihiro Shimoda903de462011-01-18 17:53:45 +0900366#endif
367
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +0900368/*
369 * Register's bits
370 * Copy from Linux driver source code
371 */
Nobuhiro Iwamatsu62cbddc2014-01-23 07:52:18 +0900372#if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +0900373/* EDSR */
374enum EDSR_BIT {
375 EDSR_ENT = 0x01, EDSR_ENR = 0x02,
376};
377#define EDSR_ENALL (EDSR_ENT|EDSR_ENR)
378#endif
379
380/* EDMR */
381enum DMAC_M_BIT {
382 EDMR_DL1 = 0x20, EDMR_DL0 = 0x10,
Nobuhiro Iwamatsu62cbddc2014-01-23 07:52:18 +0900383#if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
Nobuhiro Iwamatsuee6ec5d2012-02-02 21:28:49 +0000384 EDMR_SRST = 0x03, /* Receive/Send reset */
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +0900385 EMDR_DESC_R = 0x30, /* Descriptor reserve size */
386 EDMR_EL = 0x40, /* Litte endian */
Yoshihiro Shimoda26235092012-06-26 16:38:06 +0000387#elif defined(SH_ETH_TYPE_ETHER)
Yoshihiro Shimoda903de462011-01-18 17:53:45 +0900388 EDMR_SRST = 0x01,
389 EMDR_DESC_R = 0x30, /* Descriptor reserve size */
390 EDMR_EL = 0x40, /* Litte endian */
Yoshihiro Shimoda26235092012-06-26 16:38:06 +0000391#else
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +0900392 EDMR_SRST = 0x01,
393#endif
394};
395
Nobuhiro Iwamatsuf8b75072013-08-22 13:22:02 +0900396#if CONFIG_SH_ETHER_ALIGNE_SIZE == 64
397# define EMDR_DESC EDMR_DL1
398#elif CONFIG_SH_ETHER_ALIGNE_SIZE == 32
399# define EMDR_DESC EDMR_DL0
400#elif CONFIG_SH_ETHER_ALIGNE_SIZE == 16 /* Default */
401# define EMDR_DESC 0
402#endif
403
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +0900404/* RFLR */
405#define RFLR_RFL_MIN 0x05EE /* Recv Frame length 1518 byte */
406
407/* EDTRR */
408enum DMAC_T_BIT {
Nobuhiro Iwamatsu62cbddc2014-01-23 07:52:18 +0900409#if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +0900410 EDTRR_TRNS = 0x03,
411#else
412 EDTRR_TRNS = 0x01,
413#endif
414};
415
416/* GECMR */
417enum GECMR_BIT {
Yoshihiro Shimoda3067f812013-12-18 16:04:04 +0900418#if defined(CONFIG_CPU_SH7757) || \
419 defined(CONFIG_CPU_SH7752) || \
420 defined(CONFIG_CPU_SH7753)
Yoshihiro Shimoda631fea82012-06-26 16:38:11 +0000421 GECMR_1000B = 0x20, GECMR_100B = 0x01, GECMR_10B = 0x00,
422#else
Simon Munton09fcc8b2009-02-02 09:44:08 +0000423 GECMR_1000B = 0x01, GECMR_100B = 0x04, GECMR_10B = 0x00,
Yoshihiro Shimoda631fea82012-06-26 16:38:11 +0000424#endif
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +0900425};
426
427/* EDRRR*/
428enum EDRRR_R_BIT {
429 EDRRR_R = 0x01,
430};
431
432/* TPAUSER */
433enum TPAUSER_BIT {
434 TPAUSER_TPAUSE = 0x0000ffff,
435 TPAUSER_UNLIMITED = 0,
436};
437
438/* BCFR */
439enum BCFR_BIT {
440 BCFR_RPAUSE = 0x0000ffff,
441 BCFR_UNLIMITED = 0,
442};
443
444/* PIR */
445enum PIR_BIT {
446 PIR_MDI = 0x08, PIR_MDO = 0x04, PIR_MMD = 0x02, PIR_MDC = 0x01,
447};
448
449/* PSR */
450enum PHY_STATUS_BIT { PHY_ST_LINK = 0x01, };
451
452/* EESR */
453enum EESR_BIT {
Yoshihiro Shimoda26235092012-06-26 16:38:06 +0000454#if defined(SH_ETH_TYPE_ETHER)
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +0900455 EESR_TWB = 0x40000000,
456#else
457 EESR_TWB = 0xC0000000,
458 EESR_TC1 = 0x20000000,
459 EESR_TUC = 0x10000000,
460 EESR_ROC = 0x80000000,
461#endif
462 EESR_TABT = 0x04000000,
463 EESR_RABT = 0x02000000, EESR_RFRMER = 0x01000000,
Yoshihiro Shimoda26235092012-06-26 16:38:06 +0000464#if defined(SH_ETH_TYPE_ETHER)
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +0900465 EESR_ADE = 0x00800000,
466#endif
467 EESR_ECI = 0x00400000,
468 EESR_FTC = 0x00200000, EESR_TDE = 0x00100000,
469 EESR_TFE = 0x00080000, EESR_FRC = 0x00040000,
470 EESR_RDE = 0x00020000, EESR_RFE = 0x00010000,
Yoshihiro Shimoda26235092012-06-26 16:38:06 +0000471#if defined(SH_ETH_TYPE_ETHER)
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +0900472 EESR_CND = 0x00000800,
473#endif
474 EESR_DLC = 0x00000400,
475 EESR_CD = 0x00000200, EESR_RTO = 0x00000100,
476 EESR_RMAF = 0x00000080, EESR_CEEF = 0x00000040,
477 EESR_CELF = 0x00000020, EESR_RRF = 0x00000010,
Nobuhiro Iwamatsu1dbd7282014-01-23 07:52:20 +0900478 EESR_RTLF = 0x00000008, EESR_RTSF = 0x00000004,
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +0900479 EESR_PRE = 0x00000002, EESR_CERF = 0x00000001,
480};
481
482
Nobuhiro Iwamatsu62cbddc2014-01-23 07:52:18 +0900483#if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +0900484# define TX_CHECK (EESR_TC1 | EESR_FTC)
485# define EESR_ERR_CHECK (EESR_TWB | EESR_TABT | EESR_RABT | EESR_RDE \
486 | EESR_RFRMER | EESR_TFE | EESR_TDE | EESR_ECI)
487# define TX_ERROR_CEHCK (EESR_TWB | EESR_TABT | EESR_TDE | EESR_TFE)
488
489#else
490# define TX_CHECK (EESR_FTC | EESR_CND | EESR_DLC | EESR_CD | EESR_RTO)
491# define EESR_ERR_CHECK (EESR_TWB | EESR_TABT | EESR_RABT | EESR_RDE \
492 | EESR_RFRMER | EESR_ADE | EESR_TFE | EESR_TDE | EESR_ECI)
493# define TX_ERROR_CEHCK (EESR_TWB | EESR_TABT | EESR_ADE | EESR_TDE | EESR_TFE)
494#endif
495
496/* EESIPR */
497enum DMAC_IM_BIT {
498 DMAC_M_TWB = 0x40000000, DMAC_M_TABT = 0x04000000,
499 DMAC_M_RABT = 0x02000000,
500 DMAC_M_RFRMER = 0x01000000, DMAC_M_ADF = 0x00800000,
501 DMAC_M_ECI = 0x00400000, DMAC_M_FTC = 0x00200000,
502 DMAC_M_TDE = 0x00100000, DMAC_M_TFE = 0x00080000,
503 DMAC_M_FRC = 0x00040000, DMAC_M_RDE = 0x00020000,
504 DMAC_M_RFE = 0x00010000, DMAC_M_TINT4 = 0x00000800,
505 DMAC_M_TINT3 = 0x00000400, DMAC_M_TINT2 = 0x00000200,
506 DMAC_M_TINT1 = 0x00000100, DMAC_M_RINT8 = 0x00000080,
507 DMAC_M_RINT5 = 0x00000010, DMAC_M_RINT4 = 0x00000008,
508 DMAC_M_RINT3 = 0x00000004, DMAC_M_RINT2 = 0x00000002,
509 DMAC_M_RINT1 = 0x00000001,
510};
511
512/* Receive descriptor bit */
513enum RD_STS_BIT {
514 RD_RACT = 0x80000000, RD_RDLE = 0x40000000,
515 RD_RFP1 = 0x20000000, RD_RFP0 = 0x10000000,
516 RD_RFE = 0x08000000, RD_RFS10 = 0x00000200,
517 RD_RFS9 = 0x00000100, RD_RFS8 = 0x00000080,
518 RD_RFS7 = 0x00000040, RD_RFS6 = 0x00000020,
519 RD_RFS5 = 0x00000010, RD_RFS4 = 0x00000008,
520 RD_RFS3 = 0x00000004, RD_RFS2 = 0x00000002,
521 RD_RFS1 = 0x00000001,
522};
523#define RDF1ST RD_RFP1
524#define RDFEND RD_RFP0
525#define RD_RFP (RD_RFP1|RD_RFP0)
526
527/* RDFFR*/
528enum RDFFR_BIT {
529 RDFFR_RDLF = 0x01,
530};
531
532/* FCFTR */
533enum FCFTR_BIT {
534 FCFTR_RFF2 = 0x00040000, FCFTR_RFF1 = 0x00020000,
535 FCFTR_RFF0 = 0x00010000, FCFTR_RFD2 = 0x00000004,
536 FCFTR_RFD1 = 0x00000002, FCFTR_RFD0 = 0x00000001,
537};
538#define FIFO_F_D_RFF (FCFTR_RFF2|FCFTR_RFF1|FCFTR_RFF0)
539#define FIFO_F_D_RFD (FCFTR_RFD2|FCFTR_RFD1|FCFTR_RFD0)
540
541/* Transfer descriptor bit */
542enum TD_STS_BIT {
Nobuhiro Iwamatsu62cbddc2014-01-23 07:52:18 +0900543#if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_ETHER) || \
544 defined(SH_ETH_TYPE_RZ)
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +0900545 TD_TACT = 0x80000000,
546#else
547 TD_TACT = 0x7fffffff,
548#endif
549 TD_TDLE = 0x40000000, TD_TFP1 = 0x20000000,
550 TD_TFP0 = 0x10000000,
551};
552#define TDF1ST TD_TFP1
553#define TDFEND TD_TFP0
554#define TD_TFP (TD_TFP1|TD_TFP0)
555
556/* RMCR */
557enum RECV_RST_BIT { RMCR_RST = 0x01, };
558/* ECMR */
559enum FELIC_MODE_BIT {
Nobuhiro Iwamatsu62cbddc2014-01-23 07:52:18 +0900560#if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
Nobuhiro Iwamatsue2752db2014-01-23 07:52:19 +0900561 ECMR_TRCCM = 0x04000000, ECMR_RCSC = 0x00800000,
562 ECMR_DPAD = 0x00200000, ECMR_RZPF = 0x00100000,
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +0900563#endif
564 ECMR_ZPF = 0x00080000, ECMR_PFR = 0x00040000, ECMR_RXF = 0x00020000,
565 ECMR_TXF = 0x00010000, ECMR_MCT = 0x00002000, ECMR_PRCEF = 0x00001000,
566 ECMR_PMDE = 0x00000200, ECMR_RE = 0x00000040, ECMR_TE = 0x00000020,
567 ECMR_ILB = 0x00000008, ECMR_ELB = 0x00000004, ECMR_DM = 0x00000002,
568 ECMR_PRM = 0x00000001,
Nobuhiro Iwamatsu3bb4cc32011-11-14 16:56:59 +0900569#ifdef CONFIG_CPU_SH7724
570 ECMR_RTM = 0x00000010,
Nobuhiro Iwamatsu17243742014-06-24 17:01:08 +0900571#elif defined(CONFIG_R8A7790) || defined(CONFIG_R8A7791) || \
Nobuhiro Iwamatsua341b7e2014-11-04 09:13:40 +0900572 defined(CONFIG_R8A7793) || defined(CONFIG_R8A7794)
Nobuhiro Iwamatsu87076782013-08-22 13:22:04 +0900573 ECMR_RTM = 0x00000004,
Nobuhiro Iwamatsu3bb4cc32011-11-14 16:56:59 +0900574#endif
575
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +0900576};
577
Nobuhiro Iwamatsu62cbddc2014-01-23 07:52:18 +0900578#if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
Nobuhiro Iwamatsue2752db2014-01-23 07:52:19 +0900579#define ECMR_CHG_DM (ECMR_TRCCM | ECMR_RZPF | ECMR_ZPF | ECMR_PFR | \
580 ECMR_RXF | ECMR_TXF | ECMR_MCT)
Yoshihiro Shimoda26235092012-06-26 16:38:06 +0000581#elif defined(SH_ETH_TYPE_ETHER)
Nobuhiro Iwamatsu3bb4cc32011-11-14 16:56:59 +0900582#define ECMR_CHG_DM (ECMR_ZPF | ECMR_PFR | ECMR_RXF | ECMR_TXF)
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +0900583#else
Yoshihiro Shimoda903de462011-01-18 17:53:45 +0900584#define ECMR_CHG_DM (ECMR_ZPF | ECMR_PFR | ECMR_RXF | ECMR_TXF | ECMR_MCT)
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +0900585#endif
586
587/* ECSR */
588enum ECSR_STATUS_BIT {
Yoshihiro Shimoda26235092012-06-26 16:38:06 +0000589#if defined(SH_ETH_TYPE_ETHER)
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +0900590 ECSR_BRCRX = 0x20, ECSR_PSRTO = 0x10,
591#endif
592 ECSR_LCHNG = 0x04,
593 ECSR_MPD = 0x02, ECSR_ICD = 0x01,
594};
595
Nobuhiro Iwamatsu62cbddc2014-01-23 07:52:18 +0900596#if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +0900597# 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 */
604enum ECSIPR_STATUS_MASK_BIT {
Yoshihiro Shimoda26235092012-06-26 16:38:06 +0000605#if defined(SH_ETH_TYPE_ETHER)
Nobuhiro Iwamatsua6616ef2012-06-05 16:39:06 +0000606 ECSIPR_BRCRXIP = 0x20,
Nobuhiro Iwamatsuee6ec5d2012-02-02 21:28:49 +0000607 ECSIPR_PSRTOIP = 0x10,
Yoshihiro Shimoda26235092012-06-26 16:38:06 +0000608#elif defined(SH_ETY_TYPE_GETHER)
Nobuhiro Iwamatsuee6ec5d2012-02-02 21:28:49 +0000609 ECSIPR_PSRTOIP = 0x10,
610 ECSIPR_PHYIP = 0x08,
Nobuhiro Iwamatsua6616ef2012-06-05 16:39:06 +0000611#endif
Nobuhiro Iwamatsuee6ec5d2012-02-02 21:28:49 +0000612 ECSIPR_LCHNGIP = 0x04,
613 ECSIPR_MPDIP = 0x02,
614 ECSIPR_ICDIP = 0x01,
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +0900615};
616
Nobuhiro Iwamatsu62cbddc2014-01-23 07:52:18 +0900617#if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +0900618# 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 */
625enum APR_BIT {
626 APR_AP = 0x00000004,
627};
628
629/* MPR */
630enum MPR_BIT {
631 MPR_MP = 0x00000006,
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +0900632};
633
634/* TRSCER */
635enum 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 */
643enum RPADIR_BIT {
644 RPADIR_PADS1 = 0x20000, RPADIR_PADS0 = 0x10000,
645 RPADIR_PADR = 0x0003f,
646};
647
Nobuhiro Iwamatsu62cbddc2014-01-23 07:52:18 +0900648#if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ)
Nobuhiro Iwamatsu9751ee02008-06-11 21:05:00 +0900649# define RPADIR_INIT (0x00)
650#else
651# define RPADIR_INIT (RPADIR_PADS1)
652#endif
653
654/* FDR */
655enum FIFO_SIZE_BIT {
656 FIFO_SIZE_T = 0x00000700, FIFO_SIZE_R = 0x00000007,
657};
Yoshihiro Shimoda49afb8c2012-06-26 16:38:09 +0000658
659static 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;
Nobuhiro Iwamatsu62cbddc2014-01-23 07:52:18 +0900666#elif defined(SH_ETH_TYPE_RZ)
667 const u16 *reg_offset = sh_eth_offset_rz;
Yoshihiro Shimoda49afb8c2012-06-26 16:38:09 +0000668#else
669#error
670#endif
671 return BASE_IO_ADDR + reg_offset[enum_index] + 0x800 * eth->port;
672}
673
674static 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
680static 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}