1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun 3*4882a593Smuzhiyun #ifndef XILINX_LL_TEMAC_H 4*4882a593Smuzhiyun #define XILINX_LL_TEMAC_H 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #include <linux/netdevice.h> 7*4882a593Smuzhiyun #include <linux/of.h> 8*4882a593Smuzhiyun #include <linux/spinlock.h> 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #ifdef CONFIG_PPC_DCR 11*4882a593Smuzhiyun #include <asm/dcr.h> 12*4882a593Smuzhiyun #include <asm/dcr-regs.h> 13*4882a593Smuzhiyun #endif 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun /* packet size info */ 16*4882a593Smuzhiyun #define XTE_HDR_SIZE 14 /* size of Ethernet header */ 17*4882a593Smuzhiyun #define XTE_TRL_SIZE 4 /* size of Ethernet trailer (FCS) */ 18*4882a593Smuzhiyun #define XTE_JUMBO_MTU 9000 19*4882a593Smuzhiyun #define XTE_MAX_JUMBO_FRAME_SIZE (XTE_JUMBO_MTU + XTE_HDR_SIZE + XTE_TRL_SIZE) 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun /* Configuration options */ 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun /* Accept all incoming packets. 24*4882a593Smuzhiyun * This option defaults to disabled (cleared) */ 25*4882a593Smuzhiyun #define XTE_OPTION_PROMISC (1 << 0) 26*4882a593Smuzhiyun /* Jumbo frame support for Tx & Rx. 27*4882a593Smuzhiyun * This option defaults to disabled (cleared) */ 28*4882a593Smuzhiyun #define XTE_OPTION_JUMBO (1 << 1) 29*4882a593Smuzhiyun /* VLAN Rx & Tx frame support. 30*4882a593Smuzhiyun * This option defaults to disabled (cleared) */ 31*4882a593Smuzhiyun #define XTE_OPTION_VLAN (1 << 2) 32*4882a593Smuzhiyun /* Enable recognition of flow control frames on Rx 33*4882a593Smuzhiyun * This option defaults to enabled (set) */ 34*4882a593Smuzhiyun #define XTE_OPTION_FLOW_CONTROL (1 << 4) 35*4882a593Smuzhiyun /* Strip FCS and PAD from incoming frames. 36*4882a593Smuzhiyun * Note: PAD from VLAN frames is not stripped. 37*4882a593Smuzhiyun * This option defaults to disabled (set) */ 38*4882a593Smuzhiyun #define XTE_OPTION_FCS_STRIP (1 << 5) 39*4882a593Smuzhiyun /* Generate FCS field and add PAD automatically for outgoing frames. 40*4882a593Smuzhiyun * This option defaults to enabled (set) */ 41*4882a593Smuzhiyun #define XTE_OPTION_FCS_INSERT (1 << 6) 42*4882a593Smuzhiyun /* Enable Length/Type error checking for incoming frames. When this option is 43*4882a593Smuzhiyun set, the MAC will filter frames that have a mismatched type/length field 44*4882a593Smuzhiyun and if XTE_OPTION_REPORT_RXERR is set, the user is notified when these 45*4882a593Smuzhiyun types of frames are encountered. When this option is cleared, the MAC will 46*4882a593Smuzhiyun allow these types of frames to be received. 47*4882a593Smuzhiyun This option defaults to enabled (set) */ 48*4882a593Smuzhiyun #define XTE_OPTION_LENTYPE_ERR (1 << 7) 49*4882a593Smuzhiyun /* Enable the transmitter. 50*4882a593Smuzhiyun * This option defaults to enabled (set) */ 51*4882a593Smuzhiyun #define XTE_OPTION_TXEN (1 << 11) 52*4882a593Smuzhiyun /* Enable the receiver 53*4882a593Smuzhiyun * This option defaults to enabled (set) */ 54*4882a593Smuzhiyun #define XTE_OPTION_RXEN (1 << 12) 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun /* Default options set when device is initialized or reset */ 57*4882a593Smuzhiyun #define XTE_OPTION_DEFAULTS \ 58*4882a593Smuzhiyun (XTE_OPTION_TXEN | \ 59*4882a593Smuzhiyun XTE_OPTION_FLOW_CONTROL | \ 60*4882a593Smuzhiyun XTE_OPTION_RXEN) 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun /* XPS_LL_TEMAC SDMA registers definition */ 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun #define TX_NXTDESC_PTR 0x00 /* r */ 65*4882a593Smuzhiyun #define TX_CURBUF_ADDR 0x01 /* r */ 66*4882a593Smuzhiyun #define TX_CURBUF_LENGTH 0x02 /* r */ 67*4882a593Smuzhiyun #define TX_CURDESC_PTR 0x03 /* rw */ 68*4882a593Smuzhiyun #define TX_TAILDESC_PTR 0x04 /* rw */ 69*4882a593Smuzhiyun #define TX_CHNL_CTRL 0x05 /* rw */ 70*4882a593Smuzhiyun /* 71*4882a593Smuzhiyun 0:7 24:31 IRQTimeout 72*4882a593Smuzhiyun 8:15 16:23 IRQCount 73*4882a593Smuzhiyun 16:20 11:15 Reserved 74*4882a593Smuzhiyun 21 10 0 75*4882a593Smuzhiyun 22 9 UseIntOnEnd 76*4882a593Smuzhiyun 23 8 LdIRQCnt 77*4882a593Smuzhiyun 24 7 IRQEn 78*4882a593Smuzhiyun 25:28 3:6 Reserved 79*4882a593Smuzhiyun 29 2 IrqErrEn 80*4882a593Smuzhiyun 30 1 IrqDlyEn 81*4882a593Smuzhiyun 31 0 IrqCoalEn 82*4882a593Smuzhiyun */ 83*4882a593Smuzhiyun #define CHNL_CTRL_IRQ_IOE (1 << 9) 84*4882a593Smuzhiyun #define CHNL_CTRL_IRQ_EN (1 << 7) 85*4882a593Smuzhiyun #define CHNL_CTRL_IRQ_ERR_EN (1 << 2) 86*4882a593Smuzhiyun #define CHNL_CTRL_IRQ_DLY_EN (1 << 1) 87*4882a593Smuzhiyun #define CHNL_CTRL_IRQ_COAL_EN (1 << 0) 88*4882a593Smuzhiyun #define TX_IRQ_REG 0x06 /* rw */ 89*4882a593Smuzhiyun /* 90*4882a593Smuzhiyun 0:7 24:31 DltTmrValue 91*4882a593Smuzhiyun 8:15 16:23 ClscCntrValue 92*4882a593Smuzhiyun 16:17 14:15 Reserved 93*4882a593Smuzhiyun 18:21 10:13 ClscCnt 94*4882a593Smuzhiyun 22:23 8:9 DlyCnt 95*4882a593Smuzhiyun 24:28 3::7 Reserved 96*4882a593Smuzhiyun 29 2 ErrIrq 97*4882a593Smuzhiyun 30 1 DlyIrq 98*4882a593Smuzhiyun 31 0 CoalIrq 99*4882a593Smuzhiyun */ 100*4882a593Smuzhiyun #define TX_CHNL_STS 0x07 /* r */ 101*4882a593Smuzhiyun /* 102*4882a593Smuzhiyun 0:9 22:31 Reserved 103*4882a593Smuzhiyun 10 21 TailPErr 104*4882a593Smuzhiyun 11 20 CmpErr 105*4882a593Smuzhiyun 12 19 AddrErr 106*4882a593Smuzhiyun 13 18 NxtPErr 107*4882a593Smuzhiyun 14 17 CurPErr 108*4882a593Smuzhiyun 15 16 BsyWr 109*4882a593Smuzhiyun 16:23 8:15 Reserved 110*4882a593Smuzhiyun 24 7 Error 111*4882a593Smuzhiyun 25 6 IOE 112*4882a593Smuzhiyun 26 5 SOE 113*4882a593Smuzhiyun 27 4 Cmplt 114*4882a593Smuzhiyun 28 3 SOP 115*4882a593Smuzhiyun 29 2 EOP 116*4882a593Smuzhiyun 30 1 EngBusy 117*4882a593Smuzhiyun 31 0 Reserved 118*4882a593Smuzhiyun */ 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun #define RX_NXTDESC_PTR 0x08 /* r */ 121*4882a593Smuzhiyun #define RX_CURBUF_ADDR 0x09 /* r */ 122*4882a593Smuzhiyun #define RX_CURBUF_LENGTH 0x0a /* r */ 123*4882a593Smuzhiyun #define RX_CURDESC_PTR 0x0b /* rw */ 124*4882a593Smuzhiyun #define RX_TAILDESC_PTR 0x0c /* rw */ 125*4882a593Smuzhiyun #define RX_CHNL_CTRL 0x0d /* rw */ 126*4882a593Smuzhiyun /* 127*4882a593Smuzhiyun 0:7 24:31 IRQTimeout 128*4882a593Smuzhiyun 8:15 16:23 IRQCount 129*4882a593Smuzhiyun 16:20 11:15 Reserved 130*4882a593Smuzhiyun 21 10 0 131*4882a593Smuzhiyun 22 9 UseIntOnEnd 132*4882a593Smuzhiyun 23 8 LdIRQCnt 133*4882a593Smuzhiyun 24 7 IRQEn 134*4882a593Smuzhiyun 25:28 3:6 Reserved 135*4882a593Smuzhiyun 29 2 IrqErrEn 136*4882a593Smuzhiyun 30 1 IrqDlyEn 137*4882a593Smuzhiyun 31 0 IrqCoalEn 138*4882a593Smuzhiyun */ 139*4882a593Smuzhiyun #define RX_IRQ_REG 0x0e /* rw */ 140*4882a593Smuzhiyun #define IRQ_COAL (1 << 0) 141*4882a593Smuzhiyun #define IRQ_DLY (1 << 1) 142*4882a593Smuzhiyun #define IRQ_ERR (1 << 2) 143*4882a593Smuzhiyun #define IRQ_DMAERR (1 << 7) /* this is not documented ??? */ 144*4882a593Smuzhiyun /* 145*4882a593Smuzhiyun 0:7 24:31 DltTmrValue 146*4882a593Smuzhiyun 8:15 16:23 ClscCntrValue 147*4882a593Smuzhiyun 16:17 14:15 Reserved 148*4882a593Smuzhiyun 18:21 10:13 ClscCnt 149*4882a593Smuzhiyun 22:23 8:9 DlyCnt 150*4882a593Smuzhiyun 24:28 3::7 Reserved 151*4882a593Smuzhiyun */ 152*4882a593Smuzhiyun #define RX_CHNL_STS 0x0f /* r */ 153*4882a593Smuzhiyun #define CHNL_STS_ENGBUSY (1 << 1) 154*4882a593Smuzhiyun #define CHNL_STS_EOP (1 << 2) 155*4882a593Smuzhiyun #define CHNL_STS_SOP (1 << 3) 156*4882a593Smuzhiyun #define CHNL_STS_CMPLT (1 << 4) 157*4882a593Smuzhiyun #define CHNL_STS_SOE (1 << 5) 158*4882a593Smuzhiyun #define CHNL_STS_IOE (1 << 6) 159*4882a593Smuzhiyun #define CHNL_STS_ERR (1 << 7) 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun #define CHNL_STS_BSYWR (1 << 16) 162*4882a593Smuzhiyun #define CHNL_STS_CURPERR (1 << 17) 163*4882a593Smuzhiyun #define CHNL_STS_NXTPERR (1 << 18) 164*4882a593Smuzhiyun #define CHNL_STS_ADDRERR (1 << 19) 165*4882a593Smuzhiyun #define CHNL_STS_CMPERR (1 << 20) 166*4882a593Smuzhiyun #define CHNL_STS_TAILERR (1 << 21) 167*4882a593Smuzhiyun /* 168*4882a593Smuzhiyun 0:9 22:31 Reserved 169*4882a593Smuzhiyun 10 21 TailPErr 170*4882a593Smuzhiyun 11 20 CmpErr 171*4882a593Smuzhiyun 12 19 AddrErr 172*4882a593Smuzhiyun 13 18 NxtPErr 173*4882a593Smuzhiyun 14 17 CurPErr 174*4882a593Smuzhiyun 15 16 BsyWr 175*4882a593Smuzhiyun 16:23 8:15 Reserved 176*4882a593Smuzhiyun 24 7 Error 177*4882a593Smuzhiyun 25 6 IOE 178*4882a593Smuzhiyun 26 5 SOE 179*4882a593Smuzhiyun 27 4 Cmplt 180*4882a593Smuzhiyun 28 3 SOP 181*4882a593Smuzhiyun 29 2 EOP 182*4882a593Smuzhiyun 30 1 EngBusy 183*4882a593Smuzhiyun 31 0 Reserved 184*4882a593Smuzhiyun */ 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun #define DMA_CONTROL_REG 0x10 /* rw */ 187*4882a593Smuzhiyun #define DMA_CONTROL_RST (1 << 0) 188*4882a593Smuzhiyun #define DMA_TAIL_ENABLE (1 << 2) 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun /* XPS_LL_TEMAC direct registers definition */ 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun #define XTE_RAF0_OFFSET 0x00 193*4882a593Smuzhiyun #define RAF0_RST (1 << 0) 194*4882a593Smuzhiyun #define RAF0_MCSTREJ (1 << 1) 195*4882a593Smuzhiyun #define RAF0_BCSTREJ (1 << 2) 196*4882a593Smuzhiyun #define XTE_TPF0_OFFSET 0x04 197*4882a593Smuzhiyun #define XTE_IFGP0_OFFSET 0x08 198*4882a593Smuzhiyun #define XTE_ISR0_OFFSET 0x0c 199*4882a593Smuzhiyun #define ISR0_HARDACSCMPLT (1 << 0) 200*4882a593Smuzhiyun #define ISR0_AUTONEG (1 << 1) 201*4882a593Smuzhiyun #define ISR0_RXCMPLT (1 << 2) 202*4882a593Smuzhiyun #define ISR0_RXREJ (1 << 3) 203*4882a593Smuzhiyun #define ISR0_RXFIFOOVR (1 << 4) 204*4882a593Smuzhiyun #define ISR0_TXCMPLT (1 << 5) 205*4882a593Smuzhiyun #define ISR0_RXDCMLCK (1 << 6) 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun #define XTE_IPR0_OFFSET 0x10 208*4882a593Smuzhiyun #define XTE_IER0_OFFSET 0x14 209*4882a593Smuzhiyun 210*4882a593Smuzhiyun #define XTE_MSW0_OFFSET 0x20 211*4882a593Smuzhiyun #define XTE_LSW0_OFFSET 0x24 212*4882a593Smuzhiyun #define XTE_CTL0_OFFSET 0x28 213*4882a593Smuzhiyun #define XTE_RDY0_OFFSET 0x2c 214*4882a593Smuzhiyun 215*4882a593Smuzhiyun #define XTE_RSE_MIIM_RR_MASK 0x0002 216*4882a593Smuzhiyun #define XTE_RSE_MIIM_WR_MASK 0x0004 217*4882a593Smuzhiyun #define XTE_RSE_CFG_RR_MASK 0x0020 218*4882a593Smuzhiyun #define XTE_RSE_CFG_WR_MASK 0x0040 219*4882a593Smuzhiyun #define XTE_RDY0_HARD_ACS_RDY_MASK (0x10000) 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun /* XPS_LL_TEMAC indirect registers offset definition */ 222*4882a593Smuzhiyun 223*4882a593Smuzhiyun #define XTE_RXC0_OFFSET 0x00000200 /* Rx configuration word 0 */ 224*4882a593Smuzhiyun #define XTE_RXC1_OFFSET 0x00000240 /* Rx configuration word 1 */ 225*4882a593Smuzhiyun #define XTE_RXC1_RXRST_MASK (1 << 31) /* Receiver reset */ 226*4882a593Smuzhiyun #define XTE_RXC1_RXJMBO_MASK (1 << 30) /* Jumbo frame enable */ 227*4882a593Smuzhiyun #define XTE_RXC1_RXFCS_MASK (1 << 29) /* FCS not stripped */ 228*4882a593Smuzhiyun #define XTE_RXC1_RXEN_MASK (1 << 28) /* Receiver enable */ 229*4882a593Smuzhiyun #define XTE_RXC1_RXVLAN_MASK (1 << 27) /* VLAN enable */ 230*4882a593Smuzhiyun #define XTE_RXC1_RXHD_MASK (1 << 26) /* Half duplex */ 231*4882a593Smuzhiyun #define XTE_RXC1_RXLT_MASK (1 << 25) /* Length/type check disable */ 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun #define XTE_TXC_OFFSET 0x00000280 /* Tx configuration */ 234*4882a593Smuzhiyun #define XTE_TXC_TXRST_MASK (1 << 31) /* Transmitter reset */ 235*4882a593Smuzhiyun #define XTE_TXC_TXJMBO_MASK (1 << 30) /* Jumbo frame enable */ 236*4882a593Smuzhiyun #define XTE_TXC_TXFCS_MASK (1 << 29) /* Generate FCS */ 237*4882a593Smuzhiyun #define XTE_TXC_TXEN_MASK (1 << 28) /* Transmitter enable */ 238*4882a593Smuzhiyun #define XTE_TXC_TXVLAN_MASK (1 << 27) /* VLAN enable */ 239*4882a593Smuzhiyun #define XTE_TXC_TXHD_MASK (1 << 26) /* Half duplex */ 240*4882a593Smuzhiyun 241*4882a593Smuzhiyun #define XTE_FCC_OFFSET 0x000002C0 /* Flow control config */ 242*4882a593Smuzhiyun #define XTE_FCC_RXFLO_MASK (1 << 29) /* Rx flow control enable */ 243*4882a593Smuzhiyun #define XTE_FCC_TXFLO_MASK (1 << 30) /* Tx flow control enable */ 244*4882a593Smuzhiyun 245*4882a593Smuzhiyun #define XTE_EMCFG_OFFSET 0x00000300 /* EMAC configuration */ 246*4882a593Smuzhiyun #define XTE_EMCFG_LINKSPD_MASK 0xC0000000 /* Link speed */ 247*4882a593Smuzhiyun #define XTE_EMCFG_HOSTEN_MASK (1 << 26) /* Host interface enable */ 248*4882a593Smuzhiyun #define XTE_EMCFG_LINKSPD_10 0x00000000 /* 10 Mbit LINKSPD_MASK */ 249*4882a593Smuzhiyun #define XTE_EMCFG_LINKSPD_100 (1 << 30) /* 100 Mbit LINKSPD_MASK */ 250*4882a593Smuzhiyun #define XTE_EMCFG_LINKSPD_1000 (1 << 31) /* 1000 Mbit LINKSPD_MASK */ 251*4882a593Smuzhiyun 252*4882a593Smuzhiyun #define XTE_GMIC_OFFSET 0x00000320 /* RGMII/SGMII config */ 253*4882a593Smuzhiyun #define XTE_MC_OFFSET 0x00000340 /* MDIO configuration */ 254*4882a593Smuzhiyun #define XTE_UAW0_OFFSET 0x00000380 /* Unicast address word 0 */ 255*4882a593Smuzhiyun #define XTE_UAW1_OFFSET 0x00000384 /* Unicast address word 1 */ 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun #define XTE_MAW0_OFFSET 0x00000388 /* Multicast addr word 0 */ 258*4882a593Smuzhiyun #define XTE_MAW1_OFFSET 0x0000038C /* Multicast addr word 1 */ 259*4882a593Smuzhiyun #define XTE_AFM_OFFSET 0x00000390 /* Promiscuous mode */ 260*4882a593Smuzhiyun #define XTE_AFM_EPPRM_MASK (1 << 31) /* Promiscuous mode enable */ 261*4882a593Smuzhiyun 262*4882a593Smuzhiyun /* Interrupt Request status */ 263*4882a593Smuzhiyun #define XTE_TIS_OFFSET 0x000003A0 264*4882a593Smuzhiyun #define TIS_FRIS (1 << 0) 265*4882a593Smuzhiyun #define TIS_MRIS (1 << 1) 266*4882a593Smuzhiyun #define TIS_MWIS (1 << 2) 267*4882a593Smuzhiyun #define TIS_ARIS (1 << 3) 268*4882a593Smuzhiyun #define TIS_AWIS (1 << 4) 269*4882a593Smuzhiyun #define TIS_CRIS (1 << 5) 270*4882a593Smuzhiyun #define TIS_CWIS (1 << 6) 271*4882a593Smuzhiyun 272*4882a593Smuzhiyun #define XTE_TIE_OFFSET 0x000003A4 /* Interrupt enable */ 273*4882a593Smuzhiyun 274*4882a593Smuzhiyun /** MII Mamagement Control register (MGTCR) */ 275*4882a593Smuzhiyun #define XTE_MGTDR_OFFSET 0x000003B0 /* MII data */ 276*4882a593Smuzhiyun #define XTE_MIIMAI_OFFSET 0x000003B4 /* MII control */ 277*4882a593Smuzhiyun 278*4882a593Smuzhiyun #define CNTLREG_WRITE_ENABLE_MASK 0x8000 279*4882a593Smuzhiyun #define CNTLREG_EMAC1SEL_MASK 0x0400 280*4882a593Smuzhiyun #define CNTLREG_ADDRESSCODE_MASK 0x03ff 281*4882a593Smuzhiyun 282*4882a593Smuzhiyun /* CDMAC descriptor status bit definitions */ 283*4882a593Smuzhiyun 284*4882a593Smuzhiyun #define STS_CTRL_APP0_ERR (1 << 31) 285*4882a593Smuzhiyun #define STS_CTRL_APP0_IRQONEND (1 << 30) 286*4882a593Smuzhiyun /* undoccumented */ 287*4882a593Smuzhiyun #define STS_CTRL_APP0_STOPONEND (1 << 29) 288*4882a593Smuzhiyun #define STS_CTRL_APP0_CMPLT (1 << 28) 289*4882a593Smuzhiyun #define STS_CTRL_APP0_SOP (1 << 27) 290*4882a593Smuzhiyun #define STS_CTRL_APP0_EOP (1 << 26) 291*4882a593Smuzhiyun #define STS_CTRL_APP0_ENGBUSY (1 << 25) 292*4882a593Smuzhiyun /* undocumented */ 293*4882a593Smuzhiyun #define STS_CTRL_APP0_ENGRST (1 << 24) 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun #define TX_CONTROL_CALC_CSUM_MASK 1 296*4882a593Smuzhiyun 297*4882a593Smuzhiyun #define MULTICAST_CAM_TABLE_NUM 4 298*4882a593Smuzhiyun 299*4882a593Smuzhiyun /* TEMAC Synthesis features */ 300*4882a593Smuzhiyun #define TEMAC_FEATURE_RX_CSUM (1 << 0) 301*4882a593Smuzhiyun #define TEMAC_FEATURE_TX_CSUM (1 << 1) 302*4882a593Smuzhiyun 303*4882a593Smuzhiyun /* TX/RX CURDESC_PTR points to first descriptor */ 304*4882a593Smuzhiyun /* TX/RX TAILDESC_PTR points to last descriptor in linked list */ 305*4882a593Smuzhiyun 306*4882a593Smuzhiyun /** 307*4882a593Smuzhiyun * struct cdmac_bd - LocalLink buffer descriptor format 308*4882a593Smuzhiyun * 309*4882a593Smuzhiyun * app0 bits: 310*4882a593Smuzhiyun * 0 Error 311*4882a593Smuzhiyun * 1 IrqOnEnd generate an interrupt at completion of DMA op 312*4882a593Smuzhiyun * 2 reserved 313*4882a593Smuzhiyun * 3 completed Current descriptor completed 314*4882a593Smuzhiyun * 4 SOP TX - marks first desc/ RX marks first desct 315*4882a593Smuzhiyun * 5 EOP TX marks last desc/RX marks last desc 316*4882a593Smuzhiyun * 6 EngBusy DMA is processing 317*4882a593Smuzhiyun * 7 reserved 318*4882a593Smuzhiyun * 8:31 application specific 319*4882a593Smuzhiyun */ 320*4882a593Smuzhiyun struct cdmac_bd { 321*4882a593Smuzhiyun u32 next; /* Physical address of next buffer descriptor */ 322*4882a593Smuzhiyun u32 phys; 323*4882a593Smuzhiyun u32 len; 324*4882a593Smuzhiyun u32 app0; 325*4882a593Smuzhiyun u32 app1; /* TX start << 16 | insert */ 326*4882a593Smuzhiyun u32 app2; /* TX csum */ 327*4882a593Smuzhiyun u32 app3; 328*4882a593Smuzhiyun u32 app4; /* skb for TX length for RX */ 329*4882a593Smuzhiyun }; 330*4882a593Smuzhiyun 331*4882a593Smuzhiyun struct temac_local { 332*4882a593Smuzhiyun struct net_device *ndev; 333*4882a593Smuzhiyun struct device *dev; 334*4882a593Smuzhiyun 335*4882a593Smuzhiyun /* Connection to PHY device */ 336*4882a593Smuzhiyun struct device_node *phy_node; 337*4882a593Smuzhiyun /* For non-device-tree devices */ 338*4882a593Smuzhiyun char phy_name[MII_BUS_ID_SIZE + 3]; 339*4882a593Smuzhiyun phy_interface_t phy_interface; 340*4882a593Smuzhiyun 341*4882a593Smuzhiyun /* MDIO bus data */ 342*4882a593Smuzhiyun struct mii_bus *mii_bus; /* MII bus reference */ 343*4882a593Smuzhiyun 344*4882a593Smuzhiyun /* IO registers, dma functions and IRQs */ 345*4882a593Smuzhiyun void __iomem *regs; 346*4882a593Smuzhiyun void __iomem *sdma_regs; 347*4882a593Smuzhiyun #ifdef CONFIG_PPC_DCR 348*4882a593Smuzhiyun dcr_host_t sdma_dcrs; 349*4882a593Smuzhiyun #endif 350*4882a593Smuzhiyun u32 (*temac_ior)(struct temac_local *lp, int offset); 351*4882a593Smuzhiyun void (*temac_iow)(struct temac_local *lp, int offset, u32 value); 352*4882a593Smuzhiyun u32 (*dma_in)(struct temac_local *lp, int reg); 353*4882a593Smuzhiyun void (*dma_out)(struct temac_local *lp, int reg, u32 value); 354*4882a593Smuzhiyun 355*4882a593Smuzhiyun int tx_irq; 356*4882a593Smuzhiyun int rx_irq; 357*4882a593Smuzhiyun int emac_num; 358*4882a593Smuzhiyun 359*4882a593Smuzhiyun struct sk_buff **rx_skb; 360*4882a593Smuzhiyun spinlock_t rx_lock; 361*4882a593Smuzhiyun /* For synchronization of indirect register access. Must be 362*4882a593Smuzhiyun * shared mutex between interfaces in same TEMAC block. 363*4882a593Smuzhiyun */ 364*4882a593Smuzhiyun spinlock_t *indirect_lock; 365*4882a593Smuzhiyun u32 options; /* Current options word */ 366*4882a593Smuzhiyun int last_link; 367*4882a593Smuzhiyun unsigned int temac_features; 368*4882a593Smuzhiyun 369*4882a593Smuzhiyun /* Buffer descriptors */ 370*4882a593Smuzhiyun struct cdmac_bd *tx_bd_v; 371*4882a593Smuzhiyun dma_addr_t tx_bd_p; 372*4882a593Smuzhiyun u32 tx_bd_num; 373*4882a593Smuzhiyun struct cdmac_bd *rx_bd_v; 374*4882a593Smuzhiyun dma_addr_t rx_bd_p; 375*4882a593Smuzhiyun u32 rx_bd_num; 376*4882a593Smuzhiyun int tx_bd_ci; 377*4882a593Smuzhiyun int tx_bd_tail; 378*4882a593Smuzhiyun int rx_bd_ci; 379*4882a593Smuzhiyun int rx_bd_tail; 380*4882a593Smuzhiyun 381*4882a593Smuzhiyun /* DMA channel control setup */ 382*4882a593Smuzhiyun u8 coalesce_count_tx; 383*4882a593Smuzhiyun u8 coalesce_delay_tx; 384*4882a593Smuzhiyun u8 coalesce_count_rx; 385*4882a593Smuzhiyun u8 coalesce_delay_rx; 386*4882a593Smuzhiyun 387*4882a593Smuzhiyun struct delayed_work restart_work; 388*4882a593Smuzhiyun }; 389*4882a593Smuzhiyun 390*4882a593Smuzhiyun /* Wrappers for temac_ior()/temac_iow() function pointers above */ 391*4882a593Smuzhiyun #define temac_ior(lp, o) ((lp)->temac_ior(lp, o)) 392*4882a593Smuzhiyun #define temac_iow(lp, o, v) ((lp)->temac_iow(lp, o, v)) 393*4882a593Smuzhiyun 394*4882a593Smuzhiyun /* xilinx_temac.c */ 395*4882a593Smuzhiyun int temac_indirect_busywait(struct temac_local *lp); 396*4882a593Smuzhiyun u32 temac_indirect_in32(struct temac_local *lp, int reg); 397*4882a593Smuzhiyun u32 temac_indirect_in32_locked(struct temac_local *lp, int reg); 398*4882a593Smuzhiyun void temac_indirect_out32(struct temac_local *lp, int reg, u32 value); 399*4882a593Smuzhiyun void temac_indirect_out32_locked(struct temac_local *lp, int reg, u32 value); 400*4882a593Smuzhiyun 401*4882a593Smuzhiyun /* xilinx_temac_mdio.c */ 402*4882a593Smuzhiyun int temac_mdio_setup(struct temac_local *lp, struct platform_device *pdev); 403*4882a593Smuzhiyun void temac_mdio_teardown(struct temac_local *lp); 404*4882a593Smuzhiyun 405*4882a593Smuzhiyun #endif /* XILINX_LL_TEMAC_H */ 406