svn commit: r304593 - head/sys/dev/hyperv/netvsc
Sepherosa Ziehau
sephe at FreeBSD.org
Mon Aug 22 07:44:12 UTC 2016
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);
More information about the svn-src-head
mailing list