#include <rte_eal.h>
#include <rte_alarm.h>
#include <rte_ether.h>
-#include <rte_ethdev_driver.h>
-#include <rte_ethdev_pci.h>
+#include <ethdev_driver.h>
+#include <ethdev_pci.h>
#include <rte_string_fns.h>
#include <rte_malloc.h>
#include <rte_dev.h>
DEV_RX_OFFLOAD_JUMBO_FRAME | \
DEV_RX_OFFLOAD_RSS_HASH)
+int vmxnet3_segs_dynfield_offset = -1;
+
static int eth_vmxnet3_dev_init(struct rte_eth_dev *eth_dev);
static int eth_vmxnet3_dev_uninit(struct rte_eth_dev *eth_dev);
static int vmxnet3_dev_configure(struct rte_eth_dev *dev);
static int vmxnet3_dev_start(struct rte_eth_dev *dev);
-static void vmxnet3_dev_stop(struct rte_eth_dev *dev);
+static int vmxnet3_dev_stop(struct rte_eth_dev *dev);
static int vmxnet3_dev_close(struct rte_eth_dev *dev);
+static int vmxnet3_dev_reset(struct rte_eth_dev *dev);
static void vmxnet3_dev_set_rxmode(struct vmxnet3_hw *hw, uint32_t feature, int set);
static int vmxnet3_dev_promiscuous_enable(struct rte_eth_dev *dev);
static int vmxnet3_dev_promiscuous_disable(struct rte_eth_dev *dev);
.dev_start = vmxnet3_dev_start,
.dev_stop = vmxnet3_dev_stop,
.dev_close = vmxnet3_dev_close,
+ .dev_reset = vmxnet3_dev_reset,
.promiscuous_enable = vmxnet3_dev_promiscuous_enable,
.promiscuous_disable = vmxnet3_dev_promiscuous_disable,
.allmulticast_enable = vmxnet3_dev_allmulticast_enable,
struct vmxnet3_hw *hw = eth_dev->data->dev_private;
uint32_t mac_hi, mac_lo, ver;
struct rte_eth_link link;
+ static const struct rte_mbuf_dynfield vmxnet3_segs_dynfield_desc = {
+ .name = VMXNET3_SEGS_DYNFIELD_NAME,
+ .size = sizeof(vmxnet3_segs_dynfield_t),
+ .align = __alignof__(vmxnet3_segs_dynfield_t),
+ };
PMD_INIT_FUNC_TRACE();
eth_dev->tx_pkt_prepare = vmxnet3_prep_pkts;
pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
+ /* extra mbuf field is required to guess MSS */
+ vmxnet3_segs_dynfield_offset =
+ rte_mbuf_dynfield_register(&vmxnet3_segs_dynfield_desc);
+ if (vmxnet3_segs_dynfield_offset < 0) {
+ PMD_INIT_LOG(ERR, "Cannot register mbuf field.");
+ return -rte_errno;
+ }
+
/*
* for secondary processes, we don't initialize any further as primary
* has already done this work.
return 0;
rte_eth_copy_pci_info(eth_dev, pci_dev);
+ eth_dev->data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS;
/* Vendor and Device ID need to be set before init of shared code */
hw->device_id = pci_dev->id.device_id;
return -EBUSY;
}
- eth_dev->dev_ops = NULL;
- eth_dev->rx_pkt_burst = NULL;
- eth_dev->tx_pkt_burst = NULL;
- eth_dev->tx_pkt_prepare = NULL;
-
return 0;
}
/*
* Stop device: disable rx and tx functions to allow for reconfiguring.
*/
-static void
+static int
vmxnet3_dev_stop(struct rte_eth_dev *dev)
{
struct rte_eth_link link;
if (hw->adapter_stopped == 1) {
PMD_INIT_LOG(DEBUG, "Device already stopped.");
- return;
+ return 0;
}
/* disable interrupts */
rte_eth_linkstatus_set(dev, &link);
hw->adapter_stopped = 1;
+ dev->data->dev_started = 0;
+
+ return 0;
}
static void
static int
vmxnet3_dev_close(struct rte_eth_dev *dev)
{
+ int ret;
PMD_INIT_FUNC_TRACE();
+ if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+ return 0;
- vmxnet3_dev_stop(dev);
+ ret = vmxnet3_dev_stop(dev);
vmxnet3_free_queues(dev);
- return 0;
+ return ret;
+}
+
+static int
+vmxnet3_dev_reset(struct rte_eth_dev *dev)
+{
+ int ret;
+
+ ret = eth_vmxnet3_dev_uninit(dev);
+ if (ret)
+ return ret;
+ ret = eth_vmxnet3_dev_init(dev);
+ return ret;
}
static void