svn commit: r304205 - head/sys/dev/hyperv/netvsc
Sepherosa Ziehau
sephe at FreeBSD.org
Tue Aug 16 07:37:03 UTC 2016
Author: sephe
Date: Tue Aug 16 07:37:02 2016
New Revision: 304205
URL: https://svnweb.freebsd.org/changeset/base/304205
Log:
hyperv/hn: Simplify RNDIS NVS message sending.
MFC after: 1 week
Sponsored by: Microsoft
Differential Revision: https://reviews.freebsd.org/D7501
Modified:
head/sys/dev/hyperv/netvsc/hv_net_vsc.c
head/sys/dev/hyperv/netvsc/hv_net_vsc.h
head/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c
head/sys/dev/hyperv/netvsc/hv_rndis_filter.c
head/sys/dev/hyperv/netvsc/if_hnreg.h
head/sys/dev/hyperv/netvsc/if_hnvar.h
Modified: head/sys/dev/hyperv/netvsc/hv_net_vsc.c
==============================================================================
--- head/sys/dev/hyperv/netvsc/hv_net_vsc.c Tue Aug 16 07:26:53 2016 (r304204)
+++ head/sys/dev/hyperv/netvsc/hv_net_vsc.c Tue Aug 16 07:37:02 2016 (r304205)
@@ -118,7 +118,7 @@ hv_nv_get_next_send_section(netvsc_dev *
unsigned long bitsmap_words = net_dev->bitsmap_words;
unsigned long *bitsmap = net_dev->send_section_bitsmap;
unsigned long idx;
- int ret = NVSP_1_CHIMNEY_SEND_INVALID_SECTION_INDEX;
+ int ret = HN_NVS_CHIM_IDX_INVALID;
int i;
for (i = 0; i < bitsmap_words; i++) {
@@ -814,32 +814,23 @@ hv_nv_on_send_completion(netvsc_dev *net
* Returns 0 on success, non-zero on failure.
*/
int
-hv_nv_on_send(struct vmbus_channel *chan, bool is_data_pkt,
+hv_nv_on_send(struct vmbus_channel *chan, uint32_t rndis_mtype,
struct hn_send_ctx *sndc, struct vmbus_gpa *gpa, int gpa_cnt)
{
- nvsp_msg send_msg;
+ struct hn_nvs_rndis rndis;
int ret;
- send_msg.hdr.msg_type = nvsp_msg_1_type_send_rndis_pkt;
- if (is_data_pkt) {
- /* 0 is RMC_DATA */
- send_msg.msgs.vers_1_msgs.send_rndis_pkt.chan_type = 0;
- } else {
- /* 1 is RMC_CONTROL */
- send_msg.msgs.vers_1_msgs.send_rndis_pkt.chan_type = 1;
- }
-
- send_msg.msgs.vers_1_msgs.send_rndis_pkt.send_buf_section_idx =
- sndc->hn_chim_idx;
- send_msg.msgs.vers_1_msgs.send_rndis_pkt.send_buf_section_size =
- sndc->hn_chim_sz;
+ rndis.nvs_type = HN_NVS_TYPE_RNDIS;
+ rndis.nvs_rndis_mtype = rndis_mtype;
+ rndis.nvs_chim_idx = sndc->hn_chim_idx;
+ rndis.nvs_chim_sz = sndc->hn_chim_sz;
if (gpa_cnt) {
ret = hn_nvs_send_sglist(chan, gpa, gpa_cnt,
- &send_msg, sizeof(nvsp_msg), sndc);
+ &rndis, sizeof(rndis), sndc);
} else {
ret = hn_nvs_send(chan, VMBUS_CHANPKT_FLAG_RC,
- &send_msg, sizeof(nvsp_msg), sndc);
+ &rndis, sizeof(rndis), sndc);
}
return (ret);
Modified: head/sys/dev/hyperv/netvsc/hv_net_vsc.h
==============================================================================
--- head/sys/dev/hyperv/netvsc/hv_net_vsc.h Tue Aug 16 07:26:53 2016 (r304204)
+++ head/sys/dev/hyperv/netvsc/hv_net_vsc.h Tue Aug 16 07:37:02 2016 (r304205)
@@ -1256,7 +1256,7 @@ netvsc_dev *hv_nv_on_device_add(struct h
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 vmbus_channel *chan, bool is_data_pkt,
+int hv_nv_on_send(struct vmbus_channel *chan, uint32_t rndis_mtype,
struct hn_send_ctx *sndc, struct vmbus_gpa *gpa, int gpa_cnt);
int hv_nv_get_next_send_section(netvsc_dev *net_dev);
void hv_nv_subchan_attach(struct vmbus_channel *chan,
Modified: head/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c
==============================================================================
--- head/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c Tue Aug 16 07:26:53 2016 (r304204)
+++ head/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c Tue Aug 16 07:37:02 2016 (r304205)
@@ -798,7 +798,7 @@ hn_tx_done(struct hn_send_ctx *sndc, str
struct hn_txdesc *txd = sndc->hn_cbarg;
struct hn_tx_ring *txr;
- if (sndc->hn_chim_idx != NVSP_1_CHIMNEY_SEND_INVALID_SECTION_INDEX)
+ if (sndc->hn_chim_idx != HN_NVS_CHIM_IDX_INVALID)
hn_chim_free(net_dev, sndc->hn_chim_idx);
txr = txd->txr;
@@ -988,8 +988,7 @@ hn_encap(struct hn_tx_ring *txr, struct
txr->hn_tx_chimney_tried++;
send_buf_section_idx =
hv_nv_get_next_send_section(net_dev);
- if (send_buf_section_idx !=
- NVSP_1_CHIMNEY_SEND_INVALID_SECTION_INDEX) {
+ if (send_buf_section_idx != HN_NVS_CHIM_IDX_INVALID) {
uint8_t *dest = ((uint8_t *)net_dev->send_buf +
(send_buf_section_idx *
net_dev->send_section_size));
@@ -1045,7 +1044,7 @@ hn_encap(struct hn_tx_ring *txr, struct
gpa->gpa_len = segs[i].ds_len;
}
- send_buf_section_idx = NVSP_1_CHIMNEY_SEND_INVALID_SECTION_INDEX;
+ send_buf_section_idx = HN_NVS_CHIM_IDX_INVALID;
send_buf_section_size = 0;
done:
txd->m = m_head;
@@ -1072,8 +1071,8 @@ again:
* Make sure that txd is not freed before ETHER_BPF_MTAP.
*/
hn_txdesc_hold(txd);
- error = hv_nv_on_send(txr->hn_chan, true, &txd->send_ctx,
- txr->hn_gpa, txr->hn_gpa_cnt);
+ error = hv_nv_on_send(txr->hn_chan, HN_NVS_RNDIS_MTYPE_DATA,
+ &txd->send_ctx, txr->hn_gpa, txr->hn_gpa_cnt);
if (!error) {
ETHER_BPF_MTAP(ifp, txd->m);
if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
Modified: head/sys/dev/hyperv/netvsc/hv_rndis_filter.c
==============================================================================
--- head/sys/dev/hyperv/netvsc/hv_rndis_filter.c Tue Aug 16 07:26:53 2016 (r304204)
+++ head/sys/dev/hyperv/netvsc/hv_rndis_filter.c Tue Aug 16 07:37:02 2016 (r304205)
@@ -277,8 +277,7 @@ hv_rf_send_request(rndis_device *device,
if (tot_data_buf_len < net_dev->send_section_size) {
send_buf_section_idx = hv_nv_get_next_send_section(net_dev);
- if (send_buf_section_idx !=
- NVSP_1_CHIMNEY_SEND_INVALID_SECTION_INDEX) {
+ if (send_buf_section_idx != HN_NVS_CHIM_IDX_INVALID) {
char *dest = ((char *)net_dev->send_buf +
send_buf_section_idx * net_dev->send_section_size);
@@ -289,14 +288,14 @@ hv_rf_send_request(rndis_device *device,
}
/* Failed to allocate chimney send buffer; move on */
}
- send_buf_section_idx = NVSP_1_CHIMNEY_SEND_INVALID_SECTION_INDEX;
+ send_buf_section_idx = HN_NVS_CHIM_IDX_INVALID;
send_buf_section_size = 0;
sendit:
hn_send_ctx_init(&request->send_ctx, cb, request,
send_buf_section_idx, send_buf_section_size);
- return hv_nv_on_send(device->net_dev->sc->hn_prichan, false,
- &request->send_ctx, gpa, gpa_cnt);
+ return hv_nv_on_send(device->net_dev->sc->hn_prichan,
+ HN_NVS_RNDIS_MTYPE_CTRL, &request->send_ctx, gpa, gpa_cnt);
}
/*
@@ -1276,7 +1275,7 @@ hn_rndis_sent_cb(struct hn_send_ctx *snd
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)
+ if (sndc->hn_chim_idx != HN_NVS_CHIM_IDX_INVALID)
hn_chim_free(net_dev, sndc->hn_chim_idx);
}
@@ -1287,7 +1286,7 @@ hn_rndis_sent_halt(struct hn_send_ctx *s
{
rndis_request *request = sndc->hn_cbarg;
- if (sndc->hn_chim_idx != NVSP_1_CHIMNEY_SEND_INVALID_SECTION_INDEX)
+ if (sndc->hn_chim_idx != HN_NVS_CHIM_IDX_INVALID)
hn_chim_free(net_dev, sndc->hn_chim_idx);
/*
Modified: head/sys/dev/hyperv/netvsc/if_hnreg.h
==============================================================================
--- head/sys/dev/hyperv/netvsc/if_hnreg.h Tue Aug 16 07:26:53 2016 (r304204)
+++ head/sys/dev/hyperv/netvsc/if_hnreg.h Tue Aug 16 07:37:02 2016 (r304205)
@@ -35,8 +35,19 @@
#define HN_NVS_RXBUF_SIG 0xcafe
#define HN_NVS_CHIM_SIG 0xface
+#define HN_NVS_CHIM_IDX_INVALID 0xffffffff
+
+#define HN_NVS_RNDIS_MTYPE_DATA 0
+#define HN_NVS_RNDIS_MTYPE_CTRL 1
+
+/*
+ * NVS message transacion status codes.
+ */
#define HN_NVS_STATUS_OK 1
+/*
+ * NVS request/response message types.
+ */
#define HN_NVS_TYPE_INIT 1
#define HN_NVS_TYPE_INIT_RESP 2
#define HN_NVS_TYPE_NDIS_INIT 100
@@ -46,6 +57,7 @@
#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_RNDIS 107
#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 */
@@ -162,4 +174,21 @@ struct hn_nvs_subch_resp {
uint32_t nvs_nsubch;
} __packed;
+struct hn_nvs_rndis {
+ uint32_t nvs_type; /* HN_NVS_TYPE_RNDIS */
+ uint32_t nvs_rndis_mtype;/* HN_NVS_RNDIS_MTYPE_ */
+ /*
+ * Chimney sending buffer index and size.
+ *
+ * NOTE:
+ * If nvs_chim_idx is set to HN_NVS_CHIM_IDX_INVALID
+ * and nvs_chim_sz is set to 0, then chimney sending
+ * buffer is _not_ used by this RNDIS message.
+ */
+ uint32_t nvs_chim_idx;
+ uint32_t nvs_chim_sz;
+ uint8_t nvs_rsvd[16];
+} __packed;
+CTASSERT(sizeof(struct hn_nvs_rndis) >= HN_NVS_REQSIZE_MIN);
+
#endif /* !_IF_HNREG_H_ */
Modified: head/sys/dev/hyperv/netvsc/if_hnvar.h
==============================================================================
--- head/sys/dev/hyperv/netvsc/if_hnvar.h Tue Aug 16 07:26:53 2016 (r304204)
+++ head/sys/dev/hyperv/netvsc/if_hnvar.h Tue Aug 16 07:37:02 2016 (r304205)
@@ -32,7 +32,7 @@
#include <sys/param.h>
#include <dev/hyperv/include/vmbus.h>
-#include <dev/hyperv/netvsc/hv_net_vsc.h>
+#include <dev/hyperv/netvsc/if_hnreg.h>
struct netvsc_dev_;
struct nvsp_msg_;
@@ -51,12 +51,12 @@ struct hn_send_ctx {
int hn_chim_sz;
};
-#define HN_SEND_CTX_INITIALIZER(cb, cbarg) \
-{ \
- .hn_cb = cb, \
- .hn_cbarg = cbarg, \
- .hn_chim_idx = NVSP_1_CHIMNEY_SEND_INVALID_SECTION_INDEX, \
- .hn_chim_sz = 0 \
+#define HN_SEND_CTX_INITIALIZER(cb, cbarg) \
+{ \
+ .hn_cb = cb, \
+ .hn_cbarg = cbarg, \
+ .hn_chim_idx = HN_NVS_CHIM_IDX_INVALID, \
+ .hn_chim_sz = 0 \
}
static __inline void
@@ -75,8 +75,7 @@ hn_send_ctx_init_simple(struct hn_send_c
void *cbarg)
{
- hn_send_ctx_init(sndc, cb, cbarg,
- NVSP_1_CHIMNEY_SEND_INVALID_SECTION_INDEX, 0);
+ hn_send_ctx_init(sndc, cb, cbarg, HN_NVS_CHIM_IDX_INVALID, 0);
}
static __inline int
More information about the svn-src-head
mailing list