[06/13] net/ionic: clean up Tx queue version support

Message ID 20210118203508.1332-7-aboyer@pensando.io (mailing list archive)
State Changes Requested, archived
Delegated to: Ferruh Yigit
Headers
Series net/ionic: fixes and optimizations |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Andrew Boyer Jan. 18, 2021, 8:35 p.m. UTC
  The ionic PMD only supports TX queue version 1 or greater.
Version 1 introduced a new SGL format with support for more
fragments per descriptor.

Signed-off-by: Andrew Boyer <aboyer@pensando.io>
---
 drivers/net/ionic/ionic_dev.h    | 2 +-
 drivers/net/ionic/ionic_ethdev.c | 8 ++++----
 drivers/net/ionic/ionic_lif.c    | 7 ++++++-
 drivers/net/ionic/ionic_rxtx.c   | 8 ++++----
 4 files changed, 15 insertions(+), 10 deletions(-)
  

Comments

Ferruh Yigit Jan. 27, 2021, 5:30 p.m. UTC | #1
On 1/18/2021 8:35 PM, Andrew Boyer wrote:
> The ionic PMD only supports TX queue version 1 or greater.
> Version 1 introduced a new SGL format with support for more
> fragments per descriptor.
> 
> Signed-off-by: Andrew Boyer <aboyer@pensando.io>

<...>

> @@ -925,6 +925,11 @@ ionic_lif_alloc(struct ionic_lif *lif)
>   
>   	ionic_lif_queue_identify(lif);
>   
> +	if (lif->qtype_info[IONIC_QTYPE_TXQ].version < 1) {
> +		IONIC_PRINT(ERR, "FW too old, please upgrade");
> +		return -ENXIO;
> +	}
> +

Will this affect the end users, if they were using old FW?

Can you please document this new limitation in the diriver documentation and in 
the release notes?
  
Andrew Boyer Jan. 27, 2021, 5:46 p.m. UTC | #2
> On Jan 27, 2021, at 12:30 PM, Ferruh Yigit <ferruh.yigit@intel.com> wrote:
> 
> On 1/18/2021 8:35 PM, Andrew Boyer wrote:
>> The ionic PMD only supports TX queue version 1 or greater.
>> Version 1 introduced a new SGL format with support for more
>> fragments per descriptor.
>> Signed-off-by: Andrew Boyer <aboyer@pensando.io>
> 
> <...>
> 
>> @@ -925,6 +925,11 @@ ionic_lif_alloc(struct ionic_lif *lif)
>>    	ionic_lif_queue_identify(lif);
>>  +	if (lif->qtype_info[IONIC_QTYPE_TXQ].version < 1) {
>> +		IONIC_PRINT(ERR, "FW too old, please upgrade");
>> +		return -ENXIO;
>> +	}
>> +
> 
> Will this affect the end users, if they were using old FW?
> 
> Can you please document this new limitation in the diriver documentation and in the release notes?

I will come up with something.

We don’t believe it’s possible for anyone to be using FW that old; there were only a few customers with cards back then and all have been upgraded. We decided that locking old FW out would be better than adding complexity in the hot path to handle the old data structures.

-Andrew
  

Patch

diff --git a/drivers/net/ionic/ionic_dev.h b/drivers/net/ionic/ionic_dev.h
index 6931930543..ea89218662 100644
--- a/drivers/net/ionic/ionic_dev.h
+++ b/drivers/net/ionic/ionic_dev.h
@@ -107,7 +107,7 @@  static inline void ionic_struct_size_checks(void)
 
 	/* I/O */
 	RTE_BUILD_BUG_ON(sizeof(struct ionic_txq_desc) != 16);
-	RTE_BUILD_BUG_ON(sizeof(struct ionic_txq_sg_desc) != 128);
+	RTE_BUILD_BUG_ON(sizeof(struct ionic_txq_sg_desc_v1) != 256);
 	RTE_BUILD_BUG_ON(sizeof(struct ionic_txq_comp) != 16);
 
 	RTE_BUILD_BUG_ON(sizeof(struct ionic_rxq_desc) != 16);
diff --git a/drivers/net/ionic/ionic_ethdev.c b/drivers/net/ionic/ionic_ethdev.c
index 9238bf7d36..bc9a946ab5 100644
--- a/drivers/net/ionic/ionic_ethdev.c
+++ b/drivers/net/ionic/ionic_ethdev.c
@@ -70,12 +70,12 @@  static const struct rte_eth_desc_lim rx_desc_lim = {
 	.nb_align = 1,
 };
 
