X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fcommon%2Fsfc_efx%2Fbase%2Fefx_rx.c;h=7e63363be7efb92e6676b130750b6dd850e7d62d;hb=c4f4a0e60dcb2a3877a4a751d7641fa1d9c46c29;hp=d6b56fec48e056246d9f8473b6a237e85bfaf7e4;hpb=f784cdc5cbb1ba18c7c7c4085eda8712c036b4cd;p=dpdk.git diff --git a/drivers/common/sfc_efx/base/efx_rx.c b/drivers/common/sfc_efx/base/efx_rx.c index d6b56fec48..7e63363be7 100644 --- a/drivers/common/sfc_efx/base/efx_rx.c +++ b/drivers/common/sfc_efx/base/efx_rx.c @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: BSD-3-Clause * - * Copyright(c) 2019-2020 Xilinx, Inc. + * Copyright(c) 2019-2021 Xilinx, Inc. * Copyright(c) 2007-2019 Solarflare Communications Inc. */ @@ -1743,14 +1743,20 @@ siena_rx_qcreate( goto fail2; } - if (flags & EFX_RXQ_FLAG_SCATTER) { #if EFSYS_OPT_RX_SCATTER - jumbo = B_TRUE; +#define SUPPORTED_RXQ_FLAGS EFX_RXQ_FLAG_SCATTER #else +#define SUPPORTED_RXQ_FLAGS EFX_RXQ_FLAG_NONE +#endif + /* Reject flags for unsupported queue features */ + if ((flags & ~SUPPORTED_RXQ_FLAGS) != 0) { rc = EINVAL; goto fail3; -#endif /* EFSYS_OPT_RX_SCATTER */ } +#undef SUPPORTED_RXQ_FLAGS + + if (flags & EFX_RXQ_FLAG_SCATTER) + jumbo = B_TRUE; /* Set up the new descriptor queue */ EFX_POPULATE_OWORD_7(oword, @@ -1769,10 +1775,8 @@ siena_rx_qcreate( return (0); -#if !EFSYS_OPT_RX_SCATTER fail3: EFSYS_PROBE(fail3); -#endif fail2: EFSYS_PROBE(fail2); fail1: @@ -1803,3 +1807,43 @@ siena_rx_fini( } #endif /* EFSYS_OPT_SIENA */ + +static __checkReturn boolean_t +efx_rx_prefix_layout_fields_match( + __in const efx_rx_prefix_field_info_t *erpfip1, + __in const efx_rx_prefix_field_info_t *erpfip2) +{ + if (erpfip1->erpfi_offset_bits != erpfip2->erpfi_offset_bits) + return (B_FALSE); + + if (erpfip1->erpfi_width_bits != erpfip2->erpfi_width_bits) + return (B_FALSE); + + if (erpfip1->erpfi_big_endian != erpfip2->erpfi_big_endian) + return (B_FALSE); + + return (B_TRUE); +} + + __checkReturn uint32_t +efx_rx_prefix_layout_check( + __in const efx_rx_prefix_layout_t *available, + __in const efx_rx_prefix_layout_t *wanted) +{ + uint32_t result = 0; + unsigned int i; + + EFX_STATIC_ASSERT(EFX_RX_PREFIX_NFIELDS < sizeof (result) * 8); + for (i = 0; i < EFX_RX_PREFIX_NFIELDS; ++i) { + /* Skip the field if driver does not want to use it */ + if (wanted->erpl_fields[i].erpfi_width_bits == 0) + continue; + + if (efx_rx_prefix_layout_fields_match( + &available->erpl_fields[i], + &wanted->erpl_fields[i]) == B_FALSE) + result |= (1U << i); + } + + return (result); +}