xref: /onnv-gate/usr/src/uts/common/io/atge/atge.h (revision 11878:ac93462db6d7)
110393SSaurabh.Mishra@Sun.COM /*
210393SSaurabh.Mishra@Sun.COM  * CDDL HEADER START
310393SSaurabh.Mishra@Sun.COM  *
410393SSaurabh.Mishra@Sun.COM  * The contents of this file are subject to the terms of the
510393SSaurabh.Mishra@Sun.COM  * Common Development and Distribution License (the "License").
610393SSaurabh.Mishra@Sun.COM  * You may not use this file except in compliance with the License.
710393SSaurabh.Mishra@Sun.COM  *
810393SSaurabh.Mishra@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
910393SSaurabh.Mishra@Sun.COM  * or http://www.opensolaris.org/os/licensing.
1010393SSaurabh.Mishra@Sun.COM  * See the License for the specific language governing permissions
1110393SSaurabh.Mishra@Sun.COM  * and limitations under the License.
1210393SSaurabh.Mishra@Sun.COM  *
1310393SSaurabh.Mishra@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
1410393SSaurabh.Mishra@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1510393SSaurabh.Mishra@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
1610393SSaurabh.Mishra@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
1710393SSaurabh.Mishra@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
1810393SSaurabh.Mishra@Sun.COM  *
1910393SSaurabh.Mishra@Sun.COM  * CDDL HEADER END
2010393SSaurabh.Mishra@Sun.COM  */
2110393SSaurabh.Mishra@Sun.COM /*
22*11878SVenu.Iyer@Sun.COM  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
2310393SSaurabh.Mishra@Sun.COM  * Use is subject to license terms.
2410393SSaurabh.Mishra@Sun.COM  */
2510393SSaurabh.Mishra@Sun.COM 
2610393SSaurabh.Mishra@Sun.COM #ifndef _ATGE_H
2710393SSaurabh.Mishra@Sun.COM #define	_ATGE_H
2810393SSaurabh.Mishra@Sun.COM 
2910393SSaurabh.Mishra@Sun.COM #ifdef __cplusplus
3010393SSaurabh.Mishra@Sun.COM 	extern "C" {
3110393SSaurabh.Mishra@Sun.COM #endif
3210393SSaurabh.Mishra@Sun.COM 
33*11878SVenu.Iyer@Sun.COM #include <sys/ethernet.h>
3410393SSaurabh.Mishra@Sun.COM #include <sys/mac_provider.h>
3510393SSaurabh.Mishra@Sun.COM #include "atge_l1e_reg.h"
3610393SSaurabh.Mishra@Sun.COM 
3710393SSaurabh.Mishra@Sun.COM #define	ATGE_PCI_REG_NUMBER	1
3810393SSaurabh.Mishra@Sun.COM 
3910393SSaurabh.Mishra@Sun.COM #define	ROUNDUP(x, a)		(((x) + (a) - 1) & ~((a) - 1))
4010393SSaurabh.Mishra@Sun.COM 
4110393SSaurabh.Mishra@Sun.COM /*
4210393SSaurabh.Mishra@Sun.COM  * Flags.
4310393SSaurabh.Mishra@Sun.COM  */
4410393SSaurabh.Mishra@Sun.COM #define	ATGE_FLAG_PCIE		0x0001
4510393SSaurabh.Mishra@Sun.COM #define	ATGE_FIXED_TYPE		0x0002
4610393SSaurabh.Mishra@Sun.COM #define	ATGE_MSI_TYPE		0x0004
4710393SSaurabh.Mishra@Sun.COM #define	ATGE_MSIX_TYPE		0x0008
4810393SSaurabh.Mishra@Sun.COM #define	ATGE_FLAG_FASTETHER	0x0010
4910393SSaurabh.Mishra@Sun.COM #define	ATGE_FLAG_JUMBO		0x0020
5011353SSaurabh.Mishra@Sun.COM #define	ATGE_MII_CHECK		0x0040
5110393SSaurabh.Mishra@Sun.COM 
5210393SSaurabh.Mishra@Sun.COM #define	ATGE_CHIP_L1_DEV_ID	0x1048
5310393SSaurabh.Mishra@Sun.COM #define	ATGE_CHIP_L2_DEV_ID	0x2048
5410393SSaurabh.Mishra@Sun.COM #define	ATGE_CHIP_L1E_DEV_ID	0x1026
5510393SSaurabh.Mishra@Sun.COM 
5610393SSaurabh.Mishra@Sun.COM #define	ATGE_PROMISC		0x001
5710393SSaurabh.Mishra@Sun.COM #define	ATGE_ALL_MULTICST	0x002
5810393SSaurabh.Mishra@Sun.COM 
5910393SSaurabh.Mishra@Sun.COM /*
6010393SSaurabh.Mishra@Sun.COM  * Timer for one second interval.
6110393SSaurabh.Mishra@Sun.COM  */
6210393SSaurabh.Mishra@Sun.COM #define	ATGE_TIMER_INTERVAL	(1000 * 1000 * 1000)
6310393SSaurabh.Mishra@Sun.COM 
6410393SSaurabh.Mishra@Sun.COM /*
6510393SSaurabh.Mishra@Sun.COM  * Chip state.
6610393SSaurabh.Mishra@Sun.COM  */
6710393SSaurabh.Mishra@Sun.COM #define	ATGE_CHIP_INITIALIZED	0x0001
6810393SSaurabh.Mishra@Sun.COM #define	ATGE_CHIP_RUNNING	0x0002
6910393SSaurabh.Mishra@Sun.COM #define	ATGE_CHIP_STOPPED	0x0004
7010393SSaurabh.Mishra@Sun.COM #define	ATGE_CHIP_SUSPENDED	0x0008
7110393SSaurabh.Mishra@Sun.COM 
7210393SSaurabh.Mishra@Sun.COM #define	ETHER_CRC_LEN		0x4
7310393SSaurabh.Mishra@Sun.COM 
7410393SSaurabh.Mishra@Sun.COM /*
7510393SSaurabh.Mishra@Sun.COM  * Descriptor increment and decrment operation.
7610393SSaurabh.Mishra@Sun.COM  */
7711353SSaurabh.Mishra@Sun.COM #define	ATGE_INC_SLOT(x, y)	\
7811353SSaurabh.Mishra@Sun.COM 	((x) = ((x) + 1) % (y))
7911353SSaurabh.Mishra@Sun.COM 
8011353SSaurabh.Mishra@Sun.COM #define	ATGE_DEC_SLOT(x, y)	\
8111353SSaurabh.Mishra@Sun.COM 	(x = ((x + y - 1) % y))
8210393SSaurabh.Mishra@Sun.COM 
8310393SSaurabh.Mishra@Sun.COM /*
8410393SSaurabh.Mishra@Sun.COM  * I/O instructions
8510393SSaurabh.Mishra@Sun.COM  */
8610393SSaurabh.Mishra@Sun.COM #define	OUTB(atge, p, v)  \
8710393SSaurabh.Mishra@Sun.COM 	ddi_put8((atge)->atge_io_handle, \
8810393SSaurabh.Mishra@Sun.COM 		(void *)((caddr_t)((atge)->atge_io_regs) + (p)), v)
8910393SSaurabh.Mishra@Sun.COM 
9010393SSaurabh.Mishra@Sun.COM #define	OUTW(atge, p, v)  \
9110393SSaurabh.Mishra@Sun.COM 	ddi_put16((atge)->atge_io_handle, \
9210393SSaurabh.Mishra@Sun.COM 		(void *)((caddr_t)((atge)->atge_io_regs) + (p)), v)
9310393SSaurabh.Mishra@Sun.COM 
9410393SSaurabh.Mishra@Sun.COM #define	OUTL(atge, p, v)  \
9510393SSaurabh.Mishra@Sun.COM 	ddi_put32((atge)->atge_io_handle, \
9610393SSaurabh.Mishra@Sun.COM 		(void *)((caddr_t)((atge)->atge_io_regs) + (p)), v)
9710393SSaurabh.Mishra@Sun.COM 
9810393SSaurabh.Mishra@Sun.COM #define	INB(atge, p)      \
9910393SSaurabh.Mishra@Sun.COM 	ddi_get8((atge)->atge_io_handle, \
10010393SSaurabh.Mishra@Sun.COM 		(void *)(((caddr_t)(atge)->atge_io_regs) + (p)))
10110393SSaurabh.Mishra@Sun.COM #define	INW(atge, p)      \
10210393SSaurabh.Mishra@Sun.COM 	ddi_get16((atge)->atge_io_handle, \
10310393SSaurabh.Mishra@Sun.COM 		(void *)(((caddr_t)(atge)->atge_io_regs) + (p)))
10410393SSaurabh.Mishra@Sun.COM 
10510393SSaurabh.Mishra@Sun.COM #define	INL(atge, p)      \
10610393SSaurabh.Mishra@Sun.COM 	ddi_get32((atge)->atge_io_handle, \
10710393SSaurabh.Mishra@Sun.COM 		(void *)(((caddr_t)(atge)->atge_io_regs) + (p)))
10810393SSaurabh.Mishra@Sun.COM 
10910393SSaurabh.Mishra@Sun.COM #define	FLUSH(atge, reg) \
11010393SSaurabh.Mishra@Sun.COM 	(void) INL(atge, reg)
11110393SSaurabh.Mishra@Sun.COM 
11210393SSaurabh.Mishra@Sun.COM #define	OUTL_OR(atge, reg, v) \
11310393SSaurabh.Mishra@Sun.COM 	OUTL(atge, reg, (INL(atge, reg) | v))
11410393SSaurabh.Mishra@Sun.COM 
11510393SSaurabh.Mishra@Sun.COM #define	OUTL_AND(atge, reg, v) \
11610393SSaurabh.Mishra@Sun.COM 	OUTL(atge, reg, (INL(atge, reg) & v))
11710393SSaurabh.Mishra@Sun.COM 
11810393SSaurabh.Mishra@Sun.COM /*
11910393SSaurabh.Mishra@Sun.COM  * Descriptor and other endianess aware access.
12010393SSaurabh.Mishra@Sun.COM  */
12110393SSaurabh.Mishra@Sun.COM #define	ATGE_PUT64(dma, addr, v) \
12210393SSaurabh.Mishra@Sun.COM 	ddi_put64(dma->acchdl, (addr), (v))
12310393SSaurabh.Mishra@Sun.COM 
12410393SSaurabh.Mishra@Sun.COM #define	ATGE_PUT32(dma, addr, v) \
12510393SSaurabh.Mishra@Sun.COM 	ddi_put32(dma->acchdl, (addr), (v))
12610393SSaurabh.Mishra@Sun.COM 
12710393SSaurabh.Mishra@Sun.COM #define	ATGE_GET32(dma, addr) \
12810393SSaurabh.Mishra@Sun.COM 	ddi_get32(dma->acchdl, (addr))
12910393SSaurabh.Mishra@Sun.COM 
13010393SSaurabh.Mishra@Sun.COM #define	ATGE_GET64(dma, addr) \
13110393SSaurabh.Mishra@Sun.COM 	ddi_get64(dma->acchdl, (addr))
13210393SSaurabh.Mishra@Sun.COM 
13310393SSaurabh.Mishra@Sun.COM #define	DMA_SYNC(dma, s, l, d)	\
13410393SSaurabh.Mishra@Sun.COM 	(void) ddi_dma_sync(dma->hdl, (off_t)(s), (l), d)
13510393SSaurabh.Mishra@Sun.COM 
13610393SSaurabh.Mishra@Sun.COM 
13710393SSaurabh.Mishra@Sun.COM #define	ATGE_ADDR_LO(x)		((uint64_t)(x) & 0xFFFFFFFF)
13810393SSaurabh.Mishra@Sun.COM #define	ATGE_ADDR_HI(x)		((uint64_t)(x) >> 32)
13910393SSaurabh.Mishra@Sun.COM 
14010393SSaurabh.Mishra@Sun.COM 
14110393SSaurabh.Mishra@Sun.COM /*
14210393SSaurabh.Mishra@Sun.COM  * General purpose macros.
14310393SSaurabh.Mishra@Sun.COM  */
14410393SSaurabh.Mishra@Sun.COM #define	ATGE_MODEL(atgep)	atgep->atge_model
14510393SSaurabh.Mishra@Sun.COM 
14610393SSaurabh.Mishra@Sun.COM /*
14710393SSaurabh.Mishra@Sun.COM  * Different type of chip models.
14810393SSaurabh.Mishra@Sun.COM  */
14910393SSaurabh.Mishra@Sun.COM typedef	enum {
15010393SSaurabh.Mishra@Sun.COM 	ATGE_CHIP_L1 = 1,
15110393SSaurabh.Mishra@Sun.COM 	ATGE_CHIP_L2,
15210393SSaurabh.Mishra@Sun.COM 	ATGE_CHIP_L1E,
15310393SSaurabh.Mishra@Sun.COM } atge_model_t;
15410393SSaurabh.Mishra@Sun.COM 
15510393SSaurabh.Mishra@Sun.COM typedef	struct	atge_cards {
15610393SSaurabh.Mishra@Sun.COM 	uint16_t	vendor_id;	/* PCI vendor id */
15710393SSaurabh.Mishra@Sun.COM 	uint16_t	device_id;	/* PCI device id */
15810393SSaurabh.Mishra@Sun.COM 	char		*cardname;	/* Description of the card */
15910393SSaurabh.Mishra@Sun.COM 	atge_model_t	model;		/* Model of the card */
16010393SSaurabh.Mishra@Sun.COM } atge_cards_t;
16110393SSaurabh.Mishra@Sun.COM 
16210393SSaurabh.Mishra@Sun.COM /*
16310393SSaurabh.Mishra@Sun.COM  * Number of Descriptors for TX and RX Ring.
16410393SSaurabh.Mishra@Sun.COM  */
16510393SSaurabh.Mishra@Sun.COM #define	ATGE_TX_NUM_DESC	256
16610393SSaurabh.Mishra@Sun.COM #define	ATGE_RX_NUM_DESC	256
16710393SSaurabh.Mishra@Sun.COM 
16810393SSaurabh.Mishra@Sun.COM /*
16910393SSaurabh.Mishra@Sun.COM  * DMA Handle for all DMA work.
17010393SSaurabh.Mishra@Sun.COM  */
17110393SSaurabh.Mishra@Sun.COM typedef	struct	atge_dma_data {
17210393SSaurabh.Mishra@Sun.COM 	ddi_dma_handle_t	hdl;
17310393SSaurabh.Mishra@Sun.COM 	ddi_acc_handle_t	acchdl;
17410393SSaurabh.Mishra@Sun.COM 	ddi_dma_cookie_t	cookie;
17510393SSaurabh.Mishra@Sun.COM 	caddr_t			addr;
17610393SSaurabh.Mishra@Sun.COM 	size_t			len;
17710393SSaurabh.Mishra@Sun.COM 	uint_t			count;
17810393SSaurabh.Mishra@Sun.COM } atge_dma_t;
17910393SSaurabh.Mishra@Sun.COM 
18010393SSaurabh.Mishra@Sun.COM struct	atge;
18110393SSaurabh.Mishra@Sun.COM 
18210393SSaurabh.Mishra@Sun.COM /*
18310393SSaurabh.Mishra@Sun.COM  * Structure for ring data (TX/RX).
18410393SSaurabh.Mishra@Sun.COM  */
18510393SSaurabh.Mishra@Sun.COM typedef	struct	atge_ring {
18610393SSaurabh.Mishra@Sun.COM 	struct	atge	*r_atge;
18710393SSaurabh.Mishra@Sun.COM 	atge_dma_t	**r_buf_tbl;
18810393SSaurabh.Mishra@Sun.COM 	atge_dma_t	*r_desc_ring;
18910393SSaurabh.Mishra@Sun.COM 	int		r_ndesc;
19010393SSaurabh.Mishra@Sun.COM 	int		r_consumer;
19110393SSaurabh.Mishra@Sun.COM 	int		r_producer;
19210393SSaurabh.Mishra@Sun.COM 	int		r_avail_desc;
19310393SSaurabh.Mishra@Sun.COM } atge_ring_t;
19410393SSaurabh.Mishra@Sun.COM 
19510393SSaurabh.Mishra@Sun.COM /*
19610393SSaurabh.Mishra@Sun.COM  * L1E specific private data.
19710393SSaurabh.Mishra@Sun.COM  */
19810393SSaurabh.Mishra@Sun.COM typedef	struct	atge_l1e_data {
19910393SSaurabh.Mishra@Sun.COM 	atge_dma_t	**atge_l1e_rx_page;
20010393SSaurabh.Mishra@Sun.COM 	atge_dma_t	*atge_l1e_rx_cmb;
20110393SSaurabh.Mishra@Sun.COM 	int		atge_l1e_pagesize;
20210393SSaurabh.Mishra@Sun.COM 	int		atge_l1e_rx_curp;
20310393SSaurabh.Mishra@Sun.COM 	uint16_t	atge_l1e_rx_seqno;
20410393SSaurabh.Mishra@Sun.COM 	uint32_t	atge_l1e_proc_max;
20510393SSaurabh.Mishra@Sun.COM 	uint32_t	atge_l1e_rx_page_cons;
20610393SSaurabh.Mishra@Sun.COM 	uint32_t	atge_l1e_rx_page_prods[L1E_RX_PAGES];
20710393SSaurabh.Mishra@Sun.COM } atge_l1e_data_t;
20810393SSaurabh.Mishra@Sun.COM 
20910393SSaurabh.Mishra@Sun.COM /*
21011353SSaurabh.Mishra@Sun.COM  * L1 specific private data.
21111353SSaurabh.Mishra@Sun.COM  */
21211353SSaurabh.Mishra@Sun.COM typedef	struct	atge_l1_data {
21311353SSaurabh.Mishra@Sun.COM 	atge_ring_t		*atge_rx_ring;
21411353SSaurabh.Mishra@Sun.COM 	atge_dma_t		*atge_l1_cmb;
21511353SSaurabh.Mishra@Sun.COM 	atge_dma_t		*atge_l1_rr;
21611353SSaurabh.Mishra@Sun.COM 	atge_dma_t		*atge_l1_smb;
21711353SSaurabh.Mishra@Sun.COM 	int			atge_l1_rr_consumers;
21811353SSaurabh.Mishra@Sun.COM 	uint32_t		atge_l1_intr_status;
21911353SSaurabh.Mishra@Sun.COM 	uint32_t		atge_l1_rx_prod_cons;
22011353SSaurabh.Mishra@Sun.COM 	uint32_t		atge_l1_tx_prod_cons;
22111353SSaurabh.Mishra@Sun.COM } atge_l1_data_t;
22211353SSaurabh.Mishra@Sun.COM 
22311353SSaurabh.Mishra@Sun.COM /*
22411353SSaurabh.Mishra@Sun.COM  * TX descriptor table is same with L1, L1E and L2E chips.
22511353SSaurabh.Mishra@Sun.COM  */
22611353SSaurabh.Mishra@Sun.COM #pragma pack(1)
22711353SSaurabh.Mishra@Sun.COM typedef struct  atge_tx_desc {
22811353SSaurabh.Mishra@Sun.COM 	uint64_t	addr;
22911353SSaurabh.Mishra@Sun.COM 	uint32_t	len;
23011353SSaurabh.Mishra@Sun.COM 	uint32_t	flags;
23111353SSaurabh.Mishra@Sun.COM } atge_tx_desc_t;
23211353SSaurabh.Mishra@Sun.COM #pragma pack()
23311353SSaurabh.Mishra@Sun.COM 
23411353SSaurabh.Mishra@Sun.COM #define	ATGE_TX_RING_CNT		256
23511353SSaurabh.Mishra@Sun.COM #define	ATGE_TX_RING_SZ	\
23611353SSaurabh.Mishra@Sun.COM 	(sizeof (struct atge_tx_desc) * ATGE_TX_RING_CNT)
23711353SSaurabh.Mishra@Sun.COM 
23811353SSaurabh.Mishra@Sun.COM /*
23910393SSaurabh.Mishra@Sun.COM  * Private instance data structure (per-instance soft-state).
24010393SSaurabh.Mishra@Sun.COM  */
24110393SSaurabh.Mishra@Sun.COM typedef	struct	atge {
24210393SSaurabh.Mishra@Sun.COM 	/*
24310393SSaurabh.Mishra@Sun.COM 	 * Lock for the TX ring, RX ring and interrupt. In order to align
24410393SSaurabh.Mishra@Sun.COM 	 * these locks at 8-byte boundary, we have kept it at the beginning
24510393SSaurabh.Mishra@Sun.COM 	 * of atge_t.
24610393SSaurabh.Mishra@Sun.COM 	 */
24710393SSaurabh.Mishra@Sun.COM 	kmutex_t		atge_tx_lock;
24810393SSaurabh.Mishra@Sun.COM 	kmutex_t		atge_rx_lock;
24910393SSaurabh.Mishra@Sun.COM 	kmutex_t		atge_intr_lock;
25010393SSaurabh.Mishra@Sun.COM 	kmutex_t		atge_mii_lock;
25111353SSaurabh.Mishra@Sun.COM 	kmutex_t		atge_mbox_lock;
25210393SSaurabh.Mishra@Sun.COM 
25310393SSaurabh.Mishra@Sun.COM 	/*
25410393SSaurabh.Mishra@Sun.COM 	 * Instance number and devinfo pointer.
25510393SSaurabh.Mishra@Sun.COM 	 */
25610393SSaurabh.Mishra@Sun.COM 	int			atge_unit;
25710393SSaurabh.Mishra@Sun.COM 	dev_info_t		*atge_dip;
25810393SSaurabh.Mishra@Sun.COM 	char			atge_name[8];
25910393SSaurabh.Mishra@Sun.COM 	atge_model_t		atge_model;
26010393SSaurabh.Mishra@Sun.COM 	int			atge_chip_rev;
26110393SSaurabh.Mishra@Sun.COM 	uint8_t			atge_revid;
26210393SSaurabh.Mishra@Sun.COM 
26310393SSaurabh.Mishra@Sun.COM 	/*
26410393SSaurabh.Mishra@Sun.COM 	 * Mac handle.
26510393SSaurabh.Mishra@Sun.COM 	 */
26610393SSaurabh.Mishra@Sun.COM 	mac_handle_t		atge_mh;
26710393SSaurabh.Mishra@Sun.COM 
26810393SSaurabh.Mishra@Sun.COM 	/*
26910393SSaurabh.Mishra@Sun.COM 	 * MII layer handle.
27010393SSaurabh.Mishra@Sun.COM 	 */
27110393SSaurabh.Mishra@Sun.COM 	mii_handle_t		atge_mii;
27210393SSaurabh.Mishra@Sun.COM 	link_state_t		atge_link_state;
27310393SSaurabh.Mishra@Sun.COM 
27410393SSaurabh.Mishra@Sun.COM 	/*
27510393SSaurabh.Mishra@Sun.COM 	 * Config Space Handle.
27610393SSaurabh.Mishra@Sun.COM 	 */
27710393SSaurabh.Mishra@Sun.COM 	ddi_acc_handle_t	atge_conf_handle;
27810393SSaurabh.Mishra@Sun.COM 
27910393SSaurabh.Mishra@Sun.COM 	/*
28010393SSaurabh.Mishra@Sun.COM 	 * IO registers mapped by DDI.
28110393SSaurabh.Mishra@Sun.COM 	 */
28210393SSaurabh.Mishra@Sun.COM 	ddi_acc_handle_t	atge_io_handle;
28310393SSaurabh.Mishra@Sun.COM 	caddr_t			atge_io_regs;
28410393SSaurabh.Mishra@Sun.COM 	uint_t			atge_intrs;
28510393SSaurabh.Mishra@Sun.COM 
28610393SSaurabh.Mishra@Sun.COM 	/*
28710393SSaurabh.Mishra@Sun.COM 	 * Interrupt management structures.
28810393SSaurabh.Mishra@Sun.COM 	 */
28910393SSaurabh.Mishra@Sun.COM 	ddi_intr_handle_t	*atge_intr_handle;
29010393SSaurabh.Mishra@Sun.COM 	int			atge_intr_types;
29110393SSaurabh.Mishra@Sun.COM 	int			atge_intr_cnt;
29210393SSaurabh.Mishra@Sun.COM 	uint_t			atge_intr_pri;
29310393SSaurabh.Mishra@Sun.COM 	int			atge_intr_size;
29410393SSaurabh.Mishra@Sun.COM 	int			atge_intr_cap;
29510393SSaurabh.Mishra@Sun.COM 
29610393SSaurabh.Mishra@Sun.COM 	/*
29710393SSaurabh.Mishra@Sun.COM 	 * Common structures.
29810393SSaurabh.Mishra@Sun.COM 	 */
29910393SSaurabh.Mishra@Sun.COM 	atge_ring_t		*atge_tx_ring;
30010393SSaurabh.Mishra@Sun.COM 	int			atge_tx_resched;
30110393SSaurabh.Mishra@Sun.COM 	int			atge_mtu;
30210393SSaurabh.Mishra@Sun.COM 	int			atge_int_mod;
30310393SSaurabh.Mishra@Sun.COM 	int			atge_max_frame_size;
30410393SSaurabh.Mishra@Sun.COM 
30511353SSaurabh.Mishra@Sun.COM 
30610393SSaurabh.Mishra@Sun.COM 	/*
30710393SSaurabh.Mishra@Sun.COM 	 * Ethernet addresses.
30810393SSaurabh.Mishra@Sun.COM 	 */
30910393SSaurabh.Mishra@Sun.COM 	ether_addr_t		atge_ether_addr;
31010393SSaurabh.Mishra@Sun.COM 	ether_addr_t		atge_dev_addr;
31110393SSaurabh.Mishra@Sun.COM 	uint64_t		atge_mchash;
31210393SSaurabh.Mishra@Sun.COM 	uint32_t		atge_mchash_ref_cnt[64];
31310393SSaurabh.Mishra@Sun.COM 
31410393SSaurabh.Mishra@Sun.COM 	/*
31510393SSaurabh.Mishra@Sun.COM 	 * PHY register.
31610393SSaurabh.Mishra@Sun.COM 	 */
31710393SSaurabh.Mishra@Sun.COM 	int			atge_phyaddr;
31810393SSaurabh.Mishra@Sun.COM 
31910393SSaurabh.Mishra@Sun.COM 	/*
32010393SSaurabh.Mishra@Sun.COM 	 * Flags.
32110393SSaurabh.Mishra@Sun.COM 	 */
32210393SSaurabh.Mishra@Sun.COM 	int			atge_flags;
32310393SSaurabh.Mishra@Sun.COM 	uint32_t		atge_dma_rd_burst;
32410393SSaurabh.Mishra@Sun.COM 	uint32_t		atge_dma_wr_burst;
32510393SSaurabh.Mishra@Sun.COM 	int			atge_filter_flags;
32610393SSaurabh.Mishra@Sun.COM 	int			atge_chip_state;
32710393SSaurabh.Mishra@Sun.COM 
32810393SSaurabh.Mishra@Sun.COM 	/*
32910393SSaurabh.Mishra@Sun.COM 	 * Private data for the chip.
33010393SSaurabh.Mishra@Sun.COM 	 */
33110393SSaurabh.Mishra@Sun.COM 	void			*atge_private_data;
33210393SSaurabh.Mishra@Sun.COM 
33310393SSaurabh.Mishra@Sun.COM 	/*
33410393SSaurabh.Mishra@Sun.COM 	 * Buffer length.
33510393SSaurabh.Mishra@Sun.COM 	 */
33610393SSaurabh.Mishra@Sun.COM 	int			atge_rx_buf_len;
33710393SSaurabh.Mishra@Sun.COM 	int			atge_tx_buf_len;
33810393SSaurabh.Mishra@Sun.COM 
33910393SSaurabh.Mishra@Sun.COM 	/*
34010393SSaurabh.Mishra@Sun.COM 	 * Common stats.
34110393SSaurabh.Mishra@Sun.COM 	 */
34210393SSaurabh.Mishra@Sun.COM 	void			*atge_hw_stats;
34310393SSaurabh.Mishra@Sun.COM 	uint64_t		atge_ipackets;
34410393SSaurabh.Mishra@Sun.COM 	uint64_t		atge_opackets;
34510393SSaurabh.Mishra@Sun.COM 	uint64_t		atge_rbytes;
34610393SSaurabh.Mishra@Sun.COM 	uint64_t		atge_obytes;
34710393SSaurabh.Mishra@Sun.COM 	uint64_t		atge_brdcstxmt;
34810393SSaurabh.Mishra@Sun.COM 	uint64_t		atge_multixmt;
34910393SSaurabh.Mishra@Sun.COM 	uint64_t		atge_brdcstrcv;
35010393SSaurabh.Mishra@Sun.COM 	uint64_t		atge_multircv;
35110393SSaurabh.Mishra@Sun.COM 	unsigned		atge_norcvbuf;
35210393SSaurabh.Mishra@Sun.COM 	unsigned		atge_errrcv;
35310393SSaurabh.Mishra@Sun.COM 	unsigned		atge_errxmt;
35410393SSaurabh.Mishra@Sun.COM 	unsigned		atge_missed;
35510393SSaurabh.Mishra@Sun.COM 	unsigned		atge_underflow;
35610393SSaurabh.Mishra@Sun.COM 	unsigned		atge_overflow;
35710393SSaurabh.Mishra@Sun.COM 	unsigned		atge_align_errors;
35810393SSaurabh.Mishra@Sun.COM 	unsigned		atge_fcs_errors;
35910393SSaurabh.Mishra@Sun.COM 	unsigned		atge_carrier_errors;
36010393SSaurabh.Mishra@Sun.COM 	unsigned		atge_collisions;
36110393SSaurabh.Mishra@Sun.COM 	unsigned		atge_ex_collisions;
36210393SSaurabh.Mishra@Sun.COM 	unsigned		atge_tx_late_collisions;
36310393SSaurabh.Mishra@Sun.COM 	unsigned		atge_defer_xmts;
36410393SSaurabh.Mishra@Sun.COM 	unsigned		atge_first_collisions;
36510393SSaurabh.Mishra@Sun.COM 	unsigned		atge_multi_collisions;
36610393SSaurabh.Mishra@Sun.COM 	unsigned		atge_sqe_errors;
36710393SSaurabh.Mishra@Sun.COM 	unsigned		atge_macxmt_errors;
36810393SSaurabh.Mishra@Sun.COM 	unsigned		atge_macrcv_errors;
36910393SSaurabh.Mishra@Sun.COM 	unsigned		atge_toolong_errors;
37010393SSaurabh.Mishra@Sun.COM 	unsigned		atge_runt;
37110393SSaurabh.Mishra@Sun.COM 	unsigned		atge_jabber;
37210393SSaurabh.Mishra@Sun.COM 	unsigned		atge_noxmtbuf;
37310393SSaurabh.Mishra@Sun.COM } atge_t;
37410393SSaurabh.Mishra@Sun.COM 
37510393SSaurabh.Mishra@Sun.COM /*
37610393SSaurabh.Mishra@Sun.COM  * extern functions.
37710393SSaurabh.Mishra@Sun.COM  */
37810393SSaurabh.Mishra@Sun.COM extern	void	atge_error(dev_info_t *, char *, ...);
37910393SSaurabh.Mishra@Sun.COM 
38010393SSaurabh.Mishra@Sun.COM /*
38110393SSaurabh.Mishra@Sun.COM  * Debugging Support.
38210393SSaurabh.Mishra@Sun.COM  */
38310393SSaurabh.Mishra@Sun.COM #ifdef	DEBUG
38410393SSaurabh.Mishra@Sun.COM #define	ATGE_DB(arg)	atge_debug_func arg
38510393SSaurabh.Mishra@Sun.COM #else
38610393SSaurabh.Mishra@Sun.COM #define	ATGE_DB(arg)
38710393SSaurabh.Mishra@Sun.COM #endif
38810393SSaurabh.Mishra@Sun.COM 
38910393SSaurabh.Mishra@Sun.COM extern	int	atge_debug;
39010393SSaurabh.Mishra@Sun.COM extern	void	atge_debug_func(char *, ...);
39110393SSaurabh.Mishra@Sun.COM extern	atge_dma_t	*atge_alloc_a_dma_blk(atge_t *, ddi_dma_attr_t *,
39210393SSaurabh.Mishra@Sun.COM     int, int);
39310393SSaurabh.Mishra@Sun.COM extern	void	atge_free_a_dma_blk(atge_dma_t *);
39410393SSaurabh.Mishra@Sun.COM extern	atge_dma_t *atge_buf_alloc(atge_t *, size_t, int);
39510393SSaurabh.Mishra@Sun.COM extern	void	atge_buf_free(atge_dma_t *);
39610393SSaurabh.Mishra@Sun.COM extern	mblk_t *atge_get_mblk(int);
39710393SSaurabh.Mishra@Sun.COM extern	void	atge_device_restart(atge_t *);
39810393SSaurabh.Mishra@Sun.COM extern	int	atge_alloc_buffers(atge_ring_t *, size_t, size_t, int);
39910393SSaurabh.Mishra@Sun.COM extern	void	atge_free_buffers(atge_ring_t *, size_t);
40010393SSaurabh.Mishra@Sun.COM extern	void	atge_stop_timer(atge_t *);
40110393SSaurabh.Mishra@Sun.COM extern	void	atge_start_timer(atge_t *);
40210393SSaurabh.Mishra@Sun.COM extern	void	atge_mii_write(void *, uint8_t, uint8_t, uint16_t);
40311353SSaurabh.Mishra@Sun.COM extern	uint16_t	atge_mii_read(void *, uint8_t, uint8_t);
40411353SSaurabh.Mishra@Sun.COM extern	void	atge_device_stop(atge_t *);
40511353SSaurabh.Mishra@Sun.COM extern	void	atge_tx_reclaim(atge_t *, int);
40611353SSaurabh.Mishra@Sun.COM 
40710393SSaurabh.Mishra@Sun.COM 
40810393SSaurabh.Mishra@Sun.COM #ifdef __cplusplus
40910393SSaurabh.Mishra@Sun.COM }
41010393SSaurabh.Mishra@Sun.COM #endif
41110393SSaurabh.Mishra@Sun.COM 
41210393SSaurabh.Mishra@Sun.COM #endif	/* _ATGE_H */
413