common/sfc_efx/base: fix MAE match spec validation helper
[dpdk.git] / drivers / common / sfc_efx / base / ef10_rx.c
index 43d545b..1b4f3f0 100644 (file)
@@ -906,21 +906,18 @@ ef10_rx_qcreate(
        __in            efx_rxq_t *erp)
 {
        efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
+       efx_mcdi_init_rxq_params_t params;
        const efx_rx_prefix_layout_t *erpl;
        efx_rc_t rc;
-       boolean_t disable_scatter;
-       boolean_t want_inner_classes;
-       unsigned int ps_buf_size;
-       uint32_t es_bufs_per_desc = 0;
-       uint32_t es_max_dma_len = 0;
-       uint32_t es_buf_stride = 0;
-       uint32_t hol_block_timeout = 0;
 
        _NOTE(ARGUNUSED(id, erp))
 
        EFX_STATIC_ASSERT(EFX_EV_RX_NLABELS == (1 << ESF_DZ_RX_QLABEL_WIDTH));
        EFSYS_ASSERT3U(label, <, EFX_EV_RX_NLABELS);
 
+       memset(&params, 0, sizeof (params));
+       params.buf_size = erp->er_buf_size;
+
        switch (type) {
        case EFX_RXQ_TYPE_DEFAULT:
                erpl = &ef10_default_rx_prefix_layout;
@@ -929,7 +926,10 @@ ef10_rx_qcreate(
                        goto fail1;
                }
                erp->er_buf_size = type_data->ertd_default.ed_buf_size;
-               ps_buf_size = 0;
+               /*
+                * Ignore EFX_RXQ_FLAG_RSS_HASH since if RSS hash is calculated
+                * it is always delivered from HW in the pseudo-header.
+                */
                break;
 #if EFSYS_OPT_RX_PACKED_STREAM
        case EFX_RXQ_TYPE_PACKED_STREAM:
@@ -940,25 +940,30 @@ ef10_rx_qcreate(
                }
                switch (type_data->ertd_packed_stream.eps_buf_size) {
                case EFX_RXQ_PACKED_STREAM_BUF_SIZE_1M:
-                       ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_1M;
+                       params.ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_1M;
                        break;
                case EFX_RXQ_PACKED_STREAM_BUF_SIZE_512K:
-                       ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_512K;
+                       params.ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_512K;
                        break;
                case EFX_RXQ_PACKED_STREAM_BUF_SIZE_256K:
-                       ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_256K;
+                       params.ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_256K;
                        break;
                case EFX_RXQ_PACKED_STREAM_BUF_SIZE_128K:
-                       ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_128K;
+                       params.ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_128K;
                        break;
                case EFX_RXQ_PACKED_STREAM_BUF_SIZE_64K:
-                       ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_64K;
+                       params.ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_64K;
                        break;
                default:
                        rc = ENOTSUP;
                        goto fail3;
                }
                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 fail4;
+               }
                break;
 #endif /* EFSYS_OPT_RX_PACKED_STREAM */
 #if EFSYS_OPT_RX_ES_SUPER_BUFFER
@@ -966,79 +971,80 @@ ef10_rx_qcreate(
                erpl = &ef10_essb_rx_prefix_layout;
                if (type_data == NULL) {
                        rc = EINVAL;
-                       goto fail4;
+                       goto fail5;
                }
-               ps_buf_size = 0;
-               es_bufs_per_desc =
+               params.es_bufs_per_desc =
                    type_data->ertd_es_super_buffer.eessb_bufs_per_desc;
-               es_max_dma_len =
+               params.es_max_dma_len =
                    type_data->ertd_es_super_buffer.eessb_max_dma_len;
-               es_buf_stride =
+               params.es_buf_stride =
                    type_data->ertd_es_super_buffer.eessb_buf_stride;
-               hol_block_timeout =
+               params.hol_block_timeout =
                    type_data->ertd_es_super_buffer.eessb_hol_block_timeout;
+               /*
+                * Ignore EFX_RXQ_FLAG_RSS_HASH since if RSS hash is calculated
+                * it is always delivered from HW in the pseudo-header.
+                */
                break;
 #endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
        default:
                rc = ENOTSUP;
-               goto fail5;
+               goto fail6;
        }
 
 #if EFSYS_OPT_RX_PACKED_STREAM
-       if (ps_buf_size != 0) {
+       if (params.ps_buf_size != 0) {
                /* Check if datapath firmware supports packed stream mode */
                if (encp->enc_rx_packed_stream_supported == B_FALSE) {
                        rc = ENOTSUP;
-                       goto fail6;
+                       goto fail7;
                }
                /* Check if packed stream allows configurable buffer sizes */
-               if ((ps_buf_size != MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_1M) &&
+               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 fail7;
+                       goto fail8;
                }
        }
 #else /* EFSYS_OPT_RX_PACKED_STREAM */
-       EFSYS_ASSERT(ps_buf_size == 0);
+       EFSYS_ASSERT(params.ps_buf_size == 0);
 #endif /* EFSYS_OPT_RX_PACKED_STREAM */
 
 #if EFSYS_OPT_RX_ES_SUPER_BUFFER
-       if (es_bufs_per_desc > 0) {
+       if (params.es_bufs_per_desc > 0) {
                if (encp->enc_rx_es_super_buffer_supported == B_FALSE) {
                        rc = ENOTSUP;
-                       goto fail8;
+                       goto fail9;
                }
-               if (!EFX_IS_P2ALIGNED(uint32_t, es_max_dma_len,
+               if (!EFX_IS_P2ALIGNED(uint32_t, params.es_max_dma_len,
                            EFX_RX_ES_SUPER_BUFFER_BUF_ALIGNMENT)) {
                        rc = EINVAL;
-                       goto fail9;
+                       goto fail10;
                }
-               if (!EFX_IS_P2ALIGNED(uint32_t, es_buf_stride,
+               if (!EFX_IS_P2ALIGNED(uint32_t, params.es_buf_stride,
                            EFX_RX_ES_SUPER_BUFFER_BUF_ALIGNMENT)) {
                        rc = EINVAL;
-                       goto fail10;
+                       goto fail11;
                }
        }
 #else /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
-       EFSYS_ASSERT(es_bufs_per_desc == 0);
+       EFSYS_ASSERT(params.es_bufs_per_desc == 0);
 #endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
 
        /* Scatter can only be disabled if the firmware supports doing so */
        if (flags & EFX_RXQ_FLAG_SCATTER)
-               disable_scatter = B_FALSE;
+               params.disable_scatter = B_FALSE;
        else
-               disable_scatter = encp->enc_rx_disable_scatter_supported;
+               params.disable_scatter = encp->enc_rx_disable_scatter_supported;
 
        if (flags & EFX_RXQ_FLAG_INNER_CLASSES)
-               want_inner_classes = B_TRUE;
+               params.want_inner_classes = B_TRUE;
        else
-               want_inner_classes = B_FALSE;
+               params.want_inner_classes = B_FALSE;
 
        if ((rc = efx_mcdi_init_rxq(enp, ndescs, eep, label, index,
-                   esmp, disable_scatter, want_inner_classes, erp->er_buf_size,
-                   ps_buf_size, es_bufs_per_desc, es_max_dma_len,
-                   es_buf_stride, hol_block_timeout)) != 0)
-               goto fail11;
+                   esmp, &params)) != 0)
+               goto fail12;
 
        erp->er_eep = eep;
        erp->er_label = label;
@@ -1051,29 +1057,31 @@ ef10_rx_qcreate(
 
        return (0);
 
+fail12:
+       EFSYS_PROBE(fail12);
+#if EFSYS_OPT_RX_ES_SUPER_BUFFER
 fail11:
        EFSYS_PROBE(fail11);
-#if EFSYS_OPT_RX_ES_SUPER_BUFFER
 fail10:
        EFSYS_PROBE(fail10);
 fail9:
        EFSYS_PROBE(fail9);
-fail8:
-       EFSYS_PROBE(fail8);
 #endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
 #if EFSYS_OPT_RX_PACKED_STREAM
+fail8:
+       EFSYS_PROBE(fail8);
 fail7:
        EFSYS_PROBE(fail7);
+#endif /* EFSYS_OPT_RX_PACKED_STREAM */
 fail6:
        EFSYS_PROBE(fail6);
-#endif /* EFSYS_OPT_RX_PACKED_STREAM */
+#if EFSYS_OPT_RX_ES_SUPER_BUFFER
 fail5:
        EFSYS_PROBE(fail5);
-#if EFSYS_OPT_RX_ES_SUPER_BUFFER
-fail4:
-       EFSYS_PROBE(fail4);
 #endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
 #if EFSYS_OPT_RX_PACKED_STREAM
+fail4:
+       EFSYS_PROBE(fail4);
 fail3:
        EFSYS_PROBE(fail3);
 fail2: