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@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