net/sfc: fix power of 2 round up when align has smaller type
[dpdk.git] / drivers / net / sfc / base / ef10_rx.c
index 3b296e4..b087a5d 100644 (file)
@@ -8,7 +8,7 @@
 #include "efx_impl.h"
 
 
-#if EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2
+#if EFX_OPTS_EF10()
 
 
 static __checkReturn   efx_rc_t
@@ -21,6 +21,7 @@ efx_mcdi_init_rxq(
        __in            efsys_mem_t *esmp,
        __in            boolean_t disable_scatter,
        __in            boolean_t want_inner_classes,
+       __in            uint32_t buf_size,
        __in            uint32_t ps_bufsize,
        __in            uint32_t es_bufs_per_desc,
        __in            uint32_t es_max_dma_len,
@@ -29,8 +30,8 @@ efx_mcdi_init_rxq(
 {
        efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
        efx_mcdi_req_t req;
-       EFX_MCDI_DECLARE_BUF(payload, MC_CMD_INIT_RXQ_V3_IN_LEN,
-               MC_CMD_INIT_RXQ_V3_OUT_LEN);
+       EFX_MCDI_DECLARE_BUF(payload, MC_CMD_INIT_RXQ_V4_IN_LEN,
+               MC_CMD_INIT_RXQ_V4_OUT_LEN);
        int npages = efx_rxq_nbufs(enp, ndescs);
        int i;
        efx_qword_t *dma_addr;
@@ -84,9 +85,9 @@ efx_mcdi_init_rxq(
 
        req.emr_cmd = MC_CMD_INIT_RXQ;
        req.emr_in_buf = payload;
-       req.emr_in_length = MC_CMD_INIT_RXQ_V3_IN_LEN;
+       req.emr_in_length = MC_CMD_INIT_RXQ_V4_IN_LEN;
        req.emr_out_buf = payload;
-       req.emr_out_length = MC_CMD_INIT_RXQ_V3_OUT_LEN;
+       req.emr_out_length = MC_CMD_INIT_RXQ_V4_OUT_LEN;
 
        MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_SIZE, ndescs);
        MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_TARGET_EVQ, eep->ee_index);
@@ -105,7 +106,7 @@ efx_mcdi_init_rxq(
            INIT_RXQ_EXT_IN_FLAG_WANT_OUTER_CLASSES, want_outer_classes,
            INIT_RXQ_EXT_IN_FLAG_NO_CONT_EV, no_cont_ev);
        MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_OWNER_ID, 0);
-       MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_PORT_ID, EVB_PORT_ID_ASSIGNED);
+       MCDI_IN_SET_DWORD(req, INIT_RXQ_EXT_IN_PORT_ID, enp->en_vport_id);
 
        if (es_bufs_per_desc > 0) {
                MCDI_IN_SET_DWORD(req,
@@ -120,6 +121,10 @@ efx_mcdi_init_rxq(
                    hol_block_timeout);
        }
 
+       if (encp->enc_init_rxq_with_buffer_size)
+               MCDI_IN_SET_DWORD(req, INIT_RXQ_V4_IN_BUFFER_SIZE_BYTES,
+                   buf_size);
+
        dma_addr = MCDI_IN2(req, efx_qword_t, INIT_RXQ_IN_DMA_ADDR);
        addr = EFSYS_MEM_ADDR(esmp);
 
@@ -228,7 +233,7 @@ efx_mcdi_rss_context_alloc(
        req.emr_out_length = MC_CMD_RSS_CONTEXT_ALLOC_OUT_LEN;
 
        MCDI_IN_SET_DWORD(req, RSS_CONTEXT_ALLOC_IN_UPSTREAM_PORT_ID,
-           EVB_PORT_ID_ASSIGNED);
+               enp->en_vport_id);
        MCDI_IN_SET_DWORD(req, RSS_CONTEXT_ALLOC_IN_TYPE, context_type);
 
        /*
@@ -942,8 +947,9 @@ ef10_rx_qps_packet_info(
        *lengthp   = EFX_QWORD_FIELD(*qwordp, ES_DZ_PS_RX_PREFIX_ORIG_LEN);
        buf_len    = EFX_QWORD_FIELD(*qwordp, ES_DZ_PS_RX_PREFIX_CAP_LEN);
 
-       buf_len = P2ROUNDUP(buf_len + EFX_RX_PACKED_STREAM_RX_PREFIX_SIZE,
-                           EFX_RX_PACKED_STREAM_ALIGNMENT);
+       buf_len = EFX_P2ROUNDUP(uint16_t,
+           buf_len + EFX_RX_PACKED_STREAM_RX_PREFIX_SIZE,
+           EFX_RX_PACKED_STREAM_ALIGNMENT);
        *next_offsetp =
            current_offset + buf_len + EFX_RX_PACKED_STREAM_ALIGNMENT;
 
@@ -1018,7 +1024,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 +1037,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 +1068,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 +1092,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 +1100,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 +1117,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 */
@@ -1134,10 +1146,10 @@ ef10_rx_qcreate(
                want_inner_classes = B_FALSE;
 
        if ((rc = efx_mcdi_init_rxq(enp, ndescs, eep, label, index,
-                   esmp, disable_scatter, want_inner_classes,
+                   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;
+               goto fail12;
 
        erp->er_eep = eep;
        erp->er_label = label;
@@ -1148,34 +1160,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);
 
@@ -1212,4 +1226,4 @@ ef10_rx_fini(
 #endif /* EFSYS_OPT_RX_SCALE */
 }
 
-#endif /* EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 */
+#endif /* EFX_OPTS_EF10() */