This patch depends on the Port Hotplug Framework.
It implements the eth_dev_uninit_t() function for virtio pmd.

Signed-off-by: Bernard Iremonger <bernard.iremonger at intel.com>
---
 lib/librte_pmd_virtio/virtio_ethdev.c |   39 ++++++++++++++++++++++++++++++++-
 1 files changed, 38 insertions(+), 1 deletions(-)

diff --git a/lib/librte_pmd_virtio/virtio_ethdev.c 
b/lib/librte_pmd_virtio/virtio_ethdev.c
index e63dbfb..3c4691f 100644
--- a/lib/librte_pmd_virtio/virtio_ethdev.c
+++ b/lib/librte_pmd_virtio/virtio_ethdev.c
@@ -1,7 +1,7 @@
 /*-
  *   BSD LICENSE
  *
- *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
+ *   Copyright(c) 2010-2015 Intel Corporation. All rights reserved.
  *   All rights reserved.
  *
  *   Redistribution and use in source and binary forms, with or without
@@ -63,6 +63,7 @@


 static int eth_virtio_dev_init(struct rte_eth_dev *eth_dev);
+static int eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev);
 static int  virtio_dev_configure(struct rte_eth_dev *dev);
 static int  virtio_dev_start(struct rte_eth_dev *dev);
 static void virtio_dev_stop(struct rte_eth_dev *dev);
@@ -1237,12 +1238,48 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev)
        return 0;
 }

+
+
+static int
+eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev)
+{
+       struct rte_pci_device *pci_dev;
+       struct virtio_hw *hw = eth_dev->data->dev_private;
+
+       if (rte_eal_process_type() == RTE_PROC_SECONDARY)
+               return -EPERM;
+
+       if (hw->started == 1) {
+               virtio_dev_stop(eth_dev);
+               virtio_dev_close(eth_dev);
+       }
+       pci_dev = eth_dev->pci_dev;
+
+       eth_dev->dev_ops = NULL;
+       eth_dev->tx_pkt_burst = NULL;
+       eth_dev->rx_pkt_burst = NULL;
+
+       /* Allocate memory for storing MAC addresses */
+       rte_free(eth_dev->data->mac_addrs);
+       eth_dev->data->mac_addrs = NULL;
+
+       /* reset interrupt callback  */
+       if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
+               rte_intr_callback_unregister(&pci_dev->intr_handle,
+                                  virtio_interrupt_handler, eth_dev);
+
+       return 0;
+}
+
+
 static struct eth_driver rte_virtio_pmd = {
        {
                .name = "rte_virtio_pmd",
                .id_table = pci_id_virtio_map,
+               .drv_flags = RTE_PCI_DRV_DETACHABLE,
        },
        .eth_dev_init = eth_virtio_dev_init,
+       .eth_dev_uninit = eth_virtio_dev_uninit,
        .dev_private_size = sizeof(struct virtio_hw),
 };

-- 
1.7.4.1

Reply via email to