xref: /illumos-gate/usr/src/uts/common/xen/io/xnf.h (revision 379728489ed47862c4927c75771e767b9476c9c4)
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 /*
28  * Copyright (c) 2014, 2017 by Delphix. All rights reserved.
29  */
30 
31 #ifndef _SYS_XNF_H
32 #define	_SYS_XNF_H
33 
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37 
38 /*
39  * As of April 2017, TX and RX ring sizes are fixed to 1 page in
40  * size and Xen doesn't support changing it.
41  * This represents 256 entries.
42  */
43 #define	NET_TX_RING_SIZE  __CONST_RING_SIZE(netif_tx, PAGESIZE)
44 #define	NET_RX_RING_SIZE  __CONST_RING_SIZE(netif_rx, PAGESIZE)
45 
46 /*
47  * There is no MTU limit, however for all practical purposes hardware won't
48  * support anything much larger than 9k. We put an arbitrary 16k limit.
49  */
50 #define	XNF_MAXPKT	16384
51 #define	XNF_FRAMESIZE	1514		/* frame size including MAC header */
52 
53 /*
54  * Based on XEN_NETIF_NR_SLOTS_MIN in Linux. Packets that span more pages
55  * than this must be defragmented or dropped.
56  */
57 #define	XEN_MAX_TX_DATA_PAGES	18
58 /*
59  * We keep one extra slot for LSO
60  */
61 #define	XEN_MAX_SLOTS_PER_TX	(XEN_MAX_TX_DATA_PAGES + 1)
62 
63 #define	XEN_DATA_BOUNDARY	0x1000
64 
65 /*
66  * Information about each receive buffer and any transmit look-aside
67  * buffers.
68  */
69 typedef struct xnf_buf {
70 	frtn_t			free_rtn;
71 	struct xnf		*xnfp;
72 	ddi_dma_handle_t	dma_handle;
73 	caddr_t			buf;		/* DMA-able data buffer */
74 	paddr_t			buf_phys;
75 	mfn_t			buf_mfn;
76 	size_t			len;
77 	struct xnf_buf		*next;	/* For linking into free list */
78 	ddi_acc_handle_t	acc_handle;
79 	grant_ref_t		grant_ref;	/* grant table reference */
80 	uint16_t		id;		/* buffer id */
81 	unsigned int		gen;
82 } xnf_buf_t;
83 
84 /*
85  * Information about each transmit buffer.
86  */
87 typedef enum xnf_txbuf_type {
88 	TX_DATA = 1,
89 	TX_MCAST_REQ,
90 	TX_MCAST_RSP
91 } xnf_txbuf_type_t;
92 
93 /*
94  * A xnf_txbuf is used to store ancillary data for a netif_tx_request_t.
95  * A tx packet can span multiple xnf_txbuf's, linked together through tx_next
96  * and tx_prev; tx_head points to the head of the chain.
97  */
98 typedef struct xnf_txbuf {
99 	struct xnf_txbuf	*tx_next;
100 	struct xnf_txbuf	*tx_prev;
101 	struct xnf_txbuf	*tx_head;
102 	xnf_txbuf_type_t	tx_type;
103 	netif_tx_request_t	tx_txreq;
104 	netif_extra_info_t	tx_extra;
105 	/* Used for TX_DATA types */
106 	ddi_dma_handle_t	tx_dma_handle;
107 	boolean_t		tx_handle_bound;
108 	mblk_t			*tx_mp;
109 	xnf_buf_t		*tx_bdesc; /* Look-aside buffer, if used. */
110 	int			tx_frags_to_ack;
111 	/* Used for TX_MCAST types */
112 	int16_t			tx_status;
113 	/* Used for debugging */
114 	mfn_t			tx_mfn;
115 	RING_IDX		tx_slot;
116 } xnf_txbuf_t;
117 
118 #define	TXBUF_SETNEXT(head, next)	\
119 	head->tx_next = next;		\
120 	next->tx_prev = head;
121 
122 /*
123  * Information about each outstanding transmit operation.
124  */
125 typedef struct xnf_txid {
126 	uint16_t	id;	/* Id of this transmit buffer. */
127 	uint16_t	next;	/* Freelist of ids. */
128 	xnf_txbuf_t	*txbuf;	/* Buffer details. */
129 } xnf_txid_t;
130 
131 /*
132  * Per-instance data.
133  */
134 typedef struct xnf {
135 	/* most interesting stuff first to assist debugging */
136 	dev_info_t		*xnf_devinfo;
137 	mac_handle_t		xnf_mh;
138 	unsigned char		xnf_mac_addr[ETHERADDRL];
139 	uint32_t		xnf_mtu;
140 
141 	unsigned int		xnf_gen;	/* Increments on resume. */
142 
143 	boolean_t		xnf_connected;
144 	boolean_t		xnf_running;
145 
146 	boolean_t		xnf_be_rx_copy;
147 	boolean_t		xnf_be_mcast_control;
148 	boolean_t		xnf_be_tx_sg;
149 	boolean_t		xnf_be_lso;
150 
151 	uint64_t		xnf_stat_interrupts;
152 	uint64_t		xnf_stat_unclaimed_interrupts;
153 	uint64_t		xnf_stat_norxbuf;
154 	uint64_t		xnf_stat_rx_drop;
155 	uint64_t		xnf_stat_errrx;
156 
157 	uint64_t		xnf_stat_tx_pullup;
158 	uint64_t		xnf_stat_tx_lookaside;
159 	uint64_t		xnf_stat_tx_defer;
160 	uint64_t		xnf_stat_tx_drop;
161 	uint64_t		xnf_stat_tx_eth_hdr_split;
162 	uint64_t		xnf_stat_mac_rcv_error;
163 	uint64_t		xnf_stat_runt;
164 
165 	uint64_t		xnf_stat_ipackets;
166 	uint64_t		xnf_stat_opackets;
167 	uint64_t		xnf_stat_rbytes;
168 	uint64_t		xnf_stat_obytes;
169 
170 	uint64_t		xnf_stat_tx_cksum_deferred;
171 	uint64_t		xnf_stat_rx_cksum_no_need;
172 
173 	uint64_t		xnf_stat_buf_allocated;
174 	uint64_t		xnf_stat_buf_outstanding;
175 	uint64_t		xnf_stat_gref_outstanding;
176 	uint64_t		xnf_stat_gref_failure;
177 	uint64_t		xnf_stat_gref_peak;
178 	uint64_t		xnf_stat_rx_allocb_fail;
179 	uint64_t		xnf_stat_rx_desballoc_fail;
180 
181 	kstat_t			*xnf_kstat_aux;
182 
183 	ddi_iblock_cookie_t	xnf_icookie;
184 
185 	netif_tx_front_ring_t	xnf_tx_ring;
186 	ddi_dma_handle_t	xnf_tx_ring_dma_handle;
187 	ddi_acc_handle_t	xnf_tx_ring_dma_acchandle;
188 	paddr_t			xnf_tx_ring_phys_addr;
189 	grant_ref_t		xnf_tx_ring_ref;
190 
191 	xnf_txid_t		*xnf_tx_pkt_id;
192 	uint16_t		xnf_tx_pkt_id_head;
193 	kmutex_t		xnf_txlock;
194 	kmutex_t		xnf_schedlock;
195 	boolean_t		xnf_need_sched;
196 	kcondvar_t		xnf_cv_tx_slots;
197 	kmem_cache_t		*xnf_tx_buf_cache;
198 
199 	netif_rx_front_ring_t	xnf_rx_ring;
200 	ddi_dma_handle_t	xnf_rx_ring_dma_handle;
201 	ddi_acc_handle_t	xnf_rx_ring_dma_acchandle;
202 	paddr_t			xnf_rx_ring_phys_addr;
203 	grant_ref_t		xnf_rx_ring_ref;
204 
205 	xnf_buf_t		**xnf_rx_pkt_info;
206 	kmutex_t		xnf_rxlock;
207 	mblk_t			*xnf_rx_head;
208 	mblk_t			*xnf_rx_tail;
209 	boolean_t		xnf_rx_new_buffers_posted;
210 	kmem_cache_t		*xnf_buf_cache;
211 
212 	uint16_t		xnf_evtchn;
213 
214 	kmutex_t		xnf_gref_lock;
215 	grant_ref_t		xnf_gref_head;
216 
217 	kcondvar_t		xnf_cv_state;
218 	kcondvar_t		xnf_cv_multicast;
219 	uint_t			xnf_pending_multicast;
220 } xnf_t;
221 
222 #ifdef __cplusplus
223 }
224 #endif
225 
226 #endif	/* _SYS_XNF_H */
227