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