Author: sephe
Date: Mon Oct 17 05:53:38 2016
New Revision: 307475
URL: https://svnweb.freebsd.org/changeset/base/307475

Log:
  MFC 303945,303947-303949,303989,303992,303998,304001,304002,304109,304111
  
  303945
      hyperv/vmbus: Add macro to get channel packet data length.
  
      Sponsored by:   Microsoft
      Differential Revision:  https://reviews.freebsd.org/D7455
  
  303947
      hyperv/vmbus: Add APIs for various types of transactions.
  
      Reviewed by:    Jun Su <junsu microsoft com>
      Sponsored by:   Microsoft
      Differential Revision:  https://reviews.freebsd.org/D7456
  
  303948
      hyperv/hn: Switch to vmbus xact APIs for NVS initialization
  
      Reviewed by:    Jun Su <junsu microsoft com>
      Sponsored by:   Microsoft
      Differential Revision:  https://reviews.freebsd.org/D7457
  
  303949
      hyperv/vmbus: Use xact APIs to implement post message Hypercall APIs
  
      Avoid code duplication.
  
      Sponsored by:   Microsoft
      Differential Revision:  https://reviews.freebsd.org/D7458
  
  303989
      hyperv/hn: Simplify NDIS configuration.
  
      Sponsored by:   Microsoft
      Differential Revision:  https://reviews.freebsd.org/D7466
  
  303992
      hyperv/hn: Simplify NDIS initialization.
  
      Sponsored by:   Microsoft
      Differential Revision:  https://reviews.freebsd.org/D7467
  
  303998
      hyperv/hn: Switch to vmbus xact APIs for NVS RXBUF connection.
  
      Sponsored by:   Microsoft
      Differential Revision:  https://reviews.freebsd.org/D7469
  
  304001
      hyperv/hn: Switch to vmbus xact APIs for NVS chimney buffer connection.
  
      Sponsored by:   Microsoft
      Differential Revision:  https://reviews.freebsd.org/D7470
  
  304002
      hyperv/hn: Simplify RXBUF disconnection.
  
      Sponsored by:   Microsoft
      Differential Revision:  https://reviews.freebsd.org/D7472
  
  304109
      hyperv/hn: Simplify chimney sending buffer disconnection.
  
      Sponsored by:   Microsoft
      Differential Revision:  https://reviews.freebsd.org/D7479
  
  304111
      hyperv/hn: Switch to vmbus xact APIs for sub-channel alloc request.
  
      Sponsored by:   Microsoft
      Differential Revision:  https://reviews.freebsd.org/D7480

Added:
  stable/11/sys/dev/hyperv/include/vmbus_xact.h
     - copied, changed from r303947, head/sys/dev/hyperv/include/vmbus_xact.h
  stable/11/sys/dev/hyperv/netvsc/if_hnreg.h
     - copied, changed from r303948, head/sys/dev/hyperv/netvsc/if_hnreg.h
  stable/11/sys/dev/hyperv/vmbus/vmbus_xact.c
     - copied, changed from r303947, head/sys/dev/hyperv/vmbus/vmbus_xact.c
Modified:
  stable/11/sys/conf/files.amd64
  stable/11/sys/conf/files.i386
  stable/11/sys/dev/hyperv/include/vmbus.h
  stable/11/sys/dev/hyperv/netvsc/hv_net_vsc.c
  stable/11/sys/dev/hyperv/netvsc/hv_net_vsc.h
  stable/11/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c
  stable/11/sys/dev/hyperv/netvsc/hv_rndis.h
  stable/11/sys/dev/hyperv/netvsc/hv_rndis_filter.c
  stable/11/sys/dev/hyperv/netvsc/if_hnvar.h
  stable/11/sys/dev/hyperv/vmbus/vmbus.c
  stable/11/sys/dev/hyperv/vmbus/vmbus_var.h
  stable/11/sys/modules/hyperv/vmbus/Makefile
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/conf/files.amd64
==============================================================================
--- stable/11/sys/conf/files.amd64      Mon Oct 17 05:39:45 2016        
(r307474)
+++ stable/11/sys/conf/files.amd64      Mon Oct 17 05:53:38 2016        
(r307475)
@@ -308,6 +308,7 @@ dev/hyperv/vmbus/vmbus_br.c                         
optional        
 dev/hyperv/vmbus/vmbus_chan.c                          optional        hyperv
 dev/hyperv/vmbus/vmbus_et.c                            optional        hyperv
 dev/hyperv/vmbus/vmbus_if.m                            optional        hyperv
+dev/hyperv/vmbus/vmbus_xact.c                          optional        hyperv
 dev/hyperv/vmbus/amd64/hyperv_machdep.c                        optional        
hyperv
 dev/hyperv/vmbus/amd64/vmbus_vector.S                  optional        hyperv
 dev/nfe/if_nfe.c               optional        nfe pci

Modified: stable/11/sys/conf/files.i386
==============================================================================
--- stable/11/sys/conf/files.i386       Mon Oct 17 05:39:45 2016        
(r307474)
+++ stable/11/sys/conf/files.i386       Mon Oct 17 05:53:38 2016        
(r307475)
@@ -265,6 +265,7 @@ dev/hyperv/vmbus/vmbus_br.c                         
optional        
 dev/hyperv/vmbus/vmbus_chan.c                          optional        hyperv
 dev/hyperv/vmbus/vmbus_et.c                            optional        hyperv
 dev/hyperv/vmbus/vmbus_if.m                            optional        hyperv
+dev/hyperv/vmbus/vmbus_xact.c                          optional        hyperv
 dev/hyperv/vmbus/i386/hyperv_machdep.c                 optional        hyperv
 dev/hyperv/vmbus/i386/vmbus_vector.S                   optional        hyperv
 dev/ichwd/ichwd.c              optional ichwd

