X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fsfc%2Fsfc_rx.c;h=3415dcad7e4a46d59d9c97aa4b6040aeb047bbe7;hb=2e4859f3b362fa2960d71dc70b77a13a24f5c228;hp=a9217ada9d9b6b1ab96fe2bf5b2955eef9dadfe0;hpb=849c2d919dae233c7b76c44f80ef18e780651abc;p=dpdk.git diff --git a/drivers/net/sfc/sfc_rx.c b/drivers/net/sfc/sfc_rx.c index a9217ada9d..3415dcad7e 100644 --- a/drivers/net/sfc/sfc_rx.c +++ b/drivers/net/sfc/sfc_rx.c @@ -109,7 +109,7 @@ sfc_efx_rx_qrefill(struct sfc_efx_rxq *rxq) ++i, id = (id + 1) & rxq->ptr_mask) { m = objs[i]; - MBUF_RAW_ALLOC_CHECK(m); + __rte_mbuf_raw_sanity_check(m); rxd = &rxq->sw_desc[id]; rxd->mbuf = m; @@ -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; @@ -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,