Author: sephe
Date: Mon Aug 22 07:44:11 2016
New Revision: 304593
URL: https://svnweb.freebsd.org/changeset/base/304593

Log:
  hyperv/hn: Get rid of netvsc_dev
  
  MFC after:    1 week
  Sponsored by: Microsoft
  Differential Revision:        https://reviews.freebsd.org/D7575

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_rndis_filter.c
  head/sys/dev/hyperv/netvsc/hv_rndis_filter.h

Modified: head/sys/dev/hyperv/netvsc/hv_net_vsc.c
==============================================================================
--- head/sys/dev/hyperv/netvsc/hv_net_vsc.c     Mon Aug 22 07:38:44 2016        
(r304592)
+++ head/sys/dev/hyperv/netvsc/hv_net_vsc.c     Mon Aug 22 07:44:11 2016        
(r304593)
@@ -68,7 +68,7 @@ static void hv_nv_on_send_completion(str
     struct vmbus_channel *, const struct vmbus_chanpkt_hdr *pkt);
 static void hv_nv_on_receive_completion(struct vmbus_channel *chan,
     uint64_t tid);
-static void hv_nv_on_receive(netvsc_dev *net_dev,
+static void hv_nv_on_receive(struct hn_softc *sc,
     struct hn_rx_ring *rxr, struct vmbus_channel *chan,
     const struct vmbus_chanpkt_hdr *pkt);
 static void hn_nvs_sent_none(struct hn_send_ctx *sndc,
@@ -78,40 +78,6 @@ static void hn_nvs_sent_none(struct hn_s
 static struct hn_send_ctx      hn_send_ctx_none =
     HN_SEND_CTX_INITIALIZER(hn_nvs_sent_none, NULL);
 
-/*
- *
- */
-static inline netvsc_dev *
-hv_nv_alloc_net_device(struct hn_softc *sc)
-{
-       netvsc_dev *net_dev;
-
-       net_dev = malloc(sizeof(netvsc_dev), M_NETVSC, M_WAITOK | M_ZERO);
-
-       net_dev->sc = sc;
-       sc->net_dev = net_dev;
-
-       return (net_dev);
-}
-
-/*
- * XXX unnecessary; nuke it.
- */
-static inline netvsc_dev *
-hv_nv_get_outbound_net_device(struct hn_softc *sc)
-{
-       return sc->net_dev;
-}
-
-/*
- * XXX unnecessary; nuke it.
- */
-static inline netvsc_dev *
-hv_nv_get_inbound_net_device(struct hn_softc *sc)
-{
-       return sc->net_dev;
-}
-
 uint32_t
 hn_chim_alloc(struct hn_softc *sc)
 {
@@ -451,8 +417,7 @@ hv_nv_destroy_send_buffer(struct hn_soft
 }
 
 static int
-hv_nv_negotiate_nvsp_protocol(struct hn_softc *sc, netvsc_dev *net_dev,
-    uint32_t nvs_ver)
+hv_nv_negotiate_nvsp_protocol(struct hn_softc *sc, uint32_t nvs_ver)
 {
        struct hn_send_ctx sndc;
        struct vmbus_xact *xact;
@@ -540,7 +505,6 @@ hv_nv_send_ndis_config(struct hn_softc *
 static int
 hv_nv_connect_to_vsp(struct hn_softc *sc)
 {
-       netvsc_dev *net_dev;
        uint32_t protocol_list[] = { NVSP_PROTOCOL_VERSION_1,
            NVSP_PROTOCOL_VERSION_2,
            NVSP_PROTOCOL_VERSION_4,
@@ -553,14 +517,11 @@ hv_nv_connect_to_vsp(struct hn_softc *sc
        struct hn_nvs_ndis_init ndis;
        int rxbuf_size;
 
-       net_dev = hv_nv_get_outbound_net_device(sc);
-
        /*
         * Negotiate the NVSP version.  Try the latest NVSP first.
         */
        for (i = protocol_number - 1; i >= 0; i--) {
-               if (hv_nv_negotiate_nvsp_protocol(sc, net_dev,
-                   protocol_list[i]) == 0) {
+               if (hv_nv_negotiate_nvsp_protocol(sc, protocol_list[i]) == 0) {
                        sc->hn_nvs_ver = protocol_list[i];
                        if (bootverbose) {
                                device_printf(dev, "NVS version 0x%x\n",
@@ -644,20 +605,12 @@ hv_nv_subchan_attach(struct vmbus_channe
  * 
  * Callback when the device belonging to this driver is added
  */
-netvsc_dev *
-hv_nv_on_device_add(struct hn_softc *sc, void *additional_info,
-    struct hn_rx_ring *rxr)
+int
+hv_nv_on_device_add(struct hn_softc *sc, struct hn_rx_ring *rxr)
 {
        struct vmbus_channel *chan = sc->hn_prichan;
-       netvsc_dev *net_dev;
        int ret = 0;
 
-       net_dev = hv_nv_alloc_net_device(sc);
-       if (net_dev == NULL)
-               return NULL;
-
-       /* Initialize the NetVSC channel extension */
-
        /*
         * Open the channel
         */
@@ -677,20 +630,13 @@ hv_nv_on_device_add(struct hn_softc *sc,
        if (ret != 0)
                goto close;
 
-       return (net_dev);
+       return (0);
 
 close:
        /* Now, we can close the channel safely */
        vmbus_chan_close(chan);
-
 cleanup:
-       /*
-        * Free the packet buffers on the netvsc device packet queue.
-        * Release other resources.
-        */
-       free(net_dev, M_NETVSC);
-
-       return (NULL);
+       return (ret);
 }
 
 /*
@@ -706,8 +652,6 @@ hv_nv_on_device_remove(struct hn_softc *
 
        vmbus_chan_close(sc->hn_prichan);
 
-       free(sc->net_dev, M_NETVSC);
-
        return (0);
 }
 
@@ -801,7 +745,7 @@ hv_nv_on_send(struct vmbus_channel *chan
  * with virtual addresses.
  */
 static void
-hv_nv_on_receive(netvsc_dev *net_dev, struct hn_rx_ring *rxr,
+hv_nv_on_receive(struct hn_softc *sc, struct hn_rx_ring *rxr,
     struct vmbus_channel *chan, const struct vmbus_chanpkt_hdr *pkthdr)
 {
        const struct vmbus_chanpkt_rxbuf *pkt;
@@ -829,7 +773,7 @@ hv_nv_on_receive(netvsc_dev *net_dev, st
 
        /* Each range represents 1 RNDIS pkt that contains 1 Ethernet frame */
        for (i = 0; i < count; i++) {
-               hv_rf_on_receive(net_dev, rxr,
+               hv_rf_on_receive(sc, rxr,
                    rxr->hn_rxbuf + pkt->cp_rxbuf[i].rb_ofs,
                    pkt->cp_rxbuf[i].rb_len);
        }
@@ -896,14 +840,9 @@ hv_nv_on_channel_callback(struct vmbus_c
 {
        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;
 
-       net_dev = hv_nv_get_inbound_net_device(sc);
-       if (net_dev == NULL)
-               return;
-
        buffer = rxr->hn_rdbuf;
        do {
                struct vmbus_chanpkt_hdr *pkt = buffer;
@@ -919,7 +858,7 @@ hv_nv_on_channel_callback(struct vmbus_c
                                        hv_nv_on_send_completion(sc, chan, pkt);
                                        break;
                                case VMBUS_CHANPKT_TYPE_RXBUF:
-                                       hv_nv_on_receive(net_dev, rxr, chan, 
pkt);
+                                       hv_nv_on_receive(sc, rxr, chan, pkt);
                                        break;
                                case VMBUS_CHANPKT_TYPE_INBAND:
                                        hn_proc_notify(sc, pkt);

Modified: head/sys/dev/hyperv/netvsc/hv_net_vsc.h
==============================================================================
--- head/sys/dev/hyperv/netvsc/hv_net_vsc.h     Mon Aug 22 07:38:44 2016        
(r304592)
+++ head/sys/dev/hyperv/netvsc/hv_net_vsc.h     Mon Aug 22 07:44:11 2016        
(r304593)
@@ -212,15 +212,6 @@ typedef struct rndis_recv_scale_param_ {
  * Data types
  */
 
-/*
- * Per netvsc channel-specific
- */
-typedef struct netvsc_dev_ {
-       struct hn_softc                         *sc;
-       /* Holds rndis device info */
-       void                                    *extension;
-} netvsc_dev;
-
 struct vmbus_channel;
 
 typedef void (*pfn_on_send_rx_completion)(struct vmbus_channel *, void *);
@@ -353,7 +344,7 @@ typedef struct hn_softc {
        int             hn_initdone;
        /* See hv_netvsc_drv_freebsd.c for rules on how to use */
        int             temp_unusable;
-       netvsc_dev      *net_dev;
+       struct rndis_device_ *rndis_dev;
        struct vmbus_channel *hn_prichan;
 
        int             hn_rx_ring_cnt;
@@ -396,8 +387,7 @@ extern int hv_promisc_mode;
 struct hn_send_ctx;
 
 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, struct hn_rx_ring *rxr);
+int hv_nv_on_device_add(struct hn_softc *sc, 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, uint32_t rndis_mtype,

Modified: head/sys/dev/hyperv/netvsc/hv_rndis_filter.c
==============================================================================
--- head/sys/dev/hyperv/netvsc/hv_rndis_filter.c        Mon Aug 22 07:38:44 
2016        (r304592)
+++ head/sys/dev/hyperv/netvsc/hv_rndis_filter.c        Mon Aug 22 07:44:11 
2016        (r304593)
@@ -240,7 +240,7 @@ static int
 hv_rf_send_request(rndis_device *device, rndis_request *request,
     uint32_t message_type)
 {
-       struct hn_softc *sc = device->net_dev->sc;
+       struct hn_softc *sc = device->sc;
        uint32_t send_buf_section_idx, tot_data_buf_len;
        struct vmbus_gpa gpa[2];
        int gpa_cnt, send_buf_section_size;
@@ -346,9 +346,8 @@ hv_rf_send_offload_request(struct hn_sof
        rndis_set_request *set;
        rndis_offload_params *offload_req;
        rndis_set_complete *set_complete;       
-       rndis_device *rndis_dev;
+       rndis_device *rndis_dev = sc->rndis_dev;
        device_t dev = sc->hn_dev;
-       netvsc_dev *net_dev = sc->net_dev;
        uint32_t extlen = sizeof(rndis_offload_params);
        int ret;
 
@@ -361,8 +360,6 @@ hv_rf_send_offload_request(struct hn_sof
                offloads->udp_ipv6_csum = 0;
        }
 
-       rndis_dev = net_dev->extension;
-
        request = hv_rndis_request(rndis_dev, REMOTE_NDIS_SET_MSG,
            RNDIS_MESSAGE_SIZE(rndis_set_request) + extlen);
        if (!request)
@@ -423,14 +420,14 @@ hv_rf_receive_indicate_status(rndis_devi
                
        switch(indicate->status) {
        case RNDIS_STATUS_MEDIA_CONNECT:
-               netvsc_linkstatus_callback(device->net_dev->sc, 1);
+               netvsc_linkstatus_callback(device->sc, 1);
                break;
        case RNDIS_STATUS_MEDIA_DISCONNECT:
-               netvsc_linkstatus_callback(device->net_dev->sc, 0);
+               netvsc_linkstatus_callback(device->sc, 0);
                break;
        default:
                /* TODO: */
-               device_printf(device->net_dev->sc->hn_dev,
+               device_printf(device->sc->hn_dev,
                    "unknown status %d received\n", indicate->status);
                break;
        }
@@ -557,17 +554,13 @@ hv_rf_receive_data(struct hn_rx_ring *rx
  * RNDIS filter on receive
  */
 int
-hv_rf_on_receive(netvsc_dev *net_dev,
-    struct hn_rx_ring *rxr, const void *data, int dlen)
+hv_rf_on_receive(struct hn_softc *sc, struct hn_rx_ring *rxr,
+    const void *data, int dlen)
 {
        rndis_device *rndis_dev;
        const rndis_msg *rndis_hdr;
 
-       /* Make sure the rndis device state is initialized */
-       if (net_dev->extension == NULL)
-               return (ENODEV);
-
-       rndis_dev = (rndis_device *)net_dev->extension;
+       rndis_dev = sc->rndis_dev;
        if (rndis_dev->state == RNDIS_DEV_UNINITIALIZED)
                return (EINVAL);
 
@@ -1039,7 +1032,6 @@ hv_rf_on_device_add(struct hn_softc *sc,
 {
        struct hn_send_ctx sndc;
        int ret;
-       netvsc_dev *net_dev;
        rndis_device *rndis_dev;
        rndis_offload_params offloads;
        struct rndis_recv_scale_cap rsscaps;
@@ -1057,6 +1049,8 @@ hv_rf_on_device_add(struct hn_softc *sc,
        if (rndis_dev == NULL) {
                return (ENOMEM);
        }
+       sc->rndis_dev = rndis_dev;
+       rndis_dev->sc = sc;
 
        /*
         * Let the inner driver handle this first to create the netvsc channel
@@ -1064,20 +1058,16 @@ hv_rf_on_device_add(struct hn_softc *sc,
         * (hv_rf_on_receive()) before this call is completed.
         * Note:  Earlier code used a function pointer here.
         */
-       net_dev = hv_nv_on_device_add(sc, additl_info, rxr);
-       if (!net_dev) {
+       ret = hv_nv_on_device_add(sc, rxr);
+       if (ret != 0) {
                hv_put_rndis_device(rndis_dev);
-
-               return (ENOMEM);
+               return (ret);
        }
 
        /*
         * Initialize the rndis device
         */
 
-       net_dev->extension = rndis_dev;
-       rndis_dev->net_dev = net_dev;
-
        /* Send the rndis initialization message */
        ret = hv_rf_init_device(rndis_dev);
        if (ret != 0) {
@@ -1208,15 +1198,14 @@ out:
 int
 hv_rf_on_device_remove(struct hn_softc *sc, boolean_t destroy_channel)
 {
-       netvsc_dev *net_dev = sc->net_dev;
-       rndis_device *rndis_dev = (rndis_device *)net_dev->extension;
+       rndis_device *rndis_dev = sc->rndis_dev;
        int ret;
 
        /* Halt and release the rndis device */
        ret = hv_rf_halt_device(rndis_dev);
 
+       sc->rndis_dev = NULL;
        hv_put_rndis_device(rndis_dev);
-       net_dev->extension = NULL;
 
        /* Pass control to inner driver to remove the device */
        ret |= hv_nv_on_device_remove(sc, destroy_channel);
@@ -1230,9 +1219,8 @@ hv_rf_on_device_remove(struct hn_softc *
 int
 hv_rf_on_open(struct hn_softc *sc)
 {
-       netvsc_dev *net_dev = sc->net_dev;
 
-       return (hv_rf_open_device((rndis_device *)net_dev->extension));
+       return (hv_rf_open_device(sc->rndis_dev));
 }
 
 /*
@@ -1241,9 +1229,8 @@ hv_rf_on_open(struct hn_softc *sc)
 int 
 hv_rf_on_close(struct hn_softc *sc)
 {
-       netvsc_dev *net_dev = sc->net_dev;
 
-       return (hv_rf_close_device((rndis_device *)net_dev->extension));
+       return (hv_rf_close_device(sc->rndis_dev));
 }
 
 static void

Modified: head/sys/dev/hyperv/netvsc/hv_rndis_filter.h
==============================================================================
--- head/sys/dev/hyperv/netvsc/hv_rndis_filter.h        Mon Aug 22 07:38:44 
2016        (r304592)
+++ head/sys/dev/hyperv/netvsc/hv_rndis_filter.h        Mon Aug 22 07:44:11 
2016        (r304593)
@@ -96,7 +96,7 @@ typedef struct rndis_request_ {
 } rndis_request;
 
 typedef struct rndis_device_ {
-       netvsc_dev                      *net_dev;
+       struct hn_softc                 *sc;
 
        rndis_device_state              state;
        uint32_t                        link_status;
@@ -112,12 +112,10 @@ typedef struct rndis_device_ {
 /*
  * Externs
  */
-struct hn_softc;
 struct hn_rx_ring;
 
-int hv_rf_on_receive(netvsc_dev *net_dev, struct hn_rx_ring *rxr,
+int hv_rf_on_receive(struct hn_softc *sc, struct hn_rx_ring *rxr,
     const void *data, int dlen);
-void hv_rf_receive_rollup(netvsc_dev *net_dev);
 void hv_rf_channel_rollup(struct hn_rx_ring *rxr, struct hn_tx_ring *txr);
 int hv_rf_on_device_add(struct hn_softc *sc, void *additl_info, int *nchan,
     struct hn_rx_ring *rxr);
_______________________________________________
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