Modified: stable/11/sys/dev/hyperv/include/vmbus.h
==============================================================================
--- stable/11/sys/dev/hyperv/include/vmbus.h    Mon Oct 17 05:39:45 2016        
(r307474)
+++ stable/11/sys/dev/hyperv/include/vmbus.h    Mon Oct 17 05:53:38 2016        
(r307475)
@@ -89,6 +89,11 @@ struct vmbus_chanpkt_hdr {
        (const void *)((const uint8_t *)(pkt) + \
        VMBUS_CHANPKT_GETLEN((pkt)->cph_hlen))
 
+/* Include padding */
+#define VMBUS_CHANPKT_DATALEN(pkt)             \
+       (VMBUS_CHANPKT_GETLEN((pkt)->cph_tlen) -\
+        VMBUS_CHANPKT_GETLEN((pkt)->cph_hlen))
+
 struct vmbus_rxbuf_desc {
        uint32_t        rb_len;
        uint32_t        rb_ofs;

Copied and modified: stable/11/sys/dev/hyperv/include/vmbus_xact.h (from 
r303947, head/sys/dev/hyperv/include/vmbus_xact.h)
==============================================================================
--- head/sys/dev/hyperv/include/vmbus_xact.h    Thu Aug 11 05:49:49 2016        
(r303947, copy source)
+++ stable/11/sys/dev/hyperv/include/vmbus_xact.h       Mon Oct 17 05:53:38 
2016        (r307475)
@@ -36,7 +36,8 @@ struct vmbus_xact;
 struct vmbus_xact_ctx;
 
 struct vmbus_xact_ctx  *vmbus_xact_ctx_create(bus_dma_tag_t dtag,
-                           size_t req_size, size_t resp_size);
+                           size_t req_size, size_t resp_size,
+                           size_t priv_size);
 void                   vmbus_xact_ctx_destroy(struct vmbus_xact_ctx *ctx);
 struct vmbus_xact      *vmbus_xact_get(struct vmbus_xact_ctx *ctx,
                            size_t req_len);
@@ -44,11 +45,15 @@ void                        vmbus_xact_put(struct 
vmbus_xact 
 
 void                   *vmbus_xact_req_data(const struct vmbus_xact *xact);
 bus_addr_t             vmbus_xact_req_paddr(const struct vmbus_xact *xact);
+void                   *vmbus_xact_priv(const struct vmbus_xact *xact,
+                           size_t priv_len);
 void                   vmbus_xact_activate(struct vmbus_xact *xact);
 void                   vmbus_xact_deactivate(struct vmbus_xact *xact);
 const void             *vmbus_xact_wait(struct vmbus_xact *xact,
                            size_t *resp_len);
 void                   vmbus_xact_wakeup(struct vmbus_xact *xact,
                            const void *data, size_t dlen);
+void                   vmbus_xact_ctx_wakeup(struct vmbus_xact_ctx *ctx,
+                           const void *data, size_t dlen);
 
 #endif /* !_VMBUS_XACT_H_ */

Modified: stable/11/sys/dev/hyperv/netvsc/hv_net_vsc.c
==============================================================================
--- stable/11/sys/dev/hyperv/netvsc/hv_net_vsc.c        Mon Oct 17 05:39:45 
2016        (r307474)
+++ stable/11/sys/dev/hyperv/netvsc/hv_net_vsc.c        Mon Oct 17 05:53:38 
2016        (r307475)
@@ -45,9 +45,11 @@
 #include <machine/atomic.h>
 
 #include <dev/hyperv/include/hyperv.h>
-#include "hv_net_vsc.h"
-#include "hv_rndis.h"
-#include "hv_rndis_filter.h"
+#include <dev/hyperv/include/vmbus_xact.h>
+#include <dev/hyperv/netvsc/hv_net_vsc.h>
+#include <dev/hyperv/netvsc/hv_rndis.h>
+#include <dev/hyperv/netvsc/hv_rndis_filter.h>
+#include <dev/hyperv/netvsc/if_hnreg.h>
 
 MALLOC_DEFINE(M_NETVSC, "netvsc", "Hyper-V netvsc driver");
 
@@ -70,7 +72,7 @@ static void hv_nv_on_receive(netvsc_dev 
     const struct vmbus_chanpkt_hdr *pkt);
 static void hn_nvs_sent_none(struct hn_send_ctx *sndc,
     struct netvsc_dev_ *net_dev, struct vmbus_channel *chan,
-    const struct nvsp_msg_ *msg);
+    const struct nvsp_msg_ *msg, int);
 
 static struct hn_send_ctx      hn_send_ctx_none =
     HN_SEND_CTX_INITIALIZER(hn_nvs_sent_none, NULL);
@@ -147,10 +149,14 @@ hv_nv_get_next_send_section(netvsc_dev *
 static int 
 hv_nv_init_rx_buffer_with_net_vsp(struct hn_softc *sc)
 {
+       struct vmbus_xact *xact;
+       struct hn_nvs_rxbuf_conn *conn;
+       const struct hn_nvs_rxbuf_connresp *resp;
+       size_t resp_len;
        struct hn_send_ctx sndc;
        netvsc_dev *net_dev;
-       nvsp_msg *init_pkt;
-       int ret = 0;
+       uint32_t status;
+       int error;
 
        net_dev = hv_nv_get_outbound_net_device(sc);
        if (!net_dev) {
@@ -162,7 +168,7 @@ hv_nv_init_rx_buffer_with_net_vsp(struct
            BUS_DMA_WAITOK | BUS_DMA_ZERO);
        if (net_dev->rx_buf == NULL) {
                device_printf(sc->hn_dev, "allocate rxbuf failed\n");
-               return ENOMEM;
+               return (ENOMEM);
        }
 
        /*
@@ -172,74 +178,76 @@ hv_nv_init_rx_buffer_with_net_vsp(struct
         * Only primary channel has RXBUF connected to it.  Sub-channels
         * just share this RXBUF.
         */
-       ret = vmbus_chan_gpadl_connect(sc->hn_prichan,
+       error = vmbus_chan_gpadl_connect(sc->hn_prichan,
            net_dev->rxbuf_dma.hv_paddr, net_dev->rx_buf_size,
            &net_dev->rx_buf_gpadl_handle);
-       if (ret != 0) {
-               device_printf(sc->hn_dev, "rxbuf gpadl connect failed: %d\n",
-                   ret);
+       if (error) {
+               if_printf(sc->hn_ifp, "rxbuf gpadl connect failed: %d\n",
+                   error);
                goto cleanup;
        }
-       
-       /* sema_wait(&ext->channel_init_sema); KYS CHECK */
 
-       /* Notify the NetVsp of the gpadl handle */
-       init_pkt = &net_dev->channel_init_packet;
+       /*
+        * Connect RXBUF to NVS.
+        */
 
-       memset(init_pkt, 0, sizeof(nvsp_msg));
+       xact = vmbus_xact_get(sc->hn_xact, sizeof(*conn));
+       if (xact == NULL) {
+               if_printf(sc->hn_ifp, "no xact for nvs rxbuf conn\n");
+               error = ENXIO;
+               goto cleanup;
+       }
 
-       init_pkt->hdr.msg_type = nvsp_msg_1_type_send_rx_buf;
-       init_pkt->msgs.vers_1_msgs.send_rx_buf.gpadl_handle =
-           net_dev->rx_buf_gpadl_handle;
-       init_pkt->msgs.vers_1_msgs.send_rx_buf.id =
-           NETVSC_RECEIVE_BUFFER_ID;
+       conn = vmbus_xact_req_data(xact);
+       conn->nvs_type = HN_NVS_TYPE_RXBUF_CONN;
+       conn->nvs_gpadl = net_dev->rx_buf_gpadl_handle;
+       conn->nvs_sig = HN_NVS_RXBUF_SIG;
 
-       /* Send the gpadl notification request */
+       hn_send_ctx_init_simple(&sndc, hn_nvs_sent_xact, xact);
+       vmbus_xact_activate(xact);
 
-       hn_send_ctx_init_simple(&sndc, hn_nvs_sent_wakeup, NULL);
-       ret = vmbus_chan_send(sc->hn_prichan,
+       error = vmbus_chan_send(sc->hn_prichan,
            VMBUS_CHANPKT_TYPE_INBAND, VMBUS_CHANPKT_FLAG_RC,
-           init_pkt, sizeof(nvsp_msg), (uint64_t)(uintptr_t)&sndc);
-       if (ret != 0) {
+           conn, sizeof(*conn), (uint64_t)(uintptr_t)&sndc);
+       if (error != 0) {
+               if_printf(sc->hn_ifp, "send nvs rxbuf conn failed: %d\n",
+                   error);
+               vmbus_xact_deactivate(xact);
+               vmbus_xact_put(xact);
                goto cleanup;
        }
 
-       sema_wait(&net_dev->channel_init_sema);
-
-       /* Check the response */
-       if (init_pkt->msgs.vers_1_msgs.send_rx_buf_complete.status
-           != nvsp_status_success) {
-               ret = EINVAL;
+       resp = vmbus_xact_wait(xact, &resp_len);
+       if (resp_len < sizeof(*resp)) {
+               if_printf(sc->hn_ifp, "invalid rxbuf conn resp length %zu\n",
+                   resp_len);
+               vmbus_xact_put(xact);
+               error = EINVAL;
+               goto cleanup;
+       }
+       if (resp->nvs_type != HN_NVS_TYPE_RXBUF_CONNRESP) {
+               if_printf(sc->hn_ifp, "not rxbuf conn resp, type %u\n",
+                   resp->nvs_type);
+               vmbus_xact_put(xact);
+               error = EINVAL;
                goto cleanup;
        }
 
-       net_dev->rx_section_count =
-           init_pkt->msgs.vers_1_msgs.send_rx_buf_complete.num_sections;
-
-       net_dev->rx_sections = malloc(net_dev->rx_section_count *
-           sizeof(nvsp_1_rx_buf_section), M_NETVSC, M_WAITOK);
-       memcpy(net_dev->rx_sections, 
-           init_pkt->msgs.vers_1_msgs.send_rx_buf_complete.sections,
-           net_dev->rx_section_count * sizeof(nvsp_1_rx_buf_section));
-
+       status = resp->nvs_status;
+       vmbus_xact_put(xact);
 
-       /*
-        * For first release, there should only be 1 section that represents
-        * the entire receive buffer
-        */
-       if (net_dev->rx_section_count != 1
-           || net_dev->rx_sections->offset != 0) {
-               ret = EINVAL;
+       if (status != HN_NVS_STATUS_OK) {
+               if_printf(sc->hn_ifp, "rxbuf conn failed: %x\n", status);
+               error = EIO;
                goto cleanup;
        }
+       net_dev->rx_section_count = 1;
 
-       goto exit;
+       return (0);
 
 cleanup:
        hv_nv_destroy_rx_buffer(net_dev);
-       
-exit:
-       return (ret);
+       return (error);
 }
 
 /*
@@ -249,9 +257,13 @@ static int 
 hv_nv_init_send_buffer_with_net_vsp(struct hn_softc *sc)
 {
        struct hn_send_ctx sndc;
+       struct vmbus_xact *xact;
+       struct hn_nvs_chim_conn *chim;
+       const struct hn_nvs_chim_connresp *resp;
+       size_t resp_len;
+       uint32_t status, sectsz;
        netvsc_dev *net_dev;
-       nvsp_msg *init_pkt;
-       int ret = 0;
+       int error;
 
        net_dev = hv_nv_get_outbound_net_device(sc);
        if (!net_dev) {
@@ -263,7 +275,7 @@ hv_nv_init_send_buffer_with_net_vsp(stru
            BUS_DMA_WAITOK | BUS_DMA_ZERO);
        if (net_dev->send_buf == NULL) {
                device_printf(sc->hn_dev, "allocate chimney txbuf failed\n");
-               return ENOMEM;
+               return (ENOMEM);
        }
 
        /*
@@ -273,48 +285,77 @@ hv_nv_init_send_buffer_with_net_vsp(stru
         * Only primary channel has chimney sending buffer connected to it.
         * Sub-channels just share this chimney sending buffer.
         */
-       ret = vmbus_chan_gpadl_connect(sc->hn_prichan,
+       error = vmbus_chan_gpadl_connect(sc->hn_prichan,
            net_dev->txbuf_dma.hv_paddr, net_dev->send_buf_size,
            &net_dev->send_buf_gpadl_handle);
-       if (ret != 0) {
-               device_printf(sc->hn_dev, "chimney sending buffer gpadl "
-                   "connect failed: %d\n", ret);
+       if (error) {
+               if_printf(sc->hn_ifp, "chimney sending buffer gpadl "
+                   "connect failed: %d\n", error);
                goto cleanup;
        }
 
-       /* Notify the NetVsp of the gpadl handle */
-
-       init_pkt = &net_dev->channel_init_packet;
+       /*
+        * Connect chimney sending buffer to NVS
+        */
 
-       memset(init_pkt, 0, sizeof(nvsp_msg));
+       xact = vmbus_xact_get(sc->hn_xact, sizeof(*chim));
+       if (xact == NULL) {
+               if_printf(sc->hn_ifp, "no xact for nvs chim conn\n");
+               error = ENXIO;
+               goto cleanup;
+       }
 
-       init_pkt->hdr.msg_type = nvsp_msg_1_type_send_send_buf;
-       init_pkt->msgs.vers_1_msgs.send_rx_buf.gpadl_handle =
-           net_dev->send_buf_gpadl_handle;
-       init_pkt->msgs.vers_1_msgs.send_rx_buf.id =
-           NETVSC_SEND_BUFFER_ID;
+       chim = vmbus_xact_req_data(xact);
+       chim->nvs_type = HN_NVS_TYPE_CHIM_CONN;
+       chim->nvs_gpadl = net_dev->send_buf_gpadl_handle;
+       chim->nvs_sig = HN_NVS_CHIM_SIG;
 
-       /* Send the gpadl notification request */
+       hn_send_ctx_init_simple(&sndc, hn_nvs_sent_xact, xact);
+       vmbus_xact_activate(xact);
 
-       hn_send_ctx_init_simple(&sndc, hn_nvs_sent_wakeup, NULL);
-       ret = vmbus_chan_send(sc->hn_prichan,
+       error = vmbus_chan_send(sc->hn_prichan,
            VMBUS_CHANPKT_TYPE_INBAND, VMBUS_CHANPKT_FLAG_RC,
-           init_pkt, sizeof(nvsp_msg), (uint64_t)(uintptr_t)&sndc);
-       if (ret != 0) {
+           chim, sizeof(*chim), (uint64_t)(uintptr_t)&sndc);
+       if (error) {
+               if_printf(sc->hn_ifp, "send nvs chim conn failed: %d\n",
+                   error);
+               vmbus_xact_deactivate(xact);
+               vmbus_xact_put(xact);
                goto cleanup;
        }
 
-       sema_wait(&net_dev->channel_init_sema);
+       resp = vmbus_xact_wait(xact, &resp_len);
+       if (resp_len < sizeof(*resp)) {
+               if_printf(sc->hn_ifp, "invalid chim conn resp length %zu\n",
+                   resp_len);
+               vmbus_xact_put(xact);
+               error = EINVAL;
+               goto cleanup;
+       }
+       if (resp->nvs_type != HN_NVS_TYPE_CHIM_CONNRESP) {
+               if_printf(sc->hn_ifp, "not chim conn resp, type %u\n",
+                   resp->nvs_type);
+               vmbus_xact_put(xact);
+               error = EINVAL;
+               goto cleanup;
+       }
 
-       /* Check the response */
-       if (init_pkt->msgs.vers_1_msgs.send_send_buf_complete.status
-           != nvsp_status_success) {
-               ret = EINVAL;
+       status = resp->nvs_status;
+       sectsz = resp->nvs_sectsz;
+       vmbus_xact_put(xact);
+
+       if (status != HN_NVS_STATUS_OK) {
+               if_printf(sc->hn_ifp, "chim conn failed: %x\n", status);
+               error = EIO;
                goto cleanup;
        }
+       if (sectsz == 0) {
+               if_printf(sc->hn_ifp, "zero chimney sending buffer "
+                   "section size\n");
+               return 0;
+       }
 
-       net_dev->send_section_size =
-           init_pkt->msgs.vers_1_msgs.send_send_buf_complete.section_size;
+       net_dev->send_section_size = sectsz;
        net_dev->send_section_count =
            net_dev->send_buf_size / net_dev->send_section_size;
        net_dev->bitsmap_words = howmany(net_dev->send_section_count,
@@ -323,13 +364,15 @@ hv_nv_init_send_buffer_with_net_vsp(stru
            malloc(net_dev->bitsmap_words * sizeof(long), M_NETVSC,
            M_WAITOK | M_ZERO);
 
-       goto exit;
+       if (bootverbose) {
+               if_printf(sc->hn_ifp, "chimney sending buffer %u/%u\n",
+                   net_dev->send_section_size, net_dev->send_section_count);
+       }
+       return 0;
 
 cleanup:
        hv_nv_destroy_send_buffer(net_dev);
-       
-exit:
-       return (ret);
+       return (error);
 }
 
 /*
@@ -338,34 +381,27 @@ exit:
 static int
 hv_nv_destroy_rx_buffer(netvsc_dev *net_dev)
 {
-       nvsp_msg *revoke_pkt;
        int ret = 0;
 
-       /*
-        * If we got a section count, it means we received a
-        * send_rx_buf_complete msg 
-        * (ie sent nvsp_msg_1_type_send_rx_buf msg) therefore,
-        * we need to send a revoke msg here
-        */
        if (net_dev->rx_section_count) {
-               /* Send the revoke receive buffer */
-               revoke_pkt = &net_dev->revoke_packet;
-               memset(revoke_pkt, 0, sizeof(nvsp_msg));
-
-               revoke_pkt->hdr.msg_type = nvsp_msg_1_type_revoke_rx_buf;
-               revoke_pkt->msgs.vers_1_msgs.revoke_rx_buf.id =
-                   NETVSC_RECEIVE_BUFFER_ID;
+               struct hn_nvs_rxbuf_disconn disconn;
 
-               ret = vmbus_chan_send(net_dev->sc->hn_prichan,
-                   VMBUS_CHANPKT_TYPE_INBAND, 0, revoke_pkt, sizeof(nvsp_msg),
-                   (uint64_t)(uintptr_t)&hn_send_ctx_none);
                /*
-                * If we failed here, we might as well return and have a leak 
-                * rather than continue and a bugchk
+                * Disconnect RXBUF from NVS.
                 */
+               memset(&disconn, 0, sizeof(disconn));
+               disconn.nvs_type = HN_NVS_TYPE_RXBUF_DISCONN;
+               disconn.nvs_sig = HN_NVS_RXBUF_SIG;
+
+               ret = vmbus_chan_send(net_dev->sc->hn_prichan,
+                   VMBUS_CHANPKT_TYPE_INBAND, 0, &disconn, sizeof(disconn),
+                   (uint64_t)(uintptr_t)&hn_send_ctx_none);
                if (ret != 0) {
+                       if_printf(net_dev->sc->hn_ifp,
+                           "send rxbuf disconn failed: %d\n", ret);
                        return (ret);
                }
+               net_dev->rx_section_count = 0;
        }
                
        /* Tear down the gpadl on the vsp end */
@@ -388,12 +424,6 @@ hv_nv_destroy_rx_buffer(netvsc_dev *net_
                net_dev->rx_buf = NULL;
        }
 
-       if (net_dev->rx_sections) {
-               free(net_dev->rx_sections, M_NETVSC);
-               net_dev->rx_sections = NULL;
-               net_dev->rx_section_count = 0;
-       }
-
        return (ret);
 }
 
@@ -403,33 +433,24 @@ hv_nv_destroy_rx_buffer(netvsc_dev *net_
 static int
 hv_nv_destroy_send_buffer(netvsc_dev *net_dev)
 {
-       nvsp_msg *revoke_pkt;
        int ret = 0;
 
-       /*
-        * If we got a section count, it means we received a
-        * send_rx_buf_complete msg 
-        * (ie sent nvsp_msg_1_type_send_rx_buf msg) therefore,
-        * we need to send a revoke msg here
-        */
        if (net_dev->send_section_size) {
-               /* Send the revoke send buffer */
-               revoke_pkt = &net_dev->revoke_packet;
-               memset(revoke_pkt, 0, sizeof(nvsp_msg));
-
-               revoke_pkt->hdr.msg_type =
-                   nvsp_msg_1_type_revoke_send_buf;
-               revoke_pkt->msgs.vers_1_msgs.revoke_send_buf.id =
-                   NETVSC_SEND_BUFFER_ID;
+               struct hn_nvs_chim_disconn disconn;
 
-               ret = vmbus_chan_send(net_dev->sc->hn_prichan,
-                   VMBUS_CHANPKT_TYPE_INBAND, 0, revoke_pkt, sizeof(nvsp_msg),
-                   (uint64_t)(uintptr_t)&hn_send_ctx_none);
                /*
-                * If we failed here, we might as well return and have a leak 
-                * rather than continue and a bugchk
+                * Disconnect chimney sending buffer from NVS.
                 */
+               memset(&disconn, 0, sizeof(disconn));
+               disconn.nvs_type = HN_NVS_TYPE_CHIM_DISCONN;
+               disconn.nvs_sig = HN_NVS_CHIM_SIG;
+
+               ret = vmbus_chan_send(net_dev->sc->hn_prichan,
+                   VMBUS_CHANPKT_TYPE_INBAND, 0, &disconn, sizeof(disconn),
+                   (uint64_t)(uintptr_t)&hn_send_ctx_none);
                if (ret != 0) {
+                       if_printf(net_dev->sc->hn_ifp,
+                           "send chim disconn failed: %d\n", ret);
                        return (ret);
                }
        }
@@ -462,45 +483,64 @@ hv_nv_destroy_send_buffer(netvsc_dev *ne
        return (ret);
 }
 
-
-/*
- * Attempt to negotiate the caller-specified NVSP version
- *
- * For NVSP v2, Server 2008 R2 does not set
- * init_pkt->msgs.init_msgs.init_compl.negotiated_prot_vers
- * to the negotiated version, so we cannot rely on that.
- */
 static int
 hv_nv_negotiate_nvsp_protocol(struct hn_softc *sc, netvsc_dev *net_dev,
-    uint32_t nvsp_ver)
+    uint32_t nvs_ver)
 {
        struct hn_send_ctx sndc;
-       nvsp_msg *init_pkt;
-       int ret;
-
-       init_pkt = &net_dev->channel_init_packet;
-       memset(init_pkt, 0, sizeof(nvsp_msg));
-       init_pkt->hdr.msg_type = nvsp_msg_type_init;
+       struct vmbus_xact *xact;
+       struct hn_nvs_init *init;
+       const struct hn_nvs_init_resp *resp;
+       size_t resp_len;
+       uint32_t status;
+       int error;
+
+       xact = vmbus_xact_get(sc->hn_xact, sizeof(*init));
+       if (xact == NULL) {
+               if_printf(sc->hn_ifp, "no xact for nvs init\n");
+               return (ENXIO);
+       }
+
+       init = vmbus_xact_req_data(xact);
+       init->nvs_type = HN_NVS_TYPE_INIT;
+       init->nvs_ver_min = nvs_ver;
+       init->nvs_ver_max = nvs_ver;
 
-       /*
-        * Specify parameter as the only acceptable protocol version
-        */
-       init_pkt->msgs.init_msgs.init.p1.protocol_version = nvsp_ver;
-       init_pkt->msgs.init_msgs.init.protocol_version_2 = nvsp_ver;
+       vmbus_xact_activate(xact);
+       hn_send_ctx_init_simple(&sndc, hn_nvs_sent_xact, xact);
 
-       /* Send the init request */
-       hn_send_ctx_init_simple(&sndc, hn_nvs_sent_wakeup, NULL);
-       ret = vmbus_chan_send(sc->hn_prichan,
+       error = vmbus_chan_send(sc->hn_prichan,
            VMBUS_CHANPKT_TYPE_INBAND, VMBUS_CHANPKT_FLAG_RC,
-           init_pkt, sizeof(nvsp_msg), (uint64_t)(uintptr_t)&sndc);
-       if (ret != 0)
-               return (-1);
-
-       sema_wait(&net_dev->channel_init_sema);
+           init, sizeof(*init), (uint64_t)(uintptr_t)&sndc);
+       if (error) {
+               if_printf(sc->hn_ifp, "send nvs init failed: %d\n", error);
+               vmbus_xact_deactivate(xact);
+               vmbus_xact_put(xact);
+               return (error);
+       }
 
-       if (init_pkt->msgs.init_msgs.init_compl.status != nvsp_status_success)
+       resp = vmbus_xact_wait(xact, &resp_len);
+       if (resp_len < sizeof(*resp)) {
+               if_printf(sc->hn_ifp, "invalid init resp length %zu\n",
+                   resp_len);
+               vmbus_xact_put(xact);
+               return (EINVAL);
+       }
+       if (resp->nvs_type != HN_NVS_TYPE_INIT_RESP) {
+               if_printf(sc->hn_ifp, "not init resp, type %u\n",
+                   resp->nvs_type);
+               vmbus_xact_put(xact);
                return (EINVAL);
+       }
+
+       status = resp->nvs_status;
+       vmbus_xact_put(xact);
 
+       if (status != HN_NVS_STATUS_OK) {
+               if_printf(sc->hn_ifp, "nvs init failed for ver 0x%x\n",
+                   nvs_ver);
+               return (EINVAL);
+       }
        return (0);
 }
 
@@ -512,33 +552,19 @@ hv_nv_negotiate_nvsp_protocol(struct hn_
 static int
 hv_nv_send_ndis_config(struct hn_softc *sc, uint32_t mtu)
 {
-       netvsc_dev *net_dev;
-       nvsp_msg *init_pkt;
-       int ret;
-
-       net_dev = hv_nv_get_outbound_net_device(sc);
-       if (!net_dev)
-               return (-ENODEV);
-
-       /*
-        * Set up configuration packet, write MTU
-        * Indicate we are capable of handling VLAN tags
-        */
-       init_pkt = &net_dev->channel_init_packet;
-       memset(init_pkt, 0, sizeof(nvsp_msg));
-       init_pkt->hdr.msg_type = nvsp_msg_2_type_send_ndis_config;
-       init_pkt->msgs.vers_2_msgs.send_ndis_config.mtu = mtu;
-       init_pkt->
-               msgs.vers_2_msgs.send_ndis_config.capabilities.u1.u2.ieee8021q
-               = 1;
-
-       /* Send the configuration packet */
-       ret = vmbus_chan_send(sc->hn_prichan, VMBUS_CHANPKT_TYPE_INBAND, 0,
-           init_pkt, sizeof(nvsp_msg), (uint64_t)(uintptr_t)&hn_send_ctx_none);
-       if (ret != 0)
-               return (-EINVAL);
+       struct hn_nvs_ndis_conf conf;
+       int error;
 
-       return (0);
+       memset(&conf, 0, sizeof(conf));
+       conf.nvs_type = HN_NVS_TYPE_NDIS_CONF;
+       conf.nvs_mtu = mtu;
+       conf.nvs_caps = HN_NVS_NDIS_CONF_VLAN;
+
+       error = vmbus_chan_send(sc->hn_prichan, VMBUS_CHANPKT_TYPE_INBAND, 0,
+           &conf, sizeof(conf), (uint64_t)(uintptr_t)&hn_send_ctx_none);
+       if (error)
+               if_printf(sc->hn_ifp, "send nvs ndis conf failed: %d\n", error);
+       return (error);
 }
 
 /*
@@ -548,8 +574,6 @@ static int
 hv_nv_connect_to_vsp(struct hn_softc *sc)
 {
        netvsc_dev *net_dev;
-       nvsp_msg *init_pkt;
-       uint32_t ndis_version;
        uint32_t protocol_list[] = { NVSP_PROTOCOL_VERSION_1,
            NVSP_PROTOCOL_VERSION_2,
            NVSP_PROTOCOL_VERSION_4,
@@ -559,6 +583,7 @@ hv_nv_connect_to_vsp(struct hn_softc *sc
        int ret = 0;
        device_t dev = sc->hn_dev;
        struct ifnet *ifp = sc->hn_ifp;
+       struct hn_nvs_ndis_init ndis;
 
        net_dev = hv_nv_get_outbound_net_device(sc);
 
@@ -591,37 +616,23 @@ hv_nv_connect_to_vsp(struct hn_softc *sc
                ret = hv_nv_send_ndis_config(sc, ifp->if_mtu);
 
        /*
-        * Send the NDIS version
+        * Initialize NDIS.
         */
-       init_pkt = &net_dev->channel_init_packet;
-
-       memset(init_pkt, 0, sizeof(nvsp_msg));
-
-       if (net_dev->nvsp_version <= NVSP_PROTOCOL_VERSION_4) {
-               ndis_version = NDIS_VERSION_6_1;
-       } else {
-               ndis_version = NDIS_VERSION_6_30;
-       }
-
-       init_pkt->hdr.msg_type = nvsp_msg_1_type_send_ndis_vers;
-       init_pkt->msgs.vers_1_msgs.send_ndis_vers.ndis_major_vers =
-           (ndis_version & 0xFFFF0000) >> 16;
-       init_pkt->msgs.vers_1_msgs.send_ndis_vers.ndis_minor_vers =
-           ndis_version & 0xFFFF;
 
-       /* Send the init request */
+       memset(&ndis, 0, sizeof(ndis));
+       ndis.nvs_type = HN_NVS_TYPE_NDIS_INIT;
+       ndis.nvs_ndis_major = NDIS_VERSION_MAJOR_6;
+       if (net_dev->nvsp_version <= NVSP_PROTOCOL_VERSION_4)
+               ndis.nvs_ndis_minor = NDIS_VERSION_MINOR_1;
+       else
+               ndis.nvs_ndis_minor = NDIS_VERSION_MINOR_30;
 
        ret = vmbus_chan_send(sc->hn_prichan, VMBUS_CHANPKT_TYPE_INBAND, 0,
-           init_pkt, sizeof(nvsp_msg), (uint64_t)(uintptr_t)&hn_send_ctx_none);
+           &ndis, sizeof(ndis), (uint64_t)(uintptr_t)&hn_send_ctx_none);
        if (ret != 0) {
+               if_printf(sc->hn_ifp, "send nvs ndis init failed: %d\n", ret);
                goto cleanup;
        }
-       /*
-        * TODO:  BUGBUG - We have to wait for the above msg since the netvsp
-        * uses KMCL which acknowledges packet (completion packet) 
-        * since our Vmbus always set the VMBUS_CHANPKT_FLAG_RC flag
-        */
-       /* sema_wait(&NetVscChannel->channel_init_sema); */
 
        /* Post the big receive buffer to NetVSP */
        if (net_dev->nvsp_version <= NVSP_PROTOCOL_VERSION_2)
@@ -742,19 +753,18 @@ hv_nv_on_device_remove(struct hn_softc *
 }
 
 void
-hn_nvs_sent_wakeup(struct hn_send_ctx *sndc __unused,
-    struct netvsc_dev_ *net_dev, struct vmbus_channel *chan __unused,
-    const struct nvsp_msg_ *msg)
-{
-       /* Copy the response back */
-       memcpy(&net_dev->channel_init_packet, msg, sizeof(nvsp_msg));
-       sema_post(&net_dev->channel_init_sema);
+hn_nvs_sent_xact(struct hn_send_ctx *sndc,
+    struct netvsc_dev_ *net_dev __unused, struct vmbus_channel *chan __unused,
+    const struct nvsp_msg_ *msg, int dlen)
+{
+
+       vmbus_xact_wakeup(sndc->hn_cbarg, msg, dlen);
 }
 
 static void
 hn_nvs_sent_none(struct hn_send_ctx *sndc __unused,
     struct netvsc_dev_ *net_dev __unused, struct vmbus_channel *chan __unused,
-    const struct nvsp_msg_ *msg __unused)
+    const struct nvsp_msg_ *msg __unused, int dlen __unused)
 {
        /* EMPTY */
 }
@@ -788,7 +798,8 @@ hv_nv_on_send_completion(netvsc_dev *net
        struct hn_send_ctx *sndc;
 
        sndc = (struct hn_send_ctx *)(uintptr_t)pkt->cph_xactid;
-       sndc->hn_cb(sndc, net_dev, chan, VMBUS_CHANPKT_CONST_DATA(pkt));
+       sndc->hn_cb(sndc, net_dev, chan, VMBUS_CHANPKT_CONST_DATA(pkt),
+           VMBUS_CHANPKT_DATALEN(pkt));
        /*
         * NOTE:
         * 'sndc' CAN NOT be accessed anymore, since it can be freed by

Modified: stable/11/sys/dev/hyperv/netvsc/hv_net_vsc.h
==============================================================================
--- stable/11/sys/dev/hyperv/netvsc/hv_net_vsc.h        Mon Oct 17 05:39:45 
2016        (r307474)
+++ stable/11/sys/dev/hyperv/netvsc/hv_net_vsc.h        Mon Oct 17 05:53:38 
2016        (r307475)
@@ -1060,7 +1060,6 @@ typedef struct netvsc_dev_ {
        uint32_t                                rx_buf_size;
        uint32_t                                rx_buf_gpadl_handle;
        uint32_t                                rx_section_count;
-       nvsp_1_rx_buf_section                   *rx_sections;
 
        /* Used for NetVSP initialization protocol */
        struct sema                             channel_init_sema;
@@ -1243,6 +1242,7 @@ typedef struct hn_softc {
        struct taskqueue *hn_tx_taskq;
        struct sysctl_oid *hn_tx_sysctl_tree;
        struct sysctl_oid *hn_rx_sysctl_tree;
+       struct vmbus_xact_ctx *hn_xact;
 } hn_softc_t;
 
 /*

Modified: stable/11/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c
==============================================================================
--- stable/11/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c     Mon Oct 17 
05:39:45 2016        (r307474)
+++ stable/11/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c     Mon Oct 17 
05:53:38 2016        (r307475)
@@ -115,6 +115,7 @@ __FBSDID("$FreeBSD$");
 
 #include <dev/hyperv/include/hyperv.h>
 #include <dev/hyperv/include/hyperv_busdma.h>
+#include <dev/hyperv/include/vmbus_xact.h>
 
 #include "hv_net_vsc.h"
 #include "hv_rndis.h"
@@ -124,6 +125,9 @@ __FBSDID("$FreeBSD$");
 /* Short for Hyper-V network interface */
 #define NETVSC_DEVNAME    "hn"
 
+#define HN_XACT_REQ_SIZE               (2 * PAGE_SIZE)
+#define HN_XACT_RESP_SIZE              (2 * PAGE_SIZE)
+
 /*
  * It looks like offset 0 of buf is reserved to hold the softc pointer.
  * The sc pointer evidently not needed, and is not presently populated.
@@ -542,6 +546,11 @@ netvsc_attach(device_t dev)
            IFCAP_LRO;
        ifp->if_hwassist = sc->hn_tx_ring[0].hn_csum_assist | CSUM_TSO;
 
+       sc->hn_xact = vmbus_xact_ctx_create(bus_get_dma_tag(dev),
+           HN_XACT_REQ_SIZE, HN_XACT_RESP_SIZE, 0);
+       if (sc->hn_xact == NULL)
+               goto failed;
+
        error = hv_rf_on_device_add(sc, &device_info, ring_cnt,
            &sc->hn_rx_ring[0]);
        if (error)
@@ -643,6 +652,7 @@ netvsc_detach(device_t dev)
        if (sc->hn_tx_taskq != hn_tx_taskq)
                taskqueue_free(sc->hn_tx_taskq);
 
+       vmbus_xact_ctx_destroy(sc->hn_xact);
        return (0);
 }
 
@@ -782,7 +792,8 @@ hn_txeof(struct hn_tx_ring *txr)
 
 static void
 hn_tx_done(struct hn_send_ctx *sndc, struct netvsc_dev_ *net_dev,
-    struct vmbus_channel *chan, const struct nvsp_msg_ *msg __unused)
+    struct vmbus_channel *chan, const struct nvsp_msg_ *msg __unused,
+    int dlen __unused)
 {
        struct hn_txdesc *txd = sndc->hn_cbarg;
        struct hn_tx_ring *txr;

Modified: stable/11/sys/dev/hyperv/netvsc/hv_rndis.h
==============================================================================
--- stable/11/sys/dev/hyperv/netvsc/hv_rndis.h  Mon Oct 17 05:39:45 2016        
(r307474)
+++ stable/11/sys/dev/hyperv/netvsc/hv_rndis.h  Mon Oct 17 05:53:38 2016        
(r307475)
@@ -41,6 +41,10 @@
 #define NDIS_VERSION_6_1                        0x00060001
 #define NDIS_VERSION_6_30                       0x0006001e
 
+#define NDIS_VERSION_MAJOR_6                   6
+#define NDIS_VERSION_MINOR_1                   1
+#define NDIS_VERSION_MINOR_30                  30
+
 #define NDIS_VERSION                            (NDIS_VERSION_5_1)
 
 /*

Modified: stable/11/sys/dev/hyperv/netvsc/hv_rndis_filter.c
==============================================================================
--- stable/11/sys/dev/hyperv/netvsc/hv_rndis_filter.c   Mon Oct 17 05:39:45 
2016        (r307474)
+++ stable/11/sys/dev/hyperv/netvsc/hv_rndis_filter.c   Mon Oct 17 05:53:38 
2016        (r307475)
@@ -46,9 +46,11 @@ __FBSDID("$FreeBSD$");
 #include <vm/pmap.h>
 
 #include <dev/hyperv/include/hyperv.h>
-#include "hv_net_vsc.h"
-#include "hv_rndis.h"
-#include "hv_rndis_filter.h"
+#include <dev/hyperv/include/vmbus_xact.h>
+#include <dev/hyperv/netvsc/hv_net_vsc.h>
+#include <dev/hyperv/netvsc/hv_rndis.h>
+#include <dev/hyperv/netvsc/hv_rndis_filter.h>
+#include <dev/hyperv/netvsc/if_hnreg.h>
 
 struct hv_rf_recvinfo {
        const ndis_8021q_info           *vlan_info;
@@ -91,10 +93,10 @@ hv_rf_send_offload_request(struct hn_sof
 
 static void hn_rndis_sent_halt(struct hn_send_ctx *sndc,
     struct netvsc_dev_ *net_dev, struct vmbus_channel *chan,
-    const struct nvsp_msg_ *msg);
+    const struct nvsp_msg_ *msg, int dlen);
 static void hn_rndis_sent_cb(struct hn_send_ctx *sndc,
     struct netvsc_dev_ *net_dev, struct vmbus_channel *chan,
-    const struct nvsp_msg_ *msg);
+    const struct nvsp_msg_ *msg, int dlen);
 
 /*
  * Set the Per-Packet-Info with the specified type
@@ -1060,12 +1062,16 @@ hv_rf_on_device_add(struct hn_softc *sc,
        int ret;
        netvsc_dev *net_dev;
        rndis_device *rndis_dev;
-       nvsp_msg *init_pkt;
        rndis_offload_params offloads;
        struct rndis_recv_scale_cap rsscaps;
        uint32_t rsscaps_size = sizeof(struct rndis_recv_scale_cap);
        netvsc_device_info *dev_info = (netvsc_device_info *)additl_info;
        device_t dev = sc->hn_dev;
+       struct hn_nvs_subch_req *req;
+       const struct hn_nvs_subch_resp *resp;
+       size_t resp_len;
+       struct vmbus_xact *xact;
+       uint32_t status, nsubch;
 
        rndis_dev = hv_get_rndis_device();
        if (rndis_dev == NULL) {
@@ -1153,36 +1159,65 @@ hv_rf_on_device_add(struct hn_softc *sc,
                goto out;
        }
        
-       /* request host to create sub channels */
-       init_pkt = &net_dev->channel_init_packet;
-       memset(init_pkt, 0, sizeof(nvsp_msg));
-
-       init_pkt->hdr.msg_type = nvsp_msg5_type_subchannel;
-       init_pkt->msgs.vers_5_msgs.subchannel_request.op =
-           NVSP_SUBCHANNE_ALLOCATE;
-       init_pkt->msgs.vers_5_msgs.subchannel_request.num_subchannels =
-           net_dev->num_channel - 1;
+       /*
+        * Ask NVS to allocate sub-channels.
+        */
+       xact = vmbus_xact_get(sc->hn_xact, sizeof(*req));
+       if (xact == NULL) {
+               if_printf(sc->hn_ifp, "no xact for nvs subch req\n");
+               ret = ENXIO;
+               goto out;
+       }
+
+       req = vmbus_xact_req_data(xact);
+       req->nvs_type = HN_NVS_TYPE_SUBCH_REQ;
+       req->nvs_op = HN_NVS_SUBCH_OP_ALLOC;
+       req->nvs_nsubch = net_dev->num_channel - 1;
+
+       hn_send_ctx_init_simple(&sndc, hn_nvs_sent_xact, xact);
+       vmbus_xact_activate(xact);
 
-       hn_send_ctx_init_simple(&sndc, hn_nvs_sent_wakeup, NULL);
        ret = vmbus_chan_send(sc->hn_prichan,
            VMBUS_CHANPKT_TYPE_INBAND, VMBUS_CHANPKT_FLAG_RC,
-           init_pkt, sizeof(nvsp_msg), (uint64_t)(uintptr_t)&sndc);
+           req, sizeof(*req), (uint64_t)(uintptr_t)&sndc);
        if (ret != 0) {
-               device_printf(dev, "Fail to allocate subchannel\n");
+               if_printf(sc->hn_ifp, "send nvs subch req failed: %d\n", ret);
+               vmbus_xact_deactivate(xact);
+               vmbus_xact_put(xact);
                goto out;
        }
 
-       sema_wait(&net_dev->channel_init_sema);
-
-       if (init_pkt->msgs.vers_5_msgs.subchn_complete.status !=
-           nvsp_status_success) {
-               ret = ENODEV;
-               device_printf(dev, "sub channel complete error\n");
+       resp = vmbus_xact_wait(xact, &resp_len);
+       if (resp_len < sizeof(*resp)) {
+               if_printf(sc->hn_ifp, "invalid subch resp length %zu\n",
+                   resp_len);
+               vmbus_xact_put(xact);
+               ret = EINVAL;
+               goto out;
+       }
+       if (resp->nvs_type != HN_NVS_TYPE_SUBCH_RESP) {
+               if_printf(sc->hn_ifp, "not subch resp, type %u\n",
+                   resp->nvs_type);
+               vmbus_xact_put(xact);
+               ret = EINVAL;
                goto out;
        }
 
-       net_dev->num_channel = 1 +
-           init_pkt->msgs.vers_5_msgs.subchn_complete.num_subchannels;
+       status = resp->nvs_status;
+       nsubch = resp->nvs_nsubch;
+       vmbus_xact_put(xact);
+
+       if (status != HN_NVS_STATUS_OK) {
+               if_printf(sc->hn_ifp, "subch req failed: %x\n", status);
+               ret = EIO;
+               goto out;
+       }
+       if (nsubch > net_dev->num_channel - 1) {
+               if_printf(sc->hn_ifp, "%u subchans are allocated, requested 
%u\n",
+                   nsubch, net_dev->num_channel - 1);
+               nsubch = net_dev->num_channel - 1;
+       }
+       net_dev->num_channel = nsubch + 1;
 
        ret = hv_rf_set_rss_param(rndis_dev, net_dev->num_channel);
 
@@ -1239,7 +1274,8 @@ hv_rf_on_close(struct hn_softc *sc)
 
 static void
 hn_rndis_sent_cb(struct hn_send_ctx *sndc, struct netvsc_dev_ *net_dev,
-    struct vmbus_channel *chan __unused, const struct nvsp_msg_ *msg __unused)
+    struct vmbus_channel *chan __unused, const struct nvsp_msg_ *msg __unused,
+    int dlen __unused)
 {
        if (sndc->hn_chim_idx != NVSP_1_CHIMNEY_SEND_INVALID_SECTION_INDEX)
                hn_chim_free(net_dev, sndc->hn_chim_idx);
@@ -1247,7 +1283,8 @@ hn_rndis_sent_cb(struct hn_send_ctx *snd
 
 static void
 hn_rndis_sent_halt(struct hn_send_ctx *sndc, struct netvsc_dev_ *net_dev,
-    struct vmbus_channel *chan __unused, const struct nvsp_msg_ *msg __unused)
+    struct vmbus_channel *chan __unused, const struct nvsp_msg_ *msg __unused,
+    int dlen __unused)
 {
        rndis_request *request = sndc->hn_cbarg;
 

Copied and modified: stable/11/sys/dev/hyperv/netvsc/if_hnreg.h (from r303948, 
head/sys/dev/hyperv/netvsc/if_hnreg.h)
==============================================================================
--- head/sys/dev/hyperv/netvsc/if_hnreg.h       Thu Aug 11 06:14:54 2016        
(r303948, copy source)
+++ stable/11/sys/dev/hyperv/netvsc/if_hnreg.h  Mon Oct 17 05:53:38 2016        
(r307475)
@@ -32,10 +32,23 @@
 #include <sys/param.h>
 #include <sys/systm.h>
 
+#define HN_NVS_RXBUF_SIG               0xcafe
+#define HN_NVS_CHIM_SIG                        0xface
+
 #define HN_NVS_STATUS_OK               1
 
 #define HN_NVS_TYPE_INIT               1
 #define HN_NVS_TYPE_INIT_RESP          2
+#define HN_NVS_TYPE_NDIS_INIT          100
+#define HN_NVS_TYPE_RXBUF_CONN         101
+#define HN_NVS_TYPE_RXBUF_CONNRESP     102
+#define HN_NVS_TYPE_RXBUF_DISCONN      103
+#define HN_NVS_TYPE_CHIM_CONN          104
+#define HN_NVS_TYPE_CHIM_CONNRESP      105
+#define HN_NVS_TYPE_CHIM_DISCONN       106
+#define HN_NVS_TYPE_NDIS_CONF          125
+#define HN_NVS_TYPE_SUBCH_REQ          133
+#define HN_NVS_TYPE_SUBCH_RESP         133     /* same as SUBCH_REQ */
 
 /*
  * Any size less than this one will _not_ work, e.g. hn_nvs_init
@@ -59,4 +72,94 @@ struct hn_nvs_init_resp {
        uint32_t        nvs_status;     /* HN_NVS_STATUS_ */
 } __packed;
 
+/* No reponse */
+struct hn_nvs_ndis_conf {
+       uint32_t        nvs_type;       /* HN_NVS_TYPE_NDIS_CONF */
+       uint32_t        nvs_mtu;

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to