>>  +struct zxdh_ifc_hw_np_stats_bits {
>>  +    uint8_t rx_unicast_pkts[0x40];
>>  +    uint8_t tx_unicast_pkts[0x40];
>>  +    uint8_t rx_unicast_bytes[0x40];
>>  +    uint8_t tx_unicast_bytes[0x40];
>>  +    uint8_t rx_multicast_pkts[0x40];
>>  +    uint8_t tx_multicast_pkts[0x40];
>>  +    uint8_t rx_multicast_bytes[0x40];
>>  +    uint8_t tx_multicast_bytes[0x40];
>>  +    uint8_t rx_broadcast_pkts[0x40];
>>  +    uint8_t tx_broadcast_pkts[0x40];
>>  +    uint8_t rx_broadcast_bytes[0x40];
>>  +    uint8_t tx_broadcast_bytes[0x40];
>>  +    uint8_t rx_mtu_drop_pkts[0x40];
>>  +    uint8_t tx_mtu_drop_pkts[0x40];
>>  +    uint8_t rx_mtu_drop_bytes[0x40];
>>  +    uint8_t tx_mtu_drop_bytes[0x40];
>>  +    uint8_t rx_mtr_drop_pkts[0x40];
>>  +    uint8_t tx_mtr_drop_pkts[0x40];
>>  +    uint8_t rx_mtr_drop_bytes[0x40];
>>  +    uint8_t tx_mtr_drop_bytes[0x40];
>>  +    uint8_t tx_ssvpc_pkts[0x40];
>>  +};

> Seems like 0x40 (ie 64) is a magic constant here. Is it based
> on number of VF's or other value. Should be defined as constant
> rather than open coded.

Hi maintainer,
    it's not based on number of VF's or other value. it is just a uint64_t number.
    and the number will not be modified in the future.

    Due to the fact that our PF and VF use message retrieval statistics,
    when defining the return message result, the firmware did not align the header message according to 4 bytes.
    Therefore, we used a byte stream approach to retrieve the message by byte here.

    here is we used to convert struct zxdh_ifc_hw_np_stats_bits to byte stream.

    #define ZXDH_ST_SZ_BYTES(typ) (sizeof(struct zxdh_ifc_##typ##_bits) / 8)

    #define ZXDH_GET(typ, p, fld) ({ \
    BUILD_BUG_ON(__zxdh_bit_sz(typ, fld) % 8); \
    uint32_t fld_sz = __zxdh_bit_sz(typ, fld) / 8; \
    uint8_t *addr = ZXDH_ADDR_OF(typ, p, fld); \
    zxdh_get_value(fld_sz, addr); \
    })

Thanks.