1*7c587d32SIlya Yanok /* 2*7c587d32SIlya Yanok * Copyright (C) 2011 Ilya Yanok, Emcraft Systems 3*7c587d32SIlya Yanok * 4*7c587d32SIlya Yanok * Based on: mach-davinci/emac_defs.h 5*7c587d32SIlya Yanok * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net> 6*7c587d32SIlya Yanok * 7*7c587d32SIlya Yanok * This program is free software; you can redistribute it and/or modify 8*7c587d32SIlya Yanok * it under the terms of the GNU General Public License as published by 9*7c587d32SIlya Yanok * the Free Software Foundation; either version 2 of the License, or 10*7c587d32SIlya Yanok * (at your option) any later version. 11*7c587d32SIlya Yanok * 12*7c587d32SIlya Yanok * This program is distributed in the hope that it will be useful, 13*7c587d32SIlya Yanok * but WITHOUT ANY WARRANTY; without even the implied warranty of 14*7c587d32SIlya Yanok * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15*7c587d32SIlya Yanok * GNU General Public License for more details. 16*7c587d32SIlya Yanok * 17*7c587d32SIlya Yanok * You should have received a copy of the GNU General Public License 18*7c587d32SIlya Yanok * along with this program; if not, write to the Free Software 19*7c587d32SIlya Yanok * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20*7c587d32SIlya Yanok */ 21*7c587d32SIlya Yanok 22*7c587d32SIlya Yanok #ifndef _DAVINCI_EMAC_H_ 23*7c587d32SIlya Yanok #define _DAVINCI_EMAC_H_ 24*7c587d32SIlya Yanok /* Ethernet Min/Max packet size */ 25*7c587d32SIlya Yanok #define EMAC_MIN_ETHERNET_PKT_SIZE 60 26*7c587d32SIlya Yanok #define EMAC_MAX_ETHERNET_PKT_SIZE 1518 27*7c587d32SIlya Yanok /* 1518 + 18 = 1536 (packet aligned on 32 byte boundry) */ 28*7c587d32SIlya Yanok #define EMAC_PKT_ALIGN 18 29*7c587d32SIlya Yanok 30*7c587d32SIlya Yanok /* Number of RX packet buffers 31*7c587d32SIlya Yanok * NOTE: Only 1 buffer supported as of now 32*7c587d32SIlya Yanok */ 33*7c587d32SIlya Yanok #define EMAC_MAX_RX_BUFFERS 10 34*7c587d32SIlya Yanok 35*7c587d32SIlya Yanok 36*7c587d32SIlya Yanok /*********************************************** 37*7c587d32SIlya Yanok ******** Internally used macros *************** 38*7c587d32SIlya Yanok ***********************************************/ 39*7c587d32SIlya Yanok 40*7c587d32SIlya Yanok #define EMAC_CH_TX 1 41*7c587d32SIlya Yanok #define EMAC_CH_RX 0 42*7c587d32SIlya Yanok 43*7c587d32SIlya Yanok /* Each descriptor occupies 4 words, lets start RX desc's at 0 and 44*7c587d32SIlya Yanok * reserve space for 64 descriptors max 45*7c587d32SIlya Yanok */ 46*7c587d32SIlya Yanok #define EMAC_RX_DESC_BASE 0x0 47*7c587d32SIlya Yanok #define EMAC_TX_DESC_BASE 0x1000 48*7c587d32SIlya Yanok 49*7c587d32SIlya Yanok /* EMAC Teardown value */ 50*7c587d32SIlya Yanok #define EMAC_TEARDOWN_VALUE 0xfffffffc 51*7c587d32SIlya Yanok 52*7c587d32SIlya Yanok /* MII Status Register */ 53*7c587d32SIlya Yanok #define MII_STATUS_REG 1 54*7c587d32SIlya Yanok 55*7c587d32SIlya Yanok /* Number of statistics registers */ 56*7c587d32SIlya Yanok #define EMAC_NUM_STATS 36 57*7c587d32SIlya Yanok 58*7c587d32SIlya Yanok 59*7c587d32SIlya Yanok /* EMAC Descriptor */ 60*7c587d32SIlya Yanok typedef volatile struct _emac_desc 61*7c587d32SIlya Yanok { 62*7c587d32SIlya Yanok u_int32_t next; /* Pointer to next descriptor 63*7c587d32SIlya Yanok in chain */ 64*7c587d32SIlya Yanok u_int8_t *buffer; /* Pointer to data buffer */ 65*7c587d32SIlya Yanok u_int32_t buff_off_len; /* Buffer Offset(MSW) and Length(LSW) */ 66*7c587d32SIlya Yanok u_int32_t pkt_flag_len; /* Packet Flags(MSW) and Length(LSW) */ 67*7c587d32SIlya Yanok } emac_desc; 68*7c587d32SIlya Yanok 69*7c587d32SIlya Yanok /* CPPI bit positions */ 70*7c587d32SIlya Yanok #define EMAC_CPPI_SOP_BIT (0x80000000) 71*7c587d32SIlya Yanok #define EMAC_CPPI_EOP_BIT (0x40000000) 72*7c587d32SIlya Yanok #define EMAC_CPPI_OWNERSHIP_BIT (0x20000000) 73*7c587d32SIlya Yanok #define EMAC_CPPI_EOQ_BIT (0x10000000) 74*7c587d32SIlya Yanok #define EMAC_CPPI_TEARDOWN_COMPLETE_BIT (0x08000000) 75*7c587d32SIlya Yanok #define EMAC_CPPI_PASS_CRC_BIT (0x04000000) 76*7c587d32SIlya Yanok 77*7c587d32SIlya Yanok #define EMAC_CPPI_RX_ERROR_FRAME (0x03fc0000) 78*7c587d32SIlya Yanok 79*7c587d32SIlya Yanok #define EMAC_MACCONTROL_MIIEN_ENABLE (0x20) 80*7c587d32SIlya Yanok #define EMAC_MACCONTROL_FULLDUPLEX_ENABLE (0x1) 81*7c587d32SIlya Yanok #define EMAC_MACCONTROL_GIGABIT_ENABLE (1 << 7) 82*7c587d32SIlya Yanok #define EMAC_MACCONTROL_GIGFORCE (1 << 17) 83*7c587d32SIlya Yanok #define EMAC_MACCONTROL_RMIISPEED_100 (1 << 15) 84*7c587d32SIlya Yanok 85*7c587d32SIlya Yanok #define EMAC_MAC_ADDR_MATCH (1 << 19) 86*7c587d32SIlya Yanok #define EMAC_MAC_ADDR_IS_VALID (1 << 20) 87*7c587d32SIlya Yanok 88*7c587d32SIlya Yanok #define EMAC_RXMBPENABLE_RXCAFEN_ENABLE (0x200000) 89*7c587d32SIlya Yanok #define EMAC_RXMBPENABLE_RXBROADEN (0x2000) 90*7c587d32SIlya Yanok 91*7c587d32SIlya Yanok 92*7c587d32SIlya Yanok #define MDIO_CONTROL_IDLE (0x80000000) 93*7c587d32SIlya Yanok #define MDIO_CONTROL_ENABLE (0x40000000) 94*7c587d32SIlya Yanok #define MDIO_CONTROL_FAULT_ENABLE (0x40000) 95*7c587d32SIlya Yanok #define MDIO_CONTROL_FAULT (0x80000) 96*7c587d32SIlya Yanok #define MDIO_USERACCESS0_GO (0x80000000) 97*7c587d32SIlya Yanok #define MDIO_USERACCESS0_WRITE_READ (0x0) 98*7c587d32SIlya Yanok #define MDIO_USERACCESS0_WRITE_WRITE (0x40000000) 99*7c587d32SIlya Yanok #define MDIO_USERACCESS0_ACK (0x20000000) 100*7c587d32SIlya Yanok 101*7c587d32SIlya Yanok /* Ethernet MAC Registers Structure */ 102*7c587d32SIlya Yanok typedef struct { 103*7c587d32SIlya Yanok dv_reg TXIDVER; 104*7c587d32SIlya Yanok dv_reg TXCONTROL; 105*7c587d32SIlya Yanok dv_reg TXTEARDOWN; 106*7c587d32SIlya Yanok u_int8_t RSVD0[4]; 107*7c587d32SIlya Yanok dv_reg RXIDVER; 108*7c587d32SIlya Yanok dv_reg RXCONTROL; 109*7c587d32SIlya Yanok dv_reg RXTEARDOWN; 110*7c587d32SIlya Yanok u_int8_t RSVD1[100]; 111*7c587d32SIlya Yanok dv_reg TXINTSTATRAW; 112*7c587d32SIlya Yanok dv_reg TXINTSTATMASKED; 113*7c587d32SIlya Yanok dv_reg TXINTMASKSET; 114*7c587d32SIlya Yanok dv_reg TXINTMASKCLEAR; 115*7c587d32SIlya Yanok dv_reg MACINVECTOR; 116*7c587d32SIlya Yanok u_int8_t RSVD2[12]; 117*7c587d32SIlya Yanok dv_reg RXINTSTATRAW; 118*7c587d32SIlya Yanok dv_reg RXINTSTATMASKED; 119*7c587d32SIlya Yanok dv_reg RXINTMASKSET; 120*7c587d32SIlya Yanok dv_reg RXINTMASKCLEAR; 121*7c587d32SIlya Yanok dv_reg MACINTSTATRAW; 122*7c587d32SIlya Yanok dv_reg MACINTSTATMASKED; 123*7c587d32SIlya Yanok dv_reg MACINTMASKSET; 124*7c587d32SIlya Yanok dv_reg MACINTMASKCLEAR; 125*7c587d32SIlya Yanok u_int8_t RSVD3[64]; 126*7c587d32SIlya Yanok dv_reg RXMBPENABLE; 127*7c587d32SIlya Yanok dv_reg RXUNICASTSET; 128*7c587d32SIlya Yanok dv_reg RXUNICASTCLEAR; 129*7c587d32SIlya Yanok dv_reg RXMAXLEN; 130*7c587d32SIlya Yanok dv_reg RXBUFFEROFFSET; 131*7c587d32SIlya Yanok dv_reg RXFILTERLOWTHRESH; 132*7c587d32SIlya Yanok u_int8_t RSVD4[8]; 133*7c587d32SIlya Yanok dv_reg RX0FLOWTHRESH; 134*7c587d32SIlya Yanok dv_reg RX1FLOWTHRESH; 135*7c587d32SIlya Yanok dv_reg RX2FLOWTHRESH; 136*7c587d32SIlya Yanok dv_reg RX3FLOWTHRESH; 137*7c587d32SIlya Yanok dv_reg RX4FLOWTHRESH; 138*7c587d32SIlya Yanok dv_reg RX5FLOWTHRESH; 139*7c587d32SIlya Yanok dv_reg RX6FLOWTHRESH; 140*7c587d32SIlya Yanok dv_reg RX7FLOWTHRESH; 141*7c587d32SIlya Yanok dv_reg RX0FREEBUFFER; 142*7c587d32SIlya Yanok dv_reg RX1FREEBUFFER; 143*7c587d32SIlya Yanok dv_reg RX2FREEBUFFER; 144*7c587d32SIlya Yanok dv_reg RX3FREEBUFFER; 145*7c587d32SIlya Yanok dv_reg RX4FREEBUFFER; 146*7c587d32SIlya Yanok dv_reg RX5FREEBUFFER; 147*7c587d32SIlya Yanok dv_reg RX6FREEBUFFER; 148*7c587d32SIlya Yanok dv_reg RX7FREEBUFFER; 149*7c587d32SIlya Yanok dv_reg MACCONTROL; 150*7c587d32SIlya Yanok dv_reg MACSTATUS; 151*7c587d32SIlya Yanok dv_reg EMCONTROL; 152*7c587d32SIlya Yanok dv_reg FIFOCONTROL; 153*7c587d32SIlya Yanok dv_reg MACCONFIG; 154*7c587d32SIlya Yanok dv_reg SOFTRESET; 155*7c587d32SIlya Yanok u_int8_t RSVD5[88]; 156*7c587d32SIlya Yanok dv_reg MACSRCADDRLO; 157*7c587d32SIlya Yanok dv_reg MACSRCADDRHI; 158*7c587d32SIlya Yanok dv_reg MACHASH1; 159*7c587d32SIlya Yanok dv_reg MACHASH2; 160*7c587d32SIlya Yanok dv_reg BOFFTEST; 161*7c587d32SIlya Yanok dv_reg TPACETEST; 162*7c587d32SIlya Yanok dv_reg RXPAUSE; 163*7c587d32SIlya Yanok dv_reg TXPAUSE; 164*7c587d32SIlya Yanok u_int8_t RSVD6[16]; 165*7c587d32SIlya Yanok dv_reg RXGOODFRAMES; 166*7c587d32SIlya Yanok dv_reg RXBCASTFRAMES; 167*7c587d32SIlya Yanok dv_reg RXMCASTFRAMES; 168*7c587d32SIlya Yanok dv_reg RXPAUSEFRAMES; 169*7c587d32SIlya Yanok dv_reg RXCRCERRORS; 170*7c587d32SIlya Yanok dv_reg RXALIGNCODEERRORS; 171*7c587d32SIlya Yanok dv_reg RXOVERSIZED; 172*7c587d32SIlya Yanok dv_reg RXJABBER; 173*7c587d32SIlya Yanok dv_reg RXUNDERSIZED; 174*7c587d32SIlya Yanok dv_reg RXFRAGMENTS; 175*7c587d32SIlya Yanok dv_reg RXFILTERED; 176*7c587d32SIlya Yanok dv_reg RXQOSFILTERED; 177*7c587d32SIlya Yanok dv_reg RXOCTETS; 178*7c587d32SIlya Yanok dv_reg TXGOODFRAMES; 179*7c587d32SIlya Yanok dv_reg TXBCASTFRAMES; 180*7c587d32SIlya Yanok dv_reg TXMCASTFRAMES; 181*7c587d32SIlya Yanok dv_reg TXPAUSEFRAMES; 182*7c587d32SIlya Yanok dv_reg TXDEFERRED; 183*7c587d32SIlya Yanok dv_reg TXCOLLISION; 184*7c587d32SIlya Yanok dv_reg TXSINGLECOLL; 185*7c587d32SIlya Yanok dv_reg TXMULTICOLL; 186*7c587d32SIlya Yanok dv_reg TXEXCESSIVECOLL; 187*7c587d32SIlya Yanok dv_reg TXLATECOLL; 188*7c587d32SIlya Yanok dv_reg TXUNDERRUN; 189*7c587d32SIlya Yanok dv_reg TXCARRIERSENSE; 190*7c587d32SIlya Yanok dv_reg TXOCTETS; 191*7c587d32SIlya Yanok dv_reg FRAME64; 192*7c587d32SIlya Yanok dv_reg FRAME65T127; 193*7c587d32SIlya Yanok dv_reg FRAME128T255; 194*7c587d32SIlya Yanok dv_reg FRAME256T511; 195*7c587d32SIlya Yanok dv_reg FRAME512T1023; 196*7c587d32SIlya Yanok dv_reg FRAME1024TUP; 197*7c587d32SIlya Yanok dv_reg NETOCTETS; 198*7c587d32SIlya Yanok dv_reg RXSOFOVERRUNS; 199*7c587d32SIlya Yanok dv_reg RXMOFOVERRUNS; 200*7c587d32SIlya Yanok dv_reg RXDMAOVERRUNS; 201*7c587d32SIlya Yanok u_int8_t RSVD7[624]; 202*7c587d32SIlya Yanok dv_reg MACADDRLO; 203*7c587d32SIlya Yanok dv_reg MACADDRHI; 204*7c587d32SIlya Yanok dv_reg MACINDEX; 205*7c587d32SIlya Yanok u_int8_t RSVD8[244]; 206*7c587d32SIlya Yanok dv_reg TX0HDP; 207*7c587d32SIlya Yanok dv_reg TX1HDP; 208*7c587d32SIlya Yanok dv_reg TX2HDP; 209*7c587d32SIlya Yanok dv_reg TX3HDP; 210*7c587d32SIlya Yanok dv_reg TX4HDP; 211*7c587d32SIlya Yanok dv_reg TX5HDP; 212*7c587d32SIlya Yanok dv_reg TX6HDP; 213*7c587d32SIlya Yanok dv_reg TX7HDP; 214*7c587d32SIlya Yanok dv_reg RX0HDP; 215*7c587d32SIlya Yanok dv_reg RX1HDP; 216*7c587d32SIlya Yanok dv_reg RX2HDP; 217*7c587d32SIlya Yanok dv_reg RX3HDP; 218*7c587d32SIlya Yanok dv_reg RX4HDP; 219*7c587d32SIlya Yanok dv_reg RX5HDP; 220*7c587d32SIlya Yanok dv_reg RX6HDP; 221*7c587d32SIlya Yanok dv_reg RX7HDP; 222*7c587d32SIlya Yanok dv_reg TX0CP; 223*7c587d32SIlya Yanok dv_reg TX1CP; 224*7c587d32SIlya Yanok dv_reg TX2CP; 225*7c587d32SIlya Yanok dv_reg TX3CP; 226*7c587d32SIlya Yanok dv_reg TX4CP; 227*7c587d32SIlya Yanok dv_reg TX5CP; 228*7c587d32SIlya Yanok dv_reg TX6CP; 229*7c587d32SIlya Yanok dv_reg TX7CP; 230*7c587d32SIlya Yanok dv_reg RX0CP; 231*7c587d32SIlya Yanok dv_reg RX1CP; 232*7c587d32SIlya Yanok dv_reg RX2CP; 233*7c587d32SIlya Yanok dv_reg RX3CP; 234*7c587d32SIlya Yanok dv_reg RX4CP; 235*7c587d32SIlya Yanok dv_reg RX5CP; 236*7c587d32SIlya Yanok dv_reg RX6CP; 237*7c587d32SIlya Yanok dv_reg RX7CP; 238*7c587d32SIlya Yanok } emac_regs; 239*7c587d32SIlya Yanok 240*7c587d32SIlya Yanok /* EMAC Wrapper Registers Structure */ 241*7c587d32SIlya Yanok typedef struct { 242*7c587d32SIlya Yanok #ifdef DAVINCI_EMAC_VERSION2 243*7c587d32SIlya Yanok dv_reg idver; 244*7c587d32SIlya Yanok dv_reg softrst; 245*7c587d32SIlya Yanok dv_reg emctrl; 246*7c587d32SIlya Yanok dv_reg c0rxthreshen; 247*7c587d32SIlya Yanok dv_reg c0rxen; 248*7c587d32SIlya Yanok dv_reg c0txen; 249*7c587d32SIlya Yanok dv_reg c0miscen; 250*7c587d32SIlya Yanok dv_reg c1rxthreshen; 251*7c587d32SIlya Yanok dv_reg c1rxen; 252*7c587d32SIlya Yanok dv_reg c1txen; 253*7c587d32SIlya Yanok dv_reg c1miscen; 254*7c587d32SIlya Yanok dv_reg c2rxthreshen; 255*7c587d32SIlya Yanok dv_reg c2rxen; 256*7c587d32SIlya Yanok dv_reg c2txen; 257*7c587d32SIlya Yanok dv_reg c2miscen; 258*7c587d32SIlya Yanok dv_reg c0rxthreshstat; 259*7c587d32SIlya Yanok dv_reg c0rxstat; 260*7c587d32SIlya Yanok dv_reg c0txstat; 261*7c587d32SIlya Yanok dv_reg c0miscstat; 262*7c587d32SIlya Yanok dv_reg c1rxthreshstat; 263*7c587d32SIlya Yanok dv_reg c1rxstat; 264*7c587d32SIlya Yanok dv_reg c1txstat; 265*7c587d32SIlya Yanok dv_reg c1miscstat; 266*7c587d32SIlya Yanok dv_reg c2rxthreshstat; 267*7c587d32SIlya Yanok dv_reg c2rxstat; 268*7c587d32SIlya Yanok dv_reg c2txstat; 269*7c587d32SIlya Yanok dv_reg c2miscstat; 270*7c587d32SIlya Yanok dv_reg c0rximax; 271*7c587d32SIlya Yanok dv_reg c0tximax; 272*7c587d32SIlya Yanok dv_reg c1rximax; 273*7c587d32SIlya Yanok dv_reg c1tximax; 274*7c587d32SIlya Yanok dv_reg c2rximax; 275*7c587d32SIlya Yanok dv_reg c2tximax; 276*7c587d32SIlya Yanok #else 277*7c587d32SIlya Yanok u_int8_t RSVD0[4100]; 278*7c587d32SIlya Yanok dv_reg EWCTL; 279*7c587d32SIlya Yanok dv_reg EWINTTCNT; 280*7c587d32SIlya Yanok #endif 281*7c587d32SIlya Yanok } ewrap_regs; 282*7c587d32SIlya Yanok 283*7c587d32SIlya Yanok /* EMAC MDIO Registers Structure */ 284*7c587d32SIlya Yanok typedef struct { 285*7c587d32SIlya Yanok dv_reg VERSION; 286*7c587d32SIlya Yanok dv_reg CONTROL; 287*7c587d32SIlya Yanok dv_reg ALIVE; 288*7c587d32SIlya Yanok dv_reg LINK; 289*7c587d32SIlya Yanok dv_reg LINKINTRAW; 290*7c587d32SIlya Yanok dv_reg LINKINTMASKED; 291*7c587d32SIlya Yanok u_int8_t RSVD0[8]; 292*7c587d32SIlya Yanok dv_reg USERINTRAW; 293*7c587d32SIlya Yanok dv_reg USERINTMASKED; 294*7c587d32SIlya Yanok dv_reg USERINTMASKSET; 295*7c587d32SIlya Yanok dv_reg USERINTMASKCLEAR; 296*7c587d32SIlya Yanok u_int8_t RSVD1[80]; 297*7c587d32SIlya Yanok dv_reg USERACCESS0; 298*7c587d32SIlya Yanok dv_reg USERPHYSEL0; 299*7c587d32SIlya Yanok dv_reg USERACCESS1; 300*7c587d32SIlya Yanok dv_reg USERPHYSEL1; 301*7c587d32SIlya Yanok } mdio_regs; 302*7c587d32SIlya Yanok 303*7c587d32SIlya Yanok int davinci_eth_phy_read(u_int8_t phy_addr, u_int8_t reg_num, u_int16_t *data); 304*7c587d32SIlya Yanok int davinci_eth_phy_write(u_int8_t phy_addr, u_int8_t reg_num, u_int16_t data); 305*7c587d32SIlya Yanok 306*7c587d32SIlya Yanok typedef struct { 307*7c587d32SIlya Yanok char name[64]; 308*7c587d32SIlya Yanok int (*init)(int phy_addr); 309*7c587d32SIlya Yanok int (*is_phy_connected)(int phy_addr); 310*7c587d32SIlya Yanok int (*get_link_speed)(int phy_addr); 311*7c587d32SIlya Yanok int (*auto_negotiate)(int phy_addr); 312*7c587d32SIlya Yanok } phy_t; 313*7c587d32SIlya Yanok 314*7c587d32SIlya Yanok #endif /* _DAVINCI_EMAC_H_ */ 315