1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (C) Freescale Semicondutor, Inc. 2006-2009. All rights reserved. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Author: Shlomi Gridish <gridish@freescale.com> 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Description: 8*4882a593Smuzhiyun * Internal header file for UCC Gigabit Ethernet unit routines. 9*4882a593Smuzhiyun * 10*4882a593Smuzhiyun * Changelog: 11*4882a593Smuzhiyun * Jun 28, 2006 Li Yang <LeoLi@freescale.com> 12*4882a593Smuzhiyun * - Rearrange code and style fixes 13*4882a593Smuzhiyun */ 14*4882a593Smuzhiyun #ifndef __UCC_GETH_H__ 15*4882a593Smuzhiyun #define __UCC_GETH_H__ 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #include <linux/kernel.h> 18*4882a593Smuzhiyun #include <linux/list.h> 19*4882a593Smuzhiyun #include <linux/if_ether.h> 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun #include <soc/fsl/qe/immap_qe.h> 22*4882a593Smuzhiyun #include <soc/fsl/qe/qe.h> 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #include <soc/fsl/qe/ucc.h> 25*4882a593Smuzhiyun #include <soc/fsl/qe/ucc_fast.h> 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun #define DRV_DESC "QE UCC Gigabit Ethernet Controller" 28*4882a593Smuzhiyun #define DRV_NAME "ucc_geth" 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun #define NUM_TX_QUEUES 8 31*4882a593Smuzhiyun #define NUM_RX_QUEUES 8 32*4882a593Smuzhiyun #define NUM_BDS_IN_PREFETCHED_BDS 4 33*4882a593Smuzhiyun #define TX_IP_OFFSET_ENTRY_MAX 8 34*4882a593Smuzhiyun #define NUM_OF_PADDRS 4 35*4882a593Smuzhiyun #define ENET_INIT_PARAM_MAX_ENTRIES_RX 9 36*4882a593Smuzhiyun #define ENET_INIT_PARAM_MAX_ENTRIES_TX 8 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun struct ucc_geth { 39*4882a593Smuzhiyun struct ucc_fast uccf; 40*4882a593Smuzhiyun u8 res0[0x100 - sizeof(struct ucc_fast)]; 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun u32 maccfg1; /* mac configuration reg. 1 */ 43*4882a593Smuzhiyun u32 maccfg2; /* mac configuration reg. 2 */ 44*4882a593Smuzhiyun u32 ipgifg; /* interframe gap reg. */ 45*4882a593Smuzhiyun u32 hafdup; /* half-duplex reg. */ 46*4882a593Smuzhiyun u8 res1[0x10]; 47*4882a593Smuzhiyun u8 miimng[0x18]; /* MII management structure moved to _mii.h */ 48*4882a593Smuzhiyun u32 ifctl; /* interface control reg */ 49*4882a593Smuzhiyun u32 ifstat; /* interface statux reg */ 50*4882a593Smuzhiyun u32 macstnaddr1; /* mac station address part 1 reg */ 51*4882a593Smuzhiyun u32 macstnaddr2; /* mac station address part 2 reg */ 52*4882a593Smuzhiyun u8 res2[0x8]; 53*4882a593Smuzhiyun u32 uempr; /* UCC Ethernet Mac parameter reg */ 54*4882a593Smuzhiyun u32 utbipar; /* UCC tbi address reg */ 55*4882a593Smuzhiyun u16 uescr; /* UCC Ethernet statistics control reg */ 56*4882a593Smuzhiyun u8 res3[0x180 - 0x15A]; 57*4882a593Smuzhiyun u32 tx64; /* Total number of frames (including bad 58*4882a593Smuzhiyun frames) transmitted that were exactly of the 59*4882a593Smuzhiyun minimal length (64 for un tagged, 68 for 60*4882a593Smuzhiyun tagged, or with length exactly equal to the 61*4882a593Smuzhiyun parameter MINLength */ 62*4882a593Smuzhiyun u32 tx127; /* Total number of frames (including bad 63*4882a593Smuzhiyun frames) transmitted that were between 64*4882a593Smuzhiyun MINLength (Including FCS length==4) and 127 65*4882a593Smuzhiyun octets */ 66*4882a593Smuzhiyun u32 tx255; /* Total number of frames (including bad 67*4882a593Smuzhiyun frames) transmitted that were between 128 68*4882a593Smuzhiyun (Including FCS length==4) and 255 octets */ 69*4882a593Smuzhiyun u32 rx64; /* Total number of frames received including 70*4882a593Smuzhiyun bad frames that were exactly of the mninimal 71*4882a593Smuzhiyun length (64 bytes) */ 72*4882a593Smuzhiyun u32 rx127; /* Total number of frames (including bad 73*4882a593Smuzhiyun frames) received that were between MINLength 74*4882a593Smuzhiyun (Including FCS length==4) and 127 octets */ 75*4882a593Smuzhiyun u32 rx255; /* Total number of frames (including bad 76*4882a593Smuzhiyun frames) received that were between 128 77*4882a593Smuzhiyun (Including FCS length==4) and 255 octets */ 78*4882a593Smuzhiyun u32 txok; /* Total number of octets residing in frames 79*4882a593Smuzhiyun that where involved in successful 80*4882a593Smuzhiyun transmission */ 81*4882a593Smuzhiyun u16 txcf; /* Total number of PAUSE control frames 82*4882a593Smuzhiyun transmitted by this MAC */ 83*4882a593Smuzhiyun u8 res4[0x2]; 84*4882a593Smuzhiyun u32 tmca; /* Total number of frames that were transmitted 85*4882a593Smuzhiyun successfully with the group address bit set 86*4882a593Smuzhiyun that are not broadcast frames */ 87*4882a593Smuzhiyun u32 tbca; /* Total number of frames transmitted 88*4882a593Smuzhiyun successfully that had destination address 89*4882a593Smuzhiyun field equal to the broadcast address */ 90*4882a593Smuzhiyun u32 rxfok; /* Total number of frames received OK */ 91*4882a593Smuzhiyun u32 rxbok; /* Total number of octets received OK */ 92*4882a593Smuzhiyun u32 rbyt; /* Total number of octets received including 93*4882a593Smuzhiyun octets in bad frames. Must be implemented in 94*4882a593Smuzhiyun HW because it includes octets in frames that 95*4882a593Smuzhiyun never even reach the UCC */ 96*4882a593Smuzhiyun u32 rmca; /* Total number of frames that were received 97*4882a593Smuzhiyun successfully with the group address bit set 98*4882a593Smuzhiyun that are not broadcast frames */ 99*4882a593Smuzhiyun u32 rbca; /* Total number of frames received successfully 100*4882a593Smuzhiyun that had destination address equal to the 101*4882a593Smuzhiyun broadcast address */ 102*4882a593Smuzhiyun u32 scar; /* Statistics carry register */ 103*4882a593Smuzhiyun u32 scam; /* Statistics caryy mask register */ 104*4882a593Smuzhiyun u8 res5[0x200 - 0x1c4]; 105*4882a593Smuzhiyun } __packed; 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun /* UCC GETH TEMODR Register */ 108*4882a593Smuzhiyun #define TEMODER_TX_RMON_STATISTICS_ENABLE 0x0100 /* enable Tx statistics 109*4882a593Smuzhiyun */ 110*4882a593Smuzhiyun #define TEMODER_SCHEDULER_ENABLE 0x2000 /* enable scheduler */ 111*4882a593Smuzhiyun #define TEMODER_IP_CHECKSUM_GENERATE 0x0400 /* generate IPv4 112*4882a593Smuzhiyun checksums */ 113*4882a593Smuzhiyun #define TEMODER_PERFORMANCE_OPTIMIZATION_MODE1 0x0200 /* enable performance 114*4882a593Smuzhiyun optimization 115*4882a593Smuzhiyun enhancement (mode1) */ 116*4882a593Smuzhiyun #define TEMODER_RMON_STATISTICS 0x0100 /* enable tx statistics 117*4882a593Smuzhiyun */ 118*4882a593Smuzhiyun #define TEMODER_NUM_OF_QUEUES_SHIFT (15-15) /* Number of queues << 119*4882a593Smuzhiyun shift */ 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun /* UCC GETH TEMODR Register */ 122*4882a593Smuzhiyun #define REMODER_RX_RMON_STATISTICS_ENABLE 0x00001000 /* enable Rx 123*4882a593Smuzhiyun statistics */ 124*4882a593Smuzhiyun #define REMODER_RX_EXTENDED_FEATURES 0x80000000 /* enable 125*4882a593Smuzhiyun extended 126*4882a593Smuzhiyun features */ 127*4882a593Smuzhiyun #define REMODER_VLAN_OPERATION_TAGGED_SHIFT (31-9 ) /* vlan operation 128*4882a593Smuzhiyun tagged << shift */ 129*4882a593Smuzhiyun #define REMODER_VLAN_OPERATION_NON_TAGGED_SHIFT (31-10) /* vlan operation non 130*4882a593Smuzhiyun tagged << shift */ 131*4882a593Smuzhiyun #define REMODER_RX_QOS_MODE_SHIFT (31-15) /* rx QoS mode << shift 132*4882a593Smuzhiyun */ 133*4882a593Smuzhiyun #define REMODER_RMON_STATISTICS 0x00001000 /* enable rx 134*4882a593Smuzhiyun statistics */ 135*4882a593Smuzhiyun #define REMODER_RX_EXTENDED_FILTERING 0x00000800 /* extended 136*4882a593Smuzhiyun filtering 137*4882a593Smuzhiyun vs. 138*4882a593Smuzhiyun mpc82xx-like 139*4882a593Smuzhiyun filtering */ 140*4882a593Smuzhiyun #define REMODER_NUM_OF_QUEUES_SHIFT (31-23) /* Number of queues << 141*4882a593Smuzhiyun shift */ 142*4882a593Smuzhiyun #define REMODER_DYNAMIC_MAX_FRAME_LENGTH 0x00000008 /* enable 143*4882a593Smuzhiyun dynamic max 144*4882a593Smuzhiyun frame length 145*4882a593Smuzhiyun */ 146*4882a593Smuzhiyun #define REMODER_DYNAMIC_MIN_FRAME_LENGTH 0x00000004 /* enable 147*4882a593Smuzhiyun dynamic min 148*4882a593Smuzhiyun frame length 149*4882a593Smuzhiyun */ 150*4882a593Smuzhiyun #define REMODER_IP_CHECKSUM_CHECK 0x00000002 /* check IPv4 151*4882a593Smuzhiyun checksums */ 152*4882a593Smuzhiyun #define REMODER_IP_ADDRESS_ALIGNMENT 0x00000001 /* align ip 153*4882a593Smuzhiyun address to 154*4882a593Smuzhiyun 4-byte 155*4882a593Smuzhiyun boundary */ 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun /* UCC GETH Event Register */ 158*4882a593Smuzhiyun #define UCCE_TXB (UCC_GETH_UCCE_TXB7 | UCC_GETH_UCCE_TXB6 | \ 159*4882a593Smuzhiyun UCC_GETH_UCCE_TXB5 | UCC_GETH_UCCE_TXB4 | \ 160*4882a593Smuzhiyun UCC_GETH_UCCE_TXB3 | UCC_GETH_UCCE_TXB2 | \ 161*4882a593Smuzhiyun UCC_GETH_UCCE_TXB1 | UCC_GETH_UCCE_TXB0) 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun #define UCCE_RXB (UCC_GETH_UCCE_RXB7 | UCC_GETH_UCCE_RXB6 | \ 164*4882a593Smuzhiyun UCC_GETH_UCCE_RXB5 | UCC_GETH_UCCE_RXB4 | \ 165*4882a593Smuzhiyun UCC_GETH_UCCE_RXB3 | UCC_GETH_UCCE_RXB2 | \ 166*4882a593Smuzhiyun UCC_GETH_UCCE_RXB1 | UCC_GETH_UCCE_RXB0) 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun #define UCCE_RXF (UCC_GETH_UCCE_RXF7 | UCC_GETH_UCCE_RXF6 | \ 169*4882a593Smuzhiyun UCC_GETH_UCCE_RXF5 | UCC_GETH_UCCE_RXF4 | \ 170*4882a593Smuzhiyun UCC_GETH_UCCE_RXF3 | UCC_GETH_UCCE_RXF2 | \ 171*4882a593Smuzhiyun UCC_GETH_UCCE_RXF1 | UCC_GETH_UCCE_RXF0) 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun #define UCCE_OTHER (UCC_GETH_UCCE_SCAR | UCC_GETH_UCCE_GRA | \ 174*4882a593Smuzhiyun UCC_GETH_UCCE_CBPR | UCC_GETH_UCCE_BSY | \ 175*4882a593Smuzhiyun UCC_GETH_UCCE_RXC | UCC_GETH_UCCE_TXC | UCC_GETH_UCCE_TXE) 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun #define UCCE_RX_EVENTS (UCCE_RXF | UCC_GETH_UCCE_BSY) 178*4882a593Smuzhiyun #define UCCE_TX_EVENTS (UCCE_TXB | UCC_GETH_UCCE_TXE) 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun /* TBI defines */ 181*4882a593Smuzhiyun #define ENET_TBI_MII_CR 0x00 /* Control */ 182*4882a593Smuzhiyun #define ENET_TBI_MII_SR 0x01 /* Status */ 183*4882a593Smuzhiyun #define ENET_TBI_MII_ANA 0x04 /* AN advertisement */ 184*4882a593Smuzhiyun #define ENET_TBI_MII_ANLPBPA 0x05 /* AN link partner base page ability */ 185*4882a593Smuzhiyun #define ENET_TBI_MII_ANEX 0x06 /* AN expansion */ 186*4882a593Smuzhiyun #define ENET_TBI_MII_ANNPT 0x07 /* AN next page transmit */ 187*4882a593Smuzhiyun #define ENET_TBI_MII_ANLPANP 0x08 /* AN link partner ability next page */ 188*4882a593Smuzhiyun #define ENET_TBI_MII_EXST 0x0F /* Extended status */ 189*4882a593Smuzhiyun #define ENET_TBI_MII_JD 0x10 /* Jitter diagnostics */ 190*4882a593Smuzhiyun #define ENET_TBI_MII_TBICON 0x11 /* TBI control */ 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun /* TBI MDIO register bit fields*/ 193*4882a593Smuzhiyun #define TBISR_LSTATUS 0x0004 194*4882a593Smuzhiyun #define TBICON_CLK_SELECT 0x0020 195*4882a593Smuzhiyun #define TBIANA_ASYMMETRIC_PAUSE 0x0100 196*4882a593Smuzhiyun #define TBIANA_SYMMETRIC_PAUSE 0x0080 197*4882a593Smuzhiyun #define TBIANA_HALF_DUPLEX 0x0040 198*4882a593Smuzhiyun #define TBIANA_FULL_DUPLEX 0x0020 199*4882a593Smuzhiyun #define TBICR_PHY_RESET 0x8000 200*4882a593Smuzhiyun #define TBICR_ANEG_ENABLE 0x1000 201*4882a593Smuzhiyun #define TBICR_RESTART_ANEG 0x0200 202*4882a593Smuzhiyun #define TBICR_FULL_DUPLEX 0x0100 203*4882a593Smuzhiyun #define TBICR_SPEED1_SET 0x0040 204*4882a593Smuzhiyun 205*4882a593Smuzhiyun #define TBIANA_SETTINGS ( \ 206*4882a593Smuzhiyun TBIANA_ASYMMETRIC_PAUSE \ 207*4882a593Smuzhiyun | TBIANA_SYMMETRIC_PAUSE \ 208*4882a593Smuzhiyun | TBIANA_FULL_DUPLEX \ 209*4882a593Smuzhiyun ) 210*4882a593Smuzhiyun #define TBICR_SETTINGS ( \ 211*4882a593Smuzhiyun TBICR_PHY_RESET \ 212*4882a593Smuzhiyun | TBICR_ANEG_ENABLE \ 213*4882a593Smuzhiyun | TBICR_FULL_DUPLEX \ 214*4882a593Smuzhiyun | TBICR_SPEED1_SET \ 215*4882a593Smuzhiyun ) 216*4882a593Smuzhiyun 217*4882a593Smuzhiyun /* UCC GETH MACCFG1 (MAC Configuration 1 Register) */ 218*4882a593Smuzhiyun #define MACCFG1_FLOW_RX 0x00000020 /* Flow Control 219*4882a593Smuzhiyun Rx */ 220*4882a593Smuzhiyun #define MACCFG1_FLOW_TX 0x00000010 /* Flow Control 221*4882a593Smuzhiyun Tx */ 222*4882a593Smuzhiyun #define MACCFG1_ENABLE_SYNCHED_RX 0x00000008 /* Rx Enable 223*4882a593Smuzhiyun synchronized 224*4882a593Smuzhiyun to Rx stream 225*4882a593Smuzhiyun */ 226*4882a593Smuzhiyun #define MACCFG1_ENABLE_RX 0x00000004 /* Enable Rx */ 227*4882a593Smuzhiyun #define MACCFG1_ENABLE_SYNCHED_TX 0x00000002 /* Tx Enable 228*4882a593Smuzhiyun synchronized 229*4882a593Smuzhiyun to Tx stream 230*4882a593Smuzhiyun */ 231*4882a593Smuzhiyun #define MACCFG1_ENABLE_TX 0x00000001 /* Enable Tx */ 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun /* UCC GETH MACCFG2 (MAC Configuration 2 Register) */ 234*4882a593Smuzhiyun #define MACCFG2_PREL_SHIFT (31 - 19) /* Preamble 235*4882a593Smuzhiyun Length << 236*4882a593Smuzhiyun shift */ 237*4882a593Smuzhiyun #define MACCFG2_PREL_MASK 0x0000f000 /* Preamble 238*4882a593Smuzhiyun Length mask */ 239*4882a593Smuzhiyun #define MACCFG2_SRP 0x00000080 /* Soft Receive 240*4882a593Smuzhiyun Preamble */ 241*4882a593Smuzhiyun #define MACCFG2_STP 0x00000040 /* Soft 242*4882a593Smuzhiyun Transmit 243*4882a593Smuzhiyun Preamble */ 244*4882a593Smuzhiyun #define MACCFG2_RESERVED_1 0x00000020 /* Reserved - 245*4882a593Smuzhiyun must be set 246*4882a593Smuzhiyun to 1 */ 247*4882a593Smuzhiyun #define MACCFG2_LC 0x00000010 /* Length Check 248*4882a593Smuzhiyun */ 249*4882a593Smuzhiyun #define MACCFG2_MPE 0x00000008 /* Magic packet 250*4882a593Smuzhiyun detect */ 251*4882a593Smuzhiyun #define MACCFG2_FDX 0x00000001 /* Full Duplex */ 252*4882a593Smuzhiyun #define MACCFG2_FDX_MASK 0x00000001 /* Full Duplex 253*4882a593Smuzhiyun mask */ 254*4882a593Smuzhiyun #define MACCFG2_PAD_CRC 0x00000004 255*4882a593Smuzhiyun #define MACCFG2_CRC_EN 0x00000002 256*4882a593Smuzhiyun #define MACCFG2_PAD_AND_CRC_MODE_NONE 0x00000000 /* Neither 257*4882a593Smuzhiyun Padding 258*4882a593Smuzhiyun short frames 259*4882a593Smuzhiyun nor CRC */ 260*4882a593Smuzhiyun #define MACCFG2_PAD_AND_CRC_MODE_CRC_ONLY 0x00000002 /* Append CRC 261*4882a593Smuzhiyun only */ 262*4882a593Smuzhiyun #define MACCFG2_PAD_AND_CRC_MODE_PAD_AND_CRC 0x00000004 263*4882a593Smuzhiyun #define MACCFG2_INTERFACE_MODE_NIBBLE 0x00000100 /* nibble mode 264*4882a593Smuzhiyun (MII/RMII/RGMII 265*4882a593Smuzhiyun 10/100bps) */ 266*4882a593Smuzhiyun #define MACCFG2_INTERFACE_MODE_BYTE 0x00000200 /* byte mode 267*4882a593Smuzhiyun (GMII/TBI/RTB/RGMII 268*4882a593Smuzhiyun 1000bps ) */ 269*4882a593Smuzhiyun #define MACCFG2_INTERFACE_MODE_MASK 0x00000300 /* mask 270*4882a593Smuzhiyun covering all 271*4882a593Smuzhiyun relevant 272*4882a593Smuzhiyun bits */ 273*4882a593Smuzhiyun 274*4882a593Smuzhiyun /* UCC GETH IPGIFG (Inter-frame Gap / Inter-Frame Gap Register) */ 275*4882a593Smuzhiyun #define IPGIFG_NON_BACK_TO_BACK_IFG_PART1_SHIFT (31 - 7) /* Non 276*4882a593Smuzhiyun back-to-back 277*4882a593Smuzhiyun inter frame 278*4882a593Smuzhiyun gap part 1. 279*4882a593Smuzhiyun << shift */ 280*4882a593Smuzhiyun #define IPGIFG_NON_BACK_TO_BACK_IFG_PART2_SHIFT (31 - 15) /* Non 281*4882a593Smuzhiyun back-to-back 282*4882a593Smuzhiyun inter frame 283*4882a593Smuzhiyun gap part 2. 284*4882a593Smuzhiyun << shift */ 285*4882a593Smuzhiyun #define IPGIFG_MINIMUM_IFG_ENFORCEMENT_SHIFT (31 - 23) /* Mimimum IFG 286*4882a593Smuzhiyun Enforcement 287*4882a593Smuzhiyun << shift */ 288*4882a593Smuzhiyun #define IPGIFG_BACK_TO_BACK_IFG_SHIFT (31 - 31) /* back-to-back 289*4882a593Smuzhiyun inter frame 290*4882a593Smuzhiyun gap << shift 291*4882a593Smuzhiyun */ 292*4882a593Smuzhiyun #define IPGIFG_NON_BACK_TO_BACK_IFG_PART1_MAX 127 /* Non back-to-back 293*4882a593Smuzhiyun inter frame gap part 294*4882a593Smuzhiyun 1. max val */ 295*4882a593Smuzhiyun #define IPGIFG_NON_BACK_TO_BACK_IFG_PART2_MAX 127 /* Non back-to-back 296*4882a593Smuzhiyun inter frame gap part 297*4882a593Smuzhiyun 2. max val */ 298*4882a593Smuzhiyun #define IPGIFG_MINIMUM_IFG_ENFORCEMENT_MAX 255 /* Mimimum IFG 299*4882a593Smuzhiyun Enforcement max val */ 300*4882a593Smuzhiyun #define IPGIFG_BACK_TO_BACK_IFG_MAX 127 /* back-to-back inter 301*4882a593Smuzhiyun frame gap max val */ 302*4882a593Smuzhiyun #define IPGIFG_NBTB_CS_IPG_MASK 0x7F000000 303*4882a593Smuzhiyun #define IPGIFG_NBTB_IPG_MASK 0x007F0000 304*4882a593Smuzhiyun #define IPGIFG_MIN_IFG_MASK 0x0000FF00 305*4882a593Smuzhiyun #define IPGIFG_BTB_IPG_MASK 0x0000007F 306*4882a593Smuzhiyun 307*4882a593Smuzhiyun /* UCC GETH HAFDUP (Half Duplex Register) */ 308*4882a593Smuzhiyun #define HALFDUP_ALT_BEB_TRUNCATION_SHIFT (31 - 11) /* Alternate 309*4882a593Smuzhiyun Binary 310*4882a593Smuzhiyun Exponential 311*4882a593Smuzhiyun Backoff 312*4882a593Smuzhiyun Truncation 313*4882a593Smuzhiyun << shift */ 314*4882a593Smuzhiyun #define HALFDUP_ALT_BEB_TRUNCATION_MAX 0xf /* Alternate Binary 315*4882a593Smuzhiyun Exponential Backoff 316*4882a593Smuzhiyun Truncation max val */ 317*4882a593Smuzhiyun #define HALFDUP_ALT_BEB 0x00080000 /* Alternate 318*4882a593Smuzhiyun Binary 319*4882a593Smuzhiyun Exponential 320*4882a593Smuzhiyun Backoff */ 321*4882a593Smuzhiyun #define HALFDUP_BACK_PRESSURE_NO_BACKOFF 0x00040000 /* Back 322*4882a593Smuzhiyun pressure no 323*4882a593Smuzhiyun backoff */ 324*4882a593Smuzhiyun #define HALFDUP_NO_BACKOFF 0x00020000 /* No Backoff */ 325*4882a593Smuzhiyun #define HALFDUP_EXCESSIVE_DEFER 0x00010000 /* Excessive 326*4882a593Smuzhiyun Defer */ 327*4882a593Smuzhiyun #define HALFDUP_MAX_RETRANSMISSION_SHIFT (31 - 19) /* Maximum 328*4882a593Smuzhiyun Retransmission 329*4882a593Smuzhiyun << shift */ 330*4882a593Smuzhiyun #define HALFDUP_MAX_RETRANSMISSION_MAX 0xf /* Maximum 331*4882a593Smuzhiyun Retransmission max 332*4882a593Smuzhiyun val */ 333*4882a593Smuzhiyun #define HALFDUP_COLLISION_WINDOW_SHIFT (31 - 31) /* Collision 334*4882a593Smuzhiyun Window << 335*4882a593Smuzhiyun shift */ 336*4882a593Smuzhiyun #define HALFDUP_COLLISION_WINDOW_MAX 0x3f /* Collision Window max 337*4882a593Smuzhiyun val */ 338*4882a593Smuzhiyun #define HALFDUP_ALT_BEB_TR_MASK 0x00F00000 339*4882a593Smuzhiyun #define HALFDUP_RETRANS_MASK 0x0000F000 340*4882a593Smuzhiyun #define HALFDUP_COL_WINDOW_MASK 0x0000003F 341*4882a593Smuzhiyun 342*4882a593Smuzhiyun /* UCC GETH UCCS (Ethernet Status Register) */ 343*4882a593Smuzhiyun #define UCCS_BPR 0x02 /* Back pressure (in 344*4882a593Smuzhiyun half duplex mode) */ 345*4882a593Smuzhiyun #define UCCS_PAU 0x02 /* Pause state (in full 346*4882a593Smuzhiyun duplex mode) */ 347*4882a593Smuzhiyun #define UCCS_MPD 0x01 /* Magic Packet 348*4882a593Smuzhiyun Detected */ 349*4882a593Smuzhiyun 350*4882a593Smuzhiyun /* UCC GETH IFSTAT (Interface Status Register) */ 351*4882a593Smuzhiyun #define IFSTAT_EXCESS_DEFER 0x00000200 /* Excessive 352*4882a593Smuzhiyun transmission 353*4882a593Smuzhiyun defer */ 354*4882a593Smuzhiyun 355*4882a593Smuzhiyun /* UCC GETH MACSTNADDR1 (Station Address Part 1 Register) */ 356*4882a593Smuzhiyun #define MACSTNADDR1_OCTET_6_SHIFT (31 - 7) /* Station 357*4882a593Smuzhiyun address 6th 358*4882a593Smuzhiyun octet << 359*4882a593Smuzhiyun shift */ 360*4882a593Smuzhiyun #define MACSTNADDR1_OCTET_5_SHIFT (31 - 15) /* Station 361*4882a593Smuzhiyun address 5th 362*4882a593Smuzhiyun octet << 363*4882a593Smuzhiyun shift */ 364*4882a593Smuzhiyun #define MACSTNADDR1_OCTET_4_SHIFT (31 - 23) /* Station 365*4882a593Smuzhiyun address 4th 366*4882a593Smuzhiyun octet << 367*4882a593Smuzhiyun shift */ 368*4882a593Smuzhiyun #define MACSTNADDR1_OCTET_3_SHIFT (31 - 31) /* Station 369*4882a593Smuzhiyun address 3rd 370*4882a593Smuzhiyun octet << 371*4882a593Smuzhiyun shift */ 372*4882a593Smuzhiyun 373*4882a593Smuzhiyun /* UCC GETH MACSTNADDR2 (Station Address Part 2 Register) */ 374*4882a593Smuzhiyun #define MACSTNADDR2_OCTET_2_SHIFT (31 - 7) /* Station 375*4882a593Smuzhiyun address 2nd 376*4882a593Smuzhiyun octet << 377*4882a593Smuzhiyun shift */ 378*4882a593Smuzhiyun #define MACSTNADDR2_OCTET_1_SHIFT (31 - 15) /* Station 379*4882a593Smuzhiyun address 1st 380*4882a593Smuzhiyun octet << 381*4882a593Smuzhiyun shift */ 382*4882a593Smuzhiyun 383*4882a593Smuzhiyun /* UCC GETH UEMPR (Ethernet Mac Parameter Register) */ 384*4882a593Smuzhiyun #define UEMPR_PAUSE_TIME_VALUE_SHIFT (31 - 15) /* Pause time 385*4882a593Smuzhiyun value << 386*4882a593Smuzhiyun shift */ 387*4882a593Smuzhiyun #define UEMPR_EXTENDED_PAUSE_TIME_VALUE_SHIFT (31 - 31) /* Extended 388*4882a593Smuzhiyun pause time 389*4882a593Smuzhiyun value << 390*4882a593Smuzhiyun shift */ 391*4882a593Smuzhiyun 392*4882a593Smuzhiyun /* UCC GETH UTBIPAR (Ten Bit Interface Physical Address Register) */ 393*4882a593Smuzhiyun #define UTBIPAR_PHY_ADDRESS_SHIFT (31 - 31) /* Phy address 394*4882a593Smuzhiyun << shift */ 395*4882a593Smuzhiyun #define UTBIPAR_PHY_ADDRESS_MASK 0x0000001f /* Phy address 396*4882a593Smuzhiyun mask */ 397*4882a593Smuzhiyun 398*4882a593Smuzhiyun /* UCC GETH UESCR (Ethernet Statistics Control Register) */ 399*4882a593Smuzhiyun #define UESCR_AUTOZ 0x8000 /* Automatically zero 400*4882a593Smuzhiyun addressed 401*4882a593Smuzhiyun statistical counter 402*4882a593Smuzhiyun values */ 403*4882a593Smuzhiyun #define UESCR_CLRCNT 0x4000 /* Clear all statistics 404*4882a593Smuzhiyun counters */ 405*4882a593Smuzhiyun #define UESCR_MAXCOV_SHIFT (15 - 7) /* Max 406*4882a593Smuzhiyun Coalescing 407*4882a593Smuzhiyun Value << 408*4882a593Smuzhiyun shift */ 409*4882a593Smuzhiyun #define UESCR_SCOV_SHIFT (15 - 15) /* Status 410*4882a593Smuzhiyun Coalescing 411*4882a593Smuzhiyun Value << 412*4882a593Smuzhiyun shift */ 413*4882a593Smuzhiyun 414*4882a593Smuzhiyun /* UCC GETH UDSR (Data Synchronization Register) */ 415*4882a593Smuzhiyun #define UDSR_MAGIC 0x067E 416*4882a593Smuzhiyun 417*4882a593Smuzhiyun struct ucc_geth_thread_data_tx { 418*4882a593Smuzhiyun u8 res0[104]; 419*4882a593Smuzhiyun } __packed; 420*4882a593Smuzhiyun 421*4882a593Smuzhiyun struct ucc_geth_thread_data_rx { 422*4882a593Smuzhiyun u8 res0[40]; 423*4882a593Smuzhiyun } __packed; 424*4882a593Smuzhiyun 425*4882a593Smuzhiyun /* Send Queue Queue-Descriptor */ 426*4882a593Smuzhiyun struct ucc_geth_send_queue_qd { 427*4882a593Smuzhiyun u32 bd_ring_base; /* pointer to BD ring base address */ 428*4882a593Smuzhiyun u8 res0[0x8]; 429*4882a593Smuzhiyun u32 last_bd_completed_address;/* initialize to last entry in BD ring */ 430*4882a593Smuzhiyun u8 res1[0x30]; 431*4882a593Smuzhiyun } __packed; 432*4882a593Smuzhiyun 433*4882a593Smuzhiyun struct ucc_geth_send_queue_mem_region { 434*4882a593Smuzhiyun struct ucc_geth_send_queue_qd sqqd[NUM_TX_QUEUES]; 435*4882a593Smuzhiyun } __packed; 436*4882a593Smuzhiyun 437*4882a593Smuzhiyun struct ucc_geth_thread_tx_pram { 438*4882a593Smuzhiyun u8 res0[64]; 439*4882a593Smuzhiyun } __packed; 440*4882a593Smuzhiyun 441*4882a593Smuzhiyun struct ucc_geth_thread_rx_pram { 442*4882a593Smuzhiyun u8 res0[128]; 443*4882a593Smuzhiyun } __packed; 444*4882a593Smuzhiyun 445*4882a593Smuzhiyun #define THREAD_RX_PRAM_ADDITIONAL_FOR_EXTENDED_FILTERING 64 446*4882a593Smuzhiyun #define THREAD_RX_PRAM_ADDITIONAL_FOR_EXTENDED_FILTERING_8 64 447*4882a593Smuzhiyun #define THREAD_RX_PRAM_ADDITIONAL_FOR_EXTENDED_FILTERING_16 96 448*4882a593Smuzhiyun 449*4882a593Smuzhiyun struct ucc_geth_scheduler { 450*4882a593Smuzhiyun u16 cpucount0; /* CPU packet counter */ 451*4882a593Smuzhiyun u16 cpucount1; /* CPU packet counter */ 452*4882a593Smuzhiyun u16 cecount0; /* QE packet counter */ 453*4882a593Smuzhiyun u16 cecount1; /* QE packet counter */ 454*4882a593Smuzhiyun u16 cpucount2; /* CPU packet counter */ 455*4882a593Smuzhiyun u16 cpucount3; /* CPU packet counter */ 456*4882a593Smuzhiyun u16 cecount2; /* QE packet counter */ 457*4882a593Smuzhiyun u16 cecount3; /* QE packet counter */ 458*4882a593Smuzhiyun u16 cpucount4; /* CPU packet counter */ 459*4882a593Smuzhiyun u16 cpucount5; /* CPU packet counter */ 460*4882a593Smuzhiyun u16 cecount4; /* QE packet counter */ 461*4882a593Smuzhiyun u16 cecount5; /* QE packet counter */ 462*4882a593Smuzhiyun u16 cpucount6; /* CPU packet counter */ 463*4882a593Smuzhiyun u16 cpucount7; /* CPU packet counter */ 464*4882a593Smuzhiyun u16 cecount6; /* QE packet counter */ 465*4882a593Smuzhiyun u16 cecount7; /* QE packet counter */ 466*4882a593Smuzhiyun u32 weightstatus[NUM_TX_QUEUES]; /* accumulated weight factor */ 467*4882a593Smuzhiyun u32 rtsrshadow; /* temporary variable handled by QE */ 468*4882a593Smuzhiyun u32 time; /* temporary variable handled by QE */ 469*4882a593Smuzhiyun u32 ttl; /* temporary variable handled by QE */ 470*4882a593Smuzhiyun u32 mblinterval; /* max burst length interval */ 471*4882a593Smuzhiyun u16 nortsrbytetime; /* normalized value of byte time in tsr units */ 472*4882a593Smuzhiyun u8 fracsiz; /* radix 2 log value of denom. of 473*4882a593Smuzhiyun NorTSRByteTime */ 474*4882a593Smuzhiyun u8 res0[1]; 475*4882a593Smuzhiyun u8 strictpriorityq; /* Strict Priority Mask register */ 476*4882a593Smuzhiyun u8 txasap; /* Transmit ASAP register */ 477*4882a593Smuzhiyun u8 extrabw; /* Extra BandWidth register */ 478*4882a593Smuzhiyun u8 oldwfqmask; /* temporary variable handled by QE */ 479*4882a593Smuzhiyun u8 weightfactor[NUM_TX_QUEUES]; 480*4882a593Smuzhiyun /**< weight factor for queues */ 481*4882a593Smuzhiyun u32 minw; /* temporary variable handled by QE */ 482*4882a593Smuzhiyun u8 res1[0x70 - 0x64]; 483*4882a593Smuzhiyun } __packed; 484*4882a593Smuzhiyun 485*4882a593Smuzhiyun struct ucc_geth_tx_firmware_statistics_pram { 486*4882a593Smuzhiyun u32 sicoltx; /* single collision */ 487*4882a593Smuzhiyun u32 mulcoltx; /* multiple collision */ 488*4882a593Smuzhiyun u32 latecoltxfr; /* late collision */ 489*4882a593Smuzhiyun u32 frabortduecol; /* frames aborted due to transmit collision */ 490*4882a593Smuzhiyun u32 frlostinmactxer; /* frames lost due to internal MAC error 491*4882a593Smuzhiyun transmission that are not counted on any 492*4882a593Smuzhiyun other counter */ 493*4882a593Smuzhiyun u32 carriersenseertx; /* carrier sense error */ 494*4882a593Smuzhiyun u32 frtxok; /* frames transmitted OK */ 495*4882a593Smuzhiyun u32 txfrexcessivedefer; /* frames with defferal time greater than 496*4882a593Smuzhiyun specified threshold */ 497*4882a593Smuzhiyun u32 txpkts256; /* total packets (including bad) between 256 498*4882a593Smuzhiyun and 511 octets */ 499*4882a593Smuzhiyun u32 txpkts512; /* total packets (including bad) between 512 500*4882a593Smuzhiyun and 1023 octets */ 501*4882a593Smuzhiyun u32 txpkts1024; /* total packets (including bad) between 1024 502*4882a593Smuzhiyun and 1518 octets */ 503*4882a593Smuzhiyun u32 txpktsjumbo; /* total packets (including bad) between 1024 504*4882a593Smuzhiyun and MAXLength octets */ 505*4882a593Smuzhiyun } __packed; 506*4882a593Smuzhiyun 507*4882a593Smuzhiyun struct ucc_geth_rx_firmware_statistics_pram { 508*4882a593Smuzhiyun u32 frrxfcser; /* frames with crc error */ 509*4882a593Smuzhiyun u32 fraligner; /* frames with alignment error */ 510*4882a593Smuzhiyun u32 inrangelenrxer; /* in range length error */ 511*4882a593Smuzhiyun u32 outrangelenrxer; /* out of range length error */ 512*4882a593Smuzhiyun u32 frtoolong; /* frame too long */ 513*4882a593Smuzhiyun u32 runt; /* runt */ 514*4882a593Smuzhiyun u32 verylongevent; /* very long event */ 515*4882a593Smuzhiyun u32 symbolerror; /* symbol error */ 516*4882a593Smuzhiyun u32 dropbsy; /* drop because of BD not ready */ 517*4882a593Smuzhiyun u8 res0[0x8]; 518*4882a593Smuzhiyun u32 mismatchdrop; /* drop because of MAC filtering (e.g. address 519*4882a593Smuzhiyun or type mismatch) */ 520*4882a593Smuzhiyun u32 underpkts; /* total frames less than 64 octets */ 521*4882a593Smuzhiyun u32 pkts256; /* total frames (including bad) between 256 and 522*4882a593Smuzhiyun 511 octets */ 523*4882a593Smuzhiyun u32 pkts512; /* total frames (including bad) between 512 and 524*4882a593Smuzhiyun 1023 octets */ 525*4882a593Smuzhiyun u32 pkts1024; /* total frames (including bad) between 1024 526*4882a593Smuzhiyun and 1518 octets */ 527*4882a593Smuzhiyun u32 pktsjumbo; /* total frames (including bad) between 1024 528*4882a593Smuzhiyun and MAXLength octets */ 529*4882a593Smuzhiyun u32 frlossinmacer; /* frames lost because of internal MAC error 530*4882a593Smuzhiyun that is not counted in any other counter */ 531*4882a593Smuzhiyun u32 pausefr; /* pause frames */ 532*4882a593Smuzhiyun u8 res1[0x4]; 533*4882a593Smuzhiyun u32 removevlan; /* total frames that had their VLAN tag removed 534*4882a593Smuzhiyun */ 535*4882a593Smuzhiyun u32 replacevlan; /* total frames that had their VLAN tag 536*4882a593Smuzhiyun replaced */ 537*4882a593Smuzhiyun u32 insertvlan; /* total frames that had their VLAN tag 538*4882a593Smuzhiyun inserted */ 539*4882a593Smuzhiyun } __packed; 540*4882a593Smuzhiyun 541*4882a593Smuzhiyun struct ucc_geth_rx_interrupt_coalescing_entry { 542*4882a593Smuzhiyun u32 interruptcoalescingmaxvalue; /* interrupt coalescing max 543*4882a593Smuzhiyun value */ 544*4882a593Smuzhiyun u32 interruptcoalescingcounter; /* interrupt coalescing counter, 545*4882a593Smuzhiyun initialize to 546*4882a593Smuzhiyun interruptcoalescingmaxvalue */ 547*4882a593Smuzhiyun } __packed; 548*4882a593Smuzhiyun 549*4882a593Smuzhiyun struct ucc_geth_rx_interrupt_coalescing_table { 550*4882a593Smuzhiyun struct ucc_geth_rx_interrupt_coalescing_entry coalescingentry[NUM_RX_QUEUES]; 551*4882a593Smuzhiyun /**< interrupt coalescing entry */ 552*4882a593Smuzhiyun } __packed; 553*4882a593Smuzhiyun 554*4882a593Smuzhiyun struct ucc_geth_rx_prefetched_bds { 555*4882a593Smuzhiyun struct qe_bd bd[NUM_BDS_IN_PREFETCHED_BDS]; /* prefetched bd */ 556*4882a593Smuzhiyun } __packed; 557*4882a593Smuzhiyun 558*4882a593Smuzhiyun struct ucc_geth_rx_bd_queues_entry { 559*4882a593Smuzhiyun u32 bdbaseptr; /* BD base pointer */ 560*4882a593Smuzhiyun u32 bdptr; /* BD pointer */ 561*4882a593Smuzhiyun u32 externalbdbaseptr; /* external BD base pointer */ 562*4882a593Smuzhiyun u32 externalbdptr; /* external BD pointer */ 563*4882a593Smuzhiyun } __packed; 564*4882a593Smuzhiyun 565*4882a593Smuzhiyun struct ucc_geth_tx_global_pram { 566*4882a593Smuzhiyun u16 temoder; 567*4882a593Smuzhiyun u8 res0[0x38 - 0x02]; 568*4882a593Smuzhiyun u32 sqptr; /* a base pointer to send queue memory region */ 569*4882a593Smuzhiyun u32 schedulerbasepointer; /* a base pointer to scheduler memory 570*4882a593Smuzhiyun region */ 571*4882a593Smuzhiyun u32 txrmonbaseptr; /* base pointer to Tx RMON statistics counter */ 572*4882a593Smuzhiyun u32 tstate; /* tx internal state. High byte contains 573*4882a593Smuzhiyun function code */ 574*4882a593Smuzhiyun u8 iphoffset[TX_IP_OFFSET_ENTRY_MAX]; 575*4882a593Smuzhiyun u32 vtagtable[0x8]; /* 8 4-byte VLAN tags */ 576*4882a593Smuzhiyun u32 tqptr; /* a base pointer to the Tx Queues Memory 577*4882a593Smuzhiyun Region */ 578*4882a593Smuzhiyun u8 res2[0x78 - 0x74]; 579*4882a593Smuzhiyun u64 snums_en; 580*4882a593Smuzhiyun u32 l2l3baseptr; /* top byte consists of a few other bit fields */ 581*4882a593Smuzhiyun 582*4882a593Smuzhiyun u16 mtu[8]; 583*4882a593Smuzhiyun u8 res3[0xa8 - 0x94]; 584*4882a593Smuzhiyun u32 wrrtablebase; /* top byte is reserved */ 585*4882a593Smuzhiyun u8 res4[0xc0 - 0xac]; 586*4882a593Smuzhiyun } __packed; 587*4882a593Smuzhiyun 588*4882a593Smuzhiyun /* structure representing Extended Filtering Global Parameters in PRAM */ 589*4882a593Smuzhiyun struct ucc_geth_exf_global_pram { 590*4882a593Smuzhiyun u32 l2pcdptr; /* individual address filter, high */ 591*4882a593Smuzhiyun u8 res0[0x10 - 0x04]; 592*4882a593Smuzhiyun } __packed; 593*4882a593Smuzhiyun 594*4882a593Smuzhiyun struct ucc_geth_rx_global_pram { 595*4882a593Smuzhiyun u32 remoder; /* ethernet mode reg. */ 596*4882a593Smuzhiyun u32 rqptr; /* base pointer to the Rx Queues Memory Region*/ 597*4882a593Smuzhiyun u32 res0[0x1]; 598*4882a593Smuzhiyun u8 res1[0x20 - 0xC]; 599*4882a593Smuzhiyun u16 typeorlen; /* cutoff point less than which, type/len field 600*4882a593Smuzhiyun is considered length */ 601*4882a593Smuzhiyun u8 res2[0x1]; 602*4882a593Smuzhiyun u8 rxgstpack; /* acknowledgement on GRACEFUL STOP RX command*/ 603*4882a593Smuzhiyun u32 rxrmonbaseptr; /* base pointer to Rx RMON statistics counter */ 604*4882a593Smuzhiyun u8 res3[0x30 - 0x28]; 605*4882a593Smuzhiyun u32 intcoalescingptr; /* Interrupt coalescing table pointer */ 606*4882a593Smuzhiyun u8 res4[0x36 - 0x34]; 607*4882a593Smuzhiyun u8 rstate; /* rx internal state. High byte contains 608*4882a593Smuzhiyun function code */ 609*4882a593Smuzhiyun u8 res5[0x46 - 0x37]; 610*4882a593Smuzhiyun u16 mrblr; /* max receive buffer length reg. */ 611*4882a593Smuzhiyun u32 rbdqptr; /* base pointer to RxBD parameter table 612*4882a593Smuzhiyun description */ 613*4882a593Smuzhiyun u16 mflr; /* max frame length reg. */ 614*4882a593Smuzhiyun u16 minflr; /* min frame length reg. */ 615*4882a593Smuzhiyun u16 maxd1; /* max dma1 length reg. */ 616*4882a593Smuzhiyun u16 maxd2; /* max dma2 length reg. */ 617*4882a593Smuzhiyun u32 ecamptr; /* external CAM address */ 618*4882a593Smuzhiyun u32 l2qt; /* VLAN priority mapping table. */ 619*4882a593Smuzhiyun u32 l3qt[0x8]; /* IP priority mapping table. */ 620*4882a593Smuzhiyun u16 vlantype; /* vlan type */ 621*4882a593Smuzhiyun u16 vlantci; /* default vlan tci */ 622*4882a593Smuzhiyun u8 addressfiltering[64]; /* address filtering data structure */ 623*4882a593Smuzhiyun u32 exfGlobalParam; /* base address for extended filtering global 624*4882a593Smuzhiyun parameters */ 625*4882a593Smuzhiyun u8 res6[0x100 - 0xC4]; /* Initialize to zero */ 626*4882a593Smuzhiyun } __packed; 627*4882a593Smuzhiyun 628*4882a593Smuzhiyun #define GRACEFUL_STOP_ACKNOWLEDGE_RX 0x01 629*4882a593Smuzhiyun 630*4882a593Smuzhiyun /* structure representing InitEnet command */ 631*4882a593Smuzhiyun struct ucc_geth_init_pram { 632*4882a593Smuzhiyun u8 resinit1; 633*4882a593Smuzhiyun u8 resinit2; 634*4882a593Smuzhiyun u8 resinit3; 635*4882a593Smuzhiyun u8 resinit4; 636*4882a593Smuzhiyun u16 resinit5; 637*4882a593Smuzhiyun u8 res1[0x1]; 638*4882a593Smuzhiyun u8 largestexternallookupkeysize; 639*4882a593Smuzhiyun u32 rgftgfrxglobal; 640*4882a593Smuzhiyun u32 rxthread[ENET_INIT_PARAM_MAX_ENTRIES_RX]; /* rx threads */ 641*4882a593Smuzhiyun u8 res2[0x38 - 0x30]; 642*4882a593Smuzhiyun u32 txglobal; /* tx global */ 643*4882a593Smuzhiyun u32 txthread[ENET_INIT_PARAM_MAX_ENTRIES_TX]; /* tx threads */ 644*4882a593Smuzhiyun u8 res3[0x1]; 645*4882a593Smuzhiyun } __packed; 646*4882a593Smuzhiyun 647*4882a593Smuzhiyun #define ENET_INIT_PARAM_RGF_SHIFT (32 - 4) 648*4882a593Smuzhiyun #define ENET_INIT_PARAM_TGF_SHIFT (32 - 8) 649*4882a593Smuzhiyun 650*4882a593Smuzhiyun #define ENET_INIT_PARAM_RISC_MASK 0x0000003f 651*4882a593Smuzhiyun #define ENET_INIT_PARAM_PTR_MASK 0x00ffffc0 652*4882a593Smuzhiyun #define ENET_INIT_PARAM_SNUM_MASK 0xff000000 653*4882a593Smuzhiyun #define ENET_INIT_PARAM_SNUM_SHIFT 24 654*4882a593Smuzhiyun 655*4882a593Smuzhiyun #define ENET_INIT_PARAM_MAGIC_RES_INIT1 0x06 656*4882a593Smuzhiyun #define ENET_INIT_PARAM_MAGIC_RES_INIT2 0x30 657*4882a593Smuzhiyun #define ENET_INIT_PARAM_MAGIC_RES_INIT3 0xff 658*4882a593Smuzhiyun #define ENET_INIT_PARAM_MAGIC_RES_INIT4 0x00 659*4882a593Smuzhiyun #define ENET_INIT_PARAM_MAGIC_RES_INIT5 0x0400 660*4882a593Smuzhiyun 661*4882a593Smuzhiyun /* structure representing 82xx Address Filtering Enet Address in PRAM */ 662*4882a593Smuzhiyun struct ucc_geth_82xx_enet_address { 663*4882a593Smuzhiyun u8 res1[0x2]; 664*4882a593Smuzhiyun u16 h; /* address (MSB) */ 665*4882a593Smuzhiyun u16 m; /* address */ 666*4882a593Smuzhiyun u16 l; /* address (LSB) */ 667*4882a593Smuzhiyun } __packed; 668*4882a593Smuzhiyun 669*4882a593Smuzhiyun /* structure representing 82xx Address Filtering PRAM */ 670*4882a593Smuzhiyun struct ucc_geth_82xx_address_filtering_pram { 671*4882a593Smuzhiyun u32 iaddr_h; /* individual address filter, high */ 672*4882a593Smuzhiyun u32 iaddr_l; /* individual address filter, low */ 673*4882a593Smuzhiyun u32 gaddr_h; /* group address filter, high */ 674*4882a593Smuzhiyun u32 gaddr_l; /* group address filter, low */ 675*4882a593Smuzhiyun struct ucc_geth_82xx_enet_address __iomem taddr; 676*4882a593Smuzhiyun struct ucc_geth_82xx_enet_address __iomem paddr[NUM_OF_PADDRS]; 677*4882a593Smuzhiyun u8 res0[0x40 - 0x38]; 678*4882a593Smuzhiyun } __packed; 679*4882a593Smuzhiyun 680*4882a593Smuzhiyun /* GETH Tx firmware statistics structure, used when calling 681*4882a593Smuzhiyun UCC_GETH_GetStatistics. */ 682*4882a593Smuzhiyun struct ucc_geth_tx_firmware_statistics { 683*4882a593Smuzhiyun u32 sicoltx; /* single collision */ 684*4882a593Smuzhiyun u32 mulcoltx; /* multiple collision */ 685*4882a593Smuzhiyun u32 latecoltxfr; /* late collision */ 686*4882a593Smuzhiyun u32 frabortduecol; /* frames aborted due to transmit collision */ 687*4882a593Smuzhiyun u32 frlostinmactxer; /* frames lost due to internal MAC error 688*4882a593Smuzhiyun transmission that are not counted on any 689*4882a593Smuzhiyun other counter */ 690*4882a593Smuzhiyun u32 carriersenseertx; /* carrier sense error */ 691*4882a593Smuzhiyun u32 frtxok; /* frames transmitted OK */ 692*4882a593Smuzhiyun u32 txfrexcessivedefer; /* frames with defferal time greater than 693*4882a593Smuzhiyun specified threshold */ 694*4882a593Smuzhiyun u32 txpkts256; /* total packets (including bad) between 256 695*4882a593Smuzhiyun and 511 octets */ 696*4882a593Smuzhiyun u32 txpkts512; /* total packets (including bad) between 512 697*4882a593Smuzhiyun and 1023 octets */ 698*4882a593Smuzhiyun u32 txpkts1024; /* total packets (including bad) between 1024 699*4882a593Smuzhiyun and 1518 octets */ 700*4882a593Smuzhiyun u32 txpktsjumbo; /* total packets (including bad) between 1024 701*4882a593Smuzhiyun and MAXLength octets */ 702*4882a593Smuzhiyun } __packed; 703*4882a593Smuzhiyun 704*4882a593Smuzhiyun /* GETH Rx firmware statistics structure, used when calling 705*4882a593Smuzhiyun UCC_GETH_GetStatistics. */ 706*4882a593Smuzhiyun struct ucc_geth_rx_firmware_statistics { 707*4882a593Smuzhiyun u32 frrxfcser; /* frames with crc error */ 708*4882a593Smuzhiyun u32 fraligner; /* frames with alignment error */ 709*4882a593Smuzhiyun u32 inrangelenrxer; /* in range length error */ 710*4882a593Smuzhiyun u32 outrangelenrxer; /* out of range length error */ 711*4882a593Smuzhiyun u32 frtoolong; /* frame too long */ 712*4882a593Smuzhiyun u32 runt; /* runt */ 713*4882a593Smuzhiyun u32 verylongevent; /* very long event */ 714*4882a593Smuzhiyun u32 symbolerror; /* symbol error */ 715*4882a593Smuzhiyun u32 dropbsy; /* drop because of BD not ready */ 716*4882a593Smuzhiyun u8 res0[0x8]; 717*4882a593Smuzhiyun u32 mismatchdrop; /* drop because of MAC filtering (e.g. address 718*4882a593Smuzhiyun or type mismatch) */ 719*4882a593Smuzhiyun u32 underpkts; /* total frames less than 64 octets */ 720*4882a593Smuzhiyun u32 pkts256; /* total frames (including bad) between 256 and 721*4882a593Smuzhiyun 511 octets */ 722*4882a593Smuzhiyun u32 pkts512; /* total frames (including bad) between 512 and 723*4882a593Smuzhiyun 1023 octets */ 724*4882a593Smuzhiyun u32 pkts1024; /* total frames (including bad) between 1024 725*4882a593Smuzhiyun and 1518 octets */ 726*4882a593Smuzhiyun u32 pktsjumbo; /* total frames (including bad) between 1024 727*4882a593Smuzhiyun and MAXLength octets */ 728*4882a593Smuzhiyun u32 frlossinmacer; /* frames lost because of internal MAC error 729*4882a593Smuzhiyun that is not counted in any other counter */ 730*4882a593Smuzhiyun u32 pausefr; /* pause frames */ 731*4882a593Smuzhiyun u8 res1[0x4]; 732*4882a593Smuzhiyun u32 removevlan; /* total frames that had their VLAN tag removed 733*4882a593Smuzhiyun */ 734*4882a593Smuzhiyun u32 replacevlan; /* total frames that had their VLAN tag 735*4882a593Smuzhiyun replaced */ 736*4882a593Smuzhiyun u32 insertvlan; /* total frames that had their VLAN tag 737*4882a593Smuzhiyun inserted */ 738*4882a593Smuzhiyun } __packed; 739*4882a593Smuzhiyun 740*4882a593Smuzhiyun /* GETH hardware statistics structure, used when calling 741*4882a593Smuzhiyun UCC_GETH_GetStatistics. */ 742*4882a593Smuzhiyun struct ucc_geth_hardware_statistics { 743*4882a593Smuzhiyun u32 tx64; /* Total number of frames (including bad 744*4882a593Smuzhiyun frames) transmitted that were exactly of the 745*4882a593Smuzhiyun minimal length (64 for un tagged, 68 for 746*4882a593Smuzhiyun tagged, or with length exactly equal to the 747*4882a593Smuzhiyun parameter MINLength */ 748*4882a593Smuzhiyun u32 tx127; /* Total number of frames (including bad 749*4882a593Smuzhiyun frames) transmitted that were between 750*4882a593Smuzhiyun MINLength (Including FCS length==4) and 127 751*4882a593Smuzhiyun octets */ 752*4882a593Smuzhiyun u32 tx255; /* Total number of frames (including bad 753*4882a593Smuzhiyun frames) transmitted that were between 128 754*4882a593Smuzhiyun (Including FCS length==4) and 255 octets */ 755*4882a593Smuzhiyun u32 rx64; /* Total number of frames received including 756*4882a593Smuzhiyun bad frames that were exactly of the mninimal 757*4882a593Smuzhiyun length (64 bytes) */ 758*4882a593Smuzhiyun u32 rx127; /* Total number of frames (including bad 759*4882a593Smuzhiyun frames) received that were between MINLength 760*4882a593Smuzhiyun (Including FCS length==4) and 127 octets */ 761*4882a593Smuzhiyun u32 rx255; /* Total number of frames (including bad 762*4882a593Smuzhiyun frames) received that were between 128 763*4882a593Smuzhiyun (Including FCS length==4) and 255 octets */ 764*4882a593Smuzhiyun u32 txok; /* Total number of octets residing in frames 765*4882a593Smuzhiyun that where involved in successful 766*4882a593Smuzhiyun transmission */ 767*4882a593Smuzhiyun u16 txcf; /* Total number of PAUSE control frames 768*4882a593Smuzhiyun transmitted by this MAC */ 769*4882a593Smuzhiyun u32 tmca; /* Total number of frames that were transmitted 770*4882a593Smuzhiyun successfully with the group address bit set 771*4882a593Smuzhiyun that are not broadcast frames */ 772*4882a593Smuzhiyun u32 tbca; /* Total number of frames transmitted 773*4882a593Smuzhiyun successfully that had destination address 774*4882a593Smuzhiyun field equal to the broadcast address */ 775*4882a593Smuzhiyun u32 rxfok; /* Total number of frames received OK */ 776*4882a593Smuzhiyun u32 rxbok; /* Total number of octets received OK */ 777*4882a593Smuzhiyun u32 rbyt; /* Total number of octets received including 778*4882a593Smuzhiyun octets in bad frames. Must be implemented in 779*4882a593Smuzhiyun HW because it includes octets in frames that 780*4882a593Smuzhiyun never even reach the UCC */ 781*4882a593Smuzhiyun u32 rmca; /* Total number of frames that were received 782*4882a593Smuzhiyun successfully with the group address bit set 783*4882a593Smuzhiyun that are not broadcast frames */ 784*4882a593Smuzhiyun u32 rbca; /* Total number of frames received successfully 785*4882a593Smuzhiyun that had destination address equal to the 786*4882a593Smuzhiyun broadcast address */ 787*4882a593Smuzhiyun } __packed; 788*4882a593Smuzhiyun 789*4882a593Smuzhiyun /* UCC GETH Tx errors returned via TxConf callback */ 790*4882a593Smuzhiyun #define TX_ERRORS_DEF 0x0200 791*4882a593Smuzhiyun #define TX_ERRORS_EXDEF 0x0100 792*4882a593Smuzhiyun #define TX_ERRORS_LC 0x0080 793*4882a593Smuzhiyun #define TX_ERRORS_RL 0x0040 794*4882a593Smuzhiyun #define TX_ERRORS_RC_MASK 0x003C 795*4882a593Smuzhiyun #define TX_ERRORS_RC_SHIFT 2 796*4882a593Smuzhiyun #define TX_ERRORS_UN 0x0002 797*4882a593Smuzhiyun #define TX_ERRORS_CSL 0x0001 798*4882a593Smuzhiyun 799*4882a593Smuzhiyun /* UCC GETH Rx errors returned via RxStore callback */ 800*4882a593Smuzhiyun #define RX_ERRORS_CMR 0x0200 801*4882a593Smuzhiyun #define RX_ERRORS_M 0x0100 802*4882a593Smuzhiyun #define RX_ERRORS_BC 0x0080 803*4882a593Smuzhiyun #define RX_ERRORS_MC 0x0040 804*4882a593Smuzhiyun 805*4882a593Smuzhiyun /* Transmit BD. These are in addition to values defined in uccf. */ 806*4882a593Smuzhiyun #define T_VID 0x003c0000 /* insert VLAN id index mask. */ 807*4882a593Smuzhiyun #define T_DEF (((u32) TX_ERRORS_DEF ) << 16) 808*4882a593Smuzhiyun #define T_EXDEF (((u32) TX_ERRORS_EXDEF ) << 16) 809*4882a593Smuzhiyun #define T_LC (((u32) TX_ERRORS_LC ) << 16) 810*4882a593Smuzhiyun #define T_RL (((u32) TX_ERRORS_RL ) << 16) 811*4882a593Smuzhiyun #define T_RC_MASK (((u32) TX_ERRORS_RC_MASK ) << 16) 812*4882a593Smuzhiyun #define T_UN (((u32) TX_ERRORS_UN ) << 16) 813*4882a593Smuzhiyun #define T_CSL (((u32) TX_ERRORS_CSL ) << 16) 814*4882a593Smuzhiyun #define T_ERRORS_REPORT (T_DEF | T_EXDEF | T_LC | T_RL | T_RC_MASK \ 815*4882a593Smuzhiyun | T_UN | T_CSL) /* transmit errors to report */ 816*4882a593Smuzhiyun 817*4882a593Smuzhiyun /* Receive BD. These are in addition to values defined in uccf. */ 818*4882a593Smuzhiyun #define R_LG 0x00200000 /* Frame length violation. */ 819*4882a593Smuzhiyun #define R_NO 0x00100000 /* Non-octet aligned frame. */ 820*4882a593Smuzhiyun #define R_SH 0x00080000 /* Short frame. */ 821*4882a593Smuzhiyun #define R_CR 0x00040000 /* CRC error. */ 822*4882a593Smuzhiyun #define R_OV 0x00020000 /* Overrun. */ 823*4882a593Smuzhiyun #define R_IPCH 0x00010000 /* IP checksum check failed. */ 824*4882a593Smuzhiyun #define R_CMR (((u32) RX_ERRORS_CMR ) << 16) 825*4882a593Smuzhiyun #define R_M (((u32) RX_ERRORS_M ) << 16) 826*4882a593Smuzhiyun #define R_BC (((u32) RX_ERRORS_BC ) << 16) 827*4882a593Smuzhiyun #define R_MC (((u32) RX_ERRORS_MC ) << 16) 828*4882a593Smuzhiyun #define R_ERRORS_REPORT (R_CMR | R_M | R_BC | R_MC) /* receive errors to 829*4882a593Smuzhiyun report */ 830*4882a593Smuzhiyun #define R_ERRORS_FATAL (R_LG | R_NO | R_SH | R_CR | \ 831*4882a593Smuzhiyun R_OV | R_IPCH) /* receive errors to discard */ 832*4882a593Smuzhiyun 833*4882a593Smuzhiyun /* Alignments */ 834*4882a593Smuzhiyun #define UCC_GETH_RX_GLOBAL_PRAM_ALIGNMENT 256 835*4882a593Smuzhiyun #define UCC_GETH_TX_GLOBAL_PRAM_ALIGNMENT 128 836*4882a593Smuzhiyun #define UCC_GETH_THREAD_RX_PRAM_ALIGNMENT 128 837*4882a593Smuzhiyun #define UCC_GETH_THREAD_TX_PRAM_ALIGNMENT 64 838*4882a593Smuzhiyun #define UCC_GETH_THREAD_DATA_ALIGNMENT 256 /* spec gives values 839*4882a593Smuzhiyun based on num of 840*4882a593Smuzhiyun threads, but always 841*4882a593Smuzhiyun using the maximum is 842*4882a593Smuzhiyun easier */ 843*4882a593Smuzhiyun #define UCC_GETH_SEND_QUEUE_QUEUE_DESCRIPTOR_ALIGNMENT 32 844*4882a593Smuzhiyun #define UCC_GETH_SCHEDULER_ALIGNMENT 8 /* This is a guess */ 845*4882a593Smuzhiyun #define UCC_GETH_TX_STATISTICS_ALIGNMENT 4 /* This is a guess */ 846*4882a593Smuzhiyun #define UCC_GETH_RX_STATISTICS_ALIGNMENT 4 /* This is a guess */ 847*4882a593Smuzhiyun #define UCC_GETH_RX_INTERRUPT_COALESCING_ALIGNMENT 64 848*4882a593Smuzhiyun #define UCC_GETH_RX_BD_QUEUES_ALIGNMENT 8 /* This is a guess */ 849*4882a593Smuzhiyun #define UCC_GETH_RX_PREFETCHED_BDS_ALIGNMENT 128 /* This is a guess */ 850*4882a593Smuzhiyun #define UCC_GETH_RX_EXTENDED_FILTERING_GLOBAL_PARAMETERS_ALIGNMENT 8 /* This 851*4882a593Smuzhiyun is a 852*4882a593Smuzhiyun guess 853*4882a593Smuzhiyun */ 854*4882a593Smuzhiyun #define UCC_GETH_RX_BD_RING_ALIGNMENT 32 855*4882a593Smuzhiyun #define UCC_GETH_TX_BD_RING_ALIGNMENT 32 856*4882a593Smuzhiyun #define UCC_GETH_MRBLR_ALIGNMENT 128 857*4882a593Smuzhiyun #define UCC_GETH_RX_BD_RING_SIZE_ALIGNMENT 4 858*4882a593Smuzhiyun #define UCC_GETH_TX_BD_RING_SIZE_MEMORY_ALIGNMENT 32 859*4882a593Smuzhiyun #define UCC_GETH_RX_DATA_BUF_ALIGNMENT 64 860*4882a593Smuzhiyun 861*4882a593Smuzhiyun #define UCC_GETH_TAD_EF 0x80 862*4882a593Smuzhiyun #define UCC_GETH_TAD_V 0x40 863*4882a593Smuzhiyun #define UCC_GETH_TAD_REJ 0x20 864*4882a593Smuzhiyun #define UCC_GETH_TAD_VTAG_OP_RIGHT_SHIFT 2 865*4882a593Smuzhiyun #define UCC_GETH_TAD_VTAG_OP_SHIFT 6 866*4882a593Smuzhiyun #define UCC_GETH_TAD_V_NON_VTAG_OP 0x20 867*4882a593Smuzhiyun #define UCC_GETH_TAD_RQOS_SHIFT 0 868*4882a593Smuzhiyun #define UCC_GETH_TAD_V_PRIORITY_SHIFT 5 869*4882a593Smuzhiyun #define UCC_GETH_TAD_CFI 0x10 870*4882a593Smuzhiyun 871*4882a593Smuzhiyun #define UCC_GETH_VLAN_PRIORITY_MAX 8 872*4882a593Smuzhiyun #define UCC_GETH_IP_PRIORITY_MAX 64 873*4882a593Smuzhiyun #define UCC_GETH_TX_VTAG_TABLE_ENTRY_MAX 8 874*4882a593Smuzhiyun #define UCC_GETH_RX_BD_RING_SIZE_MIN 8 875*4882a593Smuzhiyun #define UCC_GETH_TX_BD_RING_SIZE_MIN 2 876*4882a593Smuzhiyun #define UCC_GETH_BD_RING_SIZE_MAX 0xffff 877*4882a593Smuzhiyun 878*4882a593Smuzhiyun #define UCC_GETH_SIZE_OF_BD QE_SIZEOF_BD 879*4882a593Smuzhiyun 880*4882a593Smuzhiyun /* Driver definitions */ 881*4882a593Smuzhiyun #define TX_BD_RING_LEN 0x10 882*4882a593Smuzhiyun #define RX_BD_RING_LEN 0x20 883*4882a593Smuzhiyun 884*4882a593Smuzhiyun #define TX_RING_MOD_MASK(size) (size-1) 885*4882a593Smuzhiyun #define RX_RING_MOD_MASK(size) (size-1) 886*4882a593Smuzhiyun 887*4882a593Smuzhiyun #define ENET_GROUP_ADDR 0x01 /* Group address mask 888*4882a593Smuzhiyun for ethernet 889*4882a593Smuzhiyun addresses */ 890*4882a593Smuzhiyun 891*4882a593Smuzhiyun #define TX_TIMEOUT (1*HZ) 892*4882a593Smuzhiyun #define SKB_ALLOC_TIMEOUT 100000 893*4882a593Smuzhiyun #define PHY_INIT_TIMEOUT 100000 894*4882a593Smuzhiyun #define PHY_CHANGE_TIME 2 895*4882a593Smuzhiyun 896*4882a593Smuzhiyun /* Fast Ethernet (10/100 Mbps) */ 897*4882a593Smuzhiyun #define UCC_GETH_URFS_INIT 512 /* Rx virtual FIFO size 898*4882a593Smuzhiyun */ 899*4882a593Smuzhiyun #define UCC_GETH_URFET_INIT 256 /* 1/2 urfs */ 900*4882a593Smuzhiyun #define UCC_GETH_URFSET_INIT 384 /* 3/4 urfs */ 901*4882a593Smuzhiyun #define UCC_GETH_UTFS_INIT 512 /* Tx virtual FIFO size 902*4882a593Smuzhiyun */ 903*4882a593Smuzhiyun #define UCC_GETH_UTFET_INIT 256 /* 1/2 utfs */ 904*4882a593Smuzhiyun #define UCC_GETH_UTFTT_INIT 256 /* 1/2 utfs 905*4882a593Smuzhiyun due to errata */ 906*4882a593Smuzhiyun /* Gigabit Ethernet (1000 Mbps) */ 907*4882a593Smuzhiyun #define UCC_GETH_URFS_GIGA_INIT 4096/*2048*/ /* Rx virtual 908*4882a593Smuzhiyun FIFO size */ 909*4882a593Smuzhiyun #define UCC_GETH_URFET_GIGA_INIT 2048/*1024*/ /* 1/2 urfs */ 910*4882a593Smuzhiyun #define UCC_GETH_URFSET_GIGA_INIT 3072/*1536*/ /* 3/4 urfs */ 911*4882a593Smuzhiyun #define UCC_GETH_UTFS_GIGA_INIT 4096/*2048*/ /* Tx virtual 912*4882a593Smuzhiyun FIFO size */ 913*4882a593Smuzhiyun #define UCC_GETH_UTFET_GIGA_INIT 2048/*1024*/ /* 1/2 utfs */ 914*4882a593Smuzhiyun #define UCC_GETH_UTFTT_GIGA_INIT 4096/*0x40*/ /* Tx virtual 915*4882a593Smuzhiyun FIFO size */ 916*4882a593Smuzhiyun 917*4882a593Smuzhiyun #define UCC_GETH_REMODER_INIT 0 /* bits that must be 918*4882a593Smuzhiyun set */ 919*4882a593Smuzhiyun #define UCC_GETH_TEMODER_INIT 0xC000 /* bits that must */ 920*4882a593Smuzhiyun 921*4882a593Smuzhiyun /* Initial value for UPSMR */ 922*4882a593Smuzhiyun #define UCC_GETH_UPSMR_INIT UCC_GETH_UPSMR_RES1 923*4882a593Smuzhiyun 924*4882a593Smuzhiyun #define UCC_GETH_MACCFG1_INIT 0 925*4882a593Smuzhiyun #define UCC_GETH_MACCFG2_INIT (MACCFG2_RESERVED_1) 926*4882a593Smuzhiyun 927*4882a593Smuzhiyun /* Ethernet Address Type. */ 928*4882a593Smuzhiyun enum enet_addr_type { 929*4882a593Smuzhiyun ENET_ADDR_TYPE_INDIVIDUAL, 930*4882a593Smuzhiyun ENET_ADDR_TYPE_GROUP, 931*4882a593Smuzhiyun ENET_ADDR_TYPE_BROADCAST 932*4882a593Smuzhiyun }; 933*4882a593Smuzhiyun 934*4882a593Smuzhiyun /* UCC GETH 82xx Ethernet Address Recognition Location */ 935*4882a593Smuzhiyun enum ucc_geth_enet_address_recognition_location { 936*4882a593Smuzhiyun UCC_GETH_ENET_ADDRESS_RECOGNITION_LOCATION_STATION_ADDRESS,/* station 937*4882a593Smuzhiyun address */ 938*4882a593Smuzhiyun UCC_GETH_ENET_ADDRESS_RECOGNITION_LOCATION_PADDR_FIRST, /* additional 939*4882a593Smuzhiyun station 940*4882a593Smuzhiyun address 941*4882a593Smuzhiyun paddr1 */ 942*4882a593Smuzhiyun UCC_GETH_ENET_ADDRESS_RECOGNITION_LOCATION_PADDR2, /* additional 943*4882a593Smuzhiyun station 944*4882a593Smuzhiyun address 945*4882a593Smuzhiyun paddr2 */ 946*4882a593Smuzhiyun UCC_GETH_ENET_ADDRESS_RECOGNITION_LOCATION_PADDR3, /* additional 947*4882a593Smuzhiyun station 948*4882a593Smuzhiyun address 949*4882a593Smuzhiyun paddr3 */ 950*4882a593Smuzhiyun UCC_GETH_ENET_ADDRESS_RECOGNITION_LOCATION_PADDR_LAST, /* additional 951*4882a593Smuzhiyun station 952*4882a593Smuzhiyun address 953*4882a593Smuzhiyun paddr4 */ 954*4882a593Smuzhiyun UCC_GETH_ENET_ADDRESS_RECOGNITION_LOCATION_GROUP_HASH, /* group hash */ 955*4882a593Smuzhiyun UCC_GETH_ENET_ADDRESS_RECOGNITION_LOCATION_INDIVIDUAL_HASH /* individual 956*4882a593Smuzhiyun hash */ 957*4882a593Smuzhiyun }; 958*4882a593Smuzhiyun 959*4882a593Smuzhiyun /* UCC GETH vlan operation tagged */ 960*4882a593Smuzhiyun enum ucc_geth_vlan_operation_tagged { 961*4882a593Smuzhiyun UCC_GETH_VLAN_OPERATION_TAGGED_NOP = 0x0, /* Tagged - nop */ 962*4882a593Smuzhiyun UCC_GETH_VLAN_OPERATION_TAGGED_REPLACE_VID_PORTION_OF_Q_TAG 963*4882a593Smuzhiyun = 0x1, /* Tagged - replace vid portion of q tag */ 964*4882a593Smuzhiyun UCC_GETH_VLAN_OPERATION_TAGGED_IF_VID0_REPLACE_VID_WITH_DEFAULT_VALUE 965*4882a593Smuzhiyun = 0x2, /* Tagged - if vid0 replace vid with default value */ 966*4882a593Smuzhiyun UCC_GETH_VLAN_OPERATION_TAGGED_EXTRACT_Q_TAG_FROM_FRAME 967*4882a593Smuzhiyun = 0x3 /* Tagged - extract q tag from frame */ 968*4882a593Smuzhiyun }; 969*4882a593Smuzhiyun 970*4882a593Smuzhiyun /* UCC GETH vlan operation non-tagged */ 971*4882a593Smuzhiyun enum ucc_geth_vlan_operation_non_tagged { 972*4882a593Smuzhiyun UCC_GETH_VLAN_OPERATION_NON_TAGGED_NOP = 0x0, /* Non tagged - nop */ 973*4882a593Smuzhiyun UCC_GETH_VLAN_OPERATION_NON_TAGGED_Q_TAG_INSERT = 0x1 /* Non tagged - 974*4882a593Smuzhiyun q tag insert 975*4882a593Smuzhiyun */ 976*4882a593Smuzhiyun }; 977*4882a593Smuzhiyun 978*4882a593Smuzhiyun /* UCC GETH Rx Quality of Service Mode */ 979*4882a593Smuzhiyun enum ucc_geth_qos_mode { 980*4882a593Smuzhiyun UCC_GETH_QOS_MODE_DEFAULT = 0x0, /* default queue */ 981*4882a593Smuzhiyun UCC_GETH_QOS_MODE_QUEUE_NUM_FROM_L2_CRITERIA = 0x1, /* queue 982*4882a593Smuzhiyun determined 983*4882a593Smuzhiyun by L2 984*4882a593Smuzhiyun criteria */ 985*4882a593Smuzhiyun UCC_GETH_QOS_MODE_QUEUE_NUM_FROM_L3_CRITERIA = 0x2 /* queue 986*4882a593Smuzhiyun determined 987*4882a593Smuzhiyun by L3 988*4882a593Smuzhiyun criteria */ 989*4882a593Smuzhiyun }; 990*4882a593Smuzhiyun 991*4882a593Smuzhiyun /* UCC GETH Statistics Gathering Mode - These are bit flags, 'or' them together 992*4882a593Smuzhiyun for combined functionality */ 993*4882a593Smuzhiyun enum ucc_geth_statistics_gathering_mode { 994*4882a593Smuzhiyun UCC_GETH_STATISTICS_GATHERING_MODE_NONE = 0x00000000, /* No 995*4882a593Smuzhiyun statistics 996*4882a593Smuzhiyun gathering */ 997*4882a593Smuzhiyun UCC_GETH_STATISTICS_GATHERING_MODE_HARDWARE = 0x00000001,/* Enable 998*4882a593Smuzhiyun hardware 999*4882a593Smuzhiyun statistics 1000*4882a593Smuzhiyun gathering 1001*4882a593Smuzhiyun */ 1002*4882a593Smuzhiyun UCC_GETH_STATISTICS_GATHERING_MODE_FIRMWARE_TX = 0x00000004,/*Enable 1003*4882a593Smuzhiyun firmware 1004*4882a593Smuzhiyun tx 1005*4882a593Smuzhiyun statistics 1006*4882a593Smuzhiyun gathering 1007*4882a593Smuzhiyun */ 1008*4882a593Smuzhiyun UCC_GETH_STATISTICS_GATHERING_MODE_FIRMWARE_RX = 0x00000008/* Enable 1009*4882a593Smuzhiyun firmware 1010*4882a593Smuzhiyun rx 1011*4882a593Smuzhiyun statistics 1012*4882a593Smuzhiyun gathering 1013*4882a593Smuzhiyun */ 1014*4882a593Smuzhiyun }; 1015*4882a593Smuzhiyun 1016*4882a593Smuzhiyun /* UCC GETH Pad and CRC Mode - Note, Padding without CRC is not possible */ 1017*4882a593Smuzhiyun enum ucc_geth_maccfg2_pad_and_crc_mode { 1018*4882a593Smuzhiyun UCC_GETH_PAD_AND_CRC_MODE_NONE 1019*4882a593Smuzhiyun = MACCFG2_PAD_AND_CRC_MODE_NONE, /* Neither Padding 1020*4882a593Smuzhiyun short frames 1021*4882a593Smuzhiyun nor CRC */ 1022*4882a593Smuzhiyun UCC_GETH_PAD_AND_CRC_MODE_CRC_ONLY 1023*4882a593Smuzhiyun = MACCFG2_PAD_AND_CRC_MODE_CRC_ONLY, /* Append 1024*4882a593Smuzhiyun CRC only */ 1025*4882a593Smuzhiyun UCC_GETH_PAD_AND_CRC_MODE_PAD_AND_CRC = 1026*4882a593Smuzhiyun MACCFG2_PAD_AND_CRC_MODE_PAD_AND_CRC 1027*4882a593Smuzhiyun }; 1028*4882a593Smuzhiyun 1029*4882a593Smuzhiyun /* UCC GETH upsmr Flow Control Mode */ 1030*4882a593Smuzhiyun enum ucc_geth_flow_control_mode { 1031*4882a593Smuzhiyun UPSMR_AUTOMATIC_FLOW_CONTROL_MODE_NONE = 0x00000000, /* No automatic 1032*4882a593Smuzhiyun flow control 1033*4882a593Smuzhiyun */ 1034*4882a593Smuzhiyun UPSMR_AUTOMATIC_FLOW_CONTROL_MODE_PAUSE_WHEN_EMERGENCY 1035*4882a593Smuzhiyun = 0x00004000 /* Send pause frame when RxFIFO reaches its 1036*4882a593Smuzhiyun emergency threshold */ 1037*4882a593Smuzhiyun }; 1038*4882a593Smuzhiyun 1039*4882a593Smuzhiyun /* UCC GETH number of threads */ 1040*4882a593Smuzhiyun enum ucc_geth_num_of_threads { 1041*4882a593Smuzhiyun UCC_GETH_NUM_OF_THREADS_1 = 0x1, /* 1 */ 1042*4882a593Smuzhiyun UCC_GETH_NUM_OF_THREADS_2 = 0x2, /* 2 */ 1043*4882a593Smuzhiyun UCC_GETH_NUM_OF_THREADS_4 = 0x0, /* 4 */ 1044*4882a593Smuzhiyun UCC_GETH_NUM_OF_THREADS_6 = 0x3, /* 6 */ 1045*4882a593Smuzhiyun UCC_GETH_NUM_OF_THREADS_8 = 0x4 /* 8 */ 1046*4882a593Smuzhiyun }; 1047*4882a593Smuzhiyun 1048*4882a593Smuzhiyun /* UCC GETH number of station addresses */ 1049*4882a593Smuzhiyun enum ucc_geth_num_of_station_addresses { 1050*4882a593Smuzhiyun UCC_GETH_NUM_OF_STATION_ADDRESSES_1, /* 1 */ 1051*4882a593Smuzhiyun UCC_GETH_NUM_OF_STATION_ADDRESSES_5 /* 5 */ 1052*4882a593Smuzhiyun }; 1053*4882a593Smuzhiyun 1054*4882a593Smuzhiyun /* UCC GETH 82xx Ethernet Address Container */ 1055*4882a593Smuzhiyun struct enet_addr_container { 1056*4882a593Smuzhiyun u8 address[ETH_ALEN]; /* ethernet address */ 1057*4882a593Smuzhiyun enum ucc_geth_enet_address_recognition_location location; /* location in 1058*4882a593Smuzhiyun 82xx address 1059*4882a593Smuzhiyun recognition 1060*4882a593Smuzhiyun hardware */ 1061*4882a593Smuzhiyun struct list_head node; 1062*4882a593Smuzhiyun }; 1063*4882a593Smuzhiyun 1064*4882a593Smuzhiyun #define ENET_ADDR_CONT_ENTRY(ptr) list_entry(ptr, struct enet_addr_container, node) 1065*4882a593Smuzhiyun 1066*4882a593Smuzhiyun /* UCC GETH Termination Action Descriptor (TAD) structure. */ 1067*4882a593Smuzhiyun struct ucc_geth_tad_params { 1068*4882a593Smuzhiyun int rx_non_dynamic_extended_features_mode; 1069*4882a593Smuzhiyun int reject_frame; 1070*4882a593Smuzhiyun enum ucc_geth_vlan_operation_tagged vtag_op; 1071*4882a593Smuzhiyun enum ucc_geth_vlan_operation_non_tagged vnontag_op; 1072*4882a593Smuzhiyun enum ucc_geth_qos_mode rqos; 1073*4882a593Smuzhiyun u8 vpri; 1074*4882a593Smuzhiyun u16 vid; 1075*4882a593Smuzhiyun }; 1076*4882a593Smuzhiyun 1077*4882a593Smuzhiyun /* GETH protocol initialization structure */ 1078*4882a593Smuzhiyun struct ucc_geth_info { 1079*4882a593Smuzhiyun struct ucc_fast_info uf_info; 1080*4882a593Smuzhiyun u8 numQueuesTx; 1081*4882a593Smuzhiyun u8 numQueuesRx; 1082*4882a593Smuzhiyun int ipCheckSumCheck; 1083*4882a593Smuzhiyun int ipCheckSumGenerate; 1084*4882a593Smuzhiyun int rxExtendedFiltering; 1085*4882a593Smuzhiyun u32 extendedFilteringChainPointer; 1086*4882a593Smuzhiyun u16 typeorlen; 1087*4882a593Smuzhiyun int dynamicMaxFrameLength; 1088*4882a593Smuzhiyun int dynamicMinFrameLength; 1089*4882a593Smuzhiyun u8 nonBackToBackIfgPart1; 1090*4882a593Smuzhiyun u8 nonBackToBackIfgPart2; 1091*4882a593Smuzhiyun u8 miminumInterFrameGapEnforcement; 1092*4882a593Smuzhiyun u8 backToBackInterFrameGap; 1093*4882a593Smuzhiyun int ipAddressAlignment; 1094*4882a593Smuzhiyun int lengthCheckRx; 1095*4882a593Smuzhiyun u32 mblinterval; 1096*4882a593Smuzhiyun u16 nortsrbytetime; 1097*4882a593Smuzhiyun u8 fracsiz; 1098*4882a593Smuzhiyun u8 strictpriorityq; 1099*4882a593Smuzhiyun u8 txasap; 1100*4882a593Smuzhiyun u8 extrabw; 1101*4882a593Smuzhiyun int miiPreambleSupress; 1102*4882a593Smuzhiyun u8 altBebTruncation; 1103*4882a593Smuzhiyun int altBeb; 1104*4882a593Smuzhiyun int backPressureNoBackoff; 1105*4882a593Smuzhiyun int noBackoff; 1106*4882a593Smuzhiyun int excessDefer; 1107*4882a593Smuzhiyun u8 maxRetransmission; 1108*4882a593Smuzhiyun u8 collisionWindow; 1109*4882a593Smuzhiyun int pro; 1110*4882a593Smuzhiyun int cap; 1111*4882a593Smuzhiyun int rsh; 1112*4882a593Smuzhiyun int rlpb; 1113*4882a593Smuzhiyun int cam; 1114*4882a593Smuzhiyun int bro; 1115*4882a593Smuzhiyun int ecm; 1116*4882a593Smuzhiyun int receiveFlowControl; 1117*4882a593Smuzhiyun int transmitFlowControl; 1118*4882a593Smuzhiyun u8 maxGroupAddrInHash; 1119*4882a593Smuzhiyun u8 maxIndAddrInHash; 1120*4882a593Smuzhiyun u8 prel; 1121*4882a593Smuzhiyun u16 maxFrameLength; 1122*4882a593Smuzhiyun u16 minFrameLength; 1123*4882a593Smuzhiyun u16 maxD1Length; 1124*4882a593Smuzhiyun u16 maxD2Length; 1125*4882a593Smuzhiyun u16 vlantype; 1126*4882a593Smuzhiyun u16 vlantci; 1127*4882a593Smuzhiyun u32 ecamptr; 1128*4882a593Smuzhiyun u32 eventRegMask; 1129*4882a593Smuzhiyun u16 pausePeriod; 1130*4882a593Smuzhiyun u16 extensionField; 1131*4882a593Smuzhiyun struct device_node *phy_node; 1132*4882a593Smuzhiyun struct device_node *tbi_node; 1133*4882a593Smuzhiyun u8 weightfactor[NUM_TX_QUEUES]; 1134*4882a593Smuzhiyun u8 interruptcoalescingmaxvalue[NUM_RX_QUEUES]; 1135*4882a593Smuzhiyun u8 l2qt[UCC_GETH_VLAN_PRIORITY_MAX]; 1136*4882a593Smuzhiyun u8 l3qt[UCC_GETH_IP_PRIORITY_MAX]; 1137*4882a593Smuzhiyun u32 vtagtable[UCC_GETH_TX_VTAG_TABLE_ENTRY_MAX]; 1138*4882a593Smuzhiyun u8 iphoffset[TX_IP_OFFSET_ENTRY_MAX]; 1139*4882a593Smuzhiyun u16 bdRingLenTx[NUM_TX_QUEUES]; 1140*4882a593Smuzhiyun u16 bdRingLenRx[NUM_RX_QUEUES]; 1141*4882a593Smuzhiyun enum ucc_geth_num_of_station_addresses numStationAddresses; 1142*4882a593Smuzhiyun enum qe_fltr_largest_external_tbl_lookup_key_size 1143*4882a593Smuzhiyun largestexternallookupkeysize; 1144*4882a593Smuzhiyun enum ucc_geth_statistics_gathering_mode statisticsMode; 1145*4882a593Smuzhiyun enum ucc_geth_vlan_operation_tagged vlanOperationTagged; 1146*4882a593Smuzhiyun enum ucc_geth_vlan_operation_non_tagged vlanOperationNonTagged; 1147*4882a593Smuzhiyun enum ucc_geth_qos_mode rxQoSMode; 1148*4882a593Smuzhiyun enum ucc_geth_flow_control_mode aufc; 1149*4882a593Smuzhiyun enum ucc_geth_maccfg2_pad_and_crc_mode padAndCrc; 1150*4882a593Smuzhiyun enum ucc_geth_num_of_threads numThreadsTx; 1151*4882a593Smuzhiyun enum ucc_geth_num_of_threads numThreadsRx; 1152*4882a593Smuzhiyun unsigned int riscTx; 1153*4882a593Smuzhiyun unsigned int riscRx; 1154*4882a593Smuzhiyun }; 1155*4882a593Smuzhiyun 1156*4882a593Smuzhiyun /* structure representing UCC GETH */ 1157*4882a593Smuzhiyun struct ucc_geth_private { 1158*4882a593Smuzhiyun struct ucc_geth_info *ug_info; 1159*4882a593Smuzhiyun struct ucc_fast_private *uccf; 1160*4882a593Smuzhiyun struct device *dev; 1161*4882a593Smuzhiyun struct net_device *ndev; 1162*4882a593Smuzhiyun struct napi_struct napi; 1163*4882a593Smuzhiyun struct work_struct timeout_work; 1164*4882a593Smuzhiyun struct ucc_geth __iomem *ug_regs; 1165*4882a593Smuzhiyun struct ucc_geth_init_pram *p_init_enet_param_shadow; 1166*4882a593Smuzhiyun struct ucc_geth_exf_global_pram __iomem *p_exf_glbl_param; 1167*4882a593Smuzhiyun u32 exf_glbl_param_offset; 1168*4882a593Smuzhiyun struct ucc_geth_rx_global_pram __iomem *p_rx_glbl_pram; 1169*4882a593Smuzhiyun u32 rx_glbl_pram_offset; 1170*4882a593Smuzhiyun struct ucc_geth_tx_global_pram __iomem *p_tx_glbl_pram; 1171*4882a593Smuzhiyun u32 tx_glbl_pram_offset; 1172*4882a593Smuzhiyun struct ucc_geth_send_queue_mem_region __iomem *p_send_q_mem_reg; 1173*4882a593Smuzhiyun u32 send_q_mem_reg_offset; 1174*4882a593Smuzhiyun struct ucc_geth_thread_data_tx __iomem *p_thread_data_tx; 1175*4882a593Smuzhiyun u32 thread_dat_tx_offset; 1176*4882a593Smuzhiyun struct ucc_geth_thread_data_rx __iomem *p_thread_data_rx; 1177*4882a593Smuzhiyun u32 thread_dat_rx_offset; 1178*4882a593Smuzhiyun struct ucc_geth_scheduler __iomem *p_scheduler; 1179*4882a593Smuzhiyun u32 scheduler_offset; 1180*4882a593Smuzhiyun struct ucc_geth_tx_firmware_statistics_pram __iomem *p_tx_fw_statistics_pram; 1181*4882a593Smuzhiyun u32 tx_fw_statistics_pram_offset; 1182*4882a593Smuzhiyun struct ucc_geth_rx_firmware_statistics_pram __iomem *p_rx_fw_statistics_pram; 1183*4882a593Smuzhiyun u32 rx_fw_statistics_pram_offset; 1184*4882a593Smuzhiyun struct ucc_geth_rx_interrupt_coalescing_table __iomem *p_rx_irq_coalescing_tbl; 1185*4882a593Smuzhiyun u32 rx_irq_coalescing_tbl_offset; 1186*4882a593Smuzhiyun struct ucc_geth_rx_bd_queues_entry __iomem *p_rx_bd_qs_tbl; 1187*4882a593Smuzhiyun u32 rx_bd_qs_tbl_offset; 1188*4882a593Smuzhiyun u8 __iomem *p_tx_bd_ring[NUM_TX_QUEUES]; 1189*4882a593Smuzhiyun u32 tx_bd_ring_offset[NUM_TX_QUEUES]; 1190*4882a593Smuzhiyun u8 __iomem *p_rx_bd_ring[NUM_RX_QUEUES]; 1191*4882a593Smuzhiyun u32 rx_bd_ring_offset[NUM_RX_QUEUES]; 1192*4882a593Smuzhiyun u8 __iomem *confBd[NUM_TX_QUEUES]; 1193*4882a593Smuzhiyun u8 __iomem *txBd[NUM_TX_QUEUES]; 1194*4882a593Smuzhiyun u8 __iomem *rxBd[NUM_RX_QUEUES]; 1195*4882a593Smuzhiyun int badFrame[NUM_RX_QUEUES]; 1196*4882a593Smuzhiyun u16 cpucount[NUM_TX_QUEUES]; 1197*4882a593Smuzhiyun u16 __iomem *p_cpucount[NUM_TX_QUEUES]; 1198*4882a593Smuzhiyun int indAddrRegUsed[NUM_OF_PADDRS]; 1199*4882a593Smuzhiyun u8 paddr[NUM_OF_PADDRS][ETH_ALEN]; /* ethernet address */ 1200*4882a593Smuzhiyun u8 numGroupAddrInHash; 1201*4882a593Smuzhiyun u8 numIndAddrInHash; 1202*4882a593Smuzhiyun u8 numIndAddrInReg; 1203*4882a593Smuzhiyun int rx_extended_features; 1204*4882a593Smuzhiyun int rx_non_dynamic_extended_features; 1205*4882a593Smuzhiyun struct list_head conf_skbs; 1206*4882a593Smuzhiyun struct list_head group_hash_q; 1207*4882a593Smuzhiyun struct list_head ind_hash_q; 1208*4882a593Smuzhiyun u32 saved_uccm; 1209*4882a593Smuzhiyun spinlock_t lock; 1210*4882a593Smuzhiyun /* pointers to arrays of skbuffs for tx and rx */ 1211*4882a593Smuzhiyun struct sk_buff **tx_skbuff[NUM_TX_QUEUES]; 1212*4882a593Smuzhiyun struct sk_buff **rx_skbuff[NUM_RX_QUEUES]; 1213*4882a593Smuzhiyun /* indices pointing to the next free sbk in skb arrays */ 1214*4882a593Smuzhiyun u16 skb_curtx[NUM_TX_QUEUES]; 1215*4882a593Smuzhiyun u16 skb_currx[NUM_RX_QUEUES]; 1216*4882a593Smuzhiyun /* index of the first skb which hasn't been transmitted yet. */ 1217*4882a593Smuzhiyun u16 skb_dirtytx[NUM_TX_QUEUES]; 1218*4882a593Smuzhiyun 1219*4882a593Smuzhiyun struct ugeth_mii_info *mii_info; 1220*4882a593Smuzhiyun struct phy_device *phydev; 1221*4882a593Smuzhiyun phy_interface_t phy_interface; 1222*4882a593Smuzhiyun int max_speed; 1223*4882a593Smuzhiyun uint32_t msg_enable; 1224*4882a593Smuzhiyun int oldspeed; 1225*4882a593Smuzhiyun int oldduplex; 1226*4882a593Smuzhiyun int oldlink; 1227*4882a593Smuzhiyun int wol_en; 1228*4882a593Smuzhiyun 1229*4882a593Smuzhiyun struct device_node *node; 1230*4882a593Smuzhiyun }; 1231*4882a593Smuzhiyun 1232*4882a593Smuzhiyun void uec_set_ethtool_ops(struct net_device *netdev); 1233*4882a593Smuzhiyun int init_flow_control_params(u32 automatic_flow_control_mode, 1234*4882a593Smuzhiyun int rx_flow_control_enable, int tx_flow_control_enable, 1235*4882a593Smuzhiyun u16 pause_period, u16 extension_field, 1236*4882a593Smuzhiyun u32 __iomem *upsmr_register, u32 __iomem *uempr_register, 1237*4882a593Smuzhiyun u32 __iomem *maccfg1_register); 1238*4882a593Smuzhiyun 1239*4882a593Smuzhiyun 1240*4882a593Smuzhiyun #endif /* __UCC_GETH_H__ */ 1241