net/failsafe: use ownership mechanism for slaves
[dpdk.git] / drivers / net / bnxt / bnxt_txr.c
index 2f2c871..2c81a37 100644 (file)
@@ -349,6 +349,11 @@ uint16_t bnxt_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
        /* Handle TX completions */
        bnxt_handle_tx_cp(txq);
 
+       /* Tx queue was stopped; wait for it to be restarted */
+       if (txq->tx_deferred_start) {
+               PMD_DRV_LOG(DEBUG, "Tx q stopped;return\n");
+               return 0;
+       }
        /* Handle TX burst request */
        for (nb_tx_pkts = 0; nb_tx_pkts < nb_pkts; nb_tx_pkts++) {
                if (bnxt_start_xmit(tx_pkts[nb_tx_pkts], txq)) {
@@ -364,3 +369,30 @@ uint16_t bnxt_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
 
        return nb_tx_pkts;
 }
+
+int bnxt_tx_queue_start(struct rte_eth_dev *dev, uint16_t tx_queue_id)
+{
+       struct bnxt *bp = (struct bnxt *)dev->data->dev_private;
+       struct bnxt_tx_queue *txq = bp->tx_queues[tx_queue_id];
+
+       dev->data->tx_queue_state[tx_queue_id] = RTE_ETH_QUEUE_STATE_STARTED;
+       txq->tx_deferred_start = false;
+       PMD_DRV_LOG(DEBUG, "Tx queue started\n");
+
+       return 0;
+}
+
+int bnxt_tx_queue_stop(struct rte_eth_dev *dev, uint16_t tx_queue_id)
+{
+       struct bnxt *bp = (struct bnxt *)dev->data->dev_private;
+       struct bnxt_tx_queue *txq = bp->tx_queues[tx_queue_id];
+
+       /* Handle TX completions */
+       bnxt_handle_tx_cp(txq);
+
+       dev->data->tx_queue_state[tx_queue_id] = RTE_ETH_QUEUE_STATE_STOPPED;
+       txq->tx_deferred_start = true;
+       PMD_DRV_LOG(DEBUG, "Tx queue stopped\n");
+
+       return 0;
+}