Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 17 Oct 2016 03:24:03 +0000 (UTC)
From:      Sepherosa Ziehau <sephe@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r307461 - in stable/11/sys/dev/hyperv: include netvsc storvsc utilities vmbus
Message-ID:  <201610170324.u9H3O347016850@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: sephe
Date: Mon Oct 17 03:24:03 2016
New Revision: 307461
URL: https://svnweb.freebsd.org/changeset/base/307461

Log:
  MFC 303066-303072,303127-303129,303131
  
  303066
      hyperv/vmbus: Get rid of unnecessary definition.
  
      Sponsored by:   Microsoft OSTC
      Differential Revision:  https://reviews.freebsd.org/D7240
  
  303067
      hyperv/vmbus: Move IC register definition to Hyper-V utilities
  
      Sponsored by:   Microsoft OSTC
      Differential Revision:  https://reviews.freebsd.org/D7241
  
  303068
      hyperv/vmbus: Channel struct field rename
  
      Sponsored by:   Microsoft OSTC
      Differential Revision:  https://reviews.freebsd.org/D7242
  
  303069
      hyperv/vmbus: Pass channel as the first argument for channel callback
  
      The prepares to kill device private fields in channel struct, which
      are not flexible and extensible.
  
      Sponsored by:   Microsoft OSTC
      Differential Revision:  https://reviews.freebsd.org/D7243
  
  303070
      hyperv/vmbus: Deprecate the device private data in channel struct
  
      They are neither flexible nor extensible.
  
      Sponsored by:   Microsoft OSTC
      Differential Revision:  https://reviews.freebsd.org/D7244
  
  303071
      hyperv/vmbus: Hide channel struct definition.
  
      Sponsored by:   Microsoft OSTC
      Differential Revision:  https://reviews.freebsd.org/D7245
  
  303072
      hyperv/vmbus: Save MNF trigger location instead of MNF trigger index.
  
      Sponsored by:   Microsoft OSTC
      Differential Revision:  https://reviews.freebsd.org/D7246
  
  303127
      hyperv/vmbus: Save event flag location and evet flag mask.
  
      This avoids unnecessary access to the vmbus_softc struct on sending path.
  
      Sponsored by:   Microsoft OSTC
      Differential Revision:  https://reviews.freebsd.org/D7257
  
  303128
      hyperv/vmbus: Reorder channel fields.
  
      Sponsored by:   Microsoft OSTC
      Differential Revision:  https://reviews.freebsd.org/D7258
  
  303129
      hyperv/vmbus: Shuffle function declaration and macro definition.
  
      Sponsored by:   Microsoft OSTC
      Differential Revision:  https://reviews.freebsd.org/D7259
  
  303131
      hyperv: hv_vmbus_channel -> vmbus_channel
  
      Sponsored by:   Microsoft OSTC
      Differential Revision:  https://reviews.freebsd.org/D7260

Added:
  stable/11/sys/dev/hyperv/utilities/hv_utilreg.h
     - copied unchanged from r303067, head/sys/dev/hyperv/utilities/hv_utilreg.h
  stable/11/sys/dev/hyperv/vmbus/vmbus_chanvar.h
     - copied, changed from r303071, head/sys/dev/hyperv/vmbus/vmbus_chanvar.h
Modified:
  stable/11/sys/dev/hyperv/include/hyperv.h
  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/hv_rndis_filter.h
  stable/11/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c
  stable/11/sys/dev/hyperv/utilities/hv_heartbeat.c
  stable/11/sys/dev/hyperv/utilities/hv_kvp.c
  stable/11/sys/dev/hyperv/utilities/hv_shutdown.c
  stable/11/sys/dev/hyperv/utilities/hv_timesync.c
  stable/11/sys/dev/hyperv/utilities/hv_util.c
  stable/11/sys/dev/hyperv/utilities/hv_util.h
  stable/11/sys/dev/hyperv/vmbus/hv_vmbus_priv.h
  stable/11/sys/dev/hyperv/vmbus/vmbus.c
  stable/11/sys/dev/hyperv/vmbus/vmbus_chan.c
  stable/11/sys/dev/hyperv/vmbus/vmbus_var.h
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/dev/hyperv/include/hyperv.h
==============================================================================
--- stable/11/sys/dev/hyperv/include/hyperv.h	Mon Oct 17 03:07:06 2016	(r307460)
+++ stable/11/sys/dev/hyperv/include/hyperv.h	Mon Oct 17 03:24:03 2016	(r307461)
@@ -58,30 +58,6 @@
 #include <amd64/include/atomic.h>
 #include <dev/hyperv/include/hyperv_busdma.h>
 
-typedef uint8_t	hv_bool_uint8_t;
-
-#define HV_S_OK			0x00000000
-#define HV_E_FAIL		0x80004005
-#define HV_ERROR_NOT_SUPPORTED	0x80070032
-#define HV_ERROR_MACHINE_LOCKED	0x800704F7
-
-/*
- * VMBUS version is 32 bit, upper 16 bit for major_number and lower
- * 16 bit for minor_number.
- *
- * 0.13  --  Windows Server 2008
- * 1.1   --  Windows 7
- * 2.4   --  Windows 8
- * 3.0   --  Windows 8.1
- */
-#define VMBUS_VERSION_WS2008		((0 << 16) | (13))
-#define VMBUS_VERSION_WIN7		((1 << 16) | (1))
-#define VMBUS_VERSION_WIN8		((2 << 16) | (4))
-#define VMBUS_VERSION_WIN8_1		((3 << 16) | (0))
-
-#define VMBUS_VERSION_MAJOR(ver)	(((uint32_t)(ver)) >> 16)
-#define VMBUS_VERSION_MINOR(ver)	(((uint32_t)(ver)) & 0xffff)
-
 struct hyperv_guid {
 	uint8_t		hv_guid[16];
 } __packed;
