Implements softnic start and stop function.
Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
Signed-off-by: Jasvinder Singh <jasvinder.singh@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(-)
@@ -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
@@ -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);
@@ -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)
@@ -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)