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