@@ -90,183 +66,6 @@ struct hyperv_guid {
 
 int	hyperv_guid2str(const struct hyperv_guid *, char *, size_t);
 
-#define HW_MACADDR_LEN	6
-
-/*
- * Common defines for Hyper-V ICs
- */
-#define HV_ICMSGTYPE_NEGOTIATE		0
-#define HV_ICMSGTYPE_HEARTBEAT		1
-#define HV_ICMSGTYPE_KVPEXCHANGE	2
-#define HV_ICMSGTYPE_SHUTDOWN		3
-#define HV_ICMSGTYPE_TIMESYNC		4
-#define HV_ICMSGTYPE_VSS		5
-
-#define HV_ICMSGHDRFLAG_TRANSACTION	1
-#define HV_ICMSGHDRFLAG_REQUEST		2
-#define HV_ICMSGHDRFLAG_RESPONSE	4
-
-typedef struct hv_vmbus_pipe_hdr {
-	uint32_t flags;
-	uint32_t msgsize;
-} __packed hv_vmbus_pipe_hdr;
-
-typedef struct hv_vmbus_ic_version {
-	uint16_t major;
-	uint16_t minor;
-} __packed hv_vmbus_ic_version;
-
-typedef struct hv_vmbus_icmsg_hdr {
-	hv_vmbus_ic_version	icverframe;
-	uint16_t		icmsgtype;
-	hv_vmbus_ic_version	icvermsg;
-	uint16_t		icmsgsize;
-	uint32_t		status;
-	uint8_t			ictransaction_id;
-	uint8_t			icflags;
-	uint8_t			reserved[2];
-} __packed hv_vmbus_icmsg_hdr;
-
-typedef struct hv_vmbus_icmsg_negotiate {
-	uint16_t		icframe_vercnt;
-	uint16_t		icmsg_vercnt;
-	uint32_t		reserved;
-	hv_vmbus_ic_version	icversion_data[1]; /* any size array */
-} __packed hv_vmbus_icmsg_negotiate;
-
-typedef struct hv_vmbus_shutdown_msg_data {
-	uint32_t		reason_code;
-	uint32_t		timeout_seconds;
-	uint32_t 		flags;
-	uint8_t			display_message[2048];
-} __packed hv_vmbus_shutdown_msg_data;
-
-typedef struct hv_vmbus_heartbeat_msg_data {
-	uint64_t 		seq_num;
-	uint32_t 		reserved[8];
-} __packed hv_vmbus_heartbeat_msg_data;
-
-typedef struct {
-	/*
-	 * offset in bytes from the start of ring data below
-	 */
-	volatile uint32_t       write_index;
-	/*
-	 * offset in bytes from the start of ring data below
-	 */
-	volatile uint32_t       read_index;
-	/*
-	 * NOTE: The interrupt_mask field is used only for channels, but
-	 * vmbus connection also uses this data structure
-	 */
-	volatile uint32_t       interrupt_mask;
-	/* pad it to PAGE_SIZE so that data starts on a page */
-	uint8_t                 reserved[4084];
-
-	/*
-	 * WARNING: Ring data starts here
-	 *  !!! DO NOT place any fields below this !!!
-	 */
-	uint8_t			buffer[0];	/* doubles as interrupt mask */
-} __packed hv_vmbus_ring_buffer;
-
-typedef struct {
-	hv_vmbus_ring_buffer*	ring_buffer;
-	struct mtx		ring_lock;
-	uint32_t		ring_data_size;	/* ring_size */
-} hv_vmbus_ring_buffer_info;
-
-typedef void	(*vmbus_chan_callback_t)(void *);
-
-typedef struct hv_vmbus_channel {
-	device_t			ch_dev;
-	struct vmbus_softc		*vmbus_sc;
-	uint32_t			ch_flags;	/* VMBUS_CHAN_FLAG_ */
-	uint32_t			ch_id;		/* channel id */
-
-	/*
-	 * These are based on the offer_msg.monitor_id.
-	 * Save it here for easy access.
-	 */
-	int				ch_montrig_idx;	/* MNF trig index */
-	uint32_t			ch_montrig_mask;/* MNF trig mask */
-
-	/*
-	 * send to parent
-	 */
-	hv_vmbus_ring_buffer_info	outbound;
-	/*
-	 * receive from parent
-	 */
-	hv_vmbus_ring_buffer_info	inbound;
-
-	struct taskqueue		*ch_tq;
-	struct task			ch_task;
-	vmbus_chan_callback_t		ch_cb;
-	void				*ch_cbarg;
-
-	struct hyperv_mon_param		*ch_monprm;
-	struct hyperv_dma		ch_monprm_dma;
-
-	int				ch_cpuid;	/* owner cpu */
-	/*
-	 * Virtual cpuid for ch_cpuid; it is used to communicate cpuid
-	 * related information w/ Hyper-V.  If MSR_HV_VP_INDEX does not
-	 * exist, ch_vcpuid will always be 0 for compatibility.
-	 */
-	uint32_t			ch_vcpuid;
-
-	/*
-	 * If this is a primary channel, ch_subchan* fields
-	 * contain sub-channels belonging to this primary
-	 * channel.
-	 */
-	struct mtx			ch_subchan_lock;
-	TAILQ_HEAD(, hv_vmbus_channel)	ch_subchans;
-	int				ch_subchan_cnt;
-
-	/* If this is a sub-channel */
-	TAILQ_ENTRY(hv_vmbus_channel)	ch_sublink;	/* sub-channel link */
-	struct hv_vmbus_channel		*ch_prichan;	/* owner primary chan */
-
-	/*
-	 * Driver private data
-	 */
-	void				*hv_chan_priv1;
-	void				*hv_chan_priv2;
-	void				*hv_chan_priv3;
-
-	void				*ch_bufring;	/* TX+RX bufrings */
-	struct hyperv_dma		ch_bufring_dma;
-	uint32_t			ch_bufring_gpadl;
-
-	struct task			ch_detach_task;
-	TAILQ_ENTRY(hv_vmbus_channel)	ch_prilink;	/* primary chan link */
-	uint32_t			ch_subidx;	/* subchan index */
-	volatile uint32_t		ch_stflags;	/* atomic-op */
-							/* VMBUS_CHAN_ST_ */
-	struct hyperv_guid		ch_guid_type;
-	struct hyperv_guid		ch_guid_inst;
-
-	struct sysctl_ctx_list		ch_sysctl_ctx;
-} hv_vmbus_channel;
-
-#define VMBUS_CHAN_ISPRIMARY(chan)	((chan)->ch_subidx == 0)
-
-#define VMBUS_CHAN_FLAG_HASMNF		0x0001
-/*
- * If this flag is set, this channel's interrupt will be masked in ISR,
- * and the RX bufring will be drained before this channel's interrupt is
- * unmasked.
- *
- * This flag is turned on by default.  Drivers can turn it off according
- * to their own requirement.
- */
-#define VMBUS_CHAN_FLAG_BATCHREAD	0x0002
-
-#define VMBUS_CHAN_ST_OPENED_SHIFT	0
-#define VMBUS_CHAN_ST_OPENED		(1 << VMBUS_CHAN_ST_OPENED_SHIFT)
-
 /**
  * @brief Get physical address from virtual
  */
@@ -278,10 +77,4 @@ hv_get_phys_addr(void *virt)
 	return (ret);
 }
 
