blob: 3703c55a74554f387e4c766a146a992e913d1241 [file] [log] [blame]
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +09001/*
Yoshihiro Shimoda34cca922011-01-18 17:53:45 +09002 * sh_eth.h - Driver for Renesas SuperH ethernet controler.
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +09003 *
Nobuhiro Iwamatsu9dfac0a2011-11-14 16:56:59 +09004 * Copyright (C) 2008, 2011 Renesas Solutions Corp.
5 * Copyright (c) 2008, 2011 Nobuhiro Iwamatsu
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +09006 * Copyright (c) 2007 Carlos Munoz <carlos@kenati.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 */
22
Nobuhiro Iwamatsud8f5d502008-11-21 12:04:18 +090023#include <netdev.h>
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +090024#include <asm/types.h>
25
26#define SHETHER_NAME "sh_eth"
27
28/* Malloc returns addresses in the P1 area (cacheable). However we need to
29 use area P2 (non-cacheable) */
30#define ADDR_TO_P2(addr) ((((int)(addr) & ~0xe0000000) | 0xa0000000))
31
32/* The ethernet controller needs to use physical addresses */
Yoshihiro Shimoda34cca922011-01-18 17:53:45 +090033#if defined(CONFIG_SH_32BIT)
34#define ADDR_TO_PHY(addr) ((((int)(addr) & ~0xe0000000) | 0x40000000))
35#else
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +090036#define ADDR_TO_PHY(addr) ((int)(addr) & ~0xe0000000)
Yoshihiro Shimoda34cca922011-01-18 17:53:45 +090037#endif
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +090038
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 4
54#define TX_DESC_SIZE (12 + TX_DESC_PADDING)
55
Nobuhiro Iwamatsud8f5d502008-11-21 12:04:18 +090056/* Tx descriptor. We always use 3 bytes of padding */
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +090057struct tx_desc_s {
58 volatile u32 td0;
59 u32 td1;
60 u32 td2; /* Buffer start */
61 u32 padding;
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 4
70#define RX_DESC_SIZE (12 + RX_DESC_PADDING)
71
72/* Rx descriptor. We always use 4 bytes of padding */
73struct rx_desc_s {
74 volatile u32 rd0;
75 volatile u32 rd1;
76 u32 rd2; /* Buffer start */
77 u32 padding;
78};
79
Nobuhiro Iwamatsud8f5d502008-11-21 12:04:18 +090080struct sh_eth_info {
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +090081 struct tx_desc_s *tx_desc_malloc;
82 struct tx_desc_s *tx_desc_base;
83 struct tx_desc_s *tx_desc_cur;
84 struct rx_desc_s *rx_desc_malloc;
85 struct rx_desc_s *rx_desc_base;
86 struct rx_desc_s *rx_desc_cur;
87 u8 *rx_buf_malloc;
88 u8 *rx_buf_base;
89 u8 mac_addr[6];
90 u8 phy_addr;
Nobuhiro Iwamatsud8f5d502008-11-21 12:04:18 +090091 struct eth_device *dev;
Yoshihiro Shimoda677f6cd2011-10-11 18:10:14 +090092 struct phy_device *phydev;
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +090093};
94
Nobuhiro Iwamatsud8f5d502008-11-21 12:04:18 +090095struct sh_eth_dev {
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +090096 int port;
Nobuhiro Iwamatsud8f5d502008-11-21 12:04:18 +090097 struct sh_eth_info port_info[MAX_PORT_NUM];
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +090098};
99
Yoshihiro Shimoda4c4aa6c2012-06-26 16:38:09 +0000100/* from linux/drivers/net/ethernet/renesas/sh_eth.h */
101enum {
102 /* E-DMAC registers */
103 EDSR = 0,
104 EDMR,
105 EDTRR,
106 EDRRR,
107 EESR,
108 EESIPR,
109 TDLAR,
110 TDFAR,
111 TDFXR,
112 TDFFR,
113 RDLAR,
114 RDFAR,
115 RDFXR,
116 RDFFR,
117 TRSCER,
118 RMFCR,
119 TFTR,
120 FDR,
121 RMCR,
122 EDOCR,
123 TFUCR,
124 RFOCR,
125 FCFTR,
126 RPADIR,
127 TRIMD,
128 RBWAR,
129 TBRAR,
130
131 /* Ether registers */
132 ECMR,
133 ECSR,
134 ECSIPR,
135 PIR,
136 PSR,
137 RDMLR,
138 PIPR,
139 RFLR,
140 IPGR,
141 APR,
142 MPR,
143 PFTCR,
144 PFRCR,
145 RFCR,
146 RFCF,
147 TPAUSER,
148 TPAUSECR,
149 BCFR,
150 BCFRR,
151 GECMR,
152 BCULR,
153 MAHR,
154 MALR,
155 TROCR,
156 CDCR,
157 LCCR,
158 CNDCR,
159 CEFCR,
160 FRECR,
161 TSFRCR,
162 TLFRCR,
163 CERCR,
164 CEECR,
165 MAFCR,
166 RTRATE,
167 CSMR,
168 RMII_MII,
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +0900169
Yoshihiro Shimoda4c4aa6c2012-06-26 16:38:09 +0000170 /* This value must be written at last. */
171 SH_ETH_MAX_REGISTER_OFFSET,
172};
173
174static const u16 sh_eth_offset_gigabit[SH_ETH_MAX_REGISTER_OFFSET] = {
175 [EDSR] = 0x0000,
176 [EDMR] = 0x0400,
177 [EDTRR] = 0x0408,
178 [EDRRR] = 0x0410,
179 [EESR] = 0x0428,
180 [EESIPR] = 0x0430,
181 [TDLAR] = 0x0010,
182 [TDFAR] = 0x0014,
183 [TDFXR] = 0x0018,
184 [TDFFR] = 0x001c,
185 [RDLAR] = 0x0030,
186 [RDFAR] = 0x0034,
187 [RDFXR] = 0x0038,
188 [RDFFR] = 0x003c,
189 [TRSCER] = 0x0438,
190 [RMFCR] = 0x0440,
191 [TFTR] = 0x0448,
192 [FDR] = 0x0450,
193 [RMCR] = 0x0458,
194 [RPADIR] = 0x0460,
195 [FCFTR] = 0x0468,
196 [CSMR] = 0x04E4,
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +0900197
Yoshihiro Shimoda4c4aa6c2012-06-26 16:38:09 +0000198 [ECMR] = 0x0500,
199 [ECSR] = 0x0510,
200 [ECSIPR] = 0x0518,
201 [PIR] = 0x0520,
202 [PSR] = 0x0528,
203 [PIPR] = 0x052c,
204 [RFLR] = 0x0508,
205 [APR] = 0x0554,
206 [MPR] = 0x0558,
207 [PFTCR] = 0x055c,
208 [PFRCR] = 0x0560,
209 [TPAUSER] = 0x0564,
210 [GECMR] = 0x05b0,
211 [BCULR] = 0x05b4,
212 [MAHR] = 0x05c0,
213 [MALR] = 0x05c8,
214 [TROCR] = 0x0700,
215 [CDCR] = 0x0708,
216 [LCCR] = 0x0710,
217 [CEFCR] = 0x0740,
218 [FRECR] = 0x0748,
219 [TSFRCR] = 0x0750,
220 [TLFRCR] = 0x0758,
221 [RFCR] = 0x0760,
222 [CERCR] = 0x0768,
223 [CEECR] = 0x0770,
224 [MAFCR] = 0x0778,
225 [RMII_MII] = 0x0790,
226};
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +0900227
Yoshihiro Shimoda4c4aa6c2012-06-26 16:38:09 +0000228static const u16 sh_eth_offset_fast_sh4[SH_ETH_MAX_REGISTER_OFFSET] = {
229 [ECMR] = 0x0100,
230 [RFLR] = 0x0108,
231 [ECSR] = 0x0110,
232 [ECSIPR] = 0x0118,
233 [PIR] = 0x0120,
234 [PSR] = 0x0128,
235 [RDMLR] = 0x0140,
236 [IPGR] = 0x0150,
237 [APR] = 0x0154,
238 [MPR] = 0x0158,
239 [TPAUSER] = 0x0164,
240 [RFCF] = 0x0160,
241 [TPAUSECR] = 0x0168,
242 [BCFRR] = 0x016c,
243 [MAHR] = 0x01c0,
244 [MALR] = 0x01c8,
245 [TROCR] = 0x01d0,
246 [CDCR] = 0x01d4,
247 [LCCR] = 0x01d8,
248 [CNDCR] = 0x01dc,
249 [CEFCR] = 0x01e4,
250 [FRECR] = 0x01e8,
251 [TSFRCR] = 0x01ec,
252 [TLFRCR] = 0x01f0,
253 [RFCR] = 0x01f4,
254 [MAFCR] = 0x01f8,
255 [RTRATE] = 0x01fc,
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +0900256
Yoshihiro Shimoda4c4aa6c2012-06-26 16:38:09 +0000257 [EDMR] = 0x0000,
258 [EDTRR] = 0x0008,
259 [EDRRR] = 0x0010,
260 [TDLAR] = 0x0018,
261 [RDLAR] = 0x0020,
262 [EESR] = 0x0028,
263 [EESIPR] = 0x0030,
264 [TRSCER] = 0x0038,
265 [RMFCR] = 0x0040,
266 [TFTR] = 0x0048,
267 [FDR] = 0x0050,
268 [RMCR] = 0x0058,
269 [TFUCR] = 0x0064,
270 [RFOCR] = 0x0068,
271 [FCFTR] = 0x0070,
272 [RPADIR] = 0x0078,
273 [TRIMD] = 0x007c,
274 [RBWAR] = 0x00c8,
275 [RDFAR] = 0x00cc,
276 [TBRAR] = 0x00d4,
277 [TDFAR] = 0x00d8,
278};
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +0900279
Yoshihiro Shimoda4c4aa6c2012-06-26 16:38:09 +0000280/* Register Address */
281#if defined(CONFIG_CPU_SH7763) || defined(CONFIG_CPU_SH7734)
282#define SH_ETH_TYPE_GETHER
283#define BASE_IO_ADDR 0xfee00000
Yoshihiro Shimoda34cca922011-01-18 17:53:45 +0900284#elif defined(CONFIG_CPU_SH7757)
Yoshihiro Shimoda36944902012-06-26 16:38:11 +0000285#if defined(CONFIG_SH_ETHER_USE_GETHER)
286#define SH_ETH_TYPE_GETHER
287#define BASE_IO_ADDR 0xfee00000
288#else
Yoshihiro Shimoda9d553032012-06-26 16:38:06 +0000289#define SH_ETH_TYPE_ETHER
Yoshihiro Shimoda34cca922011-01-18 17:53:45 +0900290#define BASE_IO_ADDR 0xfef00000
Yoshihiro Shimoda36944902012-06-26 16:38:11 +0000291#endif
Nobuhiro Iwamatsu9dfac0a2011-11-14 16:56:59 +0900292#elif defined(CONFIG_CPU_SH7724)
Yoshihiro Shimoda9d553032012-06-26 16:38:06 +0000293#define SH_ETH_TYPE_ETHER
Nobuhiro Iwamatsu9dfac0a2011-11-14 16:56:59 +0900294#define BASE_IO_ADDR 0xA4600000
Yoshihiro Shimoda34cca922011-01-18 17:53:45 +0900295#endif
296
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +0900297/*
298 * Register's bits
299 * Copy from Linux driver source code
300 */
Yoshihiro Shimoda9d553032012-06-26 16:38:06 +0000301#if defined(SH_ETH_TYPE_GETHER)
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +0900302/* EDSR */
303enum EDSR_BIT {
304 EDSR_ENT = 0x01, EDSR_ENR = 0x02,
305};
306#define EDSR_ENALL (EDSR_ENT|EDSR_ENR)
307#endif
308
309/* EDMR */
310enum DMAC_M_BIT {
311 EDMR_DL1 = 0x20, EDMR_DL0 = 0x10,
Yoshihiro Shimoda9d553032012-06-26 16:38:06 +0000312#if defined(SH_ETH_TYPE_GETHER)
Nobuhiro Iwamatsu58802902012-02-02 21:28:49 +0000313 EDMR_SRST = 0x03, /* Receive/Send reset */
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +0900314 EMDR_DESC_R = 0x30, /* Descriptor reserve size */
315 EDMR_EL = 0x40, /* Litte endian */
Yoshihiro Shimoda9d553032012-06-26 16:38:06 +0000316#elif defined(SH_ETH_TYPE_ETHER)
Yoshihiro Shimoda34cca922011-01-18 17:53:45 +0900317 EDMR_SRST = 0x01,
318 EMDR_DESC_R = 0x30, /* Descriptor reserve size */
319 EDMR_EL = 0x40, /* Litte endian */
Yoshihiro Shimoda9d553032012-06-26 16:38:06 +0000320#else
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +0900321 EDMR_SRST = 0x01,
322#endif
323};
324
325/* RFLR */
326#define RFLR_RFL_MIN 0x05EE /* Recv Frame length 1518 byte */
327
328/* EDTRR */
329enum DMAC_T_BIT {
Yoshihiro Shimoda9d553032012-06-26 16:38:06 +0000330#if defined(SH_ETH_TYPE_GETHER)
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +0900331 EDTRR_TRNS = 0x03,
332#else
333 EDTRR_TRNS = 0x01,
334#endif
335};
336
337/* GECMR */
338enum GECMR_BIT {
Yoshihiro Shimoda36944902012-06-26 16:38:11 +0000339#if defined(CONFIG_CPU_SH7757)
340 GECMR_1000B = 0x20, GECMR_100B = 0x01, GECMR_10B = 0x00,
341#else
Simon Muntonc2d704f2009-02-02 09:44:08 +0000342 GECMR_1000B = 0x01, GECMR_100B = 0x04, GECMR_10B = 0x00,
Yoshihiro Shimoda36944902012-06-26 16:38:11 +0000343#endif
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +0900344};
345
346/* EDRRR*/
347enum EDRRR_R_BIT {
348 EDRRR_R = 0x01,
349};
350
351/* TPAUSER */
352enum TPAUSER_BIT {
353 TPAUSER_TPAUSE = 0x0000ffff,
354 TPAUSER_UNLIMITED = 0,
355};
356
357/* BCFR */
358enum BCFR_BIT {
359 BCFR_RPAUSE = 0x0000ffff,
360 BCFR_UNLIMITED = 0,
361};
362
363/* PIR */
364enum PIR_BIT {
365 PIR_MDI = 0x08, PIR_MDO = 0x04, PIR_MMD = 0x02, PIR_MDC = 0x01,
366};
367
368/* PSR */
369enum PHY_STATUS_BIT { PHY_ST_LINK = 0x01, };
370
371/* EESR */
372enum EESR_BIT {
Nobuhiro Iwamatsu58802902012-02-02 21:28:49 +0000373
Yoshihiro Shimoda9d553032012-06-26 16:38:06 +0000374#if defined(SH_ETH_TYPE_ETHER)
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +0900375 EESR_TWB = 0x40000000,
376#else
377 EESR_TWB = 0xC0000000,
378 EESR_TC1 = 0x20000000,
379 EESR_TUC = 0x10000000,
380 EESR_ROC = 0x80000000,
381#endif
382 EESR_TABT = 0x04000000,
383 EESR_RABT = 0x02000000, EESR_RFRMER = 0x01000000,
Yoshihiro Shimoda9d553032012-06-26 16:38:06 +0000384#if defined(SH_ETH_TYPE_ETHER)
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +0900385 EESR_ADE = 0x00800000,
386#endif
387 EESR_ECI = 0x00400000,
388 EESR_FTC = 0x00200000, EESR_TDE = 0x00100000,
389 EESR_TFE = 0x00080000, EESR_FRC = 0x00040000,
390 EESR_RDE = 0x00020000, EESR_RFE = 0x00010000,
Yoshihiro Shimoda9d553032012-06-26 16:38:06 +0000391#if defined(SH_ETH_TYPE_ETHER)
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +0900392 EESR_CND = 0x00000800,
393#endif
394 EESR_DLC = 0x00000400,
395 EESR_CD = 0x00000200, EESR_RTO = 0x00000100,
396 EESR_RMAF = 0x00000080, EESR_CEEF = 0x00000040,
397 EESR_CELF = 0x00000020, EESR_RRF = 0x00000010,
398 rESR_RTLF = 0x00000008, EESR_RTSF = 0x00000004,
399 EESR_PRE = 0x00000002, EESR_CERF = 0x00000001,
400};
401
402
Yoshihiro Shimoda9d553032012-06-26 16:38:06 +0000403#if defined(SH_ETH_TYPE_GETHER)
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +0900404# define TX_CHECK (EESR_TC1 | EESR_FTC)
405# define EESR_ERR_CHECK (EESR_TWB | EESR_TABT | EESR_RABT | EESR_RDE \
406 | EESR_RFRMER | EESR_TFE | EESR_TDE | EESR_ECI)
407# define TX_ERROR_CEHCK (EESR_TWB | EESR_TABT | EESR_TDE | EESR_TFE)
408
409#else
410# define TX_CHECK (EESR_FTC | EESR_CND | EESR_DLC | EESR_CD | EESR_RTO)
411# define EESR_ERR_CHECK (EESR_TWB | EESR_TABT | EESR_RABT | EESR_RDE \
412 | EESR_RFRMER | EESR_ADE | EESR_TFE | EESR_TDE | EESR_ECI)
413# define TX_ERROR_CEHCK (EESR_TWB | EESR_TABT | EESR_ADE | EESR_TDE | EESR_TFE)
414#endif
415
416/* EESIPR */
417enum DMAC_IM_BIT {
418 DMAC_M_TWB = 0x40000000, DMAC_M_TABT = 0x04000000,
419 DMAC_M_RABT = 0x02000000,
420 DMAC_M_RFRMER = 0x01000000, DMAC_M_ADF = 0x00800000,
421 DMAC_M_ECI = 0x00400000, DMAC_M_FTC = 0x00200000,
422 DMAC_M_TDE = 0x00100000, DMAC_M_TFE = 0x00080000,
423 DMAC_M_FRC = 0x00040000, DMAC_M_RDE = 0x00020000,
424 DMAC_M_RFE = 0x00010000, DMAC_M_TINT4 = 0x00000800,
425 DMAC_M_TINT3 = 0x00000400, DMAC_M_TINT2 = 0x00000200,
426 DMAC_M_TINT1 = 0x00000100, DMAC_M_RINT8 = 0x00000080,
427 DMAC_M_RINT5 = 0x00000010, DMAC_M_RINT4 = 0x00000008,
428 DMAC_M_RINT3 = 0x00000004, DMAC_M_RINT2 = 0x00000002,
429 DMAC_M_RINT1 = 0x00000001,
430};
431
432/* Receive descriptor bit */
433enum RD_STS_BIT {
434 RD_RACT = 0x80000000, RD_RDLE = 0x40000000,
435 RD_RFP1 = 0x20000000, RD_RFP0 = 0x10000000,
436 RD_RFE = 0x08000000, RD_RFS10 = 0x00000200,
437 RD_RFS9 = 0x00000100, RD_RFS8 = 0x00000080,
438 RD_RFS7 = 0x00000040, RD_RFS6 = 0x00000020,
439 RD_RFS5 = 0x00000010, RD_RFS4 = 0x00000008,
440 RD_RFS3 = 0x00000004, RD_RFS2 = 0x00000002,
441 RD_RFS1 = 0x00000001,
442};
443#define RDF1ST RD_RFP1
444#define RDFEND RD_RFP0
445#define RD_RFP (RD_RFP1|RD_RFP0)
446
447/* RDFFR*/
448enum RDFFR_BIT {
449 RDFFR_RDLF = 0x01,
450};
451
452/* FCFTR */
453enum FCFTR_BIT {
454 FCFTR_RFF2 = 0x00040000, FCFTR_RFF1 = 0x00020000,
455 FCFTR_RFF0 = 0x00010000, FCFTR_RFD2 = 0x00000004,
456 FCFTR_RFD1 = 0x00000002, FCFTR_RFD0 = 0x00000001,
457};
458#define FIFO_F_D_RFF (FCFTR_RFF2|FCFTR_RFF1|FCFTR_RFF0)
459#define FIFO_F_D_RFD (FCFTR_RFD2|FCFTR_RFD1|FCFTR_RFD0)
460
461/* Transfer descriptor bit */
462enum TD_STS_BIT {
Yoshihiro Shimoda9d553032012-06-26 16:38:06 +0000463#if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_ETHER)
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +0900464 TD_TACT = 0x80000000,
465#else
466 TD_TACT = 0x7fffffff,
467#endif
468 TD_TDLE = 0x40000000, TD_TFP1 = 0x20000000,
469 TD_TFP0 = 0x10000000,
470};
471#define TDF1ST TD_TFP1
472#define TDFEND TD_TFP0
473#define TD_TFP (TD_TFP1|TD_TFP0)
474
475/* RMCR */
476enum RECV_RST_BIT { RMCR_RST = 0x01, };
477/* ECMR */
478enum FELIC_MODE_BIT {
Yoshihiro Shimoda9d553032012-06-26 16:38:06 +0000479#if defined(SH_ETH_TYPE_GETHER)
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +0900480 ECMR_TRCCM=0x04000000, ECMR_RCSC= 0x00800000, ECMR_DPAD= 0x00200000,
481 ECMR_RZPF = 0x00100000,
482#endif
483 ECMR_ZPF = 0x00080000, ECMR_PFR = 0x00040000, ECMR_RXF = 0x00020000,
484 ECMR_TXF = 0x00010000, ECMR_MCT = 0x00002000, ECMR_PRCEF = 0x00001000,
485 ECMR_PMDE = 0x00000200, ECMR_RE = 0x00000040, ECMR_TE = 0x00000020,
486 ECMR_ILB = 0x00000008, ECMR_ELB = 0x00000004, ECMR_DM = 0x00000002,
487 ECMR_PRM = 0x00000001,
Nobuhiro Iwamatsu9dfac0a2011-11-14 16:56:59 +0900488#ifdef CONFIG_CPU_SH7724
489 ECMR_RTM = 0x00000010,
490#endif
491
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +0900492};
493
Yoshihiro Shimoda9d553032012-06-26 16:38:06 +0000494#if defined(SH_ETH_TYPE_GETHER)
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +0900495#define ECMR_CHG_DM (ECMR_TRCCM | ECMR_RZPF | ECMR_ZPF | ECMR_PFR | ECMR_RXF | \
496 ECMR_TXF | ECMR_MCT)
Yoshihiro Shimoda9d553032012-06-26 16:38:06 +0000497#elif defined(SH_ETH_TYPE_ETHER)
Nobuhiro Iwamatsu9dfac0a2011-11-14 16:56:59 +0900498#define ECMR_CHG_DM (ECMR_ZPF | ECMR_PFR | ECMR_RXF | ECMR_TXF)
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +0900499#else
Yoshihiro Shimoda34cca922011-01-18 17:53:45 +0900500#define ECMR_CHG_DM (ECMR_ZPF | ECMR_PFR | ECMR_RXF | ECMR_TXF | ECMR_MCT)
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +0900501#endif
502
503/* ECSR */
504enum ECSR_STATUS_BIT {
Yoshihiro Shimoda9d553032012-06-26 16:38:06 +0000505#if defined(SH_ETH_TYPE_ETHER)
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +0900506 ECSR_BRCRX = 0x20, ECSR_PSRTO = 0x10,
507#endif
508 ECSR_LCHNG = 0x04,
509 ECSR_MPD = 0x02, ECSR_ICD = 0x01,
510};
511
Yoshihiro Shimoda9d553032012-06-26 16:38:06 +0000512#if defined(SH_ETH_TYPE_GETHER)
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +0900513# define ECSR_INIT (ECSR_ICD | ECSIPR_MPDIP)
514#else
515# define ECSR_INIT (ECSR_BRCRX | ECSR_PSRTO | \
516 ECSR_LCHNG | ECSR_ICD | ECSIPR_MPDIP)
517#endif
518
519/* ECSIPR */
520enum ECSIPR_STATUS_MASK_BIT {
Yoshihiro Shimoda9d553032012-06-26 16:38:06 +0000521#if defined(SH_ETH_TYPE_ETHER)
Nobuhiro Iwamatsud8d74e82012-06-05 16:39:06 +0000522 ECSIPR_BRCRXIP = 0x20,
Nobuhiro Iwamatsu58802902012-02-02 21:28:49 +0000523 ECSIPR_PSRTOIP = 0x10,
Yoshihiro Shimoda9d553032012-06-26 16:38:06 +0000524#elif defined(SH_ETY_TYPE_GETHER)
Nobuhiro Iwamatsu58802902012-02-02 21:28:49 +0000525 ECSIPR_PSRTOIP = 0x10,
526 ECSIPR_PHYIP = 0x08,
Nobuhiro Iwamatsud8d74e82012-06-05 16:39:06 +0000527#endif
Nobuhiro Iwamatsu58802902012-02-02 21:28:49 +0000528 ECSIPR_LCHNGIP = 0x04,
529 ECSIPR_MPDIP = 0x02,
530 ECSIPR_ICDIP = 0x01,
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +0900531};
532
Yoshihiro Shimoda9d553032012-06-26 16:38:06 +0000533#if defined(SH_ETH_TYPE_GETHER)
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +0900534# define ECSIPR_INIT (ECSIPR_LCHNGIP | ECSIPR_ICDIP | ECSIPR_MPDIP)
535#else
536# define ECSIPR_INIT (ECSIPR_BRCRXIP | ECSIPR_PSRTOIP | ECSIPR_LCHNGIP | \
537 ECSIPR_ICDIP | ECSIPR_MPDIP)
538#endif
539
540/* APR */
541enum APR_BIT {
542 APR_AP = 0x00000004,
543};
544
545/* MPR */
546enum MPR_BIT {
547 MPR_MP = 0x00000006,
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +0900548};
549
550/* TRSCER */
551enum DESC_I_BIT {
552 DESC_I_TINT4 = 0x0800, DESC_I_TINT3 = 0x0400, DESC_I_TINT2 = 0x0200,
553 DESC_I_TINT1 = 0x0100, DESC_I_RINT8 = 0x0080, DESC_I_RINT5 = 0x0010,
554 DESC_I_RINT4 = 0x0008, DESC_I_RINT3 = 0x0004, DESC_I_RINT2 = 0x0002,
555 DESC_I_RINT1 = 0x0001,
556};
557
558/* RPADIR */
559enum RPADIR_BIT {
560 RPADIR_PADS1 = 0x20000, RPADIR_PADS0 = 0x10000,
561 RPADIR_PADR = 0x0003f,
562};
563
Yoshihiro Shimoda9d553032012-06-26 16:38:06 +0000564#if defined(SH_ETH_TYPE_GETHER)
Nobuhiro Iwamatsu240b7232008-06-11 21:05:00 +0900565# define RPADIR_INIT (0x00)
566#else
567# define RPADIR_INIT (RPADIR_PADS1)
568#endif
569
570/* FDR */
571enum FIFO_SIZE_BIT {
572 FIFO_SIZE_T = 0x00000700, FIFO_SIZE_R = 0x00000007,
573};
Yoshihiro Shimoda4c4aa6c2012-06-26 16:38:09 +0000574
575static inline unsigned long sh_eth_reg_addr(struct sh_eth_dev *eth,
576 int enum_index)
577{
578#if defined(SH_ETH_TYPE_GETHER)
579 const u16 *reg_offset = sh_eth_offset_gigabit;
580#elif defined(SH_ETH_TYPE_ETHER)
581 const u16 *reg_offset = sh_eth_offset_fast_sh4;
582#else
583#error
584#endif
585 return BASE_IO_ADDR + reg_offset[enum_index] + 0x800 * eth->port;
586}
587
588static inline void sh_eth_write(struct sh_eth_dev *eth, unsigned long data,
589 int enum_index)
590{
591 outl(data, sh_eth_reg_addr(eth, enum_index));
592}
593
594static inline unsigned long sh_eth_read(struct sh_eth_dev *eth,
595 int enum_index)
596{
597 return inl(sh_eth_reg_addr(eth, enum_index));
598}