]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/hyperv/netvsc/if_hnvar.h
MFV r316901:
[FreeBSD/FreeBSD.git] / sys / dev / hyperv / netvsc / if_hnvar.h
1 /*-
2  * Copyright (c) 2016-2017 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$
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 #define HN_MTU_MAX                      (65535 - ETHER_ADDR_LEN)
40
41 #define HN_TXBR_SIZE                    (128 * PAGE_SIZE)
42 #define HN_RXBR_SIZE                    (128 * PAGE_SIZE)
43
44 #define HN_XACT_REQ_PGCNT               2
45 #define HN_XACT_RESP_PGCNT              2
46 #define HN_XACT_REQ_SIZE                (HN_XACT_REQ_PGCNT * PAGE_SIZE)
47 #define HN_XACT_RESP_SIZE               (HN_XACT_RESP_PGCNT * PAGE_SIZE)
48
49 #define HN_GPACNT_MAX                   32
50
51 struct hn_txdesc;
52 #ifndef HN_USE_TXDESC_BUFRING
53 SLIST_HEAD(hn_txdesc_list, hn_txdesc);
54 #else
55 struct buf_ring;
56 #endif
57 struct hn_tx_ring;
58
59 struct hn_rx_ring {
60         struct ifnet    *hn_ifp;
61         struct ifnet    *hn_rxvf_ifp;   /* SR-IOV VF for RX */
62         struct hn_tx_ring *hn_txr;
63         void            *hn_pktbuf;
64         int             hn_pktbuf_len;
65         int             hn_rx_flags;    /* HN_RX_FLAG_ */
66         uint32_t        hn_mbuf_hash;   /* NDIS_HASH_ */
67         uint8_t         *hn_rxbuf;      /* shadow sc->hn_rxbuf */
68         int             hn_rx_idx;
69
70         /* Trust csum verification on host side */
71         int             hn_trust_hcsum; /* HN_TRUST_HCSUM_ */
72         struct lro_ctrl hn_lro;
73
74         u_long          hn_csum_ip;
75         u_long          hn_csum_tcp;
76         u_long          hn_csum_udp;
77         u_long          hn_csum_trusted;
78         u_long          hn_lro_tried;
79         u_long          hn_small_pkts;
80         u_long          hn_pkts;
81         u_long          hn_rss_pkts;
82         u_long          hn_ack_failed;
83
84         /* Rarely used stuffs */
85         struct sysctl_oid *hn_rx_sysctl_tree;
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 #define HN_RX_FLAG_XPNT_VF      0x0004
100 #define HN_RX_FLAG_UDP_HASH     0x0008
101
102 struct hn_tx_ring {
103 #ifndef HN_USE_TXDESC_BUFRING
104         struct mtx      hn_txlist_spin;
105         struct hn_txdesc_list hn_txlist;
106 #else
107         struct buf_ring *hn_txdesc_br;
108 #endif
109         int             hn_txdesc_cnt;
110         int             hn_txdesc_avail;
111         u_short         hn_has_txeof;
112         u_short         hn_txdone_cnt;
113
114         int             hn_sched_tx;
115         void            (*hn_txeof)(struct hn_tx_ring *);
116         struct taskqueue *hn_tx_taskq;
117         struct task     hn_tx_task;
118         struct task     hn_txeof_task;
119
120         struct buf_ring *hn_mbuf_br;
121         int             hn_oactive;
122         int             hn_tx_idx;
123         int             hn_tx_flags;
124
125         struct mtx      hn_tx_lock;
126         struct hn_softc *hn_sc;
127         struct vmbus_channel *hn_chan;
128
129         int             hn_direct_tx_size;
130         int             hn_chim_size;
131         bus_dma_tag_t   hn_tx_data_dtag;
132         uint64_t        hn_csum_assist;
133
134         /* Applied packet transmission aggregation limits. */
135         int             hn_agg_szmax;
136         short           hn_agg_pktmax;
137         short           hn_agg_align;
138
139         /* Packet transmission aggregation states. */
140         struct hn_txdesc *hn_agg_txd;
141         int             hn_agg_szleft;
142         short           hn_agg_pktleft;
143         struct rndis_packet_msg *hn_agg_prevpkt;
144
145         /* Temporary stats for each sends. */
146         int             hn_stat_size;
147         short           hn_stat_pkts;
148         short           hn_stat_mcasts;
149
150         int             (*hn_sendpkt)(struct hn_tx_ring *, struct hn_txdesc *);
151         int             hn_suspended;
152         int             hn_gpa_cnt;
153         struct vmbus_gpa hn_gpa[HN_GPACNT_MAX];
154
155         u_long          hn_no_txdescs;
156         u_long          hn_send_failed;
157         u_long          hn_txdma_failed;
158         u_long          hn_tx_collapsed;
159         u_long          hn_tx_chimney_tried;
160         u_long          hn_tx_chimney;
161         u_long          hn_pkts;
162         u_long          hn_sends;
163         u_long          hn_flush_failed;
164
165         /* Rarely used stuffs */
166         struct hn_txdesc *hn_txdesc;
167         bus_dma_tag_t   hn_tx_rndis_dtag;
168         struct sysctl_oid *hn_tx_sysctl_tree;
169 } __aligned(CACHE_LINE_SIZE);
170
171 #define HN_TX_FLAG_ATTACHED     0x0001
172 #define HN_TX_FLAG_HASHVAL      0x0002  /* support HASHVAL pktinfo */
173
174 /*
175  * Device-specific softc structure
176  */
177 struct hn_softc {
178         struct ifnet    *hn_ifp;
179         struct ifmedia  hn_media;
180         device_t        hn_dev;
181         int             hn_if_flags;
182         struct sx       hn_lock;
183         struct vmbus_channel *hn_prichan;
184
185         int             hn_rx_ring_cnt;
186         int             hn_rx_ring_inuse;
187         struct hn_rx_ring *hn_rx_ring;
188
189         struct rmlock   hn_vf_lock;
190         struct ifnet    *hn_vf_ifp;     /* SR-IOV VF */
191         uint32_t        hn_xvf_flags;   /* transparent VF flags */
192
193         int             hn_tx_ring_cnt;
194         int             hn_tx_ring_inuse;
195         struct hn_tx_ring *hn_tx_ring;
196
197         uint8_t         *hn_chim;
198         u_long          *hn_chim_bmap;
199         int             hn_chim_bmap_cnt;
200         int             hn_chim_cnt;
201         int             hn_chim_szmax;
202
203         int             hn_cpu;
204         struct taskqueue **hn_tx_taskqs;
205         struct sysctl_oid *hn_tx_sysctl_tree;
206         struct sysctl_oid *hn_rx_sysctl_tree;
207         struct vmbus_xact_ctx *hn_xact;
208         uint32_t        hn_nvs_ver;
209         uint32_t        hn_rx_filter;
210
211         /* Packet transmission aggregation user settings. */
212         int                     hn_agg_size;
213         int                     hn_agg_pkts;
214
215         struct taskqueue        *hn_mgmt_taskq;
216         struct taskqueue        *hn_mgmt_taskq0;
217         struct task             hn_link_task;
218         struct task             hn_netchg_init;
219         struct timeout_task     hn_netchg_status;
220         uint32_t                hn_link_flags;  /* HN_LINK_FLAG_ */
221
222         uint32_t                hn_caps;        /* HN_CAP_ */
223         uint32_t                hn_flags;       /* HN_FLAG_ */
224         u_int                   hn_pollhz;
225
226         void                    *hn_rxbuf;
227         uint32_t                hn_rxbuf_gpadl;
228         struct hyperv_dma       hn_rxbuf_dma;
229
230         uint32_t                hn_chim_gpadl;
231         struct hyperv_dma       hn_chim_dma;
232
233         uint32_t                hn_rndis_rid;
234         uint32_t                hn_ndis_ver;
235         int                     hn_ndis_tso_szmax;
236         int                     hn_ndis_tso_sgmin;
237         uint32_t                hn_rndis_agg_size;
238         uint32_t                hn_rndis_agg_pkts;
239         uint32_t                hn_rndis_agg_align;
240
241         int                     hn_rss_ind_size;
242         uint32_t                hn_rss_hash;    /* setting, NDIS_HASH_ */
243         uint32_t                hn_rss_hcap;    /* caps, NDIS_HASH_ */
244         struct ndis_rssprm_toeplitz hn_rss;
245
246         eventhandler_tag        hn_ifaddr_evthand;
247         eventhandler_tag        hn_ifnet_evthand;
248         eventhandler_tag        hn_ifnet_atthand;
249         eventhandler_tag        hn_ifnet_dethand;
250         eventhandler_tag        hn_ifnet_lnkhand;
251
252         /*
253          * Transparent VF delayed initialization.
254          */
255         int                     hn_vf_rdytick;  /* ticks, 0 == ready */
256         struct taskqueue        *hn_vf_taskq;
257         struct timeout_task     hn_vf_init;
258
259         /*
260          * Saved information for VF under transparent mode.
261          */
262         void                    (*hn_vf_input)
263                                 (struct ifnet *, struct mbuf *);
264         int                     hn_saved_caps;
265         u_int                   hn_saved_tsomax;
266         u_int                   hn_saved_tsosegcnt;
267         u_int                   hn_saved_tsosegsz;
268 };
269
270 #define HN_FLAG_RXBUF_CONNECTED         0x0001
271 #define HN_FLAG_CHIM_CONNECTED          0x0002
272 #define HN_FLAG_HAS_RSSKEY              0x0004
273 #define HN_FLAG_HAS_RSSIND              0x0008
274 #define HN_FLAG_SYNTH_ATTACHED          0x0010
275 #define HN_FLAG_NO_SLEEPING             0x0020
276 #define HN_FLAG_RXBUF_REF               0x0040
277 #define HN_FLAG_CHIM_REF                0x0080
278 #define HN_FLAG_RXVF                    0x0100
279
280 #define HN_FLAG_ERRORS                  (HN_FLAG_RXBUF_REF | HN_FLAG_CHIM_REF)
281
282 #define HN_XVFFLAG_ENABLED              0x0001
283 #define HN_XVFFLAG_ACCBPF               0x0002
284
285 #define HN_NO_SLEEPING(sc)                      \
286 do {                                            \
287         (sc)->hn_flags |= HN_FLAG_NO_SLEEPING;  \
288 } while (0)
289
290 #define HN_SLEEPING_OK(sc)                      \
291 do {                                            \
292         (sc)->hn_flags &= ~HN_FLAG_NO_SLEEPING; \
293 } while (0)
294
295 #define HN_CAN_SLEEP(sc)                \
296         (((sc)->hn_flags & HN_FLAG_NO_SLEEPING) == 0)
297
298 #define HN_CAP_VLAN                     0x0001
299 #define HN_CAP_MTU                      0x0002
300 #define HN_CAP_IPCS                     0x0004
301 #define HN_CAP_TCP4CS                   0x0008
302 #define HN_CAP_TCP6CS                   0x0010
303 #define HN_CAP_UDP4CS                   0x0020
304 #define HN_CAP_UDP6CS                   0x0040
305 #define HN_CAP_TSO4                     0x0080
306 #define HN_CAP_TSO6                     0x0100
307 #define HN_CAP_HASHVAL                  0x0200
308 #define HN_CAP_UDPHASH                  0x0400
309
310 /* Capability description for use with printf(9) %b identifier. */
311 #define HN_CAP_BITS                             \
312         "\020\1VLAN\2MTU\3IPCS\4TCP4CS\5TCP6CS" \
313         "\6UDP4CS\7UDP6CS\10TSO4\11TSO6\12HASHVAL\13UDPHASH"
314
315 #define HN_LINK_FLAG_LINKUP             0x0001
316 #define HN_LINK_FLAG_NETCHG             0x0002
317
318 #endif  /* !_IF_HNVAR_H_ */