162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* SuperH Ethernet device driver 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright (C) 2006-2012 Nobuhiro Iwamatsu 562306a36Sopenharmony_ci * Copyright (C) 2008-2012 Renesas Solutions Corp. 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef __SH_ETH_H__ 962306a36Sopenharmony_ci#define __SH_ETH_H__ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#define CARDNAME "sh-eth" 1262306a36Sopenharmony_ci#define TX_TIMEOUT (5*HZ) 1362306a36Sopenharmony_ci#define TX_RING_SIZE 64 /* Tx ring size */ 1462306a36Sopenharmony_ci#define RX_RING_SIZE 64 /* Rx ring size */ 1562306a36Sopenharmony_ci#define TX_RING_MIN 64 1662306a36Sopenharmony_ci#define RX_RING_MIN 64 1762306a36Sopenharmony_ci#define TX_RING_MAX 1024 1862306a36Sopenharmony_ci#define RX_RING_MAX 1024 1962306a36Sopenharmony_ci#define PKT_BUF_SZ 1538 2062306a36Sopenharmony_ci#define SH_ETH_TSU_TIMEOUT_MS 500 2162306a36Sopenharmony_ci#define SH_ETH_TSU_CAM_ENTRIES 32 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_cienum { 2462306a36Sopenharmony_ci /* IMPORTANT: To keep ethtool register dump working, add new 2562306a36Sopenharmony_ci * register names immediately before SH_ETH_MAX_REGISTER_OFFSET. 2662306a36Sopenharmony_ci */ 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci /* E-DMAC registers */ 2962306a36Sopenharmony_ci EDSR = 0, 3062306a36Sopenharmony_ci EDMR, 3162306a36Sopenharmony_ci EDTRR, 3262306a36Sopenharmony_ci EDRRR, 3362306a36Sopenharmony_ci EESR, 3462306a36Sopenharmony_ci EESIPR, 3562306a36Sopenharmony_ci TDLAR, 3662306a36Sopenharmony_ci TDFAR, 3762306a36Sopenharmony_ci TDFXR, 3862306a36Sopenharmony_ci TDFFR, 3962306a36Sopenharmony_ci RDLAR, 4062306a36Sopenharmony_ci RDFAR, 4162306a36Sopenharmony_ci RDFXR, 4262306a36Sopenharmony_ci RDFFR, 4362306a36Sopenharmony_ci TRSCER, 4462306a36Sopenharmony_ci RMFCR, 4562306a36Sopenharmony_ci TFTR, 4662306a36Sopenharmony_ci FDR, 4762306a36Sopenharmony_ci RMCR, 4862306a36Sopenharmony_ci EDOCR, 4962306a36Sopenharmony_ci TFUCR, 5062306a36Sopenharmony_ci RFOCR, 5162306a36Sopenharmony_ci RMIIMODE, 5262306a36Sopenharmony_ci FCFTR, 5362306a36Sopenharmony_ci RPADIR, 5462306a36Sopenharmony_ci TRIMD, 5562306a36Sopenharmony_ci RBWAR, 5662306a36Sopenharmony_ci TBRAR, 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci /* Ether registers */ 5962306a36Sopenharmony_ci ECMR, 6062306a36Sopenharmony_ci ECSR, 6162306a36Sopenharmony_ci ECSIPR, 6262306a36Sopenharmony_ci PIR, 6362306a36Sopenharmony_ci PSR, 6462306a36Sopenharmony_ci RDMLR, 6562306a36Sopenharmony_ci PIPR, 6662306a36Sopenharmony_ci RFLR, 6762306a36Sopenharmony_ci IPGR, 6862306a36Sopenharmony_ci APR, 6962306a36Sopenharmony_ci MPR, 7062306a36Sopenharmony_ci PFTCR, 7162306a36Sopenharmony_ci PFRCR, 7262306a36Sopenharmony_ci RFCR, 7362306a36Sopenharmony_ci RFCF, 7462306a36Sopenharmony_ci TPAUSER, 7562306a36Sopenharmony_ci TPAUSECR, 7662306a36Sopenharmony_ci BCFR, 7762306a36Sopenharmony_ci BCFRR, 7862306a36Sopenharmony_ci GECMR, 7962306a36Sopenharmony_ci BCULR, 8062306a36Sopenharmony_ci MAHR, 8162306a36Sopenharmony_ci MALR, 8262306a36Sopenharmony_ci TROCR, 8362306a36Sopenharmony_ci CDCR, 8462306a36Sopenharmony_ci LCCR, 8562306a36Sopenharmony_ci CNDCR, 8662306a36Sopenharmony_ci CEFCR, 8762306a36Sopenharmony_ci FRECR, 8862306a36Sopenharmony_ci TSFRCR, 8962306a36Sopenharmony_ci TLFRCR, 9062306a36Sopenharmony_ci CERCR, 9162306a36Sopenharmony_ci CEECR, 9262306a36Sopenharmony_ci MAFCR, 9362306a36Sopenharmony_ci RTRATE, 9462306a36Sopenharmony_ci CSMR, 9562306a36Sopenharmony_ci RMII_MII, 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci /* TSU Absolute address */ 9862306a36Sopenharmony_ci ARSTR, 9962306a36Sopenharmony_ci TSU_CTRST, 10062306a36Sopenharmony_ci TSU_FWEN0, 10162306a36Sopenharmony_ci TSU_FWEN1, 10262306a36Sopenharmony_ci TSU_FCM, 10362306a36Sopenharmony_ci TSU_BSYSL0, 10462306a36Sopenharmony_ci TSU_BSYSL1, 10562306a36Sopenharmony_ci TSU_PRISL0, 10662306a36Sopenharmony_ci TSU_PRISL1, 10762306a36Sopenharmony_ci TSU_FWSL0, 10862306a36Sopenharmony_ci TSU_FWSL1, 10962306a36Sopenharmony_ci TSU_FWSLC, 11062306a36Sopenharmony_ci TSU_QTAG0, /* Same as TSU_QTAGM0 */ 11162306a36Sopenharmony_ci TSU_QTAG1, /* Same as TSU_QTAGM1 */ 11262306a36Sopenharmony_ci TSU_QTAGM0, 11362306a36Sopenharmony_ci TSU_QTAGM1, 11462306a36Sopenharmony_ci TSU_FWSR, 11562306a36Sopenharmony_ci TSU_FWINMK, 11662306a36Sopenharmony_ci TSU_ADQT0, 11762306a36Sopenharmony_ci TSU_ADQT1, 11862306a36Sopenharmony_ci TSU_VTAG0, 11962306a36Sopenharmony_ci TSU_VTAG1, 12062306a36Sopenharmony_ci TSU_ADSBSY, 12162306a36Sopenharmony_ci TSU_TEN, 12262306a36Sopenharmony_ci TSU_POST1, 12362306a36Sopenharmony_ci TSU_POST2, 12462306a36Sopenharmony_ci TSU_POST3, 12562306a36Sopenharmony_ci TSU_POST4, 12662306a36Sopenharmony_ci TSU_ADRH0, 12762306a36Sopenharmony_ci /* TSU_ADR{H,L}{0..31} are assumed to be contiguous */ 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci TXNLCR0, 13062306a36Sopenharmony_ci TXALCR0, 13162306a36Sopenharmony_ci RXNLCR0, 13262306a36Sopenharmony_ci RXALCR0, 13362306a36Sopenharmony_ci FWNLCR0, 13462306a36Sopenharmony_ci FWALCR0, 13562306a36Sopenharmony_ci TXNLCR1, 13662306a36Sopenharmony_ci TXALCR1, 13762306a36Sopenharmony_ci RXNLCR1, 13862306a36Sopenharmony_ci RXALCR1, 13962306a36Sopenharmony_ci FWNLCR1, 14062306a36Sopenharmony_ci FWALCR1, 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci /* This value must be written at last. */ 14362306a36Sopenharmony_ci SH_ETH_MAX_REGISTER_OFFSET, 14462306a36Sopenharmony_ci}; 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_cienum { 14762306a36Sopenharmony_ci SH_ETH_REG_GIGABIT, 14862306a36Sopenharmony_ci SH_ETH_REG_FAST_RCAR, 14962306a36Sopenharmony_ci SH_ETH_REG_FAST_SH4, 15062306a36Sopenharmony_ci SH_ETH_REG_FAST_SH3_SH2 15162306a36Sopenharmony_ci}; 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci/* Driver's parameters */ 15462306a36Sopenharmony_ci#if defined(CONFIG_CPU_SH4) || defined(CONFIG_ARCH_RENESAS) 15562306a36Sopenharmony_ci#define SH_ETH_RX_ALIGN 32 15662306a36Sopenharmony_ci#else 15762306a36Sopenharmony_ci#define SH_ETH_RX_ALIGN 2 15862306a36Sopenharmony_ci#endif 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci/* Register's bits 16162306a36Sopenharmony_ci */ 16262306a36Sopenharmony_ci/* EDSR : sh7734, sh7757, sh7763, r8a7740, and r7s72100 only */ 16362306a36Sopenharmony_cienum EDSR_BIT { 16462306a36Sopenharmony_ci EDSR_ENT = 0x01, EDSR_ENR = 0x02, 16562306a36Sopenharmony_ci}; 16662306a36Sopenharmony_ci#define EDSR_ENALL (EDSR_ENT|EDSR_ENR) 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ci/* GECMR : sh7734, sh7763 and r8a7740 only */ 16962306a36Sopenharmony_cienum GECMR_BIT { 17062306a36Sopenharmony_ci GECMR_10 = 0x0, GECMR_100 = 0x04, GECMR_1000 = 0x01, 17162306a36Sopenharmony_ci}; 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci/* EDMR */ 17462306a36Sopenharmony_cienum EDMR_BIT { 17562306a36Sopenharmony_ci EDMR_NBST = 0x80, 17662306a36Sopenharmony_ci EDMR_EL = 0x40, /* Litte endian */ 17762306a36Sopenharmony_ci EDMR_DL1 = 0x20, EDMR_DL0 = 0x10, 17862306a36Sopenharmony_ci EDMR_SRST_GETHER = 0x03, 17962306a36Sopenharmony_ci EDMR_SRST_ETHER = 0x01, 18062306a36Sopenharmony_ci}; 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci/* EDTRR */ 18362306a36Sopenharmony_cienum EDTRR_BIT { 18462306a36Sopenharmony_ci EDTRR_TRNS_GETHER = 0x03, 18562306a36Sopenharmony_ci EDTRR_TRNS_ETHER = 0x01, 18662306a36Sopenharmony_ci}; 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci/* EDRRR */ 18962306a36Sopenharmony_cienum EDRRR_BIT { 19062306a36Sopenharmony_ci EDRRR_R = 0x01, 19162306a36Sopenharmony_ci}; 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci/* TPAUSER */ 19462306a36Sopenharmony_cienum TPAUSER_BIT { 19562306a36Sopenharmony_ci TPAUSER_TPAUSE = 0x0000ffff, 19662306a36Sopenharmony_ci TPAUSER_UNLIMITED = 0, 19762306a36Sopenharmony_ci}; 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_ci/* BCFR */ 20062306a36Sopenharmony_cienum BCFR_BIT { 20162306a36Sopenharmony_ci BCFR_RPAUSE = 0x0000ffff, 20262306a36Sopenharmony_ci BCFR_UNLIMITED = 0, 20362306a36Sopenharmony_ci}; 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_ci/* PIR */ 20662306a36Sopenharmony_cienum PIR_BIT { 20762306a36Sopenharmony_ci PIR_MDI = 0x08, PIR_MDO = 0x04, PIR_MMD = 0x02, PIR_MDC = 0x01, 20862306a36Sopenharmony_ci}; 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci/* PSR */ 21162306a36Sopenharmony_cienum PSR_BIT { PSR_LMON = 0x01, }; 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ci/* EESR */ 21462306a36Sopenharmony_cienum EESR_BIT { 21562306a36Sopenharmony_ci EESR_TWB1 = 0x80000000, 21662306a36Sopenharmony_ci EESR_TWB = 0x40000000, /* same as TWB0 */ 21762306a36Sopenharmony_ci EESR_TC1 = 0x20000000, 21862306a36Sopenharmony_ci EESR_TUC = 0x10000000, 21962306a36Sopenharmony_ci EESR_ROC = 0x08000000, 22062306a36Sopenharmony_ci EESR_TABT = 0x04000000, 22162306a36Sopenharmony_ci EESR_RABT = 0x02000000, 22262306a36Sopenharmony_ci EESR_RFRMER = 0x01000000, /* same as RFCOF */ 22362306a36Sopenharmony_ci EESR_ADE = 0x00800000, 22462306a36Sopenharmony_ci EESR_ECI = 0x00400000, 22562306a36Sopenharmony_ci EESR_FTC = 0x00200000, /* same as TC or TC0 */ 22662306a36Sopenharmony_ci EESR_TDE = 0x00100000, 22762306a36Sopenharmony_ci EESR_TFE = 0x00080000, /* same as TFUF */ 22862306a36Sopenharmony_ci EESR_FRC = 0x00040000, /* same as FR */ 22962306a36Sopenharmony_ci EESR_RDE = 0x00020000, 23062306a36Sopenharmony_ci EESR_RFE = 0x00010000, 23162306a36Sopenharmony_ci EESR_CND = 0x00000800, 23262306a36Sopenharmony_ci EESR_DLC = 0x00000400, 23362306a36Sopenharmony_ci EESR_CD = 0x00000200, 23462306a36Sopenharmony_ci EESR_TRO = 0x00000100, 23562306a36Sopenharmony_ci EESR_RMAF = 0x00000080, 23662306a36Sopenharmony_ci EESR_CEEF = 0x00000040, 23762306a36Sopenharmony_ci EESR_CELF = 0x00000020, 23862306a36Sopenharmony_ci EESR_RRF = 0x00000010, 23962306a36Sopenharmony_ci EESR_RTLF = 0x00000008, 24062306a36Sopenharmony_ci EESR_RTSF = 0x00000004, 24162306a36Sopenharmony_ci EESR_PRE = 0x00000002, 24262306a36Sopenharmony_ci EESR_CERF = 0x00000001, 24362306a36Sopenharmony_ci}; 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci#define EESR_RX_CHECK (EESR_FRC | /* Frame recv */ \ 24662306a36Sopenharmony_ci EESR_RMAF | /* Multicast address recv */ \ 24762306a36Sopenharmony_ci EESR_RRF | /* Bit frame recv */ \ 24862306a36Sopenharmony_ci EESR_RTLF | /* Long frame recv */ \ 24962306a36Sopenharmony_ci EESR_RTSF | /* Short frame recv */ \ 25062306a36Sopenharmony_ci EESR_PRE | /* PHY-LSI recv error */ \ 25162306a36Sopenharmony_ci EESR_CERF) /* Recv frame CRC error */ 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ci#define DEFAULT_TX_CHECK (EESR_FTC | EESR_CND | EESR_DLC | EESR_CD | \ 25462306a36Sopenharmony_ci EESR_TRO) 25562306a36Sopenharmony_ci#define DEFAULT_EESR_ERR_CHECK (EESR_TWB | EESR_TABT | EESR_RABT | EESR_RFE | \ 25662306a36Sopenharmony_ci EESR_RDE | EESR_RFRMER | EESR_ADE | \ 25762306a36Sopenharmony_ci EESR_TFE | EESR_TDE) 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_ci/* EESIPR */ 26062306a36Sopenharmony_cienum EESIPR_BIT { 26162306a36Sopenharmony_ci EESIPR_TWB1IP = 0x80000000, 26262306a36Sopenharmony_ci EESIPR_TWBIP = 0x40000000, /* same as TWB0IP */ 26362306a36Sopenharmony_ci EESIPR_TC1IP = 0x20000000, 26462306a36Sopenharmony_ci EESIPR_TUCIP = 0x10000000, 26562306a36Sopenharmony_ci EESIPR_ROCIP = 0x08000000, 26662306a36Sopenharmony_ci EESIPR_TABTIP = 0x04000000, 26762306a36Sopenharmony_ci EESIPR_RABTIP = 0x02000000, 26862306a36Sopenharmony_ci EESIPR_RFCOFIP = 0x01000000, 26962306a36Sopenharmony_ci EESIPR_ADEIP = 0x00800000, 27062306a36Sopenharmony_ci EESIPR_ECIIP = 0x00400000, 27162306a36Sopenharmony_ci EESIPR_FTCIP = 0x00200000, /* same as TC0IP */ 27262306a36Sopenharmony_ci EESIPR_TDEIP = 0x00100000, 27362306a36Sopenharmony_ci EESIPR_TFUFIP = 0x00080000, 27462306a36Sopenharmony_ci EESIPR_FRIP = 0x00040000, 27562306a36Sopenharmony_ci EESIPR_RDEIP = 0x00020000, 27662306a36Sopenharmony_ci EESIPR_RFOFIP = 0x00010000, 27762306a36Sopenharmony_ci EESIPR_CNDIP = 0x00000800, 27862306a36Sopenharmony_ci EESIPR_DLCIP = 0x00000400, 27962306a36Sopenharmony_ci EESIPR_CDIP = 0x00000200, 28062306a36Sopenharmony_ci EESIPR_TROIP = 0x00000100, 28162306a36Sopenharmony_ci EESIPR_RMAFIP = 0x00000080, 28262306a36Sopenharmony_ci EESIPR_CEEFIP = 0x00000040, 28362306a36Sopenharmony_ci EESIPR_CELFIP = 0x00000020, 28462306a36Sopenharmony_ci EESIPR_RRFIP = 0x00000010, 28562306a36Sopenharmony_ci EESIPR_RTLFIP = 0x00000008, 28662306a36Sopenharmony_ci EESIPR_RTSFIP = 0x00000004, 28762306a36Sopenharmony_ci EESIPR_PREIP = 0x00000002, 28862306a36Sopenharmony_ci EESIPR_CERFIP = 0x00000001, 28962306a36Sopenharmony_ci}; 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_ci/* FCFTR */ 29262306a36Sopenharmony_cienum FCFTR_BIT { 29362306a36Sopenharmony_ci FCFTR_RFF2 = 0x00040000, FCFTR_RFF1 = 0x00020000, 29462306a36Sopenharmony_ci FCFTR_RFF0 = 0x00010000, FCFTR_RFD2 = 0x00000004, 29562306a36Sopenharmony_ci FCFTR_RFD1 = 0x00000002, FCFTR_RFD0 = 0x00000001, 29662306a36Sopenharmony_ci}; 29762306a36Sopenharmony_ci#define DEFAULT_FIFO_F_D_RFF (FCFTR_RFF2 | FCFTR_RFF1 | FCFTR_RFF0) 29862306a36Sopenharmony_ci#define DEFAULT_FIFO_F_D_RFD (FCFTR_RFD2 | FCFTR_RFD1 | FCFTR_RFD0) 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_ci/* RMCR */ 30162306a36Sopenharmony_cienum RMCR_BIT { 30262306a36Sopenharmony_ci RMCR_RNC = 0x00000001, 30362306a36Sopenharmony_ci}; 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_ci/* ECMR */ 30662306a36Sopenharmony_cienum ECMR_BIT { 30762306a36Sopenharmony_ci ECMR_TRCCM = 0x04000000, ECMR_RCSC = 0x00800000, 30862306a36Sopenharmony_ci ECMR_DPAD = 0x00200000, ECMR_RZPF = 0x00100000, 30962306a36Sopenharmony_ci ECMR_ZPF = 0x00080000, ECMR_PFR = 0x00040000, ECMR_RXF = 0x00020000, 31062306a36Sopenharmony_ci ECMR_TXF = 0x00010000, ECMR_MCT = 0x00002000, ECMR_PRCEF = 0x00001000, 31162306a36Sopenharmony_ci ECMR_MPDE = 0x00000200, ECMR_RE = 0x00000040, ECMR_TE = 0x00000020, 31262306a36Sopenharmony_ci ECMR_RTM = 0x00000010, ECMR_ILB = 0x00000008, ECMR_ELB = 0x00000004, 31362306a36Sopenharmony_ci ECMR_DM = 0x00000002, ECMR_PRM = 0x00000001, 31462306a36Sopenharmony_ci}; 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ci/* ECSR */ 31762306a36Sopenharmony_cienum ECSR_BIT { 31862306a36Sopenharmony_ci ECSR_BRCRX = 0x20, ECSR_PSRTO = 0x10, 31962306a36Sopenharmony_ci ECSR_LCHNG = 0x04, 32062306a36Sopenharmony_ci ECSR_MPD = 0x02, ECSR_ICD = 0x01, 32162306a36Sopenharmony_ci}; 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_ci#define DEFAULT_ECSR_INIT (ECSR_BRCRX | ECSR_PSRTO | ECSR_LCHNG | \ 32462306a36Sopenharmony_ci ECSR_ICD | ECSIPR_MPDIP) 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_ci/* ECSIPR */ 32762306a36Sopenharmony_cienum ECSIPR_BIT { 32862306a36Sopenharmony_ci ECSIPR_BRCRXIP = 0x20, ECSIPR_PSRTOIP = 0x10, 32962306a36Sopenharmony_ci ECSIPR_LCHNGIP = 0x04, 33062306a36Sopenharmony_ci ECSIPR_MPDIP = 0x02, ECSIPR_ICDIP = 0x01, 33162306a36Sopenharmony_ci}; 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_ci#define DEFAULT_ECSIPR_INIT (ECSIPR_BRCRXIP | ECSIPR_PSRTOIP | \ 33462306a36Sopenharmony_ci ECSIPR_LCHNGIP | ECSIPR_ICDIP | ECSIPR_MPDIP) 33562306a36Sopenharmony_ci 33662306a36Sopenharmony_ci/* APR */ 33762306a36Sopenharmony_cienum APR_BIT { 33862306a36Sopenharmony_ci APR_AP = 0x0000ffff, 33962306a36Sopenharmony_ci}; 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_ci/* MPR */ 34262306a36Sopenharmony_cienum MPR_BIT { 34362306a36Sopenharmony_ci MPR_MP = 0x0000ffff, 34462306a36Sopenharmony_ci}; 34562306a36Sopenharmony_ci 34662306a36Sopenharmony_ci/* TRSCER */ 34762306a36Sopenharmony_cienum TRSCER_BIT { 34862306a36Sopenharmony_ci TRSCER_CNDCE = 0x00000800, 34962306a36Sopenharmony_ci TRSCER_DLCCE = 0x00000400, 35062306a36Sopenharmony_ci TRSCER_CDCE = 0x00000200, 35162306a36Sopenharmony_ci TRSCER_TROCE = 0x00000100, 35262306a36Sopenharmony_ci TRSCER_RMAFCE = 0x00000080, 35362306a36Sopenharmony_ci TRSCER_RRFCE = 0x00000010, 35462306a36Sopenharmony_ci TRSCER_RTLFCE = 0x00000008, 35562306a36Sopenharmony_ci TRSCER_RTSFCE = 0x00000004, 35662306a36Sopenharmony_ci TRSCER_PRECE = 0x00000002, 35762306a36Sopenharmony_ci TRSCER_CERFCE = 0x00000001, 35862306a36Sopenharmony_ci}; 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_ci#define DEFAULT_TRSCER_ERR_MASK (TRSCER_RMAFCE | TRSCER_RRFCE | TRSCER_CDCE) 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_ci/* RPADIR */ 36362306a36Sopenharmony_cienum RPADIR_BIT { 36462306a36Sopenharmony_ci RPADIR_PADS = 0x1f0000, RPADIR_PADR = 0xffff, 36562306a36Sopenharmony_ci}; 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ci/* FDR */ 36862306a36Sopenharmony_ci#define DEFAULT_FDR_INIT 0x00000707 36962306a36Sopenharmony_ci 37062306a36Sopenharmony_ci/* ARSTR */ 37162306a36Sopenharmony_cienum ARSTR_BIT { ARSTR_ARST = 0x00000001, }; 37262306a36Sopenharmony_ci 37362306a36Sopenharmony_ci/* TSU_FWEN0 */ 37462306a36Sopenharmony_cienum TSU_FWEN0_BIT { 37562306a36Sopenharmony_ci TSU_FWEN0_0 = 0x00000001, 37662306a36Sopenharmony_ci}; 37762306a36Sopenharmony_ci 37862306a36Sopenharmony_ci/* TSU_ADSBSY */ 37962306a36Sopenharmony_cienum TSU_ADSBSY_BIT { 38062306a36Sopenharmony_ci TSU_ADSBSY_0 = 0x00000001, 38162306a36Sopenharmony_ci}; 38262306a36Sopenharmony_ci 38362306a36Sopenharmony_ci/* TSU_TEN */ 38462306a36Sopenharmony_cienum TSU_TEN_BIT { 38562306a36Sopenharmony_ci TSU_TEN_0 = 0x80000000, 38662306a36Sopenharmony_ci}; 38762306a36Sopenharmony_ci 38862306a36Sopenharmony_ci/* TSU_FWSL0 */ 38962306a36Sopenharmony_cienum TSU_FWSL0_BIT { 39062306a36Sopenharmony_ci TSU_FWSL0_FW50 = 0x1000, TSU_FWSL0_FW40 = 0x0800, 39162306a36Sopenharmony_ci TSU_FWSL0_FW30 = 0x0400, TSU_FWSL0_FW20 = 0x0200, 39262306a36Sopenharmony_ci TSU_FWSL0_FW10 = 0x0100, TSU_FWSL0_RMSA0 = 0x0010, 39362306a36Sopenharmony_ci}; 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_ci/* TSU_FWSLC */ 39662306a36Sopenharmony_cienum TSU_FWSLC_BIT { 39762306a36Sopenharmony_ci TSU_FWSLC_POSTENU = 0x2000, TSU_FWSLC_POSTENL = 0x1000, 39862306a36Sopenharmony_ci TSU_FWSLC_CAMSEL03 = 0x0080, TSU_FWSLC_CAMSEL02 = 0x0040, 39962306a36Sopenharmony_ci TSU_FWSLC_CAMSEL01 = 0x0020, TSU_FWSLC_CAMSEL00 = 0x0010, 40062306a36Sopenharmony_ci TSU_FWSLC_CAMSEL13 = 0x0008, TSU_FWSLC_CAMSEL12 = 0x0004, 40162306a36Sopenharmony_ci TSU_FWSLC_CAMSEL11 = 0x0002, TSU_FWSLC_CAMSEL10 = 0x0001, 40262306a36Sopenharmony_ci}; 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_ci/* TSU_VTAGn */ 40562306a36Sopenharmony_ci#define TSU_VTAG_ENABLE 0x80000000 40662306a36Sopenharmony_ci#define TSU_VTAG_VID_MASK 0x00000fff 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_ci/* The sh ether Tx buffer descriptors. 40962306a36Sopenharmony_ci * This structure should be 20 bytes. 41062306a36Sopenharmony_ci */ 41162306a36Sopenharmony_cistruct sh_eth_txdesc { 41262306a36Sopenharmony_ci u32 status; /* TD0 */ 41362306a36Sopenharmony_ci u32 len; /* TD1 */ 41462306a36Sopenharmony_ci u32 addr; /* TD2 */ 41562306a36Sopenharmony_ci u32 pad0; /* padding data */ 41662306a36Sopenharmony_ci} __aligned(2) __packed; 41762306a36Sopenharmony_ci 41862306a36Sopenharmony_ci/* Transmit descriptor 0 bits */ 41962306a36Sopenharmony_cienum TD_STS_BIT { 42062306a36Sopenharmony_ci TD_TACT = 0x80000000, 42162306a36Sopenharmony_ci TD_TDLE = 0x40000000, 42262306a36Sopenharmony_ci TD_TFP1 = 0x20000000, 42362306a36Sopenharmony_ci TD_TFP0 = 0x10000000, 42462306a36Sopenharmony_ci TD_TFE = 0x08000000, 42562306a36Sopenharmony_ci TD_TWBI = 0x04000000, 42662306a36Sopenharmony_ci}; 42762306a36Sopenharmony_ci#define TDF1ST TD_TFP1 42862306a36Sopenharmony_ci#define TDFEND TD_TFP0 42962306a36Sopenharmony_ci#define TD_TFP (TD_TFP1 | TD_TFP0) 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_ci/* Transmit descriptor 1 bits */ 43262306a36Sopenharmony_cienum TD_LEN_BIT { 43362306a36Sopenharmony_ci TD_TBL = 0xffff0000, /* transmit buffer length */ 43462306a36Sopenharmony_ci}; 43562306a36Sopenharmony_ci 43662306a36Sopenharmony_ci/* The sh ether Rx buffer descriptors. 43762306a36Sopenharmony_ci * This structure should be 20 bytes. 43862306a36Sopenharmony_ci */ 43962306a36Sopenharmony_cistruct sh_eth_rxdesc { 44062306a36Sopenharmony_ci u32 status; /* RD0 */ 44162306a36Sopenharmony_ci u32 len; /* RD1 */ 44262306a36Sopenharmony_ci u32 addr; /* RD2 */ 44362306a36Sopenharmony_ci u32 pad0; /* padding data */ 44462306a36Sopenharmony_ci} __aligned(2) __packed; 44562306a36Sopenharmony_ci 44662306a36Sopenharmony_ci/* Receive descriptor 0 bits */ 44762306a36Sopenharmony_cienum RD_STS_BIT { 44862306a36Sopenharmony_ci RD_RACT = 0x80000000, 44962306a36Sopenharmony_ci RD_RDLE = 0x40000000, 45062306a36Sopenharmony_ci RD_RFP1 = 0x20000000, 45162306a36Sopenharmony_ci RD_RFP0 = 0x10000000, 45262306a36Sopenharmony_ci RD_RFE = 0x08000000, 45362306a36Sopenharmony_ci RD_RFS10 = 0x00000200, 45462306a36Sopenharmony_ci RD_RFS9 = 0x00000100, 45562306a36Sopenharmony_ci RD_RFS8 = 0x00000080, 45662306a36Sopenharmony_ci RD_RFS7 = 0x00000040, 45762306a36Sopenharmony_ci RD_RFS6 = 0x00000020, 45862306a36Sopenharmony_ci RD_RFS5 = 0x00000010, 45962306a36Sopenharmony_ci RD_RFS4 = 0x00000008, 46062306a36Sopenharmony_ci RD_RFS3 = 0x00000004, 46162306a36Sopenharmony_ci RD_RFS2 = 0x00000002, 46262306a36Sopenharmony_ci RD_RFS1 = 0x00000001, 46362306a36Sopenharmony_ci}; 46462306a36Sopenharmony_ci#define RDF1ST RD_RFP1 46562306a36Sopenharmony_ci#define RDFEND RD_RFP0 46662306a36Sopenharmony_ci#define RD_RFP (RD_RFP1 | RD_RFP0) 46762306a36Sopenharmony_ci 46862306a36Sopenharmony_ci/* Receive descriptor 1 bits */ 46962306a36Sopenharmony_cienum RD_LEN_BIT { 47062306a36Sopenharmony_ci RD_RFL = 0x0000ffff, /* receive frame length */ 47162306a36Sopenharmony_ci RD_RBL = 0xffff0000, /* receive buffer length */ 47262306a36Sopenharmony_ci}; 47362306a36Sopenharmony_ci 47462306a36Sopenharmony_ci/* This structure is used by each CPU dependency handling. */ 47562306a36Sopenharmony_cistruct sh_eth_cpu_data { 47662306a36Sopenharmony_ci /* mandatory functions */ 47762306a36Sopenharmony_ci int (*soft_reset)(struct net_device *ndev); 47862306a36Sopenharmony_ci 47962306a36Sopenharmony_ci /* optional functions */ 48062306a36Sopenharmony_ci void (*chip_reset)(struct net_device *ndev); 48162306a36Sopenharmony_ci void (*set_duplex)(struct net_device *ndev); 48262306a36Sopenharmony_ci void (*set_rate)(struct net_device *ndev); 48362306a36Sopenharmony_ci 48462306a36Sopenharmony_ci /* mandatory initialize value */ 48562306a36Sopenharmony_ci int register_type; 48662306a36Sopenharmony_ci u32 edtrr_trns; 48762306a36Sopenharmony_ci u32 eesipr_value; 48862306a36Sopenharmony_ci 48962306a36Sopenharmony_ci /* optional initialize value */ 49062306a36Sopenharmony_ci u32 ecsr_value; 49162306a36Sopenharmony_ci u32 ecsipr_value; 49262306a36Sopenharmony_ci u32 fdr_value; 49362306a36Sopenharmony_ci u32 fcftr_value; 49462306a36Sopenharmony_ci 49562306a36Sopenharmony_ci /* interrupt checking mask */ 49662306a36Sopenharmony_ci u32 tx_check; 49762306a36Sopenharmony_ci u32 eesr_err_check; 49862306a36Sopenharmony_ci 49962306a36Sopenharmony_ci /* Error mask */ 50062306a36Sopenharmony_ci u32 trscer_err_mask; 50162306a36Sopenharmony_ci 50262306a36Sopenharmony_ci /* hardware features */ 50362306a36Sopenharmony_ci unsigned long irq_flags; /* IRQ configuration flags */ 50462306a36Sopenharmony_ci unsigned no_psr:1; /* EtherC DOES NOT have PSR */ 50562306a36Sopenharmony_ci unsigned apr:1; /* EtherC has APR */ 50662306a36Sopenharmony_ci unsigned mpr:1; /* EtherC has MPR */ 50762306a36Sopenharmony_ci unsigned tpauser:1; /* EtherC has TPAUSER */ 50862306a36Sopenharmony_ci unsigned gecmr:1; /* EtherC has GECMR */ 50962306a36Sopenharmony_ci unsigned bculr:1; /* EtherC has BCULR */ 51062306a36Sopenharmony_ci unsigned tsu:1; /* EtherC has TSU */ 51162306a36Sopenharmony_ci unsigned hw_swap:1; /* E-DMAC has DE bit in EDMR */ 51262306a36Sopenharmony_ci unsigned nbst:1; /* E-DMAC has NBST bit in EDMR */ 51362306a36Sopenharmony_ci unsigned rpadir:1; /* E-DMAC has RPADIR */ 51462306a36Sopenharmony_ci unsigned no_trimd:1; /* E-DMAC DOES NOT have TRIMD */ 51562306a36Sopenharmony_ci unsigned no_ade:1; /* E-DMAC DOES NOT have ADE bit in EESR */ 51662306a36Sopenharmony_ci unsigned no_xdfar:1; /* E-DMAC DOES NOT have RDFAR/TDFAR */ 51762306a36Sopenharmony_ci unsigned xdfar_rw:1; /* E-DMAC has writeable RDFAR/TDFAR */ 51862306a36Sopenharmony_ci unsigned csmr:1; /* E-DMAC has CSMR */ 51962306a36Sopenharmony_ci unsigned rx_csum:1; /* EtherC has ECMR.RCSC */ 52062306a36Sopenharmony_ci unsigned select_mii:1; /* EtherC has RMII_MII (MII select register) */ 52162306a36Sopenharmony_ci unsigned rmiimode:1; /* EtherC has RMIIMODE register */ 52262306a36Sopenharmony_ci unsigned rtrate:1; /* EtherC has RTRATE register */ 52362306a36Sopenharmony_ci unsigned magic:1; /* EtherC has ECMR.MPDE and ECSR.MPD */ 52462306a36Sopenharmony_ci unsigned no_tx_cntrs:1; /* EtherC DOES NOT have TX error counters */ 52562306a36Sopenharmony_ci unsigned cexcr:1; /* EtherC has CERCR/CEECR */ 52662306a36Sopenharmony_ci unsigned dual_port:1; /* Dual EtherC/E-DMAC */ 52762306a36Sopenharmony_ci}; 52862306a36Sopenharmony_ci 52962306a36Sopenharmony_cistruct sh_eth_private { 53062306a36Sopenharmony_ci struct platform_device *pdev; 53162306a36Sopenharmony_ci struct sh_eth_cpu_data *cd; 53262306a36Sopenharmony_ci const u16 *reg_offset; 53362306a36Sopenharmony_ci void __iomem *addr; 53462306a36Sopenharmony_ci void __iomem *tsu_addr; 53562306a36Sopenharmony_ci struct clk *clk; 53662306a36Sopenharmony_ci u32 num_rx_ring; 53762306a36Sopenharmony_ci u32 num_tx_ring; 53862306a36Sopenharmony_ci dma_addr_t rx_desc_dma; 53962306a36Sopenharmony_ci dma_addr_t tx_desc_dma; 54062306a36Sopenharmony_ci struct sh_eth_rxdesc *rx_ring; 54162306a36Sopenharmony_ci struct sh_eth_txdesc *tx_ring; 54262306a36Sopenharmony_ci struct sk_buff **rx_skbuff; 54362306a36Sopenharmony_ci struct sk_buff **tx_skbuff; 54462306a36Sopenharmony_ci spinlock_t lock; /* Register access lock */ 54562306a36Sopenharmony_ci u32 cur_rx, dirty_rx; /* Producer/consumer ring indices */ 54662306a36Sopenharmony_ci u32 cur_tx, dirty_tx; 54762306a36Sopenharmony_ci u32 rx_buf_sz; /* Based on MTU+slack. */ 54862306a36Sopenharmony_ci struct napi_struct napi; 54962306a36Sopenharmony_ci bool irq_enabled; 55062306a36Sopenharmony_ci /* MII transceiver section. */ 55162306a36Sopenharmony_ci u32 phy_id; /* PHY ID */ 55262306a36Sopenharmony_ci struct mii_bus *mii_bus; /* MDIO bus control */ 55362306a36Sopenharmony_ci int link; 55462306a36Sopenharmony_ci phy_interface_t phy_interface; 55562306a36Sopenharmony_ci int msg_enable; 55662306a36Sopenharmony_ci int speed; 55762306a36Sopenharmony_ci int duplex; 55862306a36Sopenharmony_ci int port; /* for TSU */ 55962306a36Sopenharmony_ci int vlan_num_ids; /* for VLAN tag filter */ 56062306a36Sopenharmony_ci 56162306a36Sopenharmony_ci unsigned no_ether_link:1; 56262306a36Sopenharmony_ci unsigned ether_link_active_low:1; 56362306a36Sopenharmony_ci unsigned is_opened:1; 56462306a36Sopenharmony_ci unsigned wol_enabled:1; 56562306a36Sopenharmony_ci}; 56662306a36Sopenharmony_ci 56762306a36Sopenharmony_ci#endif /* #ifndef __SH_ETH_H__ */ 568