net/sfc: implement EF100 native Tx
[dpdk.git] / drivers / net / sfc / sfc_rx.c
index 7d22e2f..a9217ad 100644 (file)
@@ -378,10 +378,20 @@ sfc_efx_rx_qdesc_status(struct sfc_dp_rxq *dp_rxq, uint16_t offset)
 
 boolean_t
 sfc_rx_check_scatter(size_t pdu, size_t rx_buf_size, uint32_t rx_prefix_size,
-                    boolean_t rx_scatter_enabled, const char **error)
+                    boolean_t rx_scatter_enabled, uint32_t rx_scatter_max,
+                    const char **error)
 {
-       if ((rx_buf_size < pdu + rx_prefix_size) && !rx_scatter_enabled) {
-               *error = "Rx scatter is disabled and RxQ mbuf pool object size is too small";
+       uint32_t effective_rx_scatter_max;
+       uint32_t rx_scatter_bufs;
+
+       effective_rx_scatter_max = rx_scatter_enabled ? rx_scatter_max : 1;
+       rx_scatter_bufs = EFX_DIV_ROUND_UP(pdu + rx_prefix_size, rx_buf_size);
+
+       if (rx_scatter_bufs > effective_rx_scatter_max) {
+               if (rx_scatter_enabled)
+                       *error = "Possible number of Rx scatter buffers exceeds maximum number";
+               else
+                       *error = "Rx scatter is disabled and RxQ mbuf pool object size is too small";
                return B_FALSE;
        }
 
@@ -614,7 +624,7 @@ struct sfc_dp_rx sfc_efx_rx = {
        .dp = {
                .name           = SFC_KVARG_DATAPATH_EFX,
                .type           = SFC_DP_RX,
-               .hw_fw_caps     = 0,
+               .hw_fw_caps     = SFC_DP_HW_FW_CAP_RX_EFX,
        },
        .features               = SFC_DP_RX_FEAT_INTR,
        .dev_offload_capa       = DEV_RX_OFFLOAD_CHECKSUM |
@@ -1084,6 +1094,7 @@ sfc_rx_qinit(struct sfc_adapter *sa, unsigned int sw_index,
        if (!sfc_rx_check_scatter(sa->port.pdu, buf_size,
                                  encp->enc_rx_prefix_size,
                                  (offloads & DEV_RX_OFFLOAD_SCATTER),
+                                 encp->enc_rx_scatter_max,
                                  &error)) {
                sfc_err(sa, "RxQ %u MTU check failed: %s", sw_index, error);
                sfc_err(sa, "RxQ %u calculated Rx buffer size is %u vs "
@@ -1139,6 +1150,13 @@ sfc_rx_qinit(struct sfc_adapter *sa, unsigned int sw_index,
        rxq_info->refill_threshold =
                RTE_MAX(rx_free_thresh, SFC_RX_REFILL_BULK);
        rxq_info->refill_mb_pool = mb_pool;
+
+       if (rss->hash_support == EFX_RX_HASH_AVAILABLE && rss->channels > 0 &&
+           (offloads & DEV_RX_OFFLOAD_RSS_HASH))
+               rxq_info->rxq_flags = SFC_RXQ_FLAG_RSS_HASH;
+       else
+               rxq_info->rxq_flags = 0;
+
        rxq->buf_size = buf_size;
 
        rc = sfc_dma_alloc(sa, "rxq", sw_index,
@@ -1154,10 +1172,7 @@ sfc_rx_qinit(struct sfc_adapter *sa, unsigned int sw_index,
        info.buf_size = buf_size;
        info.batch_max = encp->enc_rx_batch_max;
        info.prefix_size = encp->enc_rx_prefix_size;
-
-       if (rss->hash_support == EFX_RX_HASH_AVAILABLE && rss->channels > 0)
-               info.flags |= SFC_RXQ_FLAG_RSS_HASH;
-
+       info.flags = rxq_info->rxq_flags;
        info.rxq_entries = rxq_info->entries;
        info.rxq_hw_ring = rxq->mem.esm_base;
        info.evq_hw_index = sfc_evq_index_by_rxq_sw_index(sa, sw_index);
@@ -1561,10 +1576,6 @@ sfc_rx_check_mode(struct sfc_adapter *sa, struct rte_eth_rxmode *rxmode)
                rxmode->offloads |= DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM;
        }
 
-       if ((offloads_supported & DEV_RX_OFFLOAD_RSS_HASH) &&
-           (rxmode->mq_mode & ETH_MQ_RX_RSS_FLAG))
-               rxmode->offloads |= DEV_RX_OFFLOAD_RSS_HASH;
-
        return rc;
 }