1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* SuperH Ethernet device driver 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright (C) 2006-2012 Nobuhiro Iwamatsu 5*4882a593Smuzhiyun * Copyright (C) 2008-2012 Renesas Solutions Corp. 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef __SH_ETH_H__ 9*4882a593Smuzhiyun #define __SH_ETH_H__ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #define CARDNAME "sh-eth" 12*4882a593Smuzhiyun #define TX_TIMEOUT (5*HZ) 13*4882a593Smuzhiyun #define TX_RING_SIZE 64 /* Tx ring size */ 14*4882a593Smuzhiyun #define RX_RING_SIZE 64 /* Rx ring size */ 15*4882a593Smuzhiyun #define TX_RING_MIN 64 16*4882a593Smuzhiyun #define RX_RING_MIN 64 17*4882a593Smuzhiyun #define TX_RING_MAX 1024 18*4882a593Smuzhiyun #define RX_RING_MAX 1024 19*4882a593Smuzhiyun #define PKT_BUF_SZ 1538 20*4882a593Smuzhiyun #define SH_ETH_TSU_TIMEOUT_MS 500 21*4882a593Smuzhiyun #define SH_ETH_TSU_CAM_ENTRIES 32 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun enum { 24*4882a593Smuzhiyun /* IMPORTANT: To keep ethtool register dump working, add new 25*4882a593Smuzhiyun * register names immediately before SH_ETH_MAX_REGISTER_OFFSET. 26*4882a593Smuzhiyun */ 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun /* E-DMAC registers */ 29*4882a593Smuzhiyun EDSR = 0, 30*4882a593Smuzhiyun EDMR, 31*4882a593Smuzhiyun EDTRR, 32*4882a593Smuzhiyun EDRRR, 33*4882a593Smuzhiyun EESR, 34*4882a593Smuzhiyun EESIPR, 35*4882a593Smuzhiyun TDLAR, 36*4882a593Smuzhiyun TDFAR, 37*4882a593Smuzhiyun TDFXR, 38*4882a593Smuzhiyun TDFFR, 39*4882a593Smuzhiyun RDLAR, 40*4882a593Smuzhiyun RDFAR, 41*4882a593Smuzhiyun RDFXR, 42*4882a593Smuzhiyun RDFFR, 43*4882a593Smuzhiyun TRSCER, 44*4882a593Smuzhiyun RMFCR, 45*4882a593Smuzhiyun TFTR, 46*4882a593Smuzhiyun FDR, 47*4882a593Smuzhiyun RMCR, 48*4882a593Smuzhiyun EDOCR, 49*4882a593Smuzhiyun TFUCR, 50*4882a593Smuzhiyun RFOCR, 51*4882a593Smuzhiyun RMIIMODE, 52*4882a593Smuzhiyun FCFTR, 53*4882a593Smuzhiyun RPADIR, 54*4882a593Smuzhiyun TRIMD, 55*4882a593Smuzhiyun RBWAR, 56*4882a593Smuzhiyun TBRAR, 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun /* Ether registers */ 59*4882a593Smuzhiyun ECMR, 60*4882a593Smuzhiyun ECSR, 61*4882a593Smuzhiyun ECSIPR, 62*4882a593Smuzhiyun PIR, 63*4882a593Smuzhiyun PSR, 64*4882a593Smuzhiyun RDMLR, 65*4882a593Smuzhiyun PIPR, 66*4882a593Smuzhiyun RFLR, 67*4882a593Smuzhiyun IPGR, 68*4882a593Smuzhiyun APR, 69*4882a593Smuzhiyun MPR, 70*4882a593Smuzhiyun PFTCR, 71*4882a593Smuzhiyun PFRCR, 72*4882a593Smuzhiyun RFCR, 73*4882a593Smuzhiyun RFCF, 74*4882a593Smuzhiyun TPAUSER, 75*4882a593Smuzhiyun TPAUSECR, 76*4882a593Smuzhiyun BCFR, 77*4882a593Smuzhiyun BCFRR, 78*4882a593Smuzhiyun GECMR, 79*4882a593Smuzhiyun BCULR, 80*4882a593Smuzhiyun MAHR, 81*4882a593Smuzhiyun MALR, 82*4882a593Smuzhiyun TROCR, 83*4882a593Smuzhiyun CDCR, 84*4882a593Smuzhiyun LCCR, 85*4882a593Smuzhiyun CNDCR, 86*4882a593Smuzhiyun CEFCR, 87*4882a593Smuzhiyun FRECR, 88*4882a593Smuzhiyun TSFRCR, 89*4882a593Smuzhiyun TLFRCR, 90*4882a593Smuzhiyun CERCR, 91*4882a593Smuzhiyun CEECR, 92*4882a593Smuzhiyun MAFCR, 93*4882a593Smuzhiyun RTRATE, 94*4882a593Smuzhiyun CSMR, 95*4882a593Smuzhiyun RMII_MII, 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun /* TSU Absolute address */ 98*4882a593Smuzhiyun ARSTR, 99*4882a593Smuzhiyun TSU_CTRST, 100*4882a593Smuzhiyun TSU_FWEN0, 101*4882a593Smuzhiyun TSU_FWEN1, 102*4882a593Smuzhiyun TSU_FCM, 103*4882a593Smuzhiyun TSU_BSYSL0, 104*4882a593Smuzhiyun TSU_BSYSL1, 105*4882a593Smuzhiyun TSU_PRISL0, 106*4882a593Smuzhiyun TSU_PRISL1, 107*4882a593Smuzhiyun TSU_FWSL0, 108*4882a593Smuzhiyun TSU_FWSL1, 109*4882a593Smuzhiyun TSU_FWSLC, 110*4882a593Smuzhiyun TSU_QTAG0, /* Same as TSU_QTAGM0 */ 111*4882a593Smuzhiyun TSU_QTAG1, /* Same as TSU_QTAGM1 */ 112*4882a593Smuzhiyun TSU_QTAGM0, 113*4882a593Smuzhiyun TSU_QTAGM1, 114*4882a593Smuzhiyun TSU_FWSR, 115*4882a593Smuzhiyun TSU_FWINMK, 116*4882a593Smuzhiyun TSU_ADQT0, 117*4882a593Smuzhiyun TSU_ADQT1, 118*4882a593Smuzhiyun TSU_VTAG0, 119*4882a593Smuzhiyun TSU_VTAG1, 120*4882a593Smuzhiyun TSU_ADSBSY, 121*4882a593Smuzhiyun TSU_TEN, 122*4882a593Smuzhiyun TSU_POST1, 123*4882a593Smuzhiyun TSU_POST2, 124*4882a593Smuzhiyun TSU_POST3, 125*4882a593Smuzhiyun TSU_POST4, 126*4882a593Smuzhiyun TSU_ADRH0, 127*4882a593Smuzhiyun /* TSU_ADR{H,L}{0..31} are assumed to be contiguous */ 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun TXNLCR0, 130*4882a593Smuzhiyun TXALCR0, 131*4882a593Smuzhiyun RXNLCR0, 132*4882a593Smuzhiyun RXALCR0, 133*4882a593Smuzhiyun FWNLCR0, 134*4882a593Smuzhiyun FWALCR0, 135*4882a593Smuzhiyun TXNLCR1, 136*4882a593Smuzhiyun TXALCR1, 137*4882a593Smuzhiyun RXNLCR1, 138*4882a593Smuzhiyun RXALCR1, 139*4882a593Smuzhiyun FWNLCR1, 140*4882a593Smuzhiyun FWALCR1, 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun /* This value must be written at last. */ 143*4882a593Smuzhiyun SH_ETH_MAX_REGISTER_OFFSET, 144*4882a593Smuzhiyun }; 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun enum { 147*4882a593Smuzhiyun SH_ETH_REG_GIGABIT, 148*4882a593Smuzhiyun SH_ETH_REG_FAST_RCAR, 149*4882a593Smuzhiyun SH_ETH_REG_FAST_SH4, 150*4882a593Smuzhiyun SH_ETH_REG_FAST_SH3_SH2 151*4882a593Smuzhiyun }; 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun /* Driver's parameters */ 154*4882a593Smuzhiyun #if defined(CONFIG_CPU_SH4) || defined(CONFIG_ARCH_RENESAS) 155*4882a593Smuzhiyun #define SH_ETH_RX_ALIGN 32 156*4882a593Smuzhiyun #else 157*4882a593Smuzhiyun #define SH_ETH_RX_ALIGN 2 158*4882a593Smuzhiyun #endif 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun /* Register's bits 161*4882a593Smuzhiyun */ 162*4882a593Smuzhiyun /* EDSR : sh7734, sh7757, sh7763, r8a7740, and r7s72100 only */ 163*4882a593Smuzhiyun enum EDSR_BIT { 164*4882a593Smuzhiyun EDSR_ENT = 0x01, EDSR_ENR = 0x02, 165*4882a593Smuzhiyun }; 166*4882a593Smuzhiyun #define EDSR_ENALL (EDSR_ENT|EDSR_ENR) 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun /* GECMR : sh7734, sh7763 and r8a7740 only */ 169*4882a593Smuzhiyun enum GECMR_BIT { 170*4882a593Smuzhiyun GECMR_10 = 0x0, GECMR_100 = 0x04, GECMR_1000 = 0x01, 171*4882a593Smuzhiyun }; 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun /* EDMR */ 174*4882a593Smuzhiyun enum DMAC_M_BIT { 175*4882a593Smuzhiyun EDMR_NBST = 0x80, 176*4882a593Smuzhiyun EDMR_EL = 0x40, /* Litte endian */ 177*4882a593Smuzhiyun EDMR_DL1 = 0x20, EDMR_DL0 = 0x10, 178*4882a593Smuzhiyun EDMR_SRST_GETHER = 0x03, 179*4882a593Smuzhiyun EDMR_SRST_ETHER = 0x01, 180*4882a593Smuzhiyun }; 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun /* EDTRR */ 183*4882a593Smuzhiyun enum DMAC_T_BIT { 184*4882a593Smuzhiyun EDTRR_TRNS_GETHER = 0x03, 185*4882a593Smuzhiyun EDTRR_TRNS_ETHER = 0x01, 186*4882a593Smuzhiyun }; 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun /* EDRRR */ 189*4882a593Smuzhiyun enum EDRRR_R_BIT { 190*4882a593Smuzhiyun EDRRR_R = 0x01, 191*4882a593Smuzhiyun }; 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun /* TPAUSER */ 194*4882a593Smuzhiyun enum TPAUSER_BIT { 195*4882a593Smuzhiyun TPAUSER_TPAUSE = 0x0000ffff, 196*4882a593Smuzhiyun TPAUSER_UNLIMITED = 0, 197*4882a593Smuzhiyun }; 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun /* BCFR */ 200*4882a593Smuzhiyun enum BCFR_BIT { 201*4882a593Smuzhiyun BCFR_RPAUSE = 0x0000ffff, 202*4882a593Smuzhiyun BCFR_UNLIMITED = 0, 203*4882a593Smuzhiyun }; 204*4882a593Smuzhiyun 205*4882a593Smuzhiyun /* PIR */ 206*4882a593Smuzhiyun enum PIR_BIT { 207*4882a593Smuzhiyun PIR_MDI = 0x08, PIR_MDO = 0x04, PIR_MMD = 0x02, PIR_MDC = 0x01, 208*4882a593Smuzhiyun }; 209*4882a593Smuzhiyun 210*4882a593Smuzhiyun /* PSR */ 211*4882a593Smuzhiyun enum PHY_STATUS_BIT { PHY_ST_LINK = 0x01, }; 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun /* EESR */ 214*4882a593Smuzhiyun enum EESR_BIT { 215*4882a593Smuzhiyun EESR_TWB1 = 0x80000000, 216*4882a593Smuzhiyun EESR_TWB = 0x40000000, /* same as TWB0 */ 217*4882a593Smuzhiyun EESR_TC1 = 0x20000000, 218*4882a593Smuzhiyun EESR_TUC = 0x10000000, 219*4882a593Smuzhiyun EESR_ROC = 0x08000000, 220*4882a593Smuzhiyun EESR_TABT = 0x04000000, 221*4882a593Smuzhiyun EESR_RABT = 0x02000000, 222*4882a593Smuzhiyun EESR_RFRMER = 0x01000000, /* same as RFCOF */ 223*4882a593Smuzhiyun EESR_ADE = 0x00800000, 224*4882a593Smuzhiyun EESR_ECI = 0x00400000, 225*4882a593Smuzhiyun EESR_FTC = 0x00200000, /* same as TC or TC0 */ 226*4882a593Smuzhiyun EESR_TDE = 0x00100000, 227*4882a593Smuzhiyun EESR_TFE = 0x00080000, /* same as TFUF */ 228*4882a593Smuzhiyun EESR_FRC = 0x00040000, /* same as FR */ 229*4882a593Smuzhiyun EESR_RDE = 0x00020000, 230*4882a593Smuzhiyun EESR_RFE = 0x00010000, 231*4882a593Smuzhiyun EESR_CND = 0x00000800, 232*4882a593Smuzhiyun EESR_DLC = 0x00000400, 233*4882a593Smuzhiyun EESR_CD = 0x00000200, 234*4882a593Smuzhiyun EESR_TRO = 0x00000100, 235*4882a593Smuzhiyun EESR_RMAF = 0x00000080, 236*4882a593Smuzhiyun EESR_CEEF = 0x00000040, 237*4882a593Smuzhiyun EESR_CELF = 0x00000020, 238*4882a593Smuzhiyun EESR_RRF = 0x00000010, 239*4882a593Smuzhiyun EESR_RTLF = 0x00000008, 240*4882a593Smuzhiyun EESR_RTSF = 0x00000004, 241*4882a593Smuzhiyun EESR_PRE = 0x00000002, 242*4882a593Smuzhiyun EESR_CERF = 0x00000001, 243*4882a593Smuzhiyun }; 244*4882a593Smuzhiyun 245*4882a593Smuzhiyun #define EESR_RX_CHECK (EESR_FRC | /* Frame recv */ \ 246*4882a593Smuzhiyun EESR_RMAF | /* Multicast address recv */ \ 247*4882a593Smuzhiyun EESR_RRF | /* Bit frame recv */ \ 248*4882a593Smuzhiyun EESR_RTLF | /* Long frame recv */ \ 249*4882a593Smuzhiyun EESR_RTSF | /* Short frame recv */ \ 250*4882a593Smuzhiyun EESR_PRE | /* PHY-LSI recv error */ \ 251*4882a593Smuzhiyun EESR_CERF) /* Recv frame CRC error */ 252*4882a593Smuzhiyun 253*4882a593Smuzhiyun #define DEFAULT_TX_CHECK (EESR_FTC | EESR_CND | EESR_DLC | EESR_CD | \ 254*4882a593Smuzhiyun EESR_TRO) 255*4882a593Smuzhiyun #define DEFAULT_EESR_ERR_CHECK (EESR_TWB | EESR_TABT | EESR_RABT | EESR_RFE | \ 256*4882a593Smuzhiyun EESR_RDE | EESR_RFRMER | EESR_ADE | \ 257*4882a593Smuzhiyun EESR_TFE | EESR_TDE) 258*4882a593Smuzhiyun 259*4882a593Smuzhiyun /* EESIPR */ 260*4882a593Smuzhiyun enum EESIPR_BIT { 261*4882a593Smuzhiyun EESIPR_TWB1IP = 0x80000000, 262*4882a593Smuzhiyun EESIPR_TWBIP = 0x40000000, /* same as TWB0IP */ 263*4882a593Smuzhiyun EESIPR_TC1IP = 0x20000000, 264*4882a593Smuzhiyun EESIPR_TUCIP = 0x10000000, 265*4882a593Smuzhiyun EESIPR_ROCIP = 0x08000000, 266*4882a593Smuzhiyun EESIPR_TABTIP = 0x04000000, 267*4882a593Smuzhiyun EESIPR_RABTIP = 0x02000000, 268*4882a593Smuzhiyun EESIPR_RFCOFIP = 0x01000000, 269*4882a593Smuzhiyun EESIPR_ADEIP = 0x00800000, 270*4882a593Smuzhiyun EESIPR_ECIIP = 0x00400000, 271*4882a593Smuzhiyun EESIPR_FTCIP = 0x00200000, /* same as TC0IP */ 272*4882a593Smuzhiyun EESIPR_TDEIP = 0x00100000, 273*4882a593Smuzhiyun EESIPR_TFUFIP = 0x00080000, 274*4882a593Smuzhiyun EESIPR_FRIP = 0x00040000, 275*4882a593Smuzhiyun EESIPR_RDEIP = 0x00020000, 276*4882a593Smuzhiyun EESIPR_RFOFIP = 0x00010000, 277*4882a593Smuzhiyun EESIPR_CNDIP = 0x00000800, 278*4882a593Smuzhiyun EESIPR_DLCIP = 0x00000400, 279*4882a593Smuzhiyun EESIPR_CDIP = 0x00000200, 280*4882a593Smuzhiyun EESIPR_TROIP = 0x00000100, 281*4882a593Smuzhiyun EESIPR_RMAFIP = 0x00000080, 282*4882a593Smuzhiyun EESIPR_CEEFIP = 0x00000040, 283*4882a593Smuzhiyun EESIPR_CELFIP = 0x00000020, 284*4882a593Smuzhiyun EESIPR_RRFIP = 0x00000010, 285*4882a593Smuzhiyun EESIPR_RTLFIP = 0x00000008, 286*4882a593Smuzhiyun EESIPR_RTSFIP = 0x00000004, 287*4882a593Smuzhiyun EESIPR_PREIP = 0x00000002, 288*4882a593Smuzhiyun EESIPR_CERFIP = 0x00000001, 289*4882a593Smuzhiyun }; 290*4882a593Smuzhiyun 291*4882a593Smuzhiyun /* Receive descriptor 0 bits */ 292*4882a593Smuzhiyun enum RD_STS_BIT { 293*4882a593Smuzhiyun RD_RACT = 0x80000000, RD_RDLE = 0x40000000, 294*4882a593Smuzhiyun RD_RFP1 = 0x20000000, RD_RFP0 = 0x10000000, 295*4882a593Smuzhiyun RD_RFE = 0x08000000, RD_RFS10 = 0x00000200, 296*4882a593Smuzhiyun RD_RFS9 = 0x00000100, RD_RFS8 = 0x00000080, 297*4882a593Smuzhiyun RD_RFS7 = 0x00000040, RD_RFS6 = 0x00000020, 298*4882a593Smuzhiyun RD_RFS5 = 0x00000010, RD_RFS4 = 0x00000008, 299*4882a593Smuzhiyun RD_RFS3 = 0x00000004, RD_RFS2 = 0x00000002, 300*4882a593Smuzhiyun RD_RFS1 = 0x00000001, 301*4882a593Smuzhiyun }; 302*4882a593Smuzhiyun #define RDF1ST RD_RFP1 303*4882a593Smuzhiyun #define RDFEND RD_RFP0 304*4882a593Smuzhiyun #define RD_RFP (RD_RFP1|RD_RFP0) 305*4882a593Smuzhiyun 306*4882a593Smuzhiyun /* Receive descriptor 1 bits */ 307*4882a593Smuzhiyun enum RD_LEN_BIT { 308*4882a593Smuzhiyun RD_RFL = 0x0000ffff, /* receive frame length */ 309*4882a593Smuzhiyun RD_RBL = 0xffff0000, /* receive buffer length */ 310*4882a593Smuzhiyun }; 311*4882a593Smuzhiyun 312*4882a593Smuzhiyun /* FCFTR */ 313*4882a593Smuzhiyun enum FCFTR_BIT { 314*4882a593Smuzhiyun FCFTR_RFF2 = 0x00040000, FCFTR_RFF1 = 0x00020000, 315*4882a593Smuzhiyun FCFTR_RFF0 = 0x00010000, FCFTR_RFD2 = 0x00000004, 316*4882a593Smuzhiyun FCFTR_RFD1 = 0x00000002, FCFTR_RFD0 = 0x00000001, 317*4882a593Smuzhiyun }; 318*4882a593Smuzhiyun #define DEFAULT_FIFO_F_D_RFF (FCFTR_RFF2 | FCFTR_RFF1 | FCFTR_RFF0) 319*4882a593Smuzhiyun #define DEFAULT_FIFO_F_D_RFD (FCFTR_RFD2 | FCFTR_RFD1 | FCFTR_RFD0) 320*4882a593Smuzhiyun 321*4882a593Smuzhiyun /* Transmit descriptor 0 bits */ 322*4882a593Smuzhiyun enum TD_STS_BIT { 323*4882a593Smuzhiyun TD_TACT = 0x80000000, TD_TDLE = 0x40000000, 324*4882a593Smuzhiyun TD_TFP1 = 0x20000000, TD_TFP0 = 0x10000000, 325*4882a593Smuzhiyun TD_TFE = 0x08000000, TD_TWBI = 0x04000000, 326*4882a593Smuzhiyun }; 327*4882a593Smuzhiyun #define TDF1ST TD_TFP1 328*4882a593Smuzhiyun #define TDFEND TD_TFP0 329*4882a593Smuzhiyun #define TD_TFP (TD_TFP1|TD_TFP0) 330*4882a593Smuzhiyun 331*4882a593Smuzhiyun /* Transmit descriptor 1 bits */ 332*4882a593Smuzhiyun enum TD_LEN_BIT { 333*4882a593Smuzhiyun TD_TBL = 0xffff0000, /* transmit buffer length */ 334*4882a593Smuzhiyun }; 335*4882a593Smuzhiyun 336*4882a593Smuzhiyun /* RMCR */ 337*4882a593Smuzhiyun enum RMCR_BIT { 338*4882a593Smuzhiyun RMCR_RNC = 0x00000001, 339*4882a593Smuzhiyun }; 340*4882a593Smuzhiyun 341*4882a593Smuzhiyun /* ECMR */ 342*4882a593Smuzhiyun enum FELIC_MODE_BIT { 343*4882a593Smuzhiyun ECMR_TRCCM = 0x04000000, ECMR_RCSC = 0x00800000, 344*4882a593Smuzhiyun ECMR_DPAD = 0x00200000, ECMR_RZPF = 0x00100000, 345*4882a593Smuzhiyun ECMR_ZPF = 0x00080000, ECMR_PFR = 0x00040000, ECMR_RXF = 0x00020000, 346*4882a593Smuzhiyun ECMR_TXF = 0x00010000, ECMR_MCT = 0x00002000, ECMR_PRCEF = 0x00001000, 347*4882a593Smuzhiyun ECMR_MPDE = 0x00000200, ECMR_RE = 0x00000040, ECMR_TE = 0x00000020, 348*4882a593Smuzhiyun ECMR_RTM = 0x00000010, ECMR_ILB = 0x00000008, ECMR_ELB = 0x00000004, 349*4882a593Smuzhiyun ECMR_DM = 0x00000002, ECMR_PRM = 0x00000001, 350*4882a593Smuzhiyun }; 351*4882a593Smuzhiyun 352*4882a593Smuzhiyun /* ECSR */ 353*4882a593Smuzhiyun enum ECSR_STATUS_BIT { 354*4882a593Smuzhiyun ECSR_BRCRX = 0x20, ECSR_PSRTO = 0x10, 355*4882a593Smuzhiyun ECSR_LCHNG = 0x04, 356*4882a593Smuzhiyun ECSR_MPD = 0x02, ECSR_ICD = 0x01, 357*4882a593Smuzhiyun }; 358*4882a593Smuzhiyun 359*4882a593Smuzhiyun #define DEFAULT_ECSR_INIT (ECSR_BRCRX | ECSR_PSRTO | ECSR_LCHNG | \ 360*4882a593Smuzhiyun ECSR_ICD | ECSIPR_MPDIP) 361*4882a593Smuzhiyun 362*4882a593Smuzhiyun /* ECSIPR */ 363*4882a593Smuzhiyun enum ECSIPR_STATUS_MASK_BIT { 364*4882a593Smuzhiyun ECSIPR_BRCRXIP = 0x20, ECSIPR_PSRTOIP = 0x10, 365*4882a593Smuzhiyun ECSIPR_LCHNGIP = 0x04, 366*4882a593Smuzhiyun ECSIPR_MPDIP = 0x02, ECSIPR_ICDIP = 0x01, 367*4882a593Smuzhiyun }; 368*4882a593Smuzhiyun 369*4882a593Smuzhiyun #define DEFAULT_ECSIPR_INIT (ECSIPR_BRCRXIP | ECSIPR_PSRTOIP | \ 370*4882a593Smuzhiyun ECSIPR_LCHNGIP | ECSIPR_ICDIP | ECSIPR_MPDIP) 371*4882a593Smuzhiyun 372*4882a593Smuzhiyun /* APR */ 373*4882a593Smuzhiyun enum APR_BIT { 374*4882a593Smuzhiyun APR_AP = 0x0000ffff, 375*4882a593Smuzhiyun }; 376*4882a593Smuzhiyun 377*4882a593Smuzhiyun /* MPR */ 378*4882a593Smuzhiyun enum MPR_BIT { 379*4882a593Smuzhiyun MPR_MP = 0x0000ffff, 380*4882a593Smuzhiyun }; 381*4882a593Smuzhiyun 382*4882a593Smuzhiyun /* TRSCER */ 383*4882a593Smuzhiyun enum DESC_I_BIT { 384*4882a593Smuzhiyun DESC_I_TINT4 = 0x0800, DESC_I_TINT3 = 0x0400, DESC_I_TINT2 = 0x0200, 385*4882a593Smuzhiyun DESC_I_TINT1 = 0x0100, DESC_I_RINT8 = 0x0080, DESC_I_RINT5 = 0x0010, 386*4882a593Smuzhiyun DESC_I_RINT4 = 0x0008, DESC_I_RINT3 = 0x0004, DESC_I_RINT2 = 0x0002, 387*4882a593Smuzhiyun DESC_I_RINT1 = 0x0001, 388*4882a593Smuzhiyun }; 389*4882a593Smuzhiyun 390*4882a593Smuzhiyun #define DEFAULT_TRSCER_ERR_MASK (DESC_I_RINT8 | DESC_I_RINT5 | DESC_I_TINT2) 391*4882a593Smuzhiyun 392*4882a593Smuzhiyun /* RPADIR */ 393*4882a593Smuzhiyun enum RPADIR_BIT { 394*4882a593Smuzhiyun RPADIR_PADS = 0x1f0000, RPADIR_PADR = 0xffff, 395*4882a593Smuzhiyun }; 396*4882a593Smuzhiyun 397*4882a593Smuzhiyun /* FDR */ 398*4882a593Smuzhiyun #define DEFAULT_FDR_INIT 0x00000707 399*4882a593Smuzhiyun 400*4882a593Smuzhiyun /* ARSTR */ 401*4882a593Smuzhiyun enum ARSTR_BIT { ARSTR_ARST = 0x00000001, }; 402*4882a593Smuzhiyun 403*4882a593Smuzhiyun /* TSU_FWEN0 */ 404*4882a593Smuzhiyun enum TSU_FWEN0_BIT { 405*4882a593Smuzhiyun TSU_FWEN0_0 = 0x00000001, 406*4882a593Smuzhiyun }; 407*4882a593Smuzhiyun 408*4882a593Smuzhiyun /* TSU_ADSBSY */ 409*4882a593Smuzhiyun enum TSU_ADSBSY_BIT { 410*4882a593Smuzhiyun TSU_ADSBSY_0 = 0x00000001, 411*4882a593Smuzhiyun }; 412*4882a593Smuzhiyun 413*4882a593Smuzhiyun /* TSU_TEN */ 414*4882a593Smuzhiyun enum TSU_TEN_BIT { 415*4882a593Smuzhiyun TSU_TEN_0 = 0x80000000, 416*4882a593Smuzhiyun }; 417*4882a593Smuzhiyun 418*4882a593Smuzhiyun /* TSU_FWSL0 */ 419*4882a593Smuzhiyun enum TSU_FWSL0_BIT { 420*4882a593Smuzhiyun TSU_FWSL0_FW50 = 0x1000, TSU_FWSL0_FW40 = 0x0800, 421*4882a593Smuzhiyun TSU_FWSL0_FW30 = 0x0400, TSU_FWSL0_FW20 = 0x0200, 422*4882a593Smuzhiyun TSU_FWSL0_FW10 = 0x0100, TSU_FWSL0_RMSA0 = 0x0010, 423*4882a593Smuzhiyun }; 424*4882a593Smuzhiyun 425*4882a593Smuzhiyun /* TSU_FWSLC */ 426*4882a593Smuzhiyun enum TSU_FWSLC_BIT { 427*4882a593Smuzhiyun TSU_FWSLC_POSTENU = 0x2000, TSU_FWSLC_POSTENL = 0x1000, 428*4882a593Smuzhiyun TSU_FWSLC_CAMSEL03 = 0x0080, TSU_FWSLC_CAMSEL02 = 0x0040, 429*4882a593Smuzhiyun TSU_FWSLC_CAMSEL01 = 0x0020, TSU_FWSLC_CAMSEL00 = 0x0010, 430*4882a593Smuzhiyun TSU_FWSLC_CAMSEL13 = 0x0008, TSU_FWSLC_CAMSEL12 = 0x0004, 431*4882a593Smuzhiyun TSU_FWSLC_CAMSEL11 = 0x0002, TSU_FWSLC_CAMSEL10 = 0x0001, 432*4882a593Smuzhiyun }; 433*4882a593Smuzhiyun 434*4882a593Smuzhiyun /* TSU_VTAGn */ 435*4882a593Smuzhiyun #define TSU_VTAG_ENABLE 0x80000000 436*4882a593Smuzhiyun #define TSU_VTAG_VID_MASK 0x00000fff 437*4882a593Smuzhiyun 438*4882a593Smuzhiyun /* The sh ether Tx buffer descriptors. 439*4882a593Smuzhiyun * This structure should be 20 bytes. 440*4882a593Smuzhiyun */ 441*4882a593Smuzhiyun struct sh_eth_txdesc { 442*4882a593Smuzhiyun u32 status; /* TD0 */ 443*4882a593Smuzhiyun u32 len; /* TD1 */ 444*4882a593Smuzhiyun u32 addr; /* TD2 */ 445*4882a593Smuzhiyun u32 pad0; /* padding data */ 446*4882a593Smuzhiyun } __aligned(2) __packed; 447*4882a593Smuzhiyun 448*4882a593Smuzhiyun /* The sh ether Rx buffer descriptors. 449*4882a593Smuzhiyun * This structure should be 20 bytes. 450*4882a593Smuzhiyun */ 451*4882a593Smuzhiyun struct sh_eth_rxdesc { 452*4882a593Smuzhiyun u32 status; /* RD0 */ 453*4882a593Smuzhiyun u32 len; /* RD1 */ 454*4882a593Smuzhiyun u32 addr; /* RD2 */ 455*4882a593Smuzhiyun u32 pad0; /* padding data */ 456*4882a593Smuzhiyun } __aligned(2) __packed; 457*4882a593Smuzhiyun 458*4882a593Smuzhiyun /* This structure is used by each CPU dependency handling. */ 459*4882a593Smuzhiyun struct sh_eth_cpu_data { 460*4882a593Smuzhiyun /* mandatory functions */ 461*4882a593Smuzhiyun int (*soft_reset)(struct net_device *ndev); 462*4882a593Smuzhiyun 463*4882a593Smuzhiyun /* optional functions */ 464*4882a593Smuzhiyun void (*chip_reset)(struct net_device *ndev); 465*4882a593Smuzhiyun void (*set_duplex)(struct net_device *ndev); 466*4882a593Smuzhiyun void (*set_rate)(struct net_device *ndev); 467*4882a593Smuzhiyun 468*4882a593Smuzhiyun /* mandatory initialize value */ 469*4882a593Smuzhiyun int register_type; 470*4882a593Smuzhiyun u32 edtrr_trns; 471*4882a593Smuzhiyun u32 eesipr_value; 472*4882a593Smuzhiyun 473*4882a593Smuzhiyun /* optional initialize value */ 474*4882a593Smuzhiyun u32 ecsr_value; 475*4882a593Smuzhiyun u32 ecsipr_value; 476*4882a593Smuzhiyun u32 fdr_value; 477*4882a593Smuzhiyun u32 fcftr_value; 478*4882a593Smuzhiyun 479*4882a593Smuzhiyun /* interrupt checking mask */ 480*4882a593Smuzhiyun u32 tx_check; 481*4882a593Smuzhiyun u32 eesr_err_check; 482*4882a593Smuzhiyun 483*4882a593Smuzhiyun /* Error mask */ 484*4882a593Smuzhiyun u32 trscer_err_mask; 485*4882a593Smuzhiyun 486*4882a593Smuzhiyun /* hardware features */ 487*4882a593Smuzhiyun unsigned long irq_flags; /* IRQ configuration flags */ 488*4882a593Smuzhiyun unsigned no_psr:1; /* EtherC DOES NOT have PSR */ 489*4882a593Smuzhiyun unsigned apr:1; /* EtherC has APR */ 490*4882a593Smuzhiyun unsigned mpr:1; /* EtherC has MPR */ 491*4882a593Smuzhiyun unsigned tpauser:1; /* EtherC has TPAUSER */ 492*4882a593Smuzhiyun unsigned gecmr:1; /* EtherC has GECMR */ 493*4882a593Smuzhiyun unsigned bculr:1; /* EtherC has BCULR */ 494*4882a593Smuzhiyun unsigned tsu:1; /* EtherC has TSU */ 495*4882a593Smuzhiyun unsigned hw_swap:1; /* E-DMAC has DE bit in EDMR */ 496*4882a593Smuzhiyun unsigned nbst:1; /* E-DMAC has NBST bit in EDMR */ 497*4882a593Smuzhiyun unsigned rpadir:1; /* E-DMAC has RPADIR */ 498*4882a593Smuzhiyun unsigned no_trimd:1; /* E-DMAC DOES NOT have TRIMD */ 499*4882a593Smuzhiyun unsigned no_ade:1; /* E-DMAC DOES NOT have ADE bit in EESR */ 500*4882a593Smuzhiyun unsigned no_xdfar:1; /* E-DMAC DOES NOT have RDFAR/TDFAR */ 501*4882a593Smuzhiyun unsigned xdfar_rw:1; /* E-DMAC has writeable RDFAR/TDFAR */ 502*4882a593Smuzhiyun unsigned csmr:1; /* E-DMAC has CSMR */ 503*4882a593Smuzhiyun unsigned rx_csum:1; /* EtherC has ECMR.RCSC */ 504*4882a593Smuzhiyun unsigned select_mii:1; /* EtherC has RMII_MII (MII select register) */ 505*4882a593Smuzhiyun unsigned rmiimode:1; /* EtherC has RMIIMODE register */ 506*4882a593Smuzhiyun unsigned rtrate:1; /* EtherC has RTRATE register */ 507*4882a593Smuzhiyun unsigned magic:1; /* EtherC has ECMR.MPDE and ECSR.MPD */ 508*4882a593Smuzhiyun unsigned no_tx_cntrs:1; /* EtherC DOES NOT have TX error counters */ 509*4882a593Smuzhiyun unsigned cexcr:1; /* EtherC has CERCR/CEECR */ 510*4882a593Smuzhiyun unsigned dual_port:1; /* Dual EtherC/E-DMAC */ 511*4882a593Smuzhiyun }; 512*4882a593Smuzhiyun 513*4882a593Smuzhiyun struct sh_eth_private { 514*4882a593Smuzhiyun struct platform_device *pdev; 515*4882a593Smuzhiyun struct sh_eth_cpu_data *cd; 516*4882a593Smuzhiyun const u16 *reg_offset; 517*4882a593Smuzhiyun void __iomem *addr; 518*4882a593Smuzhiyun void __iomem *tsu_addr; 519*4882a593Smuzhiyun struct clk *clk; 520*4882a593Smuzhiyun u32 num_rx_ring; 521*4882a593Smuzhiyun u32 num_tx_ring; 522*4882a593Smuzhiyun dma_addr_t rx_desc_dma; 523*4882a593Smuzhiyun dma_addr_t tx_desc_dma; 524*4882a593Smuzhiyun struct sh_eth_rxdesc *rx_ring; 525*4882a593Smuzhiyun struct sh_eth_txdesc *tx_ring; 526*4882a593Smuzhiyun struct sk_buff **rx_skbuff; 527*4882a593Smuzhiyun struct sk_buff **tx_skbuff; 528*4882a593Smuzhiyun spinlock_t lock; /* Register access lock */ 529*4882a593Smuzhiyun u32 cur_rx, dirty_rx; /* Producer/consumer ring indices */ 530*4882a593Smuzhiyun u32 cur_tx, dirty_tx; 531*4882a593Smuzhiyun u32 rx_buf_sz; /* Based on MTU+slack. */ 532*4882a593Smuzhiyun struct napi_struct napi; 533*4882a593Smuzhiyun bool irq_enabled; 534*4882a593Smuzhiyun /* MII transceiver section. */ 535*4882a593Smuzhiyun u32 phy_id; /* PHY ID */ 536*4882a593Smuzhiyun struct mii_bus *mii_bus; /* MDIO bus control */ 537*4882a593Smuzhiyun int link; 538*4882a593Smuzhiyun phy_interface_t phy_interface; 539*4882a593Smuzhiyun int msg_enable; 540*4882a593Smuzhiyun int speed; 541*4882a593Smuzhiyun int duplex; 542*4882a593Smuzhiyun int port; /* for TSU */ 543*4882a593Smuzhiyun int vlan_num_ids; /* for VLAN tag filter */ 544*4882a593Smuzhiyun 545*4882a593Smuzhiyun unsigned no_ether_link:1; 546*4882a593Smuzhiyun unsigned ether_link_active_low:1; 547*4882a593Smuzhiyun unsigned is_opened:1; 548*4882a593Smuzhiyun unsigned wol_enabled:1; 549*4882a593Smuzhiyun }; 550*4882a593Smuzhiyun 551*4882a593Smuzhiyun #endif /* #ifndef __SH_ETH_H__ */ 552