if_hnvar.h revision 322135
1/*-
2 * Copyright (c) 2016 Microsoft Corp.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice unmodified, this list of conditions, and the following
10 *    disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 *
26 * $FreeBSD: stable/11/sys/dev/hyperv/netvsc/if_hnvar.h 322135 2017-08-07 03:03:40Z sephe $
27 */
28
29#ifndef _IF_HNVAR_H_
30#define _IF_HNVAR_H_
31
32#define HN_USE_TXDESC_BUFRING
33
34#define HN_CHIM_SIZE			(15 * 1024 * 1024)
35
36#define HN_RXBUF_SIZE			(16 * 1024 * 1024)
37#define HN_RXBUF_SIZE_COMPAT		(15 * 1024 * 1024)
38
39/* Claimed to be 12232B */
40#define HN_MTU_MAX			(9 * 1024)
41
42#define HN_TXBR_SIZE			(128 * PAGE_SIZE)
43#define HN_RXBR_SIZE			(128 * PAGE_SIZE)
44
45#define HN_XACT_REQ_PGCNT		2
46#define HN_XACT_RESP_PGCNT		2
47#define HN_XACT_REQ_SIZE		(HN_XACT_REQ_PGCNT * PAGE_SIZE)
48#define HN_XACT_RESP_SIZE		(HN_XACT_RESP_PGCNT * PAGE_SIZE)
49
50#define HN_GPACNT_MAX			32
51
52struct hn_txdesc;
53#ifndef HN_USE_TXDESC_BUFRING
54SLIST_HEAD(hn_txdesc_list, hn_txdesc);
55#else
56struct buf_ring;
57#endif
58struct hn_tx_ring;
59
60struct hn_rx_ring {
61	struct ifnet	*hn_ifp;
62	struct ifnet	*hn_rxvf_ifp;	/* SR-IOV VF for RX */
63	struct hn_tx_ring *hn_txr;
64	void		*hn_pktbuf;
65	int		hn_pktbuf_len;
66	uint8_t		*hn_rxbuf;	/* shadow sc->hn_rxbuf */
67	int		hn_rx_idx;
68
69	/* Trust csum verification on host side */
70	int		hn_trust_hcsum;	/* HN_TRUST_HCSUM_ */
71	struct lro_ctrl	hn_lro;
72
73	u_long		hn_csum_ip;
74	u_long		hn_csum_tcp;
75	u_long		hn_csum_udp;
76	u_long		hn_csum_trusted;
77	u_long		hn_lro_tried;
78	u_long		hn_small_pkts;
79	u_long		hn_pkts;
80	u_long		hn_rss_pkts;
81	u_long		hn_ack_failed;
82
83	/* Rarely used stuffs */
84	struct sysctl_oid *hn_rx_sysctl_tree;
85	int		hn_rx_flags;
86
87	void		*hn_br;		/* TX/RX bufring */
88	struct hyperv_dma hn_br_dma;
89
90	struct vmbus_channel *hn_chan;
91} __aligned(CACHE_LINE_SIZE);
92
93#define HN_TRUST_HCSUM_IP	0x0001
94#define HN_TRUST_HCSUM_TCP	0x0002
95#define HN_TRUST_HCSUM_UDP	0x0004
96
97#define HN_RX_FLAG_ATTACHED	0x0001
98#define HN_RX_FLAG_BR_REF	0x0002
99
100struct hn_tx_ring {
101#ifndef HN_USE_TXDESC_BUFRING
102	struct mtx	hn_txlist_spin;
103	struct hn_txdesc_list hn_txlist;
104#else
105	struct buf_ring	*hn_txdesc_br;
106#endif
107	int		hn_txdesc_cnt;
108	int		hn_txdesc_avail;
109	u_short		hn_has_txeof;
110	u_short		hn_txdone_cnt;
111
112	int		hn_sched_tx;
113	void		(*hn_txeof)(struct hn_tx_ring *);
114	struct taskqueue *hn_tx_taskq;
115	struct task	hn_tx_task;
116	struct task	hn_txeof_task;
117
118	struct buf_ring	*hn_mbuf_br;
119	int		hn_oactive;
120	int		hn_tx_idx;
121	int		hn_tx_flags;
122
123	struct mtx	hn_tx_lock;
124	struct hn_softc	*hn_sc;
125	struct vmbus_channel *hn_chan;
126
127	int		hn_direct_tx_size;
128	int		hn_chim_size;
129	bus_dma_tag_t	hn_tx_data_dtag;
130	uint64_t	hn_csum_assist;
131
132	/* Applied packet transmission aggregation limits. */
133	int		hn_agg_szmax;
134	short		hn_agg_pktmax;
135	short		hn_agg_align;
136
137	/* Packet transmission aggregation states. */
138	struct hn_txdesc *hn_agg_txd;
139	int		hn_agg_szleft;
140	short		hn_agg_pktleft;
141	struct rndis_packet_msg *hn_agg_prevpkt;
142
143	/* Temporary stats for each sends. */
144	int		hn_stat_size;
145	short		hn_stat_pkts;
146	short		hn_stat_mcasts;
147
148	int		(*hn_sendpkt)(struct hn_tx_ring *, struct hn_txdesc *);
149	int		hn_suspended;
150	int		hn_gpa_cnt;
151	struct vmbus_gpa hn_gpa[HN_GPACNT_MAX];
152
153	u_long		hn_no_txdescs;
154	u_long		hn_send_failed;
155	u_long		hn_txdma_failed;
156	u_long		hn_tx_collapsed;
157	u_long		hn_tx_chimney_tried;
158	u_long		hn_tx_chimney;
159	u_long		hn_pkts;
160	u_long		hn_sends;
161	u_long		hn_flush_failed;
162
163	/* Rarely used stuffs */
164	struct hn_txdesc *hn_txdesc;
165	bus_dma_tag_t	hn_tx_rndis_dtag;
166	struct sysctl_oid *hn_tx_sysctl_tree;
167} __aligned(CACHE_LINE_SIZE);
168
169#define HN_TX_FLAG_ATTACHED	0x0001
170#define HN_TX_FLAG_HASHVAL	0x0002	/* support HASHVAL pktinfo */
171
172/*
173 * Device-specific softc structure
174 */
175struct hn_softc {
176	struct ifnet    *hn_ifp;
177	struct ifnet	*hn_vf_ifp;	/* SR-IOV VF */
178	struct ifmedia	hn_media;
179	device_t        hn_dev;
180	int             hn_if_flags;
181	struct sx	hn_lock;
182	struct vmbus_channel *hn_prichan;
183
184	int		hn_rx_ring_cnt;
185	int		hn_rx_ring_inuse;
186	struct hn_rx_ring *hn_rx_ring;
187
188	int		hn_tx_ring_cnt;
189	int		hn_tx_ring_inuse;
190	struct hn_tx_ring *hn_tx_ring;
191
192	uint8_t		*hn_chim;
193	u_long		*hn_chim_bmap;
194	int		hn_chim_bmap_cnt;
195	int		hn_chim_cnt;
196	int		hn_chim_szmax;
197
198	int		hn_cpu;
199	struct taskqueue **hn_tx_taskqs;
200	struct sysctl_oid *hn_tx_sysctl_tree;
201	struct sysctl_oid *hn_rx_sysctl_tree;
202	struct vmbus_xact_ctx *hn_xact;
203	uint32_t	hn_nvs_ver;
204	uint32_t	hn_rx_filter;
205
206	/* Packet transmission aggregation user settings. */
207	int			hn_agg_size;
208	int			hn_agg_pkts;
209
210	struct taskqueue	*hn_mgmt_taskq;
211	struct taskqueue	*hn_mgmt_taskq0;
212	struct task		hn_link_task;
213	struct task		hn_netchg_init;
214	struct timeout_task	hn_netchg_status;
215	uint32_t		hn_link_flags;	/* HN_LINK_FLAG_ */
216
217	uint32_t		hn_caps;	/* HN_CAP_ */
218	uint32_t		hn_flags;	/* HN_FLAG_ */
219	u_int			hn_pollhz;
220
221	void			*hn_rxbuf;
222	uint32_t		hn_rxbuf_gpadl;
223	struct hyperv_dma	hn_rxbuf_dma;
224
225	uint32_t		hn_chim_gpadl;
226	struct hyperv_dma	hn_chim_dma;
227
228	uint32_t		hn_rndis_rid;
229	uint32_t		hn_ndis_ver;
230	int			hn_ndis_tso_szmax;
231	int			hn_ndis_tso_sgmin;
232	uint32_t		hn_rndis_agg_size;
233	uint32_t		hn_rndis_agg_pkts;
234	uint32_t		hn_rndis_agg_align;
235
236	int			hn_rss_ind_size;
237	uint32_t		hn_rss_hash;	/* NDIS_HASH_ */
238	struct ndis_rssprm_toeplitz hn_rss;
239
240	eventhandler_tag	hn_ifaddr_evthand;
241	eventhandler_tag	hn_ifnet_evthand;
242	eventhandler_tag	hn_ifnet_atthand;
243	eventhandler_tag	hn_ifnet_dethand;
244};
245
246#define HN_FLAG_RXBUF_CONNECTED		0x0001
247#define HN_FLAG_CHIM_CONNECTED		0x0002
248#define HN_FLAG_HAS_RSSKEY		0x0004
249#define HN_FLAG_HAS_RSSIND		0x0008
250#define HN_FLAG_SYNTH_ATTACHED		0x0010
251#define HN_FLAG_NO_SLEEPING		0x0020
252#define HN_FLAG_RXBUF_REF		0x0040
253#define HN_FLAG_CHIM_REF		0x0080
254#define HN_FLAG_RXVF			0x0100
255
256#define HN_FLAG_ERRORS			(HN_FLAG_RXBUF_REF | HN_FLAG_CHIM_REF)
257
258#define HN_NO_SLEEPING(sc)			\
259do {						\
260	(sc)->hn_flags |= HN_FLAG_NO_SLEEPING;	\
261} while (0)
262
263#define HN_SLEEPING_OK(sc)			\
264do {						\
265	(sc)->hn_flags &= ~HN_FLAG_NO_SLEEPING;	\
266} while (0)
267
268#define HN_CAN_SLEEP(sc)		\
269	(((sc)->hn_flags & HN_FLAG_NO_SLEEPING) == 0)
270
271#define HN_CAP_VLAN			0x0001
272#define HN_CAP_MTU			0x0002
273#define HN_CAP_IPCS			0x0004
274#define HN_CAP_TCP4CS			0x0008
275#define HN_CAP_TCP6CS			0x0010
276#define HN_CAP_UDP4CS			0x0020
277#define HN_CAP_UDP6CS			0x0040
278#define HN_CAP_TSO4			0x0080
279#define HN_CAP_TSO6			0x0100
280#define HN_CAP_HASHVAL			0x0200
281
282/* Capability description for use with printf(9) %b identifier. */
283#define HN_CAP_BITS				\
284	"\020\1VLAN\2MTU\3IPCS\4TCP4CS\5TCP6CS"	\
285	"\6UDP4CS\7UDP6CS\10TSO4\11TSO6\12HASHVAL"
286
287#define HN_LINK_FLAG_LINKUP		0x0001
288#define HN_LINK_FLAG_NETCHG		0x0002
289
290#endif	/* !_IF_HNVAR_H_ */
291