xref: /onnv-gate/usr/src/uts/common/io/mxfe/mxfeimpl.h (revision 4978:7bb29ac056b9)
1*4978Sgd78059 /*
2*4978Sgd78059  * Solaris driver for ethernet cards based on the Macronix 98715
3*4978Sgd78059  *
4*4978Sgd78059  * Copyright (c) 2007 by Garrett D'Amore <garrett@damore.org>.
5*4978Sgd78059  * All rights reserved.
6*4978Sgd78059  *
7*4978Sgd78059  * Redistribution and use in source and binary forms, with or without
8*4978Sgd78059  * modification, are permitted provided that the following conditions
9*4978Sgd78059  * are met:
10*4978Sgd78059  * 1. Redistributions of source code must retain the above copyright
11*4978Sgd78059  *    notice, this list of conditions and the following disclaimer.
12*4978Sgd78059  * 2. Redistributions in binary form must reproduce the above copyright
13*4978Sgd78059  *    notice, this list of conditions and the following disclaimer in the
14*4978Sgd78059  *    documentation and/or other materials provided with the distribution.
15*4978Sgd78059  * 3. Neither the name of the author nor the names of any co-contributors
16*4978Sgd78059  *    may be used to endorse or promote products derived from this software
17*4978Sgd78059  *    without specific prior written permission.
18*4978Sgd78059  *
19*4978Sgd78059  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS''
20*4978Sgd78059  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21*4978Sgd78059  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22*4978Sgd78059  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23*4978Sgd78059  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24*4978Sgd78059  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25*4978Sgd78059  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*4978Sgd78059  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27*4978Sgd78059  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28*4978Sgd78059  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29*4978Sgd78059  * POSSIBILITY OF SUCH DAMAGE.
30*4978Sgd78059  */
31*4978Sgd78059 
32*4978Sgd78059 #ifndef	_MXFEIMPL_H
33*4978Sgd78059 #define	_MXFEIMPL_H
34*4978Sgd78059 
35*4978Sgd78059 #pragma ident	"%Z%%M%	%I%	%E% SMI"
36*4978Sgd78059 
37*4978Sgd78059 /*
38*4978Sgd78059  * This entire file is private to the MXFE driver.
39*4978Sgd78059  */
40*4978Sgd78059 
41*4978Sgd78059 #ifdef	_KERNEL
42*4978Sgd78059 
43*4978Sgd78059 /*
44*4978Sgd78059  * Compile time tunables.
45*4978Sgd78059  */
46*4978Sgd78059 #define	MXFE_TXRING	128	/* number of xmt buffers */
47*4978Sgd78059 #define	MXFE_RXRING	256	/* number of rcv buffers */
48*4978Sgd78059 #define	MXFE_TXRECLAIM	32	/* when to reclaim tx buffers (txavail) */
49*4978Sgd78059 #define	MXFE_TXRESCHED	120	/* when to resched (txavail) */
50*4978Sgd78059 #define	MXFE_LINKTIMER	5000	/* how often we check link state (msec) */
51*4978Sgd78059 #define	MXFE_HEADROOM	34	/* headroom in packet (should be 2 modulo 4) */
52*4978Sgd78059 
53*4978Sgd78059 /*
54*4978Sgd78059  * Constants, do not change.  The bufsize is setup to make sure it comes
55*4978Sgd78059  * in at a whole number of cache lines, even for 32-long-word aligned
56*4978Sgd78059  * caches.
57*4978Sgd78059  */
58*4978Sgd78059 #define	MXFE_BUFSZ	(1664)		/* big enough for a vlan frame */
59*4978Sgd78059 #define	MXFE_SETUP_LEN	192		/* size of a setup frame */
60*4978Sgd78059 
61*4978Sgd78059 typedef struct mxfe mxfe_t;
62*4978Sgd78059 typedef struct mxfe_card mxfe_card_t;
63*4978Sgd78059 typedef struct mxfe_nd mxfe_nd_t;
64*4978Sgd78059 typedef struct mxfe_rxbuf mxfe_rxbuf_t;
65*4978Sgd78059 typedef struct mxfe_txbuf mxfe_txbuf_t;
66*4978Sgd78059 typedef struct mxfe_desc mxfe_desc_t;
67*4978Sgd78059 typedef int (*mxfe_nd_pf_t)(mxfe_t *, mblk_t *, mxfe_nd_t *);
68*4978Sgd78059 
69*4978Sgd78059 struct mxfe_card {
70*4978Sgd78059 	uint16_t	card_venid;	/* PCI vendor id */
71*4978Sgd78059 	uint16_t	card_devid;	/* PCI device id */
72*4978Sgd78059 	uint16_t	card_revid;	/* PCI revision id */
73*4978Sgd78059 	uint16_t	card_revmask;
74*4978Sgd78059 	char		*card_cardname;	/* Description of the card */
75*4978Sgd78059 	unsigned	card_model;	/* Card specific flags */
76*4978Sgd78059 };
77*4978Sgd78059 
78*4978Sgd78059 struct mxfe_nd {
79*4978Sgd78059 	mxfe_nd_t	*nd_next;
80*4978Sgd78059 	char		*nd_name;
81*4978Sgd78059 	mxfe_nd_pf_t	nd_get;
82*4978Sgd78059 	mxfe_nd_pf_t	nd_set;
83*4978Sgd78059 	intptr_t	nd_arg1;
84*4978Sgd78059 	intptr_t	nd_arg2;
85*4978Sgd78059 };
86*4978Sgd78059 
87*4978Sgd78059 /*
88*4978Sgd78059  * Device instance structure, one per PCI card.
89*4978Sgd78059  */
90*4978Sgd78059 struct mxfe {
91*4978Sgd78059 	dev_info_t		*mxfe_dip;
92*4978Sgd78059 	mac_handle_t		mxfe_mh;
93*4978Sgd78059 	mxfe_card_t		*mxfe_cardp;
94*4978Sgd78059 	ushort_t		mxfe_cachesize;
95*4978Sgd78059 	ushort_t		mxfe_sromwidth;
96*4978Sgd78059 	int			mxfe_flags;
97*4978Sgd78059 	kmutex_t		mxfe_xmtlock;
98*4978Sgd78059 	kmutex_t		mxfe_intrlock;
99*4978Sgd78059 	ddi_iblock_cookie_t	mxfe_icookie;
100*4978Sgd78059 
101*4978Sgd78059 	/*
102*4978Sgd78059 	 * Register access.
103*4978Sgd78059 	 */
104*4978Sgd78059 	uint32_t		*mxfe_regs;
105*4978Sgd78059 	ddi_acc_handle_t	mxfe_regshandle;
106*4978Sgd78059 
107*4978Sgd78059 	/*
108*4978Sgd78059 	 * Receive descriptors.
109*4978Sgd78059 	 */
110*4978Sgd78059 	int			mxfe_rxhead;
111*4978Sgd78059 	struct mxfe_desc	*mxfe_rxdescp;
112*4978Sgd78059 	ddi_dma_handle_t	mxfe_rxdesc_dmah;
113*4978Sgd78059 	ddi_acc_handle_t	mxfe_rxdesc_acch;
114*4978Sgd78059 	uint32_t		mxfe_rxdesc_paddr;
115*4978Sgd78059 	struct mxfe_rxbuf	**mxfe_rxbufs;
116*4978Sgd78059 
117*4978Sgd78059 	/*
118*4978Sgd78059 	 * Transmit descriptors.
119*4978Sgd78059 	 */
120*4978Sgd78059 	int			mxfe_txreclaim;
121*4978Sgd78059 	int			mxfe_txsend;
122*4978Sgd78059 	int			mxfe_txavail;
123*4978Sgd78059 	struct mxfe_desc	*mxfe_txdescp;
124*4978Sgd78059 	ddi_dma_handle_t	mxfe_txdesc_dmah;
125*4978Sgd78059 	ddi_acc_handle_t	mxfe_txdesc_acch;
126*4978Sgd78059 	uint32_t		mxfe_txdesc_paddr;
127*4978Sgd78059 	struct mxfe_txbuf	**mxfe_txbufs;
128*4978Sgd78059 	hrtime_t		mxfe_txstall_time;
129*4978Sgd78059 	boolean_t		mxfe_wantw;
130*4978Sgd78059 
131*4978Sgd78059 	/*
132*4978Sgd78059 	 * Address management.
133*4978Sgd78059 	 */
134*4978Sgd78059 	uchar_t			mxfe_curraddr[ETHERADDRL];
135*4978Sgd78059 	boolean_t		mxfe_promisc;
136*4978Sgd78059 
137*4978Sgd78059 	/*
138*4978Sgd78059 	 * Link state.
139*4978Sgd78059 	 */
140*4978Sgd78059 	int			mxfe_linkstate;
141*4978Sgd78059 	int			mxfe_lastifspeed;
142*4978Sgd78059 	int			mxfe_lastduplex;
143*4978Sgd78059 	int			mxfe_lastlinkup;
144*4978Sgd78059 	int			mxfe_linkup;
145*4978Sgd78059 	int			mxfe_duplex;
146*4978Sgd78059 	int			mxfe_ifspeed;
147*4978Sgd78059 	boolean_t		mxfe_resetting;	/* no link warning */
148*4978Sgd78059 
149*4978Sgd78059 	/*
150*4978Sgd78059 	 * NDD related support.
151*4978Sgd78059 	 */
152*4978Sgd78059 	mxfe_nd_t		*mxfe_ndp;
153*4978Sgd78059 
154*4978Sgd78059 	/*
155*4978Sgd78059 	 * Transceiver stuff.
156*4978Sgd78059 	 */
157*4978Sgd78059 	int			mxfe_phyaddr;
158*4978Sgd78059 	int			mxfe_phyid;
159*4978Sgd78059 	int			mxfe_phyinuse;
160*4978Sgd78059 	int			mxfe_adv_aneg;
161*4978Sgd78059 	int			mxfe_adv_100T4;
162*4978Sgd78059 	int			mxfe_adv_100fdx;
163*4978Sgd78059 	int			mxfe_adv_100hdx;
164*4978Sgd78059 	int			mxfe_adv_10fdx;
165*4978Sgd78059 	int			mxfe_adv_10hdx;
166*4978Sgd78059 	int			mxfe_forcephy;
167*4978Sgd78059 	int			mxfe_bmsr;
168*4978Sgd78059 	int			mxfe_anlpar;
169*4978Sgd78059 	int			mxfe_aner;
170*4978Sgd78059 
171*4978Sgd78059 	/*
172*4978Sgd78059 	 * Kstats.
173*4978Sgd78059 	 */
174*4978Sgd78059 	kstat_t			*mxfe_intrstat;
175*4978Sgd78059 	uint64_t		mxfe_ipackets;
176*4978Sgd78059 	uint64_t		mxfe_opackets;
177*4978Sgd78059 	uint64_t		mxfe_rbytes;
178*4978Sgd78059 	uint64_t		mxfe_obytes;
179*4978Sgd78059 	uint64_t		mxfe_brdcstrcv;
180*4978Sgd78059 	uint64_t		mxfe_multircv;
181*4978Sgd78059 	uint64_t		mxfe_brdcstxmt;
182*4978Sgd78059 	uint64_t		mxfe_multixmt;
183*4978Sgd78059 
184*4978Sgd78059 	unsigned		mxfe_norcvbuf;
185*4978Sgd78059 	unsigned		mxfe_noxmtbuf;
186*4978Sgd78059 	unsigned		mxfe_errrcv;
187*4978Sgd78059 	unsigned		mxfe_errxmt;
188*4978Sgd78059 	unsigned		mxfe_missed;
189*4978Sgd78059 	unsigned		mxfe_underflow;
190*4978Sgd78059 	unsigned		mxfe_overflow;
191*4978Sgd78059 	unsigned		mxfe_align_errors;
192*4978Sgd78059 	unsigned		mxfe_fcs_errors;
193*4978Sgd78059 	unsigned		mxfe_carrier_errors;
194*4978Sgd78059 	unsigned		mxfe_collisions;
195*4978Sgd78059 	unsigned		mxfe_ex_collisions;
196*4978Sgd78059 	unsigned		mxfe_tx_late_collisions;
197*4978Sgd78059 	unsigned		mxfe_defer_xmts;
198*4978Sgd78059 	unsigned		mxfe_first_collisions;
199*4978Sgd78059 	unsigned		mxfe_multi_collisions;
200*4978Sgd78059 	unsigned		mxfe_sqe_errors;
201*4978Sgd78059 	unsigned		mxfe_macxmt_errors;
202*4978Sgd78059 	unsigned		mxfe_macrcv_errors;
203*4978Sgd78059 	unsigned		mxfe_toolong_errors;
204*4978Sgd78059 	unsigned		mxfe_runt;
205*4978Sgd78059 	unsigned		mxfe_jabber;
206*4978Sgd78059 };
207*4978Sgd78059 
208*4978Sgd78059 struct mxfe_rxbuf {
209*4978Sgd78059 	caddr_t			rxb_buf;
210*4978Sgd78059 	ddi_dma_handle_t	rxb_dmah;
211*4978Sgd78059 	ddi_acc_handle_t	rxb_acch;
212*4978Sgd78059 	uint32_t		rxb_paddr;
213*4978Sgd78059 };
214*4978Sgd78059 
215*4978Sgd78059 struct mxfe_txbuf {
216*4978Sgd78059 	/* bcopy version of tx */
217*4978Sgd78059 	caddr_t			txb_buf;
218*4978Sgd78059 	uint32_t		txb_paddr;
219*4978Sgd78059 	ddi_dma_handle_t	txb_dmah;
220*4978Sgd78059 	ddi_acc_handle_t	txb_acch;
221*4978Sgd78059 };
222*4978Sgd78059 
223*4978Sgd78059 /*
224*4978Sgd78059  * Descriptor.  We use rings rather than chains.
225*4978Sgd78059  */
226*4978Sgd78059 struct mxfe_desc {
227*4978Sgd78059 	unsigned	desc_status;
228*4978Sgd78059 	unsigned	desc_control;
229*4978Sgd78059 	unsigned	desc_buffer1;
230*4978Sgd78059 	unsigned	desc_buffer2;
231*4978Sgd78059 };
232*4978Sgd78059 
233*4978Sgd78059 #define	PUTTXDESC(mxfep, member, val)	\
234*4978Sgd78059 	ddi_put32(mxfep->mxfe_txdesc_acch, &member, val)
235*4978Sgd78059 
236*4978Sgd78059 #define	PUTRXDESC(mxfep, member, val)	\
237*4978Sgd78059 	ddi_put32(mxfep->mxfe_rxdesc_acch, &member, val)
238*4978Sgd78059 
239*4978Sgd78059 #define	GETTXDESC(mxfep, member)	\
240*4978Sgd78059 	ddi_get32(mxfep->mxfe_txdesc_acch, &member)
241*4978Sgd78059 
242*4978Sgd78059 #define	GETRXDESC(mxfep, member)	\
243*4978Sgd78059 	ddi_get32(mxfep->mxfe_rxdesc_acch, &member)
244*4978Sgd78059 
245*4978Sgd78059 /*
246*4978Sgd78059  * Receive descriptor fields.
247*4978Sgd78059  */
248*4978Sgd78059 #define	RXSTAT_OWN		0x80000000U	/* ownership */
249*4978Sgd78059 #define	RXSTAT_RXLEN		0x3FFF0000U	/* frame length, incl. crc */
250*4978Sgd78059 #define	RXSTAT_RXERR		0x00008000U	/* error summary */
251*4978Sgd78059 #define	RXSTAT_DESCERR		0x00004000U	/* descriptor error */
252*4978Sgd78059 #define	RXSTAT_RXTYPE		0x00003000U	/* data type */
253*4978Sgd78059 #define	RXSTAT_RUNT		0x00000800U	/* runt frame */
254*4978Sgd78059 #define	RXSTAT_GROUP		0x00000400U	/* multicast/brdcast frame */
255*4978Sgd78059 #define	RXSTAT_FIRST		0x00000200U	/* first descriptor */
256*4978Sgd78059 #define	RXSTAT_LAST		0x00000100U	/* last descriptor */
257*4978Sgd78059 #define	RXSTAT_TOOLONG		0x00000080U	/* frame too long */
258*4978Sgd78059 #define	RXSTAT_COLLSEEN		0x00000040U	/* late collision seen */
259*4978Sgd78059 #define	RXSTAT_FRTYPE		0x00000020U	/* frame type */
260*4978Sgd78059 #define	RXSTAT_WATCHDOG		0x00000010U	/* receive watchdog */
261*4978Sgd78059 #define	RXSTAT_DRIBBLE		0x00000004U	/* dribbling bit */
262*4978Sgd78059 #define	RXSTAT_CRCERR		0x00000002U	/* crc error */
263*4978Sgd78059 #define	RXSTAT_OFLOW		0x00000001U	/* fifo overflow */
264*4978Sgd78059 #define	RXSTAT_ERRS		(RXSTAT_DESCERR | RXSTAT_RUNT | \
265*4978Sgd78059 				RXSTAT_COLLSEEN | RXSTAT_DRIBBLE | \
266*4978Sgd78059 				RXSTAT_CRCERR | RXSTAT_OFLOW)
267*4978Sgd78059 #define	RXLENGTH(x)		((x & RXSTAT_RXLEN) >> 16)
268*4978Sgd78059 
269*4978Sgd78059 #define	RXCTL_ENDRING		0x02000000U	/* end of ring */
270*4978Sgd78059 #define	RXCTL_CHAIN		0x01000000U	/* chained descriptors */
271*4978Sgd78059 #define	RXCTL_BUFLEN2		0x003FF800U	/* buffer 2 length */
272*4978Sgd78059 #define	RXCTL_BUFLEN1		0x000007FFU	/* buffer 1 length */
273*4978Sgd78059 
274*4978Sgd78059 /*
275*4978Sgd78059  * Transmit descriptor fields.
276*4978Sgd78059  */
277*4978Sgd78059 #define	TXSTAT_OWN		0x80000000U	/* ownership */
278*4978Sgd78059 #define	TXSTAT_URCNT		0x00C00000U	/* underrun count */
279*4978Sgd78059 #define	TXSTAT_TXERR		0x00008000U	/* error summary */
280*4978Sgd78059 #define	TXSTAT_JABBER		0x00004000U	/* jabber timeout */
281*4978Sgd78059 #define	TXSTAT_CARRLOST		0x00000800U	/* lost carrier */
282*4978Sgd78059 #define	TXSTAT_NOCARR		0x00000400U	/* no carrier */
283*4978Sgd78059 #define	TXSTAT_LATECOL		0x00000200U	/* late collision */
284*4978Sgd78059 #define	TXSTAT_EXCOLL		0x00000100U	/* excessive collisions */
285*4978Sgd78059 #define	TXSTAT_SQE		0x00000080U	/* heartbeat failure */
286*4978Sgd78059 #define	TXSTAT_COLLCNT		0x00000078U	/* collision count */
287*4978Sgd78059 #define	TXSTAT_UFLOW		0x00000002U	/* underflow */
288*4978Sgd78059 #define	TXSTAT_DEFER		0x00000001U	/* deferred */
289*4978Sgd78059 #define	TXCOLLCNT(x)		((x & TXSTAT_COLLCNT) >> 3)
290*4978Sgd78059 #define	TXUFLOWCNT(x)		((x & TXSTAT_URCNT) >> 22)
291*4978Sgd78059 
292*4978Sgd78059 #define	TXCTL_INTCMPLTE		0x80000000U	/* interrupt completed */
293*4978Sgd78059 #define	TXCTL_LAST		0x40000000U	/* last descriptor */
294*4978Sgd78059 #define	TXCTL_FIRST		0x20000000U	/* first descriptor */
295*4978Sgd78059 #define	TXCTL_NOCRC		0x04000000U	/* disable crc */
296*4978Sgd78059 #define	TXCTL_SETUP		0x08000000U	/* setup frame */
297*4978Sgd78059 #define	TXCTL_ENDRING		0x02000000U	/* end of ring */
298*4978Sgd78059 #define	TXCTL_CHAIN		0x01000000U	/* chained descriptors */
299*4978Sgd78059 #define	TXCTL_NOPAD		0x00800000U	/* disable padding */
300*4978Sgd78059 #define	TXCTL_HASHPERF		0x00400000U	/* hash perfect mode */
301*4978Sgd78059 #define	TXCTL_BUFLEN2		0x003FF800U	/* buffer length 2 */
302*4978Sgd78059 #define	TXCTL_BUFLEN1		0x000007FFU	/* buffer length 1 */
303*4978Sgd78059 
304*4978Sgd78059 /*
305*4978Sgd78059  * Interface flags.
306*4978Sgd78059  */
307*4978Sgd78059 #define	MXFE_RUNNING	0x1	/* chip is initialized */
308*4978Sgd78059 #define	MXFE_SUSPENDED	0x2	/* interface is suspended */
309*4978Sgd78059 #define	MXFE_SYMBOL	0x8	/* use symbol mode */
310*4978Sgd78059 
311*4978Sgd78059 /*
312*4978Sgd78059  * Link flags...
313*4978Sgd78059  */
314*4978Sgd78059 #define	MXFE_NOLINK	0x0	/* initial link state, no timer */
315*4978Sgd78059 #define	MXFE_NWAYCHECK	0x2	/* checking for NWay support */
316*4978Sgd78059 #define	MXFE_NWAYRENEG	0x3	/* renegotiating NWay mode */
317*4978Sgd78059 #define	MXFE_GOODLINK	0x4	/* detected link is good */
318*4978Sgd78059 
319*4978Sgd78059 /*
320*4978Sgd78059  * Card models.
321*4978Sgd78059  */
322*4978Sgd78059 #define	MXFE_MODEL(mxfep)	((mxfep)->mxfe_cardp->card_model)
323*4978Sgd78059 #define	MXFE_98715	0x1
324*4978Sgd78059 #define	MXFE_98715A	0x2
325*4978Sgd78059 #define	MXFE_98715AEC	0x3
326*4978Sgd78059 #define	MXFE_98715B	0x4
327*4978Sgd78059 #define	MXFE_98725	0x5
328*4978Sgd78059 #define	MXFE_98713	0x6
329*4978Sgd78059 #define	MXFE_98713A	0x7
330*4978Sgd78059 #define	MXFE_PNICII	0x8
331*4978Sgd78059 
332*4978Sgd78059 /*
333*4978Sgd78059  * Register definitions located in mxfe.h exported header file.
334*4978Sgd78059  */
335*4978Sgd78059 
336*4978Sgd78059 /*
337*4978Sgd78059  * Macros to simplify hardware access.  Note that the reg/4 is used to
338*4978Sgd78059  * help with pointer arithmetic.
339*4978Sgd78059  */
340*4978Sgd78059 #define	GETCSR(mxfep, reg)	\
341*4978Sgd78059 	ddi_get32(mxfep->mxfe_regshandle, mxfep->mxfe_regs + (reg/4))
342*4978Sgd78059 
343*4978Sgd78059 #define	PUTCSR(mxfep, reg, val)	\
344*4978Sgd78059 	ddi_put32(mxfep->mxfe_regshandle, mxfep->mxfe_regs + (reg/4), val)
345*4978Sgd78059 
346*4978Sgd78059 #define	SETBIT(mxfep, reg, val)	\
347*4978Sgd78059 	PUTCSR(mxfep, reg, GETCSR(mxfep, reg) | (val))
348*4978Sgd78059 
349*4978Sgd78059 #define	CLRBIT(mxfep, reg, val)	\
350*4978Sgd78059 	PUTCSR(mxfep, reg, GETCSR(mxfep, reg) & ~(val))
351*4978Sgd78059 
352*4978Sgd78059 #define	SYNCTXDESC(mxfep, index, who)	\
353*4978Sgd78059 	(void) ddi_dma_sync(mxfep->mxfe_txdesc_dmah, \
354*4978Sgd78059 	    (index * sizeof (mxfe_desc_t)), sizeof (mxfe_desc_t), who)
355*4978Sgd78059 
356*4978Sgd78059 #define	SYNCTXBUF(txb, len, who)	\
357*4978Sgd78059 	(void) (ddi_dma_sync(txb->txb_dmah, 0, len, who))
358*4978Sgd78059 
359*4978Sgd78059 #define	SYNCRXDESC(mxfep, index, who)	\
360*4978Sgd78059 	(void) ddi_dma_sync(mxfep->mxfe_rxdesc_dmah, \
361*4978Sgd78059 	    (index * sizeof (mxfe_desc_t)), sizeof (mxfe_desc_t), who)
362*4978Sgd78059 
363*4978Sgd78059 #define	SYNCRXBUF(rxb, len, who)	\
364*4978Sgd78059 	(void) (ddi_dma_sync(rxb->rxb_dmah, 0, len, who))
365*4978Sgd78059 
366*4978Sgd78059 /*
367*4978Sgd78059  * Debugging flags.
368*4978Sgd78059  */
369*4978Sgd78059 #define	DWARN	0x0001
370*4978Sgd78059 #define	DINTR	0x0002
371*4978Sgd78059 #define	DWSRV	0x0004
372*4978Sgd78059 #define	DMACID	0x0008
373*4978Sgd78059 #define	DDLPI	0x0010
374*4978Sgd78059 #define	DPHY	0x0020
375*4978Sgd78059 #define	DPCI	0x0040
376*4978Sgd78059 #define	DCHATTY	0x0080
377*4978Sgd78059 #define	DDMA	0x0100
378*4978Sgd78059 #define	DLINK	0x0200
379*4978Sgd78059 #define	DSROM	0x0400
380*4978Sgd78059 #define	DRECV	0x0800
381*4978Sgd78059 #define	DXMIT	0x1000
382*4978Sgd78059 
383*4978Sgd78059 #ifdef	DEBUG
384*4978Sgd78059 #define	DBG(lvl, ...)	mxfe_dprintf(mxfep, __func__, lvl, __VA_ARGS__);
385*4978Sgd78059 #else
386*4978Sgd78059 #define	DBG(lvl, ...)
387*4978Sgd78059 #endif
388*4978Sgd78059 
389*4978Sgd78059 #endif	/* _KERNEL */
390*4978Sgd78059 
391*4978Sgd78059 #endif	/* _MXFEIMPL_H */
392