svn commit: r307096 - in stable/10/sys/dev/hyperv: include netvsc storvsc utilities vmbus
Sepherosa Ziehau
sephe at FreeBSD.org
Wed Oct 12 03:18:19 UTC 2016
Author: sephe
Date: Wed Oct 12 03:18:17 2016
New Revision: 307096
URL: https://svnweb.freebsd.org/changeset/base/307096
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/10/sys/dev/hyperv/utilities/hv_utilreg.h
- copied unchanged from r303067, head/sys/dev/hyperv/utilities/hv_utilreg.h
stable/10/sys/dev/hyperv/vmbus/vmbus_chanvar.h
- copied, changed from r303071, head/sys/dev/hyperv/vmbus/vmbus_chanvar.h
Modified:
stable/10/sys/dev/hyperv/include/hyperv.h
stable/10/sys/dev/hyperv/include/vmbus.h
stable/10/sys/dev/hyperv/netvsc/hv_net_vsc.c
stable/10/sys/dev/hyperv/netvsc/hv_net_vsc.h
stable/10/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c
stable/10/sys/dev/hyperv/netvsc/hv_rndis.h
stable/10/sys/dev/hyperv/netvsc/hv_rndis_filter.c
stable/10/sys/dev/hyperv/netvsc/hv_rndis_filter.h
stable/10/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c
stable/10/sys/dev/hyperv/utilities/hv_heartbeat.c
stable/10/sys/dev/hyperv/utilities/hv_kvp.c
stable/10/sys/dev/hyperv/utilities/hv_shutdown.c
stable/10/sys/dev/hyperv/utilities/hv_timesync.c
stable/10/sys/dev/hyperv/utilities/hv_util.c
stable/10/sys/dev/hyperv/utilities/hv_util.h
stable/10/sys/dev/hyperv/vmbus/hv_vmbus_priv.h
stable/10/sys/dev/hyperv/vmbus/vmbus.c
stable/10/sys/dev/hyperv/vmbus/vmbus_chan.c
stable/10/sys/dev/hyperv/vmbus/vmbus_var.h
Directory Properties:
stable/10/ (props changed)
Modified: stable/10/sys/dev/hyperv/include/hyperv.h
==============================================================================
--- stable/10/sys/dev/hyperv/include/hyperv.h Wed Oct 12 03:08:58 2016 (r307095)
+++ stable/10/sys/dev/hyperv/include/hyperv.h Wed Oct 12 03:18:17 2016 (r307096)
@@ -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/10/sys/dev/hyperv/include/vmbus.h
==============================================================================
--- stable/10/sys/dev/hyperv/include/vmbus.h Wed Oct 12 03:08:58 2016 (r307095)
+++ stable/10/sys/dev/hyperv/include/vmbus.h Wed Oct 12 03:18:17 2016 (r307096)
@@ -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/10/sys/dev/hyperv/netvsc/hv_net_vsc.c
==============================================================================
--- stable/10/sys/dev/hyperv/netvsc/hv_net_vsc.c Wed Oct 12 03:08:58 2016 (r307095)
+++ stable/10/sys/dev/hyperv/netvsc/hv_net_vsc.c Wed Oct 12 03:18:17 2016 (r307096)
@@ -48,26 +48,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);
/*
@@ -640,13 +638,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);
}
/*
@@ -655,9 +654,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;
@@ -669,18 +669,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
@@ -693,7 +692,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:
@@ -724,7 +722,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);
@@ -737,7 +734,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;
@@ -801,7 +798,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;
@@ -839,14 +836,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;
@@ -855,7 +851,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;
}
@@ -863,7 +859,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;
}
@@ -877,7 +873,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;
}
@@ -897,7 +893,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;
@@ -972,11 +968,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;
@@ -985,7 +980,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;
@@ -1001,13 +996,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;
@@ -1023,7 +1018,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;
@@ -1039,5 +1034,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/10/sys/dev/hyperv/netvsc/hv_net_vsc.h
==============================================================================
--- stable/10/sys/dev/hyperv/netvsc/hv_net_vsc.h Wed Oct 12 03:08:58 2016 (r307095)
+++ stable/10/sys/dev/hyperv/netvsc/hv_net_vsc.h Wed Oct 12 03:18:17 2016 (r307096)
@@ -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;
@@ -1242,7 +1247,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;
@@ -1266,12 +1271,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/10/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c
==============================================================================
--- stable/10/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c Wed Oct 12 03:08:58 2016 (r307095)
+++ stable/10/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c Wed Oct 12 03:18:17 2016 (r307096)
@@ -122,9 +122,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"
@@ -347,8 +344,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 *);
@@ -560,7 +557,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 &&
@@ -794,7 +792,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;
@@ -805,9 +803,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);
@@ -821,11 +818,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;
struct lro_ctrl *lro = &rxr->hn_lro;
struct lro_entry *queued;
@@ -1296,12 +1291,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;
@@ -1606,7 +1600,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;
@@ -2269,6 +2263,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;
/*
@@ -2391,17 +2388,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;
@@ -2969,12 +2968,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",
@@ -2984,10 +2983,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) {
@@ -2997,11 +2995,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));
}
}
@@ -3010,36 +3007,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/10/sys/dev/hyperv/netvsc/hv_rndis.h
==============================================================================
--- stable/10/sys/dev/hyperv/netvsc/hv_rndis.h Wed Oct 12 03:08:58 2016 (r307095)
+++ stable/10/sys/dev/hyperv/netvsc/hv_rndis.h Wed Oct 12 03:18:17 2016 (r307096)
@@ -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/10/sys/dev/hyperv/netvsc/hv_rndis_filter.c
==============================================================================
--- stable/10/sys/dev/hyperv/netvsc/hv_rndis_filter.c Wed Oct 12 03:08:58 2016 (r307095)
+++ stable/10/sys/dev/hyperv/netvsc/hv_rndis_filter.c Wed Oct 12 03:18:17 2016 (r307096)
@@ -35,7 +35,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>
@@ -75,8 +77,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);
@@ -86,8 +87,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);
@@ -528,12 +529,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;
@@ -549,7 +549,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;
@@ -560,7 +560,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;
}
@@ -569,7 +569,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);
}
/*
@@ -577,7 +577,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;
@@ -600,7 +600,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:
@@ -700,7 +700,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,
RNDIS_OID_802_3_PERMANENT_ADDRESS, device->hw_mac_addr, &size));
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-src-all
mailing list