xref: /illumos-gate/usr/src/uts/common/xen/io/xnf.h (revision cfd17c15)
1843e1988Sjohnlev /*
2843e1988Sjohnlev  * CDDL HEADER START
3843e1988Sjohnlev  *
4843e1988Sjohnlev  * The contents of this file are subject to the terms of the
5843e1988Sjohnlev  * Common Development and Distribution License (the "License").
6843e1988Sjohnlev  * You may not use this file except in compliance with the License.
7843e1988Sjohnlev  *
8843e1988Sjohnlev  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9843e1988Sjohnlev  * or http://www.opensolaris.org/os/licensing.
10843e1988Sjohnlev  * See the License for the specific language governing permissions
11843e1988Sjohnlev  * and limitations under the License.
12843e1988Sjohnlev  *
13843e1988Sjohnlev  * When distributing Covered Code, include this CDDL HEADER in each
14843e1988Sjohnlev  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15843e1988Sjohnlev  * If applicable, add the following below this CDDL HEADER, with the
16843e1988Sjohnlev  * fields enclosed by brackets "[]" replaced with your own identifying
17843e1988Sjohnlev  * information: Portions Copyright [yyyy] [name of copyright owner]
18843e1988Sjohnlev  *
19843e1988Sjohnlev  * CDDL HEADER END
20843e1988Sjohnlev  */
21843e1988Sjohnlev 
22843e1988Sjohnlev /*
2356567907SDavid Edmondson  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24843e1988Sjohnlev  * Use is subject to license terms.
25843e1988Sjohnlev  */
26843e1988Sjohnlev 
27*9276b399SYuri Pankov /*
28*9276b399SYuri Pankov  * Copyright (c) 2014, 2017 by Delphix. All rights reserved.
29*9276b399SYuri Pankov  */
30*9276b399SYuri Pankov 
31843e1988Sjohnlev #ifndef _SYS_XNF_H
32843e1988Sjohnlev #define	_SYS_XNF_H
33843e1988Sjohnlev 
34843e1988Sjohnlev #ifdef __cplusplus
35843e1988Sjohnlev extern "C" {
36843e1988Sjohnlev #endif
37843e1988Sjohnlev 
38*9276b399SYuri Pankov /*
39*9276b399SYuri Pankov  * As of April 2017, TX and RX ring sizes are fixed to 1 page in
40*9276b399SYuri Pankov  * size and Xen doesn't support changing it.
41*9276b399SYuri Pankov  * This represents 256 entries.
42*9276b399SYuri Pankov  */
43876de206SRichard Lowe #define	NET_TX_RING_SIZE  __CONST_RING_SIZE(netif_tx, PAGESIZE)
44876de206SRichard Lowe #define	NET_RX_RING_SIZE  __CONST_RING_SIZE(netif_rx, PAGESIZE)
45843e1988Sjohnlev 
46*9276b399SYuri Pankov /*
47*9276b399SYuri Pankov  * There is no MTU limit, however for all practical purposes hardware won't
48*9276b399SYuri Pankov  * support anything much larger than 9k. We put an arbitrary 16k limit.
49*9276b399SYuri Pankov  */
50*9276b399SYuri Pankov #define	XNF_MAXPKT	16384
51843e1988Sjohnlev #define	XNF_FRAMESIZE	1514		/* frame size including MAC header */
52843e1988Sjohnlev 
53*9276b399SYuri Pankov /*
54*9276b399SYuri Pankov  * Based on XEN_NETIF_NR_SLOTS_MIN in Linux. Packets that span more pages
55*9276b399SYuri Pankov  * than this must be defragmented or dropped.
56*9276b399SYuri Pankov  */
57*9276b399SYuri Pankov #define	XEN_MAX_TX_DATA_PAGES	18
58*9276b399SYuri Pankov /*
59*9276b399SYuri Pankov  * We keep one extra slot for LSO
60*9276b399SYuri Pankov  */
61*9276b399SYuri Pankov #define	XEN_MAX_SLOTS_PER_TX	(XEN_MAX_TX_DATA_PAGES + 1)
62*9276b399SYuri Pankov 
63*9276b399SYuri Pankov #define	XEN_DATA_BOUNDARY	0x1000
64*9276b399SYuri Pankov 
6556567907SDavid Edmondson /*
6656567907SDavid Edmondson  * Information about each receive buffer and any transmit look-aside
6756567907SDavid Edmondson  * buffers.
6856567907SDavid Edmondson  */
6956567907SDavid Edmondson typedef struct xnf_buf {
7056567907SDavid Edmondson 	frtn_t			free_rtn;
71843e1988Sjohnlev 	struct xnf		*xnfp;
72843e1988Sjohnlev 	ddi_dma_handle_t	dma_handle;
73843e1988Sjohnlev 	caddr_t			buf;		/* DMA-able data buffer */
74843e1988Sjohnlev 	paddr_t			buf_phys;
7556567907SDavid Edmondson 	mfn_t			buf_mfn;
7656567907SDavid Edmondson 	size_t			len;
7756567907SDavid Edmondson 	struct xnf_buf		*next;	/* For linking into free list */
78843e1988Sjohnlev 	ddi_acc_handle_t	acc_handle;
79843e1988Sjohnlev 	grant_ref_t		grant_ref;	/* grant table reference */
80843e1988Sjohnlev 	uint16_t		id;		/* buffer id */
8156567907SDavid Edmondson 	unsigned int		gen;
8256567907SDavid Edmondson } xnf_buf_t;
83843e1988Sjohnlev 
8456567907SDavid Edmondson /*
8556567907SDavid Edmondson  * Information about each transmit buffer.
8656567907SDavid Edmondson  */
87*9276b399SYuri Pankov typedef enum xnf_txbuf_type {
88*9276b399SYuri Pankov 	TX_DATA = 1,
89*9276b399SYuri Pankov 	TX_MCAST_REQ,
90*9276b399SYuri Pankov 	TX_MCAST_RSP
91*9276b399SYuri Pankov } xnf_txbuf_type_t;
92*9276b399SYuri Pankov 
93*9276b399SYuri Pankov /*
94*9276b399SYuri Pankov  * A xnf_txbuf is used to store ancillary data for a netif_tx_request_t.
95*9276b399SYuri Pankov  * A tx packet can span multiple xnf_txbuf's, linked together through tx_next
96*9276b399SYuri Pankov  * and tx_prev; tx_head points to the head of the chain.
97*9276b399SYuri Pankov  */
9856567907SDavid Edmondson typedef struct xnf_txbuf {
9956567907SDavid Edmondson 	struct xnf_txbuf	*tx_next;
100*9276b399SYuri Pankov 	struct xnf_txbuf	*tx_prev;
101*9276b399SYuri Pankov 	struct xnf_txbuf	*tx_head;
102*9276b399SYuri Pankov 	xnf_txbuf_type_t	tx_type;
10356567907SDavid Edmondson 	netif_tx_request_t	tx_txreq;
104*9276b399SYuri Pankov 	netif_extra_info_t	tx_extra;
105*9276b399SYuri Pankov 	/* Used for TX_DATA types */
10656567907SDavid Edmondson 	ddi_dma_handle_t	tx_dma_handle;
107*9276b399SYuri Pankov 	boolean_t		tx_handle_bound;
108*9276b399SYuri Pankov 	mblk_t			*tx_mp;
10956567907SDavid Edmondson 	xnf_buf_t		*tx_bdesc; /* Look-aside buffer, if used. */
110*9276b399SYuri Pankov 	int			tx_frags_to_ack;
111*9276b399SYuri Pankov 	/* Used for TX_MCAST types */
11256567907SDavid Edmondson 	int16_t			tx_status;
113*9276b399SYuri Pankov 	/* Used for debugging */
114*9276b399SYuri Pankov 	mfn_t			tx_mfn;
11556567907SDavid Edmondson 	RING_IDX		tx_slot;
11656567907SDavid Edmondson } xnf_txbuf_t;
117843e1988Sjohnlev 
118*9276b399SYuri Pankov #define	TXBUF_SETNEXT(head, next)	\
119*9276b399SYuri Pankov 	head->tx_next = next;		\
120*9276b399SYuri Pankov 	next->tx_prev = head;
121*9276b399SYuri Pankov 
12256567907SDavid Edmondson /*
12356567907SDavid Edmondson  * Information about each outstanding transmit operation.
12456567907SDavid Edmondson  */
12556567907SDavid Edmondson typedef struct xnf_txid {
12656567907SDavid Edmondson 	uint16_t	id;	/* Id of this transmit buffer. */
12756567907SDavid Edmondson 	uint16_t	next;	/* Freelist of ids. */
12856567907SDavid Edmondson 	xnf_txbuf_t	*txbuf;	/* Buffer details. */
12956567907SDavid Edmondson } xnf_txid_t;
13056567907SDavid Edmondson 
13156567907SDavid Edmondson /*
13256567907SDavid Edmondson  * Per-instance data.
13356567907SDavid Edmondson  */
134843e1988Sjohnlev typedef struct xnf {
135843e1988Sjohnlev 	/* most interesting stuff first to assist debugging */
13656567907SDavid Edmondson 	dev_info_t		*xnf_devinfo;
13756567907SDavid Edmondson 	mac_handle_t		xnf_mh;
138551bc2a6Smrj 	unsigned char		xnf_mac_addr[ETHERADDRL];
139*9276b399SYuri Pankov 	uint32_t		xnf_mtu;
14056567907SDavid Edmondson 
14156567907SDavid Edmondson 	unsigned int		xnf_gen;	/* Increments on resume. */
142551bc2a6Smrj 
143551bc2a6Smrj 	boolean_t		xnf_connected;
144551bc2a6Smrj 	boolean_t		xnf_running;
145551bc2a6Smrj 
14656567907SDavid Edmondson 	boolean_t		xnf_be_rx_copy;
14756567907SDavid Edmondson 	boolean_t		xnf_be_mcast_control;
148*9276b399SYuri Pankov 	boolean_t		xnf_be_tx_sg;
149*9276b399SYuri Pankov 	boolean_t		xnf_be_lso;
150551bc2a6Smrj 
151551bc2a6Smrj 	uint64_t		xnf_stat_interrupts;
152551bc2a6Smrj 	uint64_t		xnf_stat_unclaimed_interrupts;
153551bc2a6Smrj 	uint64_t		xnf_stat_norxbuf;
154*9276b399SYuri Pankov 	uint64_t		xnf_stat_rx_drop;
155551bc2a6Smrj 	uint64_t		xnf_stat_errrx;
156551bc2a6Smrj 
157551bc2a6Smrj 	uint64_t		xnf_stat_tx_pullup;
158*9276b399SYuri Pankov 	uint64_t		xnf_stat_tx_lookaside;
159551bc2a6Smrj 	uint64_t		xnf_stat_tx_defer;
160*9276b399SYuri Pankov 	uint64_t		xnf_stat_tx_drop;
161*9276b399SYuri Pankov 	uint64_t		xnf_stat_tx_eth_hdr_split;
162551bc2a6Smrj 	uint64_t		xnf_stat_mac_rcv_error;
163551bc2a6Smrj 	uint64_t		xnf_stat_runt;
164551bc2a6Smrj 
165551bc2a6Smrj 	uint64_t		xnf_stat_ipackets;
166551bc2a6Smrj 	uint64_t		xnf_stat_opackets;
167551bc2a6Smrj 	uint64_t		xnf_stat_rbytes;
168551bc2a6Smrj 	uint64_t		xnf_stat_obytes;
169551bc2a6Smrj 
170551bc2a6Smrj 	uint64_t		xnf_stat_tx_cksum_deferred;
171551bc2a6Smrj 	uint64_t		xnf_stat_rx_cksum_no_need;
172551bc2a6Smrj 
17356567907SDavid Edmondson 	uint64_t		xnf_stat_buf_allocated;
17456567907SDavid Edmondson 	uint64_t		xnf_stat_buf_outstanding;
17556567907SDavid Edmondson 	uint64_t		xnf_stat_gref_outstanding;
17656567907SDavid Edmondson 	uint64_t		xnf_stat_gref_failure;
17756567907SDavid Edmondson 	uint64_t		xnf_stat_gref_peak;
17856567907SDavid Edmondson 	uint64_t		xnf_stat_rx_allocb_fail;
17956567907SDavid Edmondson 	uint64_t		xnf_stat_rx_desballoc_fail;
180551bc2a6Smrj 
18156567907SDavid Edmondson 	kstat_t			*xnf_kstat_aux;
182551bc2a6Smrj 
183551bc2a6Smrj 	ddi_iblock_cookie_t	xnf_icookie;
184551bc2a6Smrj 
18556567907SDavid Edmondson 	netif_tx_front_ring_t	xnf_tx_ring;
186551bc2a6Smrj 	ddi_dma_handle_t	xnf_tx_ring_dma_handle;
187551bc2a6Smrj 	ddi_acc_handle_t	xnf_tx_ring_dma_acchandle;
188551bc2a6Smrj 	paddr_t			xnf_tx_ring_phys_addr;
189551bc2a6Smrj 	grant_ref_t		xnf_tx_ring_ref;
190551bc2a6Smrj 
191*9276b399SYuri Pankov 	xnf_txid_t		*xnf_tx_pkt_id;
19256567907SDavid Edmondson 	uint16_t		xnf_tx_pkt_id_head;
19356567907SDavid Edmondson 	kmutex_t		xnf_txlock;
19456567907SDavid Edmondson 	kmutex_t		xnf_schedlock;
19556567907SDavid Edmondson 	boolean_t		xnf_need_sched;
19656567907SDavid Edmondson 	kcondvar_t		xnf_cv_tx_slots;
19756567907SDavid Edmondson 	kmem_cache_t		*xnf_tx_buf_cache;
19856567907SDavid Edmondson 
19956567907SDavid Edmondson 	netif_rx_front_ring_t	xnf_rx_ring;
200551bc2a6Smrj 	ddi_dma_handle_t	xnf_rx_ring_dma_handle;
201551bc2a6Smrj 	ddi_acc_handle_t	xnf_rx_ring_dma_acchandle;
202551bc2a6Smrj 	paddr_t			xnf_rx_ring_phys_addr;
203551bc2a6Smrj 	grant_ref_t		xnf_rx_ring_ref;
204551bc2a6Smrj 
205*9276b399SYuri Pankov 	xnf_buf_t		**xnf_rx_pkt_info;
20656567907SDavid Edmondson 	kmutex_t		xnf_rxlock;
20756567907SDavid Edmondson 	mblk_t			*xnf_rx_head;
20856567907SDavid Edmondson 	mblk_t			*xnf_rx_tail;
20956567907SDavid Edmondson 	boolean_t		xnf_rx_new_buffers_posted;
21056567907SDavid Edmondson 	kmem_cache_t		*xnf_buf_cache;
21156567907SDavid Edmondson 
21256567907SDavid Edmondson 	uint16_t		xnf_evtchn;
21356567907SDavid Edmondson 
21456567907SDavid Edmondson 	kmutex_t		xnf_gref_lock;
21556567907SDavid Edmondson 	grant_ref_t		xnf_gref_head;
216551bc2a6Smrj 
21756567907SDavid Edmondson 	kcondvar_t		xnf_cv_state;
21856567907SDavid Edmondson 	kcondvar_t		xnf_cv_multicast;
21956567907SDavid Edmondson 	uint_t			xnf_pending_multicast;
220843e1988Sjohnlev } xnf_t;
221843e1988Sjohnlev 
222843e1988Sjohnlev #ifdef __cplusplus
223843e1988Sjohnlev }
224843e1988Sjohnlev #endif
225843e1988Sjohnlev 
226843e1988Sjohnlev #endif	/* _SYS_XNF_H */
227