xref: /illumos-gate/usr/src/uts/common/xen/io/xnf.h (revision 621be8d08fd45483b5ca1cb8e2e88239f1502b4d)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef _SYS_XNF_H
28 #define	_SYS_XNF_H
29 
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33 
34 #define	NET_TX_RING_SIZE  __CONST_RING_SIZE(netif_tx, PAGESIZE)
35 #define	NET_RX_RING_SIZE  __CONST_RING_SIZE(netif_rx, PAGESIZE)
36 
37 #define	XNF_MAXPKT	1500		/* MTU size */
38 #define	XNF_FRAMESIZE	1514		/* frame size including MAC header */
39 
40 /* DEBUG flags */
41 #define	XNF_DEBUG_DDI		0x01
42 #define	XNF_DEBUG_TRACE		0x02
43 
44 /*
45  * Information about each receive buffer and any transmit look-aside
46  * buffers.
47  */
48 typedef struct xnf_buf {
49 	frtn_t			free_rtn;
50 	struct xnf		*xnfp;
51 	ddi_dma_handle_t	dma_handle;
52 	caddr_t			buf;		/* DMA-able data buffer */
53 	paddr_t			buf_phys;
54 	mfn_t			buf_mfn;
55 	size_t			len;
56 	struct xnf_buf		*next;	/* For linking into free list */
57 	ddi_acc_handle_t	acc_handle;
58 	grant_ref_t		grant_ref;	/* grant table reference */
59 	uint16_t		id;		/* buffer id */
60 	unsigned int		gen;
61 } xnf_buf_t;
62 
63 /*
64  * Information about each transmit buffer.
65  */
66 typedef struct xnf_txbuf {
67 	struct xnf_txbuf	*tx_next;
68 	mblk_t			*tx_mp;	/* mblk associated with packet */
69 	netif_tx_request_t	tx_txreq;
70 	caddr_t			tx_bufp;
71 	ddi_dma_handle_t	tx_dma_handle;
72 	mfn_t			tx_mfn;
73 	xnf_buf_t		*tx_bdesc; /* Look-aside buffer, if used. */
74 	unsigned char		tx_type;
75 	int16_t			tx_status;
76 	RING_IDX		tx_slot;
77 
78 #define	TX_DATA		1
79 #define	TX_MCAST_REQ	2
80 #define	TX_MCAST_RSP	3
81 } xnf_txbuf_t;
82 
83 /*
84  * Information about each outstanding transmit operation.
85  */
86 typedef struct xnf_txid {
87 	uint16_t	id;	/* Id of this transmit buffer. */
88 	uint16_t	next;	/* Freelist of ids. */
89 	xnf_txbuf_t	*txbuf;	/* Buffer details. */
90 } xnf_txid_t;
91 
92 /*
93  * Per-instance data.
94  */
95 typedef struct xnf {
96 	/* most interesting stuff first to assist debugging */
97 	dev_info_t		*xnf_devinfo;
98 	mac_handle_t		xnf_mh;
99 	unsigned char		xnf_mac_addr[ETHERADDRL];
100 
101 	unsigned int		xnf_gen;	/* Increments on resume. */
102 
103 	boolean_t		xnf_connected;
104 	boolean_t		xnf_running;
105 
106 	boolean_t		xnf_be_rx_copy;
107 	boolean_t		xnf_be_mcast_control;
108 
109 	uint64_t		xnf_stat_interrupts;
110 	uint64_t		xnf_stat_unclaimed_interrupts;
111 	uint64_t		xnf_stat_norxbuf;
112 	uint64_t		xnf_stat_drop;
113 	uint64_t		xnf_stat_errrx;
114 
115 	uint64_t		xnf_stat_tx_attempt;
116 	uint64_t		xnf_stat_tx_pullup;
117 	uint64_t		xnf_stat_tx_pagebndry;
118 	uint64_t		xnf_stat_tx_defer;
119 	uint64_t		xnf_stat_mac_rcv_error;
120 	uint64_t		xnf_stat_runt;
121 
122 	uint64_t		xnf_stat_ipackets;
123 	uint64_t		xnf_stat_opackets;
124 	uint64_t		xnf_stat_rbytes;
125 	uint64_t		xnf_stat_obytes;
126 
127 	uint64_t		xnf_stat_tx_cksum_deferred;
128 	uint64_t		xnf_stat_rx_cksum_no_need;
129 
130 	uint64_t		xnf_stat_buf_allocated;
131 	uint64_t		xnf_stat_buf_outstanding;
132 	uint64_t		xnf_stat_gref_outstanding;
133 	uint64_t		xnf_stat_gref_failure;
134 	uint64_t		xnf_stat_gref_peak;
135 	uint64_t		xnf_stat_rx_allocb_fail;
136 	uint64_t		xnf_stat_rx_desballoc_fail;
137 
138 	kstat_t			*xnf_kstat_aux;
139 
140 	ddi_iblock_cookie_t	xnf_icookie;
141 
142 	netif_tx_front_ring_t	xnf_tx_ring;
143 	ddi_dma_handle_t	xnf_tx_ring_dma_handle;
144 	ddi_acc_handle_t	xnf_tx_ring_dma_acchandle;
145 	paddr_t			xnf_tx_ring_phys_addr;
146 	grant_ref_t		xnf_tx_ring_ref;
147 
148 	xnf_txid_t		xnf_tx_pkt_id[NET_TX_RING_SIZE];
149 	uint16_t		xnf_tx_pkt_id_head;
150 	kmutex_t		xnf_txlock;
151 	kmutex_t		xnf_schedlock;
152 	boolean_t		xnf_need_sched;
153 	kcondvar_t		xnf_cv_tx_slots;
154 	kmem_cache_t		*xnf_tx_buf_cache;
155 
156 	netif_rx_front_ring_t	xnf_rx_ring;
157 	ddi_dma_handle_t	xnf_rx_ring_dma_handle;
158 	ddi_acc_handle_t	xnf_rx_ring_dma_acchandle;
159 	paddr_t			xnf_rx_ring_phys_addr;
160 	grant_ref_t		xnf_rx_ring_ref;
161 
162 	xnf_buf_t		*xnf_rx_pkt_info[NET_RX_RING_SIZE];
163 	kmutex_t		xnf_rxlock;
164 	mblk_t			*xnf_rx_head;
165 	mblk_t			*xnf_rx_tail;
166 	boolean_t		xnf_rx_new_buffers_posted;
167 	kmem_cache_t		*xnf_buf_cache;
168 
169 	uint16_t		xnf_evtchn;
170 
171 	kmutex_t		xnf_gref_lock;
172 	grant_ref_t		xnf_gref_head;
173 
174 	kcondvar_t		xnf_cv_state;
175 	kcondvar_t		xnf_cv_multicast;
176 	uint_t			xnf_pending_multicast;
177 } xnf_t;
178 
179 #ifdef __cplusplus
180 }
181 #endif
182 
183 #endif	/* _SYS_XNF_H */
184