#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 void vmxnet3_dev_close(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);
struct rte_ether_addr *mac_addr);
static void vmxnet3_interrupt_handler(void *param);
-int vmxnet3_logtype_init;
-int vmxnet3_logtype_driver;
-
/*
* The set of PCI devices this driver supports
*/
.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;
hw->perm_addr[0], hw->perm_addr[1], hw->perm_addr[2],
hw->perm_addr[3], hw->perm_addr[4], hw->perm_addr[5]);
- /* Flag to call rte_eth_dev_release_port() in rte_eth_dev_close(). */
- eth_dev->data->dev_flags |= RTE_ETH_DEV_CLOSE_REMOVE;
-
/* Put device in Quiesce Mode */
VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_CMD, VMXNET3_CMD_QUIESCE_DEV);
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
/*
* Reset and stop device.
*/
-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 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
if (events & VMXNET3_ECR_LINK) {
PMD_DRV_LOG(DEBUG, "Process events: VMXNET3_ECR_LINK event");
if (vmxnet3_dev_link_update(dev, 0) == 0)
- _rte_eth_dev_callback_process(dev,
- RTE_ETH_EVENT_INTR_LSC,
- NULL);
+ rte_eth_dev_callback_process(dev,
+ RTE_ETH_EVENT_INTR_LSC,
+ NULL);
}
/* Check if there is an error on xmit/recv queues */
RTE_PMD_REGISTER_PCI(net_vmxnet3, rte_vmxnet3_pmd);
RTE_PMD_REGISTER_PCI_TABLE(net_vmxnet3, pci_id_vmxnet3_map);
RTE_PMD_REGISTER_KMOD_DEP(net_vmxnet3, "* igb_uio | uio_pci_generic | vfio-pci");
-
-RTE_INIT(vmxnet3_init_log)
-{
- vmxnet3_logtype_init = rte_log_register("pmd.net.vmxnet3.init");
- if (vmxnet3_logtype_init >= 0)
- rte_log_set_level(vmxnet3_logtype_init, RTE_LOG_NOTICE);
- vmxnet3_logtype_driver = rte_log_register("pmd.net.vmxnet3.driver");
- if (vmxnet3_logtype_driver >= 0)
- rte_log_set_level(vmxnet3_logtype_driver, RTE_LOG_NOTICE);
-}
+RTE_LOG_REGISTER(vmxnet3_logtype_init, pmd.net.vmxnet3.init, NOTICE);
+RTE_LOG_REGISTER(vmxnet3_logtype_driver, pmd.net.vmxnet3.driver, NOTICE);