Author: sephe
Date: Fri Aug 12 07:57:03 2016
New Revision: 303992
URL: https://svnweb.freebsd.org/changeset/base/303992

Log:
  hyperv/hn: Simplify NDIS initialization.
  
  MFC after:    1 week
  Sponsored by: Microsoft
  Differential Revision:        https://reviews.freebsd.org/D7467

Modified:
  head/sys/dev/hyperv/netvsc/hv_net_vsc.c
  head/sys/dev/hyperv/netvsc/hv_rndis.h
  head/sys/dev/hyperv/netvsc/if_hnreg.h

Modified: head/sys/dev/hyperv/netvsc/hv_net_vsc.c
==============================================================================
--- head/sys/dev/hyperv/netvsc/hv_net_vsc.c     Fri Aug 12 07:54:59 2016        
(r303991)
+++ head/sys/dev/hyperv/netvsc/hv_net_vsc.c     Fri Aug 12 07:57:03 2016        
(r303992)
@@ -558,8 +558,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,
@@ -569,6 +567,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);
 
@@ -601,37 +600,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)

Modified: head/sys/dev/hyperv/netvsc/hv_rndis.h
==============================================================================
--- head/sys/dev/hyperv/netvsc/hv_rndis.h       Fri Aug 12 07:54:59 2016        
(r303991)
+++ head/sys/dev/hyperv/netvsc/hv_rndis.h       Fri Aug 12 07:57:03 2016        
(r303992)
@@ -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: head/sys/dev/hyperv/netvsc/if_hnreg.h
==============================================================================
--- head/sys/dev/hyperv/netvsc/if_hnreg.h       Fri Aug 12 07:54:59 2016        
(r303991)
+++ head/sys/dev/hyperv/netvsc/if_hnreg.h       Fri Aug 12 07:57:03 2016        
(r303992)
@@ -36,6 +36,7 @@
 
 #define HN_NVS_TYPE_INIT               1
 #define HN_NVS_TYPE_INIT_RESP          2
+#define HN_NVS_TYPE_NDIS_INIT          100
 #define HN_NVS_TYPE_NDIS_CONF          125
 
 /*
@@ -73,4 +74,13 @@ CTASSERT(sizeof(struct hn_nvs_ndis_conf)
 #define HN_NVS_NDIS_CONF_SRIOV         0x0004
 #define HN_NVS_NDIS_CONF_VLAN          0x0008
 
+/* No response */
+struct hn_nvs_ndis_init {
+       uint32_t        nvs_type;       /* HN_NVS_TYPE_NDIS_INIT */
+       uint32_t        nvs_ndis_major; /* NDIS_VERSION_MAJOR_ */
+       uint32_t        nvs_ndis_minor; /* NDIS_VERSION_MINOR_ */
+       uint8_t         nvs_rsvd[20];
+} __packed;
+CTASSERT(sizeof(struct hn_nvs_ndis_init) >= HN_NVS_REQSIZE_MIN);
+
 #endif /* !_IF_HNREG_H_ */
_______________________________________________
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