xref: /freebsd/sys/dev/mge/if_mgevar.h (revision 8e1dc58e8c207b41a1e9b69225d09af19cce8f14)
19f55f5f5SRafal Jaworowski /*-
29f55f5f5SRafal Jaworowski  * Copyright (C) 2008 MARVELL INTERNATIONAL LTD.
39f55f5f5SRafal Jaworowski  * All rights reserved.
49f55f5f5SRafal Jaworowski  *
59f55f5f5SRafal Jaworowski  * Developed by Semihalf.
69f55f5f5SRafal Jaworowski  *
79f55f5f5SRafal Jaworowski  * Redistribution and use in source and binary forms, with or without
89f55f5f5SRafal Jaworowski  * modification, are permitted provided that the following conditions
99f55f5f5SRafal Jaworowski  * are met:
109f55f5f5SRafal Jaworowski  * 1. Redistributions of source code must retain the above copyright
119f55f5f5SRafal Jaworowski  *    notice, this list of conditions and the following disclaimer.
129f55f5f5SRafal Jaworowski  * 2. Redistributions in binary form must reproduce the above copyright
139f55f5f5SRafal Jaworowski  *    notice, this list of conditions and the following disclaimer in the
149f55f5f5SRafal Jaworowski  *    documentation and/or other materials provided with the distribution.
159f55f5f5SRafal Jaworowski  * 3. Neither the name of MARVELL nor the names of contributors
169f55f5f5SRafal Jaworowski  *    may be used to endorse or promote products derived from this software
179f55f5f5SRafal Jaworowski  *    without specific prior written permission.
189f55f5f5SRafal Jaworowski  *
199f55f5f5SRafal Jaworowski  * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
209f55f5f5SRafal Jaworowski  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
219f55f5f5SRafal Jaworowski  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
229f55f5f5SRafal Jaworowski  * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
239f55f5f5SRafal Jaworowski  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
249f55f5f5SRafal Jaworowski  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
259f55f5f5SRafal Jaworowski  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
269f55f5f5SRafal Jaworowski  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
279f55f5f5SRafal Jaworowski  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
289f55f5f5SRafal Jaworowski  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
299f55f5f5SRafal Jaworowski  * SUCH DAMAGE.
309f55f5f5SRafal Jaworowski  *
319f55f5f5SRafal Jaworowski  * $FreeBSD$
329f55f5f5SRafal Jaworowski  */
339f55f5f5SRafal Jaworowski 
349f55f5f5SRafal Jaworowski #ifndef __IF_MGE_H__
359f55f5f5SRafal Jaworowski #define __IF_MGE_H__
369f55f5f5SRafal Jaworowski 
379f55f5f5SRafal Jaworowski #define MGE_INTR_COUNT		5	/* ETH controller occupies 5 IRQ lines */
389f55f5f5SRafal Jaworowski #define MGE_TX_DESC_NUM		256
399f55f5f5SRafal Jaworowski #define MGE_RX_DESC_NUM		256
409f55f5f5SRafal Jaworowski #define MGE_RX_QUEUE_NUM	8
419f55f5f5SRafal Jaworowski #define MGE_RX_DEFAULT_QUEUE	0
429f55f5f5SRafal Jaworowski 
439f55f5f5SRafal Jaworowski #define MGE_CHECKSUM_FEATURES	(CSUM_IP | CSUM_TCP | CSUM_UDP)
449f55f5f5SRafal Jaworowski 
459f55f5f5SRafal Jaworowski /* Interrupt Coalescing types */
469f55f5f5SRafal Jaworowski #define MGE_IC_RX		0
479f55f5f5SRafal Jaworowski #define MGE_IC_TX		1
489f55f5f5SRafal Jaworowski 
499f55f5f5SRafal Jaworowski struct mge_desc {
509f55f5f5SRafal Jaworowski 	uint32_t	cmd_status;
519f55f5f5SRafal Jaworowski 	uint16_t	buff_size;
529f55f5f5SRafal Jaworowski 	uint16_t	byte_count;
539f55f5f5SRafal Jaworowski 	bus_addr_t	buffer;
549f55f5f5SRafal Jaworowski 	bus_addr_t	next_desc;
559f55f5f5SRafal Jaworowski };
569f55f5f5SRafal Jaworowski 
579f55f5f5SRafal Jaworowski struct mge_desc_wrapper {
589f55f5f5SRafal Jaworowski 	bus_dmamap_t		desc_dmap;
599f55f5f5SRafal Jaworowski 	struct mge_desc*	mge_desc;
609f55f5f5SRafal Jaworowski 	bus_addr_t		mge_desc_paddr;
619f55f5f5SRafal Jaworowski 	bus_dmamap_t		buffer_dmap;
629f55f5f5SRafal Jaworowski 	struct mbuf*		buffer;
639f55f5f5SRafal Jaworowski };
649f55f5f5SRafal Jaworowski 
659f55f5f5SRafal Jaworowski struct mge_softc {
669f55f5f5SRafal Jaworowski 	struct ifnet	*ifp;		/* per-interface network data */
679f55f5f5SRafal Jaworowski 	device_t	dev;
689f55f5f5SRafal Jaworowski 	device_t	miibus;
699f55f5f5SRafal Jaworowski 	struct mii_data	*mii;
709f55f5f5SRafal Jaworowski 	struct resource	*res[1 + MGE_INTR_COUNT];	/* resources */
719f55f5f5SRafal Jaworowski 	void		*ih_cookie[MGE_INTR_COUNT];	/* interrupt handlers cookies */
729f55f5f5SRafal Jaworowski 	struct mtx	transmit_lock;			/* transmitter lock */
739f55f5f5SRafal Jaworowski 	struct mtx	receive_lock;			/* receiver lock */
749f55f5f5SRafal Jaworowski 
759f55f5f5SRafal Jaworowski 	uint32_t	mge_if_flags;
769f55f5f5SRafal Jaworowski 	uint32_t	mge_media_status;
779f55f5f5SRafal Jaworowski 
789f55f5f5SRafal Jaworowski 	struct callout	wd_callout;
799f55f5f5SRafal Jaworowski 	int		wd_timer;
809f55f5f5SRafal Jaworowski 
819f55f5f5SRafal Jaworowski 	bus_dma_tag_t	mge_desc_dtag;
829f55f5f5SRafal Jaworowski 	bus_dma_tag_t	mge_tx_dtag;
839f55f5f5SRafal Jaworowski 	bus_dma_tag_t	mge_rx_dtag;
849f55f5f5SRafal Jaworowski 	bus_addr_t	tx_desc_start;
859f55f5f5SRafal Jaworowski 	bus_addr_t	rx_desc_start;
869f55f5f5SRafal Jaworowski 	uint32_t	tx_desc_curr;
879f55f5f5SRafal Jaworowski 	uint32_t	rx_desc_curr;
889f55f5f5SRafal Jaworowski 	uint32_t	tx_desc_used_idx;
899f55f5f5SRafal Jaworowski 	uint32_t	tx_desc_used_count;
909f55f5f5SRafal Jaworowski 	uint32_t	rx_ic_time;
919f55f5f5SRafal Jaworowski 	uint32_t	tx_ic_time;
929f55f5f5SRafal Jaworowski 	struct mge_desc_wrapper mge_tx_desc[MGE_TX_DESC_NUM];
939f55f5f5SRafal Jaworowski 	struct mge_desc_wrapper mge_rx_desc[MGE_RX_DESC_NUM];
948e1dc58eSRafal Jaworowski 
958e1dc58eSRafal Jaworowski 	uint32_t	mge_tfut_ipg_max;		/* TX FIFO Urgent Threshold */
968e1dc58eSRafal Jaworowski 	uint32_t	mge_rx_ipg_max;
978e1dc58eSRafal Jaworowski 	uint32_t	mge_tx_arb_cfg;
988e1dc58eSRafal Jaworowski 	uint32_t	mge_tx_tok_cfg;
998e1dc58eSRafal Jaworowski 	uint32_t	mge_tx_tok_cnt;
1008e1dc58eSRafal Jaworowski 	uint16_t	mge_mtu;
1018e1dc58eSRafal Jaworowski 	int		mge_ver;
1029f55f5f5SRafal Jaworowski };
1039f55f5f5SRafal Jaworowski 
1049f55f5f5SRafal Jaworowski 
1059f55f5f5SRafal Jaworowski /* bus access macros */
1069f55f5f5SRafal Jaworowski #define MGE_READ(sc,reg)	bus_read_4((sc)->res[0], (reg))
1079f55f5f5SRafal Jaworowski #define MGE_WRITE(sc,reg,val)	bus_write_4((sc)->res[0], (reg), (val))
1089f55f5f5SRafal Jaworowski 
1099f55f5f5SRafal Jaworowski /* Locking macros */
1109f55f5f5SRafal Jaworowski #define MGE_TRANSMIT_LOCK(sc) do {						\
1119f55f5f5SRafal Jaworowski 			mtx_assert(&(sc)->receive_lock, MA_NOTOWNED);		\
1129f55f5f5SRafal Jaworowski 			mtx_lock(&(sc)->transmit_lock);				\
1139f55f5f5SRafal Jaworowski } while (0)
1149f55f5f5SRafal Jaworowski 
1159f55f5f5SRafal Jaworowski #define MGE_TRANSMIT_UNLOCK(sc)		mtx_unlock(&(sc)->transmit_lock)
1169f55f5f5SRafal Jaworowski #define MGE_TRANSMIT_LOCK_ASSERT(sc)	mtx_assert(&(sc)->transmit_lock, MA_OWNED)
1179f55f5f5SRafal Jaworowski 
1189f55f5f5SRafal Jaworowski #define MGE_RECEIVE_LOCK(sc) do {						\
1199f55f5f5SRafal Jaworowski 			mtx_assert(&(sc)->transmit_lock, MA_NOTOWNED);		\
1209f55f5f5SRafal Jaworowski 			mtx_lock(&(sc)->receive_lock);				\
1219f55f5f5SRafal Jaworowski } while (0)
1229f55f5f5SRafal Jaworowski 
1239f55f5f5SRafal Jaworowski #define MGE_RECEIVE_UNLOCK(sc)		mtx_unlock(&(sc)->receive_lock)
1249f55f5f5SRafal Jaworowski #define MGE_RECEIVE_LOCK_ASSERT(sc)	mtx_assert(&(sc)->receive_lock, MA_OWNED)
1259f55f5f5SRafal Jaworowski 
1269f55f5f5SRafal Jaworowski #define MGE_GLOBAL_LOCK(sc) do {						\
1279f55f5f5SRafal Jaworowski 			if ((mtx_owned(&(sc)->transmit_lock) ? 1 : 0) !=	\
1289f55f5f5SRafal Jaworowski 			    (mtx_owned(&(sc)->receive_lock) ? 1 : 0)) {		\
1299f55f5f5SRafal Jaworowski 				panic("mge deadlock possibility detection!");	\
1309f55f5f5SRafal Jaworowski 			}							\
1319f55f5f5SRafal Jaworowski 			mtx_lock(&(sc)->transmit_lock);				\
1329f55f5f5SRafal Jaworowski 			mtx_lock(&(sc)->receive_lock);				\
1339f55f5f5SRafal Jaworowski } while (0)
1349f55f5f5SRafal Jaworowski 
1359f55f5f5SRafal Jaworowski #define MGE_GLOBAL_UNLOCK(sc) do {						\
1369f55f5f5SRafal Jaworowski 			MGE_RECEIVE_UNLOCK(sc);					\
1379f55f5f5SRafal Jaworowski 			MGE_TRANSMIT_UNLOCK(sc);				\
1389f55f5f5SRafal Jaworowski } while (0)
1399f55f5f5SRafal Jaworowski 
1409f55f5f5SRafal Jaworowski #define MGE_GLOBAL_LOCK_ASSERT(sc) do {						\
1419f55f5f5SRafal Jaworowski 			MGE_TRANSMIT_LOCK_ASSERT(sc);				\
1429f55f5f5SRafal Jaworowski 			MGE_RECEIVE_LOCK_ASSERT(sc); 				\
1439f55f5f5SRafal Jaworowski } while (0)
1449f55f5f5SRafal Jaworowski 
1459f55f5f5SRafal Jaworowski /* SMI-related macros */
1469f55f5f5SRafal Jaworowski #define MGE_REG_PHYDEV		0x000
1479f55f5f5SRafal Jaworowski #define MGE_REG_SMI		0x004
1489f55f5f5SRafal Jaworowski #define MGE_SMI_READ		(1 << 26)
1499f55f5f5SRafal Jaworowski #define MGE_SMI_WRITE		(0 << 26)
1509f55f5f5SRafal Jaworowski #define MGE_SMI_READVALID	(1 << 27)
1519f55f5f5SRafal Jaworowski #define MGE_SMI_BUSY		(1 << 28)
1529f55f5f5SRafal Jaworowski 
1539f55f5f5SRafal Jaworowski /* TODO verify the timings and retries count w/specs */
1549f55f5f5SRafal Jaworowski #define MGE_SMI_READ_RETRIES		1000
1559f55f5f5SRafal Jaworowski #define MGE_SMI_READ_DELAY		100
1569f55f5f5SRafal Jaworowski #define MGE_SMI_WRITE_RETRIES		1000
1579f55f5f5SRafal Jaworowski #define MGE_SMI_WRITE_DELAY		100
1589f55f5f5SRafal Jaworowski 
1599f55f5f5SRafal Jaworowski /* MGE registers */
1609f55f5f5SRafal Jaworowski #define MGE_INT_CAUSE		0x080
1619f55f5f5SRafal Jaworowski #define MGE_INT_MASK		0x084
1629f55f5f5SRafal Jaworowski 
1639f55f5f5SRafal Jaworowski #define MGE_PORT_CONFIG			0x400
1649f55f5f5SRafal Jaworowski #define PORT_CONFIG_UPM			(1 << 0)		/* promiscuous */
1659f55f5f5SRafal Jaworowski #define PORT_CONFIG_DFLT_RXQ(val)	(((val) & 7) << 1)	/* default RX queue */
1669f55f5f5SRafal Jaworowski #define PORT_CONFIG_ARO_RXQ(val)	(((val) & 7) << 4)	/* ARP RX queue */
1679f55f5f5SRafal Jaworowski #define PORT_CONFIG_REJECT_BCAST	(1 << 7) /* reject non-ip and non-arp bcast */
1689f55f5f5SRafal Jaworowski #define PORT_CONFIG_REJECT_IP_BCAST	(1 << 8) /* reject ip bcast */
1699f55f5f5SRafal Jaworowski #define PORT_CONFIG_REJECT_ARP__BCAST	(1 << 9) /* reject arp bcast */
1709f55f5f5SRafal Jaworowski #define PORT_CONFIG_AMNoTxES		(1 << 12) /* Automatic mode not updating Error Summary in Tx descriptor */
1719f55f5f5SRafal Jaworowski #define PORT_CONFIG_TCP_CAP		(1 << 14) /* capture tcp to a different queue */
1729f55f5f5SRafal Jaworowski #define PORT_CONFIG_UDP_CAP		(1 << 15) /* capture udp to a different queue */
1739f55f5f5SRafal Jaworowski #define PORT_CONFIG_TCPQ		(7 << 16) /* queue to capture tcp */
1749f55f5f5SRafal Jaworowski #define PORT_CONFIG_UDPQ		(7 << 19) /* queue to capture udp */
1759f55f5f5SRafal Jaworowski #define PORT_CONFIG_BPDUQ		(7 << 22) /* queue to capture bpdu */
1769f55f5f5SRafal Jaworowski #define PORT_CONFIG_RXCS		(1 << 25) /* calculation Rx TCP checksum include pseudo header */
1779f55f5f5SRafal Jaworowski 
1789f55f5f5SRafal Jaworowski #define MGE_PORT_EXT_CONFIG	0x404
1799f55f5f5SRafal Jaworowski #define MGE_MAC_ADDR_L		0x414
1809f55f5f5SRafal Jaworowski #define MGE_MAC_ADDR_H		0x418
1819f55f5f5SRafal Jaworowski 
1829f55f5f5SRafal Jaworowski #define MGE_SDMA_CONFIG			0x41c
1839f55f5f5SRafal Jaworowski #define MGE_SDMA_INT_ON_FRAME_BOUND	(1 << 0)
1849f55f5f5SRafal Jaworowski #define MGE_SDMA_RX_BURST_SIZE(val)	(((val) & 7) << 1)
1859f55f5f5SRafal Jaworowski #define MGE_SDMA_TX_BURST_SIZE(val)	(((val) & 7) << 22)
1869f55f5f5SRafal Jaworowski #define MGE_SDMA_BURST_1_WORD		0x0
1879f55f5f5SRafal Jaworowski #define MGE_SDMA_BURST_2_WORD		0x1
1889f55f5f5SRafal Jaworowski #define MGE_SDMA_BURST_4_WORD		0x2
1899f55f5f5SRafal Jaworowski #define MGE_SDMA_BURST_8_WORD		0x3
1909f55f5f5SRafal Jaworowski #define MGE_SDMA_BURST_16_WORD		0x4
1919f55f5f5SRafal Jaworowski #define MGE_SDMA_RX_BYTE_SWAP		(1 << 4)
1929f55f5f5SRafal Jaworowski #define MGE_SDMA_TX_BYTE_SWAP		(1 << 5)
1939f55f5f5SRafal Jaworowski #define MGE_SDMA_DESC_SWAP_MODE		(1 << 6)
1949f55f5f5SRafal Jaworowski 
1959f55f5f5SRafal Jaworowski #define MGE_PORT_SERIAL_CTRL		0x43c
1969f55f5f5SRafal Jaworowski #define PORT_SERIAL_ENABLE		(1 << 0) /* serial port enable */
1979f55f5f5SRafal Jaworowski #define PORT_SERIAL_FORCE_LINKUP	(1 << 1) /* force link status to up */
1989f55f5f5SRafal Jaworowski #define PORT_SERIAL_AUTONEG		(1 << 2) /* enable autoneg for duplex mode */
1999f55f5f5SRafal Jaworowski #define PORT_SERIAL_AUTONEG_FC		(1 << 3) /* enable autoneg for FC */
2009f55f5f5SRafal Jaworowski #define PORT_SERIAL_PAUSE_ADV		(1 << 4) /* advertise symmetric FC in autoneg */
2019f55f5f5SRafal Jaworowski #define PORT_SERIAL_FORCE_FC(val)	(((val) & 3) << 5) /* pause enable & disable frames conf */
2029f55f5f5SRafal Jaworowski #define PORT_SERIAL_NO_PAUSE_DIS	0x00
2039f55f5f5SRafal Jaworowski #define PORT_SERIAL_PAUSE_DIS		0x01
2049f55f5f5SRafal Jaworowski #define PORT_SERIAL_FORCE_BP(val)	(((val) & 3) << 7) /* transmitting JAM configuration */
2059f55f5f5SRafal Jaworowski #define PORT_SERIAL_NO_JAM		0x00
2069f55f5f5SRafal Jaworowski #define PORT_SERIAL_JAM			0x01
2079f55f5f5SRafal Jaworowski #define PORT_SERIAL_RES_BIT9		(1 << 9)
2089f55f5f5SRafal Jaworowski #define PORT_SERIAL_FORCE_LINK_FAIL	(1 << 10)
2099f55f5f5SRafal Jaworowski #define PORT_SERIAL_SPEED_AUTONEG	(1 << 13)
2109f55f5f5SRafal Jaworowski #define PORT_SERIAL_FORCE_DTE_ADV	(1 << 14)
2119f55f5f5SRafal Jaworowski #define PORT_SERIAL_MRU(val)		(((val) & 7) << 17)
2129f55f5f5SRafal Jaworowski #define PORT_SERIAL_MRU_1518		0x0
2139f55f5f5SRafal Jaworowski #define PORT_SERIAL_MRU_1522		0x1
2149f55f5f5SRafal Jaworowski #define PORT_SERIAL_MRU_1552		0x2
2159f55f5f5SRafal Jaworowski #define PORT_SERIAL_MRU_9022		0x3
2169f55f5f5SRafal Jaworowski #define PORT_SERIAL_MRU_9192		0x4
2179f55f5f5SRafal Jaworowski #define PORT_SERIAL_MRU_9700		0x5
2189f55f5f5SRafal Jaworowski #define PORT_SERIAL_FULL_DUPLEX		(1 << 21)
2199f55f5f5SRafal Jaworowski #define PORT_SERIAL_FULL_DUPLEX_FC	(1 << 22)
2209f55f5f5SRafal Jaworowski #define PORT_SERIAL_GMII_SPEED_1000	(1 << 23)
2219f55f5f5SRafal Jaworowski #define PORT_SERIAL_MII_SPEED_100	(1 << 24)
2229f55f5f5SRafal Jaworowski 
2239f55f5f5SRafal Jaworowski #define MGE_PORT_STATUS			0x444
2249f55f5f5SRafal Jaworowski #define MGE_STATUS_LINKUP		(1 << 1)
2259f55f5f5SRafal Jaworowski #define MGE_STATUS_FULL_DUPLEX		(1 << 2)
2269f55f5f5SRafal Jaworowski #define MGE_STATUS_FLOW_CONTROL		(1 << 3)
2279f55f5f5SRafal Jaworowski #define MGE_STATUS_1000MB		(1 << 4)
2289f55f5f5SRafal Jaworowski #define MGE_STATUS_100MB		(1 << 5)
2299f55f5f5SRafal Jaworowski #define MGE_STATUS_TX_IN_PROG		(1 << 7)
2309f55f5f5SRafal Jaworowski #define MGE_STATUS_TX_FIFO_EMPTY	(1 << 10)
2319f55f5f5SRafal Jaworowski 
2329f55f5f5SRafal Jaworowski #define MGE_TX_QUEUE_CMD	0x448
2339f55f5f5SRafal Jaworowski #define MGE_ENABLE_TXQ		(1 << 0)
2349f55f5f5SRafal Jaworowski #define MGE_DISABLE_TXQ		(1 << 8)
2359f55f5f5SRafal Jaworowski 
2369f55f5f5SRafal Jaworowski /* 88F6281 only */
2379f55f5f5SRafal Jaworowski #define MGE_PORT_SERIAL_CTRL1		0x44c
2389f55f5f5SRafal Jaworowski #define MGE_PCS_LOOPBACK		(1 << 1)
2399f55f5f5SRafal Jaworowski #define MGE_RGMII_EN			(1 << 3)
2409f55f5f5SRafal Jaworowski #define MGE_PORT_RESET			(1 << 4)
2419f55f5f5SRafal Jaworowski #define MGE_CLK125_BYPASS		(1 << 5)
2429f55f5f5SRafal Jaworowski #define MGE_INBAND_AUTONEG		(1 << 6)
2439f55f5f5SRafal Jaworowski #define MGE_INBAND_AUTONEG_BYPASS	(1 << 6)
2449f55f5f5SRafal Jaworowski #define MGE_INBAND_AUTONEG_RESTART	(1 << 7)
2459f55f5f5SRafal Jaworowski #define MGE_1000BASEX			(1 << 11)
2469f55f5f5SRafal Jaworowski #define MGE_BP_COLLISION_COUNT		(1 << 15)
2479f55f5f5SRafal Jaworowski #define MGE_COLLISION_LIMIT(val)	(((val) & 0x3f) << 16)
2489f55f5f5SRafal Jaworowski #define MGE_DROP_ODD_PREAMBLE		(1 << 22)
2499f55f5f5SRafal Jaworowski 
2509f55f5f5SRafal Jaworowski #define MGE_PORT_INT_CAUSE	0x460
2519f55f5f5SRafal Jaworowski #define MGE_PORT_INT_MASK	0x468
2529f55f5f5SRafal Jaworowski #define MGE_PORT_INT_RX		(1 << 0)
2539f55f5f5SRafal Jaworowski #define MGE_PORT_INT_EXTEND	(1 << 1)
2549f55f5f5SRafal Jaworowski #define MGE_PORT_INT_RXQ0	(1 << 2)
2559f55f5f5SRafal Jaworowski #define MGE_PORT_INT_RXERR	(1 << 10)
2569f55f5f5SRafal Jaworowski #define MGE_PORT_INT_RXERRQ0	(1 << 11)
2579f55f5f5SRafal Jaworowski #define MGE_PORT_INT_SUM	(1 << 31)
2589f55f5f5SRafal Jaworowski 
2599f55f5f5SRafal Jaworowski #define MGE_PORT_INT_CAUSE_EXT	0x464
2609f55f5f5SRafal Jaworowski #define MGE_PORT_INT_MASK_EXT	0x46C
2619f55f5f5SRafal Jaworowski #define MGE_PORT_INT_EXT_TXBUF0	(1 << 0)
2629f55f5f5SRafal Jaworowski #define MGE_PORT_INT_EXT_TXERR0	(1 << 8)
2639f55f5f5SRafal Jaworowski #define MGE_PORT_INT_EXT_PHYSC	(1 << 16)
2649f55f5f5SRafal Jaworowski #define MGE_PORT_INT_EXT_RXOR	(1 << 18)
2659f55f5f5SRafal Jaworowski #define MGE_PORT_INT_EXT_TXUR	(1 << 19)
2669f55f5f5SRafal Jaworowski #define MGE_PORT_INT_EXT_LC	(1 << 20)
2679f55f5f5SRafal Jaworowski #define MGE_PORT_INT_EXT_IAR	(1 << 23)
2689f55f5f5SRafal Jaworowski #define MGE_PORT_INT_EXT_SUM	(1 << 31)
2699f55f5f5SRafal Jaworowski 
2709f55f5f5SRafal Jaworowski #define MGE_RX_FIFO_URGENT_TRSH		0x470
2719f55f5f5SRafal Jaworowski #define MGE_TX_FIFO_URGENT_TRSH		0x474
2729f55f5f5SRafal Jaworowski 
2739f55f5f5SRafal Jaworowski #define MGE_FIXED_PRIO_CONF		0x4dc
2749f55f5f5SRafal Jaworowski #define MGE_FIXED_PRIO_EN(q)		(1 << (q))
2759f55f5f5SRafal Jaworowski 
2769f55f5f5SRafal Jaworowski #define MGE_RX_CUR_DESC_PTR(q)		(0x60c + ((q)<<4))
2779f55f5f5SRafal Jaworowski 
2789f55f5f5SRafal Jaworowski #define MGE_RX_QUEUE_CMD		0x680
2799f55f5f5SRafal Jaworowski #define MGE_ENABLE_RXQ(q)		(1 << ((q) & 0x7))
2809f55f5f5SRafal Jaworowski #define MGE_ENABLE_RXQ_ALL		(0xff)
2819f55f5f5SRafal Jaworowski #define MGE_DISABLE_RXQ(q)		(1 << (((q) & 0x7) + 8))
2829f55f5f5SRafal Jaworowski #define MGE_DISABLE_RXQ_ALL		(0xff00)
2839f55f5f5SRafal Jaworowski 
2849f55f5f5SRafal Jaworowski #define MGE_TX_CUR_DESC_PTR		0x6c0
2859f55f5f5SRafal Jaworowski 
2869f55f5f5SRafal Jaworowski #define MGE_TX_TOKEN_COUNT(q)		(0x700 + ((q)<<4))
2879f55f5f5SRafal Jaworowski #define MGE_TX_TOKEN_CONF(q)		(0x704 + ((q)<<4))
2889f55f5f5SRafal Jaworowski #define MGE_TX_ARBITER_CONF(q)		(0x704 + ((q)<<4))
2899f55f5f5SRafal Jaworowski 
2909f55f5f5SRafal Jaworowski #define MGE_MCAST_REG_NUMBER		64
2919f55f5f5SRafal Jaworowski #define MGE_DA_FILTER_SPEC_MCAST(i)	(0x1400 + ((i) << 2))
2929f55f5f5SRafal Jaworowski #define MGE_DA_FILTER_OTH_MCAST(i)	(0x1500 + ((i) << 2))
2939f55f5f5SRafal Jaworowski 
2949f55f5f5SRafal Jaworowski #define MGE_UCAST_REG_NUMBER		4
2959f55f5f5SRafal Jaworowski #define MGE_DA_FILTER_UCAST(i)		(0x1600 + ((i) << 2))
2969f55f5f5SRafal Jaworowski 
2979f55f5f5SRafal Jaworowski 
2989f55f5f5SRafal Jaworowski /* TX descriptor bits */
2999f55f5f5SRafal Jaworowski #define MGE_TX_LLC_SNAP		(1 << 9)
3009f55f5f5SRafal Jaworowski #define MGE_TX_NOT_FRAGMENT	(1 << 10)
3019f55f5f5SRafal Jaworowski #define MGE_TX_VLAN_TAGGED	(1 << 15)
3029f55f5f5SRafal Jaworowski #define MGE_TX_UDP		(1 << 16)
3039f55f5f5SRafal Jaworowski #define MGE_TX_GEN_L4_CSUM	(1 << 17)
3049f55f5f5SRafal Jaworowski #define MGE_TX_GEN_IP_CSUM	(1 << 18)
3059f55f5f5SRafal Jaworowski #define MGE_TX_PADDING		(1 << 19)
3069f55f5f5SRafal Jaworowski #define MGE_TX_LAST		(1 << 20)
3079f55f5f5SRafal Jaworowski #define MGE_TX_FIRST		(1 << 21)
3089f55f5f5SRafal Jaworowski #define MGE_TX_ETH_CRC		(1 << 22)
3099f55f5f5SRafal Jaworowski #define MGE_TX_EN_INT		(1 << 23)
3109f55f5f5SRafal Jaworowski 
3119f55f5f5SRafal Jaworowski #define MGE_TX_IP_HDR_SIZE(size)	((size << 11) & 0xFFFF)
3129f55f5f5SRafal Jaworowski 
3139f55f5f5SRafal Jaworowski /* RX descriptor bits */
3149f55f5f5SRafal Jaworowski #define MGE_ERR_SUMMARY		(1 << 0)
3159f55f5f5SRafal Jaworowski #define MGE_ERR_MASK		(3 << 1)
3169f55f5f5SRafal Jaworowski #define MGE_RX_L4_PROTO_MASK	(3 << 21)
3179f55f5f5SRafal Jaworowski #define MGE_RX_L4_PROTO_TCP	(0 << 21)
3189f55f5f5SRafal Jaworowski #define MGE_RX_L4_PROTO_UDP	(1 << 21)
3199f55f5f5SRafal Jaworowski #define MGE_RX_L3_IS_IP		(1 << 24)
3209f55f5f5SRafal Jaworowski #define MGE_RX_IP_OK		(1 << 25)
3219f55f5f5SRafal Jaworowski #define MGE_RX_DESC_LAST	(1 << 26)
3229f55f5f5SRafal Jaworowski #define MGE_RX_DESC_FIRST	(1 << 27)
3239f55f5f5SRafal Jaworowski #define MGE_RX_ENABLE_INT	(1 << 29)
3249f55f5f5SRafal Jaworowski #define MGE_RX_L4_CSUM_OK	(1 << 30)
3259f55f5f5SRafal Jaworowski #define MGE_DMA_OWNED		(1 << 31)
3269f55f5f5SRafal Jaworowski 
3279f55f5f5SRafal Jaworowski #define MGE_RX_IP_FRAGMENT	(1 << 2)
3289f55f5f5SRafal Jaworowski 
3299f55f5f5SRafal Jaworowski #define MGE_RX_L4_IS_TCP(status)	((status & MGE_RX_L4_PROTO_MASK) \
3309f55f5f5SRafal Jaworowski 					    == MGE_RX_L4_PROTO_TCP)
3319f55f5f5SRafal Jaworowski 
3329f55f5f5SRafal Jaworowski #define MGE_RX_L4_IS_UDP(status)	((status & MGE_RX_L4_PROTO_MASK) \
3339f55f5f5SRafal Jaworowski 					    == MGE_RX_L4_PROTO_UDP)
3349f55f5f5SRafal Jaworowski 
3359f55f5f5SRafal Jaworowski /* TX error codes */
3369f55f5f5SRafal Jaworowski #define MGE_TX_ERROR_LC		(0 << 1)	/* Late collision */
3379f55f5f5SRafal Jaworowski #define MGE_TX_ERROR_UR		(1 << 1)	/* Underrun error */
3389f55f5f5SRafal Jaworowski #define MGE_TX_ERROR_RL		(2 << 1)	/* Excessive collision */
3399f55f5f5SRafal Jaworowski 
3409f55f5f5SRafal Jaworowski /* RX error codes */
3419f55f5f5SRafal Jaworowski #define MGE_RX_ERROR_CE		(0 << 1)	/* CRC error */
3429f55f5f5SRafal Jaworowski #define MGE_RX_ERROR_OR		(1 << 1)	/* Overrun error */
3439f55f5f5SRafal Jaworowski #define MGE_RX_ERROR_MF		(2 << 1)	/* Max frame lenght error */
3449f55f5f5SRafal Jaworowski #define MGE_RX_ERROR_RE		(3 << 1)	/* Resource error */
3459f55f5f5SRafal Jaworowski 
3469f55f5f5SRafal Jaworowski #endif /* __IF_MGE_H__ */
347