0001
0002
0003
0004
0005
0006
0007
0008 #ifndef __SH_ETH_H__
0009 #define __SH_ETH_H__
0010
0011 #define CARDNAME "sh-eth"
0012 #define TX_TIMEOUT (5*HZ)
0013 #define TX_RING_SIZE 64
0014 #define RX_RING_SIZE 64
0015 #define TX_RING_MIN 64
0016 #define RX_RING_MIN 64
0017 #define TX_RING_MAX 1024
0018 #define RX_RING_MAX 1024
0019 #define PKT_BUF_SZ 1538
0020 #define SH_ETH_TSU_TIMEOUT_MS 500
0021 #define SH_ETH_TSU_CAM_ENTRIES 32
0022
0023 enum {
0024
0025
0026
0027
0028
0029 EDSR = 0,
0030 EDMR,
0031 EDTRR,
0032 EDRRR,
0033 EESR,
0034 EESIPR,
0035 TDLAR,
0036 TDFAR,
0037 TDFXR,
0038 TDFFR,
0039 RDLAR,
0040 RDFAR,
0041 RDFXR,
0042 RDFFR,
0043 TRSCER,
0044 RMFCR,
0045 TFTR,
0046 FDR,
0047 RMCR,
0048 EDOCR,
0049 TFUCR,
0050 RFOCR,
0051 RMIIMODE,
0052 FCFTR,
0053 RPADIR,
0054 TRIMD,
0055 RBWAR,
0056 TBRAR,
0057
0058
0059 ECMR,
0060 ECSR,
0061 ECSIPR,
0062 PIR,
0063 PSR,
0064 RDMLR,
0065 PIPR,
0066 RFLR,
0067 IPGR,
0068 APR,
0069 MPR,
0070 PFTCR,
0071 PFRCR,
0072 RFCR,
0073 RFCF,
0074 TPAUSER,
0075 TPAUSECR,
0076 BCFR,
0077 BCFRR,
0078 GECMR,
0079 BCULR,
0080 MAHR,
0081 MALR,
0082 TROCR,
0083 CDCR,
0084 LCCR,
0085 CNDCR,
0086 CEFCR,
0087 FRECR,
0088 TSFRCR,
0089 TLFRCR,
0090 CERCR,
0091 CEECR,
0092 MAFCR,
0093 RTRATE,
0094 CSMR,
0095 RMII_MII,
0096
0097
0098 ARSTR,
0099 TSU_CTRST,
0100 TSU_FWEN0,
0101 TSU_FWEN1,
0102 TSU_FCM,
0103 TSU_BSYSL0,
0104 TSU_BSYSL1,
0105 TSU_PRISL0,
0106 TSU_PRISL1,
0107 TSU_FWSL0,
0108 TSU_FWSL1,
0109 TSU_FWSLC,
0110 TSU_QTAG0,
0111 TSU_QTAG1,
0112 TSU_QTAGM0,
0113 TSU_QTAGM1,
0114 TSU_FWSR,
0115 TSU_FWINMK,
0116 TSU_ADQT0,
0117 TSU_ADQT1,
0118 TSU_VTAG0,
0119 TSU_VTAG1,
0120 TSU_ADSBSY,
0121 TSU_TEN,
0122 TSU_POST1,
0123 TSU_POST2,
0124 TSU_POST3,
0125 TSU_POST4,
0126 TSU_ADRH0,
0127
0128
0129 TXNLCR0,
0130 TXALCR0,
0131 RXNLCR0,
0132 RXALCR0,
0133 FWNLCR0,
0134 FWALCR0,
0135 TXNLCR1,
0136 TXALCR1,
0137 RXNLCR1,
0138 RXALCR1,
0139 FWNLCR1,
0140 FWALCR1,
0141
0142
0143 SH_ETH_MAX_REGISTER_OFFSET,
0144 };
0145
0146 enum {
0147 SH_ETH_REG_GIGABIT,
0148 SH_ETH_REG_FAST_RCAR,
0149 SH_ETH_REG_FAST_SH4,
0150 SH_ETH_REG_FAST_SH3_SH2
0151 };
0152
0153
0154 #if defined(CONFIG_CPU_SH4) || defined(CONFIG_ARCH_RENESAS)
0155 #define SH_ETH_RX_ALIGN 32
0156 #else
0157 #define SH_ETH_RX_ALIGN 2
0158 #endif
0159
0160
0161
0162
0163 enum EDSR_BIT {
0164 EDSR_ENT = 0x01, EDSR_ENR = 0x02,
0165 };
0166 #define EDSR_ENALL (EDSR_ENT|EDSR_ENR)
0167
0168
0169 enum GECMR_BIT {
0170 GECMR_10 = 0x0, GECMR_100 = 0x04, GECMR_1000 = 0x01,
0171 };
0172
0173
0174 enum EDMR_BIT {
0175 EDMR_NBST = 0x80,
0176 EDMR_EL = 0x40,
0177 EDMR_DL1 = 0x20, EDMR_DL0 = 0x10,
0178 EDMR_SRST_GETHER = 0x03,
0179 EDMR_SRST_ETHER = 0x01,
0180 };
0181
0182
0183 enum EDTRR_BIT {
0184 EDTRR_TRNS_GETHER = 0x03,
0185 EDTRR_TRNS_ETHER = 0x01,
0186 };
0187
0188
0189 enum EDRRR_BIT {
0190 EDRRR_R = 0x01,
0191 };
0192
0193
0194 enum TPAUSER_BIT {
0195 TPAUSER_TPAUSE = 0x0000ffff,
0196 TPAUSER_UNLIMITED = 0,
0197 };
0198
0199
0200 enum BCFR_BIT {
0201 BCFR_RPAUSE = 0x0000ffff,
0202 BCFR_UNLIMITED = 0,
0203 };
0204
0205
0206 enum PIR_BIT {
0207 PIR_MDI = 0x08, PIR_MDO = 0x04, PIR_MMD = 0x02, PIR_MDC = 0x01,
0208 };
0209
0210
0211 enum PSR_BIT { PSR_LMON = 0x01, };
0212
0213
0214 enum EESR_BIT {
0215 EESR_TWB1 = 0x80000000,
0216 EESR_TWB = 0x40000000,
0217 EESR_TC1 = 0x20000000,
0218 EESR_TUC = 0x10000000,
0219 EESR_ROC = 0x08000000,
0220 EESR_TABT = 0x04000000,
0221 EESR_RABT = 0x02000000,
0222 EESR_RFRMER = 0x01000000,
0223 EESR_ADE = 0x00800000,
0224 EESR_ECI = 0x00400000,
0225 EESR_FTC = 0x00200000,
0226 EESR_TDE = 0x00100000,
0227 EESR_TFE = 0x00080000,
0228 EESR_FRC = 0x00040000,
0229 EESR_RDE = 0x00020000,
0230 EESR_RFE = 0x00010000,
0231 EESR_CND = 0x00000800,
0232 EESR_DLC = 0x00000400,
0233 EESR_CD = 0x00000200,
0234 EESR_TRO = 0x00000100,
0235 EESR_RMAF = 0x00000080,
0236 EESR_CEEF = 0x00000040,
0237 EESR_CELF = 0x00000020,
0238 EESR_RRF = 0x00000010,
0239 EESR_RTLF = 0x00000008,
0240 EESR_RTSF = 0x00000004,
0241 EESR_PRE = 0x00000002,
0242 EESR_CERF = 0x00000001,
0243 };
0244
0245 #define EESR_RX_CHECK (EESR_FRC | \
0246 EESR_RMAF | \
0247 EESR_RRF | \
0248 EESR_RTLF | \
0249 EESR_RTSF | \
0250 EESR_PRE | \
0251 EESR_CERF)
0252
0253 #define DEFAULT_TX_CHECK (EESR_FTC | EESR_CND | EESR_DLC | EESR_CD | \
0254 EESR_TRO)
0255 #define DEFAULT_EESR_ERR_CHECK (EESR_TWB | EESR_TABT | EESR_RABT | EESR_RFE | \
0256 EESR_RDE | EESR_RFRMER | EESR_ADE | \
0257 EESR_TFE | EESR_TDE)
0258
0259
0260 enum EESIPR_BIT {
0261 EESIPR_TWB1IP = 0x80000000,
0262 EESIPR_TWBIP = 0x40000000,
0263 EESIPR_TC1IP = 0x20000000,
0264 EESIPR_TUCIP = 0x10000000,
0265 EESIPR_ROCIP = 0x08000000,
0266 EESIPR_TABTIP = 0x04000000,
0267 EESIPR_RABTIP = 0x02000000,
0268 EESIPR_RFCOFIP = 0x01000000,
0269 EESIPR_ADEIP = 0x00800000,
0270 EESIPR_ECIIP = 0x00400000,
0271 EESIPR_FTCIP = 0x00200000,
0272 EESIPR_TDEIP = 0x00100000,
0273 EESIPR_TFUFIP = 0x00080000,
0274 EESIPR_FRIP = 0x00040000,
0275 EESIPR_RDEIP = 0x00020000,
0276 EESIPR_RFOFIP = 0x00010000,
0277 EESIPR_CNDIP = 0x00000800,
0278 EESIPR_DLCIP = 0x00000400,
0279 EESIPR_CDIP = 0x00000200,
0280 EESIPR_TROIP = 0x00000100,
0281 EESIPR_RMAFIP = 0x00000080,
0282 EESIPR_CEEFIP = 0x00000040,
0283 EESIPR_CELFIP = 0x00000020,
0284 EESIPR_RRFIP = 0x00000010,
0285 EESIPR_RTLFIP = 0x00000008,
0286 EESIPR_RTSFIP = 0x00000004,
0287 EESIPR_PREIP = 0x00000002,
0288 EESIPR_CERFIP = 0x00000001,
0289 };
0290
0291
0292 enum FCFTR_BIT {
0293 FCFTR_RFF2 = 0x00040000, FCFTR_RFF1 = 0x00020000,
0294 FCFTR_RFF0 = 0x00010000, FCFTR_RFD2 = 0x00000004,
0295 FCFTR_RFD1 = 0x00000002, FCFTR_RFD0 = 0x00000001,
0296 };
0297 #define DEFAULT_FIFO_F_D_RFF (FCFTR_RFF2 | FCFTR_RFF1 | FCFTR_RFF0)
0298 #define DEFAULT_FIFO_F_D_RFD (FCFTR_RFD2 | FCFTR_RFD1 | FCFTR_RFD0)
0299
0300
0301 enum RMCR_BIT {
0302 RMCR_RNC = 0x00000001,
0303 };
0304
0305
0306 enum ECMR_BIT {
0307 ECMR_TRCCM = 0x04000000, ECMR_RCSC = 0x00800000,
0308 ECMR_DPAD = 0x00200000, ECMR_RZPF = 0x00100000,
0309 ECMR_ZPF = 0x00080000, ECMR_PFR = 0x00040000, ECMR_RXF = 0x00020000,
0310 ECMR_TXF = 0x00010000, ECMR_MCT = 0x00002000, ECMR_PRCEF = 0x00001000,
0311 ECMR_MPDE = 0x00000200, ECMR_RE = 0x00000040, ECMR_TE = 0x00000020,
0312 ECMR_RTM = 0x00000010, ECMR_ILB = 0x00000008, ECMR_ELB = 0x00000004,
0313 ECMR_DM = 0x00000002, ECMR_PRM = 0x00000001,
0314 };
0315
0316
0317 enum ECSR_BIT {
0318 ECSR_BRCRX = 0x20, ECSR_PSRTO = 0x10,
0319 ECSR_LCHNG = 0x04,
0320 ECSR_MPD = 0x02, ECSR_ICD = 0x01,
0321 };
0322
0323 #define DEFAULT_ECSR_INIT (ECSR_BRCRX | ECSR_PSRTO | ECSR_LCHNG | \
0324 ECSR_ICD | ECSIPR_MPDIP)
0325
0326
0327 enum ECSIPR_BIT {
0328 ECSIPR_BRCRXIP = 0x20, ECSIPR_PSRTOIP = 0x10,
0329 ECSIPR_LCHNGIP = 0x04,
0330 ECSIPR_MPDIP = 0x02, ECSIPR_ICDIP = 0x01,
0331 };
0332
0333 #define DEFAULT_ECSIPR_INIT (ECSIPR_BRCRXIP | ECSIPR_PSRTOIP | \
0334 ECSIPR_LCHNGIP | ECSIPR_ICDIP | ECSIPR_MPDIP)
0335
0336
0337 enum APR_BIT {
0338 APR_AP = 0x0000ffff,
0339 };
0340
0341
0342 enum MPR_BIT {
0343 MPR_MP = 0x0000ffff,
0344 };
0345
0346
0347 enum TRSCER_BIT {
0348 TRSCER_CNDCE = 0x00000800,
0349 TRSCER_DLCCE = 0x00000400,
0350 TRSCER_CDCE = 0x00000200,
0351 TRSCER_TROCE = 0x00000100,
0352 TRSCER_RMAFCE = 0x00000080,
0353 TRSCER_RRFCE = 0x00000010,
0354 TRSCER_RTLFCE = 0x00000008,
0355 TRSCER_RTSFCE = 0x00000004,
0356 TRSCER_PRECE = 0x00000002,
0357 TRSCER_CERFCE = 0x00000001,
0358 };
0359
0360 #define DEFAULT_TRSCER_ERR_MASK (TRSCER_RMAFCE | TRSCER_RRFCE | TRSCER_CDCE)
0361
0362
0363 enum RPADIR_BIT {
0364 RPADIR_PADS = 0x1f0000, RPADIR_PADR = 0xffff,
0365 };
0366
0367
0368 #define DEFAULT_FDR_INIT 0x00000707
0369
0370
0371 enum ARSTR_BIT { ARSTR_ARST = 0x00000001, };
0372
0373
0374 enum TSU_FWEN0_BIT {
0375 TSU_FWEN0_0 = 0x00000001,
0376 };
0377
0378
0379 enum TSU_ADSBSY_BIT {
0380 TSU_ADSBSY_0 = 0x00000001,
0381 };
0382
0383
0384 enum TSU_TEN_BIT {
0385 TSU_TEN_0 = 0x80000000,
0386 };
0387
0388
0389 enum TSU_FWSL0_BIT {
0390 TSU_FWSL0_FW50 = 0x1000, TSU_FWSL0_FW40 = 0x0800,
0391 TSU_FWSL0_FW30 = 0x0400, TSU_FWSL0_FW20 = 0x0200,
0392 TSU_FWSL0_FW10 = 0x0100, TSU_FWSL0_RMSA0 = 0x0010,
0393 };
0394
0395
0396 enum TSU_FWSLC_BIT {
0397 TSU_FWSLC_POSTENU = 0x2000, TSU_FWSLC_POSTENL = 0x1000,
0398 TSU_FWSLC_CAMSEL03 = 0x0080, TSU_FWSLC_CAMSEL02 = 0x0040,
0399 TSU_FWSLC_CAMSEL01 = 0x0020, TSU_FWSLC_CAMSEL00 = 0x0010,
0400 TSU_FWSLC_CAMSEL13 = 0x0008, TSU_FWSLC_CAMSEL12 = 0x0004,
0401 TSU_FWSLC_CAMSEL11 = 0x0002, TSU_FWSLC_CAMSEL10 = 0x0001,
0402 };
0403
0404
0405 #define TSU_VTAG_ENABLE 0x80000000
0406 #define TSU_VTAG_VID_MASK 0x00000fff
0407
0408
0409
0410
0411 struct sh_eth_txdesc {
0412 u32 status;
0413 u32 len;
0414 u32 addr;
0415 u32 pad0;
0416 } __aligned(2) __packed;
0417
0418
0419 enum TD_STS_BIT {
0420 TD_TACT = 0x80000000,
0421 TD_TDLE = 0x40000000,
0422 TD_TFP1 = 0x20000000,
0423 TD_TFP0 = 0x10000000,
0424 TD_TFE = 0x08000000,
0425 TD_TWBI = 0x04000000,
0426 };
0427 #define TDF1ST TD_TFP1
0428 #define TDFEND TD_TFP0
0429 #define TD_TFP (TD_TFP1 | TD_TFP0)
0430
0431
0432 enum TD_LEN_BIT {
0433 TD_TBL = 0xffff0000,
0434 };
0435
0436
0437
0438
0439 struct sh_eth_rxdesc {
0440 u32 status;
0441 u32 len;
0442 u32 addr;
0443 u32 pad0;
0444 } __aligned(2) __packed;
0445
0446
0447 enum RD_STS_BIT {
0448 RD_RACT = 0x80000000,
0449 RD_RDLE = 0x40000000,
0450 RD_RFP1 = 0x20000000,
0451 RD_RFP0 = 0x10000000,
0452 RD_RFE = 0x08000000,
0453 RD_RFS10 = 0x00000200,
0454 RD_RFS9 = 0x00000100,
0455 RD_RFS8 = 0x00000080,
0456 RD_RFS7 = 0x00000040,
0457 RD_RFS6 = 0x00000020,
0458 RD_RFS5 = 0x00000010,
0459 RD_RFS4 = 0x00000008,
0460 RD_RFS3 = 0x00000004,
0461 RD_RFS2 = 0x00000002,
0462 RD_RFS1 = 0x00000001,
0463 };
0464 #define RDF1ST RD_RFP1
0465 #define RDFEND RD_RFP0
0466 #define RD_RFP (RD_RFP1 | RD_RFP0)
0467
0468
0469 enum RD_LEN_BIT {
0470 RD_RFL = 0x0000ffff,
0471 RD_RBL = 0xffff0000,
0472 };
0473
0474
0475 struct sh_eth_cpu_data {
0476
0477 int (*soft_reset)(struct net_device *ndev);
0478
0479
0480 void (*chip_reset)(struct net_device *ndev);
0481 void (*set_duplex)(struct net_device *ndev);
0482 void (*set_rate)(struct net_device *ndev);
0483
0484
0485 int register_type;
0486 u32 edtrr_trns;
0487 u32 eesipr_value;
0488
0489
0490 u32 ecsr_value;
0491 u32 ecsipr_value;
0492 u32 fdr_value;
0493 u32 fcftr_value;
0494
0495
0496 u32 tx_check;
0497 u32 eesr_err_check;
0498
0499
0500 u32 trscer_err_mask;
0501
0502
0503 unsigned long irq_flags;
0504 unsigned no_psr:1;
0505 unsigned apr:1;
0506 unsigned mpr:1;
0507 unsigned tpauser:1;
0508 unsigned gecmr:1;
0509 unsigned bculr:1;
0510 unsigned tsu:1;
0511 unsigned hw_swap:1;
0512 unsigned nbst:1;
0513 unsigned rpadir:1;
0514 unsigned no_trimd:1;
0515 unsigned no_ade:1;
0516 unsigned no_xdfar:1;
0517 unsigned xdfar_rw:1;
0518 unsigned csmr:1;
0519 unsigned rx_csum:1;
0520 unsigned select_mii:1;
0521 unsigned rmiimode:1;
0522 unsigned rtrate:1;
0523 unsigned magic:1;
0524 unsigned no_tx_cntrs:1;
0525 unsigned cexcr:1;
0526 unsigned dual_port:1;
0527 };
0528
0529 struct sh_eth_private {
0530 struct platform_device *pdev;
0531 struct sh_eth_cpu_data *cd;
0532 const u16 *reg_offset;
0533 void __iomem *addr;
0534 void __iomem *tsu_addr;
0535 struct clk *clk;
0536 u32 num_rx_ring;
0537 u32 num_tx_ring;
0538 dma_addr_t rx_desc_dma;
0539 dma_addr_t tx_desc_dma;
0540 struct sh_eth_rxdesc *rx_ring;
0541 struct sh_eth_txdesc *tx_ring;
0542 struct sk_buff **rx_skbuff;
0543 struct sk_buff **tx_skbuff;
0544 spinlock_t lock;
0545 u32 cur_rx, dirty_rx;
0546 u32 cur_tx, dirty_tx;
0547 u32 rx_buf_sz;
0548 struct napi_struct napi;
0549 bool irq_enabled;
0550
0551 u32 phy_id;
0552 struct mii_bus *mii_bus;
0553 int link;
0554 phy_interface_t phy_interface;
0555 int msg_enable;
0556 int speed;
0557 int duplex;
0558 int port;
0559 int vlan_num_ids;
0560
0561 unsigned no_ether_link:1;
0562 unsigned ether_link_active_low:1;
0563 unsigned is_opened:1;
0564 unsigned wol_enabled:1;
0565 };
0566
0567 #endif