xref: /illumos-gate/usr/src/uts/common/io/afe/afeimpl.h (revision 19397407)
1 /*
2  * Solaris driver for ethernet cards based on the ADMtek Centaur
3  *
4  * Copyright (c) 2007 by Garrett D'Amore <garrett@damore.org>.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. Neither the name of the author nor the names of any co-contributors
16  *    may be used to endorse or promote products derived from this software
17  *    without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS''
20  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 /*
32  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
33  * Use is subject to license terms.
34  */
35 
36 #ifndef	_AFEIMPL_H
37 #define	_AFEIMPL_H
38 
39 #pragma ident	"%Z%%M%	%I%	%E% SMI"
40 
41 #ifdef	_KERNEL
42 
43 /*
44  * Compile time tunables.
45  */
46 #define	AFE_RXRING	128	/* number of rcv buffers */
47 #define	AFE_TXRING	128	/* number of xmt buffers */
48 #define	AFE_TXRECLAIM	8	/* when to reclaim tx buffers (txavail) */
49 #define	AFE_TXRESCHED	120	/* when to resched (txavail) */
50 #define	AFE_LINKTIMER	5000	/* how often we check link state (in msec) */
51 #define	AFE_HEADROOM	34	/* headroom in packet (should be 2 modulo 4) */
52 
53 /*
54  * Constants, do not change.
55  */
56 #define	AFE_BUFSZ	(1664)	/* big enough for a vlan frame */
57 #define	AFE_MCHASH	(64)
58 
59 typedef struct afe afe_t;
60 typedef struct afe_card afe_card_t;
61 typedef struct afe_rxbuf afe_rxbuf_t;
62 typedef struct afe_txbuf afe_txbuf_t;
63 typedef struct afe_desc afe_desc_t;
64 
65 /*
66  * Card models.
67  */
68 typedef enum {
69 	MODEL_CENTAUR = 1,
70 	MODEL_COMET,
71 } afe_model_t;
72 
73 struct afe_card {
74 	uint16_t	card_venid;	/* PCI vendor id */
75 	uint16_t	card_devid;	/* PCI device id */
76 	char		*card_cardname;	/* Description of the card */
77 	afe_model_t	card_model;	/* Card specific flags */
78 };
79 
80 /*
81  * Device instance structure, one per PCI card.
82  */
83 struct afe {
84 	dev_info_t		*afe_dip;
85 	mac_handle_t		afe_mh;
86 	afe_card_t		*afe_cardp;
87 	uint16_t		afe_cachesize;
88 	uint8_t			afe_sromwidth;
89 	int			afe_flags;
90 	kmutex_t		afe_xmtlock;
91 	kmutex_t		afe_intrlock;
92 	ddi_iblock_cookie_t	afe_icookie;
93 
94 	/*
95 	 * Register and DMA access.
96 	 */
97 	uintptr_t		afe_regs;
98 	ddi_acc_handle_t	afe_regshandle;
99 
100 	/*
101 	 * Receive descriptors.
102 	 */
103 	int			afe_rxhead;
104 	struct afe_desc		*afe_rxdescp;
105 	ddi_dma_handle_t	afe_rxdesc_dmah;
106 	ddi_acc_handle_t	afe_rxdesc_acch;
107 	uint32_t		afe_rxdesc_paddr;
108 	struct afe_rxbuf	**afe_rxbufs;
109 
110 	/*
111 	 * Transmit descriptors.
112 	 */
113 	int			afe_txreclaim;
114 	int			afe_txsend;
115 	int			afe_txavail;
116 	struct afe_desc		*afe_txdescp;
117 	ddi_dma_handle_t	afe_txdesc_dmah;
118 	ddi_acc_handle_t	afe_txdesc_acch;
119 	uint32_t		afe_txdesc_paddr;
120 	struct afe_txbuf	**afe_txbufs;
121 	hrtime_t		afe_txstall_time;
122 	boolean_t		afe_wantw;
123 
124 	/*
125 	 * Link state.
126 	 */
127 	uint64_t		afe_lastifspeed;
128 	link_state_t		afe_linkup;
129 	link_duplex_t		afe_lastduplex;
130 	link_duplex_t		afe_duplex;
131 	uint64_t		afe_ifspeed;
132 	boolean_t		afe_resetting;	/* no link warning */
133 
134 	/*
135 	 * Transceiver stuff.
136 	 */
137 	int			afe_phyaddr;
138 	int			afe_phyid;
139 	int			afe_phyinuse;
140 
141 	uint8_t			afe_adv_aneg;
142 	uint8_t			afe_adv_100T4;
143 	uint8_t			afe_adv_100fdx;
144 	uint8_t			afe_adv_100hdx;
145 	uint8_t			afe_adv_10fdx;
146 	uint8_t			afe_adv_10hdx;
147 	uint8_t			afe_cap_aneg;
148 	uint8_t			afe_cap_100T4;
149 	uint8_t			afe_cap_100fdx;
150 	uint8_t			afe_cap_100hdx;
151 	uint8_t			afe_cap_10fdx;
152 	uint8_t			afe_cap_10hdx;
153 
154 	int			afe_forcefiber;
155 
156 	/*
157 	 * Address management.
158 	 */
159 	uchar_t			afe_curraddr[ETHERADDRL];
160 	boolean_t		afe_promisc;
161 	uint16_t		afe_mccount[AFE_MCHASH];
162 	uint32_t		afe_mctab[AFE_MCHASH / 32];	/* Centaur */
163 
164 	/*
165 	 * Kstats.
166 	 */
167 	kstat_t			*afe_intrstat;
168 	uint64_t		afe_ipackets;
169 	uint64_t		afe_opackets;
170 	uint64_t		afe_rbytes;
171 	uint64_t		afe_obytes;
172 	uint64_t		afe_brdcstxmt;
173 	uint64_t		afe_multixmt;
174 	uint64_t		afe_brdcstrcv;
175 	uint64_t		afe_multircv;
176 	unsigned		afe_norcvbuf;
177 	unsigned		afe_errrcv;
178 	unsigned		afe_errxmt;
179 	unsigned		afe_missed;
180 	unsigned		afe_underflow;
181 	unsigned		afe_overflow;
182 	unsigned		afe_align_errors;
183 	unsigned		afe_fcs_errors;
184 	unsigned		afe_carrier_errors;
185 	unsigned		afe_collisions;
186 	unsigned		afe_ex_collisions;
187 	unsigned		afe_tx_late_collisions;
188 	unsigned		afe_defer_xmts;
189 	unsigned		afe_first_collisions;
190 	unsigned		afe_multi_collisions;
191 	unsigned		afe_sqe_errors;
192 	unsigned		afe_macxmt_errors;
193 	unsigned		afe_macrcv_errors;
194 	unsigned		afe_toolong_errors;
195 	unsigned		afe_runt;
196 	unsigned		afe_jabber;
197 };
198 
199 struct afe_rxbuf {
200 	caddr_t			rxb_buf;
201 	ddi_dma_handle_t	rxb_dmah;
202 	ddi_acc_handle_t	rxb_acch;
203 	uint32_t		rxb_paddr;
204 };
205 
206 struct afe_txbuf {
207 	caddr_t			txb_buf;
208 	uint32_t		txb_paddr;
209 	ddi_dma_handle_t	txb_dmah;
210 	ddi_acc_handle_t	txb_acch;
211 };
212 
213 /*
214  * Descriptor.  We use rings rather than chains.
215  */
216 struct afe_desc {
217 	unsigned	desc_status;
218 	unsigned	desc_control;
219 	unsigned	desc_buffer1;
220 	unsigned	desc_buffer2;
221 };
222 
223 #define	PUTTXDESC(afep, member, val)	\
224 	ddi_put32(afep->afe_txdesc_acch, &member, val)
225 
226 #define	PUTRXDESC(afep, member, val)	\
227 	ddi_put32(afep->afe_rxdesc_acch, &member, val)
228 
229 #define	GETTXDESC(afep, member)	\
230 	ddi_get32(afep->afe_txdesc_acch, &member)
231 
232 #define	GETRXDESC(afep, member)	\
233 	ddi_get32(afep->afe_rxdesc_acch, &member)
234 
235 /*
236  * Receive descriptor fields.
237  */
238 #define	RXSTAT_OWN		0x80000000U	/* ownership */
239 #define	RXSTAT_RXLEN		0x3FFF0000U	/* frame length, incl. crc */
240 #define	RXSTAT_RXERR		0x00008000U	/* error summary */
241 #define	RXSTAT_DESCERR		0x00004000U	/* descriptor error */
242 #define	RXSTAT_RXTYPE		0x00003000U	/* data type */
243 #define	RXSTAT_RUNT		0x00000800U	/* runt frame */
244 #define	RXSTAT_GROUP		0x00000400U	/* multicast/brdcast frame */
245 #define	RXSTAT_FIRST		0x00000200U	/* first descriptor */
246 #define	RXSTAT_LAST		0x00000100U	/* last descriptor */
247 #define	RXSTAT_TOOLONG		0x00000080U	/* frame too long */
248 #define	RXSTAT_COLLSEEN		0x00000040U	/* late collision seen */
249 #define	RXSTAT_FRTYPE		0x00000020U	/* frame type */
250 #define	RXSTAT_WATCHDOG		0x00000010U	/* receive watchdog */
251 #define	RXSTAT_DRIBBLE		0x00000004U	/* dribbling bit */
252 #define	RXSTAT_CRCERR		0x00000002U	/* crc error */
253 #define	RXSTAT_OFLOW		0x00000001U	/* fifo overflow */
254 #define	RXSTAT_ERRS		(RXSTAT_DESCERR | RXSTAT_RUNT | \
255 				RXSTAT_COLLSEEN | RXSTAT_DRIBBLE | \
256 				RXSTAT_CRCERR | RXSTAT_OFLOW)
257 #define	RXLENGTH(x)		((x & RXSTAT_RXLEN) >> 16)
258 
259 #define	RXCTL_ENDRING		0x02000000U	/* end of ring */
260 #define	RXCTL_CHAIN		0x01000000U	/* chained descriptors */
261 #define	RXCTL_BUFLEN2		0x003FF800U	/* buffer 2 length */
262 #define	RXCTL_BUFLEN1		0x000007FFU	/* buffer 1 length */
263 
264 /*
265  * Transmit descriptor fields.
266  */
267 #define	TXSTAT_OWN		0x80000000U	/* ownership */
268 #define	TXSTAT_URCNT		0x00C00000U	/* underrun count */
269 #define	TXSTAT_TXERR		0x00008000U	/* error summary */
270 #define	TXSTAT_JABBER		0x00004000U	/* jabber timeout */
271 #define	TXSTAT_CARRLOST		0x00000800U	/* lost carrier */
272 #define	TXSTAT_NOCARR		0x00000400U	/* no carrier */
273 #define	TXSTAT_LATECOL		0x00000200U	/* late collision */
274 #define	TXSTAT_EXCOLL		0x00000100U	/* excessive collisions */
275 #define	TXSTAT_SQE		0x00000080U	/* heartbeat failure */
276 #define	TXSTAT_COLLCNT		0x00000078U	/* collision count */
277 #define	TXSTAT_UFLOW		0x00000002U	/* underflow */
278 #define	TXSTAT_DEFER		0x00000001U	/* deferred */
279 #define	TXCOLLCNT(x)		((x & TXSTAT_COLLCNT) >> 3)
280 #define	TXUFLOWCNT(x)		((x & TXSTAT_URCNT) >> 22)
281 
282 #define	TXCTL_INTCMPLTE		0x80000000U	/* interrupt completed */
283 #define	TXCTL_LAST		0x40000000U	/* last descriptor */
284 #define	TXCTL_FIRST		0x20000000U	/* first descriptor */
285 #define	TXCTL_NOCRC		0x04000000U	/* disable crc */
286 #define	TXCTL_ENDRING		0x02000000U	/* end of ring */
287 #define	TXCTL_CHAIN		0x01000000U	/* chained descriptors */
288 #define	TXCTL_NOPAD		0x00800000U	/* disable padding */
289 #define	TXCTL_HASHPERF		0x00400000U	/* hash perfect mode */
290 #define	TXCTL_BUFLEN2		0x003FF800U	/* buffer length 2 */
291 #define	TXCTL_BUFLEN1		0x000007FFU	/* buffer length 1 */
292 
293 
294 /*
295  * Interface flags.
296  */
297 #define	AFE_RUNNING	0x1	/* chip is initialized */
298 #define	AFE_SUSPENDED	0x2	/* interface is suspended */
299 #define	AFE_HASFIBER	0x4	/* internal phy supports fiber (AFE_PHY_MCR) */
300 
301 #define	AFE_MODEL(afep)		((afep)->afe_cardp->card_model)
302 
303 
304 /*
305  * Register definitions located in afe.h exported header file.
306  */
307 
308 /*
309  * Macros to simplify hardware access.
310  */
311 #define	GETCSR(afep, reg)	\
312 	ddi_get32(afep->afe_regshandle, (uint32_t *)(afep->afe_regs + reg))
313 
314 #define	GETCSR16(afep, reg)	\
315 	ddi_get16(afep->afe_regshandle, (uint16_t *)(afep->afe_regs + reg))
316 
317 #define	PUTCSR(afep, reg, val)	\
318 	ddi_put32(afep->afe_regshandle, (uint32_t *)(afep->afe_regs + reg), val)
319 
320 #define	PUTCSR16(afep, reg, val)	\
321 	ddi_put16(afep->afe_regshandle, (uint16_t *)(afep->afe_regs + reg), val)
322 
323 #define	SETBIT(afep, reg, val)	PUTCSR(afep, reg, GETCSR(afep, reg) | (val))
324 
325 #define	CLRBIT(afep, reg, val)	PUTCSR(afep, reg, GETCSR(afep, reg) & ~(val))
326 
327 #define	SYNCTXDESC(afep, index, who)	\
328 	(void) ddi_dma_sync(afep->afe_txdesc_dmah, \
329 	    (index * sizeof (afe_desc_t)), sizeof (afe_desc_t), who)
330 
331 #define	SYNCTXBUF(txb, len, who)	\
332 	(void) ddi_dma_sync(txb->txb_dmah, 0, len, who)
333 
334 #define	SYNCRXDESC(afep, index, who)	\
335 	(void) ddi_dma_sync(afep->afe_rxdesc_dmah, \
336 	    (index * sizeof (afe_desc_t)), sizeof (afe_desc_t), who)
337 
338 #define	SYNCRXBUF(rxb, len, who)	\
339 	(void) ddi_dma_sync(rxb->rxb_dmah, 0, len, who)
340 
341 /*
342  * Debugging flags.
343  */
344 #define	DWARN	0x0001
345 #define	DINTR	0x0002
346 #define	DMACID	0x0008
347 #define	DPHY	0x0020
348 #define	DPCI	0x0040
349 #define	DCHATTY	0x0080
350 #define	DDMA	0x0100
351 #define	DLINK	0x0200
352 #define	DSROM	0x0400
353 #define	DRECV	0x0800
354 #define	DXMIT	0x1000
355 
356 #ifdef	DEBUG
357 #define	DBG(lvl, ...)	afe_dprintf(afep, __func__, lvl, __VA_ARGS__)
358 #else
359 #define	DBG(lvl, ...)
360 #endif
361 
362 #endif	/* _KERNEL */
363 
364 #endif	/* _AFEIMPL_H */
365