0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #ifndef __UCC_GETH_H__
0015 #define __UCC_GETH_H__
0016
0017 #include <linux/kernel.h>
0018 #include <linux/list.h>
0019 #include <linux/if_ether.h>
0020
0021 #include <soc/fsl/qe/immap_qe.h>
0022 #include <soc/fsl/qe/qe.h>
0023
0024 #include <soc/fsl/qe/ucc.h>
0025 #include <soc/fsl/qe/ucc_fast.h>
0026
0027 #define DRV_DESC "QE UCC Gigabit Ethernet Controller"
0028 #define DRV_NAME "ucc_geth"
0029
0030 #define NUM_TX_QUEUES 8
0031 #define NUM_RX_QUEUES 8
0032 #define NUM_BDS_IN_PREFETCHED_BDS 4
0033 #define TX_IP_OFFSET_ENTRY_MAX 8
0034 #define NUM_OF_PADDRS 4
0035 #define ENET_INIT_PARAM_MAX_ENTRIES_RX 9
0036 #define ENET_INIT_PARAM_MAX_ENTRIES_TX 8
0037
0038 struct ucc_geth {
0039 struct ucc_fast uccf;
0040 u8 res0[0x100 - sizeof(struct ucc_fast)];
0041
0042 u32 maccfg1;
0043 u32 maccfg2;
0044 u32 ipgifg;
0045 u32 hafdup;
0046 u8 res1[0x10];
0047 u8 miimng[0x18];
0048 u32 ifctl;
0049 u32 ifstat;
0050 u32 macstnaddr1;
0051 u32 macstnaddr2;
0052 u8 res2[0x8];
0053 u32 uempr;
0054 u32 utbipar;
0055 u16 uescr;
0056 u8 res3[0x180 - 0x15A];
0057 u32 tx64;
0058
0059
0060
0061
0062 u32 tx127;
0063
0064
0065
0066 u32 tx255;
0067
0068
0069 u32 rx64;
0070
0071
0072 u32 rx127;
0073
0074
0075 u32 rx255;
0076
0077
0078 u32 txok;
0079
0080
0081 u16 txcf;
0082
0083 u8 res4[0x2];
0084 u32 tmca;
0085
0086
0087 u32 tbca;
0088
0089
0090 u32 rxfok;
0091 u32 rxbok;
0092 u32 rbyt;
0093
0094
0095
0096 u32 rmca;
0097
0098
0099 u32 rbca;
0100
0101
0102 u32 scar;
0103 u32 scam;
0104 u8 res5[0x200 - 0x1c4];
0105 } __packed;
0106
0107
0108 #define TEMODER_TX_RMON_STATISTICS_ENABLE 0x0100
0109
0110 #define TEMODER_SCHEDULER_ENABLE 0x2000
0111 #define TEMODER_IP_CHECKSUM_GENERATE 0x0400
0112
0113 #define TEMODER_PERFORMANCE_OPTIMIZATION_MODE1 0x0200
0114
0115
0116 #define TEMODER_RMON_STATISTICS 0x0100
0117
0118 #define TEMODER_NUM_OF_QUEUES_SHIFT (15-15)
0119
0120
0121
0122 #define REMODER_RX_RMON_STATISTICS_ENABLE 0x00001000
0123
0124 #define REMODER_RX_EXTENDED_FEATURES 0x80000000
0125
0126
0127 #define REMODER_VLAN_OPERATION_TAGGED_SHIFT (31-9 )
0128
0129 #define REMODER_VLAN_OPERATION_NON_TAGGED_SHIFT (31-10)
0130
0131 #define REMODER_RX_QOS_MODE_SHIFT (31-15)
0132
0133 #define REMODER_RMON_STATISTICS 0x00001000
0134
0135 #define REMODER_RX_EXTENDED_FILTERING 0x00000800
0136
0137
0138
0139
0140 #define REMODER_NUM_OF_QUEUES_SHIFT (31-23)
0141
0142 #define REMODER_DYNAMIC_MAX_FRAME_LENGTH 0x00000008
0143
0144
0145
0146 #define REMODER_DYNAMIC_MIN_FRAME_LENGTH 0x00000004
0147
0148
0149
0150 #define REMODER_IP_CHECKSUM_CHECK 0x00000002
0151
0152 #define REMODER_IP_ADDRESS_ALIGNMENT 0x00000001
0153
0154
0155
0156
0157
0158 #define UCCE_TXB (UCC_GETH_UCCE_TXB7 | UCC_GETH_UCCE_TXB6 | \
0159 UCC_GETH_UCCE_TXB5 | UCC_GETH_UCCE_TXB4 | \
0160 UCC_GETH_UCCE_TXB3 | UCC_GETH_UCCE_TXB2 | \
0161 UCC_GETH_UCCE_TXB1 | UCC_GETH_UCCE_TXB0)
0162
0163 #define UCCE_RXB (UCC_GETH_UCCE_RXB7 | UCC_GETH_UCCE_RXB6 | \
0164 UCC_GETH_UCCE_RXB5 | UCC_GETH_UCCE_RXB4 | \
0165 UCC_GETH_UCCE_RXB3 | UCC_GETH_UCCE_RXB2 | \
0166 UCC_GETH_UCCE_RXB1 | UCC_GETH_UCCE_RXB0)
0167
0168 #define UCCE_RXF (UCC_GETH_UCCE_RXF7 | UCC_GETH_UCCE_RXF6 | \
0169 UCC_GETH_UCCE_RXF5 | UCC_GETH_UCCE_RXF4 | \
0170 UCC_GETH_UCCE_RXF3 | UCC_GETH_UCCE_RXF2 | \
0171 UCC_GETH_UCCE_RXF1 | UCC_GETH_UCCE_RXF0)
0172
0173 #define UCCE_OTHER (UCC_GETH_UCCE_SCAR | UCC_GETH_UCCE_GRA | \
0174 UCC_GETH_UCCE_CBPR | UCC_GETH_UCCE_BSY | \
0175 UCC_GETH_UCCE_RXC | UCC_GETH_UCCE_TXC | UCC_GETH_UCCE_TXE)
0176
0177 #define UCCE_RX_EVENTS (UCCE_RXF | UCC_GETH_UCCE_BSY)
0178 #define UCCE_TX_EVENTS (UCCE_TXB | UCC_GETH_UCCE_TXE)
0179
0180
0181 #define ENET_TBI_MII_CR 0x00
0182 #define ENET_TBI_MII_SR 0x01
0183 #define ENET_TBI_MII_ANA 0x04
0184 #define ENET_TBI_MII_ANLPBPA 0x05
0185 #define ENET_TBI_MII_ANEX 0x06
0186 #define ENET_TBI_MII_ANNPT 0x07
0187 #define ENET_TBI_MII_ANLPANP 0x08
0188 #define ENET_TBI_MII_EXST 0x0F
0189 #define ENET_TBI_MII_JD 0x10
0190 #define ENET_TBI_MII_TBICON 0x11
0191
0192
0193 #define TBISR_LSTATUS 0x0004
0194 #define TBICON_CLK_SELECT 0x0020
0195 #define TBIANA_ASYMMETRIC_PAUSE 0x0100
0196 #define TBIANA_SYMMETRIC_PAUSE 0x0080
0197 #define TBIANA_HALF_DUPLEX 0x0040
0198 #define TBIANA_FULL_DUPLEX 0x0020
0199 #define TBICR_PHY_RESET 0x8000
0200 #define TBICR_ANEG_ENABLE 0x1000
0201 #define TBICR_RESTART_ANEG 0x0200
0202 #define TBICR_FULL_DUPLEX 0x0100
0203 #define TBICR_SPEED1_SET 0x0040
0204
0205 #define TBIANA_SETTINGS ( \
0206 TBIANA_ASYMMETRIC_PAUSE \
0207 | TBIANA_SYMMETRIC_PAUSE \
0208 | TBIANA_FULL_DUPLEX \
0209 )
0210 #define TBICR_SETTINGS ( \
0211 TBICR_PHY_RESET \
0212 | TBICR_ANEG_ENABLE \
0213 | TBICR_FULL_DUPLEX \
0214 | TBICR_SPEED1_SET \
0215 )
0216
0217
0218 #define MACCFG1_FLOW_RX 0x00000020
0219
0220 #define MACCFG1_FLOW_TX 0x00000010
0221
0222 #define MACCFG1_ENABLE_SYNCHED_RX 0x00000008
0223
0224
0225
0226 #define MACCFG1_ENABLE_RX 0x00000004
0227 #define MACCFG1_ENABLE_SYNCHED_TX 0x00000002
0228
0229
0230
0231 #define MACCFG1_ENABLE_TX 0x00000001
0232
0233
0234 #define MACCFG2_PREL_SHIFT (31 - 19)
0235
0236
0237 #define MACCFG2_PREL_MASK 0x0000f000
0238
0239 #define MACCFG2_SRP 0x00000080
0240
0241 #define MACCFG2_STP 0x00000040
0242
0243
0244 #define MACCFG2_RESERVED_1 0x00000020
0245
0246
0247 #define MACCFG2_LC 0x00000010
0248
0249 #define MACCFG2_MPE 0x00000008
0250
0251 #define MACCFG2_FDX 0x00000001
0252 #define MACCFG2_FDX_MASK 0x00000001
0253
0254 #define MACCFG2_PAD_CRC 0x00000004
0255 #define MACCFG2_CRC_EN 0x00000002
0256 #define MACCFG2_PAD_AND_CRC_MODE_NONE 0x00000000
0257
0258
0259
0260 #define MACCFG2_PAD_AND_CRC_MODE_CRC_ONLY 0x00000002
0261
0262 #define MACCFG2_PAD_AND_CRC_MODE_PAD_AND_CRC 0x00000004
0263 #define MACCFG2_INTERFACE_MODE_NIBBLE 0x00000100
0264
0265
0266 #define MACCFG2_INTERFACE_MODE_BYTE 0x00000200
0267
0268
0269 #define MACCFG2_INTERFACE_MODE_MASK 0x00000300
0270
0271
0272
0273
0274
0275 #define IPGIFG_NON_BACK_TO_BACK_IFG_PART1_SHIFT (31 - 7)
0276
0277
0278
0279
0280 #define IPGIFG_NON_BACK_TO_BACK_IFG_PART2_SHIFT (31 - 15)
0281
0282
0283
0284
0285 #define IPGIFG_MINIMUM_IFG_ENFORCEMENT_SHIFT (31 - 23)
0286
0287
0288 #define IPGIFG_BACK_TO_BACK_IFG_SHIFT (31 - 31)
0289
0290
0291
0292 #define IPGIFG_NON_BACK_TO_BACK_IFG_PART1_MAX 127
0293
0294
0295 #define IPGIFG_NON_BACK_TO_BACK_IFG_PART2_MAX 127
0296
0297
0298 #define IPGIFG_MINIMUM_IFG_ENFORCEMENT_MAX 255
0299
0300 #define IPGIFG_BACK_TO_BACK_IFG_MAX 127
0301
0302 #define IPGIFG_NBTB_CS_IPG_MASK 0x7F000000
0303 #define IPGIFG_NBTB_IPG_MASK 0x007F0000
0304 #define IPGIFG_MIN_IFG_MASK 0x0000FF00
0305 #define IPGIFG_BTB_IPG_MASK 0x0000007F
0306
0307
0308 #define HALFDUP_ALT_BEB_TRUNCATION_SHIFT (31 - 11)
0309
0310
0311
0312
0313
0314 #define HALFDUP_ALT_BEB_TRUNCATION_MAX 0xf
0315
0316
0317 #define HALFDUP_ALT_BEB 0x00080000
0318
0319
0320
0321 #define HALFDUP_BACK_PRESSURE_NO_BACKOFF 0x00040000
0322
0323
0324 #define HALFDUP_NO_BACKOFF 0x00020000
0325 #define HALFDUP_EXCESSIVE_DEFER 0x00010000
0326
0327 #define HALFDUP_MAX_RETRANSMISSION_SHIFT (31 - 19)
0328
0329
0330 #define HALFDUP_MAX_RETRANSMISSION_MAX 0xf
0331
0332
0333 #define HALFDUP_COLLISION_WINDOW_SHIFT (31 - 31)
0334
0335
0336 #define HALFDUP_COLLISION_WINDOW_MAX 0x3f
0337
0338 #define HALFDUP_ALT_BEB_TR_MASK 0x00F00000
0339 #define HALFDUP_RETRANS_MASK 0x0000F000
0340 #define HALFDUP_COL_WINDOW_MASK 0x0000003F
0341
0342
0343 #define UCCS_BPR 0x02
0344
0345 #define UCCS_PAU 0x02
0346
0347 #define UCCS_MPD 0x01
0348
0349
0350
0351 #define IFSTAT_EXCESS_DEFER 0x00000200
0352
0353
0354
0355
0356 #define MACSTNADDR1_OCTET_6_SHIFT (31 - 7)
0357
0358
0359
0360 #define MACSTNADDR1_OCTET_5_SHIFT (31 - 15)
0361
0362
0363
0364 #define MACSTNADDR1_OCTET_4_SHIFT (31 - 23)
0365
0366
0367
0368 #define MACSTNADDR1_OCTET_3_SHIFT (31 - 31)
0369
0370
0371
0372
0373
0374 #define MACSTNADDR2_OCTET_2_SHIFT (31 - 7)
0375
0376
0377
0378 #define MACSTNADDR2_OCTET_1_SHIFT (31 - 15)
0379
0380
0381
0382
0383
0384 #define UEMPR_PAUSE_TIME_VALUE_SHIFT (31 - 15)
0385
0386
0387 #define UEMPR_EXTENDED_PAUSE_TIME_VALUE_SHIFT (31 - 31)
0388
0389
0390
0391
0392
0393 #define UTBIPAR_PHY_ADDRESS_SHIFT (31 - 31)
0394
0395 #define UTBIPAR_PHY_ADDRESS_MASK 0x0000001f
0396
0397
0398
0399 #define UESCR_AUTOZ 0x8000
0400
0401
0402
0403 #define UESCR_CLRCNT 0x4000
0404
0405 #define UESCR_MAXCOV_SHIFT (15 - 7)
0406
0407
0408
0409 #define UESCR_SCOV_SHIFT (15 - 15)
0410
0411
0412
0413
0414
0415 #define UDSR_MAGIC 0x067E
0416
0417 struct ucc_geth_thread_data_tx {
0418 u8 res0[104];
0419 } __packed;
0420
0421 struct ucc_geth_thread_data_rx {
0422 u8 res0[40];
0423 } __packed;
0424
0425
0426 struct ucc_geth_send_queue_qd {
0427 u32 bd_ring_base;
0428 u8 res0[0x8];
0429 u32 last_bd_completed_address;
0430 u8 res1[0x30];
0431 } __packed;
0432
0433 struct ucc_geth_send_queue_mem_region {
0434 struct ucc_geth_send_queue_qd sqqd[NUM_TX_QUEUES];
0435 } __packed;
0436
0437 struct ucc_geth_thread_tx_pram {
0438 u8 res0[64];
0439 } __packed;
0440
0441 struct ucc_geth_thread_rx_pram {
0442 u8 res0[128];
0443 } __packed;
0444
0445 #define THREAD_RX_PRAM_ADDITIONAL_FOR_EXTENDED_FILTERING 64
0446 #define THREAD_RX_PRAM_ADDITIONAL_FOR_EXTENDED_FILTERING_8 64
0447 #define THREAD_RX_PRAM_ADDITIONAL_FOR_EXTENDED_FILTERING_16 96
0448
0449 struct ucc_geth_scheduler {
0450 u16 cpucount0;
0451 u16 cpucount1;
0452 u16 cecount0;
0453 u16 cecount1;
0454 u16 cpucount2;
0455 u16 cpucount3;
0456 u16 cecount2;
0457 u16 cecount3;
0458 u16 cpucount4;
0459 u16 cpucount5;
0460 u16 cecount4;
0461 u16 cecount5;
0462 u16 cpucount6;
0463 u16 cpucount7;
0464 u16 cecount6;
0465 u16 cecount7;
0466 u32 weightstatus[NUM_TX_QUEUES];
0467 u32 rtsrshadow;
0468 u32 time;
0469 u32 ttl;
0470 u32 mblinterval;
0471 u16 nortsrbytetime;
0472 u8 fracsiz;
0473
0474 u8 res0[1];
0475 u8 strictpriorityq;
0476 u8 txasap;
0477 u8 extrabw;
0478 u8 oldwfqmask;
0479 u8 weightfactor[NUM_TX_QUEUES];
0480
0481 u32 minw;
0482 u8 res1[0x70 - 0x64];
0483 } __packed;
0484
0485 struct ucc_geth_tx_firmware_statistics_pram {
0486 u32 sicoltx;
0487 u32 mulcoltx;
0488 u32 latecoltxfr;
0489 u32 frabortduecol;
0490 u32 frlostinmactxer;
0491
0492
0493 u32 carriersenseertx;
0494 u32 frtxok;
0495 u32 txfrexcessivedefer;
0496
0497 u32 txpkts256;
0498
0499 u32 txpkts512;
0500
0501 u32 txpkts1024;
0502
0503 u32 txpktsjumbo;
0504
0505 } __packed;
0506
0507 struct ucc_geth_rx_firmware_statistics_pram {
0508 u32 frrxfcser;
0509 u32 fraligner;
0510 u32 inrangelenrxer;
0511 u32 outrangelenrxer;
0512 u32 frtoolong;
0513 u32 runt;
0514 u32 verylongevent;
0515 u32 symbolerror;
0516 u32 dropbsy;
0517 u8 res0[0x8];
0518 u32 mismatchdrop;
0519
0520 u32 underpkts;
0521 u32 pkts256;
0522
0523 u32 pkts512;
0524
0525 u32 pkts1024;
0526
0527 u32 pktsjumbo;
0528
0529 u32 frlossinmacer;
0530
0531 u32 pausefr;
0532 u8 res1[0x4];
0533 u32 removevlan;
0534
0535 u32 replacevlan;
0536
0537 u32 insertvlan;
0538
0539 } __packed;
0540
0541 struct ucc_geth_rx_interrupt_coalescing_entry {
0542 u32 interruptcoalescingmaxvalue;
0543
0544 u32 interruptcoalescingcounter;
0545
0546
0547 } __packed;
0548
0549 struct ucc_geth_rx_interrupt_coalescing_table {
0550 struct ucc_geth_rx_interrupt_coalescing_entry coalescingentry[NUM_RX_QUEUES];
0551
0552 } __packed;
0553
0554 struct ucc_geth_rx_prefetched_bds {
0555 struct qe_bd bd[NUM_BDS_IN_PREFETCHED_BDS];
0556 } __packed;
0557
0558 struct ucc_geth_rx_bd_queues_entry {
0559 u32 bdbaseptr;
0560 u32 bdptr;
0561 u32 externalbdbaseptr;
0562 u32 externalbdptr;
0563 } __packed;
0564
0565 struct ucc_geth_tx_global_pram {
0566 u16 temoder;
0567 u8 res0[0x38 - 0x02];
0568 u32 sqptr;
0569 u32 schedulerbasepointer;
0570
0571 u32 txrmonbaseptr;
0572 u32 tstate;
0573
0574 u8 iphoffset[TX_IP_OFFSET_ENTRY_MAX];
0575 u32 vtagtable[0x8];
0576 u32 tqptr;
0577
0578 u8 res2[0x78 - 0x74];
0579 u64 snums_en;
0580 u32 l2l3baseptr;
0581
0582 u16 mtu[8];
0583 u8 res3[0xa8 - 0x94];
0584 u32 wrrtablebase;
0585 u8 res4[0xc0 - 0xac];
0586 } __packed;
0587
0588
0589 struct ucc_geth_exf_global_pram {
0590 u32 l2pcdptr;
0591 u8 res0[0x10 - 0x04];
0592 } __packed;
0593
0594 struct ucc_geth_rx_global_pram {
0595 u32 remoder;
0596 u32 rqptr;
0597 u32 res0[0x1];
0598 u8 res1[0x20 - 0xC];
0599 u16 typeorlen;
0600
0601 u8 res2[0x1];
0602 u8 rxgstpack;
0603 u32 rxrmonbaseptr;
0604 u8 res3[0x30 - 0x28];
0605 u32 intcoalescingptr;
0606 u8 res4[0x36 - 0x34];
0607 u8 rstate;
0608
0609 u8 res5[0x46 - 0x37];
0610 u16 mrblr;
0611 u32 rbdqptr;
0612
0613 u16 mflr;
0614 u16 minflr;
0615 u16 maxd1;
0616 u16 maxd2;
0617 u32 ecamptr;
0618 u32 l2qt;
0619 u32 l3qt[0x8];
0620 u16 vlantype;
0621 u16 vlantci;
0622 u8 addressfiltering[64];
0623 u32 exfGlobalParam;
0624
0625 u8 res6[0x100 - 0xC4];
0626 } __packed;
0627
0628 #define GRACEFUL_STOP_ACKNOWLEDGE_RX 0x01
0629
0630
0631 struct ucc_geth_init_pram {
0632 u8 resinit1;
0633 u8 resinit2;
0634 u8 resinit3;
0635 u8 resinit4;
0636 u16 resinit5;
0637 u8 res1[0x1];
0638 u8 largestexternallookupkeysize;
0639 u32 rgftgfrxglobal;
0640 u32 rxthread[ENET_INIT_PARAM_MAX_ENTRIES_RX];
0641 u8 res2[0x38 - 0x30];
0642 u32 txglobal;
0643 u32 txthread[ENET_INIT_PARAM_MAX_ENTRIES_TX];
0644 u8 res3[0x1];
0645 } __packed;
0646
0647 #define ENET_INIT_PARAM_RGF_SHIFT (32 - 4)
0648 #define ENET_INIT_PARAM_TGF_SHIFT (32 - 8)
0649
0650 #define ENET_INIT_PARAM_RISC_MASK 0x0000003f
0651 #define ENET_INIT_PARAM_PTR_MASK 0x00ffffc0
0652 #define ENET_INIT_PARAM_SNUM_MASK 0xff000000
0653 #define ENET_INIT_PARAM_SNUM_SHIFT 24
0654
0655 #define ENET_INIT_PARAM_MAGIC_RES_INIT1 0x06
0656 #define ENET_INIT_PARAM_MAGIC_RES_INIT2 0x30
0657 #define ENET_INIT_PARAM_MAGIC_RES_INIT3 0xff
0658 #define ENET_INIT_PARAM_MAGIC_RES_INIT4 0x00
0659 #define ENET_INIT_PARAM_MAGIC_RES_INIT5 0x0400
0660
0661
0662 struct ucc_geth_82xx_enet_address {
0663 u8 res1[0x2];
0664 u16 h;
0665 u16 m;
0666 u16 l;
0667 } __packed;
0668
0669
0670 struct ucc_geth_82xx_address_filtering_pram {
0671 u32 iaddr_h;
0672 u32 iaddr_l;
0673 u32 gaddr_h;
0674 u32 gaddr_l;
0675 struct ucc_geth_82xx_enet_address __iomem taddr;
0676 struct ucc_geth_82xx_enet_address __iomem paddr[NUM_OF_PADDRS];
0677 u8 res0[0x40 - 0x38];
0678 } __packed;
0679
0680
0681
0682 struct ucc_geth_tx_firmware_statistics {
0683 u32 sicoltx;
0684 u32 mulcoltx;
0685 u32 latecoltxfr;
0686 u32 frabortduecol;
0687 u32 frlostinmactxer;
0688
0689
0690 u32 carriersenseertx;
0691 u32 frtxok;
0692 u32 txfrexcessivedefer;
0693
0694 u32 txpkts256;
0695
0696 u32 txpkts512;
0697
0698 u32 txpkts1024;
0699
0700 u32 txpktsjumbo;
0701
0702 } __packed;
0703
0704
0705
0706 struct ucc_geth_rx_firmware_statistics {
0707 u32 frrxfcser;
0708 u32 fraligner;
0709 u32 inrangelenrxer;
0710 u32 outrangelenrxer;
0711 u32 frtoolong;
0712 u32 runt;
0713 u32 verylongevent;
0714 u32 symbolerror;
0715 u32 dropbsy;
0716 u8 res0[0x8];
0717 u32 mismatchdrop;
0718
0719 u32 underpkts;
0720 u32 pkts256;
0721
0722 u32 pkts512;
0723
0724 u32 pkts1024;
0725
0726 u32 pktsjumbo;
0727
0728 u32 frlossinmacer;
0729
0730 u32 pausefr;
0731 u8 res1[0x4];
0732 u32 removevlan;
0733
0734 u32 replacevlan;
0735
0736 u32 insertvlan;
0737
0738 } __packed;
0739
0740
0741
0742 struct ucc_geth_hardware_statistics {
0743 u32 tx64;
0744
0745
0746
0747
0748 u32 tx127;
0749
0750
0751
0752 u32 tx255;
0753
0754
0755 u32 rx64;
0756
0757
0758 u32 rx127;
0759
0760
0761 u32 rx255;
0762
0763
0764 u32 txok;
0765
0766
0767 u16 txcf;
0768
0769 u32 tmca;
0770
0771
0772 u32 tbca;
0773
0774
0775 u32 rxfok;
0776 u32 rxbok;
0777 u32 rbyt;
0778
0779
0780
0781 u32 rmca;
0782
0783
0784 u32 rbca;
0785
0786
0787 } __packed;
0788
0789
0790 #define TX_ERRORS_DEF 0x0200
0791 #define TX_ERRORS_EXDEF 0x0100
0792 #define TX_ERRORS_LC 0x0080
0793 #define TX_ERRORS_RL 0x0040
0794 #define TX_ERRORS_RC_MASK 0x003C
0795 #define TX_ERRORS_RC_SHIFT 2
0796 #define TX_ERRORS_UN 0x0002
0797 #define TX_ERRORS_CSL 0x0001
0798
0799
0800 #define RX_ERRORS_CMR 0x0200
0801 #define RX_ERRORS_M 0x0100
0802 #define RX_ERRORS_BC 0x0080
0803 #define RX_ERRORS_MC 0x0040
0804
0805
0806 #define T_VID 0x003c0000
0807 #define T_DEF (((u32) TX_ERRORS_DEF ) << 16)
0808 #define T_EXDEF (((u32) TX_ERRORS_EXDEF ) << 16)
0809 #define T_LC (((u32) TX_ERRORS_LC ) << 16)
0810 #define T_RL (((u32) TX_ERRORS_RL ) << 16)
0811 #define T_RC_MASK (((u32) TX_ERRORS_RC_MASK ) << 16)
0812 #define T_UN (((u32) TX_ERRORS_UN ) << 16)
0813 #define T_CSL (((u32) TX_ERRORS_CSL ) << 16)
0814 #define T_ERRORS_REPORT (T_DEF | T_EXDEF | T_LC | T_RL | T_RC_MASK \
0815 | T_UN | T_CSL)
0816
0817
0818 #define R_LG 0x00200000
0819 #define R_NO 0x00100000
0820 #define R_SH 0x00080000
0821 #define R_CR 0x00040000
0822 #define R_OV 0x00020000
0823 #define R_IPCH 0x00010000
0824 #define R_CMR (((u32) RX_ERRORS_CMR ) << 16)
0825 #define R_M (((u32) RX_ERRORS_M ) << 16)
0826 #define R_BC (((u32) RX_ERRORS_BC ) << 16)
0827 #define R_MC (((u32) RX_ERRORS_MC ) << 16)
0828 #define R_ERRORS_REPORT (R_CMR | R_M | R_BC | R_MC)
0829
0830 #define R_ERRORS_FATAL (R_LG | R_NO | R_SH | R_CR | \
0831 R_OV | R_IPCH)
0832
0833
0834 #define UCC_GETH_RX_GLOBAL_PRAM_ALIGNMENT 256
0835 #define UCC_GETH_TX_GLOBAL_PRAM_ALIGNMENT 128
0836 #define UCC_GETH_THREAD_RX_PRAM_ALIGNMENT 128
0837 #define UCC_GETH_THREAD_TX_PRAM_ALIGNMENT 64
0838 #define UCC_GETH_THREAD_DATA_ALIGNMENT 256
0839
0840
0841
0842
0843 #define UCC_GETH_SEND_QUEUE_QUEUE_DESCRIPTOR_ALIGNMENT 32
0844 #define UCC_GETH_SCHEDULER_ALIGNMENT 8
0845 #define UCC_GETH_TX_STATISTICS_ALIGNMENT 4
0846 #define UCC_GETH_RX_STATISTICS_ALIGNMENT 4
0847 #define UCC_GETH_RX_INTERRUPT_COALESCING_ALIGNMENT 64
0848 #define UCC_GETH_RX_BD_QUEUES_ALIGNMENT 8
0849 #define UCC_GETH_RX_PREFETCHED_BDS_ALIGNMENT 128
0850 #define UCC_GETH_RX_EXTENDED_FILTERING_GLOBAL_PARAMETERS_ALIGNMENT 8
0851
0852
0853
0854 #define UCC_GETH_RX_BD_RING_ALIGNMENT 32
0855 #define UCC_GETH_TX_BD_RING_ALIGNMENT 32
0856 #define UCC_GETH_MRBLR_ALIGNMENT 128
0857 #define UCC_GETH_RX_BD_RING_SIZE_ALIGNMENT 4
0858 #define UCC_GETH_TX_BD_RING_SIZE_MEMORY_ALIGNMENT 32
0859 #define UCC_GETH_RX_DATA_BUF_ALIGNMENT 64
0860
0861 #define UCC_GETH_TAD_EF 0x80
0862 #define UCC_GETH_TAD_V 0x40
0863 #define UCC_GETH_TAD_REJ 0x20
0864 #define UCC_GETH_TAD_VTAG_OP_RIGHT_SHIFT 2
0865 #define UCC_GETH_TAD_VTAG_OP_SHIFT 6
0866 #define UCC_GETH_TAD_V_NON_VTAG_OP 0x20
0867 #define UCC_GETH_TAD_RQOS_SHIFT 0
0868 #define UCC_GETH_TAD_V_PRIORITY_SHIFT 5
0869 #define UCC_GETH_TAD_CFI 0x10
0870
0871 #define UCC_GETH_VLAN_PRIORITY_MAX 8
0872 #define UCC_GETH_IP_PRIORITY_MAX 64
0873 #define UCC_GETH_TX_VTAG_TABLE_ENTRY_MAX 8
0874 #define UCC_GETH_RX_BD_RING_SIZE_MIN 8
0875 #define UCC_GETH_TX_BD_RING_SIZE_MIN 2
0876 #define UCC_GETH_BD_RING_SIZE_MAX 0xffff
0877
0878 #define UCC_GETH_SIZE_OF_BD QE_SIZEOF_BD
0879
0880
0881 #define TX_BD_RING_LEN 0x10
0882 #define RX_BD_RING_LEN 0x20
0883
0884 #define TX_RING_MOD_MASK(size) (size-1)
0885 #define RX_RING_MOD_MASK(size) (size-1)
0886
0887 #define ENET_GROUP_ADDR 0x01
0888
0889
0890
0891 #define TX_TIMEOUT (1*HZ)
0892 #define PHY_INIT_TIMEOUT 100000
0893 #define PHY_CHANGE_TIME 2
0894
0895
0896 #define UCC_GETH_URFS_INIT 512
0897
0898 #define UCC_GETH_URFET_INIT 256
0899 #define UCC_GETH_URFSET_INIT 384
0900 #define UCC_GETH_UTFS_INIT 512
0901
0902 #define UCC_GETH_UTFET_INIT 256
0903 #define UCC_GETH_UTFTT_INIT 256
0904
0905
0906 #define UCC_GETH_URFS_GIGA_INIT 4096
0907
0908 #define UCC_GETH_URFET_GIGA_INIT 2048
0909 #define UCC_GETH_URFSET_GIGA_INIT 3072
0910 #define UCC_GETH_UTFS_GIGA_INIT 4096
0911
0912 #define UCC_GETH_UTFET_GIGA_INIT 2048
0913 #define UCC_GETH_UTFTT_GIGA_INIT 4096
0914
0915
0916 #define UCC_GETH_REMODER_INIT 0
0917
0918 #define UCC_GETH_TEMODER_INIT 0xC000
0919
0920
0921 #define UCC_GETH_UPSMR_INIT UCC_GETH_UPSMR_RES1
0922
0923 #define UCC_GETH_MACCFG1_INIT 0
0924 #define UCC_GETH_MACCFG2_INIT (MACCFG2_RESERVED_1)
0925
0926
0927 enum enet_addr_type {
0928 ENET_ADDR_TYPE_INDIVIDUAL,
0929 ENET_ADDR_TYPE_GROUP,
0930 ENET_ADDR_TYPE_BROADCAST
0931 };
0932
0933
0934 enum ucc_geth_enet_address_recognition_location {
0935 UCC_GETH_ENET_ADDRESS_RECOGNITION_LOCATION_STATION_ADDRESS,
0936
0937 UCC_GETH_ENET_ADDRESS_RECOGNITION_LOCATION_PADDR_FIRST,
0938
0939
0940
0941 UCC_GETH_ENET_ADDRESS_RECOGNITION_LOCATION_PADDR2,
0942
0943
0944
0945 UCC_GETH_ENET_ADDRESS_RECOGNITION_LOCATION_PADDR3,
0946
0947
0948
0949 UCC_GETH_ENET_ADDRESS_RECOGNITION_LOCATION_PADDR_LAST,
0950
0951
0952
0953 UCC_GETH_ENET_ADDRESS_RECOGNITION_LOCATION_GROUP_HASH,
0954 UCC_GETH_ENET_ADDRESS_RECOGNITION_LOCATION_INDIVIDUAL_HASH
0955
0956 };
0957
0958
0959 enum ucc_geth_vlan_operation_tagged {
0960 UCC_GETH_VLAN_OPERATION_TAGGED_NOP = 0x0,
0961 UCC_GETH_VLAN_OPERATION_TAGGED_REPLACE_VID_PORTION_OF_Q_TAG
0962 = 0x1,
0963 UCC_GETH_VLAN_OPERATION_TAGGED_IF_VID0_REPLACE_VID_WITH_DEFAULT_VALUE
0964 = 0x2,
0965 UCC_GETH_VLAN_OPERATION_TAGGED_EXTRACT_Q_TAG_FROM_FRAME
0966 = 0x3
0967 };
0968
0969
0970 enum ucc_geth_vlan_operation_non_tagged {
0971 UCC_GETH_VLAN_OPERATION_NON_TAGGED_NOP = 0x0,
0972 UCC_GETH_VLAN_OPERATION_NON_TAGGED_Q_TAG_INSERT = 0x1
0973
0974
0975 };
0976
0977
0978 enum ucc_geth_qos_mode {
0979 UCC_GETH_QOS_MODE_DEFAULT = 0x0,
0980 UCC_GETH_QOS_MODE_QUEUE_NUM_FROM_L2_CRITERIA = 0x1,
0981
0982
0983
0984 UCC_GETH_QOS_MODE_QUEUE_NUM_FROM_L3_CRITERIA = 0x2
0985
0986
0987
0988 };
0989
0990
0991
0992 enum ucc_geth_statistics_gathering_mode {
0993 UCC_GETH_STATISTICS_GATHERING_MODE_NONE = 0x00000000,
0994
0995
0996 UCC_GETH_STATISTICS_GATHERING_MODE_HARDWARE = 0x00000001,
0997
0998
0999
1000
1001 UCC_GETH_STATISTICS_GATHERING_MODE_FIRMWARE_TX = 0x00000004,
1002
1003
1004
1005
1006
1007 UCC_GETH_STATISTICS_GATHERING_MODE_FIRMWARE_RX = 0x00000008
1008
1009
1010
1011
1012
1013 };
1014
1015
1016 enum ucc_geth_maccfg2_pad_and_crc_mode {
1017 UCC_GETH_PAD_AND_CRC_MODE_NONE
1018 = MACCFG2_PAD_AND_CRC_MODE_NONE,
1019
1020
1021 UCC_GETH_PAD_AND_CRC_MODE_CRC_ONLY
1022 = MACCFG2_PAD_AND_CRC_MODE_CRC_ONLY,
1023
1024 UCC_GETH_PAD_AND_CRC_MODE_PAD_AND_CRC =
1025 MACCFG2_PAD_AND_CRC_MODE_PAD_AND_CRC
1026 };
1027
1028
1029 enum ucc_geth_flow_control_mode {
1030 UPSMR_AUTOMATIC_FLOW_CONTROL_MODE_NONE = 0x00000000,
1031
1032
1033 UPSMR_AUTOMATIC_FLOW_CONTROL_MODE_PAUSE_WHEN_EMERGENCY
1034 = 0x00004000
1035
1036 };
1037
1038
1039 enum ucc_geth_num_of_threads {
1040 UCC_GETH_NUM_OF_THREADS_1 = 0x1,
1041 UCC_GETH_NUM_OF_THREADS_2 = 0x2,
1042 UCC_GETH_NUM_OF_THREADS_4 = 0x0,
1043 UCC_GETH_NUM_OF_THREADS_6 = 0x3,
1044 UCC_GETH_NUM_OF_THREADS_8 = 0x4
1045 };
1046
1047
1048 enum ucc_geth_num_of_station_addresses {
1049 UCC_GETH_NUM_OF_STATION_ADDRESSES_1,
1050 UCC_GETH_NUM_OF_STATION_ADDRESSES_5
1051 };
1052
1053
1054 struct enet_addr_container {
1055 u8 address[ETH_ALEN];
1056 enum ucc_geth_enet_address_recognition_location location;
1057
1058
1059
1060 struct list_head node;
1061 };
1062
1063 #define ENET_ADDR_CONT_ENTRY(ptr) list_entry(ptr, struct enet_addr_container, node)
1064
1065
1066 struct ucc_geth_tad_params {
1067 int rx_non_dynamic_extended_features_mode;
1068 int reject_frame;
1069 enum ucc_geth_vlan_operation_tagged vtag_op;
1070 enum ucc_geth_vlan_operation_non_tagged vnontag_op;
1071 enum ucc_geth_qos_mode rqos;
1072 u8 vpri;
1073 u16 vid;
1074 };
1075
1076
1077 struct ucc_geth_info {
1078 struct ucc_fast_info uf_info;
1079 int ipCheckSumCheck;
1080 int ipCheckSumGenerate;
1081 int rxExtendedFiltering;
1082 u32 extendedFilteringChainPointer;
1083 u16 typeorlen;
1084 int dynamicMaxFrameLength;
1085 int dynamicMinFrameLength;
1086 u8 nonBackToBackIfgPart1;
1087 u8 nonBackToBackIfgPart2;
1088 u8 miminumInterFrameGapEnforcement;
1089 u8 backToBackInterFrameGap;
1090 int ipAddressAlignment;
1091 int lengthCheckRx;
1092 u32 mblinterval;
1093 u16 nortsrbytetime;
1094 u8 fracsiz;
1095 u8 strictpriorityq;
1096 u8 txasap;
1097 u8 extrabw;
1098 int miiPreambleSupress;
1099 u8 altBebTruncation;
1100 int altBeb;
1101 int backPressureNoBackoff;
1102 int noBackoff;
1103 int excessDefer;
1104 u8 maxRetransmission;
1105 u8 collisionWindow;
1106 int pro;
1107 int cap;
1108 int rsh;
1109 int rlpb;
1110 int cam;
1111 int bro;
1112 int ecm;
1113 int receiveFlowControl;
1114 int transmitFlowControl;
1115 u8 maxGroupAddrInHash;
1116 u8 maxIndAddrInHash;
1117 u8 prel;
1118 u16 maxFrameLength;
1119 u16 minFrameLength;
1120 u16 maxD1Length;
1121 u16 maxD2Length;
1122 u16 vlantype;
1123 u16 vlantci;
1124 u32 ecamptr;
1125 u32 eventRegMask;
1126 u16 pausePeriod;
1127 u16 extensionField;
1128 struct device_node *phy_node;
1129 struct device_node *tbi_node;
1130 u8 weightfactor[NUM_TX_QUEUES];
1131 u8 interruptcoalescingmaxvalue[NUM_RX_QUEUES];
1132 u8 l2qt[UCC_GETH_VLAN_PRIORITY_MAX];
1133 u8 l3qt[UCC_GETH_IP_PRIORITY_MAX];
1134 u32 vtagtable[UCC_GETH_TX_VTAG_TABLE_ENTRY_MAX];
1135 u8 iphoffset[TX_IP_OFFSET_ENTRY_MAX];
1136 u16 bdRingLenTx[NUM_TX_QUEUES];
1137 u16 bdRingLenRx[NUM_RX_QUEUES];
1138 enum ucc_geth_num_of_station_addresses numStationAddresses;
1139 enum qe_fltr_largest_external_tbl_lookup_key_size
1140 largestexternallookupkeysize;
1141 enum ucc_geth_statistics_gathering_mode statisticsMode;
1142 enum ucc_geth_vlan_operation_tagged vlanOperationTagged;
1143 enum ucc_geth_vlan_operation_non_tagged vlanOperationNonTagged;
1144 enum ucc_geth_qos_mode rxQoSMode;
1145 enum ucc_geth_flow_control_mode aufc;
1146 enum ucc_geth_maccfg2_pad_and_crc_mode padAndCrc;
1147 enum ucc_geth_num_of_threads numThreadsTx;
1148 enum ucc_geth_num_of_threads numThreadsRx;
1149 unsigned int riscTx;
1150 unsigned int riscRx;
1151 };
1152
1153
1154 struct ucc_geth_private {
1155 struct ucc_geth_info *ug_info;
1156 struct ucc_fast_private *uccf;
1157 struct device *dev;
1158 struct net_device *ndev;
1159 struct napi_struct napi;
1160 struct work_struct timeout_work;
1161 struct ucc_geth __iomem *ug_regs;
1162 struct ucc_geth_init_pram *p_init_enet_param_shadow;
1163 struct ucc_geth_exf_global_pram __iomem *p_exf_glbl_param;
1164 u32 exf_glbl_param_offset;
1165 struct ucc_geth_rx_global_pram __iomem *p_rx_glbl_pram;
1166 struct ucc_geth_tx_global_pram __iomem *p_tx_glbl_pram;
1167 struct ucc_geth_send_queue_mem_region __iomem *p_send_q_mem_reg;
1168 u32 send_q_mem_reg_offset;
1169 struct ucc_geth_thread_data_tx __iomem *p_thread_data_tx;
1170 u32 thread_dat_tx_offset;
1171 struct ucc_geth_thread_data_rx __iomem *p_thread_data_rx;
1172 u32 thread_dat_rx_offset;
1173 struct ucc_geth_scheduler __iomem *p_scheduler;
1174 u32 scheduler_offset;
1175 struct ucc_geth_tx_firmware_statistics_pram __iomem *p_tx_fw_statistics_pram;
1176 u32 tx_fw_statistics_pram_offset;
1177 struct ucc_geth_rx_firmware_statistics_pram __iomem *p_rx_fw_statistics_pram;
1178 u32 rx_fw_statistics_pram_offset;
1179 struct ucc_geth_rx_interrupt_coalescing_table __iomem *p_rx_irq_coalescing_tbl;
1180 u32 rx_irq_coalescing_tbl_offset;
1181 struct ucc_geth_rx_bd_queues_entry __iomem *p_rx_bd_qs_tbl;
1182 u32 rx_bd_qs_tbl_offset;
1183 u8 __iomem *p_tx_bd_ring[NUM_TX_QUEUES];
1184 u8 __iomem *p_rx_bd_ring[NUM_RX_QUEUES];
1185 u8 __iomem *confBd[NUM_TX_QUEUES];
1186 u8 __iomem *txBd[NUM_TX_QUEUES];
1187 u8 __iomem *rxBd[NUM_RX_QUEUES];
1188 int badFrame[NUM_RX_QUEUES];
1189 u16 cpucount[NUM_TX_QUEUES];
1190 u16 __iomem *p_cpucount[NUM_TX_QUEUES];
1191 int indAddrRegUsed[NUM_OF_PADDRS];
1192 u8 paddr[NUM_OF_PADDRS][ETH_ALEN];
1193 u8 numGroupAddrInHash;
1194 u8 numIndAddrInHash;
1195 u8 numIndAddrInReg;
1196 int rx_extended_features;
1197 int rx_non_dynamic_extended_features;
1198 struct list_head conf_skbs;
1199 struct list_head group_hash_q;
1200 struct list_head ind_hash_q;
1201 u32 saved_uccm;
1202 spinlock_t lock;
1203
1204 struct sk_buff **tx_skbuff[NUM_TX_QUEUES];
1205 struct sk_buff **rx_skbuff[NUM_RX_QUEUES];
1206
1207 u16 skb_curtx[NUM_TX_QUEUES];
1208 u16 skb_currx[NUM_RX_QUEUES];
1209
1210 u16 skb_dirtytx[NUM_TX_QUEUES];
1211
1212 struct ugeth_mii_info *mii_info;
1213 struct phy_device *phydev;
1214 phy_interface_t phy_interface;
1215 int max_speed;
1216 uint32_t msg_enable;
1217 int oldspeed;
1218 int oldduplex;
1219 int oldlink;
1220 int wol_en;
1221
1222 struct device_node *node;
1223 };
1224
1225 void uec_set_ethtool_ops(struct net_device *netdev);
1226 int init_flow_control_params(u32 automatic_flow_control_mode,
1227 int rx_flow_control_enable, int tx_flow_control_enable,
1228 u16 pause_period, u16 extension_field,
1229 u32 __iomem *upsmr_register, u32 __iomem *uempr_register,
1230 u32 __iomem *maccfg1_register);
1231
1232
1233 #endif