common/sfc_efx/base: add flag to use Rx prefix user flag
authorIvan Malov <ivan.malov@oktetlabs.ru>
Tue, 12 Oct 2021 19:46:19 +0000 (22:46 +0300)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 12 Oct 2021 22:47:49 +0000 (00:47 +0200)
Add an RxQ flag to request support for user flag field of Rx
prefix. The feature is supported only on EF100 and EF10 ESSB.

Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
Reviewed-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
drivers/common/sfc_efx/base/ef10_rx.c
drivers/common/sfc_efx/base/efx.h
drivers/common/sfc_efx/base/rhead_rx.c

index 0c3f941..a658e0d 100644 (file)
@@ -930,6 +930,10 @@ ef10_rx_qcreate(
                        rc = ENOTSUP;
                        goto fail2;
                }
+               if (flags & EFX_RXQ_FLAG_USER_FLAG) {
+                       rc = ENOTSUP;
+                       goto fail3;
+               }
                /*
                 * Ignore EFX_RXQ_FLAG_RSS_HASH since if RSS hash is calculated
                 * it is always delivered from HW in the pseudo-header.
@@ -940,7 +944,7 @@ ef10_rx_qcreate(
                erpl = &ef10_packed_stream_rx_prefix_layout;
                if (type_data == NULL) {
                        rc = EINVAL;
-                       goto fail3;
+                       goto fail4;
                }
                switch (type_data->ertd_packed_stream.eps_buf_size) {
                case EFX_RXQ_PACKED_STREAM_BUF_SIZE_1M:
@@ -960,17 +964,21 @@ ef10_rx_qcreate(
                        break;
                default:
                        rc = ENOTSUP;
-                       goto fail4;
+                       goto fail5;
                }
                erp->er_buf_size = type_data->ertd_packed_stream.eps_buf_size;
                /* Packed stream pseudo header does not have RSS hash value */
                if (flags & EFX_RXQ_FLAG_RSS_HASH) {
                        rc = ENOTSUP;
-                       goto fail5;
+                       goto fail6;
                }
                if (flags & EFX_RXQ_FLAG_USER_MARK) {
                        rc = ENOTSUP;
-                       goto fail6;
+                       goto fail7;
+               }
+               if (flags & EFX_RXQ_FLAG_USER_FLAG) {
+                       rc = ENOTSUP;
+                       goto fail8;
                }
                break;
 #endif /* EFSYS_OPT_RX_PACKED_STREAM */
