xref: /onnv-gate/usr/src/uts/common/xen/io/xnf.h (revision 10958:2d0d7434a4fb)
15084Sjohnlev /*
25084Sjohnlev  * CDDL HEADER START
35084Sjohnlev  *
45084Sjohnlev  * The contents of this file are subject to the terms of the
55084Sjohnlev  * Common Development and Distribution License (the "License").
65084Sjohnlev  * You may not use this file except in compliance with the License.
75084Sjohnlev  *
85084Sjohnlev  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
95084Sjohnlev  * or http://www.opensolaris.org/os/licensing.
105084Sjohnlev  * See the License for the specific language governing permissions
115084Sjohnlev  * and limitations under the License.
125084Sjohnlev  *
135084Sjohnlev  * When distributing Covered Code, include this CDDL HEADER in each
145084Sjohnlev  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
155084Sjohnlev  * If applicable, add the following below this CDDL HEADER, with the
165084Sjohnlev  * fields enclosed by brackets "[]" replaced with your own identifying
175084Sjohnlev  * information: Portions Copyright [yyyy] [name of copyright owner]
185084Sjohnlev  *
195084Sjohnlev  * CDDL HEADER END
205084Sjohnlev  */
215084Sjohnlev 
225084Sjohnlev /*
23*10958Sdme@sun.com  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
245084Sjohnlev  * Use is subject to license terms.
255084Sjohnlev  */
265084Sjohnlev 
275084Sjohnlev #ifndef _SYS_XNF_H
285084Sjohnlev #define	_SYS_XNF_H
295084Sjohnlev 
305084Sjohnlev #ifdef __cplusplus
315084Sjohnlev extern "C" {
325084Sjohnlev #endif
335084Sjohnlev 
345084Sjohnlev #define	NET_TX_RING_SIZE  __RING_SIZE((netif_tx_sring_t *)0, PAGESIZE)
355084Sjohnlev #define	NET_RX_RING_SIZE  __RING_SIZE((netif_rx_sring_t *)0, PAGESIZE)
365084Sjohnlev 
375084Sjohnlev #define	XNF_MAXPKT	1500		/* MTU size */
385084Sjohnlev #define	XNF_FRAMESIZE	1514		/* frame size including MAC header */
395084Sjohnlev 
405084Sjohnlev /* DEBUG flags */
415084Sjohnlev #define	XNF_DEBUG_DDI		0x01
425084Sjohnlev #define	XNF_DEBUG_TRACE		0x02
435084Sjohnlev 
44*10958Sdme@sun.com /*
45*10958Sdme@sun.com  * Information about each receive buffer and any transmit look-aside
46*10958Sdme@sun.com  * buffers.
47*10958Sdme@sun.com  */
48*10958Sdme@sun.com typedef struct xnf_buf {
49*10958Sdme@sun.com 	frtn_t			free_rtn;
505084Sjohnlev 	struct xnf		*xnfp;
515084Sjohnlev 	ddi_dma_handle_t	dma_handle;
525084Sjohnlev 	caddr_t			buf;		/* DMA-able data buffer */
535084Sjohnlev 	paddr_t			buf_phys;
54*10958Sdme@sun.com 	mfn_t			buf_mfn;
55*10958Sdme@sun.com 	size_t			len;
56*10958Sdme@sun.com 	struct xnf_buf		*next;	/* For linking into free list */
575084Sjohnlev 	ddi_acc_handle_t	acc_handle;
585084Sjohnlev 	grant_ref_t		grant_ref;	/* grant table reference */
595084Sjohnlev 	uint16_t		id;		/* buffer id */
60*10958Sdme@sun.com 	unsigned int		gen;
61*10958Sdme@sun.com } xnf_buf_t;
62*10958Sdme@sun.com 
63*10958Sdme@sun.com /*
64*10958Sdme@sun.com  * Information about each transmit buffer.
65*10958Sdme@sun.com  */
66*10958Sdme@sun.com typedef struct xnf_txbuf {
67*10958Sdme@sun.com 	struct xnf_txbuf	*tx_next;
68*10958Sdme@sun.com 	mblk_t			*tx_mp;	/* mblk associated with packet */
69*10958Sdme@sun.com 	netif_tx_request_t	tx_txreq;
70*10958Sdme@sun.com 	caddr_t			tx_bufp;
71*10958Sdme@sun.com 	ddi_dma_handle_t	tx_dma_handle;
72*10958Sdme@sun.com 	mfn_t			tx_mfn;
73*10958Sdme@sun.com 	xnf_buf_t		*tx_bdesc; /* Look-aside buffer, if used. */
74*10958Sdme@sun.com 	unsigned char		tx_type;
75*10958Sdme@sun.com 	int16_t			tx_status;
76*10958Sdme@sun.com 	RING_IDX		tx_slot;
775084Sjohnlev 
78*10958Sdme@sun.com #define	TX_DATA		1
79*10958Sdme@sun.com #define	TX_MCAST_REQ	2
80*10958Sdme@sun.com #define	TX_MCAST_RSP	3
81*10958Sdme@sun.com } xnf_txbuf_t;
825084Sjohnlev 
83*10958Sdme@sun.com /*
84*10958Sdme@sun.com  * Information about each outstanding transmit operation.
85*10958Sdme@sun.com  */
86*10958Sdme@sun.com typedef struct xnf_txid {
87*10958Sdme@sun.com 	uint16_t	id;	/* Id of this transmit buffer. */
88*10958Sdme@sun.com 	uint16_t	next;	/* Freelist of ids. */
89*10958Sdme@sun.com 	xnf_txbuf_t	*txbuf;	/* Buffer details. */
90*10958Sdme@sun.com } xnf_txid_t;
91*10958Sdme@sun.com 
92*10958Sdme@sun.com /*
93*10958Sdme@sun.com  * Per-instance data.
94*10958Sdme@sun.com  */
955084Sjohnlev typedef struct xnf {
965084Sjohnlev 	/* most interesting stuff first to assist debugging */
97*10958Sdme@sun.com 	dev_info_t		*xnf_devinfo;
98*10958Sdme@sun.com 	mac_handle_t		xnf_mh;
995741Smrj 	unsigned char		xnf_mac_addr[ETHERADDRL];
100*10958Sdme@sun.com 
101*10958Sdme@sun.com 	unsigned int		xnf_gen;	/* Increments on resume. */
1025084Sjohnlev 
1035741Smrj 	boolean_t		xnf_connected;
1045741Smrj 	boolean_t		xnf_running;
1055084Sjohnlev 
106*10958Sdme@sun.com 	boolean_t		xnf_be_rx_copy;
107*10958Sdme@sun.com 	boolean_t		xnf_be_mcast_control;
1085084Sjohnlev 
1095741Smrj 	uint64_t		xnf_stat_interrupts;
1105741Smrj 	uint64_t		xnf_stat_unclaimed_interrupts;
1115741Smrj 	uint64_t		xnf_stat_norxbuf;
1126899Scz147101 	uint64_t		xnf_stat_drop;
1135741Smrj 	uint64_t		xnf_stat_errrx;
1145084Sjohnlev 
1155741Smrj 	uint64_t		xnf_stat_tx_attempt;
1165741Smrj 	uint64_t		xnf_stat_tx_pullup;
1175741Smrj 	uint64_t		xnf_stat_tx_pagebndry;
1185741Smrj 	uint64_t		xnf_stat_tx_defer;
1195741Smrj 	uint64_t		xnf_stat_mac_rcv_error;
1205741Smrj 	uint64_t		xnf_stat_runt;
1215084Sjohnlev 
1225741Smrj 	uint64_t		xnf_stat_ipackets;
1235741Smrj 	uint64_t		xnf_stat_opackets;
1245741Smrj 	uint64_t		xnf_stat_rbytes;
1255741Smrj 	uint64_t		xnf_stat_obytes;
1265084Sjohnlev 
1275741Smrj 	uint64_t		xnf_stat_tx_cksum_deferred;
1285741Smrj 	uint64_t		xnf_stat_rx_cksum_no_need;
129*10958Sdme@sun.com 
130*10958Sdme@sun.com 	uint64_t		xnf_stat_buf_allocated;
131*10958Sdme@sun.com 	uint64_t		xnf_stat_buf_outstanding;
132*10958Sdme@sun.com 	uint64_t		xnf_stat_gref_outstanding;
133*10958Sdme@sun.com 	uint64_t		xnf_stat_gref_failure;
134*10958Sdme@sun.com 	uint64_t		xnf_stat_gref_peak;
135*10958Sdme@sun.com 	uint64_t		xnf_stat_rx_allocb_fail;
136*10958Sdme@sun.com 	uint64_t		xnf_stat_rx_desballoc_fail;
1375084Sjohnlev 
1385741Smrj 	kstat_t			*xnf_kstat_aux;
1395084Sjohnlev 
140*10958Sdme@sun.com 	ddi_iblock_cookie_t	xnf_icookie;
1415084Sjohnlev 
142*10958Sdme@sun.com 	netif_tx_front_ring_t	xnf_tx_ring;
1435741Smrj 	ddi_dma_handle_t	xnf_tx_ring_dma_handle;
1445741Smrj 	ddi_acc_handle_t	xnf_tx_ring_dma_acchandle;
1455741Smrj 	paddr_t			xnf_tx_ring_phys_addr;
1465741Smrj 	grant_ref_t		xnf_tx_ring_ref;
1475084Sjohnlev 
148*10958Sdme@sun.com 	xnf_txid_t		xnf_tx_pkt_id[NET_TX_RING_SIZE];
149*10958Sdme@sun.com 	uint16_t		xnf_tx_pkt_id_head;
150*10958Sdme@sun.com 	kmutex_t		xnf_txlock;
151*10958Sdme@sun.com 	kmutex_t		xnf_schedlock;
152*10958Sdme@sun.com 	boolean_t		xnf_need_sched;
153*10958Sdme@sun.com 	kcondvar_t		xnf_cv_tx_slots;
154*10958Sdme@sun.com 	kmem_cache_t		*xnf_tx_buf_cache;
155*10958Sdme@sun.com 
156*10958Sdme@sun.com 	netif_rx_front_ring_t	xnf_rx_ring;
1575741Smrj 	ddi_dma_handle_t	xnf_rx_ring_dma_handle;
1585741Smrj 	ddi_acc_handle_t	xnf_rx_ring_dma_acchandle;
1595741Smrj 	paddr_t			xnf_rx_ring_phys_addr;
1605741Smrj 	grant_ref_t		xnf_rx_ring_ref;
1615084Sjohnlev 
162*10958Sdme@sun.com 	xnf_buf_t		*xnf_rx_pkt_info[NET_RX_RING_SIZE];
163*10958Sdme@sun.com 	kmutex_t		xnf_rxlock;
164*10958Sdme@sun.com 	mblk_t			*xnf_rx_head;
165*10958Sdme@sun.com 	mblk_t			*xnf_rx_tail;
166*10958Sdme@sun.com 	boolean_t		xnf_rx_new_buffers_posted;
167*10958Sdme@sun.com 	kmem_cache_t		*xnf_buf_cache;
1685741Smrj 
169*10958Sdme@sun.com 	uint16_t		xnf_evtchn;
170*10958Sdme@sun.com 
171*10958Sdme@sun.com 	kmutex_t		xnf_gref_lock;
172*10958Sdme@sun.com 	grant_ref_t		xnf_gref_head;
173*10958Sdme@sun.com 
174*10958Sdme@sun.com 	kcondvar_t		xnf_cv_state;
175*10958Sdme@sun.com 	kcondvar_t		xnf_cv_multicast;
176*10958Sdme@sun.com 	uint_t			xnf_pending_multicast;
1775084Sjohnlev } xnf_t;
1785084Sjohnlev 
1795084Sjohnlev #ifdef __cplusplus
1805084Sjohnlev }
1815084Sjohnlev #endif
1825084Sjohnlev 
1835084Sjohnlev #endif	/* _SYS_XNF_H */
184