This is now required behavior for a PMD.
Remove the UNMAINTAINED flag.

Signed-off-by: Andrew Boyer <abo...@pensando.io>
---
 MAINTAINERS                      |  2 +-
 drivers/net/ionic/ionic_ethdev.c | 41 ++++++++++++++++----------------
 drivers/net/ionic/ionic_lif.c    | 15 ++++++++++++
 drivers/net/ionic/ionic_lif.h    |  1 +
 4 files changed, 38 insertions(+), 21 deletions(-)

diff --git a/MAINTAINERS b/MAINTAINERS
index 7bc0010f2..fc1b09923 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -840,7 +840,7 @@ F: doc/guides/nics/pfe.rst
 F: drivers/net/pfe/
 F: doc/guides/nics/features/pfe.ini
 
-Pensando ionic - UNMAINTAINED
+Pensando ionic
 M: Andrew Boyer <abo...@pensando.io>
 F: drivers/net/ionic/
 F: doc/guides/nics/ionic.rst
diff --git a/drivers/net/ionic/ionic_ethdev.c b/drivers/net/ionic/ionic_ethdev.c
index 5a360ac08..629d7068b 100644
--- a/drivers/net/ionic/ionic_ethdev.c
+++ b/drivers/net/ionic/ionic_ethdev.c
@@ -958,6 +958,8 @@ ionic_dev_stop(struct rte_eth_dev *eth_dev)
        return err;
 }
 
+static void ionic_unconfigure_intr(struct ionic_adapter *adapter);
+
 /*
  * Reset and stop device.
  */
@@ -965,6 +967,8 @@ static int
 ionic_dev_close(struct rte_eth_dev *eth_dev)
 {
        struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev);
+       struct ionic_adapter *adapter = lif->adapter;
+       uint32_t i;
        int err;
 
        IONIC_PRINT_CALL();
@@ -977,12 +981,21 @@ ionic_dev_close(struct rte_eth_dev *eth_dev)
                return -1;
        }
 
-       err = eth_ionic_dev_uninit(eth_dev);
-       if (err) {
-               IONIC_PRINT(ERR, "Cannot destroy LIF: %d", err);
-               return -1;
+       ionic_lif_free_queues(lif);
+
+       IONIC_PRINT(NOTICE, "Removing device %s", eth_dev->device->name);
+       ionic_unconfigure_intr(adapter);
+
+       for (i = 0; i < adapter->nlifs; i++) {
+               lif = adapter->lifs[i];
+               rte_eth_dev_destroy(lif->eth_dev, eth_ionic_dev_uninit);
        }
 
+       ionic_port_reset(adapter);
+       ionic_reset(adapter);
+
+       rte_free(adapter);
+
        return 0;
 }
 
@@ -1280,10 +1293,7 @@ static int
 eth_ionic_pci_remove(struct rte_pci_device *pci_dev __rte_unused)
 {
        char name[RTE_ETH_NAME_MAX_LEN];
-       struct ionic_adapter *adapter = NULL;
        struct rte_eth_dev *eth_dev;
-       struct ionic_lif *lif;
-       uint32_t i;
 
        /* Adapter lookup is using (the first) eth_dev name */
        snprintf(name, sizeof(name), "net_%s_lif_0",
@@ -1291,19 +1301,10 @@ eth_ionic_pci_remove(struct rte_pci_device *pci_dev 
__rte_unused)
 
        eth_dev = rte_eth_dev_allocated(name);
        if (eth_dev) {
-               lif = IONIC_ETH_DEV_TO_LIF(eth_dev);
-               adapter = lif->adapter;
-       }
-
-       if (adapter) {
-               ionic_unconfigure_intr(adapter);
-
-               for (i = 0; i < adapter->nlifs; i++) {
-                       lif = adapter->lifs[i];
-                       rte_eth_dev_destroy(lif->eth_dev, eth_ionic_dev_uninit);
-               }
-
-               rte_free(adapter);
+               ionic_dev_close(eth_dev);
+       } else {
+               IONIC_PRINT(WARNING, "Cannot find device %s",
+                       pci_dev->device.name);
        }
 
        return 0;
diff --git a/drivers/net/ionic/ionic_lif.c b/drivers/net/ionic/ionic_lif.c
index 875c7e585..e213597ee 100644
--- a/drivers/net/ionic/ionic_lif.c
+++ b/drivers/net/ionic/ionic_lif.c
@@ -927,6 +927,21 @@ ionic_lif_free(struct ionic_lif *lif)
        }
 }
 
+void
+ionic_lif_free_queues(struct ionic_lif *lif)
+{
+       uint32_t i;
+
+       for (i = 0; i < lif->ntxqcqs; i++) {
+               ionic_dev_tx_queue_release(lif->eth_dev->data->tx_queues[i]);
+               lif->eth_dev->data->tx_queues[i] = NULL;
+       }
+       for (i = 0; i < lif->nrxqcqs; i++) {
+               ionic_dev_rx_queue_release(lif->eth_dev->data->rx_queues[i]);
+               lif->eth_dev->data->rx_queues[i] = NULL;
+       }
+}
+
 int
 ionic_lif_rss_config(struct ionic_lif *lif,
                const uint16_t types, const uint8_t *key, const uint32_t *indir)
diff --git a/drivers/net/ionic/ionic_lif.h b/drivers/net/ionic/ionic_lif.h
index b80931c61..bf010716e 100644
--- a/drivers/net/ionic/ionic_lif.h
+++ b/drivers/net/ionic/ionic_lif.h
@@ -122,6 +122,7 @@ int ionic_lifs_size(struct ionic_adapter *ionic);
 
 int ionic_lif_alloc(struct ionic_lif *lif);
 void ionic_lif_free(struct ionic_lif *lif);
+void ionic_lif_free_queues(struct ionic_lif *lif);
 
 int ionic_lif_init(struct ionic_lif *lif);
 void ionic_lif_deinit(struct ionic_lif *lif);
-- 
2.17.1

Reply via email to