The newer firmware on ConnectX-8 and above always check the
presence of length mode workaround bit, regardless of the
flex parser header length mode. The patch sets the workaround
bit for the all length modes for the parsers created by application.
The internal parsers for eCPRI and IPv6 SRH are updated as well.

Fixes: a2234609bf7e ("net/mlx5: fix flex flow item header length")
Cc: [email protected]

Signed-off-by: Viacheslav Ovsiienko <[email protected]>
---
 drivers/net/mlx5/mlx5.c           | 3 +++
 drivers/net/mlx5/mlx5_flow_flex.c | 2 +-
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c
index bde4d01e48..d82d8e7877 100644
--- a/drivers/net/mlx5/mlx5.c
+++ b/drivers/net/mlx5/mlx5.c
@@ -983,6 +983,7 @@ int
 mlx5_flex_parser_ecpri_alloc(struct rte_eth_dev *dev)
 {
        struct mlx5_priv *priv = dev->data->dev_private;
+       struct mlx5_hca_flex_attr *attr = &priv->sh->cdev->config.hca_attr.flex;
        struct mlx5_ecpri_parser_profile *prf = &priv->sh->ecpri_parser;
        struct mlx5_devx_graph_node_attr node = {
                .modify_field_select = 0,
@@ -996,6 +997,7 @@ mlx5_flex_parser_ecpri_alloc(struct rte_eth_dev *dev)
                return -ENOTSUP;
        }
        node.header_length_mode = MLX5_GRAPH_NODE_LEN_FIXED;
+       node.header_length_field_offset_mode = 
!attr->header_length_field_mode_wa;
        /* 8 bytes now: 4B common header + 4B message body header. */
        node.header_length_base_value = 0x8;
        /* After MAC layer: Ether / VLAN. */
@@ -1075,6 +1077,7 @@ mlx5_alloc_srh_flex_parser(struct rte_eth_dev *dev)
        if (!priv->sh->srh_flex_parser.flex.devx_fp)
                return -ENOMEM;
        node.header_length_mode = MLX5_GRAPH_NODE_LEN_FIELD;
+       node.header_length_field_offset_mode = 
!attr->header_length_field_mode_wa;
        /* Srv6 first two DW are not counted in. */
        node.header_length_base_value = 0x8;
        /* The unit is uint64_t. */
diff --git a/drivers/net/mlx5/mlx5_flow_flex.c 
b/drivers/net/mlx5/mlx5_flow_flex.c
index d21e28f7fd..e308d1cd6f 100644
--- a/drivers/net/mlx5/mlx5_flow_flex.c
+++ b/drivers/net/mlx5/mlx5_flow_flex.c
@@ -482,6 +482,7 @@ mlx5_flex_translate_length(struct mlx5_hca_flex_attr *attr,
                return rte_flow_error_set
                        (error, EINVAL, RTE_FLOW_ERROR_TYPE_ITEM, NULL,
                         "not byte aligned header length field");
+       node->header_length_field_offset_mode = 
!attr->header_length_field_mode_wa;
        switch (field->field_mode) {
        case FIELD_MODE_DUMMY:
                return rte_flow_error_set
@@ -572,7 +573,6 @@ mlx5_flex_translate_length(struct mlx5_hca_flex_attr *attr,
                node->header_length_field_mask = mask;
                node->header_length_field_shift = shift;
                node->header_length_field_offset = offset;
-               node->header_length_field_offset_mode = 
!attr->header_length_field_mode_wa;
                break;
        }
        case FIELD_MODE_BITMASK:
-- 
2.34.1

Reply via email to