From owner-svn-src-all@freebsd.org Mon Aug 22 07:44:12 2016 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id C89E4BC1608; Mon, 22 Aug 2016 07:44:12 +0000 (UTC) (envelope-from sephe@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id A305E19AD; Mon, 22 Aug 2016 07:44:12 +0000 (UTC) (envelope-from sephe@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id u7M7iBfx013537; Mon, 22 Aug 2016 07:44:11 GMT (envelope-from sephe@FreeBSD.org) Received: (from sephe@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id u7M7iBMU013533; Mon, 22 Aug 2016 07:44:11 GMT (envelope-from sephe@FreeBSD.org) Message-Id: <201608220744.u7M7iBMU013533@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: sephe set sender to sephe@FreeBSD.org using -f From: Sepherosa Ziehau Date: Mon, 22 Aug 2016 07:44:11 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r304593 - head/sys/dev/hyperv/netvsc X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 22 Aug 2016 07:44:12 -0000 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);