The hardware tracks a single queue depth across all queues, so an rx or
tx queue configured with a different depth is rejected with -EINVAL
rather than silently coerced to the first queue's depth. Reset the rx/tx
queue states in dev_stop and the cached depths in dev_configure so the
queue state reflects the stopped device before the next start.

Signed-off-by: Jiacheng Ye <[email protected]>
---
 drivers/net/hinic3/hinic3_ethdev.c | 42 ++++++++++++++++++++----------
 drivers/net/hinic3/hinic3_ethdev.h |  5 ++++
 2 files changed, 33 insertions(+), 14 deletions(-)

diff --git a/drivers/net/hinic3/hinic3_ethdev.c 
b/drivers/net/hinic3/hinic3_ethdev.c
index 78c0a14b99..32218fa0f6 100644
--- a/drivers/net/hinic3/hinic3_ethdev.c
+++ b/drivers/net/hinic3/hinic3_ethdev.c
@@ -316,8 +316,6 @@ hinic3_xstats_calc_num(struct hinic3_nic_dev *nic_dev)
        }
 }
 
-#define HINIC3_MAX_QUEUE_DEPTH 16384
-#define HINIC3_MIN_QUEUE_DEPTH 128
 #define HINIC3_TXD_ALIGN       1
 #define HINIC3_RXD_ALIGN       1
 
@@ -752,6 +750,8 @@ hinic3_dev_configure(struct rte_eth_dev *dev)
 
        nic_dev->num_sqs = dev->data->nb_tx_queues;
        nic_dev->num_rqs = dev->data->nb_rx_queues;
+       nic_dev->rxq_depth = 0;
+       nic_dev->txq_depth = 0;
 
        nic_dev->mtu_size =
                
(uint16_t)HINIC3_PKTLEN_TO_MTU(HINIC3_MAX_RX_PKT_LEN(dev->data->dev_conf.rxmode));
@@ -1096,16 +1096,17 @@ hinic3_rx_queue_setup(struct rte_eth_dev *dev, uint16_t 
qid, uint16_t nb_desc,
 
        nic_dev = HINIC3_ETH_DEV_TO_PRIVATE_NIC_DEV(dev);
 
-       /* Queue depth must be equal to queue 0 */
-       if (qid != 0 && nb_desc != nic_dev->rxqs[0]->q_depth) {
-               PMD_DRV_LOG(WARNING, "rxq%u depth:%u is not equal to queue0 
depth:%u.",
-                           qid, nb_desc, nic_dev->rxqs[0]->q_depth);
-               nb_desc = nic_dev->rxqs[0]->q_depth;
-       }
-
        /* Queue depth must be power of 2, otherwise will be aligned up. */
-       rq_depth = (nb_desc & (nb_desc - 1))
-                       ? ((uint16_t)(1U << (rte_log2_u32(nb_desc) + 1))) : 
nb_desc;
+       rq_depth = (uint16_t)rte_align32pow2(nb_desc);
+
+       /* Queue depth must be equal to first queue */
+       if (nic_dev->rxq_depth == 0) {
+               nic_dev->rxq_depth = rq_depth;
+       } else if (rq_depth != nic_dev->rxq_depth) {
+               PMD_DRV_LOG(ERR, "rxq%u depth:%u is not equal to first queue 
depth:%u.",
+                           qid, rq_depth, nic_dev->rxq_depth);
+               return -EINVAL;
+       }
 
        /*
         * Validate number of receive descriptors.
@@ -1329,10 +1330,17 @@ hinic3_tx_queue_setup(struct rte_eth_dev *dev, uint16_t 
qid, uint16_t nb_desc,
 
        nic_dev = HINIC3_ETH_DEV_TO_PRIVATE_NIC_DEV(dev);
        hwdev = nic_dev->hwdev;
-
        /* Queue depth must be power of 2, otherwise will be aligned up. */
-       sq_depth = (nb_desc & (nb_desc - 1))
-                               ? ((uint16_t)(1U << (rte_log2_u32(nb_desc) + 
1))) : nb_desc;
+       sq_depth = (uint16_t)rte_align32pow2(nb_desc);
+
+       /* Queue depth must be equal to first queue */
+       if (nic_dev->txq_depth == 0) {
+               nic_dev->txq_depth = sq_depth;
+       } else if (sq_depth != nic_dev->txq_depth) {
+               PMD_DRV_LOG(ERR, "txq%u depth:%u is not equal to first queue 
depth:%u.",
+                       qid, sq_depth, nic_dev->txq_depth);
+               return -EINVAL;
+       }
 
        /*
         * Validate number of transmit descriptors.
@@ -2237,6 +2245,12 @@ hinic3_dev_stop(struct rte_eth_dev *dev)
 
        /* Free mempool. */
        hinic3_copy_mempool_uninit(nic_dev);
+
+       for (uint16_t i = 0; i < dev->data->nb_rx_queues; i++)
+               dev->data->rx_queue_state[i] = RTE_ETH_QUEUE_STATE_STOPPED;
+       for (uint16_t i = 0; i < dev->data->nb_tx_queues; i++)
+               dev->data->tx_queue_state[i] = RTE_ETH_QUEUE_STATE_STOPPED;
+
        return 0;
 }
 
diff --git a/drivers/net/hinic3/hinic3_ethdev.h 
b/drivers/net/hinic3/hinic3_ethdev.h
index 1a5eac7c23..21abea0668 100644
--- a/drivers/net/hinic3/hinic3_ethdev.h
+++ b/drivers/net/hinic3/hinic3_ethdev.h
@@ -15,6 +15,9 @@
 
 #define HINIC3_PMD_DRV_VERSION "B106"
 
+#define HINIC3_MAX_QUEUE_DEPTH         16384
+#define HINIC3_MIN_QUEUE_DEPTH         128
+
 #define PCI_DEV_TO_INTR_HANDLE(pci_dev) ((pci_dev)->intr_handle)
 
 #define HINIC3_PKT_RX_L4_CKSUM_BAD     RTE_MBUF_F_RX_L4_CKSUM_BAD
@@ -145,6 +148,8 @@ struct hinic3_nic_dev {
        uint16_t max_sqs;
        uint16_t max_rqs;
 
+       uint16_t rxq_depth;
+       uint16_t txq_depth;
        uint16_t rx_buff_len;
        uint16_t mtu_size;
 
-- 
2.33.0

Reply via email to