xref: /illumos-gate/usr/src/uts/common/io/hme/hme.h (revision 46b592853d0f4f11781b6b0a7533f267c6aee132)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef	_SYS_HME_H
27 #define	_SYS_HME_H
28 
29 #ifdef	__cplusplus
30 extern "C" {
31 #endif
32 
33 #ifdef _KERNEL
34 
35 /* default IPG settings */
36 #define	IPG1	8
37 #define	IPG2	4
38 
39 /*
40  * Declarations and definitions specific to the
41  * FEPS 10/100 Mbps Ethernet (hme) device.
42  */
43 
44 /*
45  * Per-Stream instance state information.
46  *
47  * Each instance is dynamically allocated at open() and free'd
48  * at close().  Each per-Stream instance points to at most one
49  * per-device structure using the sb_hmep field.  All instances
50  * are threaded together into one list of active instances
51  * ordered on minor device number.
52  */
53 
54 #define	HME_2P0_REVID		0xa0 /* hme - feps. */
55 #define	HME_2P1_REVID		0x20
56 #define	HME_2P1_REVID_OBP	0x21
57 #define	HME_1C0_REVID		0xc0 /* cheerio 1.0, hme 2.0 equiv. */
58 #define	HME_2C0_REVID		0xc1 /* cheerio 2.0, hme 2.2 equiv. */
59 #define	HME_REV_VERS_MASK	0x0f /* Mask to retain bits for cheerio ver */
60 
61 typedef struct {
62 	ddi_dma_handle_t	dmah;
63 	ddi_acc_handle_t	acch;
64 	caddr_t			kaddr;
65 	uint32_t		paddr;
66 } hmebuf_t;
67 
68 /*
69  * HME Device Channel instance state information.
70  *
71  * Each instance is dynamically allocated on first attach.
72  */
73 struct	hme {
74 	mac_handle_t		hme_mh;		/* GLDv3 handle */
75 	mii_handle_t		hme_mii;
76 	dev_info_t		*dip;		/* associated dev_info */
77 	int			instance;	/* instance */
78 	ulong_t			pagesize;	/* btop(9F) */
79 
80 	int			hme_mifpoll_enable;
81 	int			hme_frame_enable;
82 	int			hme_lance_mode_enable;
83 	int			hme_rxcv_enable;
84 
85 	uint32_t		hme_lance_mode;
86 	uint32_t		hme_ipg0;
87 	uint32_t		hme_ipg1;
88 	uint32_t		hme_ipg2;
89 
90 	uint_t			hme_burstsizes; /* binary encoded val */
91 	uint32_t		hme_config;	/* Config reg store */
92 
93 	int			hme_phy_failure; /* phy failure type */
94 
95 	int			hme_64bit_xfer;	/* 64-bit Sbus xfers */
96 	int			hme_phyad;
97 
98 	int			hme_nlasttries;
99 	int			hme_cheerio_mode;
100 
101 	struct	ether_addr	hme_factaddr;	/* factory mac address */
102 	struct	ether_addr	hme_ouraddr;	/* individual address */
103 	uint32_t		hme_addrflags;	/* address flags */
104 	uint32_t		hme_flags;	/* misc. flags */
105 	boolean_t		hme_wantw;	/* xmit: out of resources */
106 	boolean_t		hme_started;	/* mac layer started */
107 
108 	uint8_t			hme_devno;
109 
110 	uint16_t		hme_ladrf[4];	/* 64 bit multicast filter */
111 	uint32_t		hme_ladrf_refcnt[64];
112 	boolean_t		hme_promisc;
113 	uint32_t		hme_multi;	/* refcount on mcast addrs */
114 
115 	struct	hme_global	*hme_globregp;	/* HME global regs */
116 	struct	hme_etx		*hme_etxregp;	/* HME ETX regs */
117 	struct	hme_erx		*hme_erxregp;	/* HME ERX regs */
118 	struct	hme_bmac	*hme_bmacregp;	/* BigMAC registers */
119 	struct	hme_mif		*hme_mifregp;	/* HME transceiver */
120 	unsigned char		*hme_romp;	/* fcode rom pointer */
121 
122 	kmutex_t	hme_xmitlock;		/* protect xmit-side fields */
123 	kmutex_t	hme_intrlock;		/* protect intr-side fields */
124 	ddi_iblock_cookie_t	hme_cookie;	/* interrupt cookie */
125 
126 	struct	hme_rmd	*hme_rmdp;	/* receive descriptor ring start */
127 	struct	hme_tmd	*hme_tmdp;	/* transmit descriptor ring start */
128 
129 	ddi_dma_handle_t	hme_rmd_dmah;
130 	ddi_acc_handle_t	hme_rmd_acch;
131 	caddr_t			hme_rmd_kaddr;
132 	uint32_t		hme_rmd_paddr;
133 
134 	ddi_dma_handle_t	hme_tmd_dmah;
135 	ddi_acc_handle_t	hme_tmd_acch;
136 	caddr_t			hme_tmd_kaddr;
137 	uint32_t		hme_tmd_paddr;
138 
139 	uint64_t		hme_rxindex;
140 	uint64_t		hme_txindex;
141 	uint64_t		hme_txreclaim;
142 
143 	hmebuf_t		*hme_tbuf;	/* hmebuf associated with TMD */
144 	hmebuf_t		*hme_rbuf;	/* hmebuf associated with RMD */
145 
146 	ddi_device_acc_attr_t	hme_dev_attr;
147 	ddi_acc_handle_t	hme_globregh;   /* HME global regs */
148 	ddi_acc_handle_t	hme_etxregh;    /* HME ETX regs */
149 	ddi_acc_handle_t	hme_erxregh;    /* HME ERX regs */
150 	ddi_acc_handle_t	hme_bmacregh;   /* BigMAC registers */
151 	ddi_acc_handle_t	hme_mifregh;    /* HME transceiver */
152 	ddi_acc_handle_t	hme_romh;	/* rom handle */
153 
154 	ddi_acc_handle_t	pci_config_handle; /* HME PCI config */
155 
156 	/*
157 	 * DDI dma handle, kernel virtual base,
158 	 * and io virtual base of IOPB area.
159 	 */
160 	ddi_dma_handle_t	hme_iopbhandle;
161 	ulong_t			hme_iopbkbase;
162 	uint32_t		hme_iopbiobase;
163 
164 	kstat_t	*hme_ksp;	/* kstat pointer */
165 	kstat_t	*hme_intrstats;	/* kstat interrupt counter */
166 
167 	uint64_t hme_ipackets;
168 	uint64_t hme_rbytes;
169 	uint64_t hme_ierrors;
170 	uint64_t hme_opackets;
171 	uint64_t hme_obytes;
172 	uint64_t hme_oerrors;
173 	uint64_t hme_multircv;		/* # multicast packets received */
174 	uint64_t hme_multixmt;		/* # multicast packets for xmit */
175 	uint64_t hme_brdcstrcv;		/* # broadcast packets received */
176 	uint64_t hme_brdcstxmt;		/* # broadcast packets for xmit */
177 	uint64_t hme_oflo;
178 	uint64_t hme_uflo;
179 	uint64_t hme_norcvbuf;		/* # rcv packets discarded */
180 	uint64_t hme_noxmtbuf;		/* # xmit packets discarded */
181 	uint64_t hme_duplex;
182 	uint64_t hme_align_errors;
183 	uint64_t hme_coll;
184 	uint64_t hme_fcs_errors;
185 	uint64_t hme_defer_xmts;
186 	uint64_t hme_sqe_errors;
187 	uint64_t hme_excol;
188 	uint64_t hme_fstcol;
189 	uint64_t hme_tlcol;
190 	uint64_t hme_toolong_errors;
191 	uint64_t hme_runt;
192 	uint64_t hme_carrier_errors;
193 	uint64_t hme_jab;
194 
195 	uint32_t hme_cvc;
196 	uint32_t hme_lenerr;
197 	uint32_t hme_buff;
198 	uint32_t hme_missed;
199 	uint32_t hme_nocanput;
200 	uint32_t hme_allocbfail;
201 	uint32_t hme_babl;
202 	uint32_t hme_tmder;
203 	uint32_t hme_txlaterr;
204 	uint32_t hme_rxlaterr;
205 	uint32_t hme_slvparerr;
206 	uint32_t hme_txparerr;
207 	uint32_t hme_rxparerr;
208 	uint32_t hme_slverrack;
209 	uint32_t hme_txerrack;
210 	uint32_t hme_rxerrack;
211 	uint32_t hme_txtagerr;
212 	uint32_t hme_rxtagerr;
213 	uint32_t hme_eoperr;
214 	uint32_t hme_notmds;
215 	uint32_t hme_notbufs;
216 	uint32_t hme_norbufs;
217 
218 	/*
219 	 * check if transmitter is hung
220 	 */
221 	uint32_t hme_starts;
222 	uint32_t hme_txhung;
223 	time_t hme_msg_time;
224 
225 	/*
226 	 * Debuging kstats
227 	 */
228 	uint32_t inits;
229 	uint32_t phyfail;
230 	uint32_t asic_rev;
231 };
232 
233 /* flags */
234 #define	HMERUNNING	0x01	/* chip is initialized */
235 #define	HMESUSPENDED	0x08	/* suspended interface */
236 #define	HMEINITIALIZED	0x10	/* interface initialized */
237 
238 /* Mac address flags */
239 
240 #define	HME_FACTADDR_PRESENT	0x01	/* factory MAC id present */
241 #define	HME_FACTADDR_USE	0x02	/* use factory MAC id */
242 
243 struct	hmekstat {
244 	struct kstat_named	hk_cvc;		/* code violation  errors */
245 	struct kstat_named	hk_lenerr;	/* rx len errors */
246 	struct kstat_named	hk_buff;	/* buff errors */
247 	struct kstat_named	hk_missed;	/* missed/dropped packets */
248 	struct kstat_named	hk_nocanput;	/* nocanput errors */
249 	struct kstat_named	hk_allocbfail;	/* allocb failures */
250 	struct kstat_named	hk_babl;	/* runt errors */
251 	struct kstat_named	hk_tmder;	/* tmd errors */
252 	struct kstat_named	hk_txlaterr;	/* tx late errors */
253 	struct kstat_named	hk_rxlaterr;	/* rx late errors */
254 	struct kstat_named	hk_slvparerr;	/* slave parity errors */
255 	struct kstat_named	hk_txparerr;	/* tx parity errors */
256 	struct kstat_named	hk_rxparerr;	/* rx parity errors */
257 	struct kstat_named	hk_slverrack;	/* slave error acks */
258 	struct kstat_named	hk_txerrack;	/* tx error acks */
259 	struct kstat_named	hk_rxerrack;	/* rx error acks */
260 	struct kstat_named	hk_txtagerr;	/* tx tag error */
261 	struct kstat_named	hk_rxtagerr;	/* rx tag error */
262 	struct kstat_named	hk_eoperr;	/* eop error */
263 	struct kstat_named	hk_notmds;	/* tmd errors */
264 	struct kstat_named	hk_notbufs;	/* tx buf errors */
265 	struct kstat_named	hk_norbufs;	/* rx buf errors */
266 
267 	struct kstat_named	hk_inits;		/* global inits */
268 	struct	kstat_named	hk_phyfail;		/* phy failures */
269 
270 	struct	kstat_named	hk_asic_rev;		/* asic_rev */
271 };
272 
273 #define	HMEDRAINTIME	(400000)	/* # microseconds xmit drain */
274 
275 #define	ROUNDUP(a, n)	(((a) + ((n) - 1)) & ~((n) - 1))
276 #define	ROUNDUP2(a, n)	(uchar_t *)((((uintptr_t)(a)) + ((n) - 1)) & ~((n) - 1))
277 
278 /*
279  * Xmit/receive buffer structure.
280  * This structure is organized to meet the following requirements:
281  * - bb_buf starts on an HMEBURSTSIZE boundary.
282  * - hmebuf is an even multiple of HMEBURSTSIZE
283  * - bb_buf[] is large enough to contain max VLAN frame (1522) plus
284  *   (3 x HMEBURSTSIZE) rounded up to the next HMEBURSTSIZE
285  * XXX What about another 128 bytes (HMEC requirement).
286  * Fast aligned copy requires both the source and destination
287  * addresses have the same offset from some N-byte boundary.
288  */
289 #define		HMEBURSTSIZE	(64)
290 #define		HMEBURSTMASK	(HMEBURSTSIZE - 1)
291 #define		HMEBUFSIZE	(1728)
292 
293 /*
294  * Define offset from start of bb_buf[] to point receive descriptor.
295  * Requirements:
296  * - must be 14 bytes back of a 4-byte boundary so the start of
297  *   the network packet is 4-byte aligned.
298  * - leave some headroom for others
299  */
300 #define		HMEHEADROOM	(34)
301 
302 /* Offset for the first byte in the receive buffer */
303 #define	HME_FSTBYTE_OFFSET	2
304 
305 #endif	/* _KERNEL */
306 
307 #ifdef	__cplusplus
308 }
309 #endif
310 
311 #endif	/* _SYS_HME_H */
312