if_mgevar.h revision 183867
1183867Sraj/*-
2183867Sraj * Copyright (C) 2008 MARVELL INTERNATIONAL LTD.
3183867Sraj * All rights reserved.
4183867Sraj *
5183867Sraj * Developed by Semihalf.
6183867Sraj *
7183867Sraj * Redistribution and use in source and binary forms, with or without
8183867Sraj * modification, are permitted provided that the following conditions
9183867Sraj * are met:
10183867Sraj * 1. Redistributions of source code must retain the above copyright
11183867Sraj *    notice, this list of conditions and the following disclaimer.
12183867Sraj * 2. Redistributions in binary form must reproduce the above copyright
13183867Sraj *    notice, this list of conditions and the following disclaimer in the
14183867Sraj *    documentation and/or other materials provided with the distribution.
15183867Sraj * 3. Neither the name of MARVELL nor the names of contributors
16183867Sraj *    may be used to endorse or promote products derived from this software
17183867Sraj *    without specific prior written permission.
18183867Sraj *
19183867Sraj * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20183867Sraj * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21183867Sraj * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22183867Sraj * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
23183867Sraj * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24183867Sraj * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25183867Sraj * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26183867Sraj * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27183867Sraj * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28183867Sraj * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29183867Sraj * SUCH DAMAGE.
30183867Sraj *
31183867Sraj * $FreeBSD: head/sys/dev/mge/if_mgevar.h 183867 2008-10-14 07:24:18Z raj $
32183867Sraj */
33183867Sraj
34183867Sraj#ifndef __IF_MGE_H__
35183867Sraj#define __IF_MGE_H__
36183867Sraj
37183867Sraj#define MGE_INTR_COUNT		5	/* ETH controller occupies 5 IRQ lines */
38183867Sraj#define MGE_TX_DESC_NUM		256
39183867Sraj#define MGE_RX_DESC_NUM		256
40183867Sraj#define MGE_RX_QUEUE_NUM	8
41183867Sraj#define MGE_RX_DEFAULT_QUEUE	0
42183867Sraj
43183867Sraj#define MGE_CHECKSUM_FEATURES	(CSUM_IP | CSUM_TCP | CSUM_UDP)
44183867Sraj
45183867Sraj/* Interrupt Coalescing types */
46183867Sraj#define MGE_IC_RX		0
47183867Sraj#define MGE_IC_TX		1
48183867Sraj
49183867Srajstruct mge_desc {
50183867Sraj	uint32_t	cmd_status;
51183867Sraj	uint16_t	buff_size;
52183867Sraj	uint16_t	byte_count;
53183867Sraj	bus_addr_t	buffer;
54183867Sraj	bus_addr_t	next_desc;
55183867Sraj};
56183867Sraj
57183867Srajstruct mge_desc_wrapper {
58183867Sraj	bus_dmamap_t		desc_dmap;
59183867Sraj	struct mge_desc*	mge_desc;
60183867Sraj	bus_addr_t		mge_desc_paddr;
61183867Sraj	bus_dmamap_t		buffer_dmap;
62183867Sraj	struct mbuf*		buffer;
63183867Sraj};
64183867Sraj
65183867Srajstruct mge_softc {
66183867Sraj	struct ifnet	*ifp;		/* per-interface network data */
67183867Sraj	device_t	dev;
68183867Sraj	device_t	miibus;
69183867Sraj	struct mii_data	*mii;
70183867Sraj	struct resource	*res[1 + MGE_INTR_COUNT];	/* resources */
71183867Sraj	void		*ih_cookie[MGE_INTR_COUNT];	/* interrupt handlers cookies */
72183867Sraj	struct mtx	transmit_lock;			/* transmitter lock */
73183867Sraj	struct mtx	receive_lock;			/* receiver lock */
74183867Sraj
75183867Sraj	uint32_t	mge_if_flags;
76183867Sraj	uint32_t	mge_media_status;
77183867Sraj
78183867Sraj	struct callout	wd_callout;
79183867Sraj	int		wd_timer;
80183867Sraj
81183867Sraj	bus_dma_tag_t	mge_desc_dtag;
82183867Sraj	bus_dma_tag_t	mge_tx_dtag;
83183867Sraj	bus_dma_tag_t	mge_rx_dtag;
84183867Sraj	bus_addr_t	tx_desc_start;
85183867Sraj	bus_addr_t	rx_desc_start;
86183867Sraj	uint32_t	tx_desc_curr;
87183867Sraj	uint32_t	rx_desc_curr;
88183867Sraj	uint32_t	tx_desc_used_idx;
89183867Sraj	uint32_t	tx_desc_used_count;
90183867Sraj	uint32_t	rx_ic_time;
91183867Sraj	uint32_t	tx_ic_time;
92183867Sraj	struct mge_desc_wrapper mge_tx_desc[MGE_TX_DESC_NUM];
93183867Sraj	struct mge_desc_wrapper mge_rx_desc[MGE_RX_DESC_NUM];
94183867Sraj};
95183867Sraj
96183867Sraj
97183867Sraj/* bus access macros */
98183867Sraj#define MGE_READ(sc,reg)	bus_read_4((sc)->res[0], (reg))
99183867Sraj#define MGE_WRITE(sc,reg,val)	bus_write_4((sc)->res[0], (reg), (val))
100183867Sraj
101183867Sraj/* Locking macros */
102183867Sraj#define MGE_TRANSMIT_LOCK(sc) do {						\
103183867Sraj			mtx_assert(&(sc)->receive_lock, MA_NOTOWNED);		\
104183867Sraj			mtx_lock(&(sc)->transmit_lock);				\
105183867Sraj} while (0)
106183867Sraj
107183867Sraj#define MGE_TRANSMIT_UNLOCK(sc)		mtx_unlock(&(sc)->transmit_lock)
108183867Sraj#define MGE_TRANSMIT_LOCK_ASSERT(sc)	mtx_assert(&(sc)->transmit_lock, MA_OWNED)
109183867Sraj
110183867Sraj#define MGE_RECEIVE_LOCK(sc) do {						\
111183867Sraj			mtx_assert(&(sc)->transmit_lock, MA_NOTOWNED);		\
112183867Sraj			mtx_lock(&(sc)->receive_lock);				\
113183867Sraj} while (0)
114183867Sraj
115183867Sraj#define MGE_RECEIVE_UNLOCK(sc)		mtx_unlock(&(sc)->receive_lock)
116183867Sraj#define MGE_RECEIVE_LOCK_ASSERT(sc)	mtx_assert(&(sc)->receive_lock, MA_OWNED)
117183867Sraj
118183867Sraj#define MGE_GLOBAL_LOCK(sc) do {						\
119183867Sraj			if ((mtx_owned(&(sc)->transmit_lock) ? 1 : 0) !=	\
120183867Sraj			    (mtx_owned(&(sc)->receive_lock) ? 1 : 0)) {		\
121183867Sraj				panic("mge deadlock possibility detection!");	\
122183867Sraj			}							\
123183867Sraj			mtx_lock(&(sc)->transmit_lock);				\
124183867Sraj			mtx_lock(&(sc)->receive_lock);				\
125183867Sraj} while (0)
126183867Sraj
127183867Sraj#define MGE_GLOBAL_UNLOCK(sc) do {						\
128183867Sraj			MGE_RECEIVE_UNLOCK(sc);					\
129183867Sraj			MGE_TRANSMIT_UNLOCK(sc);				\
130183867Sraj} while (0)
131183867Sraj
132183867Sraj#define MGE_GLOBAL_LOCK_ASSERT(sc) do {						\
133183867Sraj			MGE_TRANSMIT_LOCK_ASSERT(sc);				\
134183867Sraj			MGE_RECEIVE_LOCK_ASSERT(sc); 				\
135183867Sraj} while (0)
136183867Sraj
137183867Sraj/* SMI-related macros */
138183867Sraj#define MGE_REG_PHYDEV		0x000
139183867Sraj#define MGE_REG_SMI		0x004
140183867Sraj#define MGE_SMI_READ		(1 << 26)
141183867Sraj#define MGE_SMI_WRITE		(0 << 26)
142183867Sraj#define MGE_SMI_READVALID	(1 << 27)
143183867Sraj#define MGE_SMI_BUSY		(1 << 28)
144183867Sraj
145183867Sraj/* TODO verify the timings and retries count w/specs */
146183867Sraj#define MGE_SMI_READ_RETRIES		1000
147183867Sraj#define MGE_SMI_READ_DELAY		100
148183867Sraj#define MGE_SMI_WRITE_RETRIES		1000
149183867Sraj#define MGE_SMI_WRITE_DELAY		100
150183867Sraj
151183867Sraj/* MGE registers */
152183867Sraj#define MGE_INT_CAUSE		0x080
153183867Sraj#define MGE_INT_MASK		0x084
154183867Sraj
155183867Sraj#define MGE_PORT_CONFIG			0x400
156183867Sraj#define PORT_CONFIG_UPM			(1 << 0)		/* promiscuous */
157183867Sraj#define PORT_CONFIG_DFLT_RXQ(val)	(((val) & 7) << 1)	/* default RX queue */
158183867Sraj#define PORT_CONFIG_ARO_RXQ(val)	(((val) & 7) << 4)	/* ARP RX queue */
159183867Sraj#define PORT_CONFIG_REJECT_BCAST	(1 << 7) /* reject non-ip and non-arp bcast */
160183867Sraj#define PORT_CONFIG_REJECT_IP_BCAST	(1 << 8) /* reject ip bcast */
161183867Sraj#define PORT_CONFIG_REJECT_ARP__BCAST	(1 << 9) /* reject arp bcast */
162183867Sraj#define PORT_CONFIG_AMNoTxES		(1 << 12) /* Automatic mode not updating Error Summary in Tx descriptor */
163183867Sraj#define PORT_CONFIG_TCP_CAP		(1 << 14) /* capture tcp to a different queue */
164183867Sraj#define PORT_CONFIG_UDP_CAP		(1 << 15) /* capture udp to a different queue */
165183867Sraj#define PORT_CONFIG_TCPQ		(7 << 16) /* queue to capture tcp */
166183867Sraj#define PORT_CONFIG_UDPQ		(7 << 19) /* queue to capture udp */
167183867Sraj#define PORT_CONFIG_BPDUQ		(7 << 22) /* queue to capture bpdu */
168183867Sraj#define PORT_CONFIG_RXCS		(1 << 25) /* calculation Rx TCP checksum include pseudo header */
169183867Sraj
170183867Sraj#define MGE_PORT_EXT_CONFIG	0x404
171183867Sraj#define MGE_MAC_ADDR_L		0x414
172183867Sraj#define MGE_MAC_ADDR_H		0x418
173183867Sraj
174183867Sraj#define MGE_SDMA_CONFIG			0x41c
175183867Sraj#define MGE_SDMA_INT_ON_FRAME_BOUND	(1 << 0)
176183867Sraj#define MGE_SDMA_RX_BURST_SIZE(val)	(((val) & 7) << 1)
177183867Sraj#define MGE_SDMA_TX_BURST_SIZE(val)	(((val) & 7) << 22)
178183867Sraj#define MGE_SDMA_BURST_1_WORD		0x0
179183867Sraj#define MGE_SDMA_BURST_2_WORD		0x1
180183867Sraj#define MGE_SDMA_BURST_4_WORD		0x2
181183867Sraj#define MGE_SDMA_BURST_8_WORD		0x3
182183867Sraj#define MGE_SDMA_BURST_16_WORD		0x4
183183867Sraj#define MGE_SDMA_RX_BYTE_SWAP		(1 << 4)
184183867Sraj#define MGE_SDMA_TX_BYTE_SWAP		(1 << 5)
185183867Sraj#define MGE_SDMA_DESC_SWAP_MODE		(1 << 6)
186183867Sraj#if defined(MGE_VER2)
187183867Sraj#define MGE_SDMA_RX_IPG_MAX		0xFFFF
188183867Sraj#define MGE_SDMA_RX_IPG(val)		((((val) & 0x8000) << 10) | \
189183867Sraj					(((val) & 0x7fff) << 7))
190183867Sraj#else
191183867Sraj#define MGE_SDMA_RX_IPG_MAX		0x3FFF
192183867Sraj#define MGE_SDMA_RX_IPG(val)		(((val) & 0x3fff) << 8)
193183867Sraj#endif
194183867Sraj
195183867Sraj
196183867Sraj#define MGE_PORT_SERIAL_CTRL		0x43c
197183867Sraj#define PORT_SERIAL_ENABLE		(1 << 0) /* serial port enable */
198183867Sraj#define PORT_SERIAL_FORCE_LINKUP	(1 << 1) /* force link status to up */
199183867Sraj#define PORT_SERIAL_AUTONEG		(1 << 2) /* enable autoneg for duplex mode */
200183867Sraj#define PORT_SERIAL_AUTONEG_FC		(1 << 3) /* enable autoneg for FC */
201183867Sraj#define PORT_SERIAL_PAUSE_ADV		(1 << 4) /* advertise symmetric FC in autoneg */
202183867Sraj#define PORT_SERIAL_FORCE_FC(val)	(((val) & 3) << 5) /* pause enable & disable frames conf */
203183867Sraj#define PORT_SERIAL_NO_PAUSE_DIS	0x00
204183867Sraj#define PORT_SERIAL_PAUSE_DIS		0x01
205183867Sraj#define PORT_SERIAL_FORCE_BP(val)	(((val) & 3) << 7) /* transmitting JAM configuration */
206183867Sraj#define PORT_SERIAL_NO_JAM		0x00
207183867Sraj#define PORT_SERIAL_JAM			0x01
208183867Sraj#define PORT_SERIAL_RES_BIT9		(1 << 9)
209183867Sraj#define PORT_SERIAL_FORCE_LINK_FAIL	(1 << 10)
210183867Sraj#define PORT_SERIAL_SPEED_AUTONEG	(1 << 13)
211183867Sraj#define PORT_SERIAL_FORCE_DTE_ADV	(1 << 14)
212183867Sraj#define PORT_SERIAL_MRU(val)		(((val) & 7) << 17)
213183867Sraj#define PORT_SERIAL_MRU_1518		0x0
214183867Sraj#define PORT_SERIAL_MRU_1522		0x1
215183867Sraj#define PORT_SERIAL_MRU_1552		0x2
216183867Sraj#define PORT_SERIAL_MRU_9022		0x3
217183867Sraj#define PORT_SERIAL_MRU_9192		0x4
218183867Sraj#define PORT_SERIAL_MRU_9700		0x5
219183867Sraj#define PORT_SERIAL_FULL_DUPLEX		(1 << 21)
220183867Sraj#define PORT_SERIAL_FULL_DUPLEX_FC	(1 << 22)
221183867Sraj#define PORT_SERIAL_GMII_SPEED_1000	(1 << 23)
222183867Sraj#define PORT_SERIAL_MII_SPEED_100	(1 << 24)
223183867Sraj
224183867Sraj#define MGE_PORT_STATUS			0x444
225183867Sraj#define MGE_STATUS_LINKUP		(1 << 1)
226183867Sraj#define MGE_STATUS_FULL_DUPLEX		(1 << 2)
227183867Sraj#define MGE_STATUS_FLOW_CONTROL		(1 << 3)
228183867Sraj#define MGE_STATUS_1000MB		(1 << 4)
229183867Sraj#define MGE_STATUS_100MB		(1 << 5)
230183867Sraj#define MGE_STATUS_TX_IN_PROG		(1 << 7)
231183867Sraj#define MGE_STATUS_TX_FIFO_EMPTY	(1 << 10)
232183867Sraj
233183867Sraj#define MGE_TX_QUEUE_CMD	0x448
234183867Sraj#define MGE_ENABLE_TXQ		(1 << 0)
235183867Sraj#define MGE_DISABLE_TXQ		(1 << 8)
236183867Sraj
237183867Sraj/* 88F6281 only */
238183867Sraj#define MGE_PORT_SERIAL_CTRL1		0x44c
239183867Sraj#define MGE_PCS_LOOPBACK		(1 << 1)
240183867Sraj#define MGE_RGMII_EN			(1 << 3)
241183867Sraj#define MGE_PORT_RESET			(1 << 4)
242183867Sraj#define MGE_CLK125_BYPASS		(1 << 5)
243183867Sraj#define MGE_INBAND_AUTONEG		(1 << 6)
244183867Sraj#define MGE_INBAND_AUTONEG_BYPASS	(1 << 6)
245183867Sraj#define MGE_INBAND_AUTONEG_RESTART	(1 << 7)
246183867Sraj#define MGE_1000BASEX			(1 << 11)
247183867Sraj#define MGE_BP_COLLISION_COUNT		(1 << 15)
248183867Sraj#define MGE_COLLISION_LIMIT(val)	(((val) & 0x3f) << 16)
249183867Sraj#define MGE_DROP_ODD_PREAMBLE		(1 << 22)
250183867Sraj
251183867Sraj#if defined(MGE_VER2)
252183867Sraj#define MGE_MTU			0x4e8
253183867Sraj#else
254183867Sraj#define MGE_MTU			0x458
255183867Sraj#endif
256183867Sraj#define MGE_MTU_DEFAULT		0x0
257183867Sraj
258183867Sraj#define MGE_PORT_INT_CAUSE	0x460
259183867Sraj#define MGE_PORT_INT_MASK	0x468
260183867Sraj#define MGE_PORT_INT_RX		(1 << 0)
261183867Sraj#define MGE_PORT_INT_EXTEND	(1 << 1)
262183867Sraj#define MGE_PORT_INT_RXQ0	(1 << 2)
263183867Sraj#define MGE_PORT_INT_RXERR	(1 << 10)
264183867Sraj#define MGE_PORT_INT_RXERRQ0	(1 << 11)
265183867Sraj#define MGE_PORT_INT_SUM	(1 << 31)
266183867Sraj
267183867Sraj#define MGE_PORT_INT_CAUSE_EXT	0x464
268183867Sraj#define MGE_PORT_INT_MASK_EXT	0x46C
269183867Sraj#define MGE_PORT_INT_EXT_TXBUF0	(1 << 0)
270183867Sraj#define MGE_PORT_INT_EXT_TXERR0	(1 << 8)
271183867Sraj#define MGE_PORT_INT_EXT_PHYSC	(1 << 16)
272183867Sraj#define MGE_PORT_INT_EXT_RXOR	(1 << 18)
273183867Sraj#define MGE_PORT_INT_EXT_TXUR	(1 << 19)
274183867Sraj#define MGE_PORT_INT_EXT_LC	(1 << 20)
275183867Sraj#define MGE_PORT_INT_EXT_IAR	(1 << 23)
276183867Sraj#define MGE_PORT_INT_EXT_SUM	(1 << 31)
277183867Sraj
278183867Sraj#define MGE_RX_FIFO_URGENT_TRSH		0x470
279183867Sraj#define MGE_TX_FIFO_URGENT_TRSH		0x474
280183867Sraj#if defined(MGE_VER2)
281183867Sraj#define	MGE_TX_FIFO_URGENT_TRSH_IPG_MAX	0xFFFF
282183867Sraj#define MGE_TX_FIFO_URGENT_TRSH_IPG(vl)	(((vl) & 0xFFFF) << 4)
283183867Sraj#else
284183867Sraj#define	MGE_TX_FIFO_URGENT_TRSH_IPG_MAX	0x3FFF
285183867Sraj#define MGE_TX_FIFO_URGENT_TRSH_IPG(vl)	(((vl) & 0x3FFF) << 4)
286183867Sraj#endif
287183867Sraj
288183867Sraj#define MGE_FIXED_PRIO_CONF		0x4dc
289183867Sraj#define MGE_FIXED_PRIO_EN(q)		(1 << (q))
290183867Sraj
291183867Sraj#define MGE_RX_CUR_DESC_PTR(q)		(0x60c + ((q)<<4))
292183867Sraj
293183867Sraj#define MGE_RX_QUEUE_CMD		0x680
294183867Sraj#define MGE_ENABLE_RXQ(q)		(1 << ((q) & 0x7))
295183867Sraj#define MGE_ENABLE_RXQ_ALL		(0xff)
296183867Sraj#define MGE_DISABLE_RXQ(q)		(1 << (((q) & 0x7) + 8))
297183867Sraj#define MGE_DISABLE_RXQ_ALL		(0xff00)
298183867Sraj
299183867Sraj#define MGE_TX_CUR_DESC_PTR		0x6c0
300183867Sraj
301183867Sraj#define MGE_TX_TOKEN_COUNT(q)		(0x700 + ((q)<<4))
302183867Sraj#define MGE_TX_TOKEN_CONF(q)		(0x704 + ((q)<<4))
303183867Sraj#define MGE_TX_TOKEN_Q0_DFLT		0x3fffffff
304183867Sraj#define MGE_TX_TOKEN_Q1_7_DFLT		0x0
305183867Sraj
306183867Sraj#define MGE_TX_ARBITER_CONF(q)		(0x704 + ((q)<<4))
307183867Sraj#define MGE_TX_ARB_Q0_DFLT		0xff
308183867Sraj#define MGE_TX_ARB_Q1_7_DFLT		0x0
309183867Sraj
310183867Sraj#define MGE_MCAST_REG_NUMBER		64
311183867Sraj#define MGE_DA_FILTER_SPEC_MCAST(i)	(0x1400 + ((i) << 2))
312183867Sraj#define MGE_DA_FILTER_OTH_MCAST(i)	(0x1500 + ((i) << 2))
313183867Sraj
314183867Sraj#define MGE_UCAST_REG_NUMBER		4
315183867Sraj#define MGE_DA_FILTER_UCAST(i)		(0x1600 + ((i) << 2))
316183867Sraj
317183867Sraj
318183867Sraj/* TX descriptor bits */
319183867Sraj#define MGE_TX_LLC_SNAP		(1 << 9)
320183867Sraj#define MGE_TX_NOT_FRAGMENT	(1 << 10)
321183867Sraj#define MGE_TX_VLAN_TAGGED	(1 << 15)
322183867Sraj#define MGE_TX_UDP		(1 << 16)
323183867Sraj#define MGE_TX_GEN_L4_CSUM	(1 << 17)
324183867Sraj#define MGE_TX_GEN_IP_CSUM	(1 << 18)
325183867Sraj#define MGE_TX_PADDING		(1 << 19)
326183867Sraj#define MGE_TX_LAST		(1 << 20)
327183867Sraj#define MGE_TX_FIRST		(1 << 21)
328183867Sraj#define MGE_TX_ETH_CRC		(1 << 22)
329183867Sraj#define MGE_TX_EN_INT		(1 << 23)
330183867Sraj
331183867Sraj#define MGE_TX_IP_HDR_SIZE(size)	((size << 11) & 0xFFFF)
332183867Sraj
333183867Sraj/* RX descriptor bits */
334183867Sraj#define MGE_ERR_SUMMARY		(1 << 0)
335183867Sraj#define MGE_ERR_MASK		(3 << 1)
336183867Sraj#define MGE_RX_L4_PROTO_MASK	(3 << 21)
337183867Sraj#define MGE_RX_L4_PROTO_TCP	(0 << 21)
338183867Sraj#define MGE_RX_L4_PROTO_UDP	(1 << 21)
339183867Sraj#define MGE_RX_L3_IS_IP		(1 << 24)
340183867Sraj#define MGE_RX_IP_OK		(1 << 25)
341183867Sraj#define MGE_RX_DESC_LAST	(1 << 26)
342183867Sraj#define MGE_RX_DESC_FIRST	(1 << 27)
343183867Sraj#define MGE_RX_ENABLE_INT	(1 << 29)
344183867Sraj#define MGE_RX_L4_CSUM_OK	(1 << 30)
345183867Sraj#define MGE_DMA_OWNED		(1 << 31)
346183867Sraj
347183867Sraj#define MGE_RX_IP_FRAGMENT	(1 << 2)
348183867Sraj
349183867Sraj#define MGE_RX_L4_IS_TCP(status)	((status & MGE_RX_L4_PROTO_MASK) \
350183867Sraj					    == MGE_RX_L4_PROTO_TCP)
351183867Sraj
352183867Sraj#define MGE_RX_L4_IS_UDP(status)	((status & MGE_RX_L4_PROTO_MASK) \
353183867Sraj					    == MGE_RX_L4_PROTO_UDP)
354183867Sraj
355183867Sraj/* TX error codes */
356183867Sraj#define MGE_TX_ERROR_LC		(0 << 1)	/* Late collision */
357183867Sraj#define MGE_TX_ERROR_UR		(1 << 1)	/* Underrun error */
358183867Sraj#define MGE_TX_ERROR_RL		(2 << 1)	/* Excessive collision */
359183867Sraj
360183867Sraj/* RX error codes */
361183867Sraj#define MGE_RX_ERROR_CE		(0 << 1)	/* CRC error */
362183867Sraj#define MGE_RX_ERROR_OR		(1 << 1)	/* Overrun error */
363183867Sraj#define MGE_RX_ERROR_MF		(2 << 1)	/* Max frame lenght error */
364183867Sraj#define MGE_RX_ERROR_RE		(3 << 1)	/* Resource error */
365183867Sraj
366183867Sraj#endif /* __IF_MGE_H__ */
367