0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #ifndef __RAVB_H__
0012 #define __RAVB_H__
0013
0014 #include <linux/interrupt.h>
0015 #include <linux/io.h>
0016 #include <linux/kernel.h>
0017 #include <linux/mdio-bitbang.h>
0018 #include <linux/netdevice.h>
0019 #include <linux/phy.h>
0020 #include <linux/platform_device.h>
0021 #include <linux/ptp_clock_kernel.h>
0022
0023 #define BE_TX_RING_SIZE 64
0024 #define BE_RX_RING_SIZE 1024
0025 #define NC_TX_RING_SIZE 64
0026 #define NC_RX_RING_SIZE 64
0027 #define BE_TX_RING_MIN 64
0028 #define BE_RX_RING_MIN 64
0029 #define BE_TX_RING_MAX 1024
0030 #define BE_RX_RING_MAX 2048
0031
0032 #define PKT_BUF_SZ 1538
0033
0034
0035 #define RAVB_ALIGN 128
0036
0037
0038 #define RAVB_TXTSTAMP_VALID 0x00000001
0039 #define RAVB_TXTSTAMP_ENABLED 0x00000010
0040
0041 #define RAVB_RXTSTAMP_VALID 0x00000001
0042 #define RAVB_RXTSTAMP_TYPE 0x00000006
0043 #define RAVB_RXTSTAMP_TYPE_V2_L2_EVENT 0x00000002
0044 #define RAVB_RXTSTAMP_TYPE_ALL 0x00000006
0045 #define RAVB_RXTSTAMP_ENABLED 0x00000010
0046
0047 enum ravb_reg {
0048
0049 CCC = 0x0000,
0050 DBAT = 0x0004,
0051 DLR = 0x0008,
0052 CSR = 0x000C,
0053 CDAR0 = 0x0010,
0054 CDAR1 = 0x0014,
0055 CDAR2 = 0x0018,
0056 CDAR3 = 0x001C,
0057 CDAR4 = 0x0020,
0058 CDAR5 = 0x0024,
0059 CDAR6 = 0x0028,
0060 CDAR7 = 0x002C,
0061 CDAR8 = 0x0030,
0062 CDAR9 = 0x0034,
0063 CDAR10 = 0x0038,
0064 CDAR11 = 0x003C,
0065 CDAR12 = 0x0040,
0066 CDAR13 = 0x0044,
0067 CDAR14 = 0x0048,
0068 CDAR15 = 0x004C,
0069 CDAR16 = 0x0050,
0070 CDAR17 = 0x0054,
0071 CDAR18 = 0x0058,
0072 CDAR19 = 0x005C,
0073 CDAR20 = 0x0060,
0074 CDAR21 = 0x0064,
0075 ESR = 0x0088,
0076 APSR = 0x008C,
0077 RCR = 0x0090,
0078 RQC0 = 0x0094,
0079 RQC1 = 0x0098,
0080 RQC2 = 0x009C,
0081 RQC3 = 0x00A0,
0082 RQC4 = 0x00A4,
0083 RPC = 0x00B0,
0084 RTC = 0x00B4,
0085 UFCW = 0x00BC,
0086 UFCS = 0x00C0,
0087 UFCV0 = 0x00C4,
0088 UFCV1 = 0x00C8,
0089 UFCV2 = 0x00CC,
0090 UFCV3 = 0x00D0,
0091 UFCV4 = 0x00D4,
0092 UFCD0 = 0x00E0,
0093 UFCD1 = 0x00E4,
0094 UFCD2 = 0x00E8,
0095 UFCD3 = 0x00EC,
0096 UFCD4 = 0x00F0,
0097 SFO = 0x00FC,
0098 SFP0 = 0x0100,
0099 SFP1 = 0x0104,
0100 SFP2 = 0x0108,
0101 SFP3 = 0x010C,
0102 SFP4 = 0x0110,
0103 SFP5 = 0x0114,
0104 SFP6 = 0x0118,
0105 SFP7 = 0x011C,
0106 SFP8 = 0x0120,
0107 SFP9 = 0x0124,
0108 SFP10 = 0x0128,
0109 SFP11 = 0x012C,
0110 SFP12 = 0x0130,
0111 SFP13 = 0x0134,
0112 SFP14 = 0x0138,
0113 SFP15 = 0x013C,
0114 SFP16 = 0x0140,
0115 SFP17 = 0x0144,
0116 SFP18 = 0x0148,
0117 SFP19 = 0x014C,
0118 SFP20 = 0x0150,
0119 SFP21 = 0x0154,
0120 SFP22 = 0x0158,
0121 SFP23 = 0x015C,
0122 SFP24 = 0x0160,
0123 SFP25 = 0x0164,
0124 SFP26 = 0x0168,
0125 SFP27 = 0x016C,
0126 SFP28 = 0x0170,
0127 SFP29 = 0x0174,
0128 SFP30 = 0x0178,
0129 SFP31 = 0x017C,
0130 SFM0 = 0x01C0,
0131 SFM1 = 0x01C4,
0132 TGC = 0x0300,
0133 TCCR = 0x0304,
0134 TSR = 0x0308,
0135 TFA0 = 0x0310,
0136 TFA1 = 0x0314,
0137 TFA2 = 0x0318,
0138 CIVR0 = 0x0320,
0139 CIVR1 = 0x0324,
0140 CDVR0 = 0x0328,
0141 CDVR1 = 0x032C,
0142 CUL0 = 0x0330,
0143 CUL1 = 0x0334,
0144 CLL0 = 0x0338,
0145 CLL1 = 0x033C,
0146 DIC = 0x0350,
0147 DIS = 0x0354,
0148 EIC = 0x0358,
0149 EIS = 0x035C,
0150 RIC0 = 0x0360,
0151 RIS0 = 0x0364,
0152 RIC1 = 0x0368,
0153 RIS1 = 0x036C,
0154 RIC2 = 0x0370,
0155 RIS2 = 0x0374,
0156 TIC = 0x0378,
0157 TIS = 0x037C,
0158 ISS = 0x0380,
0159 CIE = 0x0384,
0160 GCCR = 0x0390,
0161 GMTT = 0x0394,
0162 GPTC = 0x0398,
0163 GTI = 0x039C,
0164 GTO0 = 0x03A0,
0165 GTO1 = 0x03A4,
0166 GTO2 = 0x03A8,
0167 GIC = 0x03AC,
0168 GIS = 0x03B0,
0169 GCPT = 0x03B4,
0170 GCT0 = 0x03B8,
0171 GCT1 = 0x03BC,
0172 GCT2 = 0x03C0,
0173 GIE = 0x03CC,
0174 GID = 0x03D0,
0175 DIL = 0x0440,
0176 RIE0 = 0x0460,
0177 RID0 = 0x0464,
0178 RIE2 = 0x0470,
0179 RID2 = 0x0474,
0180 TIE = 0x0478,
0181 TID = 0x047c,
0182
0183
0184 ECMR = 0x0500,
0185 RFLR = 0x0508,
0186 ECSR = 0x0510,
0187 ECSIPR = 0x0518,
0188 PIR = 0x0520,
0189 PSR = 0x0528,
0190 PIPR = 0x052c,
0191 CXR31 = 0x0530,
0192 MPR = 0x0558,
0193 PFTCR = 0x055c,
0194 PFRCR = 0x0560,
0195 GECMR = 0x05b0,
0196 MAHR = 0x05c0,
0197 MALR = 0x05c8,
0198 TROCR = 0x0700,
0199 CXR41 = 0x0708,
0200 CXR42 = 0x0710,
0201 CEFCR = 0x0740,
0202 FRECR = 0x0748,
0203 TSFRCR = 0x0750,
0204 TLFRCR = 0x0758,
0205 RFCR = 0x0760,
0206 MAFCR = 0x0778,
0207 CSR0 = 0x0800,
0208 };
0209
0210
0211
0212
0213 enum CCC_BIT {
0214 CCC_OPC = 0x00000003,
0215 CCC_OPC_RESET = 0x00000000,
0216 CCC_OPC_CONFIG = 0x00000001,
0217 CCC_OPC_OPERATION = 0x00000002,
0218 CCC_GAC = 0x00000080,
0219 CCC_DTSR = 0x00000100,
0220 CCC_CSEL = 0x00030000,
0221 CCC_CSEL_HPB = 0x00010000,
0222 CCC_CSEL_ETH_TX = 0x00020000,
0223 CCC_CSEL_GMII_REF = 0x00030000,
0224 CCC_LBME = 0x01000000,
0225 };
0226
0227
0228 enum CSR_BIT {
0229 CSR_OPS = 0x0000000F,
0230 CSR_OPS_RESET = 0x00000001,
0231 CSR_OPS_CONFIG = 0x00000002,
0232 CSR_OPS_OPERATION = 0x00000004,
0233 CSR_OPS_STANDBY = 0x00000008,
0234 CSR_DTS = 0x00000100,
0235 CSR_TPO0 = 0x00010000,
0236 CSR_TPO1 = 0x00020000,
0237 CSR_TPO2 = 0x00040000,
0238 CSR_TPO3 = 0x00080000,
0239 CSR_RPO = 0x00100000,
0240 };
0241
0242
0243 enum ESR_BIT {
0244 ESR_EQN = 0x0000001F,
0245 ESR_ET = 0x00000F00,
0246 ESR_EIL = 0x00001000,
0247 };
0248
0249
0250 enum APSR_BIT {
0251 APSR_MEMS = 0x00000002,
0252 APSR_CMSW = 0x00000010,
0253 APSR_RDM = 0x00002000,
0254 APSR_TDM = 0x00004000,
0255 };
0256
0257
0258 enum RCR_BIT {
0259 RCR_EFFS = 0x00000001,
0260 RCR_ENCF = 0x00000002,
0261 RCR_ESF = 0x0000000C,
0262 RCR_ETS0 = 0x00000010,
0263 RCR_ETS2 = 0x00000020,
0264 RCR_RFCL = 0x1FFF0000,
0265 };
0266
0267
0268 enum RQC_BIT {
0269 RQC_RSM0 = 0x00000003,
0270 RQC_UFCC0 = 0x00000030,
0271 RQC_RSM1 = 0x00000300,
0272 RQC_UFCC1 = 0x00003000,
0273 RQC_RSM2 = 0x00030000,
0274 RQC_UFCC2 = 0x00300000,
0275 RQC_RSM3 = 0x03000000,
0276 RQC_UFCC3 = 0x30000000,
0277 };
0278
0279
0280 enum RPC_BIT {
0281 RPC_PCNT = 0x00000700,
0282 RPC_DCNT = 0x00FF0000,
0283 };
0284
0285
0286 enum UFCW_BIT {
0287 UFCW_WL0 = 0x0000003F,
0288 UFCW_WL1 = 0x00003F00,
0289 UFCW_WL2 = 0x003F0000,
0290 UFCW_WL3 = 0x3F000000,
0291 };
0292
0293
0294 enum UFCS_BIT {
0295 UFCS_SL0 = 0x0000003F,
0296 UFCS_SL1 = 0x00003F00,
0297 UFCS_SL2 = 0x003F0000,
0298 UFCS_SL3 = 0x3F000000,
0299 };
0300
0301
0302 enum UFCV_BIT {
0303 UFCV_CV0 = 0x0000003F,
0304 UFCV_CV1 = 0x00003F00,
0305 UFCV_CV2 = 0x003F0000,
0306 UFCV_CV3 = 0x3F000000,
0307 };
0308
0309
0310 enum UFCD_BIT {
0311 UFCD_DV0 = 0x0000003F,
0312 UFCD_DV1 = 0x00003F00,
0313 UFCD_DV2 = 0x003F0000,
0314 UFCD_DV3 = 0x3F000000,
0315 };
0316
0317
0318 enum SFO_BIT {
0319 SFO_FBP = 0x0000003F,
0320 };
0321
0322
0323 enum RTC_BIT {
0324 RTC_MFL0 = 0x00000FFF,
0325 RTC_MFL1 = 0x0FFF0000,
0326 };
0327
0328
0329 enum TGC_BIT {
0330 TGC_TSM0 = 0x00000001,
0331 TGC_TSM1 = 0x00000002,
0332 TGC_TSM2 = 0x00000004,
0333 TGC_TSM3 = 0x00000008,
0334 TGC_TQP = 0x00000030,
0335 TGC_TQP_NONAVB = 0x00000000,
0336 TGC_TQP_AVBMODE1 = 0x00000010,
0337 TGC_TQP_AVBMODE2 = 0x00000030,
0338 TGC_TBD0 = 0x00000300,
0339 TGC_TBD1 = 0x00003000,
0340 TGC_TBD2 = 0x00030000,
0341 TGC_TBD3 = 0x00300000,
0342 };
0343
0344
0345 enum TCCR_BIT {
0346 TCCR_TSRQ0 = 0x00000001,
0347 TCCR_TSRQ1 = 0x00000002,
0348 TCCR_TSRQ2 = 0x00000004,
0349 TCCR_TSRQ3 = 0x00000008,
0350 TCCR_TFEN = 0x00000100,
0351 TCCR_TFR = 0x00000200,
0352 };
0353
0354
0355 enum TSR_BIT {
0356 TSR_CCS0 = 0x00000003,
0357 TSR_CCS1 = 0x0000000C,
0358 TSR_TFFL = 0x00000700,
0359 };
0360
0361
0362 enum TFA2_BIT {
0363 TFA2_TSV = 0x0000FFFF,
0364 TFA2_TST = 0x03FF0000,
0365 };
0366
0367
0368 enum DIC_BIT {
0369 DIC_DPE1 = 0x00000002,
0370 DIC_DPE2 = 0x00000004,
0371 DIC_DPE3 = 0x00000008,
0372 DIC_DPE4 = 0x00000010,
0373 DIC_DPE5 = 0x00000020,
0374 DIC_DPE6 = 0x00000040,
0375 DIC_DPE7 = 0x00000080,
0376 DIC_DPE8 = 0x00000100,
0377 DIC_DPE9 = 0x00000200,
0378 DIC_DPE10 = 0x00000400,
0379 DIC_DPE11 = 0x00000800,
0380 DIC_DPE12 = 0x00001000,
0381 DIC_DPE13 = 0x00002000,
0382 DIC_DPE14 = 0x00004000,
0383 DIC_DPE15 = 0x00008000,
0384 };
0385
0386
0387 enum DIS_BIT {
0388 DIS_DPF1 = 0x00000002,
0389 DIS_DPF2 = 0x00000004,
0390 DIS_DPF3 = 0x00000008,
0391 DIS_DPF4 = 0x00000010,
0392 DIS_DPF5 = 0x00000020,
0393 DIS_DPF6 = 0x00000040,
0394 DIS_DPF7 = 0x00000080,
0395 DIS_DPF8 = 0x00000100,
0396 DIS_DPF9 = 0x00000200,
0397 DIS_DPF10 = 0x00000400,
0398 DIS_DPF11 = 0x00000800,
0399 DIS_DPF12 = 0x00001000,
0400 DIS_DPF13 = 0x00002000,
0401 DIS_DPF14 = 0x00004000,
0402 DIS_DPF15 = 0x00008000,
0403 };
0404
0405
0406 enum EIC_BIT {
0407 EIC_MREE = 0x00000001,
0408 EIC_MTEE = 0x00000002,
0409 EIC_QEE = 0x00000004,
0410 EIC_SEE = 0x00000008,
0411 EIC_CLLE0 = 0x00000010,
0412 EIC_CLLE1 = 0x00000020,
0413 EIC_CULE0 = 0x00000040,
0414 EIC_CULE1 = 0x00000080,
0415 EIC_TFFE = 0x00000100,
0416 };
0417
0418
0419 enum EIS_BIT {
0420 EIS_MREF = 0x00000001,
0421 EIS_MTEF = 0x00000002,
0422 EIS_QEF = 0x00000004,
0423 EIS_SEF = 0x00000008,
0424 EIS_CLLF0 = 0x00000010,
0425 EIS_CLLF1 = 0x00000020,
0426 EIS_CULF0 = 0x00000040,
0427 EIS_CULF1 = 0x00000080,
0428 EIS_TFFF = 0x00000100,
0429 EIS_QFS = 0x00010000,
0430 EIS_RESERVED = (GENMASK(31, 17) | GENMASK(15, 11)),
0431 };
0432
0433
0434 enum RIC0_BIT {
0435 RIC0_FRE0 = 0x00000001,
0436 RIC0_FRE1 = 0x00000002,
0437 RIC0_FRE2 = 0x00000004,
0438 RIC0_FRE3 = 0x00000008,
0439 RIC0_FRE4 = 0x00000010,
0440 RIC0_FRE5 = 0x00000020,
0441 RIC0_FRE6 = 0x00000040,
0442 RIC0_FRE7 = 0x00000080,
0443 RIC0_FRE8 = 0x00000100,
0444 RIC0_FRE9 = 0x00000200,
0445 RIC0_FRE10 = 0x00000400,
0446 RIC0_FRE11 = 0x00000800,
0447 RIC0_FRE12 = 0x00001000,
0448 RIC0_FRE13 = 0x00002000,
0449 RIC0_FRE14 = 0x00004000,
0450 RIC0_FRE15 = 0x00008000,
0451 RIC0_FRE16 = 0x00010000,
0452 RIC0_FRE17 = 0x00020000,
0453 };
0454
0455
0456 enum RIS0_BIT {
0457 RIS0_FRF0 = 0x00000001,
0458 RIS0_FRF1 = 0x00000002,
0459 RIS0_FRF2 = 0x00000004,
0460 RIS0_FRF3 = 0x00000008,
0461 RIS0_FRF4 = 0x00000010,
0462 RIS0_FRF5 = 0x00000020,
0463 RIS0_FRF6 = 0x00000040,
0464 RIS0_FRF7 = 0x00000080,
0465 RIS0_FRF8 = 0x00000100,
0466 RIS0_FRF9 = 0x00000200,
0467 RIS0_FRF10 = 0x00000400,
0468 RIS0_FRF11 = 0x00000800,
0469 RIS0_FRF12 = 0x00001000,
0470 RIS0_FRF13 = 0x00002000,
0471 RIS0_FRF14 = 0x00004000,
0472 RIS0_FRF15 = 0x00008000,
0473 RIS0_FRF16 = 0x00010000,
0474 RIS0_FRF17 = 0x00020000,
0475 RIS0_RESERVED = GENMASK(31, 18),
0476 };
0477
0478
0479 enum RIC1_BIT {
0480 RIC1_RFWE = 0x80000000,
0481 };
0482
0483
0484 enum RIS1_BIT {
0485 RIS1_RFWF = 0x80000000,
0486 };
0487
0488
0489 enum RIC2_BIT {
0490 RIC2_QFE0 = 0x00000001,
0491 RIC2_QFE1 = 0x00000002,
0492 RIC2_QFE2 = 0x00000004,
0493 RIC2_QFE3 = 0x00000008,
0494 RIC2_QFE4 = 0x00000010,
0495 RIC2_QFE5 = 0x00000020,
0496 RIC2_QFE6 = 0x00000040,
0497 RIC2_QFE7 = 0x00000080,
0498 RIC2_QFE8 = 0x00000100,
0499 RIC2_QFE9 = 0x00000200,
0500 RIC2_QFE10 = 0x00000400,
0501 RIC2_QFE11 = 0x00000800,
0502 RIC2_QFE12 = 0x00001000,
0503 RIC2_QFE13 = 0x00002000,
0504 RIC2_QFE14 = 0x00004000,
0505 RIC2_QFE15 = 0x00008000,
0506 RIC2_QFE16 = 0x00010000,
0507 RIC2_QFE17 = 0x00020000,
0508 RIC2_RFFE = 0x80000000,
0509 };
0510
0511
0512 enum RIS2_BIT {
0513 RIS2_QFF0 = 0x00000001,
0514 RIS2_QFF1 = 0x00000002,
0515 RIS2_QFF2 = 0x00000004,
0516 RIS2_QFF3 = 0x00000008,
0517 RIS2_QFF4 = 0x00000010,
0518 RIS2_QFF5 = 0x00000020,
0519 RIS2_QFF6 = 0x00000040,
0520 RIS2_QFF7 = 0x00000080,
0521 RIS2_QFF8 = 0x00000100,
0522 RIS2_QFF9 = 0x00000200,
0523 RIS2_QFF10 = 0x00000400,
0524 RIS2_QFF11 = 0x00000800,
0525 RIS2_QFF12 = 0x00001000,
0526 RIS2_QFF13 = 0x00002000,
0527 RIS2_QFF14 = 0x00004000,
0528 RIS2_QFF15 = 0x00008000,
0529 RIS2_QFF16 = 0x00010000,
0530 RIS2_QFF17 = 0x00020000,
0531 RIS2_RFFF = 0x80000000,
0532 RIS2_RESERVED = GENMASK(30, 18),
0533 };
0534
0535
0536 enum TIC_BIT {
0537 TIC_FTE0 = 0x00000001,
0538 TIC_FTE1 = 0x00000002,
0539 TIC_TFUE = 0x00000100,
0540 TIC_TFWE = 0x00000200,
0541 };
0542
0543
0544 enum TIS_BIT {
0545 TIS_FTF0 = 0x00000001,
0546 TIS_FTF1 = 0x00000002,
0547 TIS_TFUF = 0x00000100,
0548 TIS_TFWF = 0x00000200,
0549 TIS_RESERVED = (GENMASK(31, 20) | GENMASK(15, 12) | GENMASK(7, 4))
0550 };
0551
0552
0553 enum ISS_BIT {
0554 ISS_FRS = 0x00000001,
0555 ISS_FTS = 0x00000004,
0556 ISS_ES = 0x00000040,
0557 ISS_MS = 0x00000080,
0558 ISS_TFUS = 0x00000100,
0559 ISS_TFWS = 0x00000200,
0560 ISS_RFWS = 0x00001000,
0561 ISS_CGIS = 0x00002000,
0562 ISS_DPS1 = 0x00020000,
0563 ISS_DPS2 = 0x00040000,
0564 ISS_DPS3 = 0x00080000,
0565 ISS_DPS4 = 0x00100000,
0566 ISS_DPS5 = 0x00200000,
0567 ISS_DPS6 = 0x00400000,
0568 ISS_DPS7 = 0x00800000,
0569 ISS_DPS8 = 0x01000000,
0570 ISS_DPS9 = 0x02000000,
0571 ISS_DPS10 = 0x04000000,
0572 ISS_DPS11 = 0x08000000,
0573 ISS_DPS12 = 0x10000000,
0574 ISS_DPS13 = 0x20000000,
0575 ISS_DPS14 = 0x40000000,
0576 ISS_DPS15 = 0x80000000,
0577 };
0578
0579
0580 enum CIE_BIT {
0581 CIE_CRIE = 0x00000001,
0582 CIE_CTIE = 0x00000100,
0583 CIE_RQFM = 0x00010000,
0584 CIE_CL0M = 0x00020000,
0585 CIE_RFWL = 0x00040000,
0586 CIE_RFFL = 0x00080000,
0587 };
0588
0589
0590 enum GCCR_BIT {
0591 GCCR_TCR = 0x00000003,
0592 GCCR_TCR_NOREQ = 0x00000000,
0593 GCCR_TCR_RESET = 0x00000001,
0594 GCCR_TCR_CAPTURE = 0x00000003,
0595 GCCR_LTO = 0x00000004,
0596 GCCR_LTI = 0x00000008,
0597 GCCR_LPTC = 0x00000010,
0598 GCCR_LMTT = 0x00000020,
0599 GCCR_TCSS = 0x00000300,
0600 GCCR_TCSS_GPTP = 0x00000000,
0601 GCCR_TCSS_ADJGPTP = 0x00000100,
0602 GCCR_TCSS_AVTP = 0x00000200,
0603 };
0604
0605
0606 enum GTI_BIT {
0607 GTI_TIV = 0x0FFFFFFF,
0608 };
0609
0610 #define GTI_TIV_MAX GTI_TIV
0611 #define GTI_TIV_MIN 0x20
0612
0613
0614 enum GIC_BIT {
0615 GIC_PTCE = 0x00000001,
0616 GIC_PTME = 0x00000004,
0617 };
0618
0619
0620 enum GIS_BIT {
0621 GIS_PTCF = 0x00000001,
0622 GIS_PTMF = 0x00000004,
0623 GIS_RESERVED = GENMASK(15, 10),
0624 };
0625
0626
0627 enum GIE_BIT {
0628 GIE_PTCS = 0x00000001,
0629 GIE_PTOS = 0x00000002,
0630 GIE_PTMS0 = 0x00000004,
0631 GIE_PTMS1 = 0x00000008,
0632 GIE_PTMS2 = 0x00000010,
0633 GIE_PTMS3 = 0x00000020,
0634 GIE_PTMS4 = 0x00000040,
0635 GIE_PTMS5 = 0x00000080,
0636 GIE_PTMS6 = 0x00000100,
0637 GIE_PTMS7 = 0x00000200,
0638 GIE_ATCS0 = 0x00010000,
0639 GIE_ATCS1 = 0x00020000,
0640 GIE_ATCS2 = 0x00040000,
0641 GIE_ATCS3 = 0x00080000,
0642 GIE_ATCS4 = 0x00100000,
0643 GIE_ATCS5 = 0x00200000,
0644 GIE_ATCS6 = 0x00400000,
0645 GIE_ATCS7 = 0x00800000,
0646 GIE_ATCS8 = 0x01000000,
0647 GIE_ATCS9 = 0x02000000,
0648 GIE_ATCS10 = 0x04000000,
0649 GIE_ATCS11 = 0x08000000,
0650 GIE_ATCS12 = 0x10000000,
0651 GIE_ATCS13 = 0x20000000,
0652 GIE_ATCS14 = 0x40000000,
0653 GIE_ATCS15 = 0x80000000,
0654 };
0655
0656
0657 enum GID_BIT {
0658 GID_PTCD = 0x00000001,
0659 GID_PTOD = 0x00000002,
0660 GID_PTMD0 = 0x00000004,
0661 GID_PTMD1 = 0x00000008,
0662 GID_PTMD2 = 0x00000010,
0663 GID_PTMD3 = 0x00000020,
0664 GID_PTMD4 = 0x00000040,
0665 GID_PTMD5 = 0x00000080,
0666 GID_PTMD6 = 0x00000100,
0667 GID_PTMD7 = 0x00000200,
0668 GID_ATCD0 = 0x00010000,
0669 GID_ATCD1 = 0x00020000,
0670 GID_ATCD2 = 0x00040000,
0671 GID_ATCD3 = 0x00080000,
0672 GID_ATCD4 = 0x00100000,
0673 GID_ATCD5 = 0x00200000,
0674 GID_ATCD6 = 0x00400000,
0675 GID_ATCD7 = 0x00800000,
0676 GID_ATCD8 = 0x01000000,
0677 GID_ATCD9 = 0x02000000,
0678 GID_ATCD10 = 0x04000000,
0679 GID_ATCD11 = 0x08000000,
0680 GID_ATCD12 = 0x10000000,
0681 GID_ATCD13 = 0x20000000,
0682 GID_ATCD14 = 0x40000000,
0683 GID_ATCD15 = 0x80000000,
0684 };
0685
0686
0687 enum RIE0_BIT {
0688 RIE0_FRS0 = 0x00000001,
0689 RIE0_FRS1 = 0x00000002,
0690 RIE0_FRS2 = 0x00000004,
0691 RIE0_FRS3 = 0x00000008,
0692 RIE0_FRS4 = 0x00000010,
0693 RIE0_FRS5 = 0x00000020,
0694 RIE0_FRS6 = 0x00000040,
0695 RIE0_FRS7 = 0x00000080,
0696 RIE0_FRS8 = 0x00000100,
0697 RIE0_FRS9 = 0x00000200,
0698 RIE0_FRS10 = 0x00000400,
0699 RIE0_FRS11 = 0x00000800,
0700 RIE0_FRS12 = 0x00001000,
0701 RIE0_FRS13 = 0x00002000,
0702 RIE0_FRS14 = 0x00004000,
0703 RIE0_FRS15 = 0x00008000,
0704 RIE0_FRS16 = 0x00010000,
0705 RIE0_FRS17 = 0x00020000,
0706 };
0707
0708
0709 enum RID0_BIT {
0710 RID0_FRD0 = 0x00000001,
0711 RID0_FRD1 = 0x00000002,
0712 RID0_FRD2 = 0x00000004,
0713 RID0_FRD3 = 0x00000008,
0714 RID0_FRD4 = 0x00000010,
0715 RID0_FRD5 = 0x00000020,
0716 RID0_FRD6 = 0x00000040,
0717 RID0_FRD7 = 0x00000080,
0718 RID0_FRD8 = 0x00000100,
0719 RID0_FRD9 = 0x00000200,
0720 RID0_FRD10 = 0x00000400,
0721 RID0_FRD11 = 0x00000800,
0722 RID0_FRD12 = 0x00001000,
0723 RID0_FRD13 = 0x00002000,
0724 RID0_FRD14 = 0x00004000,
0725 RID0_FRD15 = 0x00008000,
0726 RID0_FRD16 = 0x00010000,
0727 RID0_FRD17 = 0x00020000,
0728 };
0729
0730
0731 enum RIE2_BIT {
0732 RIE2_QFS0 = 0x00000001,
0733 RIE2_QFS1 = 0x00000002,
0734 RIE2_QFS2 = 0x00000004,
0735 RIE2_QFS3 = 0x00000008,
0736 RIE2_QFS4 = 0x00000010,
0737 RIE2_QFS5 = 0x00000020,
0738 RIE2_QFS6 = 0x00000040,
0739 RIE2_QFS7 = 0x00000080,
0740 RIE2_QFS8 = 0x00000100,
0741 RIE2_QFS9 = 0x00000200,
0742 RIE2_QFS10 = 0x00000400,
0743 RIE2_QFS11 = 0x00000800,
0744 RIE2_QFS12 = 0x00001000,
0745 RIE2_QFS13 = 0x00002000,
0746 RIE2_QFS14 = 0x00004000,
0747 RIE2_QFS15 = 0x00008000,
0748 RIE2_QFS16 = 0x00010000,
0749 RIE2_QFS17 = 0x00020000,
0750 RIE2_RFFS = 0x80000000,
0751 };
0752
0753
0754 enum RID2_BIT {
0755 RID2_QFD0 = 0x00000001,
0756 RID2_QFD1 = 0x00000002,
0757 RID2_QFD2 = 0x00000004,
0758 RID2_QFD3 = 0x00000008,
0759 RID2_QFD4 = 0x00000010,
0760 RID2_QFD5 = 0x00000020,
0761 RID2_QFD6 = 0x00000040,
0762 RID2_QFD7 = 0x00000080,
0763 RID2_QFD8 = 0x00000100,
0764 RID2_QFD9 = 0x00000200,
0765 RID2_QFD10 = 0x00000400,
0766 RID2_QFD11 = 0x00000800,
0767 RID2_QFD12 = 0x00001000,
0768 RID2_QFD13 = 0x00002000,
0769 RID2_QFD14 = 0x00004000,
0770 RID2_QFD15 = 0x00008000,
0771 RID2_QFD16 = 0x00010000,
0772 RID2_QFD17 = 0x00020000,
0773 RID2_RFFD = 0x80000000,
0774 };
0775
0776
0777 enum TIE_BIT {
0778 TIE_FTS0 = 0x00000001,
0779 TIE_FTS1 = 0x00000002,
0780 TIE_FTS2 = 0x00000004,
0781 TIE_FTS3 = 0x00000008,
0782 TIE_TFUS = 0x00000100,
0783 TIE_TFWS = 0x00000200,
0784 TIE_MFUS = 0x00000400,
0785 TIE_MFWS = 0x00000800,
0786 TIE_TDPS0 = 0x00010000,
0787 TIE_TDPS1 = 0x00020000,
0788 TIE_TDPS2 = 0x00040000,
0789 TIE_TDPS3 = 0x00080000,
0790 };
0791
0792
0793 enum TID_BIT {
0794 TID_FTD0 = 0x00000001,
0795 TID_FTD1 = 0x00000002,
0796 TID_FTD2 = 0x00000004,
0797 TID_FTD3 = 0x00000008,
0798 TID_TFUD = 0x00000100,
0799 TID_TFWD = 0x00000200,
0800 TID_MFUD = 0x00000400,
0801 TID_MFWD = 0x00000800,
0802 TID_TDPD0 = 0x00010000,
0803 TID_TDPD1 = 0x00020000,
0804 TID_TDPD2 = 0x00040000,
0805 TID_TDPD3 = 0x00080000,
0806 };
0807
0808
0809 enum ECMR_BIT {
0810 ECMR_PRM = 0x00000001,
0811 ECMR_DM = 0x00000002,
0812 ECMR_TE = 0x00000020,
0813 ECMR_RE = 0x00000040,
0814 ECMR_MPDE = 0x00000200,
0815 ECMR_TXF = 0x00010000,
0816 ECMR_RXF = 0x00020000,
0817 ECMR_PFR = 0x00040000,
0818 ECMR_ZPF = 0x00080000,
0819 ECMR_RZPF = 0x00100000,
0820 ECMR_DPAD = 0x00200000,
0821 ECMR_RCSC = 0x00800000,
0822 ECMR_RCPT = 0x02000000,
0823 ECMR_TRCCM = 0x04000000,
0824 };
0825
0826
0827 enum ECSR_BIT {
0828 ECSR_ICD = 0x00000001,
0829 ECSR_MPD = 0x00000002,
0830 ECSR_LCHNG = 0x00000004,
0831 ECSR_PHYI = 0x00000008,
0832 ECSR_PFRI = 0x00000010,
0833 };
0834
0835
0836 enum ECSIPR_BIT {
0837 ECSIPR_ICDIP = 0x00000001,
0838 ECSIPR_MPDIP = 0x00000002,
0839 ECSIPR_LCHNGIP = 0x00000004,
0840 };
0841
0842
0843 enum PIR_BIT {
0844 PIR_MDC = 0x00000001,
0845 PIR_MMD = 0x00000002,
0846 PIR_MDO = 0x00000004,
0847 PIR_MDI = 0x00000008,
0848 };
0849
0850
0851 enum PSR_BIT {
0852 PSR_LMON = 0x00000001,
0853 };
0854
0855
0856 enum PIPR_BIT {
0857 PIPR_PHYIP = 0x00000001,
0858 };
0859
0860
0861 enum MPR_BIT {
0862 MPR_MP = 0x0000ffff,
0863 };
0864
0865
0866 enum GECMR_BIT {
0867 GECMR_SPEED = 0x00000001,
0868 GECMR_SPEED_100 = 0x00000000,
0869 GECMR_SPEED_1000 = 0x00000001,
0870 GBETH_GECMR_SPEED = 0x00000030,
0871 GBETH_GECMR_SPEED_10 = 0x00000000,
0872 GBETH_GECMR_SPEED_100 = 0x00000010,
0873 GBETH_GECMR_SPEED_1000 = 0x00000020,
0874 };
0875
0876
0877 struct ravb_desc {
0878 __le16 ds;
0879 u8 cc;
0880 u8 die_dt;
0881 __le32 dptr;
0882 };
0883
0884 #define DPTR_ALIGN 4
0885
0886 enum DIE_DT {
0887
0888 DT_FMID = 0x40,
0889 DT_FSTART = 0x50,
0890 DT_FEND = 0x60,
0891 DT_FSINGLE = 0x70,
0892
0893 DT_LINK = 0x80,
0894 DT_LINKFIX = 0x90,
0895 DT_EOS = 0xa0,
0896
0897 DT_FEMPTY = 0xc0,
0898 DT_FEMPTY_IS = 0xd0,
0899 DT_FEMPTY_IC = 0xe0,
0900 DT_FEMPTY_ND = 0xf0,
0901 DT_LEMPTY = 0x20,
0902 DT_EEMPTY = 0x30,
0903 };
0904
0905 struct ravb_rx_desc {
0906 __le16 ds_cc;
0907 u8 msc;
0908 u8 die_dt;
0909 __le32 dptr;
0910 };
0911
0912 struct ravb_ex_rx_desc {
0913 __le16 ds_cc;
0914 u8 msc;
0915 u8 die_dt;
0916 __le32 dptr;
0917 __le32 ts_n;
0918 __le32 ts_sl;
0919 __le16 ts_sh;
0920 __le16 res;
0921 };
0922
0923 enum RX_DS_CC_BIT {
0924 RX_DS = 0x0fff,
0925 RX_TR = 0x1000,
0926 RX_EI = 0x2000,
0927 RX_PS = 0xc000,
0928 };
0929
0930
0931 enum MSC_BIT {
0932 MSC_CRC = 0x01,
0933 MSC_RFE = 0x02,
0934 MSC_RTSF = 0x04,
0935 MSC_RTLF = 0x08,
0936 MSC_FRE = 0x10,
0937 MSC_CRL = 0x20,
0938 MSC_CEEF = 0x40,
0939 MSC_MC = 0x80,
0940 };
0941
0942 struct ravb_tx_desc {
0943 __le16 ds_tagl;
0944 u8 tagh_tsr;
0945 u8 die_dt;
0946 __le32 dptr;
0947 };
0948
0949 enum TX_DS_TAGL_BIT {
0950 TX_DS = 0x0fff,
0951 TX_TAGL = 0xf000,
0952 };
0953
0954 enum TX_TAGH_TSR_BIT {
0955 TX_TAGH = 0x3f,
0956 TX_TSR = 0x40,
0957 };
0958 enum RAVB_QUEUE {
0959 RAVB_BE = 0,
0960 RAVB_NC,
0961 };
0962
0963 enum CXR31_BIT {
0964 CXR31_SEL_LINK0 = 0x00000001,
0965 CXR31_SEL_LINK1 = 0x00000008,
0966 };
0967
0968 enum CSR0_BIT {
0969 CSR0_TPE = 0x00000010,
0970 CSR0_RPE = 0x00000020,
0971 };
0972
0973 #define DBAT_ENTRY_NUM 22
0974 #define RX_QUEUE_OFFSET 4
0975 #define NUM_RX_QUEUE 2
0976 #define NUM_TX_QUEUE 2
0977
0978 #define RX_BUF_SZ (2048 - ETH_FCS_LEN + sizeof(__sum16))
0979
0980 #define GBETH_RX_BUFF_MAX 8192
0981 #define GBETH_RX_DESC_DATA_SIZE 4080
0982
0983 struct ravb_tstamp_skb {
0984 struct list_head list;
0985 struct sk_buff *skb;
0986 u16 tag;
0987 };
0988
0989 struct ravb_ptp_perout {
0990 u32 target;
0991 u32 period;
0992 };
0993
0994 #define N_EXT_TS 1
0995 #define N_PER_OUT 1
0996
0997 struct ravb_ptp {
0998 struct ptp_clock *clock;
0999 struct ptp_clock_info info;
1000 u32 default_addend;
1001 u32 current_addend;
1002 int extts[N_EXT_TS];
1003 struct ravb_ptp_perout perout[N_PER_OUT];
1004 };
1005
1006 struct ravb_hw_info {
1007 void (*rx_ring_free)(struct net_device *ndev, int q);
1008 void (*rx_ring_format)(struct net_device *ndev, int q);
1009 void *(*alloc_rx_desc)(struct net_device *ndev, int q);
1010 bool (*receive)(struct net_device *ndev, int *quota, int q);
1011 void (*set_rate)(struct net_device *ndev);
1012 int (*set_feature)(struct net_device *ndev, netdev_features_t features);
1013 int (*dmac_init)(struct net_device *ndev);
1014 void (*emac_init)(struct net_device *ndev);
1015 const char (*gstrings_stats)[ETH_GSTRING_LEN];
1016 size_t gstrings_size;
1017 netdev_features_t net_hw_features;
1018 netdev_features_t net_features;
1019 int stats_len;
1020 size_t max_rx_len;
1021 u32 tccr_mask;
1022 u32 rx_max_buf_size;
1023 unsigned aligned_tx: 1;
1024
1025
1026 unsigned internal_delay:1;
1027 unsigned tx_counters:1;
1028 unsigned carrier_counters:1;
1029 unsigned multi_irqs:1;
1030 unsigned irq_en_dis:1;
1031 unsigned err_mgmt_irqs:1;
1032 unsigned gptp:1;
1033 unsigned ccc_gac:1;
1034 unsigned gptp_ref_clk:1;
1035 unsigned nc_queues:1;
1036 unsigned magic_pkt:1;
1037 unsigned half_duplex:1;
1038 };
1039
1040 struct ravb_private {
1041 struct net_device *ndev;
1042 struct platform_device *pdev;
1043 void __iomem *addr;
1044 struct clk *clk;
1045 struct clk *refclk;
1046 struct clk *gptp_clk;
1047 struct mdiobb_ctrl mdiobb;
1048 u32 num_rx_ring[NUM_RX_QUEUE];
1049 u32 num_tx_ring[NUM_TX_QUEUE];
1050 u32 desc_bat_size;
1051 dma_addr_t desc_bat_dma;
1052 struct ravb_desc *desc_bat;
1053 dma_addr_t rx_desc_dma[NUM_RX_QUEUE];
1054 dma_addr_t tx_desc_dma[NUM_TX_QUEUE];
1055 struct ravb_rx_desc *gbeth_rx_ring;
1056 struct ravb_ex_rx_desc *rx_ring[NUM_RX_QUEUE];
1057 struct ravb_tx_desc *tx_ring[NUM_TX_QUEUE];
1058 void *tx_align[NUM_TX_QUEUE];
1059 struct sk_buff *rx_1st_skb;
1060 struct sk_buff **rx_skb[NUM_RX_QUEUE];
1061 struct sk_buff **tx_skb[NUM_TX_QUEUE];
1062 u32 rx_over_errors;
1063 u32 rx_fifo_errors;
1064 struct net_device_stats stats[NUM_RX_QUEUE];
1065 u32 tstamp_tx_ctrl;
1066 u32 tstamp_rx_ctrl;
1067 struct list_head ts_skb_list;
1068 u32 ts_skb_tag;
1069 struct ravb_ptp ptp;
1070 spinlock_t lock;
1071 u32 cur_rx[NUM_RX_QUEUE];
1072 u32 dirty_rx[NUM_RX_QUEUE];
1073 u32 cur_tx[NUM_TX_QUEUE];
1074 u32 dirty_tx[NUM_TX_QUEUE];
1075 struct napi_struct napi[NUM_RX_QUEUE];
1076 struct work_struct work;
1077
1078 struct mii_bus *mii_bus;
1079 int link;
1080 phy_interface_t phy_interface;
1081 int msg_enable;
1082 int speed;
1083 int emac_irq;
1084 int erra_irq;
1085 int mgmta_irq;
1086 int rx_irqs[NUM_RX_QUEUE];
1087 int tx_irqs[NUM_TX_QUEUE];
1088
1089 unsigned no_avb_link:1;
1090 unsigned avb_link_active_low:1;
1091 unsigned wol_enabled:1;
1092 unsigned rxcidm:1;
1093 unsigned txcidm:1;
1094 unsigned rgmii_override:1;
1095 unsigned int num_tx_desc;
1096
1097 int duplex;
1098
1099 const struct ravb_hw_info *info;
1100 struct reset_control *rstc;
1101 };
1102
1103 static inline u32 ravb_read(struct net_device *ndev, enum ravb_reg reg)
1104 {
1105 struct ravb_private *priv = netdev_priv(ndev);
1106
1107 return ioread32(priv->addr + reg);
1108 }
1109
1110 static inline void ravb_write(struct net_device *ndev, u32 data,
1111 enum ravb_reg reg)
1112 {
1113 struct ravb_private *priv = netdev_priv(ndev);
1114
1115 iowrite32(data, priv->addr + reg);
1116 }
1117
1118 void ravb_modify(struct net_device *ndev, enum ravb_reg reg, u32 clear,
1119 u32 set);
1120 int ravb_wait(struct net_device *ndev, enum ravb_reg reg, u32 mask, u32 value);
1121
1122 void ravb_ptp_interrupt(struct net_device *ndev);
1123 void ravb_ptp_init(struct net_device *ndev, struct platform_device *pdev);
1124 void ravb_ptp_stop(struct net_device *ndev);
1125
1126 #endif