Home | History | Annotate | Download | only in net
      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 (at) 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