net/sfc/base: enforce packed stream fake buffer size
authorAndrew Rybchenko <arybchenko@solarflare.com>
Thu, 16 Nov 2017 08:04:11 +0000 (08:04 +0000)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 16 Jan 2018 17:47:49 +0000 (18:47 +0100)
In the case of packed stream real size of the buffer does not fit in
Rx descriptor byte count. Real size is specified on Rx queue setup.
Non-zero fake should be used to bypass hardware checks.

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

index 534a06e..4c74d1f 100644 (file)
@@ -707,6 +707,14 @@ ef10_rx_prefix_hash(
 }
 #endif /* EFSYS_OPT_RX_SCALE */
 
+#if EFSYS_OPT_RX_PACKED_STREAM
+/*
+ * Fake length for RXQ descriptors in packed stream mode
+ * to make hardware happy
+ */
+#define        EFX_RXQ_PACKED_STREAM_FAKE_BUF_SIZE 32
+#endif
+
                        void
 ef10_rx_qpost(
        __in            efx_rxq_t *erp,
@@ -721,6 +729,15 @@ ef10_rx_qpost(
        unsigned int offset;
        unsigned int id;
 
+#if EFSYS_OPT_RX_PACKED_STREAM
+       /*
+        * Real size of the buffer does not fit into ESF_DZ_RX_KER_BYTE_CNT
+        * and equal to 0 after applying mask. Hardware does not like it.
+        */
+       if (erp->er_ev_qstate->eers_rx_packed_stream)
+               size = EFX_RXQ_PACKED_STREAM_FAKE_BUF_SIZE;
+#endif
+
        /* The client driver must not overfill the queue */
        EFSYS_ASSERT3U(added - completed + n, <=,
            EFX_RXQ_LIMIT(erp->er_mask + 1));
index bf1ed21..bf17aba 100644 (file)
@@ -2043,12 +2043,6 @@ efx_rx_qpush(
 
 #if EFSYS_OPT_RX_PACKED_STREAM
 
-/*
- * Fake length for RXQ descriptors in packed stream mode
- * to make hardware happy
- */
-#define        EFX_RXQ_PACKED_STREAM_FAKE_BUF_SIZE 32
-
 extern                 void
 efx_rx_qpush_ps_credits(
        __in            efx_rxq_t *erp);