svn commit: r303992 - head/sys/dev/hyperv/netvsc
Sepherosa Ziehau
sephe at FreeBSD.org
Fri Aug 12 07:57:05 UTC 2016
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_ */
More information about the svn-src-head
mailing list