xref: /freebsd/sys/dev/vmware/vmxnet3/if_vmxvar.h (revision 0d66206fff44f864ea8a4b220c3a53b4caa959a0)
1 /*-
2  * Copyright (c) 2013 Tsubai Masanari
3  * Copyright (c) 2013 Bryan Venteicher <bryanv@FreeBSD.org>
4  * Copyright (c) 2018 Patrick Kelsey
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  *
18  * $FreeBSD$
19  */
20 
21 #ifndef _IF_VMXVAR_H
22 #define _IF_VMXVAR_H
23 
24 struct vmxnet3_softc;
25 
26 /*
27  * The number of Rx/Tx queues this driver prefers.
28  */
29 #define VMXNET3_DEF_RX_QUEUES	8
30 #define VMXNET3_DEF_TX_QUEUES	8
31 
32 /*
33  * The number of Rx rings in each Rx queue.
34  */
35 #define VMXNET3_RXRINGS_PERQ	2
36 
37 /*
38  * The number of descriptors in each Rx/Tx ring.
39  */
40 #define VMXNET3_DEF_TX_NDESC		512
41 #define VMXNET3_MAX_TX_NDESC		4096
42 #define VMXNET3_MIN_TX_NDESC		32
43 #define VMXNET3_MASK_TX_NDESC		0x1F
44 #define VMXNET3_DEF_RX_NDESC		512
45 #define VMXNET3_MAX_RX_NDESC		2048
46 #define VMXNET3_MIN_RX_NDESC		32
47 #define VMXNET3_MASK_RX_NDESC		0x1F
48 
49 #define VMXNET3_MAX_TX_NCOMPDESC	VMXNET3_MAX_TX_NDESC
50 #define VMXNET3_MAX_RX_NCOMPDESC \
51     (VMXNET3_MAX_RX_NDESC * VMXNET3_RXRINGS_PERQ)
52 
53 struct vmxnet3_txring {
54 	u_int			 vxtxr_next;
55 	u_int			 vxtxr_ndesc;
56 	int			 vxtxr_gen;
57 	struct vmxnet3_txdesc	*vxtxr_txd;
58 	bus_addr_t		 vxtxr_paddr;
59 };
60 
61 struct vmxnet3_rxring {
62 	struct vmxnet3_rxdesc	*vxrxr_rxd;
63 	u_int			 vxrxr_ndesc;
64 	int			 vxrxr_gen;
65 	bus_addr_t		 vxrxr_paddr;
66 	uint64_t		 vxrxr_desc_skips;
67 	uint16_t		 vxrxr_refill_start;
68 };
69 
70 struct vmxnet3_comp_ring {
71 	union {
72 		struct vmxnet3_txcompdesc *txcd;
73 		struct vmxnet3_rxcompdesc *rxcd;
74 	}			 vxcr_u;
75 	/*
76 	 * vxcr_next is used on the transmit side to track the next index to
77 	 * begin cleaning at.  It is not used on the receive side.
78 	 */
79 	u_int			 vxcr_next;
80 	u_int			 vxcr_ndesc;
81 	int			 vxcr_gen;
82 	bus_addr_t		 vxcr_paddr;
83 	uint64_t		 vxcr_zero_length;
84 	uint64_t		 vcxr_zero_length_frag;
85 	uint64_t		 vxcr_pkt_errors;
86 };
87 
88 struct vmxnet3_txqueue {
89 	struct vmxnet3_softc		*vxtxq_sc;
90 	int				 vxtxq_id;
91 	int				 vxtxq_last_flush;
92 	int				 vxtxq_intr_idx;
93 	struct vmxnet3_txring		 vxtxq_cmd_ring;
94 	struct vmxnet3_comp_ring	 vxtxq_comp_ring;
95 	struct vmxnet3_txq_shared	*vxtxq_ts;
96 	struct sysctl_oid_list		*vxtxq_sysctl;
97 	char				 vxtxq_name[16];
98 } __aligned(CACHE_LINE_SIZE);
99 
100 struct vmxnet3_rxqueue {
101 	struct vmxnet3_softc		*vxrxq_sc;
102 	int				 vxrxq_id;
103 	int				 vxrxq_intr_idx;
104 	struct if_irq			 vxrxq_irq;
105 	struct vmxnet3_rxring		 vxrxq_cmd_ring[VMXNET3_RXRINGS_PERQ];
106 	struct vmxnet3_comp_ring	 vxrxq_comp_ring;
107 	struct vmxnet3_rxq_shared	*vxrxq_rs;
108 	struct sysctl_oid_list		*vxrxq_sysctl;
109 	char				 vxrxq_name[16];
110 } __aligned(CACHE_LINE_SIZE);
111 
112 struct vmxnet3_softc {
113 	device_t			 vmx_dev;
114 	if_ctx_t			 vmx_ctx;
115 	if_shared_ctx_t			 vmx_sctx;
116 	if_softc_ctx_t			 vmx_scctx;
117 	if_t				 vmx_ifp;
118 	struct vmxnet3_driver_shared	*vmx_ds;
119 	uint32_t			 vmx_flags;
120 #define VMXNET3_FLAG_RSS	0x0002
121 #define VMXNET3_FLAG_SOFT_RSS	0x0004		/* Software RSS is enabled with
122 						   compatible algorithm. */
123 
124 	struct vmxnet3_rxqueue		*vmx_rxq;
125 	struct vmxnet3_txqueue		*vmx_txq;
126 
127 	struct resource			*vmx_res0;
128 	bus_space_tag_t			 vmx_iot0;
129 	bus_space_handle_t		 vmx_ioh0;
130 	struct resource			*vmx_res1;
131 	bus_space_tag_t			 vmx_iot1;
132 	bus_space_handle_t		 vmx_ioh1;
133 
134 	int				 vmx_link_active;
135 
136 	int				 vmx_intr_mask_mode;
137 	int				 vmx_event_intr_idx;
138 	struct if_irq			 vmx_event_intr_irq;
139 
140 	uint8_t				*vmx_mcast;
141 	struct vmxnet3_rss_shared	*vmx_rss;
142 	struct iflib_dma_info		 vmx_ds_dma;
143 	struct iflib_dma_info		 vmx_qs_dma;
144 	struct iflib_dma_info		 vmx_mcast_dma;
145 	struct iflib_dma_info		 vmx_rss_dma;
146 	struct ifmedia			*vmx_media;
147 	uint32_t			 vmx_vlan_filter[4096/32];
148 	uint8_t				 vmx_lladdr[ETHER_ADDR_LEN];
149 };
150 
151 /*
152  * Our driver version we report to the hypervisor; we just keep
153  * this value constant.
154  */
155 #define VMXNET3_DRIVER_VERSION 0x00010000
156 
157 /*
158  * Max descriptors per Tx packet. We must limit the size of the
159  * any TSO packets based on the number of segments.
160  */
161 #define VMXNET3_TX_MAXSEGS		32  /* 64K @ 2K segment size */
162 #define VMXNET3_TX_MAXSIZE		(VMXNET3_TX_MAXSEGS * MCLBYTES)
163 #define VMXNET3_TSO_MAXSIZE		(VMXNET3_TX_MAXSIZE - ETHER_VLAN_ENCAP_LEN)
164 
165 /*
166  * Maximum supported Tx segment size. The length field in the
167  * Tx descriptor is 14 bits.
168  *
169  * XXX It's possible a descriptor length field of 0 means 2^14, but this
170  * isn't confirmed, so limit to 2^14 - 1 for now.
171  */
172 #define VMXNET3_TX_MAXSEGSIZE		((1 << 14) - 1)
173 
174 /*
175  * Maximum supported Rx segment size. The length field in the
176  * Rx descriptor is 14 bits.
177  *
178  * The reference drivers skip zero-length descriptors, which seems to be a
179  * strong indication that on the receive side, a descriptor length field of
180  * zero does not mean 2^14.
181  */
182 #define VMXNET3_RX_MAXSEGSIZE		((1 << 14) - 1)
183 
184 /*
185  * Predetermined size of the multicast MACs filter table. If the
186  * number of multicast addresses exceeds this size, then the
187  * ALL_MULTI mode is use instead.
188  */
189 #define VMXNET3_MULTICAST_MAX		32
190 
191 /*
192  * IP protocols that we can perform Tx checksum offloading of.
193  */
194 #define VMXNET3_CSUM_OFFLOAD		(CSUM_TCP | CSUM_UDP)
195 #define VMXNET3_CSUM_OFFLOAD_IPV6	(CSUM_TCP_IPV6 | CSUM_UDP_IPV6)
196 
197 #define VMXNET3_CSUM_ALL_OFFLOAD	\
198     (VMXNET3_CSUM_OFFLOAD | VMXNET3_CSUM_OFFLOAD_IPV6 | CSUM_TSO)
199 
200 #endif /* _IF_VMXVAR_H */
201