149541Speter/*	$NetBSD: if_devar.h,v 1.32 1999/04/01 14:55:25 tsubai Exp $	*/
230556Speter
349562Speter/* $FreeBSD: stable/11/sys/dev/de/if_devar.h 332290 2018-04-08 16:59:39Z brooks $ */
449562Speter
526790Speter/*-
626790Speter * Copyright (c) 1994-1997 Matt Thomas (matt@3am-software.com)
726790Speter * All rights reserved.
826790Speter *
926790Speter * Redistribution and use in source and binary forms, with or without
1026790Speter * modification, are permitted provided that the following conditions
1126790Speter * are met:
1226790Speter * 1. Redistributions of source code must retain the above copyright
1326790Speter *    notice, this list of conditions and the following disclaimer.
1426790Speter * 2. The name of the author may not be used to endorse or promote products
1597748Sschweikh *    derived from this software without specific prior written permission
1626790Speter *
1726790Speter * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1826790Speter * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1926790Speter * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2026790Speter * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2126790Speter * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2226790Speter * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2326790Speter * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2426790Speter * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2526790Speter * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2626790Speter * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2726790Speter *
2830556Speter * Id: if_devar.h,v 1.28 1997/07/03 16:55:07 thomas Exp
2926790Speter */
3026790Speter
31156034Simp#ifndef DEV_DE_IF_DEVAR_H
32156034Simp#define DEV_DE_IF_DEVAR_H
3326790Speter
3460528Sdfrtypedef bus_addr_t tulip_csrptr_t;
3526790Speter
3626790Speter#define	TULIP_PCI_CSRSIZE	8
3726790Speter#define	TULIP_PCI_CSROFFSET	0
3826790Speter
3960528Sdfr#define TULIP_CSR_READ(sc, csr)			\
4060528Sdfr	bus_space_read_4((sc)->tulip_csrs_bst,	\
4160528Sdfr			 (sc)->tulip_csrs_bsh,	\
4260528Sdfr			 (sc)->tulip_csrs.csr)
4360528Sdfr#define TULIP_CSR_WRITE(sc, csr, val)			\
4460528Sdfr	bus_space_write_4((sc)->tulip_csrs_bst,		\
4560528Sdfr			  (sc)->tulip_csrs_bsh,		\
4660528Sdfr			  (sc)->tulip_csrs.csr, val)
4739345Sdfr
4826790Speter/*
4926790Speter * This structure contains "pointers" for the registers on
5026790Speter * the various 21x4x chips.  CSR0 through CSR8 are common
5126790Speter * to all chips.  After that, it gets messy...
5226790Speter */
5326790Spetertypedef struct {
54131847Sbms	tulip_csrptr_t	csr_busmode;	/* CSR0 */
55131847Sbms	tulip_csrptr_t	csr_txpoll;	/* CSR1 */
56131847Sbms	tulip_csrptr_t	csr_rxpoll;	/* CSR2 */
57131847Sbms	tulip_csrptr_t	csr_rxlist;	/* CSR3 */
58131847Sbms	tulip_csrptr_t	csr_txlist;	/* CSR4 */
59131847Sbms	tulip_csrptr_t	csr_status;	/* CSR5 */
60131847Sbms	tulip_csrptr_t	csr_command;	/* CSR6 */
61131847Sbms	tulip_csrptr_t	csr_intr;	/* CSR7 */
62131847Sbms	tulip_csrptr_t	csr_missed_frames;	/* CSR8 */
63131847Sbms	tulip_csrptr_t	csr_9;		/* CSR9 */
64131847Sbms	tulip_csrptr_t	csr_10;		/* CSR10 */
65131847Sbms	tulip_csrptr_t	csr_11;		/* CSR11 */
66131847Sbms	tulip_csrptr_t	csr_12;		/* CSR12 */
67131847Sbms	tulip_csrptr_t	csr_13;		/* CSR13 */
68131847Sbms	tulip_csrptr_t	csr_14;		/* CSR14 */
69131847Sbms	tulip_csrptr_t	csr_15;		/* CSR15 */
7026790Speter} tulip_regfile_t;
7126790Speter
7226790Speter#define	csr_enetrom		csr_9	/* 21040 */
7326790Speter#define	csr_reserved		csr_10	/* 21040 */
7426790Speter#define	csr_full_duplex		csr_11	/* 21040 */
7526790Speter#define	csr_bootrom		csr_10	/* 21041/21140A/?? */
7626790Speter#define	csr_gp			csr_12	/* 21140* */
7726790Speter#define	csr_watchdog		csr_15	/* 21140* */
7826790Speter#define	csr_gp_timer		csr_11	/* 21041/21140* */
7926790Speter#define	csr_srom_mii		csr_9	/* 21041/21140* */
8026790Speter#define	csr_sia_status		csr_12	/* 2104x */
8126790Speter#define csr_sia_connectivity	csr_13	/* 2104x */
8226790Speter#define csr_sia_tx_rx		csr_14	/* 2104x */
8326790Speter#define csr_sia_general		csr_15	/* 2104x */
8426790Speter
8526790Speter/*
8626790Speter * While 21x4x allows chaining of its descriptors, this driver
8726790Speter * doesn't take advantage of it.  We keep the descriptors in a
88131847Sbms * traditional FIFO ring.
8926790Speter */
9026790Spetertypedef struct {
91149473Sjhb	tulip_desc_t	*di_desc;
92149473Sjhb	struct mbuf	*di_mbuf;
93149473Sjhb	bus_dmamap_t	*di_map;
94149473Sjhb} tulip_descinfo_t;
95149473Sjhb
96149473Sjhbtypedef struct {
97149473Sjhb	tulip_descinfo_t *ri_first;	/* first entry in ring */
98149473Sjhb	tulip_descinfo_t *ri_last;	/* one after last entry */
99149473Sjhb	tulip_descinfo_t *ri_nextin;	/* next to processed by host */
100149473Sjhb	tulip_descinfo_t *ri_nextout;	/* next to processed by adapter */
101131847Sbms	int		ri_max;
102131847Sbms	int		ri_free;
103149473Sjhb	tulip_desc_t	*ri_descs;
104149473Sjhb	tulip_descinfo_t *ri_descinfo;
105149473Sjhb	bus_dma_tag_t	ri_ring_tag;
106149473Sjhb	bus_dmamap_t	ri_ring_map;
107197463Syongari	bus_addr_t	ri_dma_addr;
108149473Sjhb	bus_dma_tag_t	ri_data_tag;
109149473Sjhb	bus_dmamap_t	*ri_data_maps;
11026790Speter} tulip_ringinfo_t;
11126790Speter
11226790Speter/*
11326790Speter * The 21040 has a stupid restriction in that the receive
11426790Speter * buffers must be longword aligned.  But since Ethernet
11526790Speter * headers are not a multiple of longwords in size this forces
11626790Speter * the data to non-longword aligned.  Since IP requires the
11726790Speter * data to be longword aligned, we need to copy it after it has
11826790Speter * been DMA'ed in our memory.
11926790Speter *
12026790Speter * Since we have to copy it anyways, we might as well as allocate
12126790Speter * dedicated receive space for the input.  This allows to use a
12226790Speter * small receive buffer size and more ring entries to be able to
12326790Speter * better keep with a flood of tiny Ethernet packets.
12426790Speter *
12526790Speter * The receive space MUST ALWAYS be a multiple of the page size.
12626790Speter * And the number of receive descriptors multiplied by the size
127148248Sjhb * of the receive buffers must equal the receive space.  This
12826790Speter * is so that we can manipulate the page tables so that even if a
129131847Sbms * packet wraps around the end of the receive space, we can
13026790Speter * treat it as virtually contiguous.
13126790Speter *
13226790Speter * The above used to be true (the stupid restriction is still true)
133131847Sbms * but we gone to directly DMA'ing into MBUFs (unless it's on an
13426790Speter * architecture which can't handle unaligned accesses) because with
13526790Speter * 100Mb/s cards the copying is just too much of a hit.
13626790Speter */
13726790Speter
13826790Speter#define	TULIP_TXTIMER		4
13926790Speter#define	TULIP_RXDESCS		48
14026790Speter#define	TULIP_TXDESCS		128
14126790Speter#define	TULIP_RXQ_TARGET	32
14226790Speter#if TULIP_RXQ_TARGET >= TULIP_RXDESCS
143131847Sbms#error	TULIP_RXQ_TARGET must be less than TULIP_RXDESCS
14426790Speter#endif
14526790Speter#define	TULIP_RX_BUFLEN		((MCLBYTES < 2048 ? MCLBYTES : 2048) - 16)
14626790Speter
14726790Speter/*
14826790Speter * Forward reference to make C happy.
14926790Speter */
150131847Sbmstypedef struct tulip_softc	tulip_softc_t;
15126790Speter
15226790Speter/*
153131847Sbms * Enumeration of the various controllers supported.
15426790Speter */
15526790Spetertypedef enum {
156131847Sbms	TULIP_21040,
157131847Sbms	TULIP_21041,
158131847Sbms	TULIP_21140,
159131847Sbms	TULIP_21140A,
160131847Sbms	TULIP_21142,
161131847Sbms	TULIP_21143,
162131847Sbms	TULIP_CHIPID_UNKNOWN
16326790Speter} tulip_chipid_t;
16426790Speter
16526790Speter/*
16626790Speter * Various physical media types supported.
16726790Speter * BNCAUI is BNC or AUI since on the 21040 you can't really tell
16826790Speter * which is in use.
16926790Speter */
17026790Spetertypedef enum {
171131847Sbms	TULIP_MEDIA_UNKNOWN,
172131847Sbms	TULIP_MEDIA_10BASET,
173131847Sbms	TULIP_MEDIA_10BASET_FD,
174131847Sbms	TULIP_MEDIA_BNC,
175131847Sbms	TULIP_MEDIA_AUI,
176131847Sbms	TULIP_MEDIA_EXTSIA,
177131847Sbms	TULIP_MEDIA_AUIBNC,
178131847Sbms	TULIP_MEDIA_100BASETX,
179131847Sbms	TULIP_MEDIA_100BASETX_FD,
180131847Sbms	TULIP_MEDIA_100BASET4,
181131847Sbms	TULIP_MEDIA_100BASEFX,
182131847Sbms	TULIP_MEDIA_100BASEFX_FD,
183131847Sbms	TULIP_MEDIA_MAX
18426790Speter} tulip_media_t;
18526790Speter
18626790Speter#define	TULIP_BIT(b)		(1L << ((int)(b)))
18726790Speter#define	TULIP_FDBIT(m)		(1L << ((int)TULIP_MEDIA_ ## m ## _FD))
18826790Speter#define	TULIP_MBIT(m)		(1L << ((int)TULIP_MEDIA_ ## m ))
18926790Speter#define	TULIP_IS_MEDIA_FD(m)	(TULIP_BIT(m) & \
190131847Sbms				 (TULIP_FDBIT(10BASET) | \
191131847Sbms				  TULIP_FDBIT(100BASETX) | \
192131847Sbms				  TULIP_FDBIT(100BASEFX)))
19326790Speter#define	TULIP_CAN_MEDIA_FD(m)	(TULIP_BIT(m) & \
194131847Sbms				 (TULIP_MBIT(10BASET) | \
195131847Sbms				  TULIP_MBIT(100BASETX) | \
196131847Sbms				  TULIP_MBIT(100BASEFX)))
19726790Speter#define	TULIP_FD_MEDIA_OF(m)	((tulip_media_t)((m) + 1))
19826790Speter#define	TULIP_HD_MEDIA_OF(m)	((tulip_media_t)((m) - 1))
19926790Speter#define	TULIP_IS_MEDIA_100MB(m)	((m) >= TULIP_MEDIA_100BASETX)
20026790Speter#define	TULIP_IS_MEDIA_TP(m)	((TULIP_BIT(m) & \
201131847Sbms				  (TULIP_MBIT(BNC) | \
202131847Sbms				   TULIP_MBIT(AUI) | \
203131847Sbms				   TULIP_MBIT(AUIBNC) | \
204131847Sbms				   TULIP_MBIT(EXTSIA))) == 0)
20526790Speter
20626790Speter#define	TULIP_SROM_ATTR_MII		0x0100
20726790Speter#define	TULIP_SROM_ATTR_NWAY		0x0200
20826790Speter#define	TULIP_SROM_ATTR_AUTOSENSE	0x0400
20926790Speter#define	TULIP_SROM_ATTR_POWERUP		0x0800
21026790Speter#define	TULIP_SROM_ATTR_NOLINKPASS	0x1000
21126790Speter
21226790Spetertypedef struct {
213131847Sbms	enum {
214131847Sbms		TULIP_MEDIAINFO_NONE,
215131847Sbms		TULIP_MEDIAINFO_SIA,
216131847Sbms		TULIP_MEDIAINFO_GPR,
217131847Sbms		TULIP_MEDIAINFO_MII,
218131847Sbms		TULIP_MEDIAINFO_RESET,
219131847Sbms		TULIP_MEDIAINFO_SYM
220131847Sbms	} mi_type;
221131847Sbms	union {
222131847Sbms		struct {
223131847Sbms			u_int16_t sia_connectivity;
224131847Sbms			u_int16_t sia_tx_rx;
225131847Sbms			u_int16_t sia_general;
226131847Sbms			u_int32_t sia_gp_control;	/* 21142/21143 */
227131847Sbms			u_int32_t sia_gp_data;		/* 21142/21143 */
228131847Sbms		} un_sia;
229131847Sbms		struct {
230131847Sbms			u_int32_t gpr_cmdmode;
231131847Sbms			u_int32_t gpr_gpcontrol;	/* 21142/21143 */
232131847Sbms			u_int32_t gpr_gpdata;
233131847Sbms			u_int8_t gpr_actmask;
234131847Sbms			u_int8_t gpr_actdata;
235131847Sbms			u_int gpr_default:1;
236131847Sbms		} un_gpr;
237131847Sbms		struct {
238131847Sbms			u_int32_t mii_mediamask;
239131847Sbms			u_int16_t mii_capabilities;
240131847Sbms			u_int16_t mii_advertisement;
241131847Sbms			u_int16_t mii_full_duplex;
242131847Sbms			u_int16_t mii_tx_threshold;
243131847Sbms			u_int16_t mii_interrupt;	/* 21142/21143 */
244131847Sbms			u_int8_t mii_phyaddr;
245131847Sbms			u_int8_t mii_gpr_length;
246131847Sbms			u_int8_t mii_gpr_offset;
247131847Sbms			u_int8_t mii_reset_length;
248131847Sbms			u_int8_t mii_reset_offset;
249131847Sbms			u_int32_t mii_phyid;
250131847Sbms		} un_mii;
251131847Sbms	} mi_un;
25226790Speter} tulip_media_info_t;
25326790Speter
25426790Speter#define	mi_sia_connectivity	mi_un.un_sia.sia_connectivity
25526790Speter#define	mi_sia_tx_rx		mi_un.un_sia.sia_tx_rx
25626790Speter#define mi_sia_general		mi_un.un_sia.sia_general
25726790Speter#define	mi_sia_gp_control	mi_un.un_sia.sia_gp_control
25826790Speter#define	mi_sia_gp_data		mi_un.un_sia.sia_gp_data
25926790Speter
26026790Speter#define	mi_gpcontrol		mi_un.un_gpr.gpr_gpcontrol
26126790Speter#define	mi_gpdata		mi_un.un_gpr.gpr_gpdata
26226790Speter#define	mi_actmask		mi_un.un_gpr.gpr_actmask
26326790Speter#define	mi_actdata		mi_un.un_gpr.gpr_actdata
26426790Speter#define	mi_default		mi_un.un_gpr.gpr_default
26526790Speter#define	mi_cmdmode		mi_un.un_gpr.gpr_cmdmode
26626790Speter
26726790Speter#define	mi_phyaddr		mi_un.un_mii.mii_phyaddr
26826790Speter#define	mi_gpr_length		mi_un.un_mii.mii_gpr_length
26926790Speter#define	mi_gpr_offset		mi_un.un_mii.mii_gpr_offset
27026790Speter#define	mi_reset_length		mi_un.un_mii.mii_reset_length
27126790Speter#define	mi_reset_offset		mi_un.un_mii.mii_reset_offset
27226790Speter#define	mi_capabilities		mi_un.un_mii.mii_capabilities
27326790Speter#define	mi_advertisement	mi_un.un_mii.mii_advertisement
27426790Speter#define	mi_full_duplex		mi_un.un_mii.mii_full_duplex
27526790Speter#define	mi_tx_threshold		mi_un.un_mii.mii_tx_threshold
27626790Speter#define	mi_mediamask		mi_un.un_mii.mii_mediamask
27726790Speter#define	mi_mii_interrupt	mi_un.un_mii.mii_interrupt
27826790Speter#define	mi_phyid		mi_un.un_mii.mii_phyid
27926790Speter
280148248Sjhb#define	TULIP_MEDIAINFO_SIA_INIT(sc, mi, chipid, media) do {		\
281131847Sbms	(mi)->mi_type = TULIP_MEDIAINFO_SIA;				\
282131847Sbms	sc->tulip_mediums[TULIP_MEDIA_ ## media] = (mi);		\
283131847Sbms	(mi)->mi_sia_connectivity = TULIP_ ## chipid ## _SIACONN_ ## media; \
284131847Sbms	(mi)->mi_sia_tx_rx = TULIP_ ## chipid ## _SIATXRX_ ## media;	\
285131847Sbms	(mi)->mi_sia_general = TULIP_ ## chipid ## _SIAGEN_ ## media;	\
28626790Speter} while (0)
28726790Speter
288148248Sjhb#define TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, media) do {		\
289131847Sbms	if ((sc)->tulip_mediums[TULIP_MEDIA_ ## media] == NULL		\
290131847Sbms	    && ((mi)->mi_capabilities & PHYSTS_ ## media)) {		\
291131847Sbms		(sc)->tulip_mediums[TULIP_MEDIA_ ## media] = (mi);	\
292131847Sbms		(mi)->mi_mediamask |= TULIP_BIT(TULIP_MEDIA_ ## media);	\
293131847Sbms	}								\
29426790Speter} while (0)
29526790Speter
29626790Speter#define	TULIP_MII_NOPHY		32
29726790Speter/*
29826790Speter * Some boards need to treated specially.  The following enumeration
29926790Speter * identifies the cards with quirks (or those we just want to single
30026790Speter * out for special merit or scorn).
30126790Speter */
30226790Spetertypedef enum {
303131847Sbms	TULIP_21040_GENERIC,	/* Generic 21040 (works with most any board) */
304131847Sbms	TULIP_21140_ISV,	/* Digital Semicondutor 21140 ISV SROM Format */
305131847Sbms	TULIP_21142_ISV,	/* Digital Semicondutor 21142 ISV SROM Format */
306131847Sbms	TULIP_21143_ISV,	/* Digital Semicondutor 21143 ISV SROM Format */
307131847Sbms	TULIP_21140_DEC_EB,	/* Digital Semicondutor 21140 Eval. Board */
308131847Sbms	TULIP_21140_MII,	/* 21140[A] with MII */
309131847Sbms	TULIP_21140_DEC_DE500,	/* Digital DE500-?? 10/100 */
310131847Sbms	TULIP_21140_SMC_9332,	/* SMC 9332 */
311131847Sbms	TULIP_21140_COGENT_EM100,	/* Cogent EM100 100 only */
312131847Sbms	TULIP_21140_ZNYX_ZX34X,	/* ZNYX ZX342 10/100 */
313131847Sbms	TULIP_21140_ASANTE,	/* AsanteFast 10/100 */
314131847Sbms	TULIP_21140_EN1207,	/* Accton EN2107 10/100 BNC */
315131847Sbms	TULIP_21041_GENERIC	/* Generic 21041 card */
31626790Speter} tulip_board_t;
31726790Speter
31826790Spetertypedef enum {
319131847Sbms	TULIP_MEDIAPOLL_TIMER,		/* 100ms timer fired */
320131847Sbms	TULIP_MEDIAPOLL_FASTTIMER,	/* <100ms timer fired */
321131847Sbms	TULIP_MEDIAPOLL_LINKFAIL,	/* called from interrupt routine */
322131847Sbms	TULIP_MEDIAPOLL_LINKPASS,	/* called from interrupt routine */
323131847Sbms	TULIP_MEDIAPOLL_START,		/* start a media probe (from reset) */
324131847Sbms	TULIP_MEDIAPOLL_TXPROBE_OK,	/* txprobe succeeded */
325131847Sbms	TULIP_MEDIAPOLL_TXPROBE_FAILED,	/* txprobe failed */
326131847Sbms	TULIP_MEDIAPOLL_MAX
32726790Speter} tulip_mediapoll_event_t;
32826790Speter
32926790Spetertypedef enum {
330131847Sbms	TULIP_LINK_DOWN,	/* Link is down */
331131847Sbms	TULIP_LINK_UP,		/* link is ok */
332131847Sbms	TULIP_LINK_UNKNOWN	/* we can't tell either way */
33326790Speter} tulip_link_status_t;
33426790Speter
33526790Speter/*
33626790Speter * This data structure is used to abstract out the quirks.
33726790Speter * media_probe  = tries to determine the media type.
33826790Speter * media_select = enables the current media (or autosenses)
33926790Speter * media_poll	= autosenses media
34026790Speter * media_preset = 21140, etal requires bit to set before the
34126790Speter *		  the software reset; hence pre-set.  Should be
34226790Speter *		  pre-reset but that's ugly.
34326790Speter */
34426790Spetertypedef struct {
345131847Sbms	tulip_board_t bd_type;
346131847Sbms	void (*bd_media_probe)(tulip_softc_t * const sc);
347131847Sbms	void (*bd_media_select)(tulip_softc_t * const sc);
348131847Sbms	void (*bd_media_poll)(tulip_softc_t * const sc,
349131847Sbms    tulip_mediapoll_event_t event);
350131847Sbms	void (*bd_media_preset) (tulip_softc_t * const sc);
35126790Speter} tulip_boardsw_t;
35226790Speter
35326790Speter/*
354131847Sbms * The next few declarations are for MII/PHY based boards.
35526790Speter *
35626790Speter *    The first enumeration identifies a superset of various datums
35726790Speter * that can be obtained from various PHY chips.  Not all PHYs will
35826790Speter * support all datums.
35926790Speter *    The modedata structure indicates what register contains
36026790Speter * a datum, what mask is applied the register contents, and what the
36126790Speter * result should be.
36226790Speter *    The attr structure records information about a supported PHY.
36326790Speter *    The phy structure records information about a PHY instance.
36426790Speter */
36526790Spetertypedef enum {
366131847Sbms	PHY_MODE_10T,
367131847Sbms	PHY_MODE_100TX,
368131847Sbms	PHY_MODE_100T4,
369131847Sbms	PHY_MODE_FULLDUPLEX,
370131847Sbms	PHY_MODE_MAX
37126790Speter} tulip_phy_mode_t;
37226790Speter
37326790Spetertypedef struct {
374131847Sbms	u_int16_t	pm_regno;
375131847Sbms	u_int16_t	pm_mask;
376131847Sbms	u_int16_t	pm_value;
37726790Speter} tulip_phy_modedata_t;
37826790Speter
37926790Spetertypedef struct {
380131847Sbms	u_int32_t	attr_id;
381131847Sbms	u_int16_t	attr_flags;
382131847Sbms	tulip_phy_modedata_t	attr_modes[PHY_MODE_MAX];
38326790Speter#ifdef TULIP_DEBUG
384131847Sbms	const char	*attr_name;
38526790Speter#endif
38626790Speter} tulip_phy_attr_t;
38726790Speter
388131847Sbms/* Definitions for tulip_phy_attr_t.attr_flags */
389131847Sbms#define	PHY_NEED_HARD_RESET	0x0001
390131847Sbms#define	PHY_DUAL_CYCLE_TA	0x0002
391131847Sbms
39226790Speter/*
39326790Speter * Various probe states used when trying to autosense the media.
39426790Speter */
39526790Spetertypedef enum {
396131847Sbms	TULIP_PROBE_INACTIVE,
397131847Sbms	TULIP_PROBE_PHYRESET,
398131847Sbms	TULIP_PROBE_PHYAUTONEG,
399131847Sbms	TULIP_PROBE_GPRTEST,
400131847Sbms	TULIP_PROBE_MEDIATEST,
401131847Sbms	TULIP_PROBE_FAILED
40226790Speter} tulip_probe_state_t;
40326790Speter
40426790Spetertypedef struct {
405131847Sbms	/*
406131847Sbms	 * Transmit Statistics
407131847Sbms	 */
408131847Sbms	u_int32_t	dot3StatsSingleCollisionFrames;
409131847Sbms	u_int32_t	dot3StatsMultipleCollisionFrames;
410131847Sbms	u_int32_t	dot3StatsSQETestErrors;
411131847Sbms	u_int32_t	dot3StatsDeferredTransmissions;
412131847Sbms	u_int32_t	dot3StatsLateCollisions;
413131847Sbms	u_int32_t	dot3StatsExcessiveCollisions;
414131847Sbms	u_int32_t	dot3StatsCarrierSenseErrors;
415131847Sbms	u_int32_t	dot3StatsInternalMacTransmitErrors;
416131847Sbms	/* not in rfc1650! */
417131847Sbms	u_int32_t	dot3StatsInternalTransmitUnderflows;
418131847Sbms	/* not in rfc1650! */
419131847Sbms	u_int32_t	dot3StatsInternalTransmitBabbles;
420131847Sbms	/*
421131847Sbms	 * Receive Statistics
422131847Sbms	 */
423131847Sbms	u_int32_t	dot3StatsMissedFrames;	/* not in rfc1650! */
424131847Sbms	u_int32_t	dot3StatsAlignmentErrors;
425131847Sbms	u_int32_t	dot3StatsFCSErrors;
426131847Sbms	u_int32_t	dot3StatsFrameTooLongs;
427131847Sbms	u_int32_t	dot3StatsInternalMacReceiveErrors;
42826790Speter} tulip_dot3_stats_t;
42926790Speter
43026790Speter/*
431131847Sbms * Probe information.
43226790Speter */
433131847Sbmsstruct tulip_probe_info {
434131847Sbms	u_int8_t	probe_count;		/* count of probe operations */
435131847Sbms	int32_t		probe_timeout;		/* time (ms) of probe timeout */
436131847Sbms	tulip_probe_state_t	probe_state;	/* current media probe state */
437131847Sbms	tulip_media_t	probe_media;		/* current media being probed */
438131847Sbms	u_int32_t	probe_mediamask;	/* medias checked */
439131847Sbms	u_int32_t	probe_passes;		/* times autosense failed */
440131847Sbms	u_int32_t	probe_txprobes;		/* txprobes attempted */
441131847Sbms};
442131847Sbms
443131847Sbms/*
444131847Sbms * Debugging/Statistical information.
445131847Sbms */
446131847Sbmsstruct tulip_dbg_info {
447131847Sbms	tulip_media_t	dbg_last_media;
448131847Sbms	u_int32_t	dbg_intrs;
449131847Sbms	u_int32_t	dbg_media_probes;
450131847Sbms	u_int32_t	dbg_txprobe_nocarr;
451131847Sbms	u_int32_t	dbg_txprobe_exccoll;
452131847Sbms	u_int32_t	dbg_link_downed;
453131847Sbms	u_int32_t	dbg_link_suspected;
454131847Sbms	u_int32_t	dbg_link_intrs;
455131847Sbms	u_int32_t	dbg_link_pollintrs;
456131847Sbms	u_int32_t	dbg_link_failures;
457131847Sbms	u_int32_t	dbg_nway_starts;
458131847Sbms	u_int32_t	dbg_nway_failures;
459131847Sbms	u_int16_t	dbg_phyregs[32][4];
460131847Sbms	u_int32_t	dbg_rxlowbufs;
461131847Sbms	u_int32_t	dbg_rxintrs;
462131847Sbms	u_int32_t	dbg_last_rxintrs;
463131847Sbms	u_int32_t	dbg_high_rxintrs_hz;
464131847Sbms	u_int32_t	dbg_no_txmaps;
465131847Sbms	u_int32_t	dbg_txput_finishes[8];
466131847Sbms	u_int32_t	dbg_txprobes_ok[TULIP_MEDIA_MAX];
467131847Sbms	u_int32_t	dbg_txprobes_failed[TULIP_MEDIA_MAX];
468131847Sbms	u_int32_t	dbg_events[TULIP_MEDIAPOLL_MAX];
469131847Sbms	u_int32_t	dbg_rxpktsperintr[TULIP_RXDESCS];
470131847Sbms};
471131847Sbms
472131847Sbms/*
473131847Sbms * Performance statistics.
474131847Sbms */
475131847Sbmsstruct tulip_perfstat {
476131847Sbms	u_quad_t	perf_intr_cycles;
477131847Sbms	u_quad_t	perf_ifstart_cycles;
478131847Sbms	u_quad_t	perf_ifstart_one_cycles;
479131847Sbms	u_quad_t	perf_ifioctl_cycles;
480199378Sjhb	u_quad_t	perf_stat_cycles;
481131847Sbms	u_quad_t	perf_timeout_cycles;
482131847Sbms	u_quad_t	perf_txput_cycles;
483131847Sbms	u_quad_t	perf_txintr_cycles;
484131847Sbms	u_quad_t	perf_rxintr_cycles;
485131847Sbms	u_quad_t	perf_rxget_cycles;
486131847Sbms	unsigned int	perf_intr;
487131847Sbms	unsigned int	perf_ifstart;
488131847Sbms	unsigned int	perf_ifstart_one;
489131847Sbms	unsigned int	perf_ifioctl;
490199378Sjhb	unsigned int	perf_stat;
491131847Sbms	unsigned int	perf_timeout;
492131847Sbms	unsigned int	perf_txput;
493131847Sbms	unsigned int	perf_txintr;
494131847Sbms	unsigned int	perf_rxintr;
495131847Sbms	unsigned int	perf_rxget;
496131847Sbms};
497131847Sbms#define	TULIP_PERF_CURRENT	0
498131847Sbms#define	TULIP_PERF_PREVIOUS	1
499131847Sbms#define	TULIP_PERF_TOTAL	2
500131847Sbms#define	TULIP_PERF_MAX		3
501131847Sbms
502131847Sbms/*
503131847Sbms * Per-driver-instance state.
504131847Sbms */
505131847Sbmsstruct tulip_softc {
506162321Sglebius	device_t		tulip_dev;
507131847Sbms	struct ifmedia		tulip_ifmedia;
508131847Sbms	int			tulip_unit;
509147256Sbrooks	struct ifnet		*tulip_ifp;
510153617Sjhb	u_char			tulip_enaddr[ETHER_ADDR_LEN];
511131847Sbms	bus_space_tag_t		tulip_csrs_bst;
512131847Sbms	bus_space_handle_t	tulip_csrs_bsh;
513131847Sbms	tulip_regfile_t		tulip_csrs;
514131847Sbms
515131847Sbms	u_int32_t		tulip_flags;
516131847Sbms	u_int32_t		tulip_features;
517131847Sbms	u_int32_t		tulip_intrmask;
518131847Sbms	u_int32_t		tulip_cmdmode;
519131847Sbms	u_int32_t		tulip_last_system_error:3;
520169797Smjacob	u_int32_t		tulip_txtimer:3;	/* transmission timer */
521131847Sbms	u_int32_t		tulip_system_errors;
522131847Sbms	u_int32_t		tulip_statusbits;	/* status bits from
523131847Sbms							 * CSR5 that may need
524131847Sbms							 * to be printed
525131847Sbms							 */
526131847Sbms	tulip_media_info_t	*tulip_mediums[TULIP_MEDIA_MAX];
527131847Sbms	tulip_media_t		tulip_media;		/* current media type */
528131847Sbms	u_int32_t		tulip_abilities;	/* remote system's
529131847Sbms							 * abilities (as
530131847Sbms							 * defined in IEEE
531131847Sbms							 * 802.3u)
532131847Sbms							 */
533131847Sbms	u_int8_t		tulip_revinfo;		/* chip revision */
534131847Sbms	u_int8_t		tulip_phyaddr;		/* current phy */
535131847Sbms	u_int8_t		tulip_gpinit;		/* active pins on
536131847Sbms							 * 21140
537131847Sbms							 */
538131847Sbms	u_int8_t		tulip_gpdata;	/* default gpdata for 21140 */
539131847Sbms	struct tulip_probe_info	tulip_probe;
540131847Sbms	tulip_chipid_t		tulip_chipid;	/* type of chip we are using */
541131847Sbms	const tulip_boardsw_t	*tulip_boardsw;	/* board/chip characteristics */
542131847Sbms	tulip_softc_t		*tulip_slaves;	/* slaved devices (ZX3xx) */
543131847Sbms#if defined(TULIP_DEBUG)
544131847Sbms	struct tulip_dbg_info	tulip_dbg;
545131847Sbms#endif
546131847Sbms#if defined(TULIP_PERFSTATS)
547131847Sbms	struct tulip_perfstat	tulip_perfstats[TULIP_PERF_MAX];
548131847Sbms#endif
549131847Sbms	tulip_dot3_stats_t	tulip_dot3stats;
550131847Sbms	tulip_ringinfo_t	tulip_rxinfo;
551131847Sbms	tulip_ringinfo_t	tulip_txinfo;
552131847Sbms	tulip_media_info_t	tulip_mediainfo[10];
553131847Sbms	/*
554131847Sbms	 * The setup buffers for sending the setup frame to the chip. one is
555131847Sbms	 * the one being sent while the other is the one being filled.
556131847Sbms	 */
557149473Sjhb	bus_dma_tag_t		tulip_setup_tag;
558149473Sjhb	bus_dmamap_t		tulip_setup_map;
559197463Syongari	bus_addr_t		tulip_setup_dma_addr;
560149473Sjhb	u_int32_t		*tulip_setupbuf;
561131847Sbms	u_int32_t		tulip_setupdata[192 / sizeof(u_int32_t)];
562131847Sbms	char			tulip_boardid[24];
563131847Sbms	u_int8_t		tulip_rombuf[128];	/* must be aligned */
564131847Sbms
565131847Sbms	/* needed for multiport boards */
566131847Sbms	u_int8_t		tulip_pci_busno;
567131847Sbms	u_int8_t		tulip_pci_devno;
568131847Sbms
569131847Sbms	u_int8_t		tulip_connidx;
570131847Sbms	tulip_srom_connection_t	tulip_conntype;
571148445Sjhb	struct callout		tulip_callout;
572148445Sjhb	struct mtx		tulip_mutex;
573199378Sjhb	struct callout	tulip_stat_timer;
574131847Sbms};
575131847Sbms
576131847Sbms#define	tulip_curperfstats	tulip_perfstats[TULIP_PERF_CURRENT]
577131847Sbms#define	tulip_probe_count	tulip_probe.probe_count
578131847Sbms#define	tulip_probe_timeout	tulip_probe.probe_timeout
579131847Sbms#define	tulip_probe_state	tulip_probe.probe_state
580131847Sbms#define	tulip_probe_media	tulip_probe.probe_media
581131847Sbms#define	tulip_probe_mediamask	tulip_probe.probe_mediamask
582131847Sbms#define	tulip_probe_passes	tulip_probe.probe_passes
583131847Sbms
584131847Sbms/* Definitions for tulip_flags. */
58526790Speter#define	TULIP_WANTSETUP		0x00000001
58626790Speter#define	TULIP_WANTHASHPERFECT	0x00000002
58726790Speter#define	TULIP_WANTHASHONLY	0x00000004
58826790Speter#define	TULIP_DOINGSETUP	0x00000008
58926790Speter#define	TULIP_PRINTMEDIA	0x00000010
59026790Speter#define	TULIP_TXPROBE_ACTIVE	0x00000020
59126790Speter#define	TULIP_ALLMULTI		0x00000040
59226790Speter#define	TULIP_WANTRXACT		0x00000080
59326790Speter#define	TULIP_RXACT		0x00000100
59426790Speter#define	TULIP_INRESET		0x00000200
59526790Speter#define	TULIP_NEEDRESET		0x00000400
59626790Speter#define	TULIP_SQETEST		0x00000800
59726790Speter#define	TULIP_xxxxxx0		0x00001000
59826790Speter#define	TULIP_xxxxxx1		0x00002000
59927859Speter#define	TULIP_WANTTXSTART	0x00004000
60027859Speter#define	TULIP_NEWTXTHRESH	0x00008000
60126790Speter#define	TULIP_NOAUTOSENSE	0x00010000
60226790Speter#define	TULIP_PRINTLINKUP	0x00020000
60326790Speter#define	TULIP_LINKUP		0x00040000
60426790Speter#define	TULIP_RXBUFSLOW		0x00080000
60526790Speter#define	TULIP_NOMESSAGES	0x00100000
60626790Speter#define	TULIP_SYSTEMERROR	0x00200000
60726790Speter#define	TULIP_TIMEOUTPENDING	0x00400000
60827859Speter#define	TULIP_xxxxxx2		0x00800000
60926790Speter#define	TULIP_TRYNWAY		0x01000000
61026790Speter#define	TULIP_DIDNWAY		0x02000000
61126790Speter#define	TULIP_RXIGNORE		0x04000000
61226790Speter#define	TULIP_PROBE1STPASS	0x08000000
61326790Speter#define	TULIP_DEVICEPROBE	0x10000000
61426790Speter#define	TULIP_PROMISC		0x20000000
61526790Speter#define	TULIP_HASHONLY		0x40000000
61627859Speter#define	TULIP_xxxxxx3		0x80000000
617131847Sbms
618131847Sbms/* Definitions for tulip_features. */
61926790Speter#define	TULIP_HAVE_GPR		0x00000001	/* have gp register (140[A]) */
62026790Speter#define	TULIP_HAVE_RXBADOVRFLW	0x00000002	/* RX corrupts on overflow */
62126790Speter#define	TULIP_HAVE_POWERMGMT	0x00000004	/* Snooze/sleep modes */
62226790Speter#define	TULIP_HAVE_MII		0x00000008	/* Some medium on MII */
62326790Speter#define	TULIP_HAVE_SIANWAY	0x00000010	/* SIA does NWAY */
62426790Speter#define	TULIP_HAVE_DUALSENSE	0x00000020	/* SIA senses both AUI & TP */
62526790Speter#define	TULIP_HAVE_SIAGP	0x00000040	/* SIA has a GP port */
62626790Speter#define	TULIP_HAVE_BROKEN_HASH	0x00000080	/* Broken Multicast Hash */
62726790Speter#define	TULIP_HAVE_ISVSROM	0x00000100	/* uses ISV SROM Format */
62826790Speter#define	TULIP_HAVE_BASEROM	0x00000200	/* Board ROM can be cloned */
62926790Speter#define	TULIP_HAVE_SLAVEDROM	0x00000400	/* Board ROM cloned */
63026790Speter#define	TULIP_HAVE_SLAVEDINTR	0x00000800	/* Board slaved interrupt */
63126790Speter#define	TULIP_HAVE_SHAREDINTR	0x00001000	/* Board shares interrupts */
63226790Speter#define	TULIP_HAVE_OKROM	0x00002000	/* ROM was recognized */
63326790Speter#define	TULIP_HAVE_NOMEDIA	0x00004000	/* did not detect any media */
63427859Speter#define	TULIP_HAVE_STOREFWD	0x00008000	/* have CMD_STOREFWD */
63530556Speter#define	TULIP_HAVE_SIA100	0x00010000	/* has LS100 in SIA status */
63631041Speter#define	TULIP_HAVE_OKSROM	0x00020000	/* SROM CRC is OK */
63726790Speter
638131847Sbms#define	TULIP_DO_AUTOSENSE(sc)	\
639131847Sbms	(IFM_SUBTYPE((sc)->tulip_ifmedia.ifm_media) == IFM_AUTO)
64026790Speter
64126790Speter#if defined(TULIP_HDR_DATA)
642131847Sbmsstatic const char *const tulip_chipdescs[] = {
643131847Sbms	"21040 [10Mb/s]",
644131847Sbms	"21041 [10Mb/s]",
645131847Sbms	"21140 [10-100Mb/s]",
646131847Sbms	"21140A [10-100Mb/s]",
647131847Sbms	"21142 [10-100Mb/s]",
648131847Sbms	"21143 [10-100Mb/s]",
64926790Speter};
65026790Speter
651131847Sbmsstatic const char *const tulip_mediums[] = {
652131847Sbms	"unknown",		/* TULIP_MEDIA_UNKNOWN */
653131847Sbms	"10baseT",		/* TULIP_MEDIA_10BASET */
654131847Sbms	"Full Duplex 10baseT",	/* TULIP_MEDIA_10BASET_FD */
655131847Sbms	"BNC",			/* TULIP_MEDIA_BNC */
656131847Sbms	"AUI",			/* TULIP_MEDIA_AUI */
657131847Sbms	"External SIA",		/* TULIP_MEDIA_EXTSIA */
658131847Sbms	"AUI/BNC",		/* TULIP_MEDIA_AUIBNC */
659131847Sbms	"100baseTX",		/* TULIP_MEDIA_100BASET */
660131847Sbms	"Full Duplex 100baseTX",/* TULIP_MEDIA_100BASET_FD */
661131847Sbms	"100baseT4",		/* TULIP_MEDIA_100BASET4 */
662131847Sbms	"100baseFX",		/* TULIP_MEDIA_100BASEFX */
663131847Sbms	"Full Duplex 100baseFX",/* TULIP_MEDIA_100BASEFX_FD */
66426790Speter};
66526790Speter
66626790Speterstatic const int tulip_media_to_ifmedia[] = {
667131847Sbms	IFM_ETHER | IFM_NONE,		/* TULIP_MEDIA_UNKNOWN */
668131847Sbms	IFM_ETHER | IFM_10_T,		/* TULIP_MEDIA_10BASET */
669131847Sbms	IFM_ETHER | IFM_10_T | IFM_FDX,	/* TULIP_MEDIA_10BASET_FD */
670131847Sbms	IFM_ETHER | IFM_10_2,		/* TULIP_MEDIA_BNC */
671131847Sbms	IFM_ETHER | IFM_10_5,		/* TULIP_MEDIA_AUI */
672131847Sbms	IFM_ETHER | IFM_MANUAL,		/* TULIP_MEDIA_EXTSIA */
673131847Sbms	IFM_ETHER | IFM_10_5,		/* TULIP_MEDIA_AUIBNC */
674131847Sbms	IFM_ETHER | IFM_100_TX,		/* TULIP_MEDIA_100BASET */
675131847Sbms	IFM_ETHER | IFM_100_TX | IFM_FDX,	/* TULIP_MEDIA_100BASET_FD */
676131847Sbms	IFM_ETHER | IFM_100_T4,		/* TULIP_MEDIA_100BASET4 */
677131847Sbms	IFM_ETHER | IFM_100_FX,		/* TULIP_MEDIA_100BASEFX */
678131847Sbms	IFM_ETHER | IFM_100_FX | IFM_FDX,	/* TULIP_MEDIA_100BASEFX_FD */
67926790Speter};
68026790Speter
681131847Sbmsstatic const char *const tulip_system_errors[] = {
682131847Sbms	"parity error",
683131847Sbms	"master abort",
684131847Sbms	"target abort",
685131847Sbms	"reserved #3",
686131847Sbms	"reserved #4",
687131847Sbms	"reserved #5",
688131847Sbms	"reserved #6",
689131847Sbms	"reserved #7",
69026790Speter};
69126790Speter
692131847Sbmsstatic const char *const tulip_status_bits[] = {
693131847Sbms	NULL,
694131847Sbms	"transmit process stopped",
695131847Sbms	NULL,
696131847Sbms	"transmit jabber timeout",
69726790Speter
698131847Sbms	NULL,
699131847Sbms	"transmit underflow",
700131847Sbms	NULL,
701131847Sbms	"receive underflow",
70226790Speter
703131847Sbms	"receive process stopped",
704131847Sbms	"receive watchdog timeout",
705131847Sbms	NULL,
706131847Sbms	NULL,
70726790Speter
708131847Sbms	"link failure",
709131847Sbms	NULL,
710131847Sbms	NULL,
71126790Speter};
71226790Speter
71326790Speterstatic const struct {
714131847Sbms	tulip_srom_connection_t sc_type;
715131847Sbms	tulip_media_t sc_media;
716131847Sbms	u_int32_t sc_attrs;
71726790Speter} tulip_srom_conninfo[] = {
718131847Sbms	{
719131847Sbms		TULIP_SROM_CONNTYPE_10BASET, TULIP_MEDIA_10BASET
720131847Sbms	},
721131847Sbms	{
722131847Sbms		TULIP_SROM_CONNTYPE_BNC, TULIP_MEDIA_BNC
723131847Sbms	},
724131847Sbms	{
725131847Sbms		TULIP_SROM_CONNTYPE_AUI, TULIP_MEDIA_AUI
726131847Sbms	},
727131847Sbms	{
728131847Sbms		TULIP_SROM_CONNTYPE_100BASETX, TULIP_MEDIA_100BASETX
729131847Sbms	},
730131847Sbms	{
731131847Sbms		TULIP_SROM_CONNTYPE_100BASET4, TULIP_MEDIA_100BASET4
732131847Sbms	},
733131847Sbms	{
734131847Sbms		TULIP_SROM_CONNTYPE_100BASEFX, TULIP_MEDIA_100BASEFX
735131847Sbms	},
736131847Sbms	{
737131847Sbms		TULIP_SROM_CONNTYPE_MII_10BASET, TULIP_MEDIA_10BASET,
738131847Sbms		TULIP_SROM_ATTR_MII
739131847Sbms	},
740131847Sbms	{
741131847Sbms		TULIP_SROM_CONNTYPE_MII_100BASETX, TULIP_MEDIA_100BASETX,
742131847Sbms		TULIP_SROM_ATTR_MII
743131847Sbms	},
744131847Sbms	{
745131847Sbms		TULIP_SROM_CONNTYPE_MII_100BASET4, TULIP_MEDIA_100BASET4,
746131847Sbms		TULIP_SROM_ATTR_MII
747131847Sbms	},
748131847Sbms	{
749131847Sbms		TULIP_SROM_CONNTYPE_MII_100BASEFX, TULIP_MEDIA_100BASEFX,
750131847Sbms		TULIP_SROM_ATTR_MII
751131847Sbms	},
752131847Sbms	{
753131847Sbms		TULIP_SROM_CONNTYPE_10BASET_NWAY, TULIP_MEDIA_10BASET,
754131847Sbms		TULIP_SROM_ATTR_NWAY
755131847Sbms	},
756131847Sbms	{
757131847Sbms		TULIP_SROM_CONNTYPE_10BASET_FD, TULIP_MEDIA_10BASET_FD
758131847Sbms	},
759131847Sbms	{
760131847Sbms		TULIP_SROM_CONNTYPE_MII_10BASET_FD, TULIP_MEDIA_10BASET_FD,
761131847Sbms		TULIP_SROM_ATTR_MII
762131847Sbms	},
763131847Sbms	{
764131847Sbms		TULIP_SROM_CONNTYPE_100BASETX_FD, TULIP_MEDIA_100BASETX_FD
765131847Sbms	},
766131847Sbms	{
767131847Sbms		TULIP_SROM_CONNTYPE_MII_100BASETX_FD, TULIP_MEDIA_100BASETX_FD,
768131847Sbms		TULIP_SROM_ATTR_MII
769131847Sbms	},
770131847Sbms	{
771131847Sbms		TULIP_SROM_CONNTYPE_10BASET_NOLINKPASS, TULIP_MEDIA_10BASET,
772131847Sbms		TULIP_SROM_ATTR_NOLINKPASS
773131847Sbms	},
774131847Sbms	{
775131847Sbms		TULIP_SROM_CONNTYPE_AUTOSENSE, TULIP_MEDIA_UNKNOWN,
776131847Sbms		TULIP_SROM_ATTR_AUTOSENSE
777131847Sbms	},
778131847Sbms	{
779131847Sbms		TULIP_SROM_CONNTYPE_AUTOSENSE_POWERUP, TULIP_MEDIA_UNKNOWN,
780131847Sbms		TULIP_SROM_ATTR_AUTOSENSE | TULIP_SROM_ATTR_POWERUP
781131847Sbms	},
782131847Sbms	{
783131847Sbms		TULIP_SROM_CONNTYPE_AUTOSENSE_NWAY, TULIP_MEDIA_UNKNOWN,
784131847Sbms		TULIP_SROM_ATTR_AUTOSENSE | TULIP_SROM_ATTR_NWAY
785131847Sbms	},
786131847Sbms	{
787131847Sbms		TULIP_SROM_CONNTYPE_NOT_USED, TULIP_MEDIA_UNKNOWN
788131847Sbms	}
78926790Speter};
79026790Speter#define	TULIP_SROM_LASTCONNIDX	\
79126790Speter		(sizeof(tulip_srom_conninfo)/sizeof(tulip_srom_conninfo[0]) - 1)
79226790Speter
79326790Speterstatic const struct {
794131847Sbms	tulip_media_t sm_type;
795131847Sbms	tulip_srom_media_t sm_srom_type;
79626790Speter} tulip_srom_mediums[] = {
797131847Sbms	{
798131847Sbms		TULIP_MEDIA_100BASEFX_FD, TULIP_SROM_MEDIA_100BASEFX_FD
799131847Sbms	},
800131847Sbms	{
801131847Sbms		TULIP_MEDIA_100BASEFX, TULIP_SROM_MEDIA_100BASEFX
802131847Sbms	},
803131847Sbms	{
804131847Sbms		TULIP_MEDIA_100BASET4, TULIP_SROM_MEDIA_100BASET4
805131847Sbms	},
806131847Sbms	{
807131847Sbms		TULIP_MEDIA_100BASETX_FD, TULIP_SROM_MEDIA_100BASETX_FD
808131847Sbms	},
809131847Sbms	{
810131847Sbms		TULIP_MEDIA_100BASETX, TULIP_SROM_MEDIA_100BASETX
811131847Sbms	},
812131847Sbms	{
813131847Sbms		TULIP_MEDIA_10BASET_FD, TULIP_SROM_MEDIA_10BASET_FD
814131847Sbms	},
815131847Sbms	{
816131847Sbms		TULIP_MEDIA_AUI, TULIP_SROM_MEDIA_AUI
817131847Sbms	},
818131847Sbms	{
819131847Sbms		TULIP_MEDIA_BNC, TULIP_SROM_MEDIA_BNC
820131847Sbms	},
821131847Sbms	{
822131847Sbms		TULIP_MEDIA_10BASET, TULIP_SROM_MEDIA_10BASET
823131847Sbms	},
824131847Sbms	{
825131847Sbms		TULIP_MEDIA_UNKNOWN
826131847Sbms	}
82726790Speter};
82826790Speter
829131847Sbms#endif				/* TULIP_HDR_DATA */
830131847Sbms
83126790Speter/*
832149473Sjhb * Macro to encode 16 bits of a MAC address into the setup buffer.  Since
833149473Sjhb * we are casting the two bytes in the char array to a uint16 and then
834149473Sjhb * handing them to this macro, we don't need to swap the bytes in the big
835149473Sjhb * endian case, just shift them left 16.
836149473Sjhb */
837149473Sjhb#if BYTE_ORDER == BIG_ENDIAN
838152962Sru#define	TULIP_SP_MAC(x)		((x) << 16)
839149473Sjhb#else
840152962Sru#define	TULIP_SP_MAC(x)		(x)
841149473Sjhb#endif
842149473Sjhb
843149473Sjhb/*
84426790Speter * This driver supports a maximum of 32 tulip boards.
845298955Spfg * This should be enough for the foreseeable future.
84626790Speter */
84726790Speter#define	TULIP_MAX_DEVICES	32
84826790Speter
849149473Sjhb#define	_TULIP_DESC_SYNC(ri, op)					\
850149473Sjhb	bus_dmamap_sync((ri)->ri_ring_tag, (ri)->ri_ring_map, (op))
851149473Sjhb#define	_TULIP_MAP_SYNC(ri, di, op)					\
852149473Sjhb	bus_dmamap_sync((ri)->ri_data_tag, *(di)->di_map, (op))
85334317Speter
854149473Sjhb/*
855149473Sjhb * Descriptors are both read from and written to by the card (corresponding
856149473Sjhb * to DMA WRITE and READ operations in bus-dma speak).  Receive maps are
857149473Sjhb * written to by the card (a DMA READ operation in bus-dma) and transmit
858149473Sjhb * buffers are read from by the card (a DMA WRITE operation in bus-dma).
859149473Sjhb */
860149473Sjhb#define TULIP_RXDESC_PRESYNC(ri)					\
861149473Sjhb	_TULIP_DESC_SYNC(ri, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE)
862149473Sjhb#define TULIP_RXDESC_POSTSYNC(ri)					\
863149473Sjhb	_TULIP_DESC_SYNC(ri, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE)
864149473Sjhb#define	TULIP_RXMAP_PRESYNC(ri, di)					\
865149473Sjhb	_TULIP_MAP_SYNC(ri, di, BUS_DMASYNC_PREREAD)
866149473Sjhb#define	TULIP_RXMAP_POSTSYNC(ri, di)					\
867149473Sjhb	_TULIP_MAP_SYNC(ri, di, BUS_DMASYNC_POSTREAD)
868149473Sjhb#define TULIP_TXDESC_PRESYNC(ri)					\
869149473Sjhb	_TULIP_DESC_SYNC(ri, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE)
870149473Sjhb#define TULIP_TXDESC_POSTSYNC(ri)					\
871149473Sjhb	_TULIP_DESC_SYNC(ri, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE)
872149473Sjhb#define	TULIP_TXMAP_PRESYNC(ri, di)					\
873149473Sjhb	_TULIP_MAP_SYNC(ri, di, BUS_DMASYNC_PREWRITE)
874149473Sjhb#define	TULIP_TXMAP_POSTSYNC(ri, di)					\
875149473Sjhb	_TULIP_MAP_SYNC(ri, di, BUS_DMASYNC_POSTWRITE)
87634317Speter
87726790Speter#if defined(TULIP_HDR_DATA)
878131847Sbmsstatic tulip_softc_t	*tulips[TULIP_MAX_DEVICES];
87926790Speter#endif
88049575Speter
88126790Speter#define	loudprintf			if (bootverbose) printf
88226790Speter
88327859Speter#if defined(TULIP_PERFSTATS)
88427859Speter#define	TULIP_PERFMERGE(sc, member) \
88527859Speter	do { (sc)->tulip_perfstats[TULIP_PERF_TOTAL].member \
88627859Speter	     += (sc)->tulip_perfstats[TULIP_PERF_CURRENT].member; \
88727859Speter	 (sc)->tulip_perfstats[TULIP_PERF_PREVIOUS].member \
88827859Speter	      = (sc)->tulip_perfstats[TULIP_PERF_CURRENT].member; \
88927859Speter	    (sc)->tulip_perfstats[TULIP_PERF_CURRENT].member = 0; } while (0)
89027859Speter#define	TULIP_PERFSTART(name) const tulip_cycle_t perfstart_ ## name = TULIP_PERFREAD();
89127859Speter#define	TULIP_PERFEND(name)	do { \
89227859Speter	    (sc)->tulip_curperfstats.perf_ ## name ## _cycles += TULIP_PERFDIFF(perfstart_ ## name, TULIP_PERFREAD()); \
89327859Speter	    (sc)->tulip_curperfstats.perf_ ## name ++; \
89427859Speter	} while (0)
895131847Sbms
896148249Sjhbtypedef u_long tulip_cycle_t;
897131847Sbms
898131575Sstefanfstatic __inline tulip_cycle_t
899131847SbmsTULIP_PERFREAD(void)
90027859Speter{
901148249Sjhb	return (get_cyclecount());
90227859Speter}
903131847Sbms
90427859Speter#define	TULIP_PERFDIFF(s, f)	((f) - (s))
90527859Speter#else
906131847Sbms#define	TULIP_PERFSTART(name)
90727859Speter#define	TULIP_PERFEND(name)	do { } while (0)
90827859Speter#define	TULIP_PERFMERGE(s,n)	do { } while (0)
909131847Sbms#endif	/* TULIP_PERFSTATS */
91027859Speter
911131847Sbms#define	TULIP_CRC32_POLY	0xEDB88320UL	/* CRC-32 Poly -- Little
912131847Sbms						 * Endian */
91326790Speter#define	TULIP_MAX_TXSEG		30
914149473Sjhb#define	TULIP_MAX_FRAGS		2
91526790Speter
91626790Speter#define	TULIP_ADDREQUAL(a1, a2) \
91726790Speter	(((u_int16_t *)a1)[0] == ((u_int16_t *)a2)[0] \
91826790Speter	 && ((u_int16_t *)a1)[1] == ((u_int16_t *)a2)[1] \
91926790Speter	 && ((u_int16_t *)a1)[2] == ((u_int16_t *)a2)[2])
92026790Speter#define	TULIP_ADDRBRDCST(a1) \
92126790Speter	(((u_int16_t *)a1)[0] == 0xFFFFU \
92226790Speter	 && ((u_int16_t *)a1)[1] == 0xFFFFU \
92326790Speter	 && ((u_int16_t *)a1)[2] == 0xFFFFU)
92426790Speter
925148445Sjhb#define	TULIP_MUTEX(sc)		(&(sc)->tulip_mutex)
926148445Sjhb#define	TULIP_LOCK(sc)		mtx_lock(TULIP_MUTEX(sc))
927148445Sjhb#define	TULIP_UNLOCK(sc)	mtx_unlock(TULIP_MUTEX(sc))
928148445Sjhb#define	TULIP_LOCK_ASSERT(sc)	mtx_assert(TULIP_MUTEX(sc), MA_OWNED)
929148445Sjhb
930156034Simp#endif	/* DEV_DE_IF_DEVAR_H */
931