Author: arybchik
Date: Sat Nov 24 18:13:21 2018
New Revision: 340907
URL: https://svnweb.freebsd.org/changeset/base/340907

Log:
  sfxge(4): add function to create packed stream RxQ
  
  Encoding packed stream buffer size in RxQ type is not a future-proof
  idea taking into account a new RxQ types with extra parameters.
  To be consistent make packet stream buffer size a separate parameter.
  In order to avoid blowing of the default RxQ create function prototype
  add a dedicated function to create packed stream RxQ without not
  applicable paramters.
  
  Sponsored by:   Solarflare Communications, Inc.
  Differential Revision:  https://reviews.freebsd.org/D18132

Modified:
  head/sys/dev/sfxge/common/ef10_ev.c
  head/sys/dev/sfxge/common/ef10_impl.h
  head/sys/dev/sfxge/common/ef10_rx.c
  head/sys/dev/sfxge/common/efx.h
  head/sys/dev/sfxge/common/efx_impl.h
  head/sys/dev/sfxge/common/efx_rx.c

Modified: head/sys/dev/sfxge/common/ef10_ev.c
==============================================================================
--- head/sys/dev/sfxge/common/ef10_ev.c Sat Nov 24 18:13:07 2018        
(r340906)
+++ head/sys/dev/sfxge/common/ef10_ev.c Sat Nov 24 18:13:21 2018        
(r340907)
@@ -1350,8 +1350,7 @@ ef10_ev_rxlabel_init(
 {
        efx_evq_rxq_state_t *eersp;
 #if EFSYS_OPT_RX_PACKED_STREAM
-       boolean_t packed_stream = (type >= EFX_RXQ_TYPE_PACKED_STREAM_1M) &&
-           (type <= EFX_RXQ_TYPE_PACKED_STREAM_64K);
+       boolean_t packed_stream = (type == EFX_RXQ_TYPE_PACKED_STREAM);
 #endif
 
        _NOTE(ARGUNUSED(type))

Modified: head/sys/dev/sfxge/common/ef10_impl.h
==============================================================================
--- head/sys/dev/sfxge/common/ef10_impl.h       Sat Nov 24 18:13:07 2018        
(r340906)
+++ head/sys/dev/sfxge/common/ef10_impl.h       Sat Nov 24 18:13:21 2018        
(r340907)
@@ -979,6 +979,7 @@ ef10_rx_qcreate(
        __in            unsigned int index,
        __in            unsigned int label,
        __in            efx_rxq_type_t type,
+       __in            uint32_t type_data,
        __in            efsys_mem_t *esmp,
        __in            size_t ndescs,
        __in            uint32_t id,

Modified: head/sys/dev/sfxge/common/ef10_rx.c
==============================================================================
--- head/sys/dev/sfxge/common/ef10_rx.c Sat Nov 24 18:13:07 2018        
(r340906)
+++ head/sys/dev/sfxge/common/ef10_rx.c Sat Nov 24 18:13:21 2018        
(r340907)
@@ -951,6 +951,7 @@ ef10_rx_qcreate(
        __in            unsigned int index,
        __in            unsigned int label,
        __in            efx_rxq_type_t type,
+       __in            uint32_t type_data,
        __in            efsys_mem_t *esmp,
        __in            size_t ndescs,
        __in            uint32_t id,
@@ -963,7 +964,7 @@ ef10_rx_qcreate(
        boolean_t disable_scatter;
        unsigned int ps_buf_size;
 
-       _NOTE(ARGUNUSED(id, erp))
+       _NOTE(ARGUNUSED(id, erp, type_data))
 
        EFX_STATIC_ASSERT(EFX_EV_RX_NLABELS == (1 << ESF_DZ_RX_QLABEL_WIDTH));
        EFSYS_ASSERT3U(label, <, EFX_EV_RX_NLABELS);
@@ -987,25 +988,32 @@ ef10_rx_qcreate(
                ps_buf_size = 0;
                break;
 #if EFSYS_OPT_RX_PACKED_STREAM
-       case EFX_RXQ_TYPE_PACKED_STREAM_1M:
-               ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_1M;
+       case EFX_RXQ_TYPE_PACKED_STREAM:
+               switch (type_data) {
+               case EFX_RXQ_PACKED_STREAM_BUF_SIZE_1M:
+                       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;
+                       break;
+               case EFX_RXQ_PACKED_STREAM_BUF_SIZE_256K:
+                       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;
+                       break;
+               case EFX_RXQ_PACKED_STREAM_BUF_SIZE_64K:
+                       ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_64K;
+                       break;
+               default:
+                       rc = ENOTSUP;
+                       goto fail3;
+               }
                break;
-       case EFX_RXQ_TYPE_PACKED_STREAM_512K:
-               ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_512K;
-               break;
-       case EFX_RXQ_TYPE_PACKED_STREAM_256K:
-               ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_256K;
-               break;
-       case EFX_RXQ_TYPE_PACKED_STREAM_128K:
-               ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_128K;
-               break;
-       case EFX_RXQ_TYPE_PACKED_STREAM_64K:
-               ps_buf_size = MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_64K;
-               break;
 #endif /* EFSYS_OPT_RX_PACKED_STREAM */
        default:
                rc = ENOTSUP;
-               goto fail3;
+               goto fail4;
        }
 
 #if EFSYS_OPT_RX_PACKED_STREAM
@@ -1013,13 +1021,13 @@ ef10_rx_qcreate(
                /* Check if datapath firmware supports packed stream mode */
                if (encp->enc_rx_packed_stream_supported == B_FALSE) {
                        rc = ENOTSUP;
-                       goto fail4;
+                       goto fail5;
                }
                /* Check if packed stream allows configurable buffer sizes */
-               if ((type != EFX_RXQ_TYPE_PACKED_STREAM_1M) &&
+               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 fail5;
+                       goto fail6;
                }
        }
 #else /* EFSYS_OPT_RX_PACKED_STREAM */
@@ -1034,7 +1042,7 @@ ef10_rx_qcreate(
 
        if ((rc = efx_mcdi_init_rxq(enp, ndescs, eep->ee_index, label, index,
                    esmp, disable_scatter, ps_buf_size)) != 0)
-               goto fail6;
+               goto fail7;
 
        erp->er_eep = eep;
        erp->er_label = label;
@@ -1045,16 +1053,20 @@ ef10_rx_qcreate(
 
        return (0);
 
+fail7:
+       EFSYS_PROBE(fail7);
+#if EFSYS_OPT_RX_PACKED_STREAM
 fail6:
        EFSYS_PROBE(fail6);
-#if EFSYS_OPT_RX_PACKED_STREAM
 fail5:
        EFSYS_PROBE(fail5);
+#endif /* EFSYS_OPT_RX_PACKED_STREAM */
 fail4:
        EFSYS_PROBE(fail4);
-#endif /* EFSYS_OPT_RX_PACKED_STREAM */
+#if EFSYS_OPT_RX_PACKED_STREAM
 fail3:
        EFSYS_PROBE(fail3);
+#endif /* EFSYS_OPT_RX_PACKED_STREAM */
 fail2:
        EFSYS_PROBE(fail2);
 fail1:

Modified: head/sys/dev/sfxge/common/efx.h
==============================================================================
--- head/sys/dev/sfxge/common/efx.h     Sat Nov 24 18:13:07 2018        
(r340906)
+++ head/sys/dev/sfxge/common/efx.h     Sat Nov 24 18:13:21 2018        
(r340907)
@@ -2006,11 +2006,7 @@ efx_pseudo_hdr_pkt_length_get(
 
 typedef enum efx_rxq_type_e {
        EFX_RXQ_TYPE_DEFAULT,
-       EFX_RXQ_TYPE_PACKED_STREAM_1M,
-       EFX_RXQ_TYPE_PACKED_STREAM_512K,
-       EFX_RXQ_TYPE_PACKED_STREAM_256K,
-       EFX_RXQ_TYPE_PACKED_STREAM_128K,
-       EFX_RXQ_TYPE_PACKED_STREAM_64K,
+       EFX_RXQ_TYPE_PACKED_STREAM,
        EFX_RXQ_NTYPES
 } efx_rxq_type_t;
 
@@ -2033,6 +2029,27 @@ efx_rx_qcreate(
        __in            unsigned int flags,
        __in            efx_evq_t *eep,
        __deref_out     efx_rxq_t **erpp);
+
+#if EFSYS_OPT_RX_PACKED_STREAM
+
+#define        EFX_RXQ_PACKED_STREAM_BUF_SIZE_1M       (1U * 1024 * 1024)
+#define        EFX_RXQ_PACKED_STREAM_BUF_SIZE_512K     (512U * 1024)
+#define        EFX_RXQ_PACKED_STREAM_BUF_SIZE_256K     (256U * 1024)
+#define        EFX_RXQ_PACKED_STREAM_BUF_SIZE_128K     (128U * 1024)
+#define        EFX_RXQ_PACKED_STREAM_BUF_SIZE_64K      (64U * 1024)
+
+extern __checkReturn   efx_rc_t
+efx_rx_qcreate_packed_stream(
+       __in            efx_nic_t *enp,
+       __in            unsigned int index,
+       __in            unsigned int label,
+       __in            uint32_t ps_buf_size,
+       __in            efsys_mem_t *esmp,
+       __in            size_t ndescs,
+       __in            efx_evq_t *eep,
+       __deref_out     efx_rxq_t **erpp);
+
+#endif
 
 typedef struct efx_buffer_s {
        efsys_dma_addr_t        eb_addr;

Modified: head/sys/dev/sfxge/common/efx_impl.h
==============================================================================
--- head/sys/dev/sfxge/common/efx_impl.h        Sat Nov 24 18:13:07 2018        
(r340906)
+++ head/sys/dev/sfxge/common/efx_impl.h        Sat Nov 24 18:13:21 2018        
(r340907)
@@ -185,7 +185,7 @@ typedef struct efx_rx_ops_s {
        efx_rc_t        (*erxo_qflush)(efx_rxq_t *);
        void            (*erxo_qenable)(efx_rxq_t *);
        efx_rc_t        (*erxo_qcreate)(efx_nic_t *enp, unsigned int,
-                                       unsigned int, efx_rxq_type_t,
+                                       unsigned int, efx_rxq_type_t, uint32_t,
                                        efsys_mem_t *, size_t, uint32_t,
                                        unsigned int,
                                        efx_evq_t *, efx_rxq_t *);

Modified: head/sys/dev/sfxge/common/efx_rx.c
==============================================================================
--- head/sys/dev/sfxge/common/efx_rx.c  Sat Nov 24 18:13:07 2018        
(r340906)
+++ head/sys/dev/sfxge/common/efx_rx.c  Sat Nov 24 18:13:21 2018        
(r340907)
@@ -136,6 +136,7 @@ siena_rx_qcreate(
        __in            unsigned int index,
        __in            unsigned int label,
        __in            efx_rxq_type_t type,
+       __in            uint32_t type_data,
        __in            efsys_mem_t *esmp,
        __in            size_t ndescs,
        __in            uint32_t id,
@@ -616,12 +617,13 @@ efx_rx_qenable(
        erxop->erxo_qenable(erp);
 }
 
-       __checkReturn   efx_rc_t
-efx_rx_qcreate(
+static __checkReturn   efx_rc_t
+efx_rx_qcreate_internal(
        __in            efx_nic_t *enp,
        __in            unsigned int index,
        __in            unsigned int label,
        __in            efx_rxq_type_t type,
+       __in            uint32_t type_data,
        __in            efsys_mem_t *esmp,
        __in            size_t ndescs,
        __in            uint32_t id,
@@ -650,8 +652,8 @@ efx_rx_qcreate(
        erp->er_mask = ndescs - 1;
        erp->er_esmp = esmp;
 
-       if ((rc = erxop->erxo_qcreate(enp, index, label, type, esmp, ndescs, id,
-           flags, eep, erp)) != 0)
+       if ((rc = erxop->erxo_qcreate(enp, index, label, type, type_data, esmp,
+           ndescs, id, flags, eep, erp)) != 0)
                goto fail2;
 
        enp->en_rx_qcount++;
@@ -669,6 +671,43 @@ fail1:
        return (rc);
 }
 
+       __checkReturn   efx_rc_t
+efx_rx_qcreate(
+       __in            efx_nic_t *enp,
+       __in            unsigned int index,
+       __in            unsigned int label,
+       __in            efx_rxq_type_t type,
+       __in            efsys_mem_t *esmp,
+       __in            size_t ndescs,
+       __in            uint32_t id,
+       __in            unsigned int flags,
+       __in            efx_evq_t *eep,
+       __deref_out     efx_rxq_t **erpp)
+{
+       return efx_rx_qcreate_internal(enp, index, label, type, 0, esmp, ndescs,
+           id, flags, eep, erpp);
+}
+
+#if EFSYS_OPT_RX_PACKED_STREAM
+
+       __checkReturn   efx_rc_t
+efx_rx_qcreate_packed_stream(
+       __in            efx_nic_t *enp,
+       __in            unsigned int index,
+       __in            unsigned int label,
+       __in            uint32_t ps_buf_size,
+       __in            efsys_mem_t *esmp,
+       __in            size_t ndescs,
+       __in            efx_evq_t *eep,
+       __deref_out     efx_rxq_t **erpp)
+{
+       return efx_rx_qcreate_internal(enp, index, label,
+           EFX_RXQ_TYPE_PACKED_STREAM, ps_buf_size, esmp, ndescs,
+           0 /* id unused on EF10 */, EFX_RXQ_FLAG_NONE, eep, erpp);
+}
+
+#endif
+
                        void
 efx_rx_qdestroy(
        __in            efx_rxq_t *erp)
@@ -1310,6 +1349,7 @@ siena_rx_qcreate(
        __in            unsigned int index,
        __in            unsigned int label,
        __in            efx_rxq_type_t type,
+       __in            uint32_t type_data,
        __in            efsys_mem_t *esmp,
        __in            size_t ndescs,
        __in            uint32_t id,
@@ -1324,6 +1364,7 @@ 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));
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to