]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c
hyperv: hv_guid -> struct hyperv_guid.
[FreeBSD/FreeBSD.git] / sys / dev / hyperv / netvsc / hv_netvsc_drv_freebsd.c
1 /*-
2  * Copyright (c) 2010-2012 Citrix Inc.
3  * Copyright (c) 2009-2012,2016 Microsoft Corp.
4  * Copyright (c) 2012 NetApp Inc.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice unmodified, this list of conditions, and the following
12  *    disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 /*-
30  * Copyright (c) 2004-2006 Kip Macy
31  * All rights reserved.
32  *
33  * Redistribution and use in source and binary forms, with or without
34  * modification, are permitted provided that the following conditions
35  * are met:
36  * 1. Redistributions of source code must retain the above copyright
37  *    notice, this list of conditions and the following disclaimer.
38  * 2. Redistributions in binary form must reproduce the above copyright
39  *    notice, this list of conditions and the following disclaimer in the
40  *    documentation and/or other materials provided with the distribution.
41  *
42  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
43  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
44  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
45  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
46  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
47  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
48  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
49  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
50  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
51  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
52  * SUCH DAMAGE.
53  */
54
55 #include <sys/cdefs.h>
56 __FBSDID("$FreeBSD$");
57
58 #include "opt_inet6.h"
59 #include "opt_inet.h"
60
61 #include <sys/param.h>
62 #include <sys/systm.h>
63 #include <sys/sockio.h>
64 #include <sys/mbuf.h>
65 #include <sys/malloc.h>
66 #include <sys/module.h>
67 #include <sys/kernel.h>
68 #include <sys/socket.h>
69 #include <sys/queue.h>
70 #include <sys/lock.h>
71 #include <sys/sx.h>
72 #include <sys/sysctl.h>
73 #include <sys/buf_ring.h>
74
75 #include <net/if.h>
76 #include <net/if_arp.h>
77 #include <net/ethernet.h>
78 #include <net/if_dl.h>
79 #include <net/if_media.h>
80
81 #include <net/bpf.h>
82
83 #include <net/if_var.h>
84 #include <net/if_types.h>
85 #include <net/if_vlan_var.h>
86
87 #include <netinet/in_systm.h>
88 #include <netinet/in.h>
89 #include <netinet/ip.h>
90 #include <netinet/if_ether.h>
91 #include <netinet/tcp.h>
92 #include <netinet/udp.h>
93 #include <netinet/ip6.h>
94
95 #include <vm/vm.h>
96 #include <vm/vm_param.h>
97 #include <vm/vm_kern.h>
98 #include <vm/pmap.h>
99
100 #include <machine/bus.h>
101 #include <machine/resource.h>
102 #include <machine/frame.h>
103
104 #include <sys/bus.h>
105 #include <sys/rman.h>
106 #include <sys/mutex.h>
107 #include <sys/errno.h>
108 #include <sys/types.h>
109 #include <machine/atomic.h>
110
111 #include <machine/intr_machdep.h>
112
113 #include <machine/in_cksum.h>
114
115 #include <dev/hyperv/include/hyperv.h>
116 #include <dev/hyperv/include/hyperv_busdma.h>
117
118 #include "hv_net_vsc.h"
119 #include "hv_rndis.h"
120 #include "hv_rndis_filter.h"
121 #include "vmbus_if.h"
122
123 #define hv_chan_rxr     hv_chan_priv1
124 #define hv_chan_txr     hv_chan_priv2
125
126 /* Short for Hyper-V network interface */
127 #define NETVSC_DEVNAME    "hn"
128
129 /*
130  * It looks like offset 0 of buf is reserved to hold the softc pointer.
131  * The sc pointer evidently not needed, and is not presently populated.
132  * The packet offset is where the netvsc_packet starts in the buffer.
133  */
134 #define HV_NV_SC_PTR_OFFSET_IN_BUF         0
135 #define HV_NV_PACKET_OFFSET_IN_BUF         16
136
137 /* YYY should get it from the underlying channel */
138 #define HN_TX_DESC_CNT                  512
139
140 #define HN_LROENT_CNT_DEF               128
141
142 #define HN_RING_CNT_DEF_MAX             8
143
144 #define HN_RNDIS_MSG_LEN                \
145     (sizeof(rndis_msg) +                \
146      RNDIS_HASHVAL_PPI_SIZE +           \
147      RNDIS_VLAN_PPI_SIZE +              \
148      RNDIS_TSO_PPI_SIZE +               \
149      RNDIS_CSUM_PPI_SIZE)
150 #define HN_RNDIS_MSG_BOUNDARY           PAGE_SIZE
151 #define HN_RNDIS_MSG_ALIGN              CACHE_LINE_SIZE
152
153 #define HN_TX_DATA_BOUNDARY             PAGE_SIZE
154 #define HN_TX_DATA_MAXSIZE              IP_MAXPACKET
155 #define HN_TX_DATA_SEGSIZE              PAGE_SIZE
156 #define HN_TX_DATA_SEGCNT_MAX           \
157     (NETVSC_PACKET_MAXPAGE - HV_RF_NUM_TX_RESERVED_PAGE_BUFS)
158
159 #define HN_DIRECT_TX_SIZE_DEF           128
160
161 #define HN_EARLY_TXEOF_THRESH           8
162
163 struct hn_txdesc {
164 #ifndef HN_USE_TXDESC_BUFRING
165         SLIST_ENTRY(hn_txdesc) link;
166 #endif
167         struct mbuf     *m;
168         struct hn_tx_ring *txr;
169         int             refs;
170         uint32_t        flags;          /* HN_TXD_FLAG_ */
171         netvsc_packet   netvsc_pkt;     /* XXX to be removed */
172
173         bus_dmamap_t    data_dmap;
174
175         bus_addr_t      rndis_msg_paddr;
176         rndis_msg       *rndis_msg;
177         bus_dmamap_t    rndis_msg_dmap;
178 };
179
180 #define HN_TXD_FLAG_ONLIST      0x1
181 #define HN_TXD_FLAG_DMAMAP      0x2
182
183 /*
184  * Only enable UDP checksum offloading when it is on 2012R2 or
185  * later.  UDP checksum offloading doesn't work on earlier
186  * Windows releases.
187  */
188 #define HN_CSUM_ASSIST_WIN8     (CSUM_IP | CSUM_TCP)
189 #define HN_CSUM_ASSIST          (CSUM_IP | CSUM_UDP | CSUM_TCP)
190
191 #define HN_LRO_LENLIM_MULTIRX_DEF       (12 * ETHERMTU)
192 #define HN_LRO_LENLIM_DEF               (25 * ETHERMTU)
193 /* YYY 2*MTU is a bit rough, but should be good enough. */
194 #define HN_LRO_LENLIM_MIN(ifp)          (2 * (ifp)->if_mtu)
195
196 #define HN_LRO_ACKCNT_DEF               1
197
198 /*
199  * Be aware that this sleepable mutex will exhibit WITNESS errors when
200  * certain TCP and ARP code paths are taken.  This appears to be a
201  * well-known condition, as all other drivers checked use a sleeping
202  * mutex to protect their transmit paths.
203  * Also Be aware that mutexes do not play well with semaphores, and there
204  * is a conflicting semaphore in a certain channel code path.
205  */
206 #define NV_LOCK_INIT(_sc, _name) \
207             mtx_init(&(_sc)->hn_lock, _name, MTX_NETWORK_LOCK, MTX_DEF)
208 #define NV_LOCK(_sc)            mtx_lock(&(_sc)->hn_lock)
209 #define NV_LOCK_ASSERT(_sc)     mtx_assert(&(_sc)->hn_lock, MA_OWNED)
210 #define NV_UNLOCK(_sc)          mtx_unlock(&(_sc)->hn_lock)
211 #define NV_LOCK_DESTROY(_sc)    mtx_destroy(&(_sc)->hn_lock)
212
213
214 /*
215  * Globals
216  */
217
218 int hv_promisc_mode = 0;    /* normal mode by default */
219
220 SYSCTL_NODE(_hw, OID_AUTO, hn, CTLFLAG_RD | CTLFLAG_MPSAFE, NULL,
221     "Hyper-V network interface");
222
223 /* Trust tcp segements verification on host side. */
224 static int hn_trust_hosttcp = 1;
225 SYSCTL_INT(_hw_hn, OID_AUTO, trust_hosttcp, CTLFLAG_RDTUN,
226     &hn_trust_hosttcp, 0,
227     "Trust tcp segement verification on host side, "
228     "when csum info is missing (global setting)");
229
230 /* Trust udp datagrams verification on host side. */
231 static int hn_trust_hostudp = 1;
232 SYSCTL_INT(_hw_hn, OID_AUTO, trust_hostudp, CTLFLAG_RDTUN,
233     &hn_trust_hostudp, 0,
234     "Trust udp datagram verification on host side, "
235     "when csum info is missing (global setting)");
236
237 /* Trust ip packets verification on host side. */
238 static int hn_trust_hostip = 1;
239 SYSCTL_INT(_hw_hn, OID_AUTO, trust_hostip, CTLFLAG_RDTUN,
240     &hn_trust_hostip, 0,
241     "Trust ip packet verification on host side, "
242     "when csum info is missing (global setting)");
243
244 #if __FreeBSD_version >= 1100045
245 /* Limit TSO burst size */
246 static int hn_tso_maxlen = 0;
247 SYSCTL_INT(_hw_hn, OID_AUTO, tso_maxlen, CTLFLAG_RDTUN,
248     &hn_tso_maxlen, 0, "TSO burst limit");
249 #endif
250
251 /* Limit chimney send size */
252 static int hn_tx_chimney_size = 0;
253 SYSCTL_INT(_hw_hn, OID_AUTO, tx_chimney_size, CTLFLAG_RDTUN,
254     &hn_tx_chimney_size, 0, "Chimney send packet size limit");
255
256 /* Limit the size of packet for direct transmission */
257 static int hn_direct_tx_size = HN_DIRECT_TX_SIZE_DEF;
258 SYSCTL_INT(_hw_hn, OID_AUTO, direct_tx_size, CTLFLAG_RDTUN,
259     &hn_direct_tx_size, 0, "Size of the packet for direct transmission");
260
261 #if defined(INET) || defined(INET6)
262 #if __FreeBSD_version >= 1100095
263 static int hn_lro_entry_count = HN_LROENT_CNT_DEF;
264 SYSCTL_INT(_hw_hn, OID_AUTO, lro_entry_count, CTLFLAG_RDTUN,
265     &hn_lro_entry_count, 0, "LRO entry count");
266 #endif
267 #endif
268
269 static int hn_share_tx_taskq = 0;
270 SYSCTL_INT(_hw_hn, OID_AUTO, share_tx_taskq, CTLFLAG_RDTUN,
271     &hn_share_tx_taskq, 0, "Enable shared TX taskqueue");
272
273 static struct taskqueue *hn_tx_taskq;
274
275 #ifndef HN_USE_TXDESC_BUFRING
276 static int hn_use_txdesc_bufring = 0;
277 #else
278 static int hn_use_txdesc_bufring = 1;
279 #endif
280 SYSCTL_INT(_hw_hn, OID_AUTO, use_txdesc_bufring, CTLFLAG_RD,
281     &hn_use_txdesc_bufring, 0, "Use buf_ring for TX descriptors");
282
283 static int hn_bind_tx_taskq = -1;
284 SYSCTL_INT(_hw_hn, OID_AUTO, bind_tx_taskq, CTLFLAG_RDTUN,
285     &hn_bind_tx_taskq, 0, "Bind TX taskqueue to the specified cpu");
286
287 static int hn_use_if_start = 0;
288 SYSCTL_INT(_hw_hn, OID_AUTO, use_if_start, CTLFLAG_RDTUN,
289     &hn_use_if_start, 0, "Use if_start TX method");
290
291 static int hn_chan_cnt = 0;
292 SYSCTL_INT(_hw_hn, OID_AUTO, chan_cnt, CTLFLAG_RDTUN,
293     &hn_chan_cnt, 0,
294     "# of channels to use; each channel has one RX ring and one TX ring");
295
296 static int hn_tx_ring_cnt = 0;
297 SYSCTL_INT(_hw_hn, OID_AUTO, tx_ring_cnt, CTLFLAG_RDTUN,
298     &hn_tx_ring_cnt, 0, "# of TX rings to use");
299
300 static int hn_tx_swq_depth = 0;
301 SYSCTL_INT(_hw_hn, OID_AUTO, tx_swq_depth, CTLFLAG_RDTUN,
302     &hn_tx_swq_depth, 0, "Depth of IFQ or BUFRING");
303
304 #if __FreeBSD_version >= 1100095
305 static u_int hn_lro_mbufq_depth = 0;
306 SYSCTL_UINT(_hw_hn, OID_AUTO, lro_mbufq_depth, CTLFLAG_RDTUN,
307     &hn_lro_mbufq_depth, 0, "Depth of LRO mbuf queue");
308 #endif
309
310 static u_int hn_cpu_index;
311
312 /*
313  * Forward declarations
314  */
315 static void hn_stop(hn_softc_t *sc);
316 static void hn_ifinit_locked(hn_softc_t *sc);
317 static void hn_ifinit(void *xsc);
318 static int  hn_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data);
319 static int hn_start_locked(struct hn_tx_ring *txr, int len);
320 static void hn_start(struct ifnet *ifp);
321 static void hn_start_txeof(struct hn_tx_ring *);
322 static int hn_ifmedia_upd(struct ifnet *ifp);
323 static void hn_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr);
324 #if __FreeBSD_version >= 1100099
325 static int hn_lro_lenlim_sysctl(SYSCTL_HANDLER_ARGS);
326 static int hn_lro_ackcnt_sysctl(SYSCTL_HANDLER_ARGS);
327 #endif
328 static int hn_trust_hcsum_sysctl(SYSCTL_HANDLER_ARGS);
329 static int hn_tx_chimney_size_sysctl(SYSCTL_HANDLER_ARGS);
330 static int hn_rx_stat_ulong_sysctl(SYSCTL_HANDLER_ARGS);
331 static int hn_rx_stat_u64_sysctl(SYSCTL_HANDLER_ARGS);
332 static int hn_tx_stat_ulong_sysctl(SYSCTL_HANDLER_ARGS);
333 static int hn_tx_conf_int_sysctl(SYSCTL_HANDLER_ARGS);
334 static int hn_check_iplen(const struct mbuf *, int);
335 static int hn_create_tx_ring(struct hn_softc *, int);
336 static void hn_destroy_tx_ring(struct hn_tx_ring *);
337 static int hn_create_tx_data(struct hn_softc *, int);
338 static void hn_destroy_tx_data(struct hn_softc *);
339 static void hn_start_taskfunc(void *, int);
340 static void hn_start_txeof_taskfunc(void *, int);
341 static void hn_stop_tx_tasks(struct hn_softc *);
342 static int hn_encap(struct hn_tx_ring *, struct hn_txdesc *, struct mbuf **);
343 static void hn_create_rx_data(struct hn_softc *sc, int);
344 static void hn_destroy_rx_data(struct hn_softc *sc);
345 static void hn_set_tx_chimney_size(struct hn_softc *, int);
346 static void hn_channel_attach(struct hn_softc *, struct hv_vmbus_channel *);
347 static void hn_subchan_attach(struct hn_softc *, struct hv_vmbus_channel *);
348 static void hn_subchan_setup(struct hn_softc *);
349
350 static int hn_transmit(struct ifnet *, struct mbuf *);
351 static void hn_xmit_qflush(struct ifnet *);
352 static int hn_xmit(struct hn_tx_ring *, int);
353 static void hn_xmit_txeof(struct hn_tx_ring *);
354 static void hn_xmit_taskfunc(void *, int);
355 static void hn_xmit_txeof_taskfunc(void *, int);
356
357 #if __FreeBSD_version >= 1100099
358 static void
359 hn_set_lro_lenlim(struct hn_softc *sc, int lenlim)
360 {
361         int i;
362
363         for (i = 0; i < sc->hn_rx_ring_inuse; ++i)
364                 sc->hn_rx_ring[i].hn_lro.lro_length_lim = lenlim;
365 }
366 #endif
367
368 static int
369 hn_get_txswq_depth(const struct hn_tx_ring *txr)
370 {
371
372         KASSERT(txr->hn_txdesc_cnt > 0, ("tx ring is not setup yet"));
373         if (hn_tx_swq_depth < txr->hn_txdesc_cnt)
374                 return txr->hn_txdesc_cnt;
375         return hn_tx_swq_depth;
376 }
377
378 static int
379 hn_ifmedia_upd(struct ifnet *ifp __unused)
380 {
381
382         return EOPNOTSUPP;
383 }
384
385 static void
386 hn_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
387 {
388         struct hn_softc *sc = ifp->if_softc;
389
390         ifmr->ifm_status = IFM_AVALID;
391         ifmr->ifm_active = IFM_ETHER;
392
393         if (!sc->hn_carrier) {
394                 ifmr->ifm_active |= IFM_NONE;
395                 return;
396         }
397         ifmr->ifm_status |= IFM_ACTIVE;
398         ifmr->ifm_active |= IFM_10G_T | IFM_FDX;
399 }
400
401 /* {F8615163-DF3E-46c5-913F-F2D2F965ED0E} */
402 static const struct hyperv_guid g_net_vsc_device_type = {
403         .hv_guid = {0x63, 0x51, 0x61, 0xF8, 0x3E, 0xDF, 0xc5, 0x46,
404                 0x91, 0x3F, 0xF2, 0xD2, 0xF9, 0x65, 0xED, 0x0E}
405 };
406
407 /*
408  * Standard probe entry point.
409  *
410  */
411 static int
412 netvsc_probe(device_t dev)
413 {
414         if (VMBUS_PROBE_GUID(device_get_parent(dev), dev,
415             &g_net_vsc_device_type) == 0) {
416                 device_set_desc(dev, "Hyper-V Network Interface");
417                 return BUS_PROBE_DEFAULT;
418         }
419         return ENXIO;
420 }
421
422 /*
423  * Standard attach entry point.
424  *
425  * Called when the driver is loaded.  It allocates needed resources,
426  * and initializes the "hardware" and software.
427  */
428 static int
429 netvsc_attach(device_t dev)
430 {
431         netvsc_device_info device_info;
432         hn_softc_t *sc;
433         int unit = device_get_unit(dev);
434         struct ifnet *ifp = NULL;
435         int error, ring_cnt, tx_ring_cnt;
436 #if __FreeBSD_version >= 1100045
437         int tso_maxlen;
438 #endif
439
440         sc = device_get_softc(dev);
441
442         sc->hn_unit = unit;
443         sc->hn_dev = dev;
444         sc->hn_prichan = vmbus_get_channel(dev);
445
446         if (hn_tx_taskq == NULL) {
447                 sc->hn_tx_taskq = taskqueue_create("hn_tx", M_WAITOK,
448                     taskqueue_thread_enqueue, &sc->hn_tx_taskq);
449                 if (hn_bind_tx_taskq >= 0) {
450                         int cpu = hn_bind_tx_taskq;
451                         cpuset_t cpu_set;
452
453                         if (cpu > mp_ncpus - 1)
454                                 cpu = mp_ncpus - 1;
455                         CPU_SETOF(cpu, &cpu_set);
456                         taskqueue_start_threads_cpuset(&sc->hn_tx_taskq, 1,
457                             PI_NET, &cpu_set, "%s tx",
458                             device_get_nameunit(dev));
459                 } else {
460                         taskqueue_start_threads(&sc->hn_tx_taskq, 1, PI_NET,
461                             "%s tx", device_get_nameunit(dev));
462                 }
463         } else {
464                 sc->hn_tx_taskq = hn_tx_taskq;
465         }
466         NV_LOCK_INIT(sc, "NetVSCLock");
467
468         ifp = sc->hn_ifp = if_alloc(IFT_ETHER);
469         ifp->if_softc = sc;
470         if_initname(ifp, device_get_name(dev), device_get_unit(dev));
471
472         /*
473          * Figure out the # of RX rings (ring_cnt) and the # of TX rings
474          * to use (tx_ring_cnt).
475          *
476          * NOTE:
477          * The # of RX rings to use is same as the # of channels to use.
478          */
479         ring_cnt = hn_chan_cnt;
480         if (ring_cnt <= 0) {
481                 /* Default */
482                 ring_cnt = mp_ncpus;
483                 if (ring_cnt > HN_RING_CNT_DEF_MAX)
484                         ring_cnt = HN_RING_CNT_DEF_MAX;
485         } else if (ring_cnt > mp_ncpus) {
486                 ring_cnt = mp_ncpus;
487         }
488
489         tx_ring_cnt = hn_tx_ring_cnt;
490         if (tx_ring_cnt <= 0 || tx_ring_cnt > ring_cnt)
491                 tx_ring_cnt = ring_cnt;
492         if (hn_use_if_start) {
493                 /* ifnet.if_start only needs one TX ring. */
494                 tx_ring_cnt = 1;
495         }
496
497         /*
498          * Set the leader CPU for channels.
499          */
500         sc->hn_cpu = atomic_fetchadd_int(&hn_cpu_index, ring_cnt) % mp_ncpus;
501
502         error = hn_create_tx_data(sc, tx_ring_cnt);
503         if (error)
504                 goto failed;
505         hn_create_rx_data(sc, ring_cnt);
506
507         /*
508          * Associate the first TX/RX ring w/ the primary channel.
509          */
510         hn_channel_attach(sc, sc->hn_prichan);
511
512         ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
513         ifp->if_ioctl = hn_ioctl;
514         ifp->if_init = hn_ifinit;
515         /* needed by hv_rf_on_device_add() code */
516         ifp->if_mtu = ETHERMTU;
517         if (hn_use_if_start) {
518                 int qdepth = hn_get_txswq_depth(&sc->hn_tx_ring[0]);
519
520                 ifp->if_start = hn_start;
521                 IFQ_SET_MAXLEN(&ifp->if_snd, qdepth);
522                 ifp->if_snd.ifq_drv_maxlen = qdepth - 1;
523                 IFQ_SET_READY(&ifp->if_snd);
524         } else {
525                 ifp->if_transmit = hn_transmit;
526                 ifp->if_qflush = hn_xmit_qflush;
527         }
528
529         ifmedia_init(&sc->hn_media, 0, hn_ifmedia_upd, hn_ifmedia_sts);
530         ifmedia_add(&sc->hn_media, IFM_ETHER | IFM_AUTO, 0, NULL);
531         ifmedia_set(&sc->hn_media, IFM_ETHER | IFM_AUTO);
532         /* XXX ifmedia_set really should do this for us */
533         sc->hn_media.ifm_media = sc->hn_media.ifm_cur->ifm_media;
534
535         /*
536          * Tell upper layers that we support full VLAN capability.
537          */
538         ifp->if_hdrlen = sizeof(struct ether_vlan_header);
539         ifp->if_capabilities |=
540             IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU | IFCAP_HWCSUM | IFCAP_TSO |
541             IFCAP_LRO;
542         ifp->if_capenable |=
543             IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU | IFCAP_HWCSUM | IFCAP_TSO |
544             IFCAP_LRO;
545         ifp->if_hwassist = sc->hn_tx_ring[0].hn_csum_assist | CSUM_TSO;
546
547         error = hv_rf_on_device_add(sc, &device_info, ring_cnt);
548         if (error)
549                 goto failed;
550         KASSERT(sc->net_dev->num_channel > 0 &&
551             sc->net_dev->num_channel <= sc->hn_rx_ring_inuse,
552             ("invalid channel count %u, should be less than %d",
553              sc->net_dev->num_channel, sc->hn_rx_ring_inuse));
554
555         /*
556          * Set the # of TX/RX rings that could be used according to
557          * the # of channels that host offered.
558          */
559         if (sc->hn_tx_ring_inuse > sc->net_dev->num_channel)
560                 sc->hn_tx_ring_inuse = sc->net_dev->num_channel;
561         sc->hn_rx_ring_inuse = sc->net_dev->num_channel;
562         device_printf(dev, "%d TX ring, %d RX ring\n",
563             sc->hn_tx_ring_inuse, sc->hn_rx_ring_inuse);
564
565         if (sc->net_dev->num_channel > 1)
566                 hn_subchan_setup(sc);
567
568 #if __FreeBSD_version >= 1100099
569         if (sc->hn_rx_ring_inuse > 1) {
570                 /*
571                  * Reduce TCP segment aggregation limit for multiple
572                  * RX rings to increase ACK timeliness.
573                  */
574                 hn_set_lro_lenlim(sc, HN_LRO_LENLIM_MULTIRX_DEF);
575         }
576 #endif
577
578         if (device_info.link_state == 0) {
579                 sc->hn_carrier = 1;
580         }
581
582 #if __FreeBSD_version >= 1100045
583         tso_maxlen = hn_tso_maxlen;
584         if (tso_maxlen <= 0 || tso_maxlen > IP_MAXPACKET)
585                 tso_maxlen = IP_MAXPACKET;
586
587         ifp->if_hw_tsomaxsegcount = HN_TX_DATA_SEGCNT_MAX;
588         ifp->if_hw_tsomaxsegsize = PAGE_SIZE;
589         ifp->if_hw_tsomax = tso_maxlen -
590             (ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN);
591 #endif
592
593         ether_ifattach(ifp, device_info.mac_addr);
594
595 #if __FreeBSD_version >= 1100045
596         if_printf(ifp, "TSO: %u/%u/%u\n", ifp->if_hw_tsomax,
597             ifp->if_hw_tsomaxsegcount, ifp->if_hw_tsomaxsegsize);
598 #endif
599
600         sc->hn_tx_chimney_max = sc->net_dev->send_section_size;
601         hn_set_tx_chimney_size(sc, sc->hn_tx_chimney_max);
602         if (hn_tx_chimney_size > 0 &&
603             hn_tx_chimney_size < sc->hn_tx_chimney_max)
604                 hn_set_tx_chimney_size(sc, hn_tx_chimney_size);
605
606         return (0);
607 failed:
608         hn_destroy_tx_data(sc);
609         if (ifp != NULL)
610                 if_free(ifp);
611         return (error);
612 }
613
614 /*
615  * Standard detach entry point
616  */
617 static int
618 netvsc_detach(device_t dev)
619 {
620         struct hn_softc *sc = device_get_softc(dev);
621
622         if (bootverbose)
623                 printf("netvsc_detach\n");
624
625         /*
626          * XXXKYS:  Need to clean up all our
627          * driver state; this is the driver
628          * unloading.
629          */
630
631         /*
632          * XXXKYS:  Need to stop outgoing traffic and unregister
633          * the netdevice.
634          */
635
636         hv_rf_on_device_remove(sc, HV_RF_NV_DESTROY_CHANNEL);
637
638         hn_stop_tx_tasks(sc);
639
640         ifmedia_removeall(&sc->hn_media);
641         hn_destroy_rx_data(sc);
642         hn_destroy_tx_data(sc);
643
644         if (sc->hn_tx_taskq != hn_tx_taskq)
645                 taskqueue_free(sc->hn_tx_taskq);
646
647         return (0);
648 }
649
650 /*
651  * Standard shutdown entry point
652  */
653 static int
654 netvsc_shutdown(device_t dev)
655 {
656         return (0);
657 }
658
659 static __inline int
660 hn_txdesc_dmamap_load(struct hn_tx_ring *txr, struct hn_txdesc *txd,
661     struct mbuf **m_head, bus_dma_segment_t *segs, int *nsegs)
662 {
663         struct mbuf *m = *m_head;
664         int error;
665
666         error = bus_dmamap_load_mbuf_sg(txr->hn_tx_data_dtag, txd->data_dmap,
667             m, segs, nsegs, BUS_DMA_NOWAIT);
668         if (error == EFBIG) {
669                 struct mbuf *m_new;
670
671                 m_new = m_collapse(m, M_NOWAIT, HN_TX_DATA_SEGCNT_MAX);
672                 if (m_new == NULL)
673                         return ENOBUFS;
674                 else
675                         *m_head = m = m_new;
676                 txr->hn_tx_collapsed++;
677
678                 error = bus_dmamap_load_mbuf_sg(txr->hn_tx_data_dtag,
679                     txd->data_dmap, m, segs, nsegs, BUS_DMA_NOWAIT);
680         }
681         if (!error) {
682                 bus_dmamap_sync(txr->hn_tx_data_dtag, txd->data_dmap,
683                     BUS_DMASYNC_PREWRITE);
684                 txd->flags |= HN_TXD_FLAG_DMAMAP;
685         }
686         return error;
687 }
688
689 static __inline void
690 hn_txdesc_dmamap_unload(struct hn_tx_ring *txr, struct hn_txdesc *txd)
691 {
692
693         if (txd->flags & HN_TXD_FLAG_DMAMAP) {
694                 bus_dmamap_sync(txr->hn_tx_data_dtag,
695                     txd->data_dmap, BUS_DMASYNC_POSTWRITE);
696                 bus_dmamap_unload(txr->hn_tx_data_dtag,
697                     txd->data_dmap);
698                 txd->flags &= ~HN_TXD_FLAG_DMAMAP;
699         }
700 }
701
702 static __inline int
703 hn_txdesc_put(struct hn_tx_ring *txr, struct hn_txdesc *txd)
704 {
705
706         KASSERT((txd->flags & HN_TXD_FLAG_ONLIST) == 0,
707             ("put an onlist txd %#x", txd->flags));
708
709         KASSERT(txd->refs > 0, ("invalid txd refs %d", txd->refs));
710         if (atomic_fetchadd_int(&txd->refs, -1) != 1)
711                 return 0;
712
713         hn_txdesc_dmamap_unload(txr, txd);
714         if (txd->m != NULL) {
715                 m_freem(txd->m);
716                 txd->m = NULL;
717         }
718
719         txd->flags |= HN_TXD_FLAG_ONLIST;
720
721 #ifndef HN_USE_TXDESC_BUFRING
722         mtx_lock_spin(&txr->hn_txlist_spin);
723         KASSERT(txr->hn_txdesc_avail >= 0 &&
724             txr->hn_txdesc_avail < txr->hn_txdesc_cnt,
725             ("txdesc_put: invalid txd avail %d", txr->hn_txdesc_avail));
726         txr->hn_txdesc_avail++;
727         SLIST_INSERT_HEAD(&txr->hn_txlist, txd, link);
728         mtx_unlock_spin(&txr->hn_txlist_spin);
729 #else
730         atomic_add_int(&txr->hn_txdesc_avail, 1);
731         buf_ring_enqueue(txr->hn_txdesc_br, txd);
732 #endif
733
734         return 1;
735 }
736
737 static __inline struct hn_txdesc *
738 hn_txdesc_get(struct hn_tx_ring *txr)
739 {
740         struct hn_txdesc *txd;
741
742 #ifndef HN_USE_TXDESC_BUFRING
743         mtx_lock_spin(&txr->hn_txlist_spin);
744         txd = SLIST_FIRST(&txr->hn_txlist);
745         if (txd != NULL) {
746                 KASSERT(txr->hn_txdesc_avail > 0,
747                     ("txdesc_get: invalid txd avail %d", txr->hn_txdesc_avail));
748                 txr->hn_txdesc_avail--;
749                 SLIST_REMOVE_HEAD(&txr->hn_txlist, link);
750         }
751         mtx_unlock_spin(&txr->hn_txlist_spin);
752 #else
753         txd = buf_ring_dequeue_sc(txr->hn_txdesc_br);
754 #endif
755
756         if (txd != NULL) {
757 #ifdef HN_USE_TXDESC_BUFRING
758                 atomic_subtract_int(&txr->hn_txdesc_avail, 1);
759 #endif
760                 KASSERT(txd->m == NULL && txd->refs == 0 &&
761                     (txd->flags & HN_TXD_FLAG_ONLIST), ("invalid txd"));
762                 txd->flags &= ~HN_TXD_FLAG_ONLIST;
763                 txd->refs = 1;
764         }
765         return txd;
766 }
767
768 static __inline void
769 hn_txdesc_hold(struct hn_txdesc *txd)
770 {
771
772         /* 0->1 transition will never work */
773         KASSERT(txd->refs > 0, ("invalid refs %d", txd->refs));
774         atomic_add_int(&txd->refs, 1);
775 }
776
777 static __inline void
778 hn_txeof(struct hn_tx_ring *txr)
779 {
780         txr->hn_has_txeof = 0;
781         txr->hn_txeof(txr);
782 }
783
784 static void
785 hn_tx_done(struct hv_vmbus_channel *chan, void *xpkt)
786 {
787         netvsc_packet *packet = xpkt;
788         struct hn_txdesc *txd;
789         struct hn_tx_ring *txr;
790
791         txd = (struct hn_txdesc *)(uintptr_t)
792             packet->compl.send.send_completion_tid;
793
794         txr = txd->txr;
795         KASSERT(txr->hn_chan == chan,
796             ("channel mismatch, on channel%u, should be channel%u",
797              chan->ch_subidx,
798              txr->hn_chan->ch_subidx));
799
800         txr->hn_has_txeof = 1;
801         hn_txdesc_put(txr, txd);
802
803         ++txr->hn_txdone_cnt;
804         if (txr->hn_txdone_cnt >= HN_EARLY_TXEOF_THRESH) {
805                 txr->hn_txdone_cnt = 0;
806                 if (txr->hn_oactive)
807                         hn_txeof(txr);
808         }
809 }
810
811 void
812 netvsc_channel_rollup(struct hv_vmbus_channel *chan)
813 {
814         struct hn_tx_ring *txr = chan->hv_chan_txr;
815 #if defined(INET) || defined(INET6)
816         struct hn_rx_ring *rxr = chan->hv_chan_rxr;
817
818         tcp_lro_flush_all(&rxr->hn_lro);
819 #endif
820
821         /*
822          * NOTE:
823          * 'txr' could be NULL, if multiple channels and
824          * ifnet.if_start method are enabled.
825          */
826         if (txr == NULL || !txr->hn_has_txeof)
827                 return;
828
829         txr->hn_txdone_cnt = 0;
830         hn_txeof(txr);
831 }
832
833 /*
834  * NOTE:
835  * If this function fails, then both txd and m_head0 will be freed.
836  */
837 static int
838 hn_encap(struct hn_tx_ring *txr, struct hn_txdesc *txd, struct mbuf **m_head0)
839 {
840         bus_dma_segment_t segs[HN_TX_DATA_SEGCNT_MAX];
841         int error, nsegs, i;
842         struct mbuf *m_head = *m_head0;
843         netvsc_packet *packet;
844         rndis_msg *rndis_mesg;
845         rndis_packet *rndis_pkt;
846         rndis_per_packet_info *rppi;
847         struct rndis_hash_value *hash_value;
848         uint32_t rndis_msg_size;
849
850         packet = &txd->netvsc_pkt;
851         packet->is_data_pkt = TRUE;
852         packet->tot_data_buf_len = m_head->m_pkthdr.len;
853
854         /*
855          * extension points to the area reserved for the
856          * rndis_filter_packet, which is placed just after
857          * the netvsc_packet (and rppi struct, if present;
858          * length is updated later).
859          */
860         rndis_mesg = txd->rndis_msg;
861         /* XXX not necessary */
862         memset(rndis_mesg, 0, HN_RNDIS_MSG_LEN);
863         rndis_mesg->ndis_msg_type = REMOTE_NDIS_PACKET_MSG;
864
865         rndis_pkt = &rndis_mesg->msg.packet;
866         rndis_pkt->data_offset = sizeof(rndis_packet);
867         rndis_pkt->data_length = packet->tot_data_buf_len;
868         rndis_pkt->per_pkt_info_offset = sizeof(rndis_packet);
869
870         rndis_msg_size = RNDIS_MESSAGE_SIZE(rndis_packet);
871
872         /*
873          * Set the hash value for this packet, so that the host could
874          * dispatch the TX done event for this packet back to this TX
875          * ring's channel.
876          */
877         rndis_msg_size += RNDIS_HASHVAL_PPI_SIZE;
878         rppi = hv_set_rppi_data(rndis_mesg, RNDIS_HASHVAL_PPI_SIZE,
879             nbl_hash_value);
880         hash_value = (struct rndis_hash_value *)((uint8_t *)rppi +
881             rppi->per_packet_info_offset);
882         hash_value->hash_value = txr->hn_tx_idx;
883
884         if (m_head->m_flags & M_VLANTAG) {
885                 ndis_8021q_info *rppi_vlan_info;
886
887                 rndis_msg_size += RNDIS_VLAN_PPI_SIZE;
888                 rppi = hv_set_rppi_data(rndis_mesg, RNDIS_VLAN_PPI_SIZE,
889                     ieee_8021q_info);
890
891                 rppi_vlan_info = (ndis_8021q_info *)((uint8_t *)rppi +
892                     rppi->per_packet_info_offset);
893                 rppi_vlan_info->u1.s1.vlan_id =
894                     m_head->m_pkthdr.ether_vtag & 0xfff;
895         }
896
897         if (m_head->m_pkthdr.csum_flags & CSUM_TSO) {
898                 rndis_tcp_tso_info *tso_info;   
899                 struct ether_vlan_header *eh;
900                 int ether_len;
901
902                 /*
903                  * XXX need m_pullup and use mtodo
904                  */
905                 eh = mtod(m_head, struct ether_vlan_header*);
906                 if (eh->evl_encap_proto == htons(ETHERTYPE_VLAN))
907                         ether_len = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
908                 else
909                         ether_len = ETHER_HDR_LEN;
910
911                 rndis_msg_size += RNDIS_TSO_PPI_SIZE;
912                 rppi = hv_set_rppi_data(rndis_mesg, RNDIS_TSO_PPI_SIZE,
913                     tcp_large_send_info);
914
915                 tso_info = (rndis_tcp_tso_info *)((uint8_t *)rppi +
916                     rppi->per_packet_info_offset);
917                 tso_info->lso_v2_xmit.type =
918                     RNDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE;
919
920 #ifdef INET
921                 if (m_head->m_pkthdr.csum_flags & CSUM_IP_TSO) {
922                         struct ip *ip =
923                             (struct ip *)(m_head->m_data + ether_len);
924                         unsigned long iph_len = ip->ip_hl << 2;
925                         struct tcphdr *th =
926                             (struct tcphdr *)((caddr_t)ip + iph_len);
927
928                         tso_info->lso_v2_xmit.ip_version =
929                             RNDIS_TCP_LARGE_SEND_OFFLOAD_IPV4;
930                         ip->ip_len = 0;
931                         ip->ip_sum = 0;
932
933                         th->th_sum = in_pseudo(ip->ip_src.s_addr,
934                             ip->ip_dst.s_addr, htons(IPPROTO_TCP));
935                 }
936 #endif
937 #if defined(INET6) && defined(INET)
938                 else
939 #endif
940 #ifdef INET6
941                 {
942                         struct ip6_hdr *ip6 = (struct ip6_hdr *)
943                             (m_head->m_data + ether_len);
944                         struct tcphdr *th = (struct tcphdr *)(ip6 + 1);
945
946                         tso_info->lso_v2_xmit.ip_version =
947                             RNDIS_TCP_LARGE_SEND_OFFLOAD_IPV6;
948                         ip6->ip6_plen = 0;
949                         th->th_sum = in6_cksum_pseudo(ip6, 0, IPPROTO_TCP, 0);
950                 }
951 #endif
952                 tso_info->lso_v2_xmit.tcp_header_offset = 0;
953                 tso_info->lso_v2_xmit.mss = m_head->m_pkthdr.tso_segsz;
954         } else if (m_head->m_pkthdr.csum_flags & txr->hn_csum_assist) {
955                 rndis_tcp_ip_csum_info *csum_info;
956
957                 rndis_msg_size += RNDIS_CSUM_PPI_SIZE;
958                 rppi = hv_set_rppi_data(rndis_mesg, RNDIS_CSUM_PPI_SIZE,
959                     tcpip_chksum_info);
960                 csum_info = (rndis_tcp_ip_csum_info *)((uint8_t *)rppi +
961                     rppi->per_packet_info_offset);
962
963                 csum_info->xmit.is_ipv4 = 1;
964                 if (m_head->m_pkthdr.csum_flags & CSUM_IP)
965                         csum_info->xmit.ip_header_csum = 1;
966
967                 if (m_head->m_pkthdr.csum_flags & CSUM_TCP) {
968                         csum_info->xmit.tcp_csum = 1;
969                         csum_info->xmit.tcp_header_offset = 0;
970                 } else if (m_head->m_pkthdr.csum_flags & CSUM_UDP) {
971                         csum_info->xmit.udp_csum = 1;
972                 }
973         }
974
975         rndis_mesg->msg_len = packet->tot_data_buf_len + rndis_msg_size;
976         packet->tot_data_buf_len = rndis_mesg->msg_len;
977
978         /*
979          * Chimney send, if the packet could fit into one chimney buffer.
980          */
981         if (packet->tot_data_buf_len < txr->hn_tx_chimney_size) {
982                 netvsc_dev *net_dev = txr->hn_sc->net_dev;
983                 uint32_t send_buf_section_idx;
984
985                 txr->hn_tx_chimney_tried++;
986                 send_buf_section_idx =
987                     hv_nv_get_next_send_section(net_dev);
988                 if (send_buf_section_idx !=
989                     NVSP_1_CHIMNEY_SEND_INVALID_SECTION_INDEX) {
990                         uint8_t *dest = ((uint8_t *)net_dev->send_buf +
991                             (send_buf_section_idx *
992                              net_dev->send_section_size));
993
994                         memcpy(dest, rndis_mesg, rndis_msg_size);
995                         dest += rndis_msg_size;
996                         m_copydata(m_head, 0, m_head->m_pkthdr.len, dest);
997
998                         packet->send_buf_section_idx = send_buf_section_idx;
999                         packet->send_buf_section_size =
1000                             packet->tot_data_buf_len;
1001                         packet->page_buf_count = 0;
1002                         txr->hn_tx_chimney++;
1003                         goto done;
1004                 }
1005         }
1006
1007         error = hn_txdesc_dmamap_load(txr, txd, &m_head, segs, &nsegs);
1008         if (error) {
1009                 int freed;
1010
1011                 /*
1012                  * This mbuf is not linked w/ the txd yet, so free it now.
1013                  */
1014                 m_freem(m_head);
1015                 *m_head0 = NULL;
1016
1017                 freed = hn_txdesc_put(txr, txd);
1018                 KASSERT(freed != 0,
1019                     ("fail to free txd upon txdma error"));
1020
1021                 txr->hn_txdma_failed++;
1022                 if_inc_counter(txr->hn_sc->hn_ifp, IFCOUNTER_OERRORS, 1);
1023                 return error;
1024         }
1025         *m_head0 = m_head;
1026
1027         packet->page_buf_count = nsegs + HV_RF_NUM_TX_RESERVED_PAGE_BUFS;
1028
1029         /* send packet with page buffer */
1030         packet->page_buffers[0].pfn = atop(txd->rndis_msg_paddr);
1031         packet->page_buffers[0].offset = txd->rndis_msg_paddr & PAGE_MASK;
1032         packet->page_buffers[0].length = rndis_msg_size;
1033
1034         /*
1035          * Fill the page buffers with mbuf info starting at index
1036          * HV_RF_NUM_TX_RESERVED_PAGE_BUFS.
1037          */
1038         for (i = 0; i < nsegs; ++i) {
1039                 hv_vmbus_page_buffer *pb = &packet->page_buffers[
1040                     i + HV_RF_NUM_TX_RESERVED_PAGE_BUFS];
1041
1042                 pb->pfn = atop(segs[i].ds_addr);
1043                 pb->offset = segs[i].ds_addr & PAGE_MASK;
1044                 pb->length = segs[i].ds_len;
1045         }
1046
1047         packet->send_buf_section_idx =
1048             NVSP_1_CHIMNEY_SEND_INVALID_SECTION_INDEX;
1049         packet->send_buf_section_size = 0;
1050 done:
1051         txd->m = m_head;
1052
1053         /* Set the completion routine */
1054         packet->compl.send.on_send_completion = hn_tx_done;
1055         packet->compl.send.send_completion_context = packet;
1056         packet->compl.send.send_completion_tid = (uint64_t)(uintptr_t)txd;
1057
1058         return 0;
1059 }
1060
1061 /*
1062  * NOTE:
1063  * If this function fails, then txd will be freed, but the mbuf
1064  * associated w/ the txd will _not_ be freed.
1065  */
1066 static int
1067 hn_send_pkt(struct ifnet *ifp, struct hn_tx_ring *txr, struct hn_txdesc *txd)
1068 {
1069         int error, send_failed = 0;
1070
1071 again:
1072         /*
1073          * Make sure that txd is not freed before ETHER_BPF_MTAP.
1074          */
1075         hn_txdesc_hold(txd);
1076         error = hv_nv_on_send(txr->hn_chan, &txd->netvsc_pkt);
1077         if (!error) {
1078                 ETHER_BPF_MTAP(ifp, txd->m);
1079                 if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
1080                 if (!hn_use_if_start) {
1081                         if_inc_counter(ifp, IFCOUNTER_OBYTES,
1082                             txd->m->m_pkthdr.len);
1083                         if (txd->m->m_flags & M_MCAST)
1084                                 if_inc_counter(ifp, IFCOUNTER_OMCASTS, 1);
1085                 }
1086                 txr->hn_pkts++;
1087         }
1088         hn_txdesc_put(txr, txd);
1089
1090         if (__predict_false(error)) {
1091                 int freed;
1092
1093                 /*
1094                  * This should "really rarely" happen.
1095                  *
1096                  * XXX Too many RX to be acked or too many sideband
1097                  * commands to run?  Ask netvsc_channel_rollup()
1098                  * to kick start later.
1099                  */
1100                 txr->hn_has_txeof = 1;
1101                 if (!send_failed) {
1102                         txr->hn_send_failed++;
1103                         send_failed = 1;
1104                         /*
1105                          * Try sending again after set hn_has_txeof;
1106                          * in case that we missed the last
1107                          * netvsc_channel_rollup().
1108                          */
1109                         goto again;
1110                 }
1111                 if_printf(ifp, "send failed\n");
1112
1113                 /*
1114                  * Caller will perform further processing on the
1115                  * associated mbuf, so don't free it in hn_txdesc_put();
1116                  * only unload it from the DMA map in hn_txdesc_put(),
1117                  * if it was loaded.
1118                  */
1119                 txd->m = NULL;
1120                 freed = hn_txdesc_put(txr, txd);
1121                 KASSERT(freed != 0,
1122                     ("fail to free txd upon send error"));
1123
1124                 txr->hn_send_failed++;
1125         }
1126         return error;
1127 }
1128
1129 /*
1130  * Start a transmit of one or more packets
1131  */
1132 static int
1133 hn_start_locked(struct hn_tx_ring *txr, int len)
1134 {
1135         struct hn_softc *sc = txr->hn_sc;
1136         struct ifnet *ifp = sc->hn_ifp;
1137
1138         KASSERT(hn_use_if_start,
1139             ("hn_start_locked is called, when if_start is disabled"));
1140         KASSERT(txr == &sc->hn_tx_ring[0], ("not the first TX ring"));
1141         mtx_assert(&txr->hn_tx_lock, MA_OWNED);
1142
1143         if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
1144             IFF_DRV_RUNNING)
1145                 return 0;
1146
1147         while (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) {
1148                 struct hn_txdesc *txd;
1149                 struct mbuf *m_head;
1150                 int error;
1151
1152                 IFQ_DRV_DEQUEUE(&ifp->if_snd, m_head);
1153                 if (m_head == NULL)
1154                         break;
1155
1156                 if (len > 0 && m_head->m_pkthdr.len > len) {
1157                         /*
1158                          * This sending could be time consuming; let callers
1159                          * dispatch this packet sending (and sending of any
1160                          * following up packets) to tx taskqueue.
1161                          */
1162                         IFQ_DRV_PREPEND(&ifp->if_snd, m_head);
1163                         return 1;
1164                 }
1165
1166                 txd = hn_txdesc_get(txr);
1167                 if (txd == NULL) {
1168                         txr->hn_no_txdescs++;
1169                         IFQ_DRV_PREPEND(&ifp->if_snd, m_head);
1170                         atomic_set_int(&ifp->if_drv_flags, IFF_DRV_OACTIVE);
1171                         break;
1172                 }
1173
1174                 error = hn_encap(txr, txd, &m_head);
1175                 if (error) {
1176                         /* Both txd and m_head are freed */
1177                         continue;
1178                 }
1179
1180                 error = hn_send_pkt(ifp, txr, txd);
1181                 if (__predict_false(error)) {
1182                         /* txd is freed, but m_head is not */
1183                         IFQ_DRV_PREPEND(&ifp->if_snd, m_head);
1184                         atomic_set_int(&ifp->if_drv_flags, IFF_DRV_OACTIVE);
1185                         break;
1186                 }
1187         }
1188         return 0;
1189 }
1190
1191 /*
1192  * Link up/down notification
1193  */
1194 void
1195 netvsc_linkstatus_callback(struct hn_softc *sc, uint32_t status)
1196 {
1197         if (status == 1) {
1198                 sc->hn_carrier = 1;
1199         } else {
1200                 sc->hn_carrier = 0;
1201         }
1202 }
1203
1204 /*
1205  * Append the specified data to the indicated mbuf chain,
1206  * Extend the mbuf chain if the new data does not fit in
1207  * existing space.
1208  *
1209  * This is a minor rewrite of m_append() from sys/kern/uipc_mbuf.c.
1210  * There should be an equivalent in the kernel mbuf code,
1211  * but there does not appear to be one yet.
1212  *
1213  * Differs from m_append() in that additional mbufs are
1214  * allocated with cluster size MJUMPAGESIZE, and filled
1215  * accordingly.
1216  *
1217  * Return 1 if able to complete the job; otherwise 0.
1218  */
1219 static int
1220 hv_m_append(struct mbuf *m0, int len, c_caddr_t cp)
1221 {
1222         struct mbuf *m, *n;
1223         int remainder, space;
1224
1225         for (m = m0; m->m_next != NULL; m = m->m_next)
1226                 ;
1227         remainder = len;
1228         space = M_TRAILINGSPACE(m);
1229         if (space > 0) {
1230                 /*
1231                  * Copy into available space.
1232                  */
1233                 if (space > remainder)
1234                         space = remainder;
1235                 bcopy(cp, mtod(m, caddr_t) + m->m_len, space);
1236                 m->m_len += space;
1237                 cp += space;
1238                 remainder -= space;
1239         }
1240         while (remainder > 0) {
1241                 /*
1242                  * Allocate a new mbuf; could check space
1243                  * and allocate a cluster instead.
1244                  */
1245                 n = m_getjcl(M_NOWAIT, m->m_type, 0, MJUMPAGESIZE);
1246                 if (n == NULL)
1247                         break;
1248                 n->m_len = min(MJUMPAGESIZE, remainder);
1249                 bcopy(cp, mtod(n, caddr_t), n->m_len);
1250                 cp += n->m_len;
1251                 remainder -= n->m_len;
1252                 m->m_next = n;
1253                 m = n;
1254         }
1255         if (m0->m_flags & M_PKTHDR)
1256                 m0->m_pkthdr.len += len - remainder;
1257
1258         return (remainder == 0);
1259 }
1260
1261 #if defined(INET) || defined(INET6)
1262 static __inline int
1263 hn_lro_rx(struct lro_ctrl *lc, struct mbuf *m)
1264 {
1265 #if __FreeBSD_version >= 1100095
1266         if (hn_lro_mbufq_depth) {
1267                 tcp_lro_queue_mbuf(lc, m);
1268                 return 0;
1269         }
1270 #endif
1271         return tcp_lro_rx(lc, m, 0);
1272 }
1273 #endif
1274
1275 /*
1276  * Called when we receive a data packet from the "wire" on the
1277  * specified device
1278  *
1279  * Note:  This is no longer used as a callback
1280  */
1281 int
1282 netvsc_recv(struct hv_vmbus_channel *chan, netvsc_packet *packet,
1283     const rndis_tcp_ip_csum_info *csum_info,
1284     const struct rndis_hash_info *hash_info,
1285     const struct rndis_hash_value *hash_value)
1286 {
1287         struct hn_rx_ring *rxr = chan->hv_chan_rxr;
1288         struct ifnet *ifp = rxr->hn_ifp;
1289         struct mbuf *m_new;
1290         int size, do_lro = 0, do_csum = 1;
1291         int hash_type = M_HASHTYPE_OPAQUE_HASH;
1292
1293         if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
1294                 return (0);
1295
1296         /*
1297          * Bail out if packet contains more data than configured MTU.
1298          */
1299         if (packet->tot_data_buf_len > (ifp->if_mtu + ETHER_HDR_LEN)) {
1300                 return (0);
1301         } else if (packet->tot_data_buf_len <= MHLEN) {
1302                 m_new = m_gethdr(M_NOWAIT, MT_DATA);
1303                 if (m_new == NULL) {
1304                         if_inc_counter(ifp, IFCOUNTER_IQDROPS, 1);
1305                         return (0);
1306                 }
1307                 memcpy(mtod(m_new, void *), packet->data,
1308                     packet->tot_data_buf_len);
1309                 m_new->m_pkthdr.len = m_new->m_len = packet->tot_data_buf_len;
1310                 rxr->hn_small_pkts++;
1311         } else {
1312                 /*
1313                  * Get an mbuf with a cluster.  For packets 2K or less,
1314                  * get a standard 2K cluster.  For anything larger, get a
1315                  * 4K cluster.  Any buffers larger than 4K can cause problems
1316                  * if looped around to the Hyper-V TX channel, so avoid them.
1317                  */
1318                 size = MCLBYTES;
1319                 if (packet->tot_data_buf_len > MCLBYTES) {
1320                         /* 4096 */
1321                         size = MJUMPAGESIZE;
1322                 }
1323
1324                 m_new = m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR, size);
1325                 if (m_new == NULL) {
1326                         if_inc_counter(ifp, IFCOUNTER_IQDROPS, 1);
1327                         return (0);
1328                 }
1329
1330                 hv_m_append(m_new, packet->tot_data_buf_len, packet->data);
1331         }
1332         m_new->m_pkthdr.rcvif = ifp;
1333
1334         if (__predict_false((ifp->if_capenable & IFCAP_RXCSUM) == 0))
1335                 do_csum = 0;
1336
1337         /* receive side checksum offload */
1338         if (csum_info != NULL) {
1339                 /* IP csum offload */
1340                 if (csum_info->receive.ip_csum_succeeded && do_csum) {
1341                         m_new->m_pkthdr.csum_flags |=
1342                             (CSUM_IP_CHECKED | CSUM_IP_VALID);
1343                         rxr->hn_csum_ip++;
1344                 }
1345
1346                 /* TCP/UDP csum offload */
1347                 if ((csum_info->receive.tcp_csum_succeeded ||
1348                      csum_info->receive.udp_csum_succeeded) && do_csum) {
1349                         m_new->m_pkthdr.csum_flags |=
1350                             (CSUM_DATA_VALID | CSUM_PSEUDO_HDR);
1351                         m_new->m_pkthdr.csum_data = 0xffff;
1352                         if (csum_info->receive.tcp_csum_succeeded)
1353                                 rxr->hn_csum_tcp++;
1354                         else
1355                                 rxr->hn_csum_udp++;
1356                 }
1357
1358                 if (csum_info->receive.ip_csum_succeeded &&
1359                     csum_info->receive.tcp_csum_succeeded)
1360                         do_lro = 1;
1361         } else {
1362                 const struct ether_header *eh;
1363                 uint16_t etype;
1364                 int hoff;
1365
1366                 hoff = sizeof(*eh);
1367                 if (m_new->m_len < hoff)
1368                         goto skip;
1369                 eh = mtod(m_new, struct ether_header *);
1370                 etype = ntohs(eh->ether_type);
1371                 if (etype == ETHERTYPE_VLAN) {
1372                         const struct ether_vlan_header *evl;
1373
1374                         hoff = sizeof(*evl);
1375                         if (m_new->m_len < hoff)
1376                                 goto skip;
1377                         evl = mtod(m_new, struct ether_vlan_header *);
1378                         etype = ntohs(evl->evl_proto);
1379                 }
1380
1381                 if (etype == ETHERTYPE_IP) {
1382                         int pr;
1383
1384                         pr = hn_check_iplen(m_new, hoff);
1385                         if (pr == IPPROTO_TCP) {
1386                                 if (do_csum &&
1387                                     (rxr->hn_trust_hcsum &
1388                                      HN_TRUST_HCSUM_TCP)) {
1389                                         rxr->hn_csum_trusted++;
1390                                         m_new->m_pkthdr.csum_flags |=
1391                                            (CSUM_IP_CHECKED | CSUM_IP_VALID |
1392                                             CSUM_DATA_VALID | CSUM_PSEUDO_HDR);
1393                                         m_new->m_pkthdr.csum_data = 0xffff;
1394                                 }
1395                                 do_lro = 1;
1396                         } else if (pr == IPPROTO_UDP) {
1397                                 if (do_csum &&
1398                                     (rxr->hn_trust_hcsum &
1399                                      HN_TRUST_HCSUM_UDP)) {
1400                                         rxr->hn_csum_trusted++;
1401                                         m_new->m_pkthdr.csum_flags |=
1402                                            (CSUM_IP_CHECKED | CSUM_IP_VALID |
1403                                             CSUM_DATA_VALID | CSUM_PSEUDO_HDR);
1404                                         m_new->m_pkthdr.csum_data = 0xffff;
1405                                 }
1406                         } else if (pr != IPPROTO_DONE && do_csum &&
1407                             (rxr->hn_trust_hcsum & HN_TRUST_HCSUM_IP)) {
1408                                 rxr->hn_csum_trusted++;
1409                                 m_new->m_pkthdr.csum_flags |=
1410                                     (CSUM_IP_CHECKED | CSUM_IP_VALID);
1411                         }
1412                 }
1413         }
1414 skip:
1415         if ((packet->vlan_tci != 0) &&
1416             (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0) {
1417                 m_new->m_pkthdr.ether_vtag = packet->vlan_tci;
1418                 m_new->m_flags |= M_VLANTAG;
1419         }
1420
1421         if (hash_info != NULL && hash_value != NULL) {
1422                 rxr->hn_rss_pkts++;
1423                 m_new->m_pkthdr.flowid = hash_value->hash_value;
1424                 if ((hash_info->hash_info & NDIS_HASH_FUNCTION_MASK) ==
1425                     NDIS_HASH_FUNCTION_TOEPLITZ) {
1426                         uint32_t type =
1427                             (hash_info->hash_info & NDIS_HASH_TYPE_MASK);
1428
1429                         switch (type) {
1430                         case NDIS_HASH_IPV4:
1431                                 hash_type = M_HASHTYPE_RSS_IPV4;
1432                                 break;
1433
1434                         case NDIS_HASH_TCP_IPV4:
1435                                 hash_type = M_HASHTYPE_RSS_TCP_IPV4;
1436                                 break;
1437
1438                         case NDIS_HASH_IPV6:
1439                                 hash_type = M_HASHTYPE_RSS_IPV6;
1440                                 break;
1441
1442                         case NDIS_HASH_IPV6_EX:
1443                                 hash_type = M_HASHTYPE_RSS_IPV6_EX;
1444                                 break;
1445
1446                         case NDIS_HASH_TCP_IPV6:
1447                                 hash_type = M_HASHTYPE_RSS_TCP_IPV6;
1448                                 break;
1449
1450                         case NDIS_HASH_TCP_IPV6_EX:
1451                                 hash_type = M_HASHTYPE_RSS_TCP_IPV6_EX;
1452                                 break;
1453                         }
1454                 }
1455         } else {
1456                 if (hash_value != NULL) {
1457                         m_new->m_pkthdr.flowid = hash_value->hash_value;
1458                 } else {
1459                         m_new->m_pkthdr.flowid = rxr->hn_rx_idx;
1460                         hash_type = M_HASHTYPE_OPAQUE;
1461                 }
1462         }
1463         M_HASHTYPE_SET(m_new, hash_type);
1464
1465         /*
1466          * Note:  Moved RX completion back to hv_nv_on_receive() so all
1467          * messages (not just data messages) will trigger a response.
1468          */
1469
1470         if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1);
1471         rxr->hn_pkts++;
1472
1473         if ((ifp->if_capenable & IFCAP_LRO) && do_lro) {
1474 #if defined(INET) || defined(INET6)
1475                 struct lro_ctrl *lro = &rxr->hn_lro;
1476
1477                 if (lro->lro_cnt) {
1478                         rxr->hn_lro_tried++;
1479                         if (hn_lro_rx(lro, m_new) == 0) {
1480                                 /* DONE! */
1481                                 return 0;
1482                         }
1483                 }
1484 #endif
1485         }
1486
1487         /* We're not holding the lock here, so don't release it */
1488         (*ifp->if_input)(ifp, m_new);
1489
1490         return (0);
1491 }
1492
1493 /*
1494  * Rules for using sc->temp_unusable:
1495  * 1.  sc->temp_unusable can only be read or written while holding NV_LOCK()
1496  * 2.  code reading sc->temp_unusable under NV_LOCK(), and finding 
1497  *     sc->temp_unusable set, must release NV_LOCK() and exit
1498  * 3.  to retain exclusive control of the interface,
1499  *     sc->temp_unusable must be set by code before releasing NV_LOCK()
1500  * 4.  only code setting sc->temp_unusable can clear sc->temp_unusable
1501  * 5.  code setting sc->temp_unusable must eventually clear sc->temp_unusable
1502  */
1503
1504 /*
1505  * Standard ioctl entry point.  Called when the user wants to configure
1506  * the interface.
1507  */
1508 static int
1509 hn_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
1510 {
1511         hn_softc_t *sc = ifp->if_softc;
1512         struct ifreq *ifr = (struct ifreq *)data;
1513 #ifdef INET
1514         struct ifaddr *ifa = (struct ifaddr *)data;
1515 #endif
1516         netvsc_device_info device_info;
1517         int mask, error = 0;
1518         int retry_cnt = 500;
1519         
1520         switch(cmd) {
1521
1522         case SIOCSIFADDR:
1523 #ifdef INET
1524                 if (ifa->ifa_addr->sa_family == AF_INET) {
1525                         ifp->if_flags |= IFF_UP;
1526                         if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
1527                                 hn_ifinit(sc);
1528                         arp_ifinit(ifp, ifa);
1529                 } else
1530 #endif
1531                 error = ether_ioctl(ifp, cmd, data);
1532                 break;
1533         case SIOCSIFMTU:
1534                 /* Check MTU value change */
1535                 if (ifp->if_mtu == ifr->ifr_mtu)
1536                         break;
1537
1538                 if (ifr->ifr_mtu > NETVSC_MAX_CONFIGURABLE_MTU) {
1539                         error = EINVAL;
1540                         break;
1541                 }
1542
1543                 /* Obtain and record requested MTU */
1544                 ifp->if_mtu = ifr->ifr_mtu;
1545
1546 #if __FreeBSD_version >= 1100099
1547                 /*
1548                  * Make sure that LRO aggregation length limit is still
1549                  * valid, after the MTU change.
1550                  */
1551                 NV_LOCK(sc);
1552                 if (sc->hn_rx_ring[0].hn_lro.lro_length_lim <
1553                     HN_LRO_LENLIM_MIN(ifp))
1554                         hn_set_lro_lenlim(sc, HN_LRO_LENLIM_MIN(ifp));
1555                 NV_UNLOCK(sc);
1556 #endif
1557
1558                 do {
1559                         NV_LOCK(sc);
1560                         if (!sc->temp_unusable) {
1561                                 sc->temp_unusable = TRUE;
1562                                 retry_cnt = -1;
1563                         }
1564                         NV_UNLOCK(sc);
1565                         if (retry_cnt > 0) {
1566                                 retry_cnt--;
1567                                 DELAY(5 * 1000);
1568                         }
1569                 } while (retry_cnt > 0);
1570
1571                 if (retry_cnt == 0) {
1572                         error = EINVAL;
1573                         break;
1574                 }
1575
1576                 /* We must remove and add back the device to cause the new
1577                  * MTU to take effect.  This includes tearing down, but not
1578                  * deleting the channel, then bringing it back up.
1579                  */
1580                 error = hv_rf_on_device_remove(sc, HV_RF_NV_RETAIN_CHANNEL);
1581                 if (error) {
1582                         NV_LOCK(sc);
1583                         sc->temp_unusable = FALSE;
1584                         NV_UNLOCK(sc);
1585                         break;
1586                 }
1587
1588                 /* Wait for subchannels to be destroyed */
1589                 vmbus_drain_subchan(sc->hn_prichan);
1590
1591                 error = hv_rf_on_device_add(sc, &device_info,
1592                     sc->hn_rx_ring_inuse);
1593                 if (error) {
1594                         NV_LOCK(sc);
1595                         sc->temp_unusable = FALSE;
1596                         NV_UNLOCK(sc);
1597                         break;
1598                 }
1599                 KASSERT(sc->hn_rx_ring_cnt == sc->net_dev->num_channel,
1600                     ("RX ring count %d and channel count %u mismatch",
1601                      sc->hn_rx_ring_cnt, sc->net_dev->num_channel));
1602                 if (sc->net_dev->num_channel > 1) {
1603                         int r;
1604
1605                         /*
1606                          * Skip the rings on primary channel; they are
1607                          * handled by the hv_rf_on_device_add() above.
1608                          */
1609                         for (r = 1; r < sc->hn_rx_ring_cnt; ++r) {
1610                                 sc->hn_rx_ring[r].hn_rx_flags &=
1611                                     ~HN_RX_FLAG_ATTACHED;
1612                         }
1613                         for (r = 1; r < sc->hn_tx_ring_cnt; ++r) {
1614                                 sc->hn_tx_ring[r].hn_tx_flags &=
1615                                     ~HN_TX_FLAG_ATTACHED;
1616                         }
1617                         hn_subchan_setup(sc);
1618                 }
1619
1620                 sc->hn_tx_chimney_max = sc->net_dev->send_section_size;
1621                 if (sc->hn_tx_ring[0].hn_tx_chimney_size >
1622                     sc->hn_tx_chimney_max)
1623                         hn_set_tx_chimney_size(sc, sc->hn_tx_chimney_max);
1624
1625                 hn_ifinit_locked(sc);
1626
1627                 NV_LOCK(sc);
1628                 sc->temp_unusable = FALSE;
1629                 NV_UNLOCK(sc);
1630                 break;
1631         case SIOCSIFFLAGS:
1632                 do {
1633                        NV_LOCK(sc);
1634                        if (!sc->temp_unusable) {
1635                                sc->temp_unusable = TRUE;
1636                                retry_cnt = -1;
1637                        }
1638                        NV_UNLOCK(sc);
1639                        if (retry_cnt > 0) {
1640                                 retry_cnt--;
1641                                 DELAY(5 * 1000);
1642                        }
1643                 } while (retry_cnt > 0);
1644
1645                 if (retry_cnt == 0) {
1646                        error = EINVAL;
1647                        break;
1648                 }
1649
1650                 if (ifp->if_flags & IFF_UP) {
1651                         /*
1652                          * If only the state of the PROMISC flag changed,
1653                          * then just use the 'set promisc mode' command
1654                          * instead of reinitializing the entire NIC. Doing
1655                          * a full re-init means reloading the firmware and
1656                          * waiting for it to start up, which may take a
1657                          * second or two.
1658                          */
1659 #ifdef notyet
1660                         /* Fixme:  Promiscuous mode? */
1661                         if (ifp->if_drv_flags & IFF_DRV_RUNNING &&
1662                             ifp->if_flags & IFF_PROMISC &&
1663                             !(sc->hn_if_flags & IFF_PROMISC)) {
1664                                 /* do something here for Hyper-V */
1665                         } else if (ifp->if_drv_flags & IFF_DRV_RUNNING &&
1666                             !(ifp->if_flags & IFF_PROMISC) &&
1667                             sc->hn_if_flags & IFF_PROMISC) {
1668                                 /* do something here for Hyper-V */
1669                         } else
1670 #endif
1671                                 hn_ifinit_locked(sc);
1672                 } else {
1673                         if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1674                                 hn_stop(sc);
1675                         }
1676                 }
1677                 NV_LOCK(sc);
1678                 sc->temp_unusable = FALSE;
1679                 NV_UNLOCK(sc);
1680                 sc->hn_if_flags = ifp->if_flags;
1681                 error = 0;
1682                 break;
1683         case SIOCSIFCAP:
1684                 NV_LOCK(sc);
1685
1686                 mask = ifr->ifr_reqcap ^ ifp->if_capenable;
1687                 if (mask & IFCAP_TXCSUM) {
1688                         ifp->if_capenable ^= IFCAP_TXCSUM;
1689                         if (ifp->if_capenable & IFCAP_TXCSUM) {
1690                                 ifp->if_hwassist |=
1691                                     sc->hn_tx_ring[0].hn_csum_assist;
1692                         } else {
1693                                 ifp->if_hwassist &=
1694                                     ~sc->hn_tx_ring[0].hn_csum_assist;
1695                         }
1696                 }
1697
1698                 if (mask & IFCAP_RXCSUM)
1699                         ifp->if_capenable ^= IFCAP_RXCSUM;
1700
1701                 if (mask & IFCAP_LRO)
1702                         ifp->if_capenable ^= IFCAP_LRO;
1703
1704                 if (mask & IFCAP_TSO4) {
1705                         ifp->if_capenable ^= IFCAP_TSO4;
1706                         if (ifp->if_capenable & IFCAP_TSO4)
1707                                 ifp->if_hwassist |= CSUM_IP_TSO;
1708                         else
1709                                 ifp->if_hwassist &= ~CSUM_IP_TSO;
1710                 }
1711
1712                 if (mask & IFCAP_TSO6) {
1713                         ifp->if_capenable ^= IFCAP_TSO6;
1714                         if (ifp->if_capenable & IFCAP_TSO6)
1715                                 ifp->if_hwassist |= CSUM_IP6_TSO;
1716                         else
1717                                 ifp->if_hwassist &= ~CSUM_IP6_TSO;
1718                 }
1719
1720                 NV_UNLOCK(sc);
1721                 error = 0;
1722                 break;
1723         case SIOCADDMULTI:
1724         case SIOCDELMULTI:
1725 #ifdef notyet
1726                 /* Fixme:  Multicast mode? */
1727                 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1728                         NV_LOCK(sc);
1729                         netvsc_setmulti(sc);
1730                         NV_UNLOCK(sc);
1731                         error = 0;
1732                 }
1733 #endif
1734                 error = EINVAL;
1735                 break;
1736         case SIOCSIFMEDIA:
1737         case SIOCGIFMEDIA:
1738                 error = ifmedia_ioctl(ifp, ifr, &sc->hn_media, cmd);
1739                 break;
1740         default:
1741                 error = ether_ioctl(ifp, cmd, data);
1742                 break;
1743         }
1744
1745         return (error);
1746 }
1747
1748 /*
1749  *
1750  */
1751 static void
1752 hn_stop(hn_softc_t *sc)
1753 {
1754         struct ifnet *ifp;
1755         int ret, i;
1756
1757         ifp = sc->hn_ifp;
1758
1759         if (bootverbose)
1760                 printf(" Closing Device ...\n");
1761
1762         atomic_clear_int(&ifp->if_drv_flags,
1763             (IFF_DRV_RUNNING | IFF_DRV_OACTIVE));
1764         for (i = 0; i < sc->hn_tx_ring_inuse; ++i)
1765                 sc->hn_tx_ring[i].hn_oactive = 0;
1766
1767         if_link_state_change(ifp, LINK_STATE_DOWN);
1768         sc->hn_initdone = 0;
1769
1770         ret = hv_rf_on_close(sc);
1771 }
1772
1773 /*
1774  * FreeBSD transmit entry point
1775  */
1776 static void
1777 hn_start(struct ifnet *ifp)
1778 {
1779         struct hn_softc *sc = ifp->if_softc;
1780         struct hn_tx_ring *txr = &sc->hn_tx_ring[0];
1781
1782         if (txr->hn_sched_tx)
1783                 goto do_sched;
1784
1785         if (mtx_trylock(&txr->hn_tx_lock)) {
1786                 int sched;
1787
1788                 sched = hn_start_locked(txr, txr->hn_direct_tx_size);
1789                 mtx_unlock(&txr->hn_tx_lock);
1790                 if (!sched)
1791                         return;
1792         }
1793 do_sched:
1794         taskqueue_enqueue(txr->hn_tx_taskq, &txr->hn_tx_task);
1795 }
1796
1797 static void
1798 hn_start_txeof(struct hn_tx_ring *txr)
1799 {
1800         struct hn_softc *sc = txr->hn_sc;
1801         struct ifnet *ifp = sc->hn_ifp;
1802
1803         KASSERT(txr == &sc->hn_tx_ring[0], ("not the first TX ring"));
1804
1805         if (txr->hn_sched_tx)
1806                 goto do_sched;
1807
1808         if (mtx_trylock(&txr->hn_tx_lock)) {
1809                 int sched;
1810
1811                 atomic_clear_int(&ifp->if_drv_flags, IFF_DRV_OACTIVE);
1812                 sched = hn_start_locked(txr, txr->hn_direct_tx_size);
1813                 mtx_unlock(&txr->hn_tx_lock);
1814                 if (sched) {
1815                         taskqueue_enqueue(txr->hn_tx_taskq,
1816                             &txr->hn_tx_task);
1817                 }
1818         } else {
1819 do_sched:
1820                 /*
1821                  * Release the OACTIVE earlier, with the hope, that
1822                  * others could catch up.  The task will clear the
1823                  * flag again with the hn_tx_lock to avoid possible
1824                  * races.
1825                  */
1826                 atomic_clear_int(&ifp->if_drv_flags, IFF_DRV_OACTIVE);
1827                 taskqueue_enqueue(txr->hn_tx_taskq, &txr->hn_txeof_task);
1828         }
1829 }
1830
1831 /*
1832  *
1833  */
1834 static void
1835 hn_ifinit_locked(hn_softc_t *sc)
1836 {
1837         struct ifnet *ifp;
1838         int ret, i;
1839
1840         ifp = sc->hn_ifp;
1841
1842         if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1843                 return;
1844         }
1845
1846         hv_promisc_mode = 1;
1847
1848         ret = hv_rf_on_open(sc);
1849         if (ret != 0) {
1850                 return;
1851         } else {
1852                 sc->hn_initdone = 1;
1853         }
1854
1855         atomic_clear_int(&ifp->if_drv_flags, IFF_DRV_OACTIVE);
1856         for (i = 0; i < sc->hn_tx_ring_inuse; ++i)
1857                 sc->hn_tx_ring[i].hn_oactive = 0;
1858
1859         atomic_set_int(&ifp->if_drv_flags, IFF_DRV_RUNNING);
1860         if_link_state_change(ifp, LINK_STATE_UP);
1861 }
1862
1863 /*
1864  *
1865  */
1866 static void
1867 hn_ifinit(void *xsc)
1868 {
1869         hn_softc_t *sc = xsc;
1870
1871         NV_LOCK(sc);
1872         if (sc->temp_unusable) {
1873                 NV_UNLOCK(sc);
1874                 return;
1875         }
1876         sc->temp_unusable = TRUE;
1877         NV_UNLOCK(sc);
1878
1879         hn_ifinit_locked(sc);
1880
1881         NV_LOCK(sc);
1882         sc->temp_unusable = FALSE;
1883         NV_UNLOCK(sc);
1884 }
1885
1886 #ifdef LATER
1887 /*
1888  *
1889  */
1890 static void
1891 hn_watchdog(struct ifnet *ifp)
1892 {
1893         hn_softc_t *sc;
1894         sc = ifp->if_softc;
1895
1896         printf("hn%d: watchdog timeout -- resetting\n", sc->hn_unit);
1897         hn_ifinit(sc);    /*???*/
1898         if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
1899 }
1900 #endif
1901
1902 #if __FreeBSD_version >= 1100099
1903
1904 static int
1905 hn_lro_lenlim_sysctl(SYSCTL_HANDLER_ARGS)
1906 {
1907         struct hn_softc *sc = arg1;
1908         unsigned int lenlim;
1909         int error;
1910
1911         lenlim = sc->hn_rx_ring[0].hn_lro.lro_length_lim;
1912         error = sysctl_handle_int(oidp, &lenlim, 0, req);
1913         if (error || req->newptr == NULL)
1914                 return error;
1915
1916         if (lenlim < HN_LRO_LENLIM_MIN(sc->hn_ifp) ||
1917             lenlim > TCP_LRO_LENGTH_MAX)
1918                 return EINVAL;
1919
1920         NV_LOCK(sc);
1921         hn_set_lro_lenlim(sc, lenlim);
1922         NV_UNLOCK(sc);
1923         return 0;
1924 }
1925
1926 static int
1927 hn_lro_ackcnt_sysctl(SYSCTL_HANDLER_ARGS)
1928 {
1929         struct hn_softc *sc = arg1;
1930         int ackcnt, error, i;
1931
1932         /*
1933          * lro_ackcnt_lim is append count limit,
1934          * +1 to turn it into aggregation limit.
1935          */
1936         ackcnt = sc->hn_rx_ring[0].hn_lro.lro_ackcnt_lim + 1;
1937         error = sysctl_handle_int(oidp, &ackcnt, 0, req);
1938         if (error || req->newptr == NULL)
1939                 return error;
1940
1941         if (ackcnt < 2 || ackcnt > (TCP_LRO_ACKCNT_MAX + 1))
1942                 return EINVAL;
1943
1944         /*
1945          * Convert aggregation limit back to append
1946          * count limit.
1947          */
1948         --ackcnt;
1949         NV_LOCK(sc);
1950         for (i = 0; i < sc->hn_rx_ring_inuse; ++i)
1951                 sc->hn_rx_ring[i].hn_lro.lro_ackcnt_lim = ackcnt;
1952         NV_UNLOCK(sc);
1953         return 0;
1954 }
1955
1956 #endif
1957
1958 static int
1959 hn_trust_hcsum_sysctl(SYSCTL_HANDLER_ARGS)
1960 {
1961         struct hn_softc *sc = arg1;
1962         int hcsum = arg2;
1963         int on, error, i;
1964
1965         on = 0;
1966         if (sc->hn_rx_ring[0].hn_trust_hcsum & hcsum)
1967                 on = 1;
1968
1969         error = sysctl_handle_int(oidp, &on, 0, req);
1970         if (error || req->newptr == NULL)
1971                 return error;
1972
1973         NV_LOCK(sc);
1974         for (i = 0; i < sc->hn_rx_ring_inuse; ++i) {
1975                 struct hn_rx_ring *rxr = &sc->hn_rx_ring[i];
1976
1977                 if (on)
1978                         rxr->hn_trust_hcsum |= hcsum;
1979                 else
1980                         rxr->hn_trust_hcsum &= ~hcsum;
1981         }
1982         NV_UNLOCK(sc);
1983         return 0;
1984 }
1985
1986 static int
1987 hn_tx_chimney_size_sysctl(SYSCTL_HANDLER_ARGS)
1988 {
1989         struct hn_softc *sc = arg1;
1990         int chimney_size, error;
1991
1992         chimney_size = sc->hn_tx_ring[0].hn_tx_chimney_size;
1993         error = sysctl_handle_int(oidp, &chimney_size, 0, req);
1994         if (error || req->newptr == NULL)
1995                 return error;
1996
1997         if (chimney_size > sc->hn_tx_chimney_max || chimney_size <= 0)
1998                 return EINVAL;
1999
2000         hn_set_tx_chimney_size(sc, chimney_size);
2001         return 0;
2002 }
2003
2004 static int
2005 hn_rx_stat_ulong_sysctl(SYSCTL_HANDLER_ARGS)
2006 {
2007         struct hn_softc *sc = arg1;
2008         int ofs = arg2, i, error;
2009         struct hn_rx_ring *rxr;
2010         u_long stat;
2011
2012         stat = 0;
2013         for (i = 0; i < sc->hn_rx_ring_inuse; ++i) {
2014                 rxr = &sc->hn_rx_ring[i];
2015                 stat += *((u_long *)((uint8_t *)rxr + ofs));
2016         }
2017
2018         error = sysctl_handle_long(oidp, &stat, 0, req);
2019         if (error || req->newptr == NULL)
2020                 return error;
2021
2022         /* Zero out this stat. */
2023         for (i = 0; i < sc->hn_rx_ring_inuse; ++i) {
2024                 rxr = &sc->hn_rx_ring[i];
2025                 *((u_long *)((uint8_t *)rxr + ofs)) = 0;
2026         }
2027         return 0;
2028 }
2029
2030 static int
2031 hn_rx_stat_u64_sysctl(SYSCTL_HANDLER_ARGS)
2032 {
2033         struct hn_softc *sc = arg1;
2034         int ofs = arg2, i, error;
2035         struct hn_rx_ring *rxr;
2036         uint64_t stat;
2037
2038         stat = 0;
2039         for (i = 0; i < sc->hn_rx_ring_inuse; ++i) {
2040                 rxr = &sc->hn_rx_ring[i];
2041                 stat += *((uint64_t *)((uint8_t *)rxr + ofs));
2042         }
2043
2044         error = sysctl_handle_64(oidp, &stat, 0, req);
2045         if (error || req->newptr == NULL)
2046                 return error;
2047
2048         /* Zero out this stat. */
2049         for (i = 0; i < sc->hn_rx_ring_inuse; ++i) {
2050                 rxr = &sc->hn_rx_ring[i];
2051                 *((uint64_t *)((uint8_t *)rxr + ofs)) = 0;
2052         }
2053         return 0;
2054 }
2055
2056 static int
2057 hn_tx_stat_ulong_sysctl(SYSCTL_HANDLER_ARGS)
2058 {
2059         struct hn_softc *sc = arg1;
2060         int ofs = arg2, i, error;
2061         struct hn_tx_ring *txr;
2062         u_long stat;
2063
2064         stat = 0;
2065         for (i = 0; i < sc->hn_tx_ring_inuse; ++i) {
2066                 txr = &sc->hn_tx_ring[i];
2067                 stat += *((u_long *)((uint8_t *)txr + ofs));
2068         }
2069
2070         error = sysctl_handle_long(oidp, &stat, 0, req);
2071         if (error || req->newptr == NULL)
2072                 return error;
2073
2074         /* Zero out this stat. */
2075         for (i = 0; i < sc->hn_tx_ring_inuse; ++i) {
2076                 txr = &sc->hn_tx_ring[i];
2077                 *((u_long *)((uint8_t *)txr + ofs)) = 0;
2078         }
2079         return 0;
2080 }
2081
2082 static int
2083 hn_tx_conf_int_sysctl(SYSCTL_HANDLER_ARGS)
2084 {
2085         struct hn_softc *sc = arg1;
2086         int ofs = arg2, i, error, conf;
2087         struct hn_tx_ring *txr;
2088
2089         txr = &sc->hn_tx_ring[0];
2090         conf = *((int *)((uint8_t *)txr + ofs));
2091
2092         error = sysctl_handle_int(oidp, &conf, 0, req);
2093         if (error || req->newptr == NULL)
2094                 return error;
2095
2096         NV_LOCK(sc);
2097         for (i = 0; i < sc->hn_tx_ring_inuse; ++i) {
2098                 txr = &sc->hn_tx_ring[i];
2099                 *((int *)((uint8_t *)txr + ofs)) = conf;
2100         }
2101         NV_UNLOCK(sc);
2102
2103         return 0;
2104 }
2105
2106 static int
2107 hn_check_iplen(const struct mbuf *m, int hoff)
2108 {
2109         const struct ip *ip;
2110         int len, iphlen, iplen;
2111         const struct tcphdr *th;
2112         int thoff;                              /* TCP data offset */
2113
2114         len = hoff + sizeof(struct ip);
2115
2116         /* The packet must be at least the size of an IP header. */
2117         if (m->m_pkthdr.len < len)
2118                 return IPPROTO_DONE;
2119
2120         /* The fixed IP header must reside completely in the first mbuf. */
2121         if (m->m_len < len)
2122                 return IPPROTO_DONE;
2123
2124         ip = mtodo(m, hoff);
2125
2126         /* Bound check the packet's stated IP header length. */
2127         iphlen = ip->ip_hl << 2;
2128         if (iphlen < sizeof(struct ip))         /* minimum header length */
2129                 return IPPROTO_DONE;
2130
2131         /* The full IP header must reside completely in the one mbuf. */
2132         if (m->m_len < hoff + iphlen)
2133                 return IPPROTO_DONE;
2134
2135         iplen = ntohs(ip->ip_len);
2136
2137         /*
2138          * Check that the amount of data in the buffers is as
2139          * at least much as the IP header would have us expect.
2140          */
2141         if (m->m_pkthdr.len < hoff + iplen)
2142                 return IPPROTO_DONE;
2143
2144         /*
2145          * Ignore IP fragments.
2146          */
2147         if (ntohs(ip->ip_off) & (IP_OFFMASK | IP_MF))
2148                 return IPPROTO_DONE;
2149
2150         /*
2151          * The TCP/IP or UDP/IP header must be entirely contained within
2152          * the first fragment of a packet.
2153          */
2154         switch (ip->ip_p) {
2155         case IPPROTO_TCP:
2156                 if (iplen < iphlen + sizeof(struct tcphdr))
2157                         return IPPROTO_DONE;
2158                 if (m->m_len < hoff + iphlen + sizeof(struct tcphdr))
2159                         return IPPROTO_DONE;
2160                 th = (const struct tcphdr *)((const uint8_t *)ip + iphlen);
2161                 thoff = th->th_off << 2;
2162                 if (thoff < sizeof(struct tcphdr) || thoff + iphlen > iplen)
2163                         return IPPROTO_DONE;
2164                 if (m->m_len < hoff + iphlen + thoff)
2165                         return IPPROTO_DONE;
2166                 break;
2167         case IPPROTO_UDP:
2168                 if (iplen < iphlen + sizeof(struct udphdr))
2169                         return IPPROTO_DONE;
2170                 if (m->m_len < hoff + iphlen + sizeof(struct udphdr))
2171                         return IPPROTO_DONE;
2172                 break;
2173         default:
2174                 if (iplen < iphlen)
2175                         return IPPROTO_DONE;
2176                 break;
2177         }
2178         return ip->ip_p;
2179 }
2180
2181 static void
2182 hn_create_rx_data(struct hn_softc *sc, int ring_cnt)
2183 {
2184         struct sysctl_oid_list *child;
2185         struct sysctl_ctx_list *ctx;
2186         device_t dev = sc->hn_dev;
2187 #if defined(INET) || defined(INET6)
2188 #if __FreeBSD_version >= 1100095
2189         int lroent_cnt;
2190 #endif
2191 #endif
2192         int i;
2193
2194         sc->hn_rx_ring_cnt = ring_cnt;
2195         sc->hn_rx_ring_inuse = sc->hn_rx_ring_cnt;
2196
2197         sc->hn_rx_ring = malloc(sizeof(struct hn_rx_ring) * sc->hn_rx_ring_cnt,
2198             M_NETVSC, M_WAITOK | M_ZERO);
2199
2200 #if defined(INET) || defined(INET6)
2201 #if __FreeBSD_version >= 1100095
2202         lroent_cnt = hn_lro_entry_count;
2203         if (lroent_cnt < TCP_LRO_ENTRIES)
2204                 lroent_cnt = TCP_LRO_ENTRIES;
2205         device_printf(dev, "LRO: entry count %d\n", lroent_cnt);
2206 #endif
2207 #endif  /* INET || INET6 */
2208
2209         ctx = device_get_sysctl_ctx(dev);
2210         child = SYSCTL_CHILDREN(device_get_sysctl_tree(dev));
2211
2212         /* Create dev.hn.UNIT.rx sysctl tree */
2213         sc->hn_rx_sysctl_tree = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "rx",
2214             CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "");
2215
2216         for (i = 0; i < sc->hn_rx_ring_cnt; ++i) {
2217                 struct hn_rx_ring *rxr = &sc->hn_rx_ring[i];
2218
2219                 if (hn_trust_hosttcp)
2220                         rxr->hn_trust_hcsum |= HN_TRUST_HCSUM_TCP;
2221                 if (hn_trust_hostudp)
2222                         rxr->hn_trust_hcsum |= HN_TRUST_HCSUM_UDP;
2223                 if (hn_trust_hostip)
2224                         rxr->hn_trust_hcsum |= HN_TRUST_HCSUM_IP;
2225                 rxr->hn_ifp = sc->hn_ifp;
2226                 rxr->hn_rx_idx = i;
2227
2228                 /*
2229                  * Initialize LRO.
2230                  */
2231 #if defined(INET) || defined(INET6)
2232 #if __FreeBSD_version >= 1100095
2233                 tcp_lro_init_args(&rxr->hn_lro, sc->hn_ifp, lroent_cnt,
2234                     hn_lro_mbufq_depth);
2235 #else
2236                 tcp_lro_init(&rxr->hn_lro);
2237                 rxr->hn_lro.ifp = sc->hn_ifp;
2238 #endif
2239 #if __FreeBSD_version >= 1100099
2240                 rxr->hn_lro.lro_length_lim = HN_LRO_LENLIM_DEF;
2241                 rxr->hn_lro.lro_ackcnt_lim = HN_LRO_ACKCNT_DEF;
2242 #endif
2243 #endif  /* INET || INET6 */
2244
2245                 if (sc->hn_rx_sysctl_tree != NULL) {
2246                         char name[16];
2247
2248                         /*
2249                          * Create per RX ring sysctl tree:
2250                          * dev.hn.UNIT.rx.RINGID
2251                          */
2252                         snprintf(name, sizeof(name), "%d", i);
2253                         rxr->hn_rx_sysctl_tree = SYSCTL_ADD_NODE(ctx,
2254                             SYSCTL_CHILDREN(sc->hn_rx_sysctl_tree),
2255                             OID_AUTO, name, CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "");
2256
2257                         if (rxr->hn_rx_sysctl_tree != NULL) {
2258                                 SYSCTL_ADD_ULONG(ctx,
2259                                     SYSCTL_CHILDREN(rxr->hn_rx_sysctl_tree),
2260                                     OID_AUTO, "packets", CTLFLAG_RW,
2261                                     &rxr->hn_pkts, "# of packets received");
2262                                 SYSCTL_ADD_ULONG(ctx,
2263                                     SYSCTL_CHILDREN(rxr->hn_rx_sysctl_tree),
2264                                     OID_AUTO, "rss_pkts", CTLFLAG_RW,
2265                                     &rxr->hn_rss_pkts,
2266                                     "# of packets w/ RSS info received");
2267                         }
2268                 }
2269         }
2270
2271         SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "lro_queued",
2272             CTLTYPE_U64 | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
2273             __offsetof(struct hn_rx_ring, hn_lro.lro_queued),
2274             hn_rx_stat_u64_sysctl, "LU", "LRO queued");
2275         SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "lro_flushed",
2276             CTLTYPE_U64 | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
2277             __offsetof(struct hn_rx_ring, hn_lro.lro_flushed),
2278             hn_rx_stat_u64_sysctl, "LU", "LRO flushed");
2279         SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "lro_tried",
2280             CTLTYPE_ULONG | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
2281             __offsetof(struct hn_rx_ring, hn_lro_tried),
2282             hn_rx_stat_ulong_sysctl, "LU", "# of LRO tries");
2283 #if __FreeBSD_version >= 1100099
2284         SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "lro_length_lim",
2285             CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_MPSAFE, sc, 0,
2286             hn_lro_lenlim_sysctl, "IU",
2287             "Max # of data bytes to be aggregated by LRO");
2288         SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "lro_ackcnt_lim",
2289             CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, sc, 0,
2290             hn_lro_ackcnt_sysctl, "I",
2291             "Max # of ACKs to be aggregated by LRO");
2292 #endif
2293         SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "trust_hosttcp",
2294             CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, sc, HN_TRUST_HCSUM_TCP,
2295             hn_trust_hcsum_sysctl, "I",
2296             "Trust tcp segement verification on host side, "
2297             "when csum info is missing");
2298         SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "trust_hostudp",
2299             CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, sc, HN_TRUST_HCSUM_UDP,
2300             hn_trust_hcsum_sysctl, "I",
2301             "Trust udp datagram verification on host side, "
2302             "when csum info is missing");
2303         SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "trust_hostip",
2304             CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, sc, HN_TRUST_HCSUM_IP,
2305             hn_trust_hcsum_sysctl, "I",
2306             "Trust ip packet verification on host side, "
2307             "when csum info is missing");
2308         SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "csum_ip",
2309             CTLTYPE_ULONG | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
2310             __offsetof(struct hn_rx_ring, hn_csum_ip),
2311             hn_rx_stat_ulong_sysctl, "LU", "RXCSUM IP");
2312         SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "csum_tcp",
2313             CTLTYPE_ULONG | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
2314             __offsetof(struct hn_rx_ring, hn_csum_tcp),
2315             hn_rx_stat_ulong_sysctl, "LU", "RXCSUM TCP");
2316         SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "csum_udp",
2317             CTLTYPE_ULONG | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
2318             __offsetof(struct hn_rx_ring, hn_csum_udp),
2319             hn_rx_stat_ulong_sysctl, "LU", "RXCSUM UDP");
2320         SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "csum_trusted",
2321             CTLTYPE_ULONG | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
2322             __offsetof(struct hn_rx_ring, hn_csum_trusted),
2323             hn_rx_stat_ulong_sysctl, "LU",
2324             "# of packets that we trust host's csum verification");
2325         SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "small_pkts",
2326             CTLTYPE_ULONG | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
2327             __offsetof(struct hn_rx_ring, hn_small_pkts),
2328             hn_rx_stat_ulong_sysctl, "LU", "# of small packets received");
2329         SYSCTL_ADD_INT(ctx, child, OID_AUTO, "rx_ring_cnt",
2330             CTLFLAG_RD, &sc->hn_rx_ring_cnt, 0, "# created RX rings");
2331         SYSCTL_ADD_INT(ctx, child, OID_AUTO, "rx_ring_inuse",
2332             CTLFLAG_RD, &sc->hn_rx_ring_inuse, 0, "# used RX rings");
2333 }
2334
2335 static void
2336 hn_destroy_rx_data(struct hn_softc *sc)
2337 {
2338 #if defined(INET) || defined(INET6)
2339         int i;
2340 #endif
2341
2342         if (sc->hn_rx_ring_cnt == 0)
2343                 return;
2344
2345 #if defined(INET) || defined(INET6)
2346         for (i = 0; i < sc->hn_rx_ring_cnt; ++i)
2347                 tcp_lro_free(&sc->hn_rx_ring[i].hn_lro);
2348 #endif
2349         free(sc->hn_rx_ring, M_NETVSC);
2350         sc->hn_rx_ring = NULL;
2351
2352         sc->hn_rx_ring_cnt = 0;
2353         sc->hn_rx_ring_inuse = 0;
2354 }
2355
2356 static int
2357 hn_create_tx_ring(struct hn_softc *sc, int id)
2358 {
2359         struct hn_tx_ring *txr = &sc->hn_tx_ring[id];
2360         device_t dev = sc->hn_dev;
2361         bus_dma_tag_t parent_dtag;
2362         int error, i;
2363         uint32_t version;
2364
2365         txr->hn_sc = sc;
2366         txr->hn_tx_idx = id;
2367
2368 #ifndef HN_USE_TXDESC_BUFRING
2369         mtx_init(&txr->hn_txlist_spin, "hn txlist", NULL, MTX_SPIN);
2370 #endif
2371         mtx_init(&txr->hn_tx_lock, "hn tx", NULL, MTX_DEF);
2372
2373         txr->hn_txdesc_cnt = HN_TX_DESC_CNT;
2374         txr->hn_txdesc = malloc(sizeof(struct hn_txdesc) * txr->hn_txdesc_cnt,
2375             M_NETVSC, M_WAITOK | M_ZERO);
2376 #ifndef HN_USE_TXDESC_BUFRING
2377         SLIST_INIT(&txr->hn_txlist);
2378 #else
2379         txr->hn_txdesc_br = buf_ring_alloc(txr->hn_txdesc_cnt, M_NETVSC,
2380             M_WAITOK, &txr->hn_tx_lock);
2381 #endif
2382
2383         txr->hn_tx_taskq = sc->hn_tx_taskq;
2384
2385         if (hn_use_if_start) {
2386                 txr->hn_txeof = hn_start_txeof;
2387                 TASK_INIT(&txr->hn_tx_task, 0, hn_start_taskfunc, txr);
2388                 TASK_INIT(&txr->hn_txeof_task, 0, hn_start_txeof_taskfunc, txr);
2389         } else {
2390                 int br_depth;
2391
2392                 txr->hn_txeof = hn_xmit_txeof;
2393                 TASK_INIT(&txr->hn_tx_task, 0, hn_xmit_taskfunc, txr);
2394                 TASK_INIT(&txr->hn_txeof_task, 0, hn_xmit_txeof_taskfunc, txr);
2395
2396                 br_depth = hn_get_txswq_depth(txr);
2397                 txr->hn_mbuf_br = buf_ring_alloc(br_depth, M_NETVSC,
2398                     M_WAITOK, &txr->hn_tx_lock);
2399         }
2400
2401         txr->hn_direct_tx_size = hn_direct_tx_size;
2402         version = VMBUS_GET_VERSION(device_get_parent(dev), dev);
2403         if (version >= VMBUS_VERSION_WIN8_1) {
2404                 txr->hn_csum_assist = HN_CSUM_ASSIST;
2405         } else {
2406                 txr->hn_csum_assist = HN_CSUM_ASSIST_WIN8;
2407                 if (id == 0) {
2408                         device_printf(dev, "bus version %u.%u, "
2409                             "no UDP checksum offloading\n",
2410                             VMBUS_VERSION_MAJOR(version),
2411                             VMBUS_VERSION_MINOR(version));
2412                 }
2413         }
2414
2415         /*
2416          * Always schedule transmission instead of trying to do direct
2417          * transmission.  This one gives the best performance so far.
2418          */
2419         txr->hn_sched_tx = 1;
2420
2421         parent_dtag = bus_get_dma_tag(dev);
2422
2423         /* DMA tag for RNDIS messages. */
2424         error = bus_dma_tag_create(parent_dtag, /* parent */
2425             HN_RNDIS_MSG_ALIGN,         /* alignment */
2426             HN_RNDIS_MSG_BOUNDARY,      /* boundary */
2427             BUS_SPACE_MAXADDR,          /* lowaddr */
2428             BUS_SPACE_MAXADDR,          /* highaddr */
2429             NULL, NULL,                 /* filter, filterarg */
2430             HN_RNDIS_MSG_LEN,           /* maxsize */
2431             1,                          /* nsegments */
2432             HN_RNDIS_MSG_LEN,           /* maxsegsize */
2433             0,                          /* flags */
2434             NULL,                       /* lockfunc */
2435             NULL,                       /* lockfuncarg */
2436             &txr->hn_tx_rndis_dtag);
2437         if (error) {
2438                 device_printf(dev, "failed to create rndis dmatag\n");
2439                 return error;
2440         }
2441
2442         /* DMA tag for data. */
2443         error = bus_dma_tag_create(parent_dtag, /* parent */
2444             1,                          /* alignment */
2445             HN_TX_DATA_BOUNDARY,        /* boundary */
2446             BUS_SPACE_MAXADDR,          /* lowaddr */
2447             BUS_SPACE_MAXADDR,          /* highaddr */
2448             NULL, NULL,                 /* filter, filterarg */
2449             HN_TX_DATA_MAXSIZE,         /* maxsize */
2450             HN_TX_DATA_SEGCNT_MAX,      /* nsegments */
2451             HN_TX_DATA_SEGSIZE,         /* maxsegsize */
2452             0,                          /* flags */
2453             NULL,                       /* lockfunc */
2454             NULL,                       /* lockfuncarg */
2455             &txr->hn_tx_data_dtag);
2456         if (error) {
2457                 device_printf(dev, "failed to create data dmatag\n");
2458                 return error;
2459         }
2460
2461         for (i = 0; i < txr->hn_txdesc_cnt; ++i) {
2462                 struct hn_txdesc *txd = &txr->hn_txdesc[i];
2463
2464                 txd->txr = txr;
2465
2466                 /*
2467                  * Allocate and load RNDIS messages.
2468                  */
2469                 error = bus_dmamem_alloc(txr->hn_tx_rndis_dtag,
2470                     (void **)&txd->rndis_msg,
2471                     BUS_DMA_WAITOK | BUS_DMA_COHERENT,
2472                     &txd->rndis_msg_dmap);
2473                 if (error) {
2474                         device_printf(dev,
2475                             "failed to allocate rndis_msg, %d\n", i);
2476                         return error;
2477                 }
2478
2479                 error = bus_dmamap_load(txr->hn_tx_rndis_dtag,
2480                     txd->rndis_msg_dmap,
2481                     txd->rndis_msg, HN_RNDIS_MSG_LEN,
2482                     hyperv_dma_map_paddr, &txd->rndis_msg_paddr,
2483                     BUS_DMA_NOWAIT);
2484                 if (error) {
2485                         device_printf(dev,
2486                             "failed to load rndis_msg, %d\n", i);
2487                         bus_dmamem_free(txr->hn_tx_rndis_dtag,
2488                             txd->rndis_msg, txd->rndis_msg_dmap);
2489                         return error;
2490                 }
2491
2492                 /* DMA map for TX data. */
2493                 error = bus_dmamap_create(txr->hn_tx_data_dtag, 0,
2494                     &txd->data_dmap);
2495                 if (error) {
2496                         device_printf(dev,
2497                             "failed to allocate tx data dmamap\n");
2498                         bus_dmamap_unload(txr->hn_tx_rndis_dtag,
2499                             txd->rndis_msg_dmap);
2500                         bus_dmamem_free(txr->hn_tx_rndis_dtag,
2501                             txd->rndis_msg, txd->rndis_msg_dmap);
2502                         return error;
2503                 }
2504
2505                 /* All set, put it to list */
2506                 txd->flags |= HN_TXD_FLAG_ONLIST;
2507 #ifndef HN_USE_TXDESC_BUFRING
2508                 SLIST_INSERT_HEAD(&txr->hn_txlist, txd, link);
2509 #else
2510                 buf_ring_enqueue(txr->hn_txdesc_br, txd);
2511 #endif
2512         }
2513         txr->hn_txdesc_avail = txr->hn_txdesc_cnt;
2514
2515         if (sc->hn_tx_sysctl_tree != NULL) {
2516                 struct sysctl_oid_list *child;
2517                 struct sysctl_ctx_list *ctx;
2518                 char name[16];
2519
2520                 /*
2521                  * Create per TX ring sysctl tree:
2522                  * dev.hn.UNIT.tx.RINGID
2523                  */
2524                 ctx = device_get_sysctl_ctx(dev);
2525                 child = SYSCTL_CHILDREN(sc->hn_tx_sysctl_tree);
2526
2527                 snprintf(name, sizeof(name), "%d", id);
2528                 txr->hn_tx_sysctl_tree = SYSCTL_ADD_NODE(ctx, child, OID_AUTO,
2529                     name, CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "");
2530
2531                 if (txr->hn_tx_sysctl_tree != NULL) {
2532                         child = SYSCTL_CHILDREN(txr->hn_tx_sysctl_tree);
2533
2534                         SYSCTL_ADD_INT(ctx, child, OID_AUTO, "txdesc_avail",
2535                             CTLFLAG_RD, &txr->hn_txdesc_avail, 0,
2536                             "# of available TX descs");
2537                         if (!hn_use_if_start) {
2538                                 SYSCTL_ADD_INT(ctx, child, OID_AUTO, "oactive",
2539                                     CTLFLAG_RD, &txr->hn_oactive, 0,
2540                                     "over active");
2541                         }
2542                         SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "packets",
2543                             CTLFLAG_RW, &txr->hn_pkts,
2544                             "# of packets transmitted");
2545                 }
2546         }
2547
2548         return 0;
2549 }
2550
2551 static void
2552 hn_txdesc_dmamap_destroy(struct hn_txdesc *txd)
2553 {
2554         struct hn_tx_ring *txr = txd->txr;
2555
2556         KASSERT(txd->m == NULL, ("still has mbuf installed"));
2557         KASSERT((txd->flags & HN_TXD_FLAG_DMAMAP) == 0, ("still dma mapped"));
2558
2559         bus_dmamap_unload(txr->hn_tx_rndis_dtag, txd->rndis_msg_dmap);
2560         bus_dmamem_free(txr->hn_tx_rndis_dtag, txd->rndis_msg,
2561             txd->rndis_msg_dmap);
2562         bus_dmamap_destroy(txr->hn_tx_data_dtag, txd->data_dmap);
2563 }
2564
2565 static void
2566 hn_destroy_tx_ring(struct hn_tx_ring *txr)
2567 {
2568         struct hn_txdesc *txd;
2569
2570         if (txr->hn_txdesc == NULL)
2571                 return;
2572
2573 #ifndef HN_USE_TXDESC_BUFRING
2574         while ((txd = SLIST_FIRST(&txr->hn_txlist)) != NULL) {
2575                 SLIST_REMOVE_HEAD(&txr->hn_txlist, link);
2576                 hn_txdesc_dmamap_destroy(txd);
2577         }
2578 #else
2579         mtx_lock(&txr->hn_tx_lock);
2580         while ((txd = buf_ring_dequeue_sc(txr->hn_txdesc_br)) != NULL)
2581                 hn_txdesc_dmamap_destroy(txd);
2582         mtx_unlock(&txr->hn_tx_lock);
2583 #endif
2584
2585         if (txr->hn_tx_data_dtag != NULL)
2586                 bus_dma_tag_destroy(txr->hn_tx_data_dtag);
2587         if (txr->hn_tx_rndis_dtag != NULL)
2588                 bus_dma_tag_destroy(txr->hn_tx_rndis_dtag);
2589
2590 #ifdef HN_USE_TXDESC_BUFRING
2591         buf_ring_free(txr->hn_txdesc_br, M_NETVSC);
2592 #endif
2593
2594         free(txr->hn_txdesc, M_NETVSC);
2595         txr->hn_txdesc = NULL;
2596
2597         if (txr->hn_mbuf_br != NULL)
2598                 buf_ring_free(txr->hn_mbuf_br, M_NETVSC);
2599
2600 #ifndef HN_USE_TXDESC_BUFRING
2601         mtx_destroy(&txr->hn_txlist_spin);
2602 #endif
2603         mtx_destroy(&txr->hn_tx_lock);
2604 }
2605
2606 static int
2607 hn_create_tx_data(struct hn_softc *sc, int ring_cnt)
2608 {
2609         struct sysctl_oid_list *child;
2610         struct sysctl_ctx_list *ctx;
2611         int i;
2612
2613         sc->hn_tx_ring_cnt = ring_cnt;
2614         sc->hn_tx_ring_inuse = sc->hn_tx_ring_cnt;
2615
2616         sc->hn_tx_ring = malloc(sizeof(struct hn_tx_ring) * sc->hn_tx_ring_cnt,
2617             M_NETVSC, M_WAITOK | M_ZERO);
2618
2619         ctx = device_get_sysctl_ctx(sc->hn_dev);
2620         child = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->hn_dev));
2621
2622         /* Create dev.hn.UNIT.tx sysctl tree */
2623         sc->hn_tx_sysctl_tree = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "tx",
2624             CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "");
2625
2626         for (i = 0; i < sc->hn_tx_ring_cnt; ++i) {
2627                 int error;
2628
2629                 error = hn_create_tx_ring(sc, i);
2630                 if (error)
2631                         return error;
2632         }
2633
2634         SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "no_txdescs",
2635             CTLTYPE_ULONG | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
2636             __offsetof(struct hn_tx_ring, hn_no_txdescs),
2637             hn_tx_stat_ulong_sysctl, "LU", "# of times short of TX descs");
2638         SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "send_failed",
2639             CTLTYPE_ULONG | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
2640             __offsetof(struct hn_tx_ring, hn_send_failed),
2641             hn_tx_stat_ulong_sysctl, "LU", "# of hyper-v sending failure");
2642         SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "txdma_failed",
2643             CTLTYPE_ULONG | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
2644             __offsetof(struct hn_tx_ring, hn_txdma_failed),
2645             hn_tx_stat_ulong_sysctl, "LU", "# of TX DMA failure");
2646         SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "tx_collapsed",
2647             CTLTYPE_ULONG | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
2648             __offsetof(struct hn_tx_ring, hn_tx_collapsed),
2649             hn_tx_stat_ulong_sysctl, "LU", "# of TX mbuf collapsed");
2650         SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "tx_chimney",
2651             CTLTYPE_ULONG | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
2652             __offsetof(struct hn_tx_ring, hn_tx_chimney),
2653             hn_tx_stat_ulong_sysctl, "LU", "# of chimney send");
2654         SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "tx_chimney_tried",
2655             CTLTYPE_ULONG | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
2656             __offsetof(struct hn_tx_ring, hn_tx_chimney_tried),
2657             hn_tx_stat_ulong_sysctl, "LU", "# of chimney send tries");
2658         SYSCTL_ADD_INT(ctx, child, OID_AUTO, "txdesc_cnt",
2659             CTLFLAG_RD, &sc->hn_tx_ring[0].hn_txdesc_cnt, 0,
2660             "# of total TX descs");
2661         SYSCTL_ADD_INT(ctx, child, OID_AUTO, "tx_chimney_max",
2662             CTLFLAG_RD, &sc->hn_tx_chimney_max, 0,
2663             "Chimney send packet size upper boundary");
2664         SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "tx_chimney_size",
2665             CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, sc, 0,
2666             hn_tx_chimney_size_sysctl,
2667             "I", "Chimney send packet size limit");
2668         SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "direct_tx_size",
2669             CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
2670             __offsetof(struct hn_tx_ring, hn_direct_tx_size),
2671             hn_tx_conf_int_sysctl, "I",
2672             "Size of the packet for direct transmission");
2673         SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "sched_tx",
2674             CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
2675             __offsetof(struct hn_tx_ring, hn_sched_tx),
2676             hn_tx_conf_int_sysctl, "I",
2677             "Always schedule transmission "
2678             "instead of doing direct transmission");
2679         SYSCTL_ADD_INT(ctx, child, OID_AUTO, "tx_ring_cnt",
2680             CTLFLAG_RD, &sc->hn_tx_ring_cnt, 0, "# created TX rings");
2681         SYSCTL_ADD_INT(ctx, child, OID_AUTO, "tx_ring_inuse",
2682             CTLFLAG_RD, &sc->hn_tx_ring_inuse, 0, "# used TX rings");
2683
2684         return 0;
2685 }
2686
2687 static void
2688 hn_set_tx_chimney_size(struct hn_softc *sc, int chimney_size)
2689 {
2690         int i;
2691
2692         NV_LOCK(sc);
2693         for (i = 0; i < sc->hn_tx_ring_inuse; ++i)
2694                 sc->hn_tx_ring[i].hn_tx_chimney_size = chimney_size;
2695         NV_UNLOCK(sc);
2696 }
2697
2698 static void
2699 hn_destroy_tx_data(struct hn_softc *sc)
2700 {
2701         int i;
2702
2703         if (sc->hn_tx_ring_cnt == 0)
2704                 return;
2705
2706         for (i = 0; i < sc->hn_tx_ring_cnt; ++i)
2707                 hn_destroy_tx_ring(&sc->hn_tx_ring[i]);
2708
2709         free(sc->hn_tx_ring, M_NETVSC);
2710         sc->hn_tx_ring = NULL;
2711
2712         sc->hn_tx_ring_cnt = 0;
2713         sc->hn_tx_ring_inuse = 0;
2714 }
2715
2716 static void
2717 hn_start_taskfunc(void *xtxr, int pending __unused)
2718 {
2719         struct hn_tx_ring *txr = xtxr;
2720
2721         mtx_lock(&txr->hn_tx_lock);
2722         hn_start_locked(txr, 0);
2723         mtx_unlock(&txr->hn_tx_lock);
2724 }
2725
2726 static void
2727 hn_start_txeof_taskfunc(void *xtxr, int pending __unused)
2728 {
2729         struct hn_tx_ring *txr = xtxr;
2730
2731         mtx_lock(&txr->hn_tx_lock);
2732         atomic_clear_int(&txr->hn_sc->hn_ifp->if_drv_flags, IFF_DRV_OACTIVE);
2733         hn_start_locked(txr, 0);
2734         mtx_unlock(&txr->hn_tx_lock);
2735 }
2736
2737 static void
2738 hn_stop_tx_tasks(struct hn_softc *sc)
2739 {
2740         int i;
2741
2742         for (i = 0; i < sc->hn_tx_ring_inuse; ++i) {
2743                 struct hn_tx_ring *txr = &sc->hn_tx_ring[i];
2744
2745                 taskqueue_drain(txr->hn_tx_taskq, &txr->hn_tx_task);
2746                 taskqueue_drain(txr->hn_tx_taskq, &txr->hn_txeof_task);
2747         }
2748 }
2749
2750 static int
2751 hn_xmit(struct hn_tx_ring *txr, int len)
2752 {
2753         struct hn_softc *sc = txr->hn_sc;
2754         struct ifnet *ifp = sc->hn_ifp;
2755         struct mbuf *m_head;
2756
2757         mtx_assert(&txr->hn_tx_lock, MA_OWNED);
2758         KASSERT(hn_use_if_start == 0,
2759             ("hn_xmit is called, when if_start is enabled"));
2760
2761         if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0 || txr->hn_oactive)
2762                 return 0;
2763
2764         while ((m_head = drbr_peek(ifp, txr->hn_mbuf_br)) != NULL) {
2765                 struct hn_txdesc *txd;
2766                 int error;
2767
2768                 if (len > 0 && m_head->m_pkthdr.len > len) {
2769                         /*
2770                          * This sending could be time consuming; let callers
2771                          * dispatch this packet sending (and sending of any
2772                          * following up packets) to tx taskqueue.
2773                          */
2774                         drbr_putback(ifp, txr->hn_mbuf_br, m_head);
2775                         return 1;
2776                 }
2777
2778                 txd = hn_txdesc_get(txr);
2779                 if (txd == NULL) {
2780                         txr->hn_no_txdescs++;
2781                         drbr_putback(ifp, txr->hn_mbuf_br, m_head);
2782                         txr->hn_oactive = 1;
2783                         break;
2784                 }
2785
2786                 error = hn_encap(txr, txd, &m_head);
2787                 if (error) {
2788                         /* Both txd and m_head are freed; discard */
2789                         drbr_advance(ifp, txr->hn_mbuf_br);
2790                         continue;
2791                 }
2792
2793                 error = hn_send_pkt(ifp, txr, txd);
2794                 if (__predict_false(error)) {
2795                         /* txd is freed, but m_head is not */
2796                         drbr_putback(ifp, txr->hn_mbuf_br, m_head);
2797                         txr->hn_oactive = 1;
2798                         break;
2799                 }
2800
2801                 /* Sent */
2802                 drbr_advance(ifp, txr->hn_mbuf_br);
2803         }
2804         return 0;
2805 }
2806
2807 static int
2808 hn_transmit(struct ifnet *ifp, struct mbuf *m)
2809 {
2810         struct hn_softc *sc = ifp->if_softc;
2811         struct hn_tx_ring *txr;
2812         int error, idx = 0;
2813
2814         /*
2815          * Select the TX ring based on flowid
2816          */
2817         if (M_HASHTYPE_GET(m) != M_HASHTYPE_NONE)
2818                 idx = m->m_pkthdr.flowid % sc->hn_tx_ring_inuse;
2819         txr = &sc->hn_tx_ring[idx];
2820
2821         error = drbr_enqueue(ifp, txr->hn_mbuf_br, m);
2822         if (error) {
2823                 if_inc_counter(ifp, IFCOUNTER_OQDROPS, 1);
2824                 return error;
2825         }
2826
2827         if (txr->hn_oactive)
2828                 return 0;
2829
2830         if (txr->hn_sched_tx)
2831                 goto do_sched;
2832
2833         if (mtx_trylock(&txr->hn_tx_lock)) {
2834                 int sched;
2835
2836                 sched = hn_xmit(txr, txr->hn_direct_tx_size);
2837                 mtx_unlock(&txr->hn_tx_lock);
2838                 if (!sched)
2839                         return 0;
2840         }
2841 do_sched:
2842         taskqueue_enqueue(txr->hn_tx_taskq, &txr->hn_tx_task);
2843         return 0;
2844 }
2845
2846 static void
2847 hn_xmit_qflush(struct ifnet *ifp)
2848 {
2849         struct hn_softc *sc = ifp->if_softc;
2850         int i;
2851
2852         for (i = 0; i < sc->hn_tx_ring_inuse; ++i) {
2853                 struct hn_tx_ring *txr = &sc->hn_tx_ring[i];
2854                 struct mbuf *m;
2855
2856                 mtx_lock(&txr->hn_tx_lock);
2857                 while ((m = buf_ring_dequeue_sc(txr->hn_mbuf_br)) != NULL)
2858                         m_freem(m);
2859                 mtx_unlock(&txr->hn_tx_lock);
2860         }
2861         if_qflush(ifp);
2862 }
2863
2864 static void
2865 hn_xmit_txeof(struct hn_tx_ring *txr)
2866 {
2867
2868         if (txr->hn_sched_tx)
2869                 goto do_sched;
2870
2871         if (mtx_trylock(&txr->hn_tx_lock)) {
2872                 int sched;
2873
2874                 txr->hn_oactive = 0;
2875                 sched = hn_xmit(txr, txr->hn_direct_tx_size);
2876                 mtx_unlock(&txr->hn_tx_lock);
2877                 if (sched) {
2878                         taskqueue_enqueue(txr->hn_tx_taskq,
2879                             &txr->hn_tx_task);
2880                 }
2881         } else {
2882 do_sched:
2883                 /*
2884                  * Release the oactive earlier, with the hope, that
2885                  * others could catch up.  The task will clear the
2886                  * oactive again with the hn_tx_lock to avoid possible
2887                  * races.
2888                  */
2889                 txr->hn_oactive = 0;
2890                 taskqueue_enqueue(txr->hn_tx_taskq, &txr->hn_txeof_task);
2891         }
2892 }
2893
2894 static void
2895 hn_xmit_taskfunc(void *xtxr, int pending __unused)
2896 {
2897         struct hn_tx_ring *txr = xtxr;
2898
2899         mtx_lock(&txr->hn_tx_lock);
2900         hn_xmit(txr, 0);
2901         mtx_unlock(&txr->hn_tx_lock);
2902 }
2903
2904 static void
2905 hn_xmit_txeof_taskfunc(void *xtxr, int pending __unused)
2906 {
2907         struct hn_tx_ring *txr = xtxr;
2908
2909         mtx_lock(&txr->hn_tx_lock);
2910         txr->hn_oactive = 0;
2911         hn_xmit(txr, 0);
2912         mtx_unlock(&txr->hn_tx_lock);
2913 }
2914
2915 static void
2916 hn_channel_attach(struct hn_softc *sc, struct hv_vmbus_channel *chan)
2917 {
2918         struct hn_rx_ring *rxr;
2919         int idx;
2920
2921         idx = chan->ch_subidx;
2922
2923         KASSERT(idx >= 0 && idx < sc->hn_rx_ring_inuse,
2924             ("invalid channel index %d, should > 0 && < %d",
2925              idx, sc->hn_rx_ring_inuse));
2926         rxr = &sc->hn_rx_ring[idx];
2927         KASSERT((rxr->hn_rx_flags & HN_RX_FLAG_ATTACHED) == 0,
2928             ("RX ring %d already attached", idx));
2929         rxr->hn_rx_flags |= HN_RX_FLAG_ATTACHED;
2930
2931         chan->hv_chan_rxr = rxr;
2932         if (bootverbose) {
2933                 if_printf(sc->hn_ifp, "link RX ring %d to channel%u\n",
2934                     idx, chan->ch_id);
2935         }
2936
2937         if (idx < sc->hn_tx_ring_inuse) {
2938                 struct hn_tx_ring *txr = &sc->hn_tx_ring[idx];
2939
2940                 KASSERT((txr->hn_tx_flags & HN_TX_FLAG_ATTACHED) == 0,
2941                     ("TX ring %d already attached", idx));
2942                 txr->hn_tx_flags |= HN_TX_FLAG_ATTACHED;
2943
2944                 chan->hv_chan_txr = txr;
2945                 txr->hn_chan = chan;
2946                 if (bootverbose) {
2947                         if_printf(sc->hn_ifp, "link TX ring %d to channel%u\n",
2948                             idx, chan->ch_id);
2949                 }
2950         }
2951
2952         /* Bind channel to a proper CPU */
2953         vmbus_channel_cpu_set(chan, (sc->hn_cpu + idx) % mp_ncpus);
2954 }
2955
2956 static void
2957 hn_subchan_attach(struct hn_softc *sc, struct hv_vmbus_channel *chan)
2958 {
2959
2960         KASSERT(!HV_VMBUS_CHAN_ISPRIMARY(chan),
2961             ("subchannel callback on primary channel"));
2962         KASSERT(chan->ch_subidx > 0,
2963             ("invalid channel subidx %u",
2964              chan->ch_subidx));
2965         hn_channel_attach(sc, chan);
2966 }
2967
2968 static void
2969 hn_subchan_setup(struct hn_softc *sc)
2970 {
2971         struct hv_vmbus_channel **subchan;
2972         int subchan_cnt = sc->net_dev->num_channel - 1;
2973         int i;
2974
2975         /* Wait for sub-channels setup to complete. */
2976         subchan = vmbus_get_subchan(sc->hn_prichan, subchan_cnt);
2977
2978         /* Attach the sub-channels. */
2979         for (i = 0; i < subchan_cnt; ++i) {
2980                 /* NOTE: Calling order is critical. */
2981                 hn_subchan_attach(sc, subchan[i]);
2982                 hv_nv_subchan_attach(subchan[i]);
2983         }
2984
2985         /* Release the sub-channels */
2986         vmbus_rel_subchan(subchan, subchan_cnt);
2987         if_printf(sc->hn_ifp, "%d sub-channels setup done\n", subchan_cnt);
2988 }
2989
2990 static void
2991 hn_tx_taskq_create(void *arg __unused)
2992 {
2993         if (!hn_share_tx_taskq)
2994                 return;
2995
2996         hn_tx_taskq = taskqueue_create("hn_tx", M_WAITOK,
2997             taskqueue_thread_enqueue, &hn_tx_taskq);
2998         if (hn_bind_tx_taskq >= 0) {
2999                 int cpu = hn_bind_tx_taskq;
3000                 cpuset_t cpu_set;
3001
3002                 if (cpu > mp_ncpus - 1)
3003                         cpu = mp_ncpus - 1;
3004                 CPU_SETOF(cpu, &cpu_set);
3005                 taskqueue_start_threads_cpuset(&hn_tx_taskq, 1, PI_NET,
3006                     &cpu_set, "hn tx");
3007         } else {
3008                 taskqueue_start_threads(&hn_tx_taskq, 1, PI_NET, "hn tx");
3009         }
3010 }
3011 SYSINIT(hn_txtq_create, SI_SUB_DRIVERS, SI_ORDER_FIRST,
3012     hn_tx_taskq_create, NULL);
3013
3014 static void
3015 hn_tx_taskq_destroy(void *arg __unused)
3016 {
3017         if (hn_tx_taskq != NULL)
3018                 taskqueue_free(hn_tx_taskq);
3019 }
3020 SYSUNINIT(hn_txtq_destroy, SI_SUB_DRIVERS, SI_ORDER_FIRST,
3021     hn_tx_taskq_destroy, NULL);
3022
3023 static device_method_t netvsc_methods[] = {
3024         /* Device interface */
3025         DEVMETHOD(device_probe,         netvsc_probe),
3026         DEVMETHOD(device_attach,        netvsc_attach),
3027         DEVMETHOD(device_detach,        netvsc_detach),
3028         DEVMETHOD(device_shutdown,      netvsc_shutdown),
3029
3030         { 0, 0 }
3031 };
3032
3033 static driver_t netvsc_driver = {
3034         NETVSC_DEVNAME,
3035         netvsc_methods,
3036         sizeof(hn_softc_t)
3037 };
3038
3039 static devclass_t netvsc_devclass;
3040
3041 DRIVER_MODULE(hn, vmbus, netvsc_driver, netvsc_devclass, 0, 0);
3042 MODULE_VERSION(hn, 1);
3043 MODULE_DEPEND(hn, vmbus, 1, 1, 1);