net/sfc/base: allow to specify Rx buffer size on queue setup
authorAndrew Rybchenko <arybchenko@solarflare.com>
Thu, 7 Feb 2019 16:29:37 +0000 (16:29 +0000)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 8 Feb 2019 10:35:41 +0000 (11:35 +0100)
Rx buffer size must be specified on Rx queue creation on
Riverhead.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
drivers/net/sfc/base/ef10_rx.c
drivers/net/sfc/base/efx.h
drivers/net/sfc/base/efx_impl.h
drivers/net/sfc/base/efx_rx.c
drivers/net/sfc/sfc_rx.c

index 3b296e4..5cb7da9 100644 (file)
@@ -1018,7 +1018,7 @@ ef10_rx_qcreate(
        uint32_t es_buf_stride = 0;
        uint32_t hol_block_timeout = 0;
 
-       _NOTE(ARGUNUSED(id, erp, type_data))
+       _NOTE(ARGUNUSED(id, erp))
 
        EFX_STATIC_ASSERT(EFX_EV_RX_NLABELS == (1 << ESF_DZ_RX_QLABEL_WIDTH));
        EFSYS_ASSERT3U(label, <, EFX_EV_RX_NLABELS);
@@ -1031,13 +1031,18 @@ ef10_rx_qcreate(
 
        switch (type) {
        case EFX_RXQ_TYPE_DEFAULT:
+               if (type_data == NULL) {
+                       rc = EINVAL;
+                       goto fail2;
+               }
+               erp->er_buf_size = type_data->ertd_default.ed_buf_size;
                ps_buf_size = 0;
                break;
 #if EFSYS_OPT_RX_PACKED_STREAM
        case EFX_RXQ_TYPE_PACKED_STREAM:
                if (type_data == NULL) {
                        rc = EINVAL;
-                       goto fail2;
+                       goto fail3;
                }
                switch (type_data->ertd_packed_stream.eps_buf_size) {
                case EFX_RXQ_PACKED_STREAM_BUF_SIZE_1M:
@@ -1057,15 +1062,16 @@ ef10_rx_qcreate(
                        break;
                default:
                        rc = ENOTSUP;
-                       goto fail3;
+                       goto fail4;
                }
+               erp->er_buf_size = type_data->ertd_packed_stream.eps_buf_size;
                break;
 #endif /* EFSYS_OPT_RX_PACKED_STREAM */
 #if EFSYS_OPT_RX_ES_SUPER_BUFFER
        case EFX_RXQ_TYPE_ES_SUPER_BUFFER:
                if (type_data == NULL) {
                        rc = EINVAL;
-                       goto fail4;
+                       goto fail5;
                }
                ps_buf_size = 0;
                es_bufs_per_desc =
@@ -1080,7 +1086,7 @@ ef10_rx_qcreate(
 #endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
        default:
                rc = ENOTSUP;
-               goto fail5;
+               goto fail6;
        }
 
 #if EFSYS_OPT_RX_PACKED_STREAM
@@ -1088,13 +1094,13 @@ ef10_rx_qcreate(
                /* 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) &&
                    (encp->enc_rx_var_packed_stream_supported == B_FALSE)) {
                        rc = ENOTSUP;
-                       goto fail7;
+                       goto fail8;
                }
        }
 #else /* EFSYS_OPT_RX_PACKED_STREAM */
@@ -1105,17 +1111,17 @@ ef10_rx_qcreate(
        if (es_bufs_per_desc > 0) {
                if (encp->enc_rx_es_super_buffer_supported == B_FALSE) {
                        rc = ENOTSUP;
-                       goto fail8;
+                       goto fail9;
                }
                if (!IS_P2ALIGNED(es_max_dma_len,
                            EFX_RX_ES_SUPER_BUFFER_BUF_ALIGNMENT)) {
                        rc = EINVAL;
-                       goto fail9;
+                       goto fail10;
                }
                if (!IS_P2ALIGNED(es_buf_stride,
                            EFX_RX_ES_SUPER_BUFFER_BUF_ALIGNMENT)) {
                        rc = EINVAL;
-                       goto fail10;
+                       goto fail11;
                }
        }
 #else /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
@@ -1137,7 +1143,7 @@ ef10_rx_qcreate(
                    esmp, disable_scatter, want_inner_classes,
                    ps_buf_size, es_bufs_per_desc, es_max_dma_len,
                    es_buf_stride, hol_block_timeout)) != 0)
-               goto fail11;
+               goto fail12;
 
        erp->er_eep = eep;
        erp->er_label = label;
@@ -1148,34 +1154,36 @@ 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);
+#endif /* EFSYS_OPT_RX_PACKED_STREAM */
 fail2:
        EFSYS_PROBE(fail2);
-#endif /* EFSYS_OPT_RX_PACKED_STREAM */
 fail1:
        EFSYS_PROBE1(fail1, efx_rc_t, rc);
 
index 71c3352..35f8967 100644 (file)
@@ -2527,6 +2527,7 @@ efx_rx_qcreate(
        __in            unsigned int index,
        __in            unsigned int label,
        __in            efx_rxq_type_t type,
+       __in            size_t buf_size,
        __in            efsys_mem_t *esmp,
        __in            size_t ndescs,
        __in            uint32_t id,
index e2cdba6..70e0523 100644 (file)
@@ -131,8 +131,9 @@ typedef struct efx_tx_ops_s {
 } efx_tx_ops_t;
 
 typedef union efx_rxq_type_data_u {
-       /* Dummy member to have non-empty union if no options are enabled */
-       uint32_t        ertd_dummy;
+       struct {
+               size_t          ed_buf_size;
+       } ertd_default;
 #if EFSYS_OPT_RX_PACKED_STREAM
        struct {
                uint32_t        eps_buf_size;
@@ -792,6 +793,7 @@ struct efx_rxq_s {
        unsigned int                    er_index;
        unsigned int                    er_label;
        unsigned int                    er_mask;
+       size_t                          er_buf_size;
        efsys_mem_t                     *er_esmp;
        efx_evq_rxq_state_t             *er_ev_qstate;
 };
index 8a12ef7..49c304c 100644 (file)
@@ -693,6 +693,7 @@ efx_rx_qpost(
        const efx_rx_ops_t *erxop = enp->en_erxop;
 
        EFSYS_ASSERT3U(erp->er_magic, ==, EFX_RXQ_MAGIC);
+       EFSYS_ASSERT(erp->er_buf_size == 0 || size == erp->er_buf_size);
 
        erxop->erxo_qpost(erp, addrp, size, ndescs, completed, added);
 }
@@ -869,6 +870,7 @@ efx_rx_qcreate(
        __in            unsigned int index,
        __in            unsigned int label,
        __in            efx_rxq_type_t type,
+       __in            size_t buf_size,
        __in            efsys_mem_t *esmp,
        __in            size_t ndescs,
        __in            uint32_t id,
@@ -876,7 +878,13 @@ efx_rx_qcreate(
        __in            efx_evq_t *eep,
        __deref_out     efx_rxq_t **erpp)
 {
-       return efx_rx_qcreate_internal(enp, index, label, type, NULL,
+       efx_rxq_type_data_t type_data;
+
+       memset(&type_data, 0, sizeof (type_data));
+
+       type_data.ertd_default.ed_buf_size = buf_size;
+
+       return efx_rx_qcreate_internal(enp, index, label, type, &type_data,
            esmp, ndescs, id, flags, eep, erpp);
 }
 
@@ -1614,7 +1622,6 @@ siena_rx_qcreate(
        efx_rc_t rc;
 
        _NOTE(ARGUNUSED(esmp))
-       _NOTE(ARGUNUSED(type_data))
 
        EFX_STATIC_ASSERT(EFX_EV_RX_NLABELS ==
            (1 << FRF_AZ_RX_DESCQ_LABEL_WIDTH));
@@ -1637,6 +1644,7 @@ siena_rx_qcreate(
 
        switch (type) {
        case EFX_RXQ_TYPE_DEFAULT:
+               erp->er_buf_size = type_data->ertd_default.ed_buf_size;
                break;
 
        default:
index 20910d2..4b1d01e 100644 (file)
@@ -692,6 +692,7 @@ sfc_rx_qstart(struct sfc_adapter *sa, unsigned int sw_index)
        switch (rxq_info->type) {
        case EFX_RXQ_TYPE_DEFAULT:
                rc = efx_rx_qcreate(sa->nic, rxq->hw_index, 0, rxq_info->type,
+                       rxq->buf_size,
                        &rxq->mem, rxq_info->entries, 0 /* not used on EF10 */,
                        rxq_info->type_flags, evq->common, &rxq->common);
                break;