net/txgbe: add queue stats mapping
[dpdk.git] / drivers / net / sfc / sfc_rx.c
index 7c50fe5..de0773b 100644 (file)
@@ -528,13 +528,22 @@ static sfc_dp_rx_qpurge_t sfc_efx_rx_qpurge;
 static sfc_dp_rx_qstart_t sfc_efx_rx_qstart;
 static int
 sfc_efx_rx_qstart(struct sfc_dp_rxq *dp_rxq,
-                 __rte_unused unsigned int evq_read_ptr)
+                 __rte_unused unsigned int evq_read_ptr,
+                 const efx_rx_prefix_layout_t *pinfo)
 {
        /* libefx-based datapath is specific to libefx-based PMD */
        struct sfc_efx_rxq *rxq = sfc_efx_rxq_by_dp_rxq(dp_rxq);
        struct sfc_rxq *crxq = sfc_rxq_by_dp_rxq(dp_rxq);
        int rc;
 
+       /*
+        * libefx API is used to extract information from Rx prefix and
+        * it guarantees consistency. Just do length check to ensure
+        * that we reserved space in Rx buffers correctly.
+        */
+       if (rxq->prefix_size != pinfo->erpl_length)
+               return ENOTSUP;
+
        rxq->common = crxq->common;
 
        rxq->pending = rxq->completed = rxq->added = rxq->pushed = 0;
@@ -624,7 +633,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 |
@@ -760,6 +769,7 @@ sfc_rx_qstart(struct sfc_adapter *sa, unsigned int sw_index)
        struct sfc_rxq_info *rxq_info;
        struct sfc_rxq *rxq;
        struct sfc_evq *evq;
+       efx_rx_prefix_layout_t pinfo;
        int rc;
 
        sfc_log_init(sa, "sw_index=%u", sw_index);
@@ -811,9 +821,13 @@ sfc_rx_qstart(struct sfc_adapter *sa, unsigned int sw_index)
        if (rc != 0)
                goto fail_rx_qcreate;
 
+       rc = efx_rx_prefix_get_layout(rxq->common, &pinfo);
+       if (rc != 0)
+               goto fail_prefix_get_layout;
+
        efx_rx_qenable(rxq->common);
 
-       rc = sa->priv.dp_rx->qstart(rxq_info->dp, evq->read_ptr);
+       rc = sa->priv.dp_rx->qstart(rxq_info->dp, evq->read_ptr, &pinfo);
        if (rc != 0)
                goto fail_dp_qstart;
 
@@ -839,6 +853,7 @@ fail_mac_filter_default_rxq_set:
 fail_dp_qstart:
        efx_rx_qdestroy(rxq->common);
 
+fail_prefix_get_layout:
 fail_rx_qcreate:
 fail_bad_contig_block_size:
 fail_mp_get_info:
@@ -1125,6 +1140,9 @@ sfc_rx_qinit(struct sfc_adapter *sa, unsigned int sw_index,
             DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM) != 0)
                rxq_info->type_flags |= EFX_RXQ_FLAG_INNER_CLASSES;
 
+       if (offloads & DEV_RX_OFFLOAD_RSS_HASH)
+               rxq_info->type_flags |= EFX_RXQ_FLAG_RSS_HASH;
+
        rc = sfc_ev_qinit(sa, SFC_EVQ_TYPE_RX, sw_index,
                          evq_entries, socket_id, &evq);
        if (rc != 0)
@@ -1181,6 +1199,7 @@ sfc_rx_qinit(struct sfc_adapter *sa, unsigned int sw_index,
        info.hw_index = rxq->hw_index;
        info.mem_bar = sa->mem_bar.esb_base;
        info.vi_window_shift = encp->enc_vi_window_shift;
+       info.fcw_offset = sa->fcw_offset;
 
        rc = sa->priv.dp_rx->qcreate(sa->eth_dev->data->port_id, sw_index,
                                     &RTE_ETH_DEV_TO_PCI(sa->eth_dev)->addr,