Implements softnic start and stop function.

Signed-off-by: Cristian Dumitrescu <cristian.dumitre...@intel.com>
Signed-off-by: Jasvinder Singh <jasvinder.si...@intel.com>
---
 drivers/net/softnic/rte_eth_softnic.c           | 38 ++++++++++++++++++-------
 drivers/net/softnic/rte_eth_softnic_internals.h |  6 ++++
 drivers/net/softnic/rte_eth_softnic_pipeline.c  | 12 ++++++++
 drivers/net/softnic/rte_eth_softnic_swq.c       | 16 +++++++++++
 4 files changed, 62 insertions(+), 10 deletions(-)

diff --git a/drivers/net/softnic/rte_eth_softnic.c 
b/drivers/net/softnic/rte_eth_softnic.c
index e91e1cb..58d63cd 100644
--- a/drivers/net/softnic/rte_eth_softnic.c
+++ b/drivers/net/softnic/rte_eth_softnic.c
@@ -142,6 +142,18 @@ pmd_tx_queue_setup(struct rte_eth_dev *dev,
 static int
 pmd_dev_start(struct rte_eth_dev *dev)
 {
+       struct pmd_internals *p = dev->data->dev_private;
+       int status;
+
+       /* Firmware UP */
+       status = cli_script_process(p,
+               p->params.script,
+               conn_params_default.msg_in_len_max,
+               conn_params_default.msg_out_len_max);
+       if (status)
+               return status;
+
+       /* Link UP */
        dev->data->dev_link.link_status = ETH_LINK_UP;
 
        return 0;
@@ -150,21 +162,27 @@ pmd_dev_start(struct rte_eth_dev *dev)
 static void
 pmd_dev_stop(struct rte_eth_dev *dev)
 {
+       struct pmd_internals *p = dev->data->dev_private;
+
+       /* Link DOWN */
        dev->data->dev_link.link_status = ETH_LINK_DOWN;
+
+       /* Firmware DOWN */
+       pipeline_disable_all(p);
+       pipeline_free(p);
+       table_action_profile_free(p);
+       port_in_action_profile_free(p);
+       tap_free(p);
+       tmgr_free(p);
+       link_free(p);
+       swq_free_keep_rxq_txq(p);
+       mempool_free(p);
 }
 
 static void
-pmd_dev_close(struct rte_eth_dev *dev)
+pmd_dev_close(struct rte_eth_dev *dev __rte_unused)
 {
-       uint32_t i;
-
-       /* RX queues */
-       for (i = 0; i < dev->data->nb_rx_queues; i++)
-               rte_ring_free((struct rte_ring *)dev->data->rx_queues[i]);
-
-       /* TX queues */
-       for (i = 0; i < dev->data->nb_tx_queues; i++)
-               rte_ring_free((struct rte_ring *)dev->data->tx_queues[i]);
+       return;
 }
 
 static int
diff --git a/drivers/net/softnic/rte_eth_softnic_internals.h 
b/drivers/net/softnic/rte_eth_softnic_internals.h
index 4d09a63..83b0c54 100644
--- a/drivers/net/softnic/rte_eth_softnic_internals.h
+++ b/drivers/net/softnic/rte_eth_softnic_internals.h
@@ -550,6 +550,9 @@ swq_init(struct pmd_internals *p);
 void
 swq_free(struct pmd_internals *p);
 
+void
+swq_free_keep_rxq_txq(struct pmd_internals *p);
+
 struct swq *
 swq_find(struct pmd_internals *p,
        const char *name);
@@ -672,6 +675,9 @@ pipeline_init(struct pmd_internals *p);
 void
 pipeline_free(struct pmd_internals *p);
 
+void
+pipeline_disable_all(struct pmd_internals *p);
+
 struct pipeline *
 pipeline_find(struct pmd_internals *p, const char *name);
 
diff --git a/drivers/net/softnic/rte_eth_softnic_pipeline.c 
b/drivers/net/softnic/rte_eth_softnic_pipeline.c
index 7382288..16fc93b 100644
--- a/drivers/net/softnic/rte_eth_softnic_pipeline.c
+++ b/drivers/net/softnic/rte_eth_softnic_pipeline.c
@@ -61,6 +61,18 @@ pipeline_free(struct pmd_internals *p)
        }
 }
 
+void
+pipeline_disable_all(struct pmd_internals *p)
+{
+       struct pipeline *pipeline;
+
+       TAILQ_FOREACH(pipeline, &p->pipeline_list, node)
+               if (pipeline->enabled)
+                       thread_pipeline_disable(p,
+                               pipeline->thread_id,
+                               pipeline->name);
+}
+
 struct pipeline *
 pipeline_find(struct pmd_internals *p,
        const char *name)
diff --git a/drivers/net/softnic/rte_eth_softnic_swq.c 
b/drivers/net/softnic/rte_eth_softnic_swq.c
index d385dd1..e53da92 100644
--- a/drivers/net/softnic/rte_eth_softnic_swq.c
+++ b/drivers/net/softnic/rte_eth_softnic_swq.c
@@ -33,6 +33,22 @@ swq_free(struct pmd_internals *p)
        }
 }
 
+void
+swq_free_keep_rxq_txq(struct pmd_internals *p)
+{
+       struct swq *swq;
+
+       TAILQ_FOREACH(swq, &p->swq_list, node) {
+               if ((strncmp(swq->name, "RXQ", strlen("RXQ")) == 0) ||
+                       (strncmp(swq->name, "TXQ", strlen("TXQ")) == 0))
+                       continue;
+
+               TAILQ_REMOVE(&p->swq_list, swq, node);
+               rte_ring_free(swq->r);
+               free(swq);
+       }
+}
+
 struct swq *
 swq_find(struct pmd_internals *p,
        const char *name)
-- 
2.9.3

Reply via email to