xref: /onnv-gate/usr/src/uts/common/io/afe/afeimpl.h (revision 6684:743df5702ca3)
14992Sgd78059 /*
24992Sgd78059  * Solaris driver for ethernet cards based on the ADMtek Centaur
34992Sgd78059  *
44992Sgd78059  * Copyright (c) 2007 by Garrett D'Amore <garrett@damore.org>.
54992Sgd78059  * All rights reserved.
64992Sgd78059  *
74992Sgd78059  * Redistribution and use in source and binary forms, with or without
84992Sgd78059  * modification, are permitted provided that the following conditions
94992Sgd78059  * are met:
104992Sgd78059  * 1. Redistributions of source code must retain the above copyright
114992Sgd78059  *    notice, this list of conditions and the following disclaimer.
124992Sgd78059  * 2. Redistributions in binary form must reproduce the above copyright
134992Sgd78059  *    notice, this list of conditions and the following disclaimer in the
144992Sgd78059  *    documentation and/or other materials provided with the distribution.
154992Sgd78059  * 3. Neither the name of the author nor the names of any co-contributors
164992Sgd78059  *    may be used to endorse or promote products derived from this software
174992Sgd78059  *    without specific prior written permission.
184992Sgd78059  *
194992Sgd78059  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS''
204992Sgd78059  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
214992Sgd78059  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
224992Sgd78059  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
234992Sgd78059  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
244992Sgd78059  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
254992Sgd78059  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
264992Sgd78059  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
274992Sgd78059  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
284992Sgd78059  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
294992Sgd78059  * POSSIBILITY OF SUCH DAMAGE.
304992Sgd78059  */
31*6684Sgd78059 /*
32*6684Sgd78059  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
33*6684Sgd78059  * Use is subject to license terms.
34*6684Sgd78059  */
354992Sgd78059 
364992Sgd78059 #ifndef	_AFEIMPL_H
374992Sgd78059 #define	_AFEIMPL_H
384992Sgd78059 
394992Sgd78059 #pragma ident	"%Z%%M%	%I%	%E% SMI"
404992Sgd78059 
414992Sgd78059 #ifdef	_KERNEL
424992Sgd78059 
434992Sgd78059 /*
444992Sgd78059  * Compile time tunables.
454992Sgd78059  */
464992Sgd78059 #define	AFE_RXRING	128	/* number of rcv buffers */
474992Sgd78059 #define	AFE_TXRING	128	/* number of xmt buffers */
484992Sgd78059 #define	AFE_TXRECLAIM	8	/* when to reclaim tx buffers (txavail) */
494992Sgd78059 #define	AFE_TXRESCHED	120	/* when to resched (txavail) */
504992Sgd78059 #define	AFE_LINKTIMER	5000	/* how often we check link state (in msec) */
514992Sgd78059 #define	AFE_HEADROOM	34	/* headroom in packet (should be 2 modulo 4) */
524992Sgd78059 
534992Sgd78059 /*
544992Sgd78059  * Constants, do not change.
554992Sgd78059  */
564992Sgd78059 #define	AFE_BUFSZ	(1664)	/* big enough for a vlan frame */
574992Sgd78059 #define	AFE_MCHASH	(64)
584992Sgd78059 
594992Sgd78059 typedef struct afe afe_t;
604992Sgd78059 typedef struct afe_card afe_card_t;
614992Sgd78059 typedef struct afe_rxbuf afe_rxbuf_t;
624992Sgd78059 typedef struct afe_txbuf afe_txbuf_t;
634992Sgd78059 typedef struct afe_desc afe_desc_t;
644992Sgd78059 
654992Sgd78059 /*
664992Sgd78059  * Card models.
674992Sgd78059  */
684992Sgd78059 typedef enum {
694992Sgd78059 	MODEL_CENTAUR = 1,
704992Sgd78059 	MODEL_COMET,
714992Sgd78059 } afe_model_t;
724992Sgd78059 
734992Sgd78059 struct afe_card {
744992Sgd78059 	uint16_t	card_venid;	/* PCI vendor id */
754992Sgd78059 	uint16_t	card_devid;	/* PCI device id */
764992Sgd78059 	char		*card_cardname;	/* Description of the card */
774992Sgd78059 	afe_model_t	card_model;	/* Card specific flags */
784992Sgd78059 };
794992Sgd78059 
804992Sgd78059 /*
814992Sgd78059  * Device instance structure, one per PCI card.
824992Sgd78059  */
834992Sgd78059 struct afe {
844992Sgd78059 	dev_info_t		*afe_dip;
854992Sgd78059 	mac_handle_t		afe_mh;
864992Sgd78059 	afe_card_t		*afe_cardp;
874992Sgd78059 	uint16_t		afe_cachesize;
884992Sgd78059 	uint8_t			afe_sromwidth;
894992Sgd78059 	int			afe_flags;
904992Sgd78059 	kmutex_t		afe_xmtlock;
914992Sgd78059 	kmutex_t		afe_intrlock;
924992Sgd78059 	ddi_iblock_cookie_t	afe_icookie;
934992Sgd78059 
944992Sgd78059 	/*
954992Sgd78059 	 * Register and DMA access.
964992Sgd78059 	 */
974992Sgd78059 	uintptr_t		afe_regs;
984992Sgd78059 	ddi_acc_handle_t	afe_regshandle;
994992Sgd78059 
1004992Sgd78059 	/*
1014992Sgd78059 	 * Receive descriptors.
1024992Sgd78059 	 */
1034992Sgd78059 	int			afe_rxhead;
1044992Sgd78059 	struct afe_desc		*afe_rxdescp;
1054992Sgd78059 	ddi_dma_handle_t	afe_rxdesc_dmah;
1064992Sgd78059 	ddi_acc_handle_t	afe_rxdesc_acch;
1074992Sgd78059 	uint32_t		afe_rxdesc_paddr;
1084992Sgd78059 	struct afe_rxbuf	**afe_rxbufs;
1094992Sgd78059 
1104992Sgd78059 	/*
1114992Sgd78059 	 * Transmit descriptors.
1124992Sgd78059 	 */
1134992Sgd78059 	int			afe_txreclaim;
1144992Sgd78059 	int			afe_txsend;
1154992Sgd78059 	int			afe_txavail;
1164992Sgd78059 	struct afe_desc		*afe_txdescp;
1174992Sgd78059 	ddi_dma_handle_t	afe_txdesc_dmah;
1184992Sgd78059 	ddi_acc_handle_t	afe_txdesc_acch;
1194992Sgd78059 	uint32_t		afe_txdesc_paddr;
1204992Sgd78059 	struct afe_txbuf	**afe_txbufs;
1214992Sgd78059 	hrtime_t		afe_txstall_time;
1224992Sgd78059 	boolean_t		afe_wantw;
1234992Sgd78059 
1244992Sgd78059 	/*
1254992Sgd78059 	 * Link state.
1264992Sgd78059 	 */
127*6684Sgd78059 	uint64_t		afe_lastifspeed;
128*6684Sgd78059 	link_state_t		afe_linkup;
129*6684Sgd78059 	link_duplex_t		afe_lastduplex;
130*6684Sgd78059 	link_duplex_t		afe_duplex;
131*6684Sgd78059 	uint64_t		afe_ifspeed;
1324992Sgd78059 	boolean_t		afe_resetting;	/* no link warning */
1334992Sgd78059 
1344992Sgd78059 	/*
1354992Sgd78059 	 * Transceiver stuff.
1364992Sgd78059 	 */
1374992Sgd78059 	int			afe_phyaddr;
1384992Sgd78059 	int			afe_phyid;
1394992Sgd78059 	int			afe_phyinuse;
140*6684Sgd78059 
141*6684Sgd78059 	uint8_t			afe_adv_aneg;
142*6684Sgd78059 	uint8_t			afe_adv_100T4;
143*6684Sgd78059 	uint8_t			afe_adv_100fdx;
144*6684Sgd78059 	uint8_t			afe_adv_100hdx;
145*6684Sgd78059 	uint8_t			afe_adv_10fdx;
146*6684Sgd78059 	uint8_t			afe_adv_10hdx;
147*6684Sgd78059 	uint8_t			afe_cap_aneg;
148*6684Sgd78059 	uint8_t			afe_cap_100T4;
149*6684Sgd78059 	uint8_t			afe_cap_100fdx;
150*6684Sgd78059 	uint8_t			afe_cap_100hdx;
151*6684Sgd78059 	uint8_t			afe_cap_10fdx;
152*6684Sgd78059 	uint8_t			afe_cap_10hdx;
153*6684Sgd78059 
1544992Sgd78059 	int			afe_forcefiber;
1554992Sgd78059 
1564992Sgd78059 	/*
1574992Sgd78059 	 * Address management.
1584992Sgd78059 	 */
1594992Sgd78059 	uchar_t			afe_curraddr[ETHERADDRL];
1604992Sgd78059 	boolean_t		afe_promisc;
1614992Sgd78059 	uint16_t		afe_mccount[AFE_MCHASH];
1624992Sgd78059 	uint32_t		afe_mctab[AFE_MCHASH / 32];	/* Centaur */
1634992Sgd78059 
1644992Sgd78059 	/*
1654992Sgd78059 	 * Kstats.
1664992Sgd78059 	 */
1674992Sgd78059 	kstat_t			*afe_intrstat;
1684992Sgd78059 	uint64_t		afe_ipackets;
1694992Sgd78059 	uint64_t		afe_opackets;
1704992Sgd78059 	uint64_t		afe_rbytes;
1714992Sgd78059 	uint64_t		afe_obytes;
1724992Sgd78059 	uint64_t		afe_brdcstxmt;
1734992Sgd78059 	uint64_t		afe_multixmt;
1744992Sgd78059 	uint64_t		afe_brdcstrcv;
1754992Sgd78059 	uint64_t		afe_multircv;
1764992Sgd78059 	unsigned		afe_norcvbuf;
1774992Sgd78059 	unsigned		afe_errrcv;
1784992Sgd78059 	unsigned		afe_errxmt;
1794992Sgd78059 	unsigned		afe_missed;
1804992Sgd78059 	unsigned		afe_underflow;
1814992Sgd78059 	unsigned		afe_overflow;
1824992Sgd78059 	unsigned		afe_align_errors;
1834992Sgd78059 	unsigned		afe_fcs_errors;
1844992Sgd78059 	unsigned		afe_carrier_errors;
1854992Sgd78059 	unsigned		afe_collisions;
1864992Sgd78059 	unsigned		afe_ex_collisions;
1874992Sgd78059 	unsigned		afe_tx_late_collisions;
1884992Sgd78059 	unsigned		afe_defer_xmts;
1894992Sgd78059 	unsigned		afe_first_collisions;
1904992Sgd78059 	unsigned		afe_multi_collisions;
1914992Sgd78059 	unsigned		afe_sqe_errors;
1924992Sgd78059 	unsigned		afe_macxmt_errors;
1934992Sgd78059 	unsigned		afe_macrcv_errors;
1944992Sgd78059 	unsigned		afe_toolong_errors;
1954992Sgd78059 	unsigned		afe_runt;
1964992Sgd78059 	unsigned		afe_jabber;
1974992Sgd78059 };
1984992Sgd78059 
1994992Sgd78059 struct afe_rxbuf {
2004992Sgd78059 	caddr_t			rxb_buf;
2014992Sgd78059 	ddi_dma_handle_t	rxb_dmah;
2024992Sgd78059 	ddi_acc_handle_t	rxb_acch;
2034992Sgd78059 	uint32_t		rxb_paddr;
2044992Sgd78059 };
2054992Sgd78059 
2064992Sgd78059 struct afe_txbuf {
2074992Sgd78059 	caddr_t			txb_buf;
2084992Sgd78059 	uint32_t		txb_paddr;
2094992Sgd78059 	ddi_dma_handle_t	txb_dmah;
2104992Sgd78059 	ddi_acc_handle_t	txb_acch;
2114992Sgd78059 };
2124992Sgd78059 
2134992Sgd78059 /*
2144992Sgd78059  * Descriptor.  We use rings rather than chains.
2154992Sgd78059  */
2164992Sgd78059 struct afe_desc {
2174992Sgd78059 	unsigned	desc_status;
2184992Sgd78059 	unsigned	desc_control;
2194992Sgd78059 	unsigned	desc_buffer1;
2204992Sgd78059 	unsigned	desc_buffer2;
2214992Sgd78059 };
2224992Sgd78059 
2234992Sgd78059 #define	PUTTXDESC(afep, member, val)	\
2244992Sgd78059 	ddi_put32(afep->afe_txdesc_acch, &member, val)
2254992Sgd78059 
2264992Sgd78059 #define	PUTRXDESC(afep, member, val)	\
2274992Sgd78059 	ddi_put32(afep->afe_rxdesc_acch, &member, val)
2284992Sgd78059 
2294992Sgd78059 #define	GETTXDESC(afep, member)	\
2304992Sgd78059 	ddi_get32(afep->afe_txdesc_acch, &member)
2314992Sgd78059 
2324992Sgd78059 #define	GETRXDESC(afep, member)	\
2334992Sgd78059 	ddi_get32(afep->afe_rxdesc_acch, &member)
2344992Sgd78059 
2354992Sgd78059 /*
2364992Sgd78059  * Receive descriptor fields.
2374992Sgd78059  */
2384992Sgd78059 #define	RXSTAT_OWN		0x80000000U	/* ownership */
2394992Sgd78059 #define	RXSTAT_RXLEN		0x3FFF0000U	/* frame length, incl. crc */
2404992Sgd78059 #define	RXSTAT_RXERR		0x00008000U	/* error summary */
2414992Sgd78059 #define	RXSTAT_DESCERR		0x00004000U	/* descriptor error */
2424992Sgd78059 #define	RXSTAT_RXTYPE		0x00003000U	/* data type */
2434992Sgd78059 #define	RXSTAT_RUNT		0x00000800U	/* runt frame */
2444992Sgd78059 #define	RXSTAT_GROUP		0x00000400U	/* multicast/brdcast frame */
2454992Sgd78059 #define	RXSTAT_FIRST		0x00000200U	/* first descriptor */
2464992Sgd78059 #define	RXSTAT_LAST		0x00000100U	/* last descriptor */
2474992Sgd78059 #define	RXSTAT_TOOLONG		0x00000080U	/* frame too long */
2484992Sgd78059 #define	RXSTAT_COLLSEEN		0x00000040U	/* late collision seen */
2494992Sgd78059 #define	RXSTAT_FRTYPE		0x00000020U	/* frame type */
2504992Sgd78059 #define	RXSTAT_WATCHDOG		0x00000010U	/* receive watchdog */
2514992Sgd78059 #define	RXSTAT_DRIBBLE		0x00000004U	/* dribbling bit */
2524992Sgd78059 #define	RXSTAT_CRCERR		0x00000002U	/* crc error */
2534992Sgd78059 #define	RXSTAT_OFLOW		0x00000001U	/* fifo overflow */
2544992Sgd78059 #define	RXSTAT_ERRS		(RXSTAT_DESCERR | RXSTAT_RUNT | \
2554992Sgd78059 				RXSTAT_COLLSEEN | RXSTAT_DRIBBLE | \
2564992Sgd78059 				RXSTAT_CRCERR | RXSTAT_OFLOW)
2574992Sgd78059 #define	RXLENGTH(x)		((x & RXSTAT_RXLEN) >> 16)
2584992Sgd78059 
2594992Sgd78059 #define	RXCTL_ENDRING		0x02000000U	/* end of ring */
2604992Sgd78059 #define	RXCTL_CHAIN		0x01000000U	/* chained descriptors */
2614992Sgd78059 #define	RXCTL_BUFLEN2		0x003FF800U	/* buffer 2 length */
2624992Sgd78059 #define	RXCTL_BUFLEN1		0x000007FFU	/* buffer 1 length */
2634992Sgd78059 
2644992Sgd78059 /*
2654992Sgd78059  * Transmit descriptor fields.
2664992Sgd78059  */
2674992Sgd78059 #define	TXSTAT_OWN		0x80000000U	/* ownership */
2684992Sgd78059 #define	TXSTAT_URCNT		0x00C00000U	/* underrun count */
2694992Sgd78059 #define	TXSTAT_TXERR		0x00008000U	/* error summary */
2704992Sgd78059 #define	TXSTAT_JABBER		0x00004000U	/* jabber timeout */
2714992Sgd78059 #define	TXSTAT_CARRLOST		0x00000800U	/* lost carrier */
2724992Sgd78059 #define	TXSTAT_NOCARR		0x00000400U	/* no carrier */
2734992Sgd78059 #define	TXSTAT_LATECOL		0x00000200U	/* late collision */
2744992Sgd78059 #define	TXSTAT_EXCOLL		0x00000100U	/* excessive collisions */
2754992Sgd78059 #define	TXSTAT_SQE		0x00000080U	/* heartbeat failure */
2764992Sgd78059 #define	TXSTAT_COLLCNT		0x00000078U	/* collision count */
2774992Sgd78059 #define	TXSTAT_UFLOW		0x00000002U	/* underflow */
2784992Sgd78059 #define	TXSTAT_DEFER		0x00000001U	/* deferred */
2794992Sgd78059 #define	TXCOLLCNT(x)		((x & TXSTAT_COLLCNT) >> 3)
2804992Sgd78059 #define	TXUFLOWCNT(x)		((x & TXSTAT_URCNT) >> 22)
2814992Sgd78059 
2824992Sgd78059 #define	TXCTL_INTCMPLTE		0x80000000U	/* interrupt completed */
2834992Sgd78059 #define	TXCTL_LAST		0x40000000U	/* last descriptor */
2844992Sgd78059 #define	TXCTL_FIRST		0x20000000U	/* first descriptor */
2854992Sgd78059 #define	TXCTL_NOCRC		0x04000000U	/* disable crc */
2864992Sgd78059 #define	TXCTL_ENDRING		0x02000000U	/* end of ring */
2874992Sgd78059 #define	TXCTL_CHAIN		0x01000000U	/* chained descriptors */
2884992Sgd78059 #define	TXCTL_NOPAD		0x00800000U	/* disable padding */
2894992Sgd78059 #define	TXCTL_HASHPERF		0x00400000U	/* hash perfect mode */
2904992Sgd78059 #define	TXCTL_BUFLEN2		0x003FF800U	/* buffer length 2 */
2914992Sgd78059 #define	TXCTL_BUFLEN1		0x000007FFU	/* buffer length 1 */
2924992Sgd78059 
2934992Sgd78059 
2944992Sgd78059 /*
2954992Sgd78059  * Interface flags.
2964992Sgd78059  */
2974992Sgd78059 #define	AFE_RUNNING	0x1	/* chip is initialized */
2984992Sgd78059 #define	AFE_SUSPENDED	0x2	/* interface is suspended */
2994992Sgd78059 #define	AFE_HASFIBER	0x4	/* internal phy supports fiber (AFE_PHY_MCR) */
3004992Sgd78059 
3014992Sgd78059 #define	AFE_MODEL(afep)		((afep)->afe_cardp->card_model)
3024992Sgd78059 
3034992Sgd78059 
3044992Sgd78059 /*
3054992Sgd78059  * Register definitions located in afe.h exported header file.
3064992Sgd78059  */
3074992Sgd78059 
3084992Sgd78059 /*
3094992Sgd78059  * Macros to simplify hardware access.
3104992Sgd78059  */
3114992Sgd78059 #define	GETCSR(afep, reg)	\
3124992Sgd78059 	ddi_get32(afep->afe_regshandle, (uint32_t *)(afep->afe_regs + reg))
3134992Sgd78059 
3144992Sgd78059 #define	GETCSR16(afep, reg)	\
3154992Sgd78059 	ddi_get16(afep->afe_regshandle, (uint16_t *)(afep->afe_regs + reg))
3164992Sgd78059 
3174992Sgd78059 #define	PUTCSR(afep, reg, val)	\
3184992Sgd78059 	ddi_put32(afep->afe_regshandle, (uint32_t *)(afep->afe_regs + reg), val)
3194992Sgd78059 
3204992Sgd78059 #define	PUTCSR16(afep, reg, val)	\
3214992Sgd78059 	ddi_put16(afep->afe_regshandle, (uint16_t *)(afep->afe_regs + reg), val)
3224992Sgd78059 
3234992Sgd78059 #define	SETBIT(afep, reg, val)	PUTCSR(afep, reg, GETCSR(afep, reg) | (val))
3244992Sgd78059 
3254992Sgd78059 #define	CLRBIT(afep, reg, val)	PUTCSR(afep, reg, GETCSR(afep, reg) & ~(val))
3264992Sgd78059 
3274992Sgd78059 #define	SYNCTXDESC(afep, index, who)	\
3284992Sgd78059 	(void) ddi_dma_sync(afep->afe_txdesc_dmah, \
3294992Sgd78059 	    (index * sizeof (afe_desc_t)), sizeof (afe_desc_t), who)
3304992Sgd78059 
3314992Sgd78059 #define	SYNCTXBUF(txb, len, who)	\
3324992Sgd78059 	(void) ddi_dma_sync(txb->txb_dmah, 0, len, who)
3334992Sgd78059 
3344992Sgd78059 #define	SYNCRXDESC(afep, index, who)	\
3354992Sgd78059 	(void) ddi_dma_sync(afep->afe_rxdesc_dmah, \
3364992Sgd78059 	    (index * sizeof (afe_desc_t)), sizeof (afe_desc_t), who)
3374992Sgd78059 
3384992Sgd78059 #define	SYNCRXBUF(rxb, len, who)	\
3394992Sgd78059 	(void) ddi_dma_sync(rxb->rxb_dmah, 0, len, who)
3404992Sgd78059 
3414992Sgd78059 /*
3424992Sgd78059  * Debugging flags.
3434992Sgd78059  */
3444992Sgd78059 #define	DWARN	0x0001
3454992Sgd78059 #define	DINTR	0x0002
3464992Sgd78059 #define	DMACID	0x0008
3474992Sgd78059 #define	DPHY	0x0020
3484992Sgd78059 #define	DPCI	0x0040
3494992Sgd78059 #define	DCHATTY	0x0080
3504992Sgd78059 #define	DDMA	0x0100
3514992Sgd78059 #define	DLINK	0x0200
3524992Sgd78059 #define	DSROM	0x0400
3534992Sgd78059 #define	DRECV	0x0800
3544992Sgd78059 #define	DXMIT	0x1000
3554992Sgd78059 
3564992Sgd78059 #ifdef	DEBUG
3574992Sgd78059 #define	DBG(lvl, ...)	afe_dprintf(afep, __func__, lvl, __VA_ARGS__)
3584992Sgd78059 #else
3594992Sgd78059 #define	DBG(lvl, ...)
3604992Sgd78059 #endif
3614992Sgd78059 
3624992Sgd78059 #endif	/* _KERNEL */
3634992Sgd78059 
3644992Sgd78059 #endif	/* _AFEIMPL_H */
365