| /* | 
 |  * Copyright (C) 2011 Ilya Yanok, Emcraft Systems | 
 |  * | 
 |  * Based on: mach-davinci/emac_defs.h | 
 |  * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net> | 
 |  * | 
 |  * SPDX-License-Identifier:	GPL-2.0+ | 
 |  */ | 
 |  | 
 | #ifndef _DAVINCI_EMAC_H_ | 
 | #define _DAVINCI_EMAC_H_ | 
 | /* Ethernet Min/Max packet size */ | 
 | #define EMAC_MIN_ETHERNET_PKT_SIZE	60 | 
 | #define EMAC_MAX_ETHERNET_PKT_SIZE	1518 | 
 | /* Buffer size (should be aligned on 32 byte and cache line) */ | 
 | #define EMAC_RXBUF_SIZE	ALIGN(ALIGN(EMAC_MAX_ETHERNET_PKT_SIZE, 32),\ | 
 | 				ARCH_DMA_MINALIGN) | 
 |  | 
 | /* Number of RX packet buffers | 
 |  * NOTE: Only 1 buffer supported as of now | 
 |  */ | 
 | #define EMAC_MAX_RX_BUFFERS		10 | 
 |  | 
 |  | 
 | /*********************************************** | 
 |  ******** Internally used macros *************** | 
 |  ***********************************************/ | 
 |  | 
 | #define EMAC_CH_TX			1 | 
 | #define EMAC_CH_RX			0 | 
 |  | 
 | /* Each descriptor occupies 4 words, lets start RX desc's at 0 and | 
 |  * reserve space for 64 descriptors max | 
 |  */ | 
 | #define EMAC_RX_DESC_BASE		0x0 | 
 | #define EMAC_TX_DESC_BASE		0x1000 | 
 |  | 
 | /* EMAC Teardown value */ | 
 | #define EMAC_TEARDOWN_VALUE		0xfffffffc | 
 |  | 
 | /* MII Status Register */ | 
 | #define MII_STATUS_REG			1 | 
 |  | 
 | /* Number of statistics registers */ | 
 | #define EMAC_NUM_STATS			36 | 
 |  | 
 |  | 
 | /* EMAC Descriptor */ | 
 | typedef volatile struct _emac_desc | 
 | { | 
 | 	u_int32_t	next;		/* Pointer to next descriptor | 
 | 					   in chain */ | 
 | 	u_int8_t	*buffer;	/* Pointer to data buffer */ | 
 | 	u_int32_t	buff_off_len;	/* Buffer Offset(MSW) and Length(LSW) */ | 
 | 	u_int32_t	pkt_flag_len;	/* Packet Flags(MSW) and Length(LSW) */ | 
 | } emac_desc; | 
 |  | 
 | /* CPPI bit positions */ | 
 | #define EMAC_CPPI_SOP_BIT		(0x80000000) | 
 | #define EMAC_CPPI_EOP_BIT		(0x40000000) | 
 | #define EMAC_CPPI_OWNERSHIP_BIT		(0x20000000) | 
 | #define EMAC_CPPI_EOQ_BIT		(0x10000000) | 
 | #define EMAC_CPPI_TEARDOWN_COMPLETE_BIT	(0x08000000) | 
 | #define EMAC_CPPI_PASS_CRC_BIT		(0x04000000) | 
 |  | 
 | #define EMAC_CPPI_RX_ERROR_FRAME	(0x03fc0000) | 
 |  | 
 | #define EMAC_MACCONTROL_MIIEN_ENABLE		(0x20) | 
 | #define EMAC_MACCONTROL_FULLDUPLEX_ENABLE	(0x1) | 
 | #define EMAC_MACCONTROL_GIGABIT_ENABLE		(1 << 7) | 
 | #define EMAC_MACCONTROL_GIGFORCE		(1 << 17) | 
 | #define EMAC_MACCONTROL_RMIISPEED_100		(1 << 15) | 
 |  | 
 | #define EMAC_MAC_ADDR_MATCH		(1 << 19) | 
 | #define EMAC_MAC_ADDR_IS_VALID		(1 << 20) | 
 |  | 
 | #define EMAC_RXMBPENABLE_RXCAFEN_ENABLE	(0x200000) | 
 | #define EMAC_RXMBPENABLE_RXBROADEN	(0x2000) | 
 |  | 
 |  | 
 | #define MDIO_CONTROL_IDLE		(0x80000000) | 
 | #define MDIO_CONTROL_ENABLE		(0x40000000) | 
 | #define MDIO_CONTROL_FAULT_ENABLE	(0x40000) | 
 | #define MDIO_CONTROL_FAULT		(0x80000) | 
 | #define MDIO_USERACCESS0_GO		(0x80000000) | 
 | #define MDIO_USERACCESS0_WRITE_READ	(0x0) | 
 | #define MDIO_USERACCESS0_WRITE_WRITE	(0x40000000) | 
 | #define MDIO_USERACCESS0_ACK		(0x20000000) | 
 |  | 
 | /* Ethernet MAC Registers Structure */ | 
 | typedef struct  { | 
 | 	dv_reg		TXIDVER; | 
 | 	dv_reg		TXCONTROL; | 
 | 	dv_reg		TXTEARDOWN; | 
 | 	u_int8_t	RSVD0[4]; | 
 | 	dv_reg		RXIDVER; | 
 | 	dv_reg		RXCONTROL; | 
 | 	dv_reg		RXTEARDOWN; | 
 | 	u_int8_t	RSVD1[100]; | 
 | 	dv_reg		TXINTSTATRAW; | 
 | 	dv_reg		TXINTSTATMASKED; | 
 | 	dv_reg		TXINTMASKSET; | 
 | 	dv_reg		TXINTMASKCLEAR; | 
 | 	dv_reg		MACINVECTOR; | 
 | 	u_int8_t	RSVD2[12]; | 
 | 	dv_reg		RXINTSTATRAW; | 
 | 	dv_reg		RXINTSTATMASKED; | 
 | 	dv_reg		RXINTMASKSET; | 
 | 	dv_reg		RXINTMASKCLEAR; | 
 | 	dv_reg		MACINTSTATRAW; | 
 | 	dv_reg		MACINTSTATMASKED; | 
 | 	dv_reg		MACINTMASKSET; | 
 | 	dv_reg		MACINTMASKCLEAR; | 
 | 	u_int8_t	RSVD3[64]; | 
 | 	dv_reg		RXMBPENABLE; | 
 | 	dv_reg		RXUNICASTSET; | 
 | 	dv_reg		RXUNICASTCLEAR; | 
 | 	dv_reg		RXMAXLEN; | 
 | 	dv_reg		RXBUFFEROFFSET; | 
 | 	dv_reg		RXFILTERLOWTHRESH; | 
 | 	u_int8_t	RSVD4[8]; | 
 | 	dv_reg		RX0FLOWTHRESH; | 
 | 	dv_reg		RX1FLOWTHRESH; | 
 | 	dv_reg		RX2FLOWTHRESH; | 
 | 	dv_reg		RX3FLOWTHRESH; | 
 | 	dv_reg		RX4FLOWTHRESH; | 
 | 	dv_reg		RX5FLOWTHRESH; | 
 | 	dv_reg		RX6FLOWTHRESH; | 
 | 	dv_reg		RX7FLOWTHRESH; | 
 | 	dv_reg		RX0FREEBUFFER; | 
 | 	dv_reg		RX1FREEBUFFER; | 
 | 	dv_reg		RX2FREEBUFFER; | 
 | 	dv_reg		RX3FREEBUFFER; | 
 | 	dv_reg		RX4FREEBUFFER; | 
 | 	dv_reg		RX5FREEBUFFER; | 
 | 	dv_reg		RX6FREEBUFFER; | 
 | 	dv_reg		RX7FREEBUFFER; | 
 | 	dv_reg		MACCONTROL; | 
 | 	dv_reg		MACSTATUS; | 
 | 	dv_reg		EMCONTROL; | 
 | 	dv_reg		FIFOCONTROL; | 
 | 	dv_reg		MACCONFIG; | 
 | 	dv_reg		SOFTRESET; | 
 | 	u_int8_t	RSVD5[88]; | 
 | 	dv_reg		MACSRCADDRLO; | 
 | 	dv_reg		MACSRCADDRHI; | 
 | 	dv_reg		MACHASH1; | 
 | 	dv_reg		MACHASH2; | 
 | 	dv_reg		BOFFTEST; | 
 | 	dv_reg		TPACETEST; | 
 | 	dv_reg		RXPAUSE; | 
 | 	dv_reg		TXPAUSE; | 
 | 	u_int8_t	RSVD6[16]; | 
 | 	dv_reg		RXGOODFRAMES; | 
 | 	dv_reg		RXBCASTFRAMES; | 
 | 	dv_reg		RXMCASTFRAMES; | 
 | 	dv_reg		RXPAUSEFRAMES; | 
 | 	dv_reg		RXCRCERRORS; | 
 | 	dv_reg		RXALIGNCODEERRORS; | 
 | 	dv_reg		RXOVERSIZED; | 
 | 	dv_reg		RXJABBER; | 
 | 	dv_reg		RXUNDERSIZED; | 
 | 	dv_reg		RXFRAGMENTS; | 
 | 	dv_reg		RXFILTERED; | 
 | 	dv_reg		RXQOSFILTERED; | 
 | 	dv_reg		RXOCTETS; | 
 | 	dv_reg		TXGOODFRAMES; | 
 | 	dv_reg		TXBCASTFRAMES; | 
 | 	dv_reg		TXMCASTFRAMES; | 
 | 	dv_reg		TXPAUSEFRAMES; | 
 | 	dv_reg		TXDEFERRED; | 
 | 	dv_reg		TXCOLLISION; | 
 | 	dv_reg		TXSINGLECOLL; | 
 | 	dv_reg		TXMULTICOLL; | 
 | 	dv_reg		TXEXCESSIVECOLL; | 
 | 	dv_reg		TXLATECOLL; | 
 | 	dv_reg		TXUNDERRUN; | 
 | 	dv_reg		TXCARRIERSENSE; | 
 | 	dv_reg		TXOCTETS; | 
 | 	dv_reg		FRAME64; | 
 | 	dv_reg		FRAME65T127; | 
 | 	dv_reg		FRAME128T255; | 
 | 	dv_reg		FRAME256T511; | 
 | 	dv_reg		FRAME512T1023; | 
 | 	dv_reg		FRAME1024TUP; | 
 | 	dv_reg		NETOCTETS; | 
 | 	dv_reg		RXSOFOVERRUNS; | 
 | 	dv_reg		RXMOFOVERRUNS; | 
 | 	dv_reg		RXDMAOVERRUNS; | 
 | 	u_int8_t	RSVD7[624]; | 
 | 	dv_reg		MACADDRLO; | 
 | 	dv_reg		MACADDRHI; | 
 | 	dv_reg		MACINDEX; | 
 | 	u_int8_t	RSVD8[244]; | 
 | 	dv_reg		TX0HDP; | 
 | 	dv_reg		TX1HDP; | 
 | 	dv_reg		TX2HDP; | 
 | 	dv_reg		TX3HDP; | 
 | 	dv_reg		TX4HDP; | 
 | 	dv_reg		TX5HDP; | 
 | 	dv_reg		TX6HDP; | 
 | 	dv_reg		TX7HDP; | 
 | 	dv_reg		RX0HDP; | 
 | 	dv_reg		RX1HDP; | 
 | 	dv_reg		RX2HDP; | 
 | 	dv_reg		RX3HDP; | 
 | 	dv_reg		RX4HDP; | 
 | 	dv_reg		RX5HDP; | 
 | 	dv_reg		RX6HDP; | 
 | 	dv_reg		RX7HDP; | 
 | 	dv_reg		TX0CP; | 
 | 	dv_reg		TX1CP; | 
 | 	dv_reg		TX2CP; | 
 | 	dv_reg		TX3CP; | 
 | 	dv_reg		TX4CP; | 
 | 	dv_reg		TX5CP; | 
 | 	dv_reg		TX6CP; | 
 | 	dv_reg		TX7CP; | 
 | 	dv_reg		RX0CP; | 
 | 	dv_reg		RX1CP; | 
 | 	dv_reg		RX2CP; | 
 | 	dv_reg		RX3CP; | 
 | 	dv_reg		RX4CP; | 
 | 	dv_reg		RX5CP; | 
 | 	dv_reg		RX6CP; | 
 | 	dv_reg		RX7CP; | 
 | } emac_regs; | 
 |  | 
 | /* EMAC Wrapper Registers Structure */ | 
 | typedef struct  { | 
 | #ifdef DAVINCI_EMAC_VERSION2 | 
 | 	dv_reg		idver; | 
 | 	dv_reg		softrst; | 
 | 	dv_reg		emctrl; | 
 | 	dv_reg		c0rxthreshen; | 
 | 	dv_reg		c0rxen; | 
 | 	dv_reg		c0txen; | 
 | 	dv_reg		c0miscen; | 
 | 	dv_reg		c1rxthreshen; | 
 | 	dv_reg		c1rxen; | 
 | 	dv_reg		c1txen; | 
 | 	dv_reg		c1miscen; | 
 | 	dv_reg		c2rxthreshen; | 
 | 	dv_reg		c2rxen; | 
 | 	dv_reg		c2txen; | 
 | 	dv_reg		c2miscen; | 
 | 	dv_reg		c0rxthreshstat; | 
 | 	dv_reg		c0rxstat; | 
 | 	dv_reg		c0txstat; | 
 | 	dv_reg		c0miscstat; | 
 | 	dv_reg		c1rxthreshstat; | 
 | 	dv_reg		c1rxstat; | 
 | 	dv_reg		c1txstat; | 
 | 	dv_reg		c1miscstat; | 
 | 	dv_reg		c2rxthreshstat; | 
 | 	dv_reg		c2rxstat; | 
 | 	dv_reg		c2txstat; | 
 | 	dv_reg		c2miscstat; | 
 | 	dv_reg		c0rximax; | 
 | 	dv_reg		c0tximax; | 
 | 	dv_reg		c1rximax; | 
 | 	dv_reg		c1tximax; | 
 | 	dv_reg		c2rximax; | 
 | 	dv_reg		c2tximax; | 
 | #else | 
 | 	u_int8_t	RSVD0[4100]; | 
 | 	dv_reg		EWCTL; | 
 | 	dv_reg		EWINTTCNT; | 
 | #endif | 
 | } ewrap_regs; | 
 |  | 
 | /* EMAC MDIO Registers Structure */ | 
 | typedef struct  { | 
 | 	dv_reg		VERSION; | 
 | 	dv_reg		CONTROL; | 
 | 	dv_reg		ALIVE; | 
 | 	dv_reg		LINK; | 
 | 	dv_reg		LINKINTRAW; | 
 | 	dv_reg		LINKINTMASKED; | 
 | 	u_int8_t	RSVD0[8]; | 
 | 	dv_reg		USERINTRAW; | 
 | 	dv_reg		USERINTMASKED; | 
 | 	dv_reg		USERINTMASKSET; | 
 | 	dv_reg		USERINTMASKCLEAR; | 
 | 	u_int8_t	RSVD1[80]; | 
 | 	dv_reg		USERACCESS0; | 
 | 	dv_reg		USERPHYSEL0; | 
 | 	dv_reg		USERACCESS1; | 
 | 	dv_reg		USERPHYSEL1; | 
 | } mdio_regs; | 
 |  | 
 | int davinci_eth_phy_read(u_int8_t phy_addr, u_int8_t reg_num, u_int16_t *data); | 
 | int davinci_eth_phy_write(u_int8_t phy_addr, u_int8_t reg_num, u_int16_t data); | 
 |  | 
 | typedef struct { | 
 | 	char	name[64]; | 
 | 	int	(*init)(int phy_addr); | 
 | 	int	(*is_phy_connected)(int phy_addr); | 
 | 	int	(*get_link_speed)(int phy_addr); | 
 | 	int	(*auto_negotiate)(int phy_addr); | 
 | } phy_t; | 
 |  | 
 | #endif /* _DAVINCI_EMAC_H_ */ |