xref: /onnv-gate/usr/src/uts/common/io/hme/hme.h (revision 9610:cd6293866407)
1*9610Sgdamore@opensolaris.org /*
2*9610Sgdamore@opensolaris.org  * CDDL HEADER START
3*9610Sgdamore@opensolaris.org  *
4*9610Sgdamore@opensolaris.org  * The contents of this file are subject to the terms of the
5*9610Sgdamore@opensolaris.org  * Common Development and Distribution License (the "License").
6*9610Sgdamore@opensolaris.org  * You may not use this file except in compliance with the License.
7*9610Sgdamore@opensolaris.org  *
8*9610Sgdamore@opensolaris.org  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*9610Sgdamore@opensolaris.org  * or http://www.opensolaris.org/os/licensing.
10*9610Sgdamore@opensolaris.org  * See the License for the specific language governing permissions
11*9610Sgdamore@opensolaris.org  * and limitations under the License.
12*9610Sgdamore@opensolaris.org  *
13*9610Sgdamore@opensolaris.org  * When distributing Covered Code, include this CDDL HEADER in each
14*9610Sgdamore@opensolaris.org  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*9610Sgdamore@opensolaris.org  * If applicable, add the following below this CDDL HEADER, with the
16*9610Sgdamore@opensolaris.org  * fields enclosed by brackets "[]" replaced with your own identifying
17*9610Sgdamore@opensolaris.org  * information: Portions Copyright [yyyy] [name of copyright owner]
18*9610Sgdamore@opensolaris.org  *
19*9610Sgdamore@opensolaris.org  * CDDL HEADER END
20*9610Sgdamore@opensolaris.org  */
21*9610Sgdamore@opensolaris.org /*
22*9610Sgdamore@opensolaris.org  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23*9610Sgdamore@opensolaris.org  * Use is subject to license terms.
24*9610Sgdamore@opensolaris.org  */
25*9610Sgdamore@opensolaris.org 
26*9610Sgdamore@opensolaris.org #ifndef	_SYS_HME_H
27*9610Sgdamore@opensolaris.org #define	_SYS_HME_H
28*9610Sgdamore@opensolaris.org 
29*9610Sgdamore@opensolaris.org #ifdef	__cplusplus
30*9610Sgdamore@opensolaris.org extern "C" {
31*9610Sgdamore@opensolaris.org #endif
32*9610Sgdamore@opensolaris.org 
33*9610Sgdamore@opensolaris.org /* mode */
34*9610Sgdamore@opensolaris.org #define	HME_AUTO_SPEED	0
35*9610Sgdamore@opensolaris.org #define	HME_FORCE_SPEED	1
36*9610Sgdamore@opensolaris.org 
37*9610Sgdamore@opensolaris.org /* speed */
38*9610Sgdamore@opensolaris.org #define	HME_SPEED_10	10
39*9610Sgdamore@opensolaris.org #define	HME_SPEED_100	100
40*9610Sgdamore@opensolaris.org 
41*9610Sgdamore@opensolaris.org /* half-duplex or full-duplex mode */
42*9610Sgdamore@opensolaris.org 
43*9610Sgdamore@opensolaris.org #define	HME_HALF_DUPLEX	0
44*9610Sgdamore@opensolaris.org #define	HME_FULL_DUPLEX	1
45*9610Sgdamore@opensolaris.org 
46*9610Sgdamore@opensolaris.org #ifdef _KERNEL
47*9610Sgdamore@opensolaris.org 
48*9610Sgdamore@opensolaris.org /* Named Dispatch Parameter Management Structure */
49*9610Sgdamore@opensolaris.org typedef struct	hmeparam_s {
50*9610Sgdamore@opensolaris.org 	uint32_t hme_param_min;
51*9610Sgdamore@opensolaris.org 	uint32_t hme_param_max;
52*9610Sgdamore@opensolaris.org 	uint32_t hme_param_val;
53*9610Sgdamore@opensolaris.org 	char	*hme_param_name;
54*9610Sgdamore@opensolaris.org } hmeparam_t;
55*9610Sgdamore@opensolaris.org 
56*9610Sgdamore@opensolaris.org 
57*9610Sgdamore@opensolaris.org static hmeparam_t	hme_param_arr[] = {
58*9610Sgdamore@opensolaris.org 	/* min		max		value		name */
59*9610Sgdamore@opensolaris.org 	{  0,		1,		1,		"transceiver_inuse"},
60*9610Sgdamore@opensolaris.org 	{  0,		1,		0,		"link_status"},
61*9610Sgdamore@opensolaris.org 	{  0,		1,		0,		"link_speed"},
62*9610Sgdamore@opensolaris.org 	{  0,		1,		0,		"link_mode"},
63*9610Sgdamore@opensolaris.org 	{  0,		255,		8,		"ipg1"},
64*9610Sgdamore@opensolaris.org 	{  0,		255,		4,		"ipg2"},
65*9610Sgdamore@opensolaris.org 	{  0,		1,		0,		"use_int_xcvr"},
66*9610Sgdamore@opensolaris.org 	{  0,		255,		0,		"pace_size"},
67*9610Sgdamore@opensolaris.org 	{  0,		1,		1,		"adv_autoneg_cap"},
68*9610Sgdamore@opensolaris.org 	{  0,		1,		1,		"adv_100T4_cap"},
69*9610Sgdamore@opensolaris.org 	{  0,		1,		1,		"adv_100fdx_cap"},
70*9610Sgdamore@opensolaris.org 	{  0,		1,		1,		"adv_100hdx_cap"},
71*9610Sgdamore@opensolaris.org 	{  0,		1,		1,		"adv_10fdx_cap"},
72*9610Sgdamore@opensolaris.org 	{  0,		1,		1,		"adv_10hdx_cap"},
73*9610Sgdamore@opensolaris.org 	{  0,		1,		1,		"autoneg_cap"},
74*9610Sgdamore@opensolaris.org 	{  0,		1,		1,		"100T4_cap"},
75*9610Sgdamore@opensolaris.org 	{  0,		1,		1,		"100fdx_cap"},
76*9610Sgdamore@opensolaris.org 	{  0,		1,		1,		"100hdx_cap"},
77*9610Sgdamore@opensolaris.org 	{  0,		1,		1,		"10fdx_cap"},
78*9610Sgdamore@opensolaris.org 	{  0,		1,		1,		"10hdx_cap"},
79*9610Sgdamore@opensolaris.org 	{  0,		1,		0,		"lp_autoneg_cap"},
80*9610Sgdamore@opensolaris.org 	{  0,		1,		0,		"lp_100T4_cap"},
81*9610Sgdamore@opensolaris.org 	{  0,		1,		0,		"lp_100fdx_cap"},
82*9610Sgdamore@opensolaris.org 	{  0,		1,		0,		"lp_100hdx_cap"},
83*9610Sgdamore@opensolaris.org 	{  0,		1,		0,		"lp_10fdx_cap"},
84*9610Sgdamore@opensolaris.org 	{  0,		1,		0,		"lp_10hdx_cap"},
85*9610Sgdamore@opensolaris.org 	{  0,		1,		1,		"lance_mode"},
86*9610Sgdamore@opensolaris.org 	{  0,		31,		16,		"ipg0"},
87*9610Sgdamore@opensolaris.org };
88*9610Sgdamore@opensolaris.org 
89*9610Sgdamore@opensolaris.org 
90*9610Sgdamore@opensolaris.org #define	hme_param_transceiver	(hmep->hme_param_arr[0].hme_param_val)
91*9610Sgdamore@opensolaris.org #define	hme_param_linkup	(hmep->hme_param_arr[1].hme_param_val)
92*9610Sgdamore@opensolaris.org #define	hme_param_speed		(hmep->hme_param_arr[2].hme_param_val)
93*9610Sgdamore@opensolaris.org #define	hme_param_mode		(hmep->hme_param_arr[3].hme_param_val)
94*9610Sgdamore@opensolaris.org #define	hme_param_ipg1		(hmep->hme_param_arr[4].hme_param_val)
95*9610Sgdamore@opensolaris.org #define	hme_param_ipg2		(hmep->hme_param_arr[5].hme_param_val)
96*9610Sgdamore@opensolaris.org #define	hme_param_use_intphy	(hmep->hme_param_arr[6].hme_param_val)
97*9610Sgdamore@opensolaris.org #define	hme_param_pace_count	(hmep->hme_param_arr[7].hme_param_val)
98*9610Sgdamore@opensolaris.org #define	hme_param_autoneg	(hmep->hme_param_arr[8].hme_param_val)
99*9610Sgdamore@opensolaris.org #define	hme_param_anar_100T4	(hmep->hme_param_arr[9].hme_param_val)
100*9610Sgdamore@opensolaris.org #define	hme_param_anar_100fdx	(hmep->hme_param_arr[10].hme_param_val)
101*9610Sgdamore@opensolaris.org #define	hme_param_anar_100hdx	(hmep->hme_param_arr[11].hme_param_val)
102*9610Sgdamore@opensolaris.org #define	hme_param_anar_10fdx	(hmep->hme_param_arr[12].hme_param_val)
103*9610Sgdamore@opensolaris.org #define	hme_param_anar_10hdx	(hmep->hme_param_arr[13].hme_param_val)
104*9610Sgdamore@opensolaris.org #define	hme_param_bmsr_ancap	(hmep->hme_param_arr[14].hme_param_val)
105*9610Sgdamore@opensolaris.org #define	hme_param_bmsr_100T4	(hmep->hme_param_arr[15].hme_param_val)
106*9610Sgdamore@opensolaris.org #define	hme_param_bmsr_100fdx	(hmep->hme_param_arr[16].hme_param_val)
107*9610Sgdamore@opensolaris.org #define	hme_param_bmsr_100hdx	(hmep->hme_param_arr[17].hme_param_val)
108*9610Sgdamore@opensolaris.org #define	hme_param_bmsr_10fdx	(hmep->hme_param_arr[18].hme_param_val)
109*9610Sgdamore@opensolaris.org #define	hme_param_bmsr_10hdx	(hmep->hme_param_arr[19].hme_param_val)
110*9610Sgdamore@opensolaris.org #define	hme_param_aner_lpancap	(hmep->hme_param_arr[20].hme_param_val)
111*9610Sgdamore@opensolaris.org #define	hme_param_anlpar_100T4	(hmep->hme_param_arr[21].hme_param_val)
112*9610Sgdamore@opensolaris.org #define	hme_param_anlpar_100fdx	(hmep->hme_param_arr[22].hme_param_val)
113*9610Sgdamore@opensolaris.org #define	hme_param_anlpar_100hdx	(hmep->hme_param_arr[23].hme_param_val)
114*9610Sgdamore@opensolaris.org #define	hme_param_anlpar_10fdx	(hmep->hme_param_arr[24].hme_param_val)
115*9610Sgdamore@opensolaris.org #define	hme_param_anlpar_10hdx	(hmep->hme_param_arr[25].hme_param_val)
116*9610Sgdamore@opensolaris.org #define	hme_param_lance_mode	(hmep->hme_param_arr[26].hme_param_val)
117*9610Sgdamore@opensolaris.org #define	hme_param_ipg0		(hmep->hme_param_arr[27].hme_param_val)
118*9610Sgdamore@opensolaris.org 
119*9610Sgdamore@opensolaris.org #define	HME_PARAM_CNT	29
120*9610Sgdamore@opensolaris.org 
121*9610Sgdamore@opensolaris.org 
122*9610Sgdamore@opensolaris.org /* command */
123*9610Sgdamore@opensolaris.org 
124*9610Sgdamore@opensolaris.org #define	HME_ND_GET	ND_GET
125*9610Sgdamore@opensolaris.org #define	HME_ND_SET	ND_SET
126*9610Sgdamore@opensolaris.org 
127*9610Sgdamore@opensolaris.org /* default IPG settings */
128*9610Sgdamore@opensolaris.org #define	IPG1	8
129*9610Sgdamore@opensolaris.org #define	IPG2	4
130*9610Sgdamore@opensolaris.org 
131*9610Sgdamore@opensolaris.org /*
132*9610Sgdamore@opensolaris.org  * Declarations and definitions specific to the
133*9610Sgdamore@opensolaris.org  * FEPS 10/100 Mbps Ethernet (hme) device.
134*9610Sgdamore@opensolaris.org  */
135*9610Sgdamore@opensolaris.org 
136*9610Sgdamore@opensolaris.org /*
137*9610Sgdamore@opensolaris.org  * Per-Stream instance state information.
138*9610Sgdamore@opensolaris.org  *
139*9610Sgdamore@opensolaris.org  * Each instance is dynamically allocated at open() and free'd
140*9610Sgdamore@opensolaris.org  * at close().  Each per-Stream instance points to at most one
141*9610Sgdamore@opensolaris.org  * per-device structure using the sb_hmep field.  All instances
142*9610Sgdamore@opensolaris.org  * are threaded together into one list of active instances
143*9610Sgdamore@opensolaris.org  * ordered on minor device number.
144*9610Sgdamore@opensolaris.org  */
145*9610Sgdamore@opensolaris.org 
146*9610Sgdamore@opensolaris.org #define	MSECOND(t)	t
147*9610Sgdamore@opensolaris.org #define	SECOND(t)	t*1000
148*9610Sgdamore@opensolaris.org #define	HME_TICKS	MSECOND(100)
149*9610Sgdamore@opensolaris.org 
150*9610Sgdamore@opensolaris.org #define	HME_LINKCHECK_TIMER	SECOND(30)
151*9610Sgdamore@opensolaris.org 
152*9610Sgdamore@opensolaris.org #define	HME_2P0_REVID		0xa0 /* hme - feps. */
153*9610Sgdamore@opensolaris.org #define	HME_2P1_REVID		0x20
154*9610Sgdamore@opensolaris.org #define	HME_2P1_REVID_OBP	0x21
155*9610Sgdamore@opensolaris.org #define	HME_1C0_REVID		0xc0 /* cheerio 1.0, hme 2.0 equiv. */
156*9610Sgdamore@opensolaris.org #define	HME_2C0_REVID		0xc1 /* cheerio 2.0, hme 2.2 equiv. */
157*9610Sgdamore@opensolaris.org #define	HME_REV_VERS_MASK	0x0f /* Mask to retain bits for cheerio ver */
158*9610Sgdamore@opensolaris.org 
159*9610Sgdamore@opensolaris.org #define	HME_NTRIES_LOW		(SECOND(5)/HME_TICKS)	/* 5 Seconds */
160*9610Sgdamore@opensolaris.org #define	HME_NTRIES_HIGH		(SECOND(5)/HME_TICKS)	/* 5 Seconds */
161*9610Sgdamore@opensolaris.org #define	HME_NTRIES_LOW_10	(SECOND(2)/HME_TICKS)	/* 2 Seconds */
162*9610Sgdamore@opensolaris.org #define	HME_LINKDOWN_TIME	(SECOND(2)/HME_TICKS)	/* 2 Seconds */
163*9610Sgdamore@opensolaris.org 
164*9610Sgdamore@opensolaris.org #define	HME_LINKDOWN_OK		0
165*9610Sgdamore@opensolaris.org #define	HME_FORCE_LINKDOWN	1
166*9610Sgdamore@opensolaris.org #define	HME_LINKDOWN_STARTED	2
167*9610Sgdamore@opensolaris.org #define	HME_LINKDOWN_DONE	3
168*9610Sgdamore@opensolaris.org 
169*9610Sgdamore@opensolaris.org #define	P1_0    0x100
170*9610Sgdamore@opensolaris.org 
171*9610Sgdamore@opensolaris.org #define	HME_EXTERNAL_TRANSCEIVER	0
172*9610Sgdamore@opensolaris.org #define	HME_INTERNAL_TRANSCEIVER	1
173*9610Sgdamore@opensolaris.org #define	HME_NO_TRANSCEIVER		2
174*9610Sgdamore@opensolaris.org 
175*9610Sgdamore@opensolaris.org #define	HME_HWAN_TRY		0 /* Try Hardware autonegotiation */
176*9610Sgdamore@opensolaris.org #define	HME_HWAN_INPROGRESS	1 /* Hardware autonegotiation in progress */
177*9610Sgdamore@opensolaris.org #define	HME_HWAN_SUCCESFUL	2 /* Hardware autonegotiation succesful */
178*9610Sgdamore@opensolaris.org #define	HME_HWAN_FAILED		3 /* Hardware autonegotiation failed */
179*9610Sgdamore@opensolaris.org 
180*9610Sgdamore@opensolaris.org #define	RESET_TO_BE_ISSUED	0 /* Reset command to be issued to the PHY */
181*9610Sgdamore@opensolaris.org #define	RESET_ISSUED		1 /* Reset command has been issued */
182*9610Sgdamore@opensolaris.org #define	ISOLATE_ISSUED		2 /* Isolate-remove command has been issued */
183*9610Sgdamore@opensolaris.org #define	POWER_OFF_ISSUED	3 /* The QSI Phy may have problems with */
184*9610Sgdamore@opensolaris.org 					/* Power rampup. Issue powerdown in   */
185*9610Sgdamore@opensolaris.org 					/* the driver to insure good reset.   */
186*9610Sgdamore@opensolaris.org struct	hmesave {
187*9610Sgdamore@opensolaris.org 	ulong_t		hme_starts;
188*9610Sgdamore@opensolaris.org 	uint32_t	hme_opackets;
189*9610Sgdamore@opensolaris.org };
190*9610Sgdamore@opensolaris.org 
191*9610Sgdamore@opensolaris.org typedef struct {
192*9610Sgdamore@opensolaris.org 	ddi_dma_handle_t	dmah;
193*9610Sgdamore@opensolaris.org 	ddi_acc_handle_t	acch;
194*9610Sgdamore@opensolaris.org 	caddr_t			kaddr;
195*9610Sgdamore@opensolaris.org 	uint32_t		paddr;
196*9610Sgdamore@opensolaris.org } hmebuf_t;
197*9610Sgdamore@opensolaris.org 
198*9610Sgdamore@opensolaris.org /*
199*9610Sgdamore@opensolaris.org  * HME Device Channel instance state information.
200*9610Sgdamore@opensolaris.org  *
201*9610Sgdamore@opensolaris.org  * Each instance is dynamically allocated on first attach.
202*9610Sgdamore@opensolaris.org  */
203*9610Sgdamore@opensolaris.org struct	hme {
204*9610Sgdamore@opensolaris.org 	mac_handle_t		hme_mh;		/* GLDv3 handle */
205*9610Sgdamore@opensolaris.org 	dev_info_t		*dip;		/* associated dev_info */
206*9610Sgdamore@opensolaris.org 	int			instance;	/* instance */
207*9610Sgdamore@opensolaris.org 	ulong_t			pagesize;	/* btop(9F) */
208*9610Sgdamore@opensolaris.org 
209*9610Sgdamore@opensolaris.org 	/*
210*9610Sgdamore@opensolaris.org 	 * xcvr information
211*9610Sgdamore@opensolaris.org 	 */
212*9610Sgdamore@opensolaris.org 	uint16_t		hme_idr1;	/* PHY IDR1 register */
213*9610Sgdamore@opensolaris.org 	uint16_t		hme_idr2;	/* PHY IDR2 register */
214*9610Sgdamore@opensolaris.org 	uint16_t		hme_anar;	/* PHY ANAR register */
215*9610Sgdamore@opensolaris.org 	uint16_t		hme_anlpar;	/* PHY ANLPAR register */
216*9610Sgdamore@opensolaris.org 	uint16_t		hme_aner;	/* PHY ANER register */
217*9610Sgdamore@opensolaris.org 
218*9610Sgdamore@opensolaris.org 	int			hme_mifpoll_enable;
219*9610Sgdamore@opensolaris.org 	int			hme_frame_enable;
220*9610Sgdamore@opensolaris.org 	int			hme_lance_mode_enable;
221*9610Sgdamore@opensolaris.org 	int			hme_rxcv_enable;
222*9610Sgdamore@opensolaris.org 
223*9610Sgdamore@opensolaris.org 	uint_t			hme_burstsizes; /* binary encoded val */
224*9610Sgdamore@opensolaris.org 	uint32_t		hme_config;	/* Config reg store */
225*9610Sgdamore@opensolaris.org 
226*9610Sgdamore@opensolaris.org 	int			hme_phy_retries; /* phy reset failures */
227*9610Sgdamore@opensolaris.org 	int			hme_phy_failure; /* phy failure type */
228*9610Sgdamore@opensolaris.org 
229*9610Sgdamore@opensolaris.org 	int			hme_64bit_xfer;	/* 64-bit Sbus xfers */
230*9610Sgdamore@opensolaris.org 	int			hme_phyad;
231*9610Sgdamore@opensolaris.org 	int			hme_autoneg;
232*9610Sgdamore@opensolaris.org 
233*9610Sgdamore@opensolaris.org 	caddr_t			hme_g_nd;	/* head of the */
234*9610Sgdamore@opensolaris.org 						/* named dispatch table */
235*9610Sgdamore@opensolaris.org 	hmeparam_t		hme_param_arr[HME_PARAM_CNT];
236*9610Sgdamore@opensolaris.org 	int			hme_transceiver;  /* current PHY in use */
237*9610Sgdamore@opensolaris.org 	int			hme_link_pulse_disabled;
238*9610Sgdamore@opensolaris.org 	uint16_t		hme_bmcr;	/* PHY control register */
239*9610Sgdamore@opensolaris.org 	uint16_t		hme_bmsr;	/* PHY status register */
240*9610Sgdamore@opensolaris.org 	int			hme_mode;	/* auto/forced mode */
241*9610Sgdamore@opensolaris.org 	int			hme_linkup;	/* link status */
242*9610Sgdamore@opensolaris.org 	int			hme_xcvr_state; /* transceiver status */
243*9610Sgdamore@opensolaris.org 	int			hme_forcespeed; /* speed in forced mode */
244*9610Sgdamore@opensolaris.org 	int			hme_tryspeed;	/* speed in auto mode */
245*9610Sgdamore@opensolaris.org 	int			hme_fdx;	/* full-duplex mode */
246*9610Sgdamore@opensolaris.org 	int			hme_pace_count;	/* pacing pkt count */
247*9610Sgdamore@opensolaris.org 
248*9610Sgdamore@opensolaris.org 	int			hme_macfdx;
249*9610Sgdamore@opensolaris.org 	int			hme_linkcheck;
250*9610Sgdamore@opensolaris.org 	int			hme_force_linkdown;
251*9610Sgdamore@opensolaris.org 	int			hme_nlasttries;
252*9610Sgdamore@opensolaris.org 	int			hme_ntries;
253*9610Sgdamore@opensolaris.org 	int			hme_delay;
254*9610Sgdamore@opensolaris.org 	int			hme_linkup_10;
255*9610Sgdamore@opensolaris.org 	int			hme_linkup_cnt;
256*9610Sgdamore@opensolaris.org 	timeout_id_t		hme_timerid;
257*9610Sgdamore@opensolaris.org 	int			hme_cheerio_mode;
258*9610Sgdamore@opensolaris.org 	int			hme_polling_on;
259*9610Sgdamore@opensolaris.org 	int			hme_mifpoll_data;
260*9610Sgdamore@opensolaris.org 	int			hme_mifpoll_flag;
261*9610Sgdamore@opensolaris.org 
262*9610Sgdamore@opensolaris.org 	/*
263*9610Sgdamore@opensolaris.org 	 * This is part of the hardening of the hme driver
264*9610Sgdamore@opensolaris.org 	 * (following x fields)
265*9610Sgdamore@opensolaris.org 	 */
266*9610Sgdamore@opensolaris.org 	ushort_t		hme_disabled;
267*9610Sgdamore@opensolaris.org 
268*9610Sgdamore@opensolaris.org 	struct	ether_addr	hme_factaddr;	/* factory mac address */
269*9610Sgdamore@opensolaris.org 	struct	ether_addr	hme_ouraddr;	/* individual address */
270*9610Sgdamore@opensolaris.org 	uint32_t		hme_addrflags;	/* address flags */
271*9610Sgdamore@opensolaris.org 	uint32_t		hme_flags;	/* misc. flags */
272*9610Sgdamore@opensolaris.org 	boolean_t		hme_wantw;	/* xmit: out of resources */
273*9610Sgdamore@opensolaris.org 	boolean_t		hme_started;	/* mac layer started */
274*9610Sgdamore@opensolaris.org 
275*9610Sgdamore@opensolaris.org 	uint8_t			hme_devno;
276*9610Sgdamore@opensolaris.org 
277*9610Sgdamore@opensolaris.org 	uint16_t		hme_ladrf[4];	/* 64 bit multicast filter */
278*9610Sgdamore@opensolaris.org 	uint32_t		hme_ladrf_refcnt[64];
279*9610Sgdamore@opensolaris.org 	boolean_t		hme_promisc;
280*9610Sgdamore@opensolaris.org 	uint32_t		hme_multi;	/* refcount on mcast addrs */
281*9610Sgdamore@opensolaris.org 
282*9610Sgdamore@opensolaris.org 	struct	hme_global	*hme_globregp;	/* HME global regs */
283*9610Sgdamore@opensolaris.org 	struct	hme_etx		*hme_etxregp;	/* HME ETX regs */
284*9610Sgdamore@opensolaris.org 	struct	hme_erx		*hme_erxregp;	/* HME ERX regs */
285*9610Sgdamore@opensolaris.org 	struct	hme_bmac	*hme_bmacregp;	/* BigMAC registers */
286*9610Sgdamore@opensolaris.org 	struct	hme_mif		*hme_mifregp;	/* HME transceiver */
287*9610Sgdamore@opensolaris.org 	unsigned char		*hme_romp;	/* fcode rom pointer */
288*9610Sgdamore@opensolaris.org 
289*9610Sgdamore@opensolaris.org 	kmutex_t	hme_xmitlock;		/* protect xmit-side fields */
290*9610Sgdamore@opensolaris.org 	kmutex_t	hme_intrlock;		/* protect intr-side fields */
291*9610Sgdamore@opensolaris.org 	kmutex_t	hme_linklock;		/* protect link-side fields */
292*9610Sgdamore@opensolaris.org 	ddi_iblock_cookie_t	hme_cookie;	/* interrupt cookie */
293*9610Sgdamore@opensolaris.org 
294*9610Sgdamore@opensolaris.org 	struct	hme_rmd	*hme_rmdp;	/* receive descriptor ring start */
295*9610Sgdamore@opensolaris.org 	struct	hme_tmd	*hme_tmdp;	/* transmit descriptor ring start */
296*9610Sgdamore@opensolaris.org 
297*9610Sgdamore@opensolaris.org 	ddi_dma_handle_t	hme_rmd_dmah;
298*9610Sgdamore@opensolaris.org 	ddi_acc_handle_t	hme_rmd_acch;
299*9610Sgdamore@opensolaris.org 	caddr_t			hme_rmd_kaddr;
300*9610Sgdamore@opensolaris.org 	uint32_t		hme_rmd_paddr;
301*9610Sgdamore@opensolaris.org 
302*9610Sgdamore@opensolaris.org 	ddi_dma_handle_t	hme_tmd_dmah;
303*9610Sgdamore@opensolaris.org 	ddi_acc_handle_t	hme_tmd_acch;
304*9610Sgdamore@opensolaris.org 	caddr_t			hme_tmd_kaddr;
305*9610Sgdamore@opensolaris.org 	uint32_t		hme_tmd_paddr;
306*9610Sgdamore@opensolaris.org 
307*9610Sgdamore@opensolaris.org 	uint64_t		hme_rxindex;
308*9610Sgdamore@opensolaris.org 	uint64_t		hme_txindex;
309*9610Sgdamore@opensolaris.org 	uint64_t		hme_txreclaim;
310*9610Sgdamore@opensolaris.org 
311*9610Sgdamore@opensolaris.org 	hmebuf_t		*hme_tbuf;	/* hmebuf associated with TMD */
312*9610Sgdamore@opensolaris.org 	hmebuf_t		*hme_rbuf;	/* hmebuf associated with RMD */
313*9610Sgdamore@opensolaris.org 
314*9610Sgdamore@opensolaris.org 	ddi_device_acc_attr_t	hme_dev_attr;
315*9610Sgdamore@opensolaris.org 	ddi_acc_handle_t	hme_globregh;   /* HME global regs */
316*9610Sgdamore@opensolaris.org 	ddi_acc_handle_t	hme_etxregh;    /* HME ETX regs */
317*9610Sgdamore@opensolaris.org 	ddi_acc_handle_t	hme_erxregh;    /* HME ERX regs */
318*9610Sgdamore@opensolaris.org 	ddi_acc_handle_t	hme_bmacregh;   /* BigMAC registers */
319*9610Sgdamore@opensolaris.org 	ddi_acc_handle_t	hme_mifregh;    /* HME transceiver */
320*9610Sgdamore@opensolaris.org 	ddi_acc_handle_t	hme_romh;	/* rom handle */
321*9610Sgdamore@opensolaris.org 
322*9610Sgdamore@opensolaris.org 	ddi_acc_handle_t	pci_config_handle; /* HME PCI config */
323*9610Sgdamore@opensolaris.org 
324*9610Sgdamore@opensolaris.org 	/*
325*9610Sgdamore@opensolaris.org 	 * DDI dma handle, kernel virtual base,
326*9610Sgdamore@opensolaris.org 	 * and io virtual base of IOPB area.
327*9610Sgdamore@opensolaris.org 	 */
328*9610Sgdamore@opensolaris.org 	ddi_dma_handle_t	hme_iopbhandle;
329*9610Sgdamore@opensolaris.org 	ulong_t			hme_iopbkbase;
330*9610Sgdamore@opensolaris.org 	uint32_t		hme_iopbiobase;
331*9610Sgdamore@opensolaris.org 
332*9610Sgdamore@opensolaris.org 	kstat_t	*hme_ksp;	/* kstat pointer */
333*9610Sgdamore@opensolaris.org 	kstat_t	*hme_intrstats;	/* kstat interrupt counter */
334*9610Sgdamore@opensolaris.org 	uint64_t hme_iipackets;	/* Used to store the Count of packets */
335*9610Sgdamore@opensolaris.org 				/* recieved at the start of 'hme_check_link' */
336*9610Sgdamore@opensolaris.org 				/* watch dog interval. */
337*9610Sgdamore@opensolaris.org 
338*9610Sgdamore@opensolaris.org 	uint64_t hme_ifspeed;		/* ifspeed is now in bits/sec	*/
339*9610Sgdamore@opensolaris.org 	uint64_t hme_ipackets;
340*9610Sgdamore@opensolaris.org 	uint64_t hme_rbytes;
341*9610Sgdamore@opensolaris.org 	uint64_t hme_ierrors;
342*9610Sgdamore@opensolaris.org 	uint64_t hme_opackets;
343*9610Sgdamore@opensolaris.org 	uint64_t hme_obytes;
344*9610Sgdamore@opensolaris.org 	uint64_t hme_oerrors;
345*9610Sgdamore@opensolaris.org 	uint64_t hme_multircv;		/* # multicast packets received */
346*9610Sgdamore@opensolaris.org 	uint64_t hme_multixmt;		/* # multicast packets for xmit */
347*9610Sgdamore@opensolaris.org 	uint64_t hme_brdcstrcv;		/* # broadcast packets received */
348*9610Sgdamore@opensolaris.org 	uint64_t hme_brdcstxmt;		/* # broadcast packets for xmit */
349*9610Sgdamore@opensolaris.org 	uint64_t hme_oflo;
350*9610Sgdamore@opensolaris.org 	uint64_t hme_uflo;
351*9610Sgdamore@opensolaris.org 	uint64_t hme_norcvbuf;		/* # rcv packets discarded */
352*9610Sgdamore@opensolaris.org 	uint64_t hme_noxmtbuf;		/* # xmit packets discarded */
353*9610Sgdamore@opensolaris.org 	uint64_t hme_duplex;
354*9610Sgdamore@opensolaris.org 	uint64_t hme_align_errors;
355*9610Sgdamore@opensolaris.org 	uint64_t hme_coll;
356*9610Sgdamore@opensolaris.org 	uint64_t hme_fcs_errors;
357*9610Sgdamore@opensolaris.org 	uint64_t hme_defer_xmts;
358*9610Sgdamore@opensolaris.org 	uint64_t hme_sqe_errors;
359*9610Sgdamore@opensolaris.org 	uint64_t hme_excol;
360*9610Sgdamore@opensolaris.org 	uint64_t hme_fstcol;
361*9610Sgdamore@opensolaris.org 	uint64_t hme_tlcol;
362*9610Sgdamore@opensolaris.org 	uint64_t hme_toolong_errors;
363*9610Sgdamore@opensolaris.org 	uint64_t hme_runt;
364*9610Sgdamore@opensolaris.org 	uint64_t hme_carrier_errors;
365*9610Sgdamore@opensolaris.org 	uint64_t hme_jab;
366*9610Sgdamore@opensolaris.org 
367*9610Sgdamore@opensolaris.org 	uint32_t hme_cvc;
368*9610Sgdamore@opensolaris.org 	uint32_t hme_lenerr;
369*9610Sgdamore@opensolaris.org 	uint32_t hme_buff;
370*9610Sgdamore@opensolaris.org 	uint32_t hme_missed;
371*9610Sgdamore@opensolaris.org 	uint32_t hme_nocanput;
372*9610Sgdamore@opensolaris.org 	uint32_t hme_allocbfail;
373*9610Sgdamore@opensolaris.org 	uint32_t hme_babl;
374*9610Sgdamore@opensolaris.org 	uint32_t hme_tmder;
375*9610Sgdamore@opensolaris.org 	uint32_t hme_txlaterr;
376*9610Sgdamore@opensolaris.org 	uint32_t hme_rxlaterr;
377*9610Sgdamore@opensolaris.org 	uint32_t hme_slvparerr;
378*9610Sgdamore@opensolaris.org 	uint32_t hme_txparerr;
379*9610Sgdamore@opensolaris.org 	uint32_t hme_rxparerr;
380*9610Sgdamore@opensolaris.org 	uint32_t hme_slverrack;
381*9610Sgdamore@opensolaris.org 	uint32_t hme_txerrack;
382*9610Sgdamore@opensolaris.org 	uint32_t hme_rxerrack;
383*9610Sgdamore@opensolaris.org 	uint32_t hme_txtagerr;
384*9610Sgdamore@opensolaris.org 	uint32_t hme_rxtagerr;
385*9610Sgdamore@opensolaris.org 	uint32_t hme_eoperr;
386*9610Sgdamore@opensolaris.org 	uint32_t hme_notmds;
387*9610Sgdamore@opensolaris.org 	uint32_t hme_notbufs;
388*9610Sgdamore@opensolaris.org 	uint32_t hme_norbufs;
389*9610Sgdamore@opensolaris.org 
390*9610Sgdamore@opensolaris.org 	/*
391*9610Sgdamore@opensolaris.org 	 * check if transmitter is hung
392*9610Sgdamore@opensolaris.org 	 */
393*9610Sgdamore@opensolaris.org 	uint32_t hme_starts;
394*9610Sgdamore@opensolaris.org 	uint32_t hme_txhung;
395*9610Sgdamore@opensolaris.org 	time_t hme_msg_time;
396*9610Sgdamore@opensolaris.org 	struct hmesave hmesave;
397*9610Sgdamore@opensolaris.org 
398*9610Sgdamore@opensolaris.org 	/*
399*9610Sgdamore@opensolaris.org 	 * Debuging kstats
400*9610Sgdamore@opensolaris.org 	 */
401*9610Sgdamore@opensolaris.org 	uint32_t inits;
402*9610Sgdamore@opensolaris.org 	uint32_t phyfail;
403*9610Sgdamore@opensolaris.org 	uint32_t asic_rev;
404*9610Sgdamore@opensolaris.org };
405*9610Sgdamore@opensolaris.org 
406*9610Sgdamore@opensolaris.org /* flags */
407*9610Sgdamore@opensolaris.org #define	HMERUNNING	0x01	/* chip is initialized */
408*9610Sgdamore@opensolaris.org #define	HMESUSPENDED	0x08	/* suspended interface */
409*9610Sgdamore@opensolaris.org #define	HMEINITIALIZED	0x10	/* interface initialized */
410*9610Sgdamore@opensolaris.org 
411*9610Sgdamore@opensolaris.org /* Mac address flags */
412*9610Sgdamore@opensolaris.org 
413*9610Sgdamore@opensolaris.org #define	HME_FACTADDR_PRESENT	0x01	/* factory MAC id present */
414*9610Sgdamore@opensolaris.org #define	HME_FACTADDR_USE	0x02	/* use factory MAC id */
415*9610Sgdamore@opensolaris.org 
416*9610Sgdamore@opensolaris.org struct	hmekstat {
417*9610Sgdamore@opensolaris.org 	struct kstat_named	hk_cvc;		/* code violation  errors */
418*9610Sgdamore@opensolaris.org 	struct kstat_named	hk_lenerr;	/* rx len errors */
419*9610Sgdamore@opensolaris.org 	struct kstat_named	hk_buff;	/* buff errors */
420*9610Sgdamore@opensolaris.org 	struct kstat_named	hk_missed;	/* missed/dropped packets */
421*9610Sgdamore@opensolaris.org 	struct kstat_named	hk_nocanput;	/* nocanput errors */
422*9610Sgdamore@opensolaris.org 	struct kstat_named	hk_allocbfail;	/* allocb failures */
423*9610Sgdamore@opensolaris.org 	struct kstat_named	hk_babl;	/* runt errors */
424*9610Sgdamore@opensolaris.org 	struct kstat_named	hk_tmder;	/* tmd errors */
425*9610Sgdamore@opensolaris.org 	struct kstat_named	hk_txlaterr;	/* tx late errors */
426*9610Sgdamore@opensolaris.org 	struct kstat_named	hk_rxlaterr;	/* rx late errors */
427*9610Sgdamore@opensolaris.org 	struct kstat_named	hk_slvparerr;	/* slave parity errors */
428*9610Sgdamore@opensolaris.org 	struct kstat_named	hk_txparerr;	/* tx parity errors */
429*9610Sgdamore@opensolaris.org 	struct kstat_named	hk_rxparerr;	/* rx parity errors */
430*9610Sgdamore@opensolaris.org 	struct kstat_named	hk_slverrack;	/* slave error acks */
431*9610Sgdamore@opensolaris.org 	struct kstat_named	hk_txerrack;	/* tx error acks */
432*9610Sgdamore@opensolaris.org 	struct kstat_named	hk_rxerrack;	/* rx error acks */
433*9610Sgdamore@opensolaris.org 	struct kstat_named	hk_txtagerr;	/* tx tag error */
434*9610Sgdamore@opensolaris.org 	struct kstat_named	hk_rxtagerr;	/* rx tag error */
435*9610Sgdamore@opensolaris.org 	struct kstat_named	hk_eoperr;	/* eop error */
436*9610Sgdamore@opensolaris.org 	struct kstat_named	hk_notmds;	/* tmd errors */
437*9610Sgdamore@opensolaris.org 	struct kstat_named	hk_notbufs;	/* tx buf errors */
438*9610Sgdamore@opensolaris.org 	struct kstat_named	hk_norbufs;	/* rx buf errors */
439*9610Sgdamore@opensolaris.org 
440*9610Sgdamore@opensolaris.org 	struct kstat_named	hk_inits;		/* global inits */
441*9610Sgdamore@opensolaris.org 	struct	kstat_named	hk_phyfail;		/* phy failures */
442*9610Sgdamore@opensolaris.org 
443*9610Sgdamore@opensolaris.org 	struct	kstat_named	hk_asic_rev;		/* asic_rev */
444*9610Sgdamore@opensolaris.org };
445*9610Sgdamore@opensolaris.org 
446*9610Sgdamore@opensolaris.org #define	HMEDRAINTIME	(400000)	/* # microseconds xmit drain */
447*9610Sgdamore@opensolaris.org 
448*9610Sgdamore@opensolaris.org #define	ROUNDUP(a, n)	(((a) + ((n) - 1)) & ~((n) - 1))
449*9610Sgdamore@opensolaris.org #define	ROUNDUP2(a, n)	(uchar_t *)((((uintptr_t)(a)) + ((n) - 1)) & ~((n) - 1))
450*9610Sgdamore@opensolaris.org 
451*9610Sgdamore@opensolaris.org /*
452*9610Sgdamore@opensolaris.org  * Xmit/receive buffer structure.
453*9610Sgdamore@opensolaris.org  * This structure is organized to meet the following requirements:
454*9610Sgdamore@opensolaris.org  * - bb_buf starts on an HMEBURSTSIZE boundary.
455*9610Sgdamore@opensolaris.org  * - hmebuf is an even multiple of HMEBURSTSIZE
456*9610Sgdamore@opensolaris.org  * - bb_buf[] is large enough to contain max VLAN frame (1522) plus
457*9610Sgdamore@opensolaris.org  *   (3 x HMEBURSTSIZE) rounded up to the next HMEBURSTSIZE
458*9610Sgdamore@opensolaris.org  * XXX What about another 128 bytes (HMEC requirement).
459*9610Sgdamore@opensolaris.org  * Fast aligned copy requires both the source and destination
460*9610Sgdamore@opensolaris.org  * addresses have the same offset from some N-byte boundary.
461*9610Sgdamore@opensolaris.org  */
462*9610Sgdamore@opensolaris.org #define		HMEBURSTSIZE	(64)
463*9610Sgdamore@opensolaris.org #define		HMEBURSTMASK	(HMEBURSTSIZE - 1)
464*9610Sgdamore@opensolaris.org #define		HMEBUFSIZE	(1728)
465*9610Sgdamore@opensolaris.org 
466*9610Sgdamore@opensolaris.org /*
467*9610Sgdamore@opensolaris.org  * Define offset from start of bb_buf[] to point receive descriptor.
468*9610Sgdamore@opensolaris.org  * Requirements:
469*9610Sgdamore@opensolaris.org  * - must be 14 bytes back of a 4-byte boundary so the start of
470*9610Sgdamore@opensolaris.org  *   the network packet is 4-byte aligned.
471*9610Sgdamore@opensolaris.org  * - leave some headroom for others
472*9610Sgdamore@opensolaris.org  */
473*9610Sgdamore@opensolaris.org #define		HMEHEADROOM	(34)
474*9610Sgdamore@opensolaris.org 
475*9610Sgdamore@opensolaris.org /* Offset for the first byte in the receive buffer */
476*9610Sgdamore@opensolaris.org #define	HME_FSTBYTE_OFFSET	2
477*9610Sgdamore@opensolaris.org 
478*9610Sgdamore@opensolaris.org #endif	/* _KERNEL */
479*9610Sgdamore@opensolaris.org 
480*9610Sgdamore@opensolaris.org #ifdef	__cplusplus
481*9610Sgdamore@opensolaris.org }
482*9610Sgdamore@opensolaris.org #endif
483*9610Sgdamore@opensolaris.org 
484*9610Sgdamore@opensolaris.org #endif	/* _SYS_HME_H */
485