xref: /titanic_51/usr/src/uts/common/io/mxfe/mxfeimpl.h (revision da14cebe459d3275048785f25bd869cb09b5307f)
129e83d4bSgd78059 /*
229e83d4bSgd78059  * Solaris driver for ethernet cards based on the Macronix 98715
329e83d4bSgd78059  *
429e83d4bSgd78059  * Copyright (c) 2007 by Garrett D'Amore <garrett@damore.org>.
529e83d4bSgd78059  * All rights reserved.
629e83d4bSgd78059  *
729e83d4bSgd78059  * Redistribution and use in source and binary forms, with or without
829e83d4bSgd78059  * modification, are permitted provided that the following conditions
929e83d4bSgd78059  * are met:
1029e83d4bSgd78059  * 1. Redistributions of source code must retain the above copyright
1129e83d4bSgd78059  *    notice, this list of conditions and the following disclaimer.
1229e83d4bSgd78059  * 2. Redistributions in binary form must reproduce the above copyright
1329e83d4bSgd78059  *    notice, this list of conditions and the following disclaimer in the
1429e83d4bSgd78059  *    documentation and/or other materials provided with the distribution.
1529e83d4bSgd78059  * 3. Neither the name of the author nor the names of any co-contributors
1629e83d4bSgd78059  *    may be used to endorse or promote products derived from this software
1729e83d4bSgd78059  *    without specific prior written permission.
1829e83d4bSgd78059  *
1929e83d4bSgd78059  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS''
2029e83d4bSgd78059  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2129e83d4bSgd78059  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2229e83d4bSgd78059  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
2329e83d4bSgd78059  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2429e83d4bSgd78059  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2529e83d4bSgd78059  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2629e83d4bSgd78059  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2729e83d4bSgd78059  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2829e83d4bSgd78059  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2929e83d4bSgd78059  * POSSIBILITY OF SUCH DAMAGE.
3029e83d4bSgd78059  */
3196fb08b9Sgd78059 /*
3296fb08b9Sgd78059  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
3396fb08b9Sgd78059  * Use is subject to license terms.
3496fb08b9Sgd78059  */
3529e83d4bSgd78059 
3629e83d4bSgd78059 #ifndef	_MXFEIMPL_H
3729e83d4bSgd78059 #define	_MXFEIMPL_H
3829e83d4bSgd78059 
3929e83d4bSgd78059 /*
4029e83d4bSgd78059  * This entire file is private to the MXFE driver.
4129e83d4bSgd78059  */
4229e83d4bSgd78059 
4329e83d4bSgd78059 #ifdef	_KERNEL
4429e83d4bSgd78059 
45*da14cebeSEric Cheng #include	<sys/mac_provider.h>
46*da14cebeSEric Cheng 
4729e83d4bSgd78059 /*
4829e83d4bSgd78059  * Compile time tunables.
4929e83d4bSgd78059  */
5029e83d4bSgd78059 #define	MXFE_TXRING	128	/* number of xmt buffers */
5129e83d4bSgd78059 #define	MXFE_RXRING	256	/* number of rcv buffers */
5229e83d4bSgd78059 #define	MXFE_TXRECLAIM	32	/* when to reclaim tx buffers (txavail) */
5329e83d4bSgd78059 #define	MXFE_TXRESCHED	120	/* when to resched (txavail) */
5429e83d4bSgd78059 #define	MXFE_LINKTIMER	5000	/* how often we check link state (msec) */
5529e83d4bSgd78059 #define	MXFE_HEADROOM	34	/* headroom in packet (should be 2 modulo 4) */
5629e83d4bSgd78059 
5729e83d4bSgd78059 /*
5829e83d4bSgd78059  * Constants, do not change.  The bufsize is setup to make sure it comes
5929e83d4bSgd78059  * in at a whole number of cache lines, even for 32-long-word aligned
6029e83d4bSgd78059  * caches.
6129e83d4bSgd78059  */
6229e83d4bSgd78059 #define	MXFE_BUFSZ	(1664)		/* big enough for a vlan frame */
6329e83d4bSgd78059 #define	MXFE_SETUP_LEN	192		/* size of a setup frame */
6429e83d4bSgd78059 
6529e83d4bSgd78059 typedef struct mxfe mxfe_t;
6629e83d4bSgd78059 typedef struct mxfe_card mxfe_card_t;
6729e83d4bSgd78059 typedef struct mxfe_rxbuf mxfe_rxbuf_t;
6829e83d4bSgd78059 typedef struct mxfe_txbuf mxfe_txbuf_t;
6929e83d4bSgd78059 typedef struct mxfe_desc mxfe_desc_t;
7029e83d4bSgd78059 
7129e83d4bSgd78059 struct mxfe_card {
7229e83d4bSgd78059 	uint16_t	card_venid;	/* PCI vendor id */
7329e83d4bSgd78059 	uint16_t	card_devid;	/* PCI device id */
7429e83d4bSgd78059 	uint16_t	card_revid;	/* PCI revision id */
7529e83d4bSgd78059 	uint16_t	card_revmask;
7629e83d4bSgd78059 	char		*card_cardname;	/* Description of the card */
7729e83d4bSgd78059 	unsigned	card_model;	/* Card specific flags */
7829e83d4bSgd78059 };
7929e83d4bSgd78059 
8029e83d4bSgd78059 /*
8129e83d4bSgd78059  * Device instance structure, one per PCI card.
8229e83d4bSgd78059  */
8329e83d4bSgd78059 struct mxfe {
8429e83d4bSgd78059 	dev_info_t		*mxfe_dip;
8529e83d4bSgd78059 	mac_handle_t		mxfe_mh;
8629e83d4bSgd78059 	mxfe_card_t		*mxfe_cardp;
8729e83d4bSgd78059 	ushort_t		mxfe_cachesize;
8829e83d4bSgd78059 	ushort_t		mxfe_sromwidth;
8929e83d4bSgd78059 	int			mxfe_flags;
9029e83d4bSgd78059 	kmutex_t		mxfe_xmtlock;
9129e83d4bSgd78059 	kmutex_t		mxfe_intrlock;
9229e83d4bSgd78059 	ddi_iblock_cookie_t	mxfe_icookie;
9329e83d4bSgd78059 
9429e83d4bSgd78059 	/*
9529e83d4bSgd78059 	 * Register access.
9629e83d4bSgd78059 	 */
9729e83d4bSgd78059 	uint32_t		*mxfe_regs;
9829e83d4bSgd78059 	ddi_acc_handle_t	mxfe_regshandle;
9929e83d4bSgd78059 
10029e83d4bSgd78059 	/*
10129e83d4bSgd78059 	 * Receive descriptors.
10229e83d4bSgd78059 	 */
10329e83d4bSgd78059 	int			mxfe_rxhead;
10429e83d4bSgd78059 	struct mxfe_desc	*mxfe_rxdescp;
10529e83d4bSgd78059 	ddi_dma_handle_t	mxfe_rxdesc_dmah;
10629e83d4bSgd78059 	ddi_acc_handle_t	mxfe_rxdesc_acch;
10729e83d4bSgd78059 	uint32_t		mxfe_rxdesc_paddr;
10829e83d4bSgd78059 	struct mxfe_rxbuf	**mxfe_rxbufs;
10929e83d4bSgd78059 
11029e83d4bSgd78059 	/*
11129e83d4bSgd78059 	 * Transmit descriptors.
11229e83d4bSgd78059 	 */
11329e83d4bSgd78059 	int			mxfe_txreclaim;
11429e83d4bSgd78059 	int			mxfe_txsend;
11529e83d4bSgd78059 	int			mxfe_txavail;
11629e83d4bSgd78059 	struct mxfe_desc	*mxfe_txdescp;
11729e83d4bSgd78059 	ddi_dma_handle_t	mxfe_txdesc_dmah;
11829e83d4bSgd78059 	ddi_acc_handle_t	mxfe_txdesc_acch;
11929e83d4bSgd78059 	uint32_t		mxfe_txdesc_paddr;
12029e83d4bSgd78059 	struct mxfe_txbuf	**mxfe_txbufs;
12129e83d4bSgd78059 	hrtime_t		mxfe_txstall_time;
12229e83d4bSgd78059 	boolean_t		mxfe_wantw;
12329e83d4bSgd78059 
12429e83d4bSgd78059 	/*
12529e83d4bSgd78059 	 * Address management.
12629e83d4bSgd78059 	 */
12729e83d4bSgd78059 	uchar_t			mxfe_curraddr[ETHERADDRL];
12829e83d4bSgd78059 	boolean_t		mxfe_promisc;
12929e83d4bSgd78059 
13029e83d4bSgd78059 	/*
13129e83d4bSgd78059 	 * Link state.
13229e83d4bSgd78059 	 */
13396fb08b9Sgd78059 	int			mxfe_nwaystate;
13496fb08b9Sgd78059 	uint64_t		mxfe_lastifspeed;
13596fb08b9Sgd78059 	link_duplex_t		mxfe_lastduplex;
13696fb08b9Sgd78059 	link_state_t		mxfe_lastlinkup;
13796fb08b9Sgd78059 	link_state_t		mxfe_linkup;
13896fb08b9Sgd78059 	link_duplex_t		mxfe_duplex;
13996fb08b9Sgd78059 	uint64_t		mxfe_ifspeed;
14029e83d4bSgd78059 	boolean_t		mxfe_resetting;	/* no link warning */
14129e83d4bSgd78059 
14229e83d4bSgd78059 	/*
14329e83d4bSgd78059 	 * Transceiver stuff.
14429e83d4bSgd78059 	 */
14529e83d4bSgd78059 	int			mxfe_phyaddr;
14629e83d4bSgd78059 	int			mxfe_phyid;
14729e83d4bSgd78059 	int			mxfe_phyinuse;
14896fb08b9Sgd78059 	uint8_t			mxfe_adv_aneg;
14996fb08b9Sgd78059 	uint8_t			mxfe_adv_100T4;
15096fb08b9Sgd78059 	uint8_t			mxfe_adv_100fdx;
15196fb08b9Sgd78059 	uint8_t			mxfe_adv_100hdx;
15296fb08b9Sgd78059 	uint8_t			mxfe_adv_10fdx;
15396fb08b9Sgd78059 	uint8_t			mxfe_adv_10hdx;
15496fb08b9Sgd78059 	uint8_t			mxfe_cap_aneg;
15596fb08b9Sgd78059 	uint8_t			mxfe_cap_100T4;
15696fb08b9Sgd78059 	uint8_t			mxfe_cap_100fdx;
15796fb08b9Sgd78059 	uint8_t			mxfe_cap_100hdx;
15896fb08b9Sgd78059 	uint8_t			mxfe_cap_10fdx;
15996fb08b9Sgd78059 	uint8_t			mxfe_cap_10hdx;
16029e83d4bSgd78059 	int			mxfe_forcephy;
16196fb08b9Sgd78059 	uint16_t		mxfe_bmsr;
16296fb08b9Sgd78059 	uint16_t		mxfe_anlpar;
16396fb08b9Sgd78059 	uint16_t		mxfe_aner;
16429e83d4bSgd78059 
16529e83d4bSgd78059 	/*
16629e83d4bSgd78059 	 * Kstats.
16729e83d4bSgd78059 	 */
16829e83d4bSgd78059 	kstat_t			*mxfe_intrstat;
16929e83d4bSgd78059 	uint64_t		mxfe_ipackets;
17029e83d4bSgd78059 	uint64_t		mxfe_opackets;
17129e83d4bSgd78059 	uint64_t		mxfe_rbytes;
17229e83d4bSgd78059 	uint64_t		mxfe_obytes;
17329e83d4bSgd78059 	uint64_t		mxfe_brdcstrcv;
17429e83d4bSgd78059 	uint64_t		mxfe_multircv;
17529e83d4bSgd78059 	uint64_t		mxfe_brdcstxmt;
17629e83d4bSgd78059 	uint64_t		mxfe_multixmt;
17729e83d4bSgd78059 
17829e83d4bSgd78059 	unsigned		mxfe_norcvbuf;
17929e83d4bSgd78059 	unsigned		mxfe_noxmtbuf;
18029e83d4bSgd78059 	unsigned		mxfe_errrcv;
18129e83d4bSgd78059 	unsigned		mxfe_errxmt;
18229e83d4bSgd78059 	unsigned		mxfe_missed;
18329e83d4bSgd78059 	unsigned		mxfe_underflow;
18429e83d4bSgd78059 	unsigned		mxfe_overflow;
18529e83d4bSgd78059 	unsigned		mxfe_align_errors;
18629e83d4bSgd78059 	unsigned		mxfe_fcs_errors;
18729e83d4bSgd78059 	unsigned		mxfe_carrier_errors;
18829e83d4bSgd78059 	unsigned		mxfe_collisions;
18929e83d4bSgd78059 	unsigned		mxfe_ex_collisions;
19029e83d4bSgd78059 	unsigned		mxfe_tx_late_collisions;
19129e83d4bSgd78059 	unsigned		mxfe_defer_xmts;
19229e83d4bSgd78059 	unsigned		mxfe_first_collisions;
19329e83d4bSgd78059 	unsigned		mxfe_multi_collisions;
19429e83d4bSgd78059 	unsigned		mxfe_sqe_errors;
19529e83d4bSgd78059 	unsigned		mxfe_macxmt_errors;
19629e83d4bSgd78059 	unsigned		mxfe_macrcv_errors;
19729e83d4bSgd78059 	unsigned		mxfe_toolong_errors;
19829e83d4bSgd78059 	unsigned		mxfe_runt;
19929e83d4bSgd78059 	unsigned		mxfe_jabber;
20029e83d4bSgd78059 };
20129e83d4bSgd78059 
20229e83d4bSgd78059 struct mxfe_rxbuf {
20329e83d4bSgd78059 	caddr_t			rxb_buf;
20429e83d4bSgd78059 	ddi_dma_handle_t	rxb_dmah;
20529e83d4bSgd78059 	ddi_acc_handle_t	rxb_acch;
20629e83d4bSgd78059 	uint32_t		rxb_paddr;
20729e83d4bSgd78059 };
20829e83d4bSgd78059 
20929e83d4bSgd78059 struct mxfe_txbuf {
21029e83d4bSgd78059 	/* bcopy version of tx */
21129e83d4bSgd78059 	caddr_t			txb_buf;
21229e83d4bSgd78059 	uint32_t		txb_paddr;
21329e83d4bSgd78059 	ddi_dma_handle_t	txb_dmah;
21429e83d4bSgd78059 	ddi_acc_handle_t	txb_acch;
21529e83d4bSgd78059 };
21629e83d4bSgd78059 
21729e83d4bSgd78059 /*
21829e83d4bSgd78059  * Descriptor.  We use rings rather than chains.
21929e83d4bSgd78059  */
22029e83d4bSgd78059 struct mxfe_desc {
22129e83d4bSgd78059 	unsigned	desc_status;
22229e83d4bSgd78059 	unsigned	desc_control;
22329e83d4bSgd78059 	unsigned	desc_buffer1;
22429e83d4bSgd78059 	unsigned	desc_buffer2;
22529e83d4bSgd78059 };
22629e83d4bSgd78059 
22729e83d4bSgd78059 #define	PUTTXDESC(mxfep, member, val)	\
22829e83d4bSgd78059 	ddi_put32(mxfep->mxfe_txdesc_acch, &member, val)
22929e83d4bSgd78059 
23029e83d4bSgd78059 #define	PUTRXDESC(mxfep, member, val)	\
23129e83d4bSgd78059 	ddi_put32(mxfep->mxfe_rxdesc_acch, &member, val)
23229e83d4bSgd78059 
23329e83d4bSgd78059 #define	GETTXDESC(mxfep, member)	\
23429e83d4bSgd78059 	ddi_get32(mxfep->mxfe_txdesc_acch, &member)
23529e83d4bSgd78059 
23629e83d4bSgd78059 #define	GETRXDESC(mxfep, member)	\
23729e83d4bSgd78059 	ddi_get32(mxfep->mxfe_rxdesc_acch, &member)
23829e83d4bSgd78059 
23929e83d4bSgd78059 /*
24029e83d4bSgd78059  * Receive descriptor fields.
24129e83d4bSgd78059  */
24229e83d4bSgd78059 #define	RXSTAT_OWN		0x80000000U	/* ownership */
24329e83d4bSgd78059 #define	RXSTAT_RXLEN		0x3FFF0000U	/* frame length, incl. crc */
24429e83d4bSgd78059 #define	RXSTAT_RXERR		0x00008000U	/* error summary */
24529e83d4bSgd78059 #define	RXSTAT_DESCERR		0x00004000U	/* descriptor error */
24629e83d4bSgd78059 #define	RXSTAT_RXTYPE		0x00003000U	/* data type */
24729e83d4bSgd78059 #define	RXSTAT_RUNT		0x00000800U	/* runt frame */
24829e83d4bSgd78059 #define	RXSTAT_GROUP		0x00000400U	/* multicast/brdcast frame */
24929e83d4bSgd78059 #define	RXSTAT_FIRST		0x00000200U	/* first descriptor */
25029e83d4bSgd78059 #define	RXSTAT_LAST		0x00000100U	/* last descriptor */
25129e83d4bSgd78059 #define	RXSTAT_TOOLONG		0x00000080U	/* frame too long */
25229e83d4bSgd78059 #define	RXSTAT_COLLSEEN		0x00000040U	/* late collision seen */
25329e83d4bSgd78059 #define	RXSTAT_FRTYPE		0x00000020U	/* frame type */
25429e83d4bSgd78059 #define	RXSTAT_WATCHDOG		0x00000010U	/* receive watchdog */
25529e83d4bSgd78059 #define	RXSTAT_DRIBBLE		0x00000004U	/* dribbling bit */
25629e83d4bSgd78059 #define	RXSTAT_CRCERR		0x00000002U	/* crc error */
25729e83d4bSgd78059 #define	RXSTAT_OFLOW		0x00000001U	/* fifo overflow */
25829e83d4bSgd78059 #define	RXSTAT_ERRS		(RXSTAT_DESCERR | RXSTAT_RUNT | \
25929e83d4bSgd78059 				RXSTAT_COLLSEEN | RXSTAT_DRIBBLE | \
26029e83d4bSgd78059 				RXSTAT_CRCERR | RXSTAT_OFLOW)
26129e83d4bSgd78059 #define	RXLENGTH(x)		((x & RXSTAT_RXLEN) >> 16)
26229e83d4bSgd78059 
26329e83d4bSgd78059 #define	RXCTL_ENDRING		0x02000000U	/* end of ring */
26429e83d4bSgd78059 #define	RXCTL_CHAIN		0x01000000U	/* chained descriptors */
26529e83d4bSgd78059 #define	RXCTL_BUFLEN2		0x003FF800U	/* buffer 2 length */
26629e83d4bSgd78059 #define	RXCTL_BUFLEN1		0x000007FFU	/* buffer 1 length */
26729e83d4bSgd78059 
26829e83d4bSgd78059 /*
26929e83d4bSgd78059  * Transmit descriptor fields.
27029e83d4bSgd78059  */
27129e83d4bSgd78059 #define	TXSTAT_OWN		0x80000000U	/* ownership */
27229e83d4bSgd78059 #define	TXSTAT_URCNT		0x00C00000U	/* underrun count */
27329e83d4bSgd78059 #define	TXSTAT_TXERR		0x00008000U	/* error summary */
27429e83d4bSgd78059 #define	TXSTAT_JABBER		0x00004000U	/* jabber timeout */
27529e83d4bSgd78059 #define	TXSTAT_CARRLOST		0x00000800U	/* lost carrier */
27629e83d4bSgd78059 #define	TXSTAT_NOCARR		0x00000400U	/* no carrier */
27729e83d4bSgd78059 #define	TXSTAT_LATECOL		0x00000200U	/* late collision */
27829e83d4bSgd78059 #define	TXSTAT_EXCOLL		0x00000100U	/* excessive collisions */
27929e83d4bSgd78059 #define	TXSTAT_SQE		0x00000080U	/* heartbeat failure */
28029e83d4bSgd78059 #define	TXSTAT_COLLCNT		0x00000078U	/* collision count */
28129e83d4bSgd78059 #define	TXSTAT_UFLOW		0x00000002U	/* underflow */
28229e83d4bSgd78059 #define	TXSTAT_DEFER		0x00000001U	/* deferred */
28329e83d4bSgd78059 #define	TXCOLLCNT(x)		((x & TXSTAT_COLLCNT) >> 3)
28429e83d4bSgd78059 #define	TXUFLOWCNT(x)		((x & TXSTAT_URCNT) >> 22)
28529e83d4bSgd78059 
28629e83d4bSgd78059 #define	TXCTL_INTCMPLTE		0x80000000U	/* interrupt completed */
28729e83d4bSgd78059 #define	TXCTL_LAST		0x40000000U	/* last descriptor */
28829e83d4bSgd78059 #define	TXCTL_FIRST		0x20000000U	/* first descriptor */
28929e83d4bSgd78059 #define	TXCTL_NOCRC		0x04000000U	/* disable crc */
29029e83d4bSgd78059 #define	TXCTL_SETUP		0x08000000U	/* setup frame */
29129e83d4bSgd78059 #define	TXCTL_ENDRING		0x02000000U	/* end of ring */
29229e83d4bSgd78059 #define	TXCTL_CHAIN		0x01000000U	/* chained descriptors */
29329e83d4bSgd78059 #define	TXCTL_NOPAD		0x00800000U	/* disable padding */
29429e83d4bSgd78059 #define	TXCTL_HASHPERF		0x00400000U	/* hash perfect mode */
29529e83d4bSgd78059 #define	TXCTL_BUFLEN2		0x003FF800U	/* buffer length 2 */
29629e83d4bSgd78059 #define	TXCTL_BUFLEN1		0x000007FFU	/* buffer length 1 */
29729e83d4bSgd78059 
29829e83d4bSgd78059 /*
29929e83d4bSgd78059  * Interface flags.
30029e83d4bSgd78059  */
30129e83d4bSgd78059 #define	MXFE_RUNNING	0x1	/* chip is initialized */
30229e83d4bSgd78059 #define	MXFE_SUSPENDED	0x2	/* interface is suspended */
30329e83d4bSgd78059 #define	MXFE_SYMBOL	0x8	/* use symbol mode */
30429e83d4bSgd78059 
30529e83d4bSgd78059 /*
30629e83d4bSgd78059  * Link flags...
30729e83d4bSgd78059  */
30829e83d4bSgd78059 #define	MXFE_NOLINK	0x0	/* initial link state, no timer */
30929e83d4bSgd78059 #define	MXFE_NWAYCHECK	0x2	/* checking for NWay support */
31029e83d4bSgd78059 #define	MXFE_NWAYRENEG	0x3	/* renegotiating NWay mode */
31129e83d4bSgd78059 #define	MXFE_GOODLINK	0x4	/* detected link is good */
31229e83d4bSgd78059 
31329e83d4bSgd78059 /*
31429e83d4bSgd78059  * Card models.
31529e83d4bSgd78059  */
31629e83d4bSgd78059 #define	MXFE_MODEL(mxfep)	((mxfep)->mxfe_cardp->card_model)
31729e83d4bSgd78059 #define	MXFE_98715	0x1
31829e83d4bSgd78059 #define	MXFE_98715A	0x2
31929e83d4bSgd78059 #define	MXFE_98715AEC	0x3
32029e83d4bSgd78059 #define	MXFE_98715B	0x4
32129e83d4bSgd78059 #define	MXFE_98725	0x5
32229e83d4bSgd78059 #define	MXFE_98713	0x6
32329e83d4bSgd78059 #define	MXFE_98713A	0x7
32429e83d4bSgd78059 #define	MXFE_PNICII	0x8
32529e83d4bSgd78059 
32629e83d4bSgd78059 /*
32729e83d4bSgd78059  * Register definitions located in mxfe.h exported header file.
32829e83d4bSgd78059  */
32929e83d4bSgd78059 
33029e83d4bSgd78059 /*
33129e83d4bSgd78059  * Macros to simplify hardware access.  Note that the reg/4 is used to
33229e83d4bSgd78059  * help with pointer arithmetic.
33329e83d4bSgd78059  */
33429e83d4bSgd78059 #define	GETCSR(mxfep, reg)	\
33529e83d4bSgd78059 	ddi_get32(mxfep->mxfe_regshandle, mxfep->mxfe_regs + (reg/4))
33629e83d4bSgd78059 
33729e83d4bSgd78059 #define	PUTCSR(mxfep, reg, val)	\
33829e83d4bSgd78059 	ddi_put32(mxfep->mxfe_regshandle, mxfep->mxfe_regs + (reg/4), val)
33929e83d4bSgd78059 
34029e83d4bSgd78059 #define	SETBIT(mxfep, reg, val)	\
34129e83d4bSgd78059 	PUTCSR(mxfep, reg, GETCSR(mxfep, reg) | (val))
34229e83d4bSgd78059 
34329e83d4bSgd78059 #define	CLRBIT(mxfep, reg, val)	\
34429e83d4bSgd78059 	PUTCSR(mxfep, reg, GETCSR(mxfep, reg) & ~(val))
34529e83d4bSgd78059 
34629e83d4bSgd78059 #define	SYNCTXDESC(mxfep, index, who)	\
34729e83d4bSgd78059 	(void) ddi_dma_sync(mxfep->mxfe_txdesc_dmah, \
34829e83d4bSgd78059 	    (index * sizeof (mxfe_desc_t)), sizeof (mxfe_desc_t), who)
34929e83d4bSgd78059 
35029e83d4bSgd78059 #define	SYNCTXBUF(txb, len, who)	\
35129e83d4bSgd78059 	(void) (ddi_dma_sync(txb->txb_dmah, 0, len, who))
35229e83d4bSgd78059 
35329e83d4bSgd78059 #define	SYNCRXDESC(mxfep, index, who)	\
35429e83d4bSgd78059 	(void) ddi_dma_sync(mxfep->mxfe_rxdesc_dmah, \
35529e83d4bSgd78059 	    (index * sizeof (mxfe_desc_t)), sizeof (mxfe_desc_t), who)
35629e83d4bSgd78059 
35729e83d4bSgd78059 #define	SYNCRXBUF(rxb, len, who)	\
35829e83d4bSgd78059 	(void) (ddi_dma_sync(rxb->rxb_dmah, 0, len, who))
35929e83d4bSgd78059 
36029e83d4bSgd78059 /*
36129e83d4bSgd78059  * Debugging flags.
36229e83d4bSgd78059  */
36329e83d4bSgd78059 #define	DWARN	0x0001
36429e83d4bSgd78059 #define	DINTR	0x0002
36529e83d4bSgd78059 #define	DWSRV	0x0004
36629e83d4bSgd78059 #define	DMACID	0x0008
36729e83d4bSgd78059 #define	DDLPI	0x0010
36829e83d4bSgd78059 #define	DPHY	0x0020
36929e83d4bSgd78059 #define	DPCI	0x0040
37029e83d4bSgd78059 #define	DCHATTY	0x0080
37129e83d4bSgd78059 #define	DDMA	0x0100
37229e83d4bSgd78059 #define	DLINK	0x0200
37329e83d4bSgd78059 #define	DSROM	0x0400
37429e83d4bSgd78059 #define	DRECV	0x0800
37529e83d4bSgd78059 #define	DXMIT	0x1000
37629e83d4bSgd78059 
37729e83d4bSgd78059 #ifdef	DEBUG
37829e83d4bSgd78059 #define	DBG(lvl, ...)	mxfe_dprintf(mxfep, __func__, lvl, __VA_ARGS__);
37929e83d4bSgd78059 #else
38029e83d4bSgd78059 #define	DBG(lvl, ...)
38129e83d4bSgd78059 #endif
38229e83d4bSgd78059 
38329e83d4bSgd78059 #endif	/* _KERNEL */
38429e83d4bSgd78059 
38529e83d4bSgd78059 #endif	/* _MXFEIMPL_H */
386