]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - sys/dev/hyperv/netvsc/if_hnvar.h
MFC 322488
[FreeBSD/stable/10.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 /* 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
52 struct hn_txdesc;
53 #ifndef HN_USE_TXDESC_BUFRING
54 SLIST_HEAD(hn_txdesc_list, hn_txdesc);
55 #else
56 struct buf_ring;
57 #endif
58 struct hn_tx_ring;
59
60 struct 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         int             hn_rx_flags;    /* HN_RX_FLAG_ */
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
101 struct hn_tx_ring {
102 #ifndef HN_USE_TXDESC_BUFRING
103         struct mtx      hn_txlist_spin;
104         struct hn_txdesc_list hn_txlist;
105 #else
106         struct buf_ring *hn_txdesc_br;
107 #endif
108         int             hn_txdesc_cnt;
109         int             hn_txdesc_avail;
110         u_short         hn_has_txeof;
111         u_short         hn_txdone_cnt;
112
113         int             hn_sched_tx;
114         void            (*hn_txeof)(struct hn_tx_ring *);
115         struct taskqueue *hn_tx_taskq;
116         struct task     hn_tx_task;
117         struct task     hn_txeof_task;
118
119         struct buf_ring *hn_mbuf_br;
120         int             hn_oactive;
121         int             hn_tx_idx;
122         int             hn_tx_flags;
123
124         struct mtx      hn_tx_lock;
125         struct hn_softc *hn_sc;
126         struct vmbus_channel *hn_chan;
127
128         int             hn_direct_tx_size;
129         int             hn_chim_size;
130         bus_dma_tag_t   hn_tx_data_dtag;
131         uint64_t        hn_csum_assist;
132
133         /* Applied packet transmission aggregation limits. */
134         int             hn_agg_szmax;
135         short           hn_agg_pktmax;
136         short           hn_agg_align;
137
138         /* Packet transmission aggregation states. */
139         struct hn_txdesc *hn_agg_txd;
140         int             hn_agg_szleft;
141         short           hn_agg_pktleft;
142         struct rndis_packet_msg *hn_agg_prevpkt;
143
144         /* Temporary stats for each sends. */
145         int             hn_stat_size;
146         short           hn_stat_pkts;
147         short           hn_stat_mcasts;
148
149         int             (*hn_sendpkt)(struct hn_tx_ring *, struct hn_txdesc *);
150         int             hn_suspended;
151         int             hn_gpa_cnt;
152         struct vmbus_gpa hn_gpa[HN_GPACNT_MAX];
153
154         u_long          hn_no_txdescs;
155         u_long          hn_send_failed;
156         u_long          hn_txdma_failed;
157         u_long          hn_tx_collapsed;
158         u_long          hn_tx_chimney_tried;
159         u_long          hn_tx_chimney;
160         u_long          hn_pkts;
161         u_long          hn_sends;
162         u_long          hn_flush_failed;
163
164         /* Rarely used stuffs */
165         struct hn_txdesc *hn_txdesc;
166         bus_dma_tag_t   hn_tx_rndis_dtag;
167         struct sysctl_oid *hn_tx_sysctl_tree;
168 } __aligned(CACHE_LINE_SIZE);
169
170 #define HN_TX_FLAG_ATTACHED     0x0001
171 #define HN_TX_FLAG_HASHVAL      0x0002  /* support HASHVAL pktinfo */
172
173 /*
174  * Device-specific softc structure
175  */
176 struct hn_softc {
177         struct ifnet    *hn_ifp;
178         struct arpcom   arpcom;
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;    /* NDIS_HASH_ */
243         struct ndis_rssprm_toeplitz hn_rss;
244
245         eventhandler_tag        hn_ifaddr_evthand;
246         eventhandler_tag        hn_ifnet_evthand;
247         eventhandler_tag        hn_ifnet_atthand;
248         eventhandler_tag        hn_ifnet_dethand;
249         eventhandler_tag        hn_ifnet_lnkhand;
250
251         /*
252          * Transparent VF delayed initialization.
253          */
254         int                     hn_vf_rdytick;  /* ticks, 0 == ready */
255         struct taskqueue        *hn_vf_taskq;
256         struct timeout_task     hn_vf_init;
257
258         /*
259          * Saved information for VF under transparent mode.
260          */
261         void                    (*hn_vf_input)
262                                 (struct ifnet *, struct mbuf *);
263         int                     hn_saved_caps;
264         u_int                   hn_saved_tsomax;
265         u_int                   hn_saved_tsosegcnt;
266         u_int                   hn_saved_tsosegsz;
267 };
268
269 #define HN_FLAG_RXBUF_CONNECTED         0x0001
270 #define HN_FLAG_CHIM_CONNECTED          0x0002
271 #define HN_FLAG_HAS_RSSKEY              0x0004
272 #define HN_FLAG_HAS_RSSIND              0x0008
273 #define HN_FLAG_SYNTH_ATTACHED          0x0010
274 #define HN_FLAG_NO_SLEEPING             0x0020
275 #define HN_FLAG_RXBUF_REF               0x0040
276 #define HN_FLAG_CHIM_REF                0x0080
277 #define HN_FLAG_RXVF                    0x0100
278
279 #define HN_FLAG_ERRORS                  (HN_FLAG_RXBUF_REF | HN_FLAG_CHIM_REF)
280
281 #define HN_XVFFLAG_ENABLED              0x0001
282 #define HN_XVFFLAG_ACCBPF               0x0002
283
284 #define HN_NO_SLEEPING(sc)                      \
285 do {                                            \
286         (sc)->hn_flags |= HN_FLAG_NO_SLEEPING;  \
287 } while (0)
288
289 #define HN_SLEEPING_OK(sc)                      \
290 do {                                            \
291         (sc)->hn_flags &= ~HN_FLAG_NO_SLEEPING; \
292 } while (0)
293
294 #define HN_CAN_SLEEP(sc)                \
295         (((sc)->hn_flags & HN_FLAG_NO_SLEEPING) == 0)
296
297 #define HN_CAP_VLAN                     0x0001
298 #define HN_CAP_MTU                      0x0002
299 #define HN_CAP_IPCS                     0x0004
300 #define HN_CAP_TCP4CS                   0x0008
301 #define HN_CAP_TCP6CS                   0x0010
302 #define HN_CAP_UDP4CS                   0x0020
303 #define HN_CAP_UDP6CS                   0x0040
304 #define HN_CAP_TSO4                     0x0080
305 #define HN_CAP_TSO6                     0x0100
306 #define HN_CAP_HASHVAL                  0x0200
307
308 /* Capability description for use with printf(9) %b identifier. */
309 #define HN_CAP_BITS                             \
310         "\020\1VLAN\2MTU\3IPCS\4TCP4CS\5TCP6CS" \
311         "\6UDP4CS\7UDP6CS\10TSO4\11TSO6\12HASHVAL"
312
313 #define HN_LINK_FLAG_LINKUP             0x0001
314 #define HN_LINK_FLAG_NETCHG             0x0002
315
316 #endif  /* !_IF_HNVAR_H_ */