-static __inline struct hv_vmbus_channel *
-vmbus_get_channel(device_t dev)
-{
-	return device_get_ivars(dev);
-}
-
 #endif  /* __HYPERV_H__ */

Modified: stable/11/sys/dev/hyperv/include/vmbus.h
==============================================================================
--- stable/11/sys/dev/hyperv/include/vmbus.h	Mon Oct 17 03:07:06 2016	(r307460)
+++ stable/11/sys/dev/hyperv/include/vmbus.h	Mon Oct 17 03:24:03 2016	(r307461)
@@ -32,6 +32,23 @@
 #include <sys/param.h>
 
 /*
+ * VMBUS version is 32 bit, upper 16 bit for major_number and lower
+ * 16 bit for minor_number.
+ *
+ * 0.13  --  Windows Server 2008
+ * 1.1   --  Windows 7
+ * 2.4   --  Windows 8
+ * 3.0   --  Windows 8.1
+ */
+#define VMBUS_VERSION_WS2008		((0 << 16) | (13))
+#define VMBUS_VERSION_WIN7		((1 << 16) | (1))
+#define VMBUS_VERSION_WIN8		((2 << 16) | (4))
+#define VMBUS_VERSION_WIN8_1		((3 << 16) | (0))
+
+#define VMBUS_VERSION_MAJOR(ver)	(((uint32_t)(ver)) >> 16)
+#define VMBUS_VERSION_MINOR(ver)	(((uint32_t)(ver)) & 0xffff)
+
+/*
  * GPA stuffs.
  */
 struct vmbus_gpa_range {
@@ -87,41 +104,56 @@ struct vmbus_chanpkt_rxbuf {
 #define VMBUS_CHAN_SGLIST_MAX		32
 #define VMBUS_CHAN_PRPLIST_MAX		32
 
-struct hv_vmbus_channel;
+struct vmbus_channel;
+struct hyperv_guid;
 
-int	vmbus_chan_open(struct hv_vmbus_channel *chan,
+typedef void	(*vmbus_chan_callback_t)(struct vmbus_channel *, void *);
+
+static __inline struct vmbus_channel *
+vmbus_get_channel(device_t dev)
+{
+	return device_get_ivars(dev);
+}
+
+int	vmbus_chan_open(struct vmbus_channel *chan,
 	    int txbr_size, int rxbr_size, const void *udata, int udlen,
 	    vmbus_chan_callback_t cb, void *cbarg);
-void	vmbus_chan_close(struct hv_vmbus_channel *chan);
+void	vmbus_chan_close(struct vmbus_channel *chan);
 
-int	vmbus_chan_gpadl_connect(struct hv_vmbus_channel *chan,
+int	vmbus_chan_gpadl_connect(struct vmbus_channel *chan,
 	    bus_addr_t paddr, int size, uint32_t *gpadl);
-int	vmbus_chan_gpadl_disconnect(struct hv_vmbus_channel *chan,
+int	vmbus_chan_gpadl_disconnect(struct vmbus_channel *chan,
 	    uint32_t gpadl);
 
-void	vmbus_chan_cpu_set(struct hv_vmbus_channel *chan, int cpu);
-void	vmbus_chan_cpu_rr(struct hv_vmbus_channel *chan);
-struct hv_vmbus_channel *
-	vmbus_chan_cpu2chan(struct hv_vmbus_channel *chan, int cpu);
-void	vmbus_chan_set_readbatch(struct hv_vmbus_channel *chan, bool on);
-
-struct hv_vmbus_channel **
-	vmbus_subchan_get(struct hv_vmbus_channel *pri_chan, int subchan_cnt);
-void	vmbus_subchan_rel(struct hv_vmbus_channel **subchan, int subchan_cnt);
-void	vmbus_subchan_drain(struct hv_vmbus_channel *pri_chan);
+void	vmbus_chan_cpu_set(struct vmbus_channel *chan, int cpu);
+void	vmbus_chan_cpu_rr(struct vmbus_channel *chan);
+struct vmbus_channel *
+	vmbus_chan_cpu2chan(struct vmbus_channel *chan, int cpu);
+void	vmbus_chan_set_readbatch(struct vmbus_channel *chan, bool on);
+
+struct vmbus_channel **
+	vmbus_subchan_get(struct vmbus_channel *pri_chan, int subchan_cnt);
+void	vmbus_subchan_rel(struct vmbus_channel **subchan, int subchan_cnt);
+void	vmbus_subchan_drain(struct vmbus_channel *pri_chan);
 
-int	vmbus_chan_recv(struct hv_vmbus_channel *chan, void *data, int *dlen,
+int	vmbus_chan_recv(struct vmbus_channel *chan, void *data, int *dlen,
 	    uint64_t *xactid);
-int	vmbus_chan_recv_pkt(struct hv_vmbus_channel *chan,
+int	vmbus_chan_recv_pkt(struct vmbus_channel *chan,
 	    struct vmbus_chanpkt_hdr *pkt, int *pktlen);
 
-int	vmbus_chan_send(struct hv_vmbus_channel *chan, uint16_t type,
+int	vmbus_chan_send(struct vmbus_channel *chan, uint16_t type,
 	    uint16_t flags, void *data, int dlen, uint64_t xactid);
-int	vmbus_chan_send_sglist(struct hv_vmbus_channel *chan,
+int	vmbus_chan_send_sglist(struct vmbus_channel *chan,
 	    struct vmbus_gpa sg[], int sglen, void *data, int dlen,
 	    uint64_t xactid);
-int	vmbus_chan_send_prplist(struct hv_vmbus_channel *chan,
+int	vmbus_chan_send_prplist(struct vmbus_channel *chan,
 	    struct vmbus_gpa_range *prp, int prp_cnt, void *data, int dlen,
 	    uint64_t xactid);
 
+uint32_t vmbus_chan_id(const struct vmbus_channel *chan);
+uint32_t vmbus_chan_subidx(const struct vmbus_channel *chan);
+bool	vmbus_chan_is_primary(const struct vmbus_channel *chan);
+const struct hyperv_guid *
+	vmbus_chan_guid_inst(const struct vmbus_channel *chan);
+
 #endif	/* !_VMBUS_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 03:07:06 2016	(r307460)
+++ stable/11/sys/dev/hyperv/netvsc/hv_net_vsc.c	Mon Oct 17 03:24:03 2016	(r307461)
@@ -49,26 +49,24 @@
 #include "hv_rndis.h"
 #include "hv_rndis_filter.h"
 
-/* priv1 and priv2 are consumed by the main driver */
-#define hv_chan_rdbuf	hv_chan_priv3
-
 MALLOC_DEFINE(M_NETVSC, "netvsc", "Hyper-V netvsc driver");
 
 /*
  * Forward declarations
  */
-static void hv_nv_on_channel_callback(void *xchan);
+static void hv_nv_on_channel_callback(struct vmbus_channel *chan,
+    void *xrxr);
 static int  hv_nv_init_send_buffer_with_net_vsp(struct hn_softc *sc);
 static int  hv_nv_init_rx_buffer_with_net_vsp(struct hn_softc *);
 static int  hv_nv_destroy_send_buffer(netvsc_dev *net_dev);
 static int  hv_nv_destroy_rx_buffer(netvsc_dev *net_dev);
 static int  hv_nv_connect_to_vsp(struct hn_softc *sc);
 static void hv_nv_on_send_completion(netvsc_dev *net_dev,
-    struct hv_vmbus_channel *, const struct vmbus_chanpkt_hdr *pkt);
-static void hv_nv_on_receive_completion(struct hv_vmbus_channel *chan,
+    struct vmbus_channel *, const struct vmbus_chanpkt_hdr *pkt);
+static void hv_nv_on_receive_completion(struct vmbus_channel *chan,
     uint64_t tid, uint32_t status);
 static void hv_nv_on_receive(netvsc_dev *net_dev,
-    struct hn_softc *sc, struct hv_vmbus_channel *chan,
+    struct hn_rx_ring *rxr, struct vmbus_channel *chan,
     const struct vmbus_chanpkt_hdr *pkt);
 
 /*
@@ -641,13 +639,14 @@ hv_nv_disconnect_from_vsp(netvsc_dev *ne
 }
 
 void
-hv_nv_subchan_attach(struct hv_vmbus_channel *chan)
+hv_nv_subchan_attach(struct vmbus_channel *chan, struct hn_rx_ring *rxr)
 {
-
-	chan->hv_chan_rdbuf = malloc(NETVSC_PACKET_SIZE, M_NETVSC, M_WAITOK);
+	KASSERT(rxr->hn_rx_idx == vmbus_chan_subidx(chan),
+	    ("chan%u subidx %u, rxr%d mismatch",
+	     vmbus_chan_id(chan), vmbus_chan_subidx(chan), rxr->hn_rx_idx));
 	vmbus_chan_open(chan, NETVSC_DEVICE_RING_BUFFER_SIZE,
 	    NETVSC_DEVICE_RING_BUFFER_SIZE, NULL, 0,
-	    hv_nv_on_channel_callback, chan);
+	    hv_nv_on_channel_callback, rxr);
 }
 
 /*
@@ -656,9 +655,10 @@ hv_nv_subchan_attach(struct hv_vmbus_cha
  * Callback when the device belonging to this driver is added
  */
 netvsc_dev *
-hv_nv_on_device_add(struct hn_softc *sc, void *additional_info)
+hv_nv_on_device_add(struct hn_softc *sc, void *additional_info,
+    struct hn_rx_ring *rxr)
 {
-	struct hv_vmbus_channel *chan = sc->hn_prichan;
+	struct vmbus_channel *chan = sc->hn_prichan;
 	netvsc_dev *net_dev;
 	int ret = 0;
 
@@ -670,18 +670,17 @@ hv_nv_on_device_add(struct hn_softc *sc,
 
 	sema_init(&net_dev->channel_init_sema, 0, "netdev_sema");
 
-	chan->hv_chan_rdbuf = malloc(NETVSC_PACKET_SIZE, M_NETVSC, M_WAITOK);
-
 	/*
 	 * Open the channel
 	 */
+	KASSERT(rxr->hn_rx_idx == vmbus_chan_subidx(chan),
+	    ("chan%u subidx %u, rxr%d mismatch",
+	     vmbus_chan_id(chan), vmbus_chan_subidx(chan), rxr->hn_rx_idx));
 	ret = vmbus_chan_open(chan,
 	    NETVSC_DEVICE_RING_BUFFER_SIZE, NETVSC_DEVICE_RING_BUFFER_SIZE,
-	    NULL, 0, hv_nv_on_channel_callback, chan);
-	if (ret != 0) {
-		free(chan->hv_chan_rdbuf, M_NETVSC);
+	    NULL, 0, hv_nv_on_channel_callback, rxr);
+	if (ret != 0)
 		goto cleanup;
-	}
 
 	/*
 	 * Connect with the NetVsp
@@ -694,7 +693,6 @@ hv_nv_on_device_add(struct hn_softc *sc,
 
 close:
 	/* Now, we can close the channel safely */
-	free(chan->hv_chan_rdbuf, M_NETVSC);
 	vmbus_chan_close(chan);
 
 cleanup:
@@ -725,7 +723,6 @@ hv_nv_on_device_remove(struct hn_softc *
 
 	/* Now, we can close the channel safely */
 
-	free(sc->hn_prichan->hv_chan_rdbuf, M_NETVSC);
 	vmbus_chan_close(sc->hn_prichan);
 
 	sema_destroy(&net_dev->channel_init_sema);
@@ -738,7 +735,7 @@ hv_nv_on_device_remove(struct hn_softc *
  * Net VSC on send completion
  */
 static void
-hv_nv_on_send_completion(netvsc_dev *net_dev, struct hv_vmbus_channel *chan,
+hv_nv_on_send_completion(netvsc_dev *net_dev, struct vmbus_channel *chan,
     const struct vmbus_chanpkt_hdr *pkt)
 {
 	const nvsp_msg *nvsp_msg_pkt;
@@ -802,7 +799,7 @@ hv_nv_on_send_completion(netvsc_dev *net
  * Returns 0 on success, non-zero on failure.
  */
 int
-hv_nv_on_send(struct hv_vmbus_channel *chan, netvsc_packet *pkt)
+hv_nv_on_send(struct vmbus_channel *chan, netvsc_packet *pkt)
 {
 	nvsp_msg send_msg;
 	int ret;
@@ -840,14 +837,13 @@ hv_nv_on_send(struct hv_vmbus_channel *c
  * with virtual addresses.
  */
 static void
-hv_nv_on_receive(netvsc_dev *net_dev, struct hn_softc *sc,
-    struct hv_vmbus_channel *chan, const struct vmbus_chanpkt_hdr *pkthdr)
+hv_nv_on_receive(netvsc_dev *net_dev, struct hn_rx_ring *rxr,
+    struct vmbus_channel *chan, const struct vmbus_chanpkt_hdr *pkthdr)
 {
 	const struct vmbus_chanpkt_rxbuf *pkt;
 	const nvsp_msg *nvsp_msg_pkt;
 	netvsc_packet vsc_pkt;
 	netvsc_packet *net_vsc_pkt = &vsc_pkt;
-	device_t dev = sc->hn_dev;
 	int count = 0;
 	int i = 0;
 	int status = nvsp_status_success;
@@ -856,7 +852,7 @@ hv_nv_on_receive(netvsc_dev *net_dev, st
 
 	/* Make sure this is a valid nvsp packet */
 	if (nvsp_msg_pkt->hdr.msg_type != nvsp_msg_1_type_send_rndis_pkt) {
-		device_printf(dev, "packet hdr type %u is invalid!\n",
+		if_printf(rxr->hn_ifp, "packet hdr type %u is invalid!\n",
 		    nvsp_msg_pkt->hdr.msg_type);
 		return;
 	}
@@ -864,7 +860,7 @@ hv_nv_on_receive(netvsc_dev *net_dev, st
 	pkt = (const struct vmbus_chanpkt_rxbuf *)pkthdr;
 
 	if (pkt->cp_rxbuf_id != NETVSC_RECEIVE_BUFFER_ID) {
-		device_printf(dev, "rxbuf_id %d is invalid!\n",
+		if_printf(rxr->hn_ifp, "rxbuf_id %d is invalid!\n",
 		    pkt->cp_rxbuf_id);
 		return;
 	}
@@ -878,7 +874,7 @@ hv_nv_on_receive(netvsc_dev *net_dev, st
 		    pkt->cp_rxbuf[i].rb_ofs);
 		net_vsc_pkt->tot_data_buf_len = pkt->cp_rxbuf[i].rb_len;
 
-		hv_rf_on_receive(net_dev, chan, net_vsc_pkt);
+		hv_rf_on_receive(net_dev, rxr, net_vsc_pkt);
 		if (net_vsc_pkt->status != nvsp_status_success) {
 			status = nvsp_status_failure;
 		}
@@ -898,7 +894,7 @@ hv_nv_on_receive(netvsc_dev *net_dev, st
  * Send a receive completion packet to RNDIS device (ie NetVsp)
  */
 static void
-hv_nv_on_receive_completion(struct hv_vmbus_channel *chan, uint64_t tid,
+hv_nv_on_receive_completion(struct vmbus_channel *chan, uint64_t tid,
     uint32_t status)
 {
 	nvsp_msg rx_comp_msg;
@@ -973,11 +969,10 @@ hv_nv_send_table(struct hn_softc *sc, co
  * Net VSC on channel callback
  */
 static void
-hv_nv_on_channel_callback(void *xchan)
+hv_nv_on_channel_callback(struct vmbus_channel *chan, void *xrxr)
 {
-	struct hv_vmbus_channel *chan = xchan;
-	device_t dev = chan->ch_dev;
-	struct hn_softc *sc = device_get_softc(dev);
+	struct hn_rx_ring *rxr = xrxr;
+	struct hn_softc *sc = rxr->hn_ifp->if_softc;
 	netvsc_dev *net_dev;
 	void *buffer;
 	int bufferlen = NETVSC_PACKET_SIZE;
@@ -986,7 +981,7 @@ hv_nv_on_channel_callback(void *xchan)
 	if (net_dev == NULL)
 		return;
 
-	buffer = chan->hv_chan_rdbuf;
+	buffer = rxr->hn_rdbuf;
 	do {
 		struct vmbus_chanpkt_hdr *pkt = buffer;
 		uint32_t bytes_rxed;
@@ -1002,13 +997,13 @@ hv_nv_on_channel_callback(void *xchan)
 					    pkt);
 					break;
 				case VMBUS_CHANPKT_TYPE_RXBUF:
-					hv_nv_on_receive(net_dev, sc, chan, pkt);
+					hv_nv_on_receive(net_dev, rxr, chan, pkt);
 					break;
 				case VMBUS_CHANPKT_TYPE_INBAND:
 					hv_nv_send_table(sc, pkt);
 					break;
 				default:
-					device_printf(dev,
+					if_printf(rxr->hn_ifp,
 					    "unknown chan pkt %u\n",
 					    pkt->cph_type);
 					break;
@@ -1024,7 +1019,7 @@ hv_nv_on_channel_callback(void *xchan)
 			/* alloc new buffer */
 			buffer = malloc(bytes_rxed, M_NETVSC, M_NOWAIT);
 			if (buffer == NULL) {
-				device_printf(dev,
+				if_printf(rxr->hn_ifp,
 				    "hv_cb malloc buffer failed, len=%u\n",
 				    bytes_rxed);
 				bufferlen = 0;
@@ -1040,5 +1035,5 @@ hv_nv_on_channel_callback(void *xchan)
 	if (bufferlen > NETVSC_PACKET_SIZE)
 		free(buffer, M_NETVSC);
 
-	hv_rf_channel_rollup(chan);
+	hv_rf_channel_rollup(rxr, rxr->hn_txr);
 }

Modified: stable/11/sys/dev/hyperv/netvsc/hv_net_vsc.h
==============================================================================
--- stable/11/sys/dev/hyperv/netvsc/hv_net_vsc.h	Mon Oct 17 03:07:06 2016	(r307460)
+++ stable/11/sys/dev/hyperv/netvsc/hv_net_vsc.h	Mon Oct 17 03:24:03 2016	(r307461)
@@ -53,6 +53,7 @@
 #include <netinet/in.h>
 #include <netinet/tcp_lro.h>
 
+#include <net/ethernet.h>
 #include <net/if.h>
 #include <net/if_media.h>
 
@@ -1065,12 +1066,12 @@ typedef struct netvsc_dev_ {
 	nvsp_msg				channel_init_packet;
 
 	nvsp_msg				revoke_packet;
-	/*uint8_t				hw_mac_addr[HW_MACADDR_LEN];*/
+	/*uint8_t				hw_mac_addr[ETHER_ADDR_LEN];*/
 
 	/* Holds rndis device info */
 	void					*extension;
 
-	hv_bool_uint8_t				destroy;
+	uint8_t					destroy;
 	/* Negotiated NVSP version */
 	uint32_t				nvsp_version;
 
@@ -1081,9 +1082,9 @@ typedef struct netvsc_dev_ {
 	uint32_t                                vrss_send_table[VRSS_SEND_TABLE_SIZE];
 } netvsc_dev;
 
-struct hv_vmbus_channel;
+struct vmbus_channel;
 
-typedef void (*pfn_on_send_rx_completion)(struct hv_vmbus_channel *, void *);
+typedef void (*pfn_on_send_rx_completion)(struct vmbus_channel *, void *);
 
 #define NETVSC_DEVICE_RING_BUFFER_SIZE	(128 * PAGE_SIZE)
 
@@ -1109,7 +1110,7 @@ typedef void (*pfn_on_send_rx_completion
 #endif
 
 typedef struct netvsc_packet_ {
-	hv_bool_uint8_t            is_data_pkt;      /* One byte */
+	uint8_t                    is_data_pkt;      /* One byte */
 	uint16_t		   vlan_tci;
 	uint32_t status;
 
@@ -1140,7 +1141,7 @@ typedef struct netvsc_packet_ {
 
 typedef struct {
 	uint8_t		mac_addr[6];  /* Assumption unsigned long */
-	hv_bool_uint8_t	link_state;
+	uint8_t		link_state;
 } netvsc_device_info;
 
 #ifndef HN_USE_TXDESC_BUFRING
@@ -1150,8 +1151,12 @@ SLIST_HEAD(hn_txdesc_list, hn_txdesc);
 struct buf_ring;
 #endif
 
+struct hn_tx_ring;
+
 struct hn_rx_ring {
 	struct ifnet	*hn_ifp;
+	struct hn_tx_ring *hn_txr;
+	void		*hn_rdbuf;
 	int		hn_rx_idx;
 
 	/* Trust csum verification on host side */
@@ -1202,7 +1207,7 @@ struct hn_tx_ring {
 
 	struct mtx	hn_tx_lock;
 	struct hn_softc	*hn_sc;
-	struct hv_vmbus_channel *hn_chan;
+	struct vmbus_channel *hn_chan;
 
 	int		hn_direct_tx_size;
 	int		hn_tx_chimney_size;
@@ -1241,7 +1246,7 @@ typedef struct hn_softc {
 	/* See hv_netvsc_drv_freebsd.c for rules on how to use */
 	int             temp_unusable;
 	netvsc_dev  	*net_dev;
-	struct hv_vmbus_channel *hn_prichan;
+	struct vmbus_channel *hn_prichan;
 
 	int		hn_rx_ring_cnt;
 	int		hn_rx_ring_inuse;
@@ -1265,12 +1270,13 @@ extern int hv_promisc_mode;
 
 void netvsc_linkstatus_callback(struct hn_softc *sc, uint32_t status);
 netvsc_dev *hv_nv_on_device_add(struct hn_softc *sc,
-    void *additional_info);
+    void *additional_info, struct hn_rx_ring *rxr);
 int hv_nv_on_device_remove(struct hn_softc *sc,
     boolean_t destroy_channel);
-int hv_nv_on_send(struct hv_vmbus_channel *chan, netvsc_packet *pkt);
+int hv_nv_on_send(struct vmbus_channel *chan, netvsc_packet *pkt);
 int hv_nv_get_next_send_section(netvsc_dev *net_dev);
-void hv_nv_subchan_attach(struct hv_vmbus_channel *chan);
+void hv_nv_subchan_attach(struct vmbus_channel *chan,
+    struct hn_rx_ring *rxr);
 
 #endif  /* __HV_NET_VSC_H__ */
 

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 03:07:06 2016	(r307460)
+++ stable/11/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c	Mon Oct 17 03:24:03 2016	(r307461)
@@ -120,9 +120,6 @@ __FBSDID("$FreeBSD$");
 #include "hv_rndis_filter.h"
 #include "vmbus_if.h"
 
-#define hv_chan_rxr	hv_chan_priv1
-#define hv_chan_txr	hv_chan_priv2
-
 /* Short for Hyper-V network interface */
 #define NETVSC_DEVNAME    "hn"
 
@@ -343,8 +340,8 @@ static int hn_encap(struct hn_tx_ring *,
 static void hn_create_rx_data(struct hn_softc *sc, int);
 static void hn_destroy_rx_data(struct hn_softc *sc);
 static void hn_set_tx_chimney_size(struct hn_softc *, int);
-static void hn_channel_attach(struct hn_softc *, struct hv_vmbus_channel *);
-static void hn_subchan_attach(struct hn_softc *, struct hv_vmbus_channel *);
+static void hn_channel_attach(struct hn_softc *, struct vmbus_channel *);
+static void hn_subchan_attach(struct hn_softc *, struct vmbus_channel *);
 static void hn_subchan_setup(struct hn_softc *);
 
 static int hn_transmit(struct ifnet *, struct mbuf *);
@@ -544,7 +541,8 @@ netvsc_attach(device_t dev)
 	    IFCAP_LRO;
 	ifp->if_hwassist = sc->hn_tx_ring[0].hn_csum_assist | CSUM_TSO;
 
-	error = hv_rf_on_device_add(sc, &device_info, ring_cnt);
+	error = hv_rf_on_device_add(sc, &device_info, ring_cnt,
+	    &sc->hn_rx_ring[0]);
 	if (error)
 		goto failed;
 	KASSERT(sc->net_dev->num_channel > 0 &&
@@ -782,7 +780,7 @@ hn_txeof(struct hn_tx_ring *txr)
 }
 
 static void
-hn_tx_done(struct hv_vmbus_channel *chan, void *xpkt)
+hn_tx_done(struct vmbus_channel *chan, void *xpkt)
 {
 	netvsc_packet *packet = xpkt;
 	struct hn_txdesc *txd;
@@ -793,9 +791,8 @@ hn_tx_done(struct hv_vmbus_channel *chan
 
 	txr = txd->txr;
 	KASSERT(txr->hn_chan == chan,
-	    ("channel mismatch, on channel%u, should be channel%u",
-	     chan->ch_subidx,
-	     txr->hn_chan->ch_subidx));
+	    ("channel mismatch, on chan%u, should be chan%u",
+	     vmbus_chan_subidx(chan), vmbus_chan_subidx(txr->hn_chan)));
 
 	txr->hn_has_txeof = 1;
 	hn_txdesc_put(txr, txd);
@@ -809,12 +806,9 @@ hn_tx_done(struct hv_vmbus_channel *chan
 }
 
 void
-netvsc_channel_rollup(struct hv_vmbus_channel *chan)
+netvsc_channel_rollup(struct hn_rx_ring *rxr, struct hn_tx_ring *txr)
 {
-	struct hn_tx_ring *txr = chan->hv_chan_txr;
 #if defined(INET) || defined(INET6)
-	struct hn_rx_ring *rxr = chan->hv_chan_rxr;
-
 	tcp_lro_flush_all(&rxr->hn_lro);
 #endif
 
@@ -1279,12 +1273,11 @@ hn_lro_rx(struct lro_ctrl *lc, struct mb
  * Note:  This is no longer used as a callback
  */
 int
-netvsc_recv(struct hv_vmbus_channel *chan, netvsc_packet *packet,
+netvsc_recv(struct hn_rx_ring *rxr, netvsc_packet *packet,
     const rndis_tcp_ip_csum_info *csum_info,
     const struct rndis_hash_info *hash_info,
     const struct rndis_hash_value *hash_value)
 {
-	struct hn_rx_ring *rxr = chan->hv_chan_rxr;
 	struct ifnet *ifp = rxr->hn_ifp;
 	struct mbuf *m_new;
 	int size, do_lro = 0, do_csum = 1;
@@ -1589,7 +1582,7 @@ hn_ioctl(struct ifnet *ifp, u_long cmd, 
 		vmbus_subchan_drain(sc->hn_prichan);
 
 		error = hv_rf_on_device_add(sc, &device_info,
-		    sc->hn_rx_ring_inuse);
+		    sc->hn_rx_ring_inuse, &sc->hn_rx_ring[0]);
 		if (error) {
 			NV_LOCK(sc);
 			sc->temp_unusable = FALSE;
@@ -2223,6 +2216,9 @@ hn_create_rx_data(struct hn_softc *sc, i
 		if (hn_trust_hostip)
 			rxr->hn_trust_hcsum |= HN_TRUST_HCSUM_IP;
 		rxr->hn_ifp = sc->hn_ifp;
+		if (i < sc->hn_tx_ring_cnt)
+			rxr->hn_txr = &sc->hn_tx_ring[i];
+		rxr->hn_rdbuf = malloc(NETVSC_PACKET_SIZE, M_NETVSC, M_WAITOK);
 		rxr->hn_rx_idx = i;
 
 		/*
@@ -2335,17 +2331,19 @@ hn_create_rx_data(struct hn_softc *sc, i
 static void
 hn_destroy_rx_data(struct hn_softc *sc)
 {
-#if defined(INET) || defined(INET6)
 	int i;
-#endif
 
 	if (sc->hn_rx_ring_cnt == 0)
 		return;
 
+	for (i = 0; i < sc->hn_rx_ring_cnt; ++i) {
+		struct hn_rx_ring *rxr = &sc->hn_rx_ring[i];
+
 #if defined(INET) || defined(INET6)
-	for (i = 0; i < sc->hn_rx_ring_cnt; ++i)
-		tcp_lro_free(&sc->hn_rx_ring[i].hn_lro);
+		tcp_lro_free(&rxr->hn_lro);
 #endif
+		free(rxr->hn_rdbuf, M_NETVSC);
+	}
 	free(sc->hn_rx_ring, M_NETVSC);
 	sc->hn_rx_ring = NULL;
 
@@ -2913,12 +2911,12 @@ hn_xmit_txeof_taskfunc(void *xtxr, int p
 }
 
 static void
-hn_channel_attach(struct hn_softc *sc, struct hv_vmbus_channel *chan)
+hn_channel_attach(struct hn_softc *sc, struct vmbus_channel *chan)
 {
 	struct hn_rx_ring *rxr;
 	int idx;
 
-	idx = chan->ch_subidx;
+	idx = vmbus_chan_subidx(chan);
 
 	KASSERT(idx >= 0 && idx < sc->hn_rx_ring_inuse,
 	    ("invalid channel index %d, should > 0 && < %d",
@@ -2928,10 +2926,9 @@ hn_channel_attach(struct hn_softc *sc, s
 	    ("RX ring %d already attached", idx));
 	rxr->hn_rx_flags |= HN_RX_FLAG_ATTACHED;
 
-	chan->hv_chan_rxr = rxr;
 	if (bootverbose) {
 		if_printf(sc->hn_ifp, "link RX ring %d to channel%u\n",
-		    idx, chan->ch_id);
+		    idx, vmbus_chan_id(chan));
 	}
 
 	if (idx < sc->hn_tx_ring_inuse) {
@@ -2941,11 +2938,10 @@ hn_channel_attach(struct hn_softc *sc, s
 		    ("TX ring %d already attached", idx));
 		txr->hn_tx_flags |= HN_TX_FLAG_ATTACHED;
 
-		chan->hv_chan_txr = txr;
 		txr->hn_chan = chan;
 		if (bootverbose) {
 			if_printf(sc->hn_ifp, "link TX ring %d to channel%u\n",
-			    idx, chan->ch_id);
+			    idx, vmbus_chan_id(chan));
 		}
 	}
 
@@ -2954,36 +2950,36 @@ hn_channel_attach(struct hn_softc *sc, s
 }
 
 static void
-hn_subchan_attach(struct hn_softc *sc, struct hv_vmbus_channel *chan)
+hn_subchan_attach(struct hn_softc *sc, struct vmbus_channel *chan)
 {
 
-	KASSERT(!VMBUS_CHAN_ISPRIMARY(chan),
+	KASSERT(!vmbus_chan_is_primary(chan),
 	    ("subchannel callback on primary channel"));
-	KASSERT(chan->ch_subidx > 0,
-	    ("invalid channel subidx %u",
-	     chan->ch_subidx));
 	hn_channel_attach(sc, chan);
 }
 
 static void
 hn_subchan_setup(struct hn_softc *sc)
 {
-	struct hv_vmbus_channel **subchan;
+	struct vmbus_channel **subchans;
 	int subchan_cnt = sc->net_dev->num_channel - 1;
 	int i;
 
 	/* Wait for sub-channels setup to complete. */
-	subchan = vmbus_subchan_get(sc->hn_prichan, subchan_cnt);
+	subchans = vmbus_subchan_get(sc->hn_prichan, subchan_cnt);
 
 	/* Attach the sub-channels. */
 	for (i = 0; i < subchan_cnt; ++i) {
+		struct vmbus_channel *subchan = subchans[i];
+
 		/* NOTE: Calling order is critical. */
-		hn_subchan_attach(sc, subchan[i]);
-		hv_nv_subchan_attach(subchan[i]);
+		hn_subchan_attach(sc, subchan);
+		hv_nv_subchan_attach(subchan,
+		    &sc->hn_rx_ring[vmbus_chan_subidx(subchan)]);
 	}
 
 	/* Release the sub-channels */
-	vmbus_subchan_rel(subchan, subchan_cnt);
+	vmbus_subchan_rel(subchans, subchan_cnt);
 	if_printf(sc->hn_ifp, "%d sub-channels setup done\n", subchan_cnt);
 }
 

Modified: stable/11/sys/dev/hyperv/netvsc/hv_rndis.h
==============================================================================
--- stable/11/sys/dev/hyperv/netvsc/hv_rndis.h	Mon Oct 17 03:07:06 2016	(r307460)
+++ stable/11/sys/dev/hyperv/netvsc/hv_rndis.h	Mon Oct 17 03:24:03 2016	(r307461)
@@ -1082,13 +1082,14 @@ typedef struct rndismp_rx_bufs_info_ {
 /*
  * Externs
  */
-struct hv_vmbus_channel;
+struct hn_rx_ring;
+struct hn_tx_ring;
 
-int netvsc_recv(struct hv_vmbus_channel *chan,
+int netvsc_recv(struct hn_rx_ring *rxr,
     netvsc_packet *packet, const rndis_tcp_ip_csum_info *csum_info,
     const struct rndis_hash_info *hash_info,
     const struct rndis_hash_value *hash_value);
-void netvsc_channel_rollup(struct hv_vmbus_channel *chan);
+void netvsc_channel_rollup(struct hn_rx_ring *rxr, struct hn_tx_ring *txr);
 
 void* hv_set_rppi_data(rndis_msg *rndis_mesg,
     uint32_t rppi_size,

Modified: stable/11/sys/dev/hyperv/netvsc/hv_rndis_filter.c
==============================================================================
--- stable/11/sys/dev/hyperv/netvsc/hv_rndis_filter.c	Mon Oct 17 03:07:06 2016	(r307460)
+++ stable/11/sys/dev/hyperv/netvsc/hv_rndis_filter.c	Mon Oct 17 03:24:03 2016	(r307461)
@@ -34,7 +34,9 @@ __FBSDID("$FreeBSD$");
 #include <sys/socket.h>
 #include <sys/lock.h>
 #include <sys/mutex.h>
+#include <net/if.h>
 #include <net/if_arp.h>
+#include <net/if_var.h>
 #include <net/ethernet.h>
 #include <sys/types.h>
 #include <machine/atomic.h>
@@ -74,8 +76,7 @@ static int  hv_rf_send_request(rndis_dev
 static void hv_rf_receive_response(rndis_device *device, rndis_msg *response);
 static void hv_rf_receive_indicate_status(rndis_device *device,
 					  rndis_msg *response);
-static void hv_rf_receive_data(rndis_device *device, rndis_msg *message,
-			       struct hv_vmbus_channel *chan,
+static void hv_rf_receive_data(struct hn_rx_ring *rxr, rndis_msg *message,
 			       netvsc_packet *pkt);
 static int  hv_rf_query_device(rndis_device *device, uint32_t oid,
 			       void *result, uint32_t *result_size);
@@ -85,8 +86,8 @@ static int  hv_rf_set_packet_filter(rndi
 static int  hv_rf_init_device(rndis_device *device);
 static int  hv_rf_open_device(rndis_device *device);
 static int  hv_rf_close_device(rndis_device *device);
-static void hv_rf_on_send_request_completion(struct hv_vmbus_channel *, void *context);
-static void hv_rf_on_send_request_halt_completion(struct hv_vmbus_channel *, void *context);
+static void hv_rf_on_send_request_completion(struct vmbus_channel *, void *context);
+static void hv_rf_on_send_request_halt_completion(struct vmbus_channel *, void *context);
 int
 hv_rf_send_offload_request(struct hn_softc *sc,
     rndis_offload_params *offloads);
@@ -527,12 +528,11 @@ skip:
  * RNDIS filter receive data
  */
 static void
-hv_rf_receive_data(rndis_device *device, rndis_msg *message,
-    struct hv_vmbus_channel *chan, netvsc_packet *pkt)
+hv_rf_receive_data(struct hn_rx_ring *rxr, rndis_msg *message,
+    netvsc_packet *pkt)
 {
 	rndis_packet *rndis_pkt;
 	uint32_t data_offset;
-	device_t dev = device->net_dev->sc->hn_dev;
 	struct hv_rf_recvinfo info;
 
 	rndis_pkt = &message->msg.packet;
@@ -548,7 +548,7 @@ hv_rf_receive_data(rndis_device *device,
 	pkt->tot_data_buf_len -= data_offset;
 	if (pkt->tot_data_buf_len < rndis_pkt->data_length) {
 		pkt->status = nvsp_status_failure;
-		device_printf(dev,
+		if_printf(rxr->hn_ifp,
 		    "total length %u is less than data length %u\n",
 		    pkt->tot_data_buf_len, rndis_pkt->data_length);
 		return;
@@ -559,7 +559,7 @@ hv_rf_receive_data(rndis_device *device,
 
 	if (hv_rf_find_recvinfo(rndis_pkt, &info)) {
 		pkt->status = nvsp_status_failure;
-		device_printf(dev, "recvinfo parsing failed\n");
+		if_printf(rxr->hn_ifp, "recvinfo parsing failed\n");
 		return;
 	}
 
@@ -568,7 +568,7 @@ hv_rf_receive_data(rndis_device *device,
 	else
 		pkt->vlan_tci = 0;
 
-	netvsc_recv(chan, pkt, info.csum_info, info.hash_info, info.hash_value);
+	netvsc_recv(rxr, pkt, info.csum_info, info.hash_info, info.hash_value);
 }
 
 /*
@@ -576,7 +576,7 @@ hv_rf_receive_data(rndis_device *device,
  */
 int
 hv_rf_on_receive(netvsc_dev *net_dev,
-    struct hv_vmbus_channel *chan, netvsc_packet *pkt)
+    struct hn_rx_ring *rxr, netvsc_packet *pkt)
 {
 	rndis_device *rndis_dev;
 	rndis_msg *rndis_hdr;
@@ -599,7 +599,7 @@ hv_rf_on_receive(netvsc_dev *net_dev,
 
 	/* data message */
 	case REMOTE_NDIS_PACKET_MSG:
-		hv_rf_receive_data(rndis_dev, rndis_hdr, chan, pkt);
+		hv_rf_receive_data(rxr, rndis_hdr, pkt);
 		break;
 	/* completion messages */
 	case REMOTE_NDIS_INITIALIZE_CMPLT:
@@ -699,7 +699,7 @@ cleanup:
 static inline int
 hv_rf_query_device_mac(rndis_device *device)
 {
-	uint32_t size = HW_MACADDR_LEN;
+	uint32_t size = ETHER_ADDR_LEN;
 
 	return (hv_rf_query_device(device,

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201610170324.u9H3O347016850>