@@ -979,7 +987,7 @@ ef10_rx_qcreate(
                erpl = &ef10_essb_rx_prefix_layout;
                if (type_data == NULL) {
                        rc = EINVAL;
-                       goto fail7;
+                       goto fail9;
                }
                params.es_bufs_per_desc =
                    type_data->ertd_es_super_buffer.eessb_bufs_per_desc;
@@ -997,7 +1005,7 @@ ef10_rx_qcreate(
 #endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
        default:
                rc = ENOTSUP;
-               goto fail8;
+               goto fail10;
        }
 
 #if EFSYS_OPT_RX_PACKED_STREAM
@@ -1005,13 +1013,13 @@ ef10_rx_qcreate(
                /* Check if datapath firmware supports packed stream mode */
                if (encp->enc_rx_packed_stream_supported == B_FALSE) {
                        rc = ENOTSUP;
-                       goto fail9;
+                       goto fail11;
                }
                /* Check if packed stream allows configurable buffer sizes */
                if ((params.ps_buf_size != MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_1M) &&
                    (encp->enc_rx_var_packed_stream_supported == B_FALSE)) {
                        rc = ENOTSUP;
-                       goto fail10;
+                       goto fail12;
                }
        }
 #else /* EFSYS_OPT_RX_PACKED_STREAM */
@@ -1022,17 +1030,17 @@ ef10_rx_qcreate(
        if (params.es_bufs_per_desc > 0) {
                if (encp->enc_rx_es_super_buffer_supported == B_FALSE) {
                        rc = ENOTSUP;
-                       goto fail11;
+                       goto fail13;
                }
                if (!EFX_IS_P2ALIGNED(uint32_t, params.es_max_dma_len,
                            EFX_RX_ES_SUPER_BUFFER_BUF_ALIGNMENT)) {
                        rc = EINVAL;
-                       goto fail12;
+                       goto fail14;
                }
                if (!EFX_IS_P2ALIGNED(uint32_t, params.es_buf_stride,
                            EFX_RX_ES_SUPER_BUFFER_BUF_ALIGNMENT)) {
                        rc = EINVAL;
-                       goto fail13;
+                       goto fail15;
                }
        }
 #else /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
@@ -1041,7 +1049,7 @@ ef10_rx_qcreate(
 
        if (flags & EFX_RXQ_FLAG_INGRESS_MPORT) {
                rc = ENOTSUP;
-               goto fail14;
+               goto fail16;
        }
 
        /* Scatter can only be disabled if the firmware supports doing so */
@@ -1057,7 +1065,7 @@ ef10_rx_qcreate(
 
        if ((rc = efx_mcdi_init_rxq(enp, ndescs, eep, label, index,
                    esmp, &params)) != 0)
-               goto fail15;
+               goto fail17;
 
        erp->er_eep = eep;
        erp->er_label = label;
@@ -1070,40 +1078,44 @@ ef10_rx_qcreate(
 
        return (0);
 
+fail17:
+       EFSYS_PROBE(fail15);
+fail16:
+       EFSYS_PROBE(fail14);
+#if EFSYS_OPT_RX_ES_SUPER_BUFFER
 fail15:
        EFSYS_PROBE(fail15);
 fail14:
        EFSYS_PROBE(fail14);
-#if EFSYS_OPT_RX_ES_SUPER_BUFFER
 fail13:
        EFSYS_PROBE(fail13);
+#endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
+#if EFSYS_OPT_RX_PACKED_STREAM
 fail12:
        EFSYS_PROBE(fail12);
 fail11:
        EFSYS_PROBE(fail11);
-#endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
-#if EFSYS_OPT_RX_PACKED_STREAM
+#endif /* EFSYS_OPT_RX_PACKED_STREAM */
 fail10:
        EFSYS_PROBE(fail10);
+#if EFSYS_OPT_RX_ES_SUPER_BUFFER
 fail9:
        EFSYS_PROBE(fail9);
-#endif /* EFSYS_OPT_RX_PACKED_STREAM */
+#endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
+#if EFSYS_OPT_RX_PACKED_STREAM
 fail8:
        EFSYS_PROBE(fail8);
-#if EFSYS_OPT_RX_ES_SUPER_BUFFER
 fail7:
        EFSYS_PROBE(fail7);
-#endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
-#if EFSYS_OPT_RX_PACKED_STREAM
 fail6:
        EFSYS_PROBE(fail6);
 fail5:
        EFSYS_PROBE(fail5);
 fail4:
        EFSYS_PROBE(fail4);
+#endif /* EFSYS_OPT_RX_PACKED_STREAM */
 fail3:
        EFSYS_PROBE(fail3);
-#endif /* EFSYS_OPT_RX_PACKED_STREAM */
 fail2:
        EFSYS_PROBE(fail2);
 fail1:
index b61984a..e052612 100644 (file)
@@ -3030,6 +3030,10 @@ typedef enum efx_rxq_type_e {
  * Request user mark field in the Rx prefix of a queue.
  */
 #define        EFX_RXQ_FLAG_USER_MARK          0x10
+/*
+ * Request user flag field in the Rx prefix of a queue.
+ */
+#define        EFX_RXQ_FLAG_USER_FLAG          0x20
 
 LIBEFX_API
 extern __checkReturn   efx_rc_t
index 692c3e1..7b9a4af 100644 (file)
@@ -635,6 +635,9 @@ rhead_rx_qcreate(
        if (flags & EFX_RXQ_FLAG_USER_MARK)
                fields_mask |= 1U << EFX_RX_PREFIX_FIELD_USER_MARK;
 
+       if (flags & EFX_RXQ_FLAG_USER_FLAG)
+               fields_mask |= 1U << EFX_RX_PREFIX_FIELD_USER_FLAG;
+
        /*
         * LENGTH is required in EF100 host interface, as receive events
         * do not include the packet length.