2 * Copyright (c) 2010-2012 Citrix Inc.
3 * Copyright (c) 2009-2012 Microsoft Corp.
4 * Copyright (c) 2012 NetApp Inc.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice unmodified, this list of conditions, and the following
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.
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.
30 * Copyright (c) 2004-2006 Kip Macy
31 * All rights reserved.
33 * Redistribution and use in source and binary forms, with or without
34 * modification, are permitted provided that the following conditions
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.
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
55 #include <sys/cdefs.h>
56 __FBSDID("$FreeBSD$");
58 #include <sys/param.h>
59 #include <sys/systm.h>
60 #include <sys/sockio.h>
62 #include <sys/malloc.h>
63 #include <sys/module.h>
64 #include <sys/kernel.h>
65 #include <sys/socket.h>
66 #include <sys/queue.h>
71 #include <net/if_arp.h>
72 #include <net/ethernet.h>
73 #include <net/if_dl.h>
74 #include <net/if_media.h>
78 #include <net/if_types.h>
79 #include <net/if_vlan_var.h>
82 #include <netinet/in_systm.h>
83 #include <netinet/in.h>
84 #include <netinet/ip.h>
85 #include <netinet/if_ether.h>
88 #include <vm/vm_param.h>
89 #include <vm/vm_kern.h>
92 #include <machine/bus.h>
93 #include <machine/resource.h>
94 #include <machine/frame.h>
95 #include <machine/vmparam.h>
99 #include <sys/mutex.h>
100 #include <sys/errno.h>
101 #include <sys/types.h>
102 #include <machine/atomic.h>
104 #include <machine/intr_machdep.h>
106 #include <dev/hyperv/include/hyperv.h>
107 #include "hv_net_vsc.h"
108 #include "hv_rndis.h"
109 #include "hv_rndis_filter.h"
112 /* Short for Hyper-V network interface */
113 #define NETVSC_DEVNAME "hn"
116 * It looks like offset 0 of buf is reserved to hold the softc pointer.
117 * The sc pointer evidently not needed, and is not presently populated.
118 * The packet offset is where the netvsc_packet starts in the buffer.
120 #define HV_NV_SC_PTR_OFFSET_IN_BUF 0
121 #define HV_NV_PACKET_OFFSET_IN_BUF 16
128 struct hv_netvsc_driver_context {
133 * Be aware that this sleepable mutex will exhibit WITNESS errors when
134 * certain TCP and ARP code paths are taken. This appears to be a
135 * well-known condition, as all other drivers checked use a sleeping
136 * mutex to protect their transmit paths.
137 * Also Be aware that mutexes do not play well with semaphores, and there
138 * is a conflicting semaphore in a certain channel code path.
140 #define NV_LOCK_INIT(_sc, _name) \
141 mtx_init(&(_sc)->hn_lock, _name, MTX_NETWORK_LOCK, MTX_DEF)
142 #define NV_LOCK(_sc) mtx_lock(&(_sc)->hn_lock)
143 #define NV_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->hn_lock, MA_OWNED)
144 #define NV_UNLOCK(_sc) mtx_unlock(&(_sc)->hn_lock)
145 #define NV_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->hn_lock)
152 int hv_promisc_mode = 0; /* normal mode by default */
154 /* The one and only one */
155 static struct hv_netvsc_driver_context g_netvsc_drv;
159 * Forward declarations
161 static void hn_stop(hn_softc_t *sc);
162 static void hn_ifinit_locked(hn_softc_t *sc);
163 static void hn_ifinit(void *xsc);
164 static int hn_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data);
165 static int hn_start_locked(struct ifnet *ifp);
166 static void hn_start(struct ifnet *ifp);
170 * NetVsc driver initialization
171 * Note: Filter init is no longer required
174 netvsc_drv_init(void)
180 * NetVsc global initialization entry point
185 printf("Netvsc initializing... ");
188 * XXXKYS: cleanup initialization
190 if (!cold && !g_netvsc_drv.drv_inited) {
191 g_netvsc_drv.drv_inited = 1;
194 printf("Already initialized!\n");
198 /* {F8615163-DF3E-46c5-913F-F2D2F965ED0E} */
199 static const hv_guid g_net_vsc_device_type = {
200 .data = {0x63, 0x51, 0x61, 0xF8, 0x3E, 0xDF, 0xc5, 0x46,
201 0x91, 0x3F, 0xF2, 0xD2, 0xF9, 0x65, 0xED, 0x0E}
205 * Standard probe entry point.
209 netvsc_probe(device_t dev)
213 p = vmbus_get_type(dev);
214 if (!memcmp(p, &g_net_vsc_device_type.data, sizeof(hv_guid))) {
215 device_set_desc(dev, "Synthetic Network Interface");
216 printf("Netvsc probe... DONE \n");
225 * Standard attach entry point.
227 * Called when the driver is loaded. It allocates needed resources,
228 * and initializes the "hardware" and software.
231 netvsc_attach(device_t dev)
233 struct hv_device *device_ctx = vmbus_get_devctx(dev);
234 netvsc_device_info device_info;
236 int unit = device_get_unit(dev);
242 sc = device_get_softc(dev);
247 bzero(sc, sizeof(hn_softc_t));
251 NV_LOCK_INIT(sc, "NetVSCLock");
253 sc->hn_dev_obj = device_ctx;
255 ifp = sc->hn_ifp = sc->arpcom.ac_ifp = if_alloc(IFT_ETHER);
258 if_initname(ifp, device_get_name(dev), device_get_unit(dev));
259 ifp->if_dunit = unit;
260 ifp->if_dname = NETVSC_DEVNAME;
262 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
263 ifp->if_ioctl = hn_ioctl;
264 ifp->if_start = hn_start;
265 ifp->if_init = hn_ifinit;
266 /* needed by hv_rf_on_device_add() code */
267 ifp->if_mtu = ETHERMTU;
268 IFQ_SET_MAXLEN(&ifp->if_snd, 512);
269 ifp->if_snd.ifq_drv_maxlen = 511;
270 IFQ_SET_READY(&ifp->if_snd);
273 * Tell upper layers that we support full VLAN capability.
275 ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header);
276 ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU;
277 ifp->if_capenable |= IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU;
279 ret = hv_rf_on_device_add(device_ctx, &device_info);
285 if (device_info.link_state == 0) {
289 ether_ifattach(ifp, device_info.mac_addr);
295 * Standard detach entry point
298 netvsc_detach(device_t dev)
300 struct hv_device *hv_device = vmbus_get_devctx(dev);
302 printf("netvsc_detach\n");
305 * XXXKYS: Need to clean up all our
306 * driver state; this is the driver
311 * XXXKYS: Need to stop outgoing traffic and unregister
315 hv_rf_on_device_remove(hv_device, HV_RF_NV_DESTROY_CHANNEL);
321 * Standard shutdown entry point
324 netvsc_shutdown(device_t dev)
330 * Send completion processing
332 * Note: It looks like offset 0 of buf is reserved to hold the softc
333 * pointer. The sc pointer is not currently needed in this function, and
334 * it is not presently populated by the TX function.
337 netvsc_xmit_completion(void *context)
339 netvsc_packet *packet = (netvsc_packet *)context;
343 mb = (struct mbuf *)packet->compl.send.send_completion_tid;
344 buf = ((uint8_t *)packet) - HV_NV_PACKET_OFFSET_IN_BUF;
354 * Start a transmit of one or more packets
357 hn_start_locked(struct ifnet *ifp)
359 hn_softc_t *sc = ifp->if_softc;
360 struct hv_device *device_ctx = vmbus_get_devctx(sc->hn_dev);
362 netvsc_packet *packet;
363 struct mbuf *m_head, *m;
364 struct mbuf *mc_head = NULL;
373 while (!IFQ_DRV_IS_EMPTY(&sc->hn_ifp->if_snd)) {
374 IFQ_DRV_DEQUEUE(&sc->hn_ifp->if_snd, m_head);
375 if (m_head == NULL) {
383 /* Walk the mbuf list computing total length and num frags */
384 for (m = m_head; m != NULL; m = m->m_next) {
392 * Reserve the number of pages requested. Currently,
393 * one page is reserved for the message in the RNDIS
396 num_frags += HV_RF_NUM_TX_RESERVED_PAGE_BUFS;
398 /* If exceeds # page_buffers in netvsc_packet */
399 if (num_frags > NETVSC_PACKET_MAXPAGE) {
406 if (m_head->m_flags & M_VLANTAG) {
407 rppi_size = sizeof(rndis_per_packet_info) +
408 sizeof(ndis_8021q_info);
412 * Allocate a buffer with space for a netvsc packet plus a
413 * number of reserved areas. First comes a (currently 16
414 * bytes, currently unused) reserved data area. Second is
415 * the netvsc_packet, which includes (currently 4) page
416 * buffers. Third (optional) is a rndis_per_packet_info
417 * struct, but only if a VLAN tag should be inserted into the
418 * Ethernet frame by the Hyper-V infrastructure. Fourth is
419 * an area reserved for an rndis_filter_packet struct.
420 * Changed malloc to M_NOWAIT to avoid sleep under spin lock.
421 * No longer reserving extra space for page buffers, as they
422 * are already part of the netvsc_packet.
424 buf = malloc(HV_NV_PACKET_OFFSET_IN_BUF +
425 sizeof(netvsc_packet) + rppi_size +
426 sizeof(rndis_filter_packet),
427 M_DEVBUF, M_ZERO | M_NOWAIT);
434 packet = (netvsc_packet *)(buf + HV_NV_PACKET_OFFSET_IN_BUF);
435 *(vm_offset_t *)buf = HV_NV_SC_PTR_OFFSET_IN_BUF;
438 * extension points to the area reserved for the
439 * rndis_filter_packet, which is placed just after
440 * the netvsc_packet (and rppi struct, if present;
441 * length is updated later).
443 packet->extension = packet + 1;
445 /* Set up the rndis header */
446 packet->page_buf_count = num_frags;
448 /* Initialize it from the mbuf */
449 packet->tot_data_buf_len = len;
452 * If the Hyper-V infrastructure needs to embed a VLAN tag,
453 * initialize netvsc_packet and rppi struct values as needed.
456 /* Lower layers need the VLAN TCI */
457 packet->vlan_tci = m_head->m_pkthdr.ether_vtag;
461 * Fill the page buffers with mbuf info starting at index
462 * HV_RF_NUM_TX_RESERVED_PAGE_BUFS.
464 i = HV_RF_NUM_TX_RESERVED_PAGE_BUFS;
465 for (m = m_head; m != NULL; m = m->m_next) {
468 vtophys(mtod(m, vm_offset_t));
469 packet->page_buffers[i].pfn =
471 packet->page_buffers[i].offset =
472 paddr & (PAGE_SIZE - 1);
473 packet->page_buffers[i].length = m->m_len;
479 * If bpf, copy the mbuf chain. This is less expensive than
480 * it appears; the mbuf clusters are not copied, only their
481 * reference counts are incremented.
482 * Needed to avoid a race condition where the completion
483 * callback is invoked, freeing the mbuf chain, before the
484 * bpf_mtap code has a chance to run.
487 mc_head = m_copypacket(m_head, M_DONTWAIT);
490 /* Set the completion routine */
491 packet->compl.send.on_send_completion = netvsc_xmit_completion;
492 packet->compl.send.send_completion_context = packet;
493 packet->compl.send.send_completion_tid = (uint64_t)m_head;
495 /* Removed critical_enter(), does not appear necessary */
496 ret = hv_rf_on_send(device_ctx, packet);
500 /* if bpf && mc_head, call bpf_mtap code */
502 ETHER_BPF_MTAP(ifp, mc_head);
510 IF_PREPEND(&ifp->if_snd, m_head);
511 ifp->if_drv_flags |= IFF_DRV_OACTIVE;
514 * Null the mbuf pointer so the completion function
515 * does not free the mbuf chain. We just pushed the
516 * mbuf chain back on the if_snd queue.
518 packet->compl.send.send_completion_tid = 0;
521 * Release the resources since we will not get any
524 netvsc_xmit_completion(packet);
527 /* if bpf && mc_head, free the mbuf chain copy */
537 * Link up/down notification
540 netvsc_linkstatus_callback(struct hv_device *device_obj, uint32_t status)
542 hn_softc_t *sc = device_get_softc(device_obj->device);
556 * Append the specified data to the indicated mbuf chain,
557 * Extend the mbuf chain if the new data does not fit in
560 * This is a minor rewrite of m_append() from sys/kern/uipc_mbuf.c.
561 * There should be an equivalent in the kernel mbuf code,
562 * but there does not appear to be one yet.
564 * Differs from m_append() in that additional mbufs are
565 * allocated with cluster size MJUMPAGESIZE, and filled
568 * Return 1 if able to complete the job; otherwise 0.
571 hv_m_append(struct mbuf *m0, int len, c_caddr_t cp)
574 int remainder, space;
576 for (m = m0; m->m_next != NULL; m = m->m_next)
579 space = M_TRAILINGSPACE(m);
582 * Copy into available space.
584 if (space > remainder)
586 bcopy(cp, mtod(m, caddr_t) + m->m_len, space);
591 while (remainder > 0) {
593 * Allocate a new mbuf; could check space
594 * and allocate a cluster instead.
596 n = m_getjcl(M_DONTWAIT, m->m_type, 0, MJUMPAGESIZE);
599 n->m_len = min(MJUMPAGESIZE, remainder);
600 bcopy(cp, mtod(n, caddr_t), n->m_len);
602 remainder -= n->m_len;
606 if (m0->m_flags & M_PKTHDR)
607 m0->m_pkthdr.len += len - remainder;
609 return (remainder == 0);
614 * Called when we receive a data packet from the "wire" on the
617 * Note: This is no longer used as a callback
620 netvsc_recv(struct hv_device *device_ctx, netvsc_packet *packet)
622 hn_softc_t *sc = (hn_softc_t *)device_get_softc(device_ctx->device);
629 return (0); /* TODO: KYS how can this be! */
634 ifp = sc->arpcom.ac_ifp;
636 if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
641 * Bail out if packet contains more data than configured MTU.
643 if (packet->tot_data_buf_len > (ifp->if_mtu + ETHER_HDR_LEN)) {
648 * Get an mbuf with a cluster. For packets 2K or less,
649 * get a standard 2K cluster. For anything larger, get a
650 * 4K cluster. Any buffers larger than 4K can cause problems
651 * if looped around to the Hyper-V TX channel, so avoid them.
655 if (packet->tot_data_buf_len > MCLBYTES) {
660 m_new = m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR, size);
666 * Remove trailing junk from RX data buffer.
667 * Fixme: This will not work for multiple Hyper-V RX buffers.
668 * Fortunately, the channel gathers all RX data into one buffer.
670 * L2 frame length, with L2 header, not including CRC
672 packet->page_buffers[0].length = packet->tot_data_buf_len;
675 * Copy the received packet to one or more mbufs.
676 * The copy is required since the memory pointed to by netvsc_packet
677 * cannot be deallocated
679 for (i=0; i < packet->page_buf_count; i++) {
680 /* Shift virtual page number to form virtual page address */
681 uint8_t *vaddr = (uint8_t *)
682 (packet->page_buffers[i].pfn << PAGE_SHIFT);
684 hv_m_append(m_new, packet->page_buffers[i].length,
685 vaddr + packet->page_buffers[i].offset);
688 m_new->m_pkthdr.rcvif = ifp;
690 if ((packet->vlan_tci != 0) &&
691 (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0) {
692 m_new->m_pkthdr.ether_vtag = packet->vlan_tci;
693 m_new->m_flags |= M_VLANTAG;
697 * Note: Moved RX completion back to hv_nv_on_receive() so all
698 * messages (not just data messages) will trigger a response.
703 /* We're not holding the lock here, so don't release it */
704 (*ifp->if_input)(ifp, m_new);
710 * Rules for using sc->temp_unusable:
711 * 1. sc->temp_unusable can only be read or written while holding NV_LOCK()
712 * 2. code reading sc->temp_unusable under NV_LOCK(), and finding
713 * sc->temp_unusable set, must release NV_LOCK() and exit
714 * 3. to retain exclusive control of the interface,
715 * sc->temp_unusable must be set by code before releasing NV_LOCK()
716 * 4. only code setting sc->temp_unusable can clear sc->temp_unusable
717 * 5. code setting sc->temp_unusable must eventually clear sc->temp_unusable
721 * Standard ioctl entry point. Called when the user wants to configure
725 hn_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
727 hn_softc_t *sc = ifp->if_softc;
728 struct ifreq *ifr = (struct ifreq *)data;
729 netvsc_device_info device_info;
730 struct hv_device *hn_dev;
738 error = ether_ioctl(ifp, cmd, data);
741 hn_dev = vmbus_get_devctx(sc->hn_dev);
743 /* Check MTU value change */
744 if (ifp->if_mtu == ifr->ifr_mtu)
747 if (ifr->ifr_mtu > NETVSC_MAX_CONFIGURABLE_MTU) {
752 /* Obtain and record requested MTU */
753 ifp->if_mtu = ifr->ifr_mtu;
757 if (!sc->temp_unusable) {
758 sc->temp_unusable = TRUE;
766 } while (retry_cnt > 0);
768 if (retry_cnt == 0) {
773 /* We must remove and add back the device to cause the new
774 * MTU to take effect. This includes tearing down, but not
775 * deleting the channel, then bringing it back up.
777 error = hv_rf_on_device_remove(hn_dev, HV_RF_NV_RETAIN_CHANNEL);
780 sc->temp_unusable = FALSE;
784 error = hv_rf_on_device_add(hn_dev, &device_info);
787 sc->temp_unusable = FALSE;
792 hn_ifinit_locked(sc);
795 sc->temp_unusable = FALSE;
801 if (!sc->temp_unusable) {
802 sc->temp_unusable = TRUE;
810 } while (retry_cnt > 0);
812 if (retry_cnt == 0) {
817 if (ifp->if_flags & IFF_UP) {
819 * If only the state of the PROMISC flag changed,
820 * then just use the 'set promisc mode' command
821 * instead of reinitializing the entire NIC. Doing
822 * a full re-init means reloading the firmware and
823 * waiting for it to start up, which may take a
827 /* Fixme: Promiscuous mode? */
828 if (ifp->if_drv_flags & IFF_DRV_RUNNING &&
829 ifp->if_flags & IFF_PROMISC &&
830 !(sc->hn_if_flags & IFF_PROMISC)) {
831 /* do something here for Hyper-V */
832 } else if (ifp->if_drv_flags & IFF_DRV_RUNNING &&
833 !(ifp->if_flags & IFF_PROMISC) &&
834 sc->hn_if_flags & IFF_PROMISC) {
835 /* do something here for Hyper-V */
838 hn_ifinit_locked(sc);
840 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
845 sc->temp_unusable = FALSE;
847 sc->hn_if_flags = ifp->if_flags;
851 mask = ifr->ifr_reqcap ^ ifp->if_capenable;
852 if (mask & IFCAP_HWCSUM) {
853 if (IFCAP_HWCSUM & ifp->if_capenable) {
854 ifp->if_capenable &= ~IFCAP_HWCSUM;
856 ifp->if_capenable |= IFCAP_HWCSUM;
864 /* Fixme: Multicast mode? */
865 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
878 error = ether_ioctl(ifp, cmd, data);
889 hn_stop(hn_softc_t *sc)
893 struct hv_device *device_ctx = vmbus_get_devctx(sc->hn_dev);
897 printf(" Closing Device ...\n");
899 ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
902 ret = hv_rf_on_close(device_ctx);
906 * FreeBSD transmit entry point
909 hn_start(struct ifnet *ifp)
915 if (sc->temp_unusable) {
919 hn_start_locked(ifp);
927 hn_ifinit_locked(hn_softc_t *sc)
930 struct hv_device *device_ctx = vmbus_get_devctx(sc->hn_dev);
935 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
941 ret = hv_rf_on_open(device_ctx);
947 ifp->if_drv_flags |= IFF_DRV_RUNNING;
948 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
957 hn_softc_t *sc = xsc;
960 if (sc->temp_unusable) {
964 sc->temp_unusable = TRUE;
967 hn_ifinit_locked(sc);
970 sc->temp_unusable = FALSE;
979 hn_watchdog(struct ifnet *ifp)
984 printf("hn%d: watchdog timeout -- resetting\n", sc->hn_unit);
985 hn_ifinit(sc); /*???*/
990 static device_method_t netvsc_methods[] = {
991 /* Device interface */
992 DEVMETHOD(device_probe, netvsc_probe),
993 DEVMETHOD(device_attach, netvsc_attach),
994 DEVMETHOD(device_detach, netvsc_detach),
995 DEVMETHOD(device_shutdown, netvsc_shutdown),
1000 static driver_t netvsc_driver = {
1006 static devclass_t netvsc_devclass;
1008 DRIVER_MODULE(hn, vmbus, netvsc_driver, netvsc_devclass, 0, 0);
1009 MODULE_VERSION(hn, 1);
1010 MODULE_DEPEND(hn, vmbus, 1, 1, 1);
1011 SYSINIT(netvsc_initx, SI_SUB_KTHREAD_IDLE, SI_ORDER_MIDDLE + 1, netvsc_init,