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
_______________________________________________
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