X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fsfc%2Fsfc_ef10_essb_rx.c;h=b167e01c596cbdb751f1c93e976140856c66a2ae;hb=cb71192486c34eada5b65c6c46d32afd05cc091b;hp=d9bf28525b133a9c116e41b3f021bf9aff57cc2f;hpb=e7fbf6f5db6eead3ea9b980174e4332509175aef;p=dpdk.git diff --git a/drivers/net/sfc/sfc_ef10_essb_rx.c b/drivers/net/sfc/sfc_ef10_essb_rx.c index d9bf28525b..b167e01c59 100644 --- a/drivers/net/sfc/sfc_ef10_essb_rx.c +++ b/drivers/net/sfc/sfc_ef10_essb_rx.c @@ -17,6 +17,7 @@ #include "efx_types.h" #include "efx_regs_ef10.h" +#include "efx.h" #include "sfc_debug.h" #include "sfc_tweak.h" @@ -46,7 +47,7 @@ * Each HW Rx descriptor has many Rx buffers. The number of buffers * in one HW Rx descriptor is equal to size of contiguous block * provided by Rx buffers memory pool. The contiguous block size - * depends on CONFIG_RTE_DRIVER_MEMPOOL_BUCKET_SIZE_KB and rte_mbuf + * depends on RTE_DRIVER_MEMPOOL_BUCKET_SIZE_KB and rte_mbuf * data size specified on the memory pool creation. Typical rte_mbuf * data size is about 2k which makes a bit less than 32 buffers in * contiguous block with default bucket size equal to 64k. @@ -124,7 +125,7 @@ sfc_ef10_essb_next_mbuf(const struct sfc_ef10_essb_rxq *rxq, struct rte_mbuf *m; m = (struct rte_mbuf *)((uintptr_t)mbuf + rxq->buf_stride); - MBUF_RAW_ALLOC_CHECK(m); + __rte_mbuf_raw_sanity_check(m); return m; } @@ -135,7 +136,7 @@ sfc_ef10_essb_mbuf_by_index(const struct sfc_ef10_essb_rxq *rxq, struct rte_mbuf *m; m = (struct rte_mbuf *)((uintptr_t)mbuf + idx * rxq->buf_stride); - MBUF_RAW_ALLOC_CHECK(m); + __rte_mbuf_raw_sanity_check(m); return m; } @@ -304,6 +305,27 @@ sfc_ef10_essb_rx_process_ev(struct sfc_ef10_essb_rxq *rxq, efx_qword_t rx_ev) } while (ready > 0); } +/* + * Below function relies on the following length and layout of the + * Rx prefix. + */ +static const efx_rx_prefix_layout_t sfc_ef10_essb_rx_prefix_layout = { + .erpl_length = ES_EZ_ESSB_RX_PREFIX_LEN, + .erpl_fields = { +#define SFC_EF10_ESSB_RX_PREFIX_FIELD(_efx, _ef10) \ + EFX_RX_PREFIX_FIELD(_efx, ES_EZ_ESSB_RX_PREFIX_ ## _ef10, B_FALSE) + + SFC_EF10_ESSB_RX_PREFIX_FIELD(LENGTH, DATA_LEN), + SFC_EF10_ESSB_RX_PREFIX_FIELD(USER_MARK, MARK), + SFC_EF10_ESSB_RX_PREFIX_FIELD(RSS_HASH_VALID, HASH_VALID), + SFC_EF10_ESSB_RX_PREFIX_FIELD(USER_MARK_VALID, MARK_VALID), + SFC_EF10_ESSB_RX_PREFIX_FIELD(USER_FLAG, MATCH_FLAG), + SFC_EF10_ESSB_RX_PREFIX_FIELD(RSS_HASH, HASH), + +#undef SFC_EF10_ESSB_RX_PREFIX_FIELD + } +}; + static unsigned int sfc_ef10_essb_rx_get_pending(struct sfc_ef10_essb_rxq *rxq, struct rte_mbuf **rx_pkts, uint16_t nb_pkts) @@ -633,10 +655,18 @@ sfc_ef10_essb_rx_qdestroy(struct sfc_dp_rxq *dp_rxq) static sfc_dp_rx_qstart_t sfc_ef10_essb_rx_qstart; static int -sfc_ef10_essb_rx_qstart(struct sfc_dp_rxq *dp_rxq, unsigned int evq_read_ptr) +sfc_ef10_essb_rx_qstart(struct sfc_dp_rxq *dp_rxq, unsigned int evq_read_ptr, + const efx_rx_prefix_layout_t *pinfo) { struct sfc_ef10_essb_rxq *rxq = sfc_ef10_essb_rxq_by_dp_rxq(dp_rxq); + if (pinfo->erpl_length != sfc_ef10_essb_rx_prefix_layout.erpl_length) + return ENOTSUP; + + if (efx_rx_prefix_layout_check(pinfo, + &sfc_ef10_essb_rx_prefix_layout) != 0) + return ENOTSUP; + rxq->evq_read_ptr = evq_read_ptr; /* Initialize before refill */