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