if_devar.h revision 152962
149541Speter/*	$NetBSD: if_devar.h,v 1.32 1999/04/01 14:55:25 tsubai Exp $	*/
230556Speter
349562Speter/* $FreeBSD: head/sys/dev/de/if_devar.h 152962 2005-11-30 17:48:23Z ru $ */
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
31131847Sbms#ifndef _DEVAR_H
3226790Speter#define _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;
107149473Sjhb	uint32_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 */
13785959Speter#if !defined(__i386__)
13826790Speter#define	TULIP_COPY_RXDATA	1
13926790Speter#endif
14026790Speter
14134317Speter#define	TULIP_DATA_PER_DESC	2032
14226790Speter#define	TULIP_TXTIMER		4
14326790Speter#define	TULIP_RXDESCS		48
14426790Speter#define	TULIP_TXDESCS		128
14526790Speter#define	TULIP_RXQ_TARGET	32
14626790Speter#if TULIP_RXQ_TARGET >= TULIP_RXDESCS
147131847Sbms#error	TULIP_RXQ_TARGET must be less than TULIP_RXDESCS
14826790Speter#endif
14926790Speter#define	TULIP_RX_BUFLEN		((MCLBYTES < 2048 ? MCLBYTES : 2048) - 16)
15026790Speter
15126790Speter/*
15226790Speter * Forward reference to make C happy.
15326790Speter */
154131847Sbmstypedef struct tulip_softc	tulip_softc_t;
15526790Speter
15626790Speter/*
157131847Sbms * Enumeration of the various controllers supported.
15826790Speter */
15926790Spetertypedef enum {
160131847Sbms	TULIP_21040,
161131847Sbms	TULIP_21041,
162131847Sbms	TULIP_21140,
163131847Sbms	TULIP_21140A,
164131847Sbms	TULIP_21142,
165131847Sbms	TULIP_21143,
166131847Sbms	TULIP_CHIPID_UNKNOWN
16726790Speter} tulip_chipid_t;
16826790Speter
16926790Speter/*
17026790Speter * Various physical media types supported.
17126790Speter * BNCAUI is BNC or AUI since on the 21040 you can't really tell
17226790Speter * which is in use.
17326790Speter */
17426790Spetertypedef enum {
175131847Sbms	TULIP_MEDIA_UNKNOWN,
176131847Sbms	TULIP_MEDIA_10BASET,
177131847Sbms	TULIP_MEDIA_10BASET_FD,
178131847Sbms	TULIP_MEDIA_BNC,
179131847Sbms	TULIP_MEDIA_AUI,
180131847Sbms	TULIP_MEDIA_EXTSIA,
181131847Sbms	TULIP_MEDIA_AUIBNC,
182131847Sbms	TULIP_MEDIA_100BASETX,
183131847Sbms	TULIP_MEDIA_100BASETX_FD,
184131847Sbms	TULIP_MEDIA_100BASET4,
185131847Sbms	TULIP_MEDIA_100BASEFX,
186131847Sbms	TULIP_MEDIA_100BASEFX_FD,
187131847Sbms	TULIP_MEDIA_MAX
18826790Speter} tulip_media_t;
18926790Speter
19026790Speter#define	TULIP_BIT(b)		(1L << ((int)(b)))
19126790Speter#define	TULIP_FDBIT(m)		(1L << ((int)TULIP_MEDIA_ ## m ## _FD))
19226790Speter#define	TULIP_MBIT(m)		(1L << ((int)TULIP_MEDIA_ ## m ))
19326790Speter#define	TULIP_IS_MEDIA_FD(m)	(TULIP_BIT(m) & \
194131847Sbms				 (TULIP_FDBIT(10BASET) | \
195131847Sbms				  TULIP_FDBIT(100BASETX) | \
196131847Sbms				  TULIP_FDBIT(100BASEFX)))
19726790Speter#define	TULIP_CAN_MEDIA_FD(m)	(TULIP_BIT(m) & \
198131847Sbms				 (TULIP_MBIT(10BASET) | \
199131847Sbms				  TULIP_MBIT(100BASETX) | \
200131847Sbms				  TULIP_MBIT(100BASEFX)))
20126790Speter#define	TULIP_FD_MEDIA_OF(m)	((tulip_media_t)((m) + 1))
20226790Speter#define	TULIP_HD_MEDIA_OF(m)	((tulip_media_t)((m) - 1))
20326790Speter#define	TULIP_IS_MEDIA_100MB(m)	((m) >= TULIP_MEDIA_100BASETX)
20426790Speter#define	TULIP_IS_MEDIA_TP(m)	((TULIP_BIT(m) & \
205131847Sbms				  (TULIP_MBIT(BNC) | \
206131847Sbms				   TULIP_MBIT(AUI) | \
207131847Sbms				   TULIP_MBIT(AUIBNC) | \
208131847Sbms				   TULIP_MBIT(EXTSIA))) == 0)
20926790Speter
21026790Speter#define	TULIP_SROM_ATTR_MII		0x0100
21126790Speter#define	TULIP_SROM_ATTR_NWAY		0x0200
21226790Speter#define	TULIP_SROM_ATTR_AUTOSENSE	0x0400
21326790Speter#define	TULIP_SROM_ATTR_POWERUP		0x0800
21426790Speter#define	TULIP_SROM_ATTR_NOLINKPASS	0x1000
21526790Speter
21626790Spetertypedef struct {
217131847Sbms	enum {
218131847Sbms		TULIP_MEDIAINFO_NONE,
219131847Sbms		TULIP_MEDIAINFO_SIA,
220131847Sbms		TULIP_MEDIAINFO_GPR,
221131847Sbms		TULIP_MEDIAINFO_MII,
222131847Sbms		TULIP_MEDIAINFO_RESET,
223131847Sbms		TULIP_MEDIAINFO_SYM
224131847Sbms	} mi_type;
225131847Sbms	union {
226131847Sbms		struct {
227131847Sbms			u_int16_t sia_connectivity;
228131847Sbms			u_int16_t sia_tx_rx;
229131847Sbms			u_int16_t sia_general;
230131847Sbms			u_int32_t sia_gp_control;	/* 21142/21143 */
231131847Sbms			u_int32_t sia_gp_data;		/* 21142/21143 */
232131847Sbms		} un_sia;
233131847Sbms		struct {
234131847Sbms			u_int32_t gpr_cmdmode;
235131847Sbms			u_int32_t gpr_gpcontrol;	/* 21142/21143 */
236131847Sbms			u_int32_t gpr_gpdata;
237131847Sbms			u_int8_t gpr_actmask;
238131847Sbms			u_int8_t gpr_actdata;
239131847Sbms			u_int gpr_default:1;
240131847Sbms		} un_gpr;
241131847Sbms		struct {
242131847Sbms			u_int32_t mii_mediamask;
243131847Sbms			u_int16_t mii_capabilities;
244131847Sbms			u_int16_t mii_advertisement;
245131847Sbms			u_int16_t mii_full_duplex;
246131847Sbms			u_int16_t mii_tx_threshold;
247131847Sbms			u_int16_t mii_interrupt;	/* 21142/21143 */
248131847Sbms			u_int8_t mii_phyaddr;
249131847Sbms			u_int8_t mii_gpr_length;
250131847Sbms			u_int8_t mii_gpr_offset;
251131847Sbms			u_int8_t mii_reset_length;
252131847Sbms			u_int8_t mii_reset_offset;
253131847Sbms			u_int32_t mii_phyid;
254131847Sbms		} un_mii;
255131847Sbms	} mi_un;
25626790Speter} tulip_media_info_t;
25726790Speter
25826790Speter#define	mi_sia_connectivity	mi_un.un_sia.sia_connectivity
25926790Speter#define	mi_sia_tx_rx		mi_un.un_sia.sia_tx_rx
26026790Speter#define mi_sia_general		mi_un.un_sia.sia_general
26126790Speter#define	mi_sia_gp_control	mi_un.un_sia.sia_gp_control
26226790Speter#define	mi_sia_gp_data		mi_un.un_sia.sia_gp_data
26326790Speter
26426790Speter#define	mi_gpcontrol		mi_un.un_gpr.gpr_gpcontrol
26526790Speter#define	mi_gpdata		mi_un.un_gpr.gpr_gpdata
26626790Speter#define	mi_actmask		mi_un.un_gpr.gpr_actmask
26726790Speter#define	mi_actdata		mi_un.un_gpr.gpr_actdata
26826790Speter#define	mi_default		mi_un.un_gpr.gpr_default
26926790Speter#define	mi_cmdmode		mi_un.un_gpr.gpr_cmdmode
27026790Speter
27126790Speter#define	mi_phyaddr		mi_un.un_mii.mii_phyaddr
27226790Speter#define	mi_gpr_length		mi_un.un_mii.mii_gpr_length
27326790Speter#define	mi_gpr_offset		mi_un.un_mii.mii_gpr_offset
27426790Speter#define	mi_reset_length		mi_un.un_mii.mii_reset_length
27526790Speter#define	mi_reset_offset		mi_un.un_mii.mii_reset_offset
27626790Speter#define	mi_capabilities		mi_un.un_mii.mii_capabilities
27726790Speter#define	mi_advertisement	mi_un.un_mii.mii_advertisement
27826790Speter#define	mi_full_duplex		mi_un.un_mii.mii_full_duplex
27926790Speter#define	mi_tx_threshold		mi_un.un_mii.mii_tx_threshold
28026790Speter#define	mi_mediamask		mi_un.un_mii.mii_mediamask
28126790Speter#define	mi_mii_interrupt	mi_un.un_mii.mii_interrupt
28226790Speter#define	mi_phyid		mi_un.un_mii.mii_phyid
28326790Speter
284148248Sjhb#define	TULIP_MEDIAINFO_SIA_INIT(sc, mi, chipid, media) do {		\
285131847Sbms	(mi)->mi_type = TULIP_MEDIAINFO_SIA;				\
286131847Sbms	sc->tulip_mediums[TULIP_MEDIA_ ## media] = (mi);		\
287131847Sbms	(mi)->mi_sia_connectivity = TULIP_ ## chipid ## _SIACONN_ ## media; \
288131847Sbms	(mi)->mi_sia_tx_rx = TULIP_ ## chipid ## _SIATXRX_ ## media;	\
289131847Sbms	(mi)->mi_sia_general = TULIP_ ## chipid ## _SIAGEN_ ## media;	\
29026790Speter} while (0)
29126790Speter
292148248Sjhb#define TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, media) do {		\
293131847Sbms	if ((sc)->tulip_mediums[TULIP_MEDIA_ ## media] == NULL		\
294131847Sbms	    && ((mi)->mi_capabilities & PHYSTS_ ## media)) {		\
295131847Sbms		(sc)->tulip_mediums[TULIP_MEDIA_ ## media] = (mi);	\
296131847Sbms		(mi)->mi_mediamask |= TULIP_BIT(TULIP_MEDIA_ ## media);	\
297131847Sbms	}								\
29826790Speter} while (0)
29926790Speter
30026790Speter#define	TULIP_MII_NOPHY		32
30126790Speter/*
30226790Speter * Some boards need to treated specially.  The following enumeration
30326790Speter * identifies the cards with quirks (or those we just want to single
30426790Speter * out for special merit or scorn).
30526790Speter */
30626790Spetertypedef enum {
307131847Sbms	TULIP_21040_GENERIC,	/* Generic 21040 (works with most any board) */
308131847Sbms	TULIP_21140_ISV,	/* Digital Semicondutor 21140 ISV SROM Format */
309131847Sbms	TULIP_21142_ISV,	/* Digital Semicondutor 21142 ISV SROM Format */
310131847Sbms	TULIP_21143_ISV,	/* Digital Semicondutor 21143 ISV SROM Format */
311131847Sbms	TULIP_21140_DEC_EB,	/* Digital Semicondutor 21140 Eval. Board */
312131847Sbms	TULIP_21140_MII,	/* 21140[A] with MII */
313131847Sbms	TULIP_21140_DEC_DE500,	/* Digital DE500-?? 10/100 */
314131847Sbms	TULIP_21140_SMC_9332,	/* SMC 9332 */
315131847Sbms	TULIP_21140_COGENT_EM100,	/* Cogent EM100 100 only */
316131847Sbms	TULIP_21140_ZNYX_ZX34X,	/* ZNYX ZX342 10/100 */
317131847Sbms	TULIP_21140_ASANTE,	/* AsanteFast 10/100 */
318131847Sbms	TULIP_21140_EN1207,	/* Accton EN2107 10/100 BNC */
319131847Sbms	TULIP_21041_GENERIC	/* Generic 21041 card */
32026790Speter} tulip_board_t;
32126790Speter
32226790Spetertypedef enum {
323131847Sbms	TULIP_MEDIAPOLL_TIMER,		/* 100ms timer fired */
324131847Sbms	TULIP_MEDIAPOLL_FASTTIMER,	/* <100ms timer fired */
325131847Sbms	TULIP_MEDIAPOLL_LINKFAIL,	/* called from interrupt routine */
326131847Sbms	TULIP_MEDIAPOLL_LINKPASS,	/* called from interrupt routine */
327131847Sbms	TULIP_MEDIAPOLL_START,		/* start a media probe (from reset) */
328131847Sbms	TULIP_MEDIAPOLL_TXPROBE_OK,	/* txprobe succeeded */
329131847Sbms	TULIP_MEDIAPOLL_TXPROBE_FAILED,	/* txprobe failed */
330131847Sbms	TULIP_MEDIAPOLL_MAX
33126790Speter} tulip_mediapoll_event_t;
33226790Speter
33326790Spetertypedef enum {
334131847Sbms	TULIP_LINK_DOWN,	/* Link is down */
335131847Sbms	TULIP_LINK_UP,		/* link is ok */
336131847Sbms	TULIP_LINK_UNKNOWN	/* we can't tell either way */
33726790Speter} tulip_link_status_t;
33826790Speter
33926790Speter/*
34026790Speter * This data structure is used to abstract out the quirks.
34126790Speter * media_probe  = tries to determine the media type.
34226790Speter * media_select = enables the current media (or autosenses)
34326790Speter * media_poll	= autosenses media
34426790Speter * media_preset = 21140, etal requires bit to set before the
34526790Speter *		  the software reset; hence pre-set.  Should be
34626790Speter *		  pre-reset but that's ugly.
34726790Speter */
34826790Spetertypedef struct {
349131847Sbms	tulip_board_t bd_type;
350131847Sbms	void (*bd_media_probe)(tulip_softc_t * const sc);
351131847Sbms	void (*bd_media_select)(tulip_softc_t * const sc);
352131847Sbms	void (*bd_media_poll)(tulip_softc_t * const sc,
353131847Sbms    tulip_mediapoll_event_t event);
354131847Sbms	void (*bd_media_preset) (tulip_softc_t * const sc);
35526790Speter} tulip_boardsw_t;
35626790Speter
35726790Speter/*
358131847Sbms * The next few declarations are for MII/PHY based boards.
35926790Speter *
36026790Speter *    The first enumeration identifies a superset of various datums
36126790Speter * that can be obtained from various PHY chips.  Not all PHYs will
36226790Speter * support all datums.
36326790Speter *    The modedata structure indicates what register contains
36426790Speter * a datum, what mask is applied the register contents, and what the
36526790Speter * result should be.
36626790Speter *    The attr structure records information about a supported PHY.
36726790Speter *    The phy structure records information about a PHY instance.
36826790Speter */
36926790Spetertypedef enum {
370131847Sbms	PHY_MODE_10T,
371131847Sbms	PHY_MODE_100TX,
372131847Sbms	PHY_MODE_100T4,
373131847Sbms	PHY_MODE_FULLDUPLEX,
374131847Sbms	PHY_MODE_MAX
37526790Speter} tulip_phy_mode_t;
37626790Speter
37726790Spetertypedef struct {
378131847Sbms	u_int16_t	pm_regno;
379131847Sbms	u_int16_t	pm_mask;
380131847Sbms	u_int16_t	pm_value;
38126790Speter} tulip_phy_modedata_t;
38226790Speter
38326790Spetertypedef struct {
384131847Sbms	u_int32_t	attr_id;
385131847Sbms	u_int16_t	attr_flags;
386131847Sbms	tulip_phy_modedata_t	attr_modes[PHY_MODE_MAX];
38726790Speter#ifdef TULIP_DEBUG
388131847Sbms	const char	*attr_name;
38926790Speter#endif
39026790Speter} tulip_phy_attr_t;
39126790Speter
392131847Sbms/* Definitions for tulip_phy_attr_t.attr_flags */
393131847Sbms#define	PHY_NEED_HARD_RESET	0x0001
394131847Sbms#define	PHY_DUAL_CYCLE_TA	0x0002
395131847Sbms
39626790Speter/*
39726790Speter * Various probe states used when trying to autosense the media.
39826790Speter */
39926790Spetertypedef enum {
400131847Sbms	TULIP_PROBE_INACTIVE,
401131847Sbms	TULIP_PROBE_PHYRESET,
402131847Sbms	TULIP_PROBE_PHYAUTONEG,
403131847Sbms	TULIP_PROBE_GPRTEST,
404131847Sbms	TULIP_PROBE_MEDIATEST,
405131847Sbms	TULIP_PROBE_FAILED
40626790Speter} tulip_probe_state_t;
40726790Speter
40826790Spetertypedef struct {
409131847Sbms	/*
410131847Sbms	 * Transmit Statistics
411131847Sbms	 */
412131847Sbms	u_int32_t	dot3StatsSingleCollisionFrames;
413131847Sbms	u_int32_t	dot3StatsMultipleCollisionFrames;
414131847Sbms	u_int32_t	dot3StatsSQETestErrors;
415131847Sbms	u_int32_t	dot3StatsDeferredTransmissions;
416131847Sbms	u_int32_t	dot3StatsLateCollisions;
417131847Sbms	u_int32_t	dot3StatsExcessiveCollisions;
418131847Sbms	u_int32_t	dot3StatsCarrierSenseErrors;
419131847Sbms	u_int32_t	dot3StatsInternalMacTransmitErrors;
420131847Sbms	/* not in rfc1650! */
421131847Sbms	u_int32_t	dot3StatsInternalTransmitUnderflows;
422131847Sbms	/* not in rfc1650! */
423131847Sbms	u_int32_t	dot3StatsInternalTransmitBabbles;
424131847Sbms	/*
425131847Sbms	 * Receive Statistics
426131847Sbms	 */
427131847Sbms	u_int32_t	dot3StatsMissedFrames;	/* not in rfc1650! */
428131847Sbms	u_int32_t	dot3StatsAlignmentErrors;
429131847Sbms	u_int32_t	dot3StatsFCSErrors;
430131847Sbms	u_int32_t	dot3StatsFrameTooLongs;
431131847Sbms	u_int32_t	dot3StatsInternalMacReceiveErrors;
43226790Speter} tulip_dot3_stats_t;
43326790Speter
43426790Speter/*
435131847Sbms * Probe information.
43626790Speter */
437131847Sbmsstruct tulip_probe_info {
438131847Sbms	u_int8_t	probe_count;		/* count of probe operations */
439131847Sbms	int32_t		probe_timeout;		/* time (ms) of probe timeout */
440131847Sbms	tulip_probe_state_t	probe_state;	/* current media probe state */
441131847Sbms	tulip_media_t	probe_media;		/* current media being probed */
442131847Sbms	u_int32_t	probe_mediamask;	/* medias checked */
443131847Sbms	u_int32_t	probe_passes;		/* times autosense failed */
444131847Sbms	u_int32_t	probe_txprobes;		/* txprobes attempted */
445131847Sbms};
446131847Sbms
447131847Sbms/*
448131847Sbms * Debugging/Statistical information.
449131847Sbms */
450131847Sbmsstruct tulip_dbg_info {
451131847Sbms	tulip_media_t	dbg_last_media;
452131847Sbms	u_int32_t	dbg_intrs;
453131847Sbms	u_int32_t	dbg_media_probes;
454131847Sbms	u_int32_t	dbg_txprobe_nocarr;
455131847Sbms	u_int32_t	dbg_txprobe_exccoll;
456131847Sbms	u_int32_t	dbg_link_downed;
457131847Sbms	u_int32_t	dbg_link_suspected;
458131847Sbms	u_int32_t	dbg_link_intrs;
459131847Sbms	u_int32_t	dbg_link_pollintrs;
460131847Sbms	u_int32_t	dbg_link_failures;
461131847Sbms	u_int32_t	dbg_nway_starts;
462131847Sbms	u_int32_t	dbg_nway_failures;
463131847Sbms	u_int16_t	dbg_phyregs[32][4];
464131847Sbms	u_int32_t	dbg_rxlowbufs;
465131847Sbms	u_int32_t	dbg_rxintrs;
466131847Sbms	u_int32_t	dbg_last_rxintrs;
467131847Sbms	u_int32_t	dbg_high_rxintrs_hz;
468131847Sbms	u_int32_t	dbg_no_txmaps;
469131847Sbms	u_int32_t	dbg_txput_finishes[8];
470131847Sbms	u_int32_t	dbg_txprobes_ok[TULIP_MEDIA_MAX];
471131847Sbms	u_int32_t	dbg_txprobes_failed[TULIP_MEDIA_MAX];
472131847Sbms	u_int32_t	dbg_events[TULIP_MEDIAPOLL_MAX];
473131847Sbms	u_int32_t	dbg_rxpktsperintr[TULIP_RXDESCS];
474131847Sbms};
475131847Sbms
476131847Sbms/*
477131847Sbms * Performance statistics.
478131847Sbms */
479131847Sbmsstruct tulip_perfstat {
480131847Sbms	u_quad_t	perf_intr_cycles;
481131847Sbms	u_quad_t	perf_ifstart_cycles;
482131847Sbms	u_quad_t	perf_ifstart_one_cycles;
483131847Sbms	u_quad_t	perf_ifioctl_cycles;
484131847Sbms	u_quad_t	perf_ifwatchdog_cycles;
485131847Sbms	u_quad_t	perf_timeout_cycles;
486131847Sbms	u_quad_t	perf_txput_cycles;
487131847Sbms	u_quad_t	perf_txintr_cycles;
488131847Sbms	u_quad_t	perf_rxintr_cycles;
489131847Sbms	u_quad_t	perf_rxget_cycles;
490131847Sbms	unsigned int	perf_intr;
491131847Sbms	unsigned int	perf_ifstart;
492131847Sbms	unsigned int	perf_ifstart_one;
493131847Sbms	unsigned int	perf_ifioctl;
494131847Sbms	unsigned int	perf_ifwatchdog;
495131847Sbms	unsigned int	perf_timeout;
496131847Sbms	unsigned int	perf_txput;
497131847Sbms	unsigned int	perf_txintr;
498131847Sbms	unsigned int	perf_rxintr;
499131847Sbms	unsigned int	perf_rxget;
500131847Sbms};
501131847Sbms#define	TULIP_PERF_CURRENT	0
502131847Sbms#define	TULIP_PERF_PREVIOUS	1
503131847Sbms#define	TULIP_PERF_TOTAL	2
504131847Sbms#define	TULIP_PERF_MAX		3
505131847Sbms
506131847Sbms/*
507131847Sbms * Per-driver-instance state.
508131847Sbms */
509131847Sbmsstruct tulip_softc {
510131847Sbms	struct ifmedia		tulip_ifmedia;
511131847Sbms	int			tulip_unit;
512147256Sbrooks	struct ifnet		*tulip_ifp;
513147256Sbrooks	u_char			tulip_enaddr[6];
514131847Sbms	bus_space_tag_t		tulip_csrs_bst;
515131847Sbms	bus_space_handle_t	tulip_csrs_bsh;
516131847Sbms	tulip_regfile_t		tulip_csrs;
517131847Sbms
518131847Sbms	u_int32_t		tulip_flags;
519131847Sbms	u_int32_t		tulip_features;
520131847Sbms	u_int32_t		tulip_intrmask;
521131847Sbms	u_int32_t		tulip_cmdmode;
522131847Sbms	u_int32_t		tulip_last_system_error:3;
523131847Sbms	u_int32_t		tulip_txtimer:2;	/* transmission timer */
524131847Sbms	u_int32_t		tulip_system_errors;
525131847Sbms	u_int32_t		tulip_statusbits;	/* status bits from
526131847Sbms							 * CSR5 that may need
527131847Sbms							 * to be printed
528131847Sbms							 */
529131847Sbms	tulip_media_info_t	*tulip_mediums[TULIP_MEDIA_MAX];
530131847Sbms	tulip_media_t		tulip_media;		/* current media type */
531131847Sbms	u_int32_t		tulip_abilities;	/* remote system's
532131847Sbms							 * abilities (as
533131847Sbms							 * defined in IEEE
534131847Sbms							 * 802.3u)
535131847Sbms							 */
536131847Sbms	u_int8_t		tulip_revinfo;		/* chip revision */
537131847Sbms	u_int8_t		tulip_phyaddr;		/* current phy */
538131847Sbms	u_int8_t		tulip_gpinit;		/* active pins on
539131847Sbms							 * 21140
540131847Sbms							 */
541131847Sbms	u_int8_t		tulip_gpdata;	/* default gpdata for 21140 */
542131847Sbms	struct tulip_probe_info	tulip_probe;
543131847Sbms	tulip_chipid_t		tulip_chipid;	/* type of chip we are using */
544131847Sbms	const tulip_boardsw_t	*tulip_boardsw;	/* board/chip characteristics */
545131847Sbms	tulip_softc_t		*tulip_slaves;	/* slaved devices (ZX3xx) */
546131847Sbms#if defined(TULIP_DEBUG)
547131847Sbms	struct tulip_dbg_info	tulip_dbg;
548131847Sbms#endif
549131847Sbms#if defined(TULIP_PERFSTATS)
550131847Sbms	struct tulip_perfstat	tulip_perfstats[TULIP_PERF_MAX];
551131847Sbms#endif
552131847Sbms	tulip_dot3_stats_t	tulip_dot3stats;
553131847Sbms	tulip_ringinfo_t	tulip_rxinfo;
554131847Sbms	tulip_ringinfo_t	tulip_txinfo;
555131847Sbms	tulip_media_info_t	tulip_mediainfo[10];
556131847Sbms	/*
557131847Sbms	 * The setup buffers for sending the setup frame to the chip. one is
558131847Sbms	 * the one being sent while the other is the one being filled.
559131847Sbms	 */
560149473Sjhb	bus_dma_tag_t		tulip_setup_tag;
561149473Sjhb	bus_dmamap_t		tulip_setup_map;
562149473Sjhb	uint32_t		tulip_setup_dma_addr;
563149473Sjhb	u_int32_t		*tulip_setupbuf;
564131847Sbms	u_int32_t		tulip_setupdata[192 / sizeof(u_int32_t)];
565131847Sbms	char			tulip_boardid[24];
566131847Sbms	u_int8_t		tulip_rombuf[128];	/* must be aligned */
567131847Sbms
568131847Sbms	/* needed for multiport boards */
569131847Sbms	u_int8_t		tulip_pci_busno;
570131847Sbms	u_int8_t		tulip_pci_devno;
571131847Sbms
572131847Sbms	u_int8_t		tulip_connidx;
573131847Sbms	tulip_srom_connection_t	tulip_conntype;
574148445Sjhb	struct callout		tulip_callout;
575148445Sjhb	struct mtx		tulip_mutex;
576131847Sbms};
577131847Sbms
578131847Sbms#define	tulip_curperfstats	tulip_perfstats[TULIP_PERF_CURRENT]
579131847Sbms#define	tulip_probe_count	tulip_probe.probe_count
580131847Sbms#define	tulip_probe_timeout	tulip_probe.probe_timeout
581131847Sbms#define	tulip_probe_state	tulip_probe.probe_state
582131847Sbms#define	tulip_probe_media	tulip_probe.probe_media
583131847Sbms#define	tulip_probe_mediamask	tulip_probe.probe_mediamask
584131847Sbms#define	tulip_probe_passes	tulip_probe.probe_passes
585131847Sbms
586131847Sbms/* Definitions for tulip_flags. */
58726790Speter#define	TULIP_WANTSETUP		0x00000001
58826790Speter#define	TULIP_WANTHASHPERFECT	0x00000002
58926790Speter#define	TULIP_WANTHASHONLY	0x00000004
59026790Speter#define	TULIP_DOINGSETUP	0x00000008
59126790Speter#define	TULIP_PRINTMEDIA	0x00000010
59226790Speter#define	TULIP_TXPROBE_ACTIVE	0x00000020
59326790Speter#define	TULIP_ALLMULTI		0x00000040
59426790Speter#define	TULIP_WANTRXACT		0x00000080
59526790Speter#define	TULIP_RXACT		0x00000100
59626790Speter#define	TULIP_INRESET		0x00000200
59726790Speter#define	TULIP_NEEDRESET		0x00000400
59826790Speter#define	TULIP_SQETEST		0x00000800
59926790Speter#define	TULIP_xxxxxx0		0x00001000
60026790Speter#define	TULIP_xxxxxx1		0x00002000
60127859Speter#define	TULIP_WANTTXSTART	0x00004000
60227859Speter#define	TULIP_NEWTXTHRESH	0x00008000
60326790Speter#define	TULIP_NOAUTOSENSE	0x00010000
60426790Speter#define	TULIP_PRINTLINKUP	0x00020000
60526790Speter#define	TULIP_LINKUP		0x00040000
60626790Speter#define	TULIP_RXBUFSLOW		0x00080000
60726790Speter#define	TULIP_NOMESSAGES	0x00100000
60826790Speter#define	TULIP_SYSTEMERROR	0x00200000
60926790Speter#define	TULIP_TIMEOUTPENDING	0x00400000
61027859Speter#define	TULIP_xxxxxx2		0x00800000
61126790Speter#define	TULIP_TRYNWAY		0x01000000
61226790Speter#define	TULIP_DIDNWAY		0x02000000
61326790Speter#define	TULIP_RXIGNORE		0x04000000
61426790Speter#define	TULIP_PROBE1STPASS	0x08000000
61526790Speter#define	TULIP_DEVICEPROBE	0x10000000
61626790Speter#define	TULIP_PROMISC		0x20000000
61726790Speter#define	TULIP_HASHONLY		0x40000000
61827859Speter#define	TULIP_xxxxxx3		0x80000000
619131847Sbms
620131847Sbms/* Definitions for tulip_features. */
62126790Speter#define	TULIP_HAVE_GPR		0x00000001	/* have gp register (140[A]) */
62226790Speter#define	TULIP_HAVE_RXBADOVRFLW	0x00000002	/* RX corrupts on overflow */
62326790Speter#define	TULIP_HAVE_POWERMGMT	0x00000004	/* Snooze/sleep modes */
62426790Speter#define	TULIP_HAVE_MII		0x00000008	/* Some medium on MII */
62526790Speter#define	TULIP_HAVE_SIANWAY	0x00000010	/* SIA does NWAY */
62626790Speter#define	TULIP_HAVE_DUALSENSE	0x00000020	/* SIA senses both AUI & TP */
62726790Speter#define	TULIP_HAVE_SIAGP	0x00000040	/* SIA has a GP port */
62826790Speter#define	TULIP_HAVE_BROKEN_HASH	0x00000080	/* Broken Multicast Hash */
62926790Speter#define	TULIP_HAVE_ISVSROM	0x00000100	/* uses ISV SROM Format */
63026790Speter#define	TULIP_HAVE_BASEROM	0x00000200	/* Board ROM can be cloned */
63126790Speter#define	TULIP_HAVE_SLAVEDROM	0x00000400	/* Board ROM cloned */
63226790Speter#define	TULIP_HAVE_SLAVEDINTR	0x00000800	/* Board slaved interrupt */
63326790Speter#define	TULIP_HAVE_SHAREDINTR	0x00001000	/* Board shares interrupts */
63426790Speter#define	TULIP_HAVE_OKROM	0x00002000	/* ROM was recognized */
63526790Speter#define	TULIP_HAVE_NOMEDIA	0x00004000	/* did not detect any media */
63627859Speter#define	TULIP_HAVE_STOREFWD	0x00008000	/* have CMD_STOREFWD */
63730556Speter#define	TULIP_HAVE_SIA100	0x00010000	/* has LS100 in SIA status */
63831041Speter#define	TULIP_HAVE_OKSROM	0x00020000	/* SROM CRC is OK */
63926790Speter
640131847Sbms#define	TULIP_DO_AUTOSENSE(sc)	\
641131847Sbms	(IFM_SUBTYPE((sc)->tulip_ifmedia.ifm_media) == IFM_AUTO)
64226790Speter
64326790Speter#if defined(TULIP_HDR_DATA)
644131847Sbmsstatic const char *const tulip_chipdescs[] = {
645131847Sbms	"21040 [10Mb/s]",
646131847Sbms	"21041 [10Mb/s]",
647131847Sbms	"21140 [10-100Mb/s]",
648131847Sbms	"21140A [10-100Mb/s]",
649131847Sbms	"21142 [10-100Mb/s]",
650131847Sbms	"21143 [10-100Mb/s]",
65126790Speter};
65226790Speter
653131847Sbmsstatic const char *const tulip_mediums[] = {
654131847Sbms	"unknown",		/* TULIP_MEDIA_UNKNOWN */
655131847Sbms	"10baseT",		/* TULIP_MEDIA_10BASET */
656131847Sbms	"Full Duplex 10baseT",	/* TULIP_MEDIA_10BASET_FD */
657131847Sbms	"BNC",			/* TULIP_MEDIA_BNC */
658131847Sbms	"AUI",			/* TULIP_MEDIA_AUI */
659131847Sbms	"External SIA",		/* TULIP_MEDIA_EXTSIA */
660131847Sbms	"AUI/BNC",		/* TULIP_MEDIA_AUIBNC */
661131847Sbms	"100baseTX",		/* TULIP_MEDIA_100BASET */
662131847Sbms	"Full Duplex 100baseTX",/* TULIP_MEDIA_100BASET_FD */
663131847Sbms	"100baseT4",		/* TULIP_MEDIA_100BASET4 */
664131847Sbms	"100baseFX",		/* TULIP_MEDIA_100BASEFX */
665131847Sbms	"Full Duplex 100baseFX",/* TULIP_MEDIA_100BASEFX_FD */
66626790Speter};
66726790Speter
66826790Speterstatic const int tulip_media_to_ifmedia[] = {
669131847Sbms	IFM_ETHER | IFM_NONE,		/* TULIP_MEDIA_UNKNOWN */
670131847Sbms	IFM_ETHER | IFM_10_T,		/* TULIP_MEDIA_10BASET */
671131847Sbms	IFM_ETHER | IFM_10_T | IFM_FDX,	/* TULIP_MEDIA_10BASET_FD */
672131847Sbms	IFM_ETHER | IFM_10_2,		/* TULIP_MEDIA_BNC */
673131847Sbms	IFM_ETHER | IFM_10_5,		/* TULIP_MEDIA_AUI */
674131847Sbms	IFM_ETHER | IFM_MANUAL,		/* TULIP_MEDIA_EXTSIA */
675131847Sbms	IFM_ETHER | IFM_10_5,		/* TULIP_MEDIA_AUIBNC */
676131847Sbms	IFM_ETHER | IFM_100_TX,		/* TULIP_MEDIA_100BASET */
677131847Sbms	IFM_ETHER | IFM_100_TX | IFM_FDX,	/* TULIP_MEDIA_100BASET_FD */
678131847Sbms	IFM_ETHER | IFM_100_T4,		/* TULIP_MEDIA_100BASET4 */
679131847Sbms	IFM_ETHER | IFM_100_FX,		/* TULIP_MEDIA_100BASEFX */
680131847Sbms	IFM_ETHER | IFM_100_FX | IFM_FDX,	/* TULIP_MEDIA_100BASEFX_FD */
68126790Speter};
68226790Speter
683131847Sbmsstatic const char *const tulip_system_errors[] = {
684131847Sbms	"parity error",
685131847Sbms	"master abort",
686131847Sbms	"target abort",
687131847Sbms	"reserved #3",
688131847Sbms	"reserved #4",
689131847Sbms	"reserved #5",
690131847Sbms	"reserved #6",
691131847Sbms	"reserved #7",
69226790Speter};
69326790Speter
694131847Sbmsstatic const char *const tulip_status_bits[] = {
695131847Sbms	NULL,
696131847Sbms	"transmit process stopped",
697131847Sbms	NULL,
698131847Sbms	"transmit jabber timeout",
69926790Speter
700131847Sbms	NULL,
701131847Sbms	"transmit underflow",
702131847Sbms	NULL,
703131847Sbms	"receive underflow",
70426790Speter
705131847Sbms	"receive process stopped",
706131847Sbms	"receive watchdog timeout",
707131847Sbms	NULL,
708131847Sbms	NULL,
70926790Speter
710131847Sbms	"link failure",
711131847Sbms	NULL,
712131847Sbms	NULL,
71326790Speter};
71426790Speter
71526790Speterstatic const struct {
716131847Sbms	tulip_srom_connection_t sc_type;
717131847Sbms	tulip_media_t sc_media;
718131847Sbms	u_int32_t sc_attrs;
71926790Speter} tulip_srom_conninfo[] = {
720131847Sbms	{
721131847Sbms		TULIP_SROM_CONNTYPE_10BASET, TULIP_MEDIA_10BASET
722131847Sbms	},
723131847Sbms	{
724131847Sbms		TULIP_SROM_CONNTYPE_BNC, TULIP_MEDIA_BNC
725131847Sbms	},
726131847Sbms	{
727131847Sbms		TULIP_SROM_CONNTYPE_AUI, TULIP_MEDIA_AUI
728131847Sbms	},
729131847Sbms	{
730131847Sbms		TULIP_SROM_CONNTYPE_100BASETX, TULIP_MEDIA_100BASETX
731131847Sbms	},
732131847Sbms	{
733131847Sbms		TULIP_SROM_CONNTYPE_100BASET4, TULIP_MEDIA_100BASET4
734131847Sbms	},
735131847Sbms	{
736131847Sbms		TULIP_SROM_CONNTYPE_100BASEFX, TULIP_MEDIA_100BASEFX
737131847Sbms	},
738131847Sbms	{
739131847Sbms		TULIP_SROM_CONNTYPE_MII_10BASET, TULIP_MEDIA_10BASET,
740131847Sbms		TULIP_SROM_ATTR_MII
741131847Sbms	},
742131847Sbms	{
743131847Sbms		TULIP_SROM_CONNTYPE_MII_100BASETX, TULIP_MEDIA_100BASETX,
744131847Sbms		TULIP_SROM_ATTR_MII
745131847Sbms	},
746131847Sbms	{
747131847Sbms		TULIP_SROM_CONNTYPE_MII_100BASET4, TULIP_MEDIA_100BASET4,
748131847Sbms		TULIP_SROM_ATTR_MII
749131847Sbms	},
750131847Sbms	{
751131847Sbms		TULIP_SROM_CONNTYPE_MII_100BASEFX, TULIP_MEDIA_100BASEFX,
752131847Sbms		TULIP_SROM_ATTR_MII
753131847Sbms	},
754131847Sbms	{
755131847Sbms		TULIP_SROM_CONNTYPE_10BASET_NWAY, TULIP_MEDIA_10BASET,
756131847Sbms		TULIP_SROM_ATTR_NWAY
757131847Sbms	},
758131847Sbms	{
759131847Sbms		TULIP_SROM_CONNTYPE_10BASET_FD, TULIP_MEDIA_10BASET_FD
760131847Sbms	},
761131847Sbms	{
762131847Sbms		TULIP_SROM_CONNTYPE_MII_10BASET_FD, TULIP_MEDIA_10BASET_FD,
763131847Sbms		TULIP_SROM_ATTR_MII
764131847Sbms	},
765131847Sbms	{
766131847Sbms		TULIP_SROM_CONNTYPE_100BASETX_FD, TULIP_MEDIA_100BASETX_FD
767131847Sbms	},
768131847Sbms	{
769131847Sbms		TULIP_SROM_CONNTYPE_MII_100BASETX_FD, TULIP_MEDIA_100BASETX_FD,
770131847Sbms		TULIP_SROM_ATTR_MII
771131847Sbms	},
772131847Sbms	{
773131847Sbms		TULIP_SROM_CONNTYPE_10BASET_NOLINKPASS, TULIP_MEDIA_10BASET,
774131847Sbms		TULIP_SROM_ATTR_NOLINKPASS
775131847Sbms	},
776131847Sbms	{
777131847Sbms		TULIP_SROM_CONNTYPE_AUTOSENSE, TULIP_MEDIA_UNKNOWN,
778131847Sbms		TULIP_SROM_ATTR_AUTOSENSE
779131847Sbms	},
780131847Sbms	{
781131847Sbms		TULIP_SROM_CONNTYPE_AUTOSENSE_POWERUP, TULIP_MEDIA_UNKNOWN,
782131847Sbms		TULIP_SROM_ATTR_AUTOSENSE | TULIP_SROM_ATTR_POWERUP
783131847Sbms	},
784131847Sbms	{
785131847Sbms		TULIP_SROM_CONNTYPE_AUTOSENSE_NWAY, TULIP_MEDIA_UNKNOWN,
786131847Sbms		TULIP_SROM_ATTR_AUTOSENSE | TULIP_SROM_ATTR_NWAY
787131847Sbms	},
788131847Sbms	{
789131847Sbms		TULIP_SROM_CONNTYPE_NOT_USED, TULIP_MEDIA_UNKNOWN
790131847Sbms	}
79126790Speter};
79226790Speter#define	TULIP_SROM_LASTCONNIDX	\
79326790Speter		(sizeof(tulip_srom_conninfo)/sizeof(tulip_srom_conninfo[0]) - 1)
79426790Speter
79526790Speterstatic const struct {
796131847Sbms	tulip_media_t sm_type;
797131847Sbms	tulip_srom_media_t sm_srom_type;
79826790Speter} tulip_srom_mediums[] = {
799131847Sbms	{
800131847Sbms		TULIP_MEDIA_100BASEFX_FD, TULIP_SROM_MEDIA_100BASEFX_FD
801131847Sbms	},
802131847Sbms	{
803131847Sbms		TULIP_MEDIA_100BASEFX, TULIP_SROM_MEDIA_100BASEFX
804131847Sbms	},
805131847Sbms	{
806131847Sbms		TULIP_MEDIA_100BASET4, TULIP_SROM_MEDIA_100BASET4
807131847Sbms	},
808131847Sbms	{
809131847Sbms		TULIP_MEDIA_100BASETX_FD, TULIP_SROM_MEDIA_100BASETX_FD
810131847Sbms	},
811131847Sbms	{
812131847Sbms		TULIP_MEDIA_100BASETX, TULIP_SROM_MEDIA_100BASETX
813131847Sbms	},
814131847Sbms	{
815131847Sbms		TULIP_MEDIA_10BASET_FD, TULIP_SROM_MEDIA_10BASET_FD
816131847Sbms	},
817131847Sbms	{
818131847Sbms		TULIP_MEDIA_AUI, TULIP_SROM_MEDIA_AUI
819131847Sbms	},
820131847Sbms	{
821131847Sbms		TULIP_MEDIA_BNC, TULIP_SROM_MEDIA_BNC
822131847Sbms	},
823131847Sbms	{
824131847Sbms		TULIP_MEDIA_10BASET, TULIP_SROM_MEDIA_10BASET
825131847Sbms	},
826131847Sbms	{
827131847Sbms		TULIP_MEDIA_UNKNOWN
828131847Sbms	}
82926790Speter};
83026790Speter
831131847Sbms#endif				/* TULIP_HDR_DATA */
832131847Sbms
83326790Speter/*
834149473Sjhb * Macro to encode 16 bits of a MAC address into the setup buffer.  Since
835149473Sjhb * we are casting the two bytes in the char array to a uint16 and then
836149473Sjhb * handing them to this macro, we don't need to swap the bytes in the big
837149473Sjhb * endian case, just shift them left 16.
838149473Sjhb */
839149473Sjhb#if BYTE_ORDER == BIG_ENDIAN
840152962Sru#define	TULIP_SP_MAC(x)		((x) << 16)
841149473Sjhb#else
842152962Sru#define	TULIP_SP_MAC(x)		(x)
843149473Sjhb#endif
844149473Sjhb
845149473Sjhb/*
84626790Speter * This driver supports a maximum of 32 tulip boards.
84726790Speter * This should be enough for the forseeable future.
84826790Speter */
84926790Speter#define	TULIP_MAX_DEVICES	32
85026790Speter
851149473Sjhb#define	_TULIP_DESC_SYNC(ri, op)					\
852149473Sjhb	bus_dmamap_sync((ri)->ri_ring_tag, (ri)->ri_ring_map, (op))
853149473Sjhb#define	_TULIP_MAP_SYNC(ri, di, op)					\
854149473Sjhb	bus_dmamap_sync((ri)->ri_data_tag, *(di)->di_map, (op))
85534317Speter
856149473Sjhb/*
857149473Sjhb * Descriptors are both read from and written to by the card (corresponding
858149473Sjhb * to DMA WRITE and READ operations in bus-dma speak).  Receive maps are
859149473Sjhb * written to by the card (a DMA READ operation in bus-dma) and transmit
860149473Sjhb * buffers are read from by the card (a DMA WRITE operation in bus-dma).
861149473Sjhb */
862149473Sjhb#define TULIP_RXDESC_PRESYNC(ri)					\
863149473Sjhb	_TULIP_DESC_SYNC(ri, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE)
864149473Sjhb#define TULIP_RXDESC_POSTSYNC(ri)					\
865149473Sjhb	_TULIP_DESC_SYNC(ri, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE)
866149473Sjhb#define	TULIP_RXMAP_PRESYNC(ri, di)					\
867149473Sjhb	_TULIP_MAP_SYNC(ri, di, BUS_DMASYNC_PREREAD)
868149473Sjhb#define	TULIP_RXMAP_POSTSYNC(ri, di)					\
869149473Sjhb	_TULIP_MAP_SYNC(ri, di, BUS_DMASYNC_POSTREAD)
870149473Sjhb#define TULIP_TXDESC_PRESYNC(ri)					\
871149473Sjhb	_TULIP_DESC_SYNC(ri, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE)
872149473Sjhb#define TULIP_TXDESC_POSTSYNC(ri)					\
873149473Sjhb	_TULIP_DESC_SYNC(ri, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE)
874149473Sjhb#define	TULIP_TXMAP_PRESYNC(ri, di)					\
875149473Sjhb	_TULIP_MAP_SYNC(ri, di, BUS_DMASYNC_PREWRITE)
876149473Sjhb#define	TULIP_TXMAP_POSTSYNC(ri, di)					\
877149473Sjhb	_TULIP_MAP_SYNC(ri, di, BUS_DMASYNC_POSTWRITE)
87834317Speter
87926790Speter#ifdef notyet
88026790Speter#define	SIOCGADDRROM		_IOW('i', 240, struct ifreq)	/* get 128 bytes of ROM */
88126790Speter#define	SIOCGCHIPID		_IOWR('i', 241, struct ifreq)	/* get chipid */
88226790Speter#endif
88326790Speter
88426790Speter#if defined(TULIP_HDR_DATA)
885131847Sbmsstatic tulip_softc_t	*tulips[TULIP_MAX_DEVICES];
88626790Speter#endif
88749575Speter
88826790Speter#define	loudprintf			if (bootverbose) printf
88926790Speter
89027859Speter#if defined(TULIP_PERFSTATS)
89127859Speter#define	TULIP_PERFMERGE(sc, member) \
89227859Speter	do { (sc)->tulip_perfstats[TULIP_PERF_TOTAL].member \
89327859Speter	     += (sc)->tulip_perfstats[TULIP_PERF_CURRENT].member; \
89427859Speter	 (sc)->tulip_perfstats[TULIP_PERF_PREVIOUS].member \
89527859Speter	      = (sc)->tulip_perfstats[TULIP_PERF_CURRENT].member; \
89627859Speter	    (sc)->tulip_perfstats[TULIP_PERF_CURRENT].member = 0; } while (0)
89727859Speter#define	TULIP_PERFSTART(name) const tulip_cycle_t perfstart_ ## name = TULIP_PERFREAD();
89827859Speter#define	TULIP_PERFEND(name)	do { \
89927859Speter	    (sc)->tulip_curperfstats.perf_ ## name ## _cycles += TULIP_PERFDIFF(perfstart_ ## name, TULIP_PERFREAD()); \
90027859Speter	    (sc)->tulip_curperfstats.perf_ ## name ++; \
90127859Speter	} while (0)
902131847Sbms
903148249Sjhbtypedef u_long tulip_cycle_t;
904131847Sbms
905131575Sstefanfstatic __inline tulip_cycle_t
906131847SbmsTULIP_PERFREAD(void)
90727859Speter{
908148249Sjhb	return (get_cyclecount());
90927859Speter}
910131847Sbms
91127859Speter#define	TULIP_PERFDIFF(s, f)	((f) - (s))
91227859Speter#else
913131847Sbms#define	TULIP_PERFSTART(name)
91427859Speter#define	TULIP_PERFEND(name)	do { } while (0)
91527859Speter#define	TULIP_PERFMERGE(s,n)	do { } while (0)
916131847Sbms#endif	/* TULIP_PERFSTATS */
91727859Speter
918131847Sbms#define	TULIP_CRC32_POLY	0xEDB88320UL	/* CRC-32 Poly -- Little
919131847Sbms						 * Endian */
92026790Speter#define	TULIP_MAX_TXSEG		30
921149473Sjhb#define	TULIP_MAX_FRAGS		2
92226790Speter
92326790Speter#define	TULIP_ADDREQUAL(a1, a2) \
92426790Speter	(((u_int16_t *)a1)[0] == ((u_int16_t *)a2)[0] \
92526790Speter	 && ((u_int16_t *)a1)[1] == ((u_int16_t *)a2)[1] \
92626790Speter	 && ((u_int16_t *)a1)[2] == ((u_int16_t *)a2)[2])
92726790Speter#define	TULIP_ADDRBRDCST(a1) \
92826790Speter	(((u_int16_t *)a1)[0] == 0xFFFFU \
92926790Speter	 && ((u_int16_t *)a1)[1] == 0xFFFFU \
93026790Speter	 && ((u_int16_t *)a1)[2] == 0xFFFFU)
93126790Speter
932148445Sjhb#define	TULIP_MUTEX(sc)		(&(sc)->tulip_mutex)
933148445Sjhb#define	TULIP_LOCK(sc)		mtx_lock(TULIP_MUTEX(sc))
934148445Sjhb#define	TULIP_UNLOCK(sc)	mtx_unlock(TULIP_MUTEX(sc))
935148445Sjhb#define	TULIP_LOCK_ASSERT(sc)	mtx_assert(TULIP_MUTEX(sc), MA_OWNED)
936148445Sjhb
937131847Sbms#endif	/* _DEVAR_H */
938