-static const struct rte_eth_desc_lim tx_desc_lim = {
+static const struct rte_eth_desc_lim tx_desc_lim_v1 = {
 	.nb_max = IONIC_MAX_RING_DESC,
 	.nb_min = IONIC_MIN_RING_DESC,
 	.nb_align = 1,
-	.nb_seg_max = IONIC_TX_MAX_SG_ELEMS,
-	.nb_mtu_seg_max = IONIC_TX_MAX_SG_ELEMS,
+	.nb_seg_max = IONIC_TX_MAX_SG_ELEMS_V1,
+	.nb_mtu_seg_max = IONIC_TX_MAX_SG_ELEMS_V1,
 };
 
 static const struct eth_dev_ops ionic_eth_dev_ops = {
@@ -440,7 +440,7 @@  ionic_dev_info_get(struct rte_eth_dev *eth_dev,
 		0;
 
 	dev_info->rx_desc_lim = rx_desc_lim;
-	dev_info->tx_desc_lim = tx_desc_lim;
+	dev_info->tx_desc_lim = tx_desc_lim_v1;
 
 	/* Driver-preferred Rx/Tx parameters */
 	dev_info->default_rxportconf.burst_size = 32;
diff --git a/drivers/net/ionic/ionic_lif.c b/drivers/net/ionic/ionic_lif.c
index 0d2b3d56a7..ec35d81cd5 100644
--- a/drivers/net/ionic/ionic_lif.c
+++ b/drivers/net/ionic/ionic_lif.c
@@ -761,7 +761,7 @@  ionic_tx_qcq_alloc(struct ionic_lif *lif, uint32_t index, uint16_t ntxq_descs,
 		ntxq_descs,
 		sizeof(struct ionic_txq_desc),
 		sizeof(struct ionic_txq_comp),
-		sizeof(struct ionic_txq_sg_desc),
+		sizeof(struct ionic_txq_sg_desc_v1),
 		&lif->txqcqs[index]);
 	if (err)
 		return err;
@@ -925,6 +925,11 @@  ionic_lif_alloc(struct ionic_lif *lif)
 
 	ionic_lif_queue_identify(lif);
 
+	if (lif->qtype_info[IONIC_QTYPE_TXQ].version < 1) {
+		IONIC_PRINT(ERR, "FW too old, please upgrade");
+		return -ENXIO;
+	}
+
 	IONIC_PRINT(DEBUG, "Allocating Lif Info");
 
 	rte_spinlock_init(&lif->adminq_lock);
diff --git a/drivers/net/ionic/ionic_rxtx.c b/drivers/net/ionic/ionic_rxtx.c
index 5d0e9d5d5a..c3a44faa21 100644
--- a/drivers/net/ionic/ionic_rxtx.c
+++ b/drivers/net/ionic/ionic_rxtx.c
@@ -311,9 +311,9 @@  static struct ionic_txq_desc *
 ionic_tx_tso_next(struct ionic_queue *q, struct ionic_txq_sg_elem **elem)
 {
 	struct ionic_txq_desc *desc_base = q->base;
-	struct ionic_txq_sg_desc *sg_desc_base = q->sg_base;
+	struct ionic_txq_sg_desc_v1 *sg_desc_base = q->sg_base;
 	struct ionic_txq_desc *desc = &desc_base[q->head_idx];
-	struct ionic_txq_sg_desc *sg_desc = &sg_desc_base[q->head_idx];
+	struct ionic_txq_sg_desc_v1 *sg_desc = &sg_desc_base[q->head_idx];
 
 	*elem = sg_desc->elems;
 	return desc;
@@ -446,9 +446,9 @@  ionic_tx(struct ionic_queue *q, struct rte_mbuf *txm,
 		uint64_t offloads, bool not_xmit_more)
 {
 	struct ionic_txq_desc *desc_base = q->base;
-	struct ionic_txq_sg_desc *sg_desc_base = q->sg_base;
+	struct ionic_txq_sg_desc_v1 *sg_desc_base = q->sg_base;
 	struct ionic_txq_desc *desc = &desc_base[q->head_idx];
-	struct ionic_txq_sg_desc *sg_desc = &sg_desc_base[q->head_idx];
+	struct ionic_txq_sg_desc_v1 *sg_desc = &sg_desc_base[q->head_idx];
 	struct ionic_txq_sg_elem *elem = sg_desc->elems;
 	struct ionic_tx_stats *stats = IONIC_Q_TO_TX_STATS(q);
 	struct rte_mbuf *txm_seg;