New upstream version 17.11.5
[deb_dpdk.git] / drivers / net / failsafe / failsafe_ops.c
index 9a5d873..7eb6f71 100644 (file)
@@ -260,9 +260,13 @@ fs_rx_queue_release(void *queue)
                return;
        rxq = queue;
        dev = rxq->priv->dev;
-       FOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE)
-               SUBOPS(sdev, rx_queue_release)
-                       (ETH(sdev)->data->rx_queues[rxq->qid]);
+       FOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) {
+               if (ETH(sdev)->data->rx_queues != NULL &&
+                   ETH(sdev)->data->rx_queues[rxq->qid] != NULL) {
+                       SUBOPS(sdev, rx_queue_release)
+                               (ETH(sdev)->data->rx_queues[rxq->qid]);
+               }
+       }
        dev->data->rx_queues[rxq->qid] = NULL;
        rte_free(rxq);
 }
@@ -280,6 +284,11 @@ fs_rx_queue_setup(struct rte_eth_dev *dev,
        uint8_t i;
        int ret;
 
+       if (rx_conf->rx_deferred_start) {
+               ERROR("Rx queue deferred start is not supported");
+               return -EINVAL;
+       }
+
        rxq = dev->data->rx_queues[rx_queue_id];
        if (rxq != NULL) {
                fs_rx_queue_release(rxq);
@@ -328,9 +337,13 @@ fs_tx_queue_release(void *queue)
                return;
        txq = queue;
        dev = txq->priv->dev;
-       FOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE)
-               SUBOPS(sdev, tx_queue_release)
-                       (ETH(sdev)->data->tx_queues[txq->qid]);
+       FOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) {
+               if (ETH(sdev)->data->tx_queues != NULL &&
+                   ETH(sdev)->data->tx_queues[txq->qid] != NULL) {
+                       SUBOPS(sdev, tx_queue_release)
+                               (ETH(sdev)->data->tx_queues[txq->qid]);
+               }
+       }
        dev->data->tx_queues[txq->qid] = NULL;
        rte_free(txq);
 }
@@ -347,6 +360,11 @@ fs_tx_queue_setup(struct rte_eth_dev *dev,
        uint8_t i;
        int ret;
 
+       if (tx_conf->tx_deferred_start) {
+               ERROR("Tx queue deferred start is not supported");
+               return -EINVAL;
+       }
+
        txq = dev->data->tx_queues[tx_queue_id];
        if (txq != NULL) {
                fs_tx_queue_release(txq);