net/thunderx: support Tx queue start and stop
authorJerin Jacob <jerin.jacob@caviumnetworks.com>
Fri, 17 Jun 2016 13:29:51 +0000 (18:59 +0530)
committerBruce Richardson <bruce.richardson@intel.com>
Mon, 20 Jun 2016 15:21:55 +0000 (17:21 +0200)
Signed-off-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>
Signed-off-by: Maciej Czekaj <maciej.czekaj@caviumnetworks.com>
Signed-off-by: Kamil Rytarowski <kamil.rytarowski@caviumnetworks.com>
Signed-off-by: Zyta Szpak <zyta.szpak@semihalf.com>
Signed-off-by: Slawomir Rosek <slawomir.rosek@semihalf.com>
Signed-off-by: Radoslaw Biernacki <rad@semihalf.com>
drivers/net/thunderx/nicvf_ethdev.c

index ed69147..fd5751e 100644 (file)
@@ -562,6 +562,51 @@ nicvf_tx_queue_reset(struct nicvf_txq *txq)
        txq->xmit_bufs = 0;
 }
 
+static inline int
+nicvf_start_tx_queue(struct rte_eth_dev *dev, uint16_t qidx)
+{
+       struct nicvf_txq *txq;
+       int ret;
+
+       if (dev->data->tx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STARTED)
+               return 0;
+
+       txq = dev->data->tx_queues[qidx];
+       txq->pool = NULL;
+       ret = nicvf_qset_sq_config(nicvf_pmd_priv(dev), qidx, txq);
+       if (ret) {
+               PMD_INIT_LOG(ERR, "Failed to configure sq %d %d", qidx, ret);
+               goto config_sq_error;
+       }
+
+       dev->data->tx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STARTED;
+       return ret;
+
+config_sq_error:
+       nicvf_qset_sq_reclaim(nicvf_pmd_priv(dev), qidx);
+       return ret;
+}
+
+static inline int
+nicvf_stop_tx_queue(struct rte_eth_dev *dev, uint16_t qidx)
+{
+       struct nicvf_txq *txq;
+       int ret;
+
+       if (dev->data->tx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STOPPED)
+               return 0;
+
+       ret = nicvf_qset_sq_reclaim(nicvf_pmd_priv(dev), qidx);
+       if (ret)
+               PMD_INIT_LOG(ERR, "Failed to reclaim sq %d %d", qidx, ret);
+
+       txq = dev->data->tx_queues[qidx];
+       nicvf_tx_queue_release_mbufs(txq);
+       nicvf_tx_queue_reset(txq);
+
+       dev->data->tx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STOPPED;
+       return ret;
+}
 
 static inline int
 nicvf_configure_cpi(struct rte_eth_dev *dev)
@@ -871,6 +916,18 @@ nicvf_dev_rx_queue_stop(struct rte_eth_dev *dev, uint16_t qidx)
        return ret;
 }
 
+static int
+nicvf_dev_tx_queue_start(struct rte_eth_dev *dev, uint16_t qidx)
+{
+       return nicvf_start_tx_queue(dev, qidx);
+}
+
+static int
+nicvf_dev_tx_queue_stop(struct rte_eth_dev *dev, uint16_t qidx)
+{
+       return nicvf_stop_tx_queue(dev, qidx);
+}
+
 static int
 nicvf_dev_rx_queue_setup(struct rte_eth_dev *dev, uint16_t qidx,
                         uint16_t nb_desc, unsigned int socket_id,
@@ -1100,6 +1157,8 @@ static const struct eth_dev_ops nicvf_eth_dev_ops = {
        .rss_hash_conf_get        = nicvf_dev_rss_hash_conf_get,
        .rx_queue_start           = nicvf_dev_rx_queue_start,
        .rx_queue_stop            = nicvf_dev_rx_queue_stop,
+       .tx_queue_start           = nicvf_dev_tx_queue_start,
+       .tx_queue_stop            = nicvf_dev_tx_queue_stop,
        .rx_queue_setup           = nicvf_dev_rx_queue_setup,
        .rx_queue_release         = nicvf_dev_rx_queue_release,
        .rx_queue_count           = nicvf_dev_rx_queue_count,