[06/13] net/ionic: clean up Tx queue version support
Checks
Commit Message
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
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?
> 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
@@ -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);
@@ -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;
@@ -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);
@@ -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;