17c587d32SIlya Yanok /* 27c587d32SIlya Yanok * Copyright (C) 2011 Ilya Yanok, Emcraft Systems 37c587d32SIlya Yanok * 47c587d32SIlya Yanok * Based on: mach-davinci/emac_defs.h 57c587d32SIlya Yanok * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net> 67c587d32SIlya Yanok * 77c587d32SIlya Yanok * This program is free software; you can redistribute it and/or modify 87c587d32SIlya Yanok * it under the terms of the GNU General Public License as published by 97c587d32SIlya Yanok * the Free Software Foundation; either version 2 of the License, or 107c587d32SIlya Yanok * (at your option) any later version. 117c587d32SIlya Yanok * 127c587d32SIlya Yanok * This program is distributed in the hope that it will be useful, 137c587d32SIlya Yanok * but WITHOUT ANY WARRANTY; without even the implied warranty of 147c587d32SIlya Yanok * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 157c587d32SIlya Yanok * GNU General Public License for more details. 167c587d32SIlya Yanok * 177c587d32SIlya Yanok * You should have received a copy of the GNU General Public License 187c587d32SIlya Yanok * along with this program; if not, write to the Free Software 197c587d32SIlya Yanok * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 207c587d32SIlya Yanok */ 217c587d32SIlya Yanok 227c587d32SIlya Yanok #ifndef _DAVINCI_EMAC_H_ 237c587d32SIlya Yanok #define _DAVINCI_EMAC_H_ 247c587d32SIlya Yanok /* Ethernet Min/Max packet size */ 257c587d32SIlya Yanok #define EMAC_MIN_ETHERNET_PKT_SIZE 60 267c587d32SIlya Yanok #define EMAC_MAX_ETHERNET_PKT_SIZE 1518 27*2aa87202SIlya Yanok /* Buffer size (should be aligned on 32 byte and cache line) */ 28*2aa87202SIlya Yanok #define EMAC_RXBUF_SIZE ALIGN(ALIGN(EMAC_MAX_ETHERNET_PKT_SIZE, 32),\ 29*2aa87202SIlya Yanok ARCH_DMA_MINALIGN) 307c587d32SIlya Yanok 317c587d32SIlya Yanok /* Number of RX packet buffers 327c587d32SIlya Yanok * NOTE: Only 1 buffer supported as of now 337c587d32SIlya Yanok */ 347c587d32SIlya Yanok #define EMAC_MAX_RX_BUFFERS 10 357c587d32SIlya Yanok 367c587d32SIlya Yanok 377c587d32SIlya Yanok /*********************************************** 387c587d32SIlya Yanok ******** Internally used macros *************** 397c587d32SIlya Yanok ***********************************************/ 407c587d32SIlya Yanok 417c587d32SIlya Yanok #define EMAC_CH_TX 1 427c587d32SIlya Yanok #define EMAC_CH_RX 0 437c587d32SIlya Yanok 447c587d32SIlya Yanok /* Each descriptor occupies 4 words, lets start RX desc's at 0 and 457c587d32SIlya Yanok * reserve space for 64 descriptors max 467c587d32SIlya Yanok */ 477c587d32SIlya Yanok #define EMAC_RX_DESC_BASE 0x0 487c587d32SIlya Yanok #define EMAC_TX_DESC_BASE 0x1000 497c587d32SIlya Yanok 507c587d32SIlya Yanok /* EMAC Teardown value */ 517c587d32SIlya Yanok #define EMAC_TEARDOWN_VALUE 0xfffffffc 527c587d32SIlya Yanok 537c587d32SIlya Yanok /* MII Status Register */ 547c587d32SIlya Yanok #define MII_STATUS_REG 1 557c587d32SIlya Yanok 567c587d32SIlya Yanok /* Number of statistics registers */ 577c587d32SIlya Yanok #define EMAC_NUM_STATS 36 587c587d32SIlya Yanok 597c587d32SIlya Yanok 607c587d32SIlya Yanok /* EMAC Descriptor */ 617c587d32SIlya Yanok typedef volatile struct _emac_desc 627c587d32SIlya Yanok { 637c587d32SIlya Yanok u_int32_t next; /* Pointer to next descriptor 647c587d32SIlya Yanok in chain */ 657c587d32SIlya Yanok u_int8_t *buffer; /* Pointer to data buffer */ 667c587d32SIlya Yanok u_int32_t buff_off_len; /* Buffer Offset(MSW) and Length(LSW) */ 677c587d32SIlya Yanok u_int32_t pkt_flag_len; /* Packet Flags(MSW) and Length(LSW) */ 687c587d32SIlya Yanok } emac_desc; 697c587d32SIlya Yanok 707c587d32SIlya Yanok /* CPPI bit positions */ 717c587d32SIlya Yanok #define EMAC_CPPI_SOP_BIT (0x80000000) 727c587d32SIlya Yanok #define EMAC_CPPI_EOP_BIT (0x40000000) 737c587d32SIlya Yanok #define EMAC_CPPI_OWNERSHIP_BIT (0x20000000) 747c587d32SIlya Yanok #define EMAC_CPPI_EOQ_BIT (0x10000000) 757c587d32SIlya Yanok #define EMAC_CPPI_TEARDOWN_COMPLETE_BIT (0x08000000) 767c587d32SIlya Yanok #define EMAC_CPPI_PASS_CRC_BIT (0x04000000) 777c587d32SIlya Yanok 787c587d32SIlya Yanok #define EMAC_CPPI_RX_ERROR_FRAME (0x03fc0000) 797c587d32SIlya Yanok 807c587d32SIlya Yanok #define EMAC_MACCONTROL_MIIEN_ENABLE (0x20) 817c587d32SIlya Yanok #define EMAC_MACCONTROL_FULLDUPLEX_ENABLE (0x1) 827c587d32SIlya Yanok #define EMAC_MACCONTROL_GIGABIT_ENABLE (1 << 7) 837c587d32SIlya Yanok #define EMAC_MACCONTROL_GIGFORCE (1 << 17) 847c587d32SIlya Yanok #define EMAC_MACCONTROL_RMIISPEED_100 (1 << 15) 857c587d32SIlya Yanok 867c587d32SIlya Yanok #define EMAC_MAC_ADDR_MATCH (1 << 19) 877c587d32SIlya Yanok #define EMAC_MAC_ADDR_IS_VALID (1 << 20) 887c587d32SIlya Yanok 897c587d32SIlya Yanok #define EMAC_RXMBPENABLE_RXCAFEN_ENABLE (0x200000) 907c587d32SIlya Yanok #define EMAC_RXMBPENABLE_RXBROADEN (0x2000) 917c587d32SIlya Yanok 927c587d32SIlya Yanok 937c587d32SIlya Yanok #define MDIO_CONTROL_IDLE (0x80000000) 947c587d32SIlya Yanok #define MDIO_CONTROL_ENABLE (0x40000000) 957c587d32SIlya Yanok #define MDIO_CONTROL_FAULT_ENABLE (0x40000) 967c587d32SIlya Yanok #define MDIO_CONTROL_FAULT (0x80000) 977c587d32SIlya Yanok #define MDIO_USERACCESS0_GO (0x80000000) 987c587d32SIlya Yanok #define MDIO_USERACCESS0_WRITE_READ (0x0) 997c587d32SIlya Yanok #define MDIO_USERACCESS0_WRITE_WRITE (0x40000000) 1007c587d32SIlya Yanok #define MDIO_USERACCESS0_ACK (0x20000000) 1017c587d32SIlya Yanok 1027c587d32SIlya Yanok /* Ethernet MAC Registers Structure */ 1037c587d32SIlya Yanok typedef struct { 1047c587d32SIlya Yanok dv_reg TXIDVER; 1057c587d32SIlya Yanok dv_reg TXCONTROL; 1067c587d32SIlya Yanok dv_reg TXTEARDOWN; 1077c587d32SIlya Yanok u_int8_t RSVD0[4]; 1087c587d32SIlya Yanok dv_reg RXIDVER; 1097c587d32SIlya Yanok dv_reg RXCONTROL; 1107c587d32SIlya Yanok dv_reg RXTEARDOWN; 1117c587d32SIlya Yanok u_int8_t RSVD1[100]; 1127c587d32SIlya Yanok dv_reg TXINTSTATRAW; 1137c587d32SIlya Yanok dv_reg TXINTSTATMASKED; 1147c587d32SIlya Yanok dv_reg TXINTMASKSET; 1157c587d32SIlya Yanok dv_reg TXINTMASKCLEAR; 1167c587d32SIlya Yanok dv_reg MACINVECTOR; 1177c587d32SIlya Yanok u_int8_t RSVD2[12]; 1187c587d32SIlya Yanok dv_reg RXINTSTATRAW; 1197c587d32SIlya Yanok dv_reg RXINTSTATMASKED; 1207c587d32SIlya Yanok dv_reg RXINTMASKSET; 1217c587d32SIlya Yanok dv_reg RXINTMASKCLEAR; 1227c587d32SIlya Yanok dv_reg MACINTSTATRAW; 1237c587d32SIlya Yanok dv_reg MACINTSTATMASKED; 1247c587d32SIlya Yanok dv_reg MACINTMASKSET; 1257c587d32SIlya Yanok dv_reg MACINTMASKCLEAR; 1267c587d32SIlya Yanok u_int8_t RSVD3[64]; 1277c587d32SIlya Yanok dv_reg RXMBPENABLE; 1287c587d32SIlya Yanok dv_reg RXUNICASTSET; 1297c587d32SIlya Yanok dv_reg RXUNICASTCLEAR; 1307c587d32SIlya Yanok dv_reg RXMAXLEN; 1317c587d32SIlya Yanok dv_reg RXBUFFEROFFSET; 1327c587d32SIlya Yanok dv_reg RXFILTERLOWTHRESH; 1337c587d32SIlya Yanok u_int8_t RSVD4[8]; 1347c587d32SIlya Yanok dv_reg RX0FLOWTHRESH; 1357c587d32SIlya Yanok dv_reg RX1FLOWTHRESH; 1367c587d32SIlya Yanok dv_reg RX2FLOWTHRESH; 1377c587d32SIlya Yanok dv_reg RX3FLOWTHRESH; 1387c587d32SIlya Yanok dv_reg RX4FLOWTHRESH; 1397c587d32SIlya Yanok dv_reg RX5FLOWTHRESH; 1407c587d32SIlya Yanok dv_reg RX6FLOWTHRESH; 1417c587d32SIlya Yanok dv_reg RX7FLOWTHRESH; 1427c587d32SIlya Yanok dv_reg RX0FREEBUFFER; 1437c587d32SIlya Yanok dv_reg RX1FREEBUFFER; 1447c587d32SIlya Yanok dv_reg RX2FREEBUFFER; 1457c587d32SIlya Yanok dv_reg RX3FREEBUFFER; 1467c587d32SIlya Yanok dv_reg RX4FREEBUFFER; 1477c587d32SIlya Yanok dv_reg RX5FREEBUFFER; 1487c587d32SIlya Yanok dv_reg RX6FREEBUFFER; 1497c587d32SIlya Yanok dv_reg RX7FREEBUFFER; 1507c587d32SIlya Yanok dv_reg MACCONTROL; 1517c587d32SIlya Yanok dv_reg MACSTATUS; 1527c587d32SIlya Yanok dv_reg EMCONTROL; 1537c587d32SIlya Yanok dv_reg FIFOCONTROL; 1547c587d32SIlya Yanok dv_reg MACCONFIG; 1557c587d32SIlya Yanok dv_reg SOFTRESET; 1567c587d32SIlya Yanok u_int8_t RSVD5[88]; 1577c587d32SIlya Yanok dv_reg MACSRCADDRLO; 1587c587d32SIlya Yanok dv_reg MACSRCADDRHI; 1597c587d32SIlya Yanok dv_reg MACHASH1; 1607c587d32SIlya Yanok dv_reg MACHASH2; 1617c587d32SIlya Yanok dv_reg BOFFTEST; 1627c587d32SIlya Yanok dv_reg TPACETEST; 1637c587d32SIlya Yanok dv_reg RXPAUSE; 1647c587d32SIlya Yanok dv_reg TXPAUSE; 1657c587d32SIlya Yanok u_int8_t RSVD6[16]; 1667c587d32SIlya Yanok dv_reg RXGOODFRAMES; 1677c587d32SIlya Yanok dv_reg RXBCASTFRAMES; 1687c587d32SIlya Yanok dv_reg RXMCASTFRAMES; 1697c587d32SIlya Yanok dv_reg RXPAUSEFRAMES; 1707c587d32SIlya Yanok dv_reg RXCRCERRORS; 1717c587d32SIlya Yanok dv_reg RXALIGNCODEERRORS; 1727c587d32SIlya Yanok dv_reg RXOVERSIZED; 1737c587d32SIlya Yanok dv_reg RXJABBER; 1747c587d32SIlya Yanok dv_reg RXUNDERSIZED; 1757c587d32SIlya Yanok dv_reg RXFRAGMENTS; 1767c587d32SIlya Yanok dv_reg RXFILTERED; 1777c587d32SIlya Yanok dv_reg RXQOSFILTERED; 1787c587d32SIlya Yanok dv_reg RXOCTETS; 1797c587d32SIlya Yanok dv_reg TXGOODFRAMES; 1807c587d32SIlya Yanok dv_reg TXBCASTFRAMES; 1817c587d32SIlya Yanok dv_reg TXMCASTFRAMES; 1827c587d32SIlya Yanok dv_reg TXPAUSEFRAMES; 1837c587d32SIlya Yanok dv_reg TXDEFERRED; 1847c587d32SIlya Yanok dv_reg TXCOLLISION; 1857c587d32SIlya Yanok dv_reg TXSINGLECOLL; 1867c587d32SIlya Yanok dv_reg TXMULTICOLL; 1877c587d32SIlya Yanok dv_reg TXEXCESSIVECOLL; 1887c587d32SIlya Yanok dv_reg TXLATECOLL; 1897c587d32SIlya Yanok dv_reg TXUNDERRUN; 1907c587d32SIlya Yanok dv_reg TXCARRIERSENSE; 1917c587d32SIlya Yanok dv_reg TXOCTETS; 1927c587d32SIlya Yanok dv_reg FRAME64; 1937c587d32SIlya Yanok dv_reg FRAME65T127; 1947c587d32SIlya Yanok dv_reg FRAME128T255; 1957c587d32SIlya Yanok dv_reg FRAME256T511; 1967c587d32SIlya Yanok dv_reg FRAME512T1023; 1977c587d32SIlya Yanok dv_reg FRAME1024TUP; 1987c587d32SIlya Yanok dv_reg NETOCTETS; 1997c587d32SIlya Yanok dv_reg RXSOFOVERRUNS; 2007c587d32SIlya Yanok dv_reg RXMOFOVERRUNS; 2017c587d32SIlya Yanok dv_reg RXDMAOVERRUNS; 2027c587d32SIlya Yanok u_int8_t RSVD7[624]; 2037c587d32SIlya Yanok dv_reg MACADDRLO; 2047c587d32SIlya Yanok dv_reg MACADDRHI; 2057c587d32SIlya Yanok dv_reg MACINDEX; 2067c587d32SIlya Yanok u_int8_t RSVD8[244]; 2077c587d32SIlya Yanok dv_reg TX0HDP; 2087c587d32SIlya Yanok dv_reg TX1HDP; 2097c587d32SIlya Yanok dv_reg TX2HDP; 2107c587d32SIlya Yanok dv_reg TX3HDP; 2117c587d32SIlya Yanok dv_reg TX4HDP; 2127c587d32SIlya Yanok dv_reg TX5HDP; 2137c587d32SIlya Yanok dv_reg TX6HDP; 2147c587d32SIlya Yanok dv_reg TX7HDP; 2157c587d32SIlya Yanok dv_reg RX0HDP; 2167c587d32SIlya Yanok dv_reg RX1HDP; 2177c587d32SIlya Yanok dv_reg RX2HDP; 2187c587d32SIlya Yanok dv_reg RX3HDP; 2197c587d32SIlya Yanok dv_reg RX4HDP; 2207c587d32SIlya Yanok dv_reg RX5HDP; 2217c587d32SIlya Yanok dv_reg RX6HDP; 2227c587d32SIlya Yanok dv_reg RX7HDP; 2237c587d32SIlya Yanok dv_reg TX0CP; 2247c587d32SIlya Yanok dv_reg TX1CP; 2257c587d32SIlya Yanok dv_reg TX2CP; 2267c587d32SIlya Yanok dv_reg TX3CP; 2277c587d32SIlya Yanok dv_reg TX4CP; 2287c587d32SIlya Yanok dv_reg TX5CP; 2297c587d32SIlya Yanok dv_reg TX6CP; 2307c587d32SIlya Yanok dv_reg TX7CP; 2317c587d32SIlya Yanok dv_reg RX0CP; 2327c587d32SIlya Yanok dv_reg RX1CP; 2337c587d32SIlya Yanok dv_reg RX2CP; 2347c587d32SIlya Yanok dv_reg RX3CP; 2357c587d32SIlya Yanok dv_reg RX4CP; 2367c587d32SIlya Yanok dv_reg RX5CP; 2377c587d32SIlya Yanok dv_reg RX6CP; 2387c587d32SIlya Yanok dv_reg RX7CP; 2397c587d32SIlya Yanok } emac_regs; 2407c587d32SIlya Yanok 2417c587d32SIlya Yanok /* EMAC Wrapper Registers Structure */ 2427c587d32SIlya Yanok typedef struct { 2437c587d32SIlya Yanok #ifdef DAVINCI_EMAC_VERSION2 2447c587d32SIlya Yanok dv_reg idver; 2457c587d32SIlya Yanok dv_reg softrst; 2467c587d32SIlya Yanok dv_reg emctrl; 2477c587d32SIlya Yanok dv_reg c0rxthreshen; 2487c587d32SIlya Yanok dv_reg c0rxen; 2497c587d32SIlya Yanok dv_reg c0txen; 2507c587d32SIlya Yanok dv_reg c0miscen; 2517c587d32SIlya Yanok dv_reg c1rxthreshen; 2527c587d32SIlya Yanok dv_reg c1rxen; 2537c587d32SIlya Yanok dv_reg c1txen; 2547c587d32SIlya Yanok dv_reg c1miscen; 2557c587d32SIlya Yanok dv_reg c2rxthreshen; 2567c587d32SIlya Yanok dv_reg c2rxen; 2577c587d32SIlya Yanok dv_reg c2txen; 2587c587d32SIlya Yanok dv_reg c2miscen; 2597c587d32SIlya Yanok dv_reg c0rxthreshstat; 2607c587d32SIlya Yanok dv_reg c0rxstat; 2617c587d32SIlya Yanok dv_reg c0txstat; 2627c587d32SIlya Yanok dv_reg c0miscstat; 2637c587d32SIlya Yanok dv_reg c1rxthreshstat; 2647c587d32SIlya Yanok dv_reg c1rxstat; 2657c587d32SIlya Yanok dv_reg c1txstat; 2667c587d32SIlya Yanok dv_reg c1miscstat; 2677c587d32SIlya Yanok dv_reg c2rxthreshstat; 2687c587d32SIlya Yanok dv_reg c2rxstat; 2697c587d32SIlya Yanok dv_reg c2txstat; 2707c587d32SIlya Yanok dv_reg c2miscstat; 2717c587d32SIlya Yanok dv_reg c0rximax; 2727c587d32SIlya Yanok dv_reg c0tximax; 2737c587d32SIlya Yanok dv_reg c1rximax; 2747c587d32SIlya Yanok dv_reg c1tximax; 2757c587d32SIlya Yanok dv_reg c2rximax; 2767c587d32SIlya Yanok dv_reg c2tximax; 2777c587d32SIlya Yanok #else 2787c587d32SIlya Yanok u_int8_t RSVD0[4100]; 2797c587d32SIlya Yanok dv_reg EWCTL; 2807c587d32SIlya Yanok dv_reg EWINTTCNT; 2817c587d32SIlya Yanok #endif 2827c587d32SIlya Yanok } ewrap_regs; 2837c587d32SIlya Yanok 2847c587d32SIlya Yanok /* EMAC MDIO Registers Structure */ 2857c587d32SIlya Yanok typedef struct { 2867c587d32SIlya Yanok dv_reg VERSION; 2877c587d32SIlya Yanok dv_reg CONTROL; 2887c587d32SIlya Yanok dv_reg ALIVE; 2897c587d32SIlya Yanok dv_reg LINK; 2907c587d32SIlya Yanok dv_reg LINKINTRAW; 2917c587d32SIlya Yanok dv_reg LINKINTMASKED; 2927c587d32SIlya Yanok u_int8_t RSVD0[8]; 2937c587d32SIlya Yanok dv_reg USERINTRAW; 2947c587d32SIlya Yanok dv_reg USERINTMASKED; 2957c587d32SIlya Yanok dv_reg USERINTMASKSET; 2967c587d32SIlya Yanok dv_reg USERINTMASKCLEAR; 2977c587d32SIlya Yanok u_int8_t RSVD1[80]; 2987c587d32SIlya Yanok dv_reg USERACCESS0; 2997c587d32SIlya Yanok dv_reg USERPHYSEL0; 3007c587d32SIlya Yanok dv_reg USERACCESS1; 3017c587d32SIlya Yanok dv_reg USERPHYSEL1; 3027c587d32SIlya Yanok } mdio_regs; 3037c587d32SIlya Yanok 3047c587d32SIlya Yanok int davinci_eth_phy_read(u_int8_t phy_addr, u_int8_t reg_num, u_int16_t *data); 3057c587d32SIlya Yanok int davinci_eth_phy_write(u_int8_t phy_addr, u_int8_t reg_num, u_int16_t data); 3067c587d32SIlya Yanok 3077c587d32SIlya Yanok typedef struct { 3087c587d32SIlya Yanok char name[64]; 3097c587d32SIlya Yanok int (*init)(int phy_addr); 3107c587d32SIlya Yanok int (*is_phy_connected)(int phy_addr); 3117c587d32SIlya Yanok int (*get_link_speed)(int phy_addr); 3127c587d32SIlya Yanok int (*auto_negotiate)(int phy_addr); 3137c587d32SIlya Yanok } phy_t; 3147c587d32SIlya Yanok 3157c587d32SIlya Yanok #endif /* _DAVINCI_EMAC_H_ */ 316