common/sfc_efx: update copyright year
[dpdk.git] / drivers / common / sfc_efx / base / efx_mae.c
index eb91753..b1e4b98 100644 (file)
@@ -1,7 +1,6 @@
 /* SPDX-License-Identifier: BSD-3-Clause
  *
- * Copyright(c) 2019 Xilinx, Inc. All rights reserved.
- * All rights reserved.
+ * Copyright(c) 2019-2021 Xilinx, Inc.
  */
 
 #include "efx.h"
@@ -690,23 +689,49 @@ efx_mae_match_spec_field_set(
                goto fail2;
        }
 
-       if (value_size != descp->emmd_value_size) {
+       if (descp->emmd_mask_size == 0) {
+               /* The ID points to a gap in the array of field descriptors. */
                rc = EINVAL;
                goto fail3;
        }
 
-       if (mask_size != descp->emmd_mask_size) {
+       if (value_size != descp->emmd_value_size) {
                rc = EINVAL;
                goto fail4;
        }
 
+       if (mask_size != descp->emmd_mask_size) {
+               rc = EINVAL;
+               goto fail5;
+       }
+
        if (descp->emmd_endianness == EFX_MAE_FIELD_BE) {
+               unsigned int i;
+
                /*
                 * The mask/value are in network (big endian) order.
                 * The MCDI request field is also big endian.
                 */
-               memcpy(mvp + descp->emmd_value_offset, value, value_size);
-               memcpy(mvp + descp->emmd_mask_offset, mask, mask_size);
+
+               EFSYS_ASSERT3U(value_size, ==, mask_size);
+
+               for (i = 0; i < value_size; ++i) {
+                       uint8_t *v_bytep = mvp + descp->emmd_value_offset + i;
+                       uint8_t *m_bytep = mvp + descp->emmd_mask_offset + i;
+
+                       /*
+                        * Apply the mask (which may be all-zeros) to the value.
+                        *
+                        * If this API is provided with some value to set for a
+                        * given field in one specification and with some other
+                        * value to set for this field in another specification,
+                        * then, if the two masks are all-zeros, the field will
+                        * avoid being counted as a mismatch when comparing the
+                        * specifications using efx_mae_match_specs_equal() API.
+                        */
+                       *v_bytep = value[i] & mask[i];
+                       *m_bytep = mask[i];
+               }
        } else {
                efx_dword_t dword;
 
@@ -741,6 +766,8 @@ efx_mae_match_spec_field_set(
 
        return (0);
 
+fail5:
+       EFSYS_PROBE(fail5);
 fail4:
        EFSYS_PROBE(fail4);
 fail3: