drivers/net: build i40e and mlx5 on Windows
[dpdk.git] / drivers / net / netvsc / hn_ethdev.c
index 40e6d25..49f9543 100644 (file)
                            DEV_RX_OFFLOAD_VLAN_STRIP | \
                            DEV_RX_OFFLOAD_RSS_HASH)
 
+#define NETVSC_ARG_LATENCY "latency"
+#define NETVSC_ARG_RXBREAK "rx_copybreak"
+#define NETVSC_ARG_TXBREAK "tx_copybreak"
+#define NETVSC_ARG_RX_EXTMBUF_ENABLE "rx_extmbuf_enable"
+
 struct hn_xstats_name_off {
        char name[RTE_ETH_XSTATS_NAME_SIZE];
        unsigned int offset;
@@ -136,24 +141,36 @@ eth_dev_vmbus_release(struct rte_eth_dev *eth_dev)
        eth_dev->intr_handle = NULL;
 }
 
-/* handle "latency=X" from devargs */
-static int hn_set_latency(const char *key, const char *value, void *opaque)
+static int hn_set_parameter(const char *key, const char *value, void *opaque)
 {
        struct hn_data *hv = opaque;
        char *endp = NULL;
-       unsigned long lat;
-
-       errno = 0;
-       lat = strtoul(value, &endp, 0);
+       unsigned long v;
 
+       v = strtoul(value, &endp, 0);
        if (*value == '\0' || *endp != '\0') {
                PMD_DRV_LOG(ERR, "invalid parameter %s=%s", key, value);
                return -EINVAL;
        }
 
-       PMD_DRV_LOG(DEBUG, "set latency %lu usec", lat);
+       if (!strcmp(key, NETVSC_ARG_LATENCY)) {
+               /* usec to nsec */
+               hv->latency = v * 1000;
+               PMD_DRV_LOG(DEBUG, "set latency %u usec", hv->latency);
+       } else if (!strcmp(key, NETVSC_ARG_RXBREAK)) {
+               hv->rx_copybreak = v;
+               PMD_DRV_LOG(DEBUG, "rx copy break set to %u",
+                           hv->rx_copybreak);
+       } else if (!strcmp(key, NETVSC_ARG_TXBREAK)) {
+               hv->tx_copybreak = v;
+               PMD_DRV_LOG(DEBUG, "tx copy break set to %u",
+                           hv->tx_copybreak);
+       } else if (!strcmp(key, NETVSC_ARG_RX_EXTMBUF_ENABLE)) {
+               hv->rx_extmbuf_enable = v;
+               PMD_DRV_LOG(DEBUG, "rx extmbuf enable set to %u",
+                           hv->rx_extmbuf_enable);
+       }
 
-       hv->latency = lat * 1000;       /* usec to nsec */
        return 0;
 }
 
@@ -163,7 +180,10 @@ static int hn_parse_args(const struct rte_eth_dev *dev)
        struct hn_data *hv = dev->data->dev_private;
        struct rte_devargs *devargs = dev->device->devargs;
        static const char * const valid_keys[] = {
-               "latency",
+               NETVSC_ARG_LATENCY,
+               NETVSC_ARG_RXBREAK,
+               NETVSC_ARG_TXBREAK,
+               NETVSC_ARG_RX_EXTMBUF_ENABLE,
                NULL
        };
        struct rte_kvargs *kvlist;
@@ -177,15 +197,13 @@ static int hn_parse_args(const struct rte_eth_dev *dev)
 
        kvlist = rte_kvargs_parse(devargs->args, valid_keys);
        if (!kvlist) {
-               PMD_DRV_LOG(NOTICE, "invalid parameters");
+               PMD_DRV_LOG(ERR, "invalid parameters");
                return -EINVAL;
        }
 
-       ret = rte_kvargs_process(kvlist, "latency", hn_set_latency, hv);
-       if (ret)
-               PMD_DRV_LOG(ERR, "Unable to process latency arg\n");
-
+       ret = rte_kvargs_process(kvlist, NULL, hn_set_parameter, hv);
        rte_kvargs_free(kvlist);
+
        return ret;
 }
 
@@ -827,7 +845,7 @@ hn_dev_start(struct rte_eth_dev *dev)
        return error;
 }
 
-static void
+static int
 hn_dev_stop(struct rte_eth_dev *dev)
 {
        struct hn_data *hv = dev->data->dev_private;
@@ -836,7 +854,7 @@ hn_dev_stop(struct rte_eth_dev *dev)
        dev->data->dev_started = 0;
 
        hn_rndis_set_rxfilter(hv, 0);
-       hn_vf_stop(dev);
+       return hn_vf_stop(dev);
 }
 
 static int
@@ -950,6 +968,8 @@ eth_hn_dev_init(struct rte_eth_dev *eth_dev)
        if (rte_eal_process_type() != RTE_PROC_PRIMARY)
                return 0;
 
+       eth_dev->data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS;
+
        /* Since Hyper-V only supports one MAC address */
        eth_dev->data->mac_addrs = rte_calloc("hv_mac", HN_MAX_MAC_ADDRS,
                                              sizeof(struct rte_ether_addr), 0);
@@ -964,7 +984,11 @@ eth_hn_dev_init(struct rte_eth_dev *eth_dev)
        hv->chim_res  = &vmbus->resource[HV_SEND_BUF_MAP];
        hv->port_id = eth_dev->data->port_id;
        hv->latency = HN_CHAN_LATENCY_NS;
+       hv->rx_copybreak = HN_RXCOPY_THRESHOLD;
+       hv->tx_copybreak = HN_TXCOPY_THRESHOLD;
+       hv->rx_extmbuf_enable = HN_RX_EXTMBUF_ENABLE;
        hv->max_queues = 1;
+
        rte_rwlock_init(&hv->vf_lock);
        hv->vf_port = HN_INVALID_PORT;
 
@@ -1042,14 +1066,14 @@ static int
 eth_hn_dev_uninit(struct rte_eth_dev *eth_dev)
 {
        struct hn_data *hv = eth_dev->data->dev_private;
-       int ret;
+       int ret, ret_stop;
 
        PMD_INIT_FUNC_TRACE();
 
        if (rte_eal_process_type() != RTE_PROC_PRIMARY)
                return 0;
 
-       hn_dev_stop(eth_dev);
+       ret_stop = hn_dev_stop(eth_dev);
        hn_dev_close(eth_dev);
 
        hn_detach(hv);
@@ -1060,7 +1084,7 @@ eth_hn_dev_uninit(struct rte_eth_dev *eth_dev)
        if (ret != 0)
                return ret;
 
-       return 0;
+       return ret_stop;
 }
 
 static int eth_hn_probe(struct rte_vmbus_driver *drv __rte_unused,
@@ -1120,3 +1144,8 @@ RTE_PMD_REGISTER_VMBUS(net_netvsc, rte_netvsc_pmd);
 RTE_PMD_REGISTER_KMOD_DEP(net_netvsc, "* uio_hv_generic");
 RTE_LOG_REGISTER(hn_logtype_init, pmd.net.netvsc.init, NOTICE);
 RTE_LOG_REGISTER(hn_logtype_driver, pmd.net.netvsc.driver, NOTICE);
+RTE_PMD_REGISTER_PARAM_STRING(net_netvsc,
+                             NETVSC_ARG_LATENCY "=<uint32> "
+                             NETVSC_ARG_RXBREAK "=<uint32> "
+                             NETVSC_ARG_TXBREAK "=<uint32> "
+                             NETVSC_ARG_RX_EXTMBUF_ENABLE "=<